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
132 lines
3.2 KiB
C++
Executable File
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)
|
|
{
|
|
}
|
|
|