campo-sirio/include/execp.cpp
guy 043790be92 applicat.cpp Tolti commenti e riscritto meglio controllo di abiliatzione cambio ditta
controls.cpp   Migliorato riconoscimento tasti estesi
dongle.cpp     Aggiunto riconoscimento delle nuove chiavi programmatori
execp.cpp      Aggiunta chiamata per chiudere tutto il chiudibile prima di un'esecuzione sincrona


git-svn-id: svn://10.65.10.50/trunk@6455 c028cbd2-c16b-5b4b-a496-9718f37d4682
1998-03-30 13:39:21 +00:00

132 lines
3.2 KiB
C++
Executable File

#include <dongle.h>
#include <execp.h>
#include <os_dep.h>
#include <prefix.h>
// @doc EXTERNAL
// @mfunc Esegue il processo
//
// @rdesc Ritorna il codice di uscita del processo (-1 in caso di errore).
word TExternal_app::run(
bool async, // @parm Per eseguire il processo in parallelo
byte utente, // @parm Permette di inserire il nome dell'utente nella riga di comando
bool iconize, // @parm Iconizza il programma chiamante
bool show) // @parm Mostra o nascondi il programma chiamato
// @comm Se <p asyn> e' FALSE aspetta che termini il processo in esecuzione prima di iniziare il nuovo
{
TFilename path(_path);
TFilename comm_name(_path);
const int p = comm_name.find(' ');
if (p >= 0)
comm_name.cut(p);
TString name(comm_name.name());
if (utente == TRUE) // utente puo' essere 0 = No, 1 = Si, 3 = Forzatura
{
bool our_app = name.len() > 2;
if (our_app && atoi(name) < 70)
{
our_app = isalpha(name[0]) && isalpha(name[1]) && isdigit(name[2]);
}
if (!our_app)
utente = FALSE;
}
if (utente)
path << " /u" << user();
_exitcode = 0;
// save cwd
xvt_fsys_save_dir();
const TFilename dir(comm_name.path());
if (dir.not_empty())
{
DIRECTORY d;
if (xvt_fsys_convert_str_to_dir((char *) (const char *) dir, &d))
xvt_fsys_set_dir(&d);
}
/* Gestione programmi spezzati
if (our_app)
{
TString parms(_path);
TString new_suffix;
int p = parms.find(' ');
if (p < 0)
{
parms = "";
new_suffix = "_0";
}
else
{
parms = parms.mid(p + 1);
p = parms.find(' ');
if (p >= 0)
new_suffix = parms.left(p);
else new_suffix = parms;
if (new_suffix[0] == '-') new_suffix[0] = '_';
else new_suffix = "__";
}
TFilename newpath(dir);
if (newpath.not_empty())
newpath << '/';
newpath << name << new_suffix;
newpath.ext("exe");
if (fexist(newpath))
{
newpath.ext("");
newpath << parms;
path = newpath;
if (utente)
#if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_WIN32
path << " /u" << user();
#else
path << " -u" << user();
#endif
}
}
*/
if (!async)
prefix().close_closeable_isamfiles();
if (dongle().local())
dongle().logout();
iconize &= !async && show;
_exitcode = os_execute(path, !async, iconize, show);
// restore cwd
xvt_fsys_restore_dir();
// Ignora volutamente il return code da HL_LOGIN(). Se va bene riprende il posto
// altrimenti fa lo stesso. Infatti puo' capitare con una chiave di rete, che
// nel lasso di tempo trascorso dalla HL_LOGOUT() dell'applicazione chiamata,
// a questa HL_LOGIN() [approssimativamente qualche decimo di secondo], qualche altro
// programma si inserisca, occupando magari anche l'ultimo posto disponibile.
// Quindi se si verificasse tale sfigatissima condizione, sicuramente
// non ci saranno piu' posti liberi nell'HL_server: il programma comunque non
// puo' interrompersi a meta'; ecco perche il valore di ritorno di HL_LOGIN viene
// ignorato.
if (dongle().local())
dongle().login();
return _exitcode;
}
TExternal_app::TExternal_app(const char* p)
: _path(p), _exitcode(0)
{
}