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