#include #include #include #include // @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

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) { }