Files correlati : ba0 Ricompilazione Demo : [ ] Commento : Corretto nome server di chiavi in finestra about Aggiunto prompt color al tema Migliorata esportazione excel dei report Aggiunto supporto per disabilitazione nodi negli alberi git-svn-id: svn://10.65.10.50/trunk@19840 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			175 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			175 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#include <xvt.h>
 | 
						|
 | 
						|
#include <dongle.h>
 | 
						|
#include <execp.h> 
 | 
						|
#include <prefix.h>
 | 
						|
#include <recarray.h>
 | 
						|
#include <user.h>
 | 
						|
 | 
						|
static bool is_outlook_menu_chain()
 | 
						|
{
 | 
						|
  const TFilename n = __argv[0];
 | 
						|
  const TString& app = n.name_only();
 | 
						|
  if (app.match("*ba[0,1]*", true))
 | 
						|
    return false;
 | 
						|
  return ini_get_int(CONFIG_GUI, "Colors", "TreeView") == 3;
 | 
						|
}
 | 
						|
 | 
						|
// @doc EXTERNAL
 | 
						|
 | 
						|
// @mfunc Esegue il processo
 | 
						|
//
 | 
						|
// @rdesc Ritorna il codice di uscita del processo (0 in caso di errore).
 | 
						|
long 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
 | 
						|
 | 
						|
  // @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);
 | 
						|
  int p = comm_name.find(" -");	//c'e' un - nella stringa?
 | 
						|
  if (p > 0)	//se c'e' tronca il nome allo spazio
 | 
						|
    comm_name.cut(p);
 | 
						|
  p = comm_name.find(" /");	//c'e' un / nella stringa?
 | 
						|
  if (p > 0)	//se c'e' tronca il nome allo spazio
 | 
						|
    comm_name.cut(p);
 | 
						|
 | 
						|
	if (*comm_name.ext() == '\0')	//se non c'e' estensione ci mette .exe (sono programmi)
 | 
						|
    comm_name.ext("exe");
 | 
						|
 | 
						|
	const bool found = comm_name.custom_path();	//cerca il file in custom o in locale
 | 
						|
  
 | 
						|
  TString name(comm_name.name()); 
 | 
						|
  if (utente == 1)   // 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 (found && p > 0)
 | 
						|
  {
 | 
						|
    path = comm_name;
 | 
						|
    path << _path.mid(p);
 | 
						|
  }
 | 
						|
 | 
						|
  if (utente)
 | 
						|
    path << " /u" << user();
 | 
						|
  
 | 
						|
  // save cwd
 | 
						|
  DIRECTORY oldir;
 | 
						|
  xvt_fsys_get_dir(&oldir);
 | 
						|
 | 
						|
  if (!utente) // cambio directory se eseguo un programma estero
 | 
						|
  {
 | 
						|
    TFilename dir(comm_name.path()); 
 | 
						|
    dir.lower();
 | 
						|
    if (dir.full() && dir.find("custom") < 0)
 | 
						|
    {
 | 
						|
      DIRECTORY d;
 | 
						|
      if (xvt_fsys_convert_str_to_dir(dir, &d))
 | 
						|
        xvt_fsys_set_dir(&d);
 | 
						|
    }                
 | 
						|
  }
 | 
						|
  
 | 
						|
  TString256 old_title;      // Vecchio titolo della finestra principale
 | 
						|
  bool close_all = false;    // Chiudi tutti i file in caso di manutenzione
 | 
						|
 | 
						|
  if (!async)
 | 
						|
  {
 | 
						|
    close_all = _path.starts_with("ba1 -0") && prefix_valid();
 | 
						|
		if (close_all)	//se lancia la gestione archivi forza la chiusura dei files e pure dei tracciati!
 | 
						|
			prefix().set("");
 | 
						|
		else
 | 
						|
			safely_close_closeable_isamfiles();
 | 
						|
 | 
						|
    if (dongle().local())
 | 
						|
      dongle().logout();
 | 
						|
 | 
						|
    // Programma normale (non menu) che chiama "collega"
 | 
						|
    if (utente && iconize && is_outlook_menu_chain())
 | 
						|
    {
 | 
						|
      xvt_vobj_get_title(TASK_WIN, old_title.get_buffer(), old_title.size());
 | 
						|
      xvt_vobj_set_title(TASK_WIN, __MAGIC_CAPTION__);
 | 
						|
      iconize = false;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  _exitcode = xvt_sys_execute(path, !async, iconize);
 | 
						|
 | 
						|
  if (old_title.full()) // Rimetto le cose a posto
 | 
						|
    xvt_vobj_set_title(TASK_WIN, old_title);
 | 
						|
  
 | 
						|
  // restore cwd
 | 
						|
  xvt_fsys_set_dir(&oldir);
 | 
						|
 | 
						|
  // 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 (!async)
 | 
						|
	{
 | 
						|
		if (dongle().local())
 | 
						|
			dongle().login();
 | 
						|
 | 
						|
		if (close_all)	//se lancia la gestione archivi forza la riapertura dei files e pure dei tracciati!
 | 
						|
			prefix().set("DEF");					//..li aveva chiusi qualche riga sopra
 | 
						|
	}
 | 
						|
 | 
						|
  return _exitcode;
 | 
						|
}
 | 
						|
 | 
						|
bool TExternal_app::can_run() const
 | 
						|
{                 
 | 
						|
  if (*prefix().name() <= '.')
 | 
						|
    return TRUE;
 | 
						|
  
 | 
						|
  const TLocalisamfile test(LF_USER);
 | 
						|
  if (test.curr().exist(USR_PERMISSION))
 | 
						|
  {
 | 
						|
    TRecord_cache utonti(LF_USER); // Non uso cache() per problemi durante conversioni
 | 
						|
    TToken_string perm(4096, '\n'), row(80,SAFE_PIPE_CHR);
 | 
						|
    for (TString16 u = user(); u.not_empty(); u = utonti.get(u, USR_GROUPNAME))
 | 
						|
    {
 | 
						|
      if (utonti.already_loaded(u))
 | 
						|
      {   
 | 
						|
        NFCHECK("L'utente %s ha dei permessi ricorsivi", (const char*)u);
 | 
						|
        break;
 | 
						|
      }
 | 
						|
      perm = utonti.get(u, USR_PERMISSION);
 | 
						|
      if (!perm.blank())
 | 
						|
      {
 | 
						|
        FOR_EACH_TOKEN(perm, tok)
 | 
						|
        {
 | 
						|
          row = tok;
 | 
						|
          if (_path == row.get(0))   // Il nome corrisponde
 | 
						|
          {
 | 
						|
            if (*row.get(1) == 'N')
 | 
						|
              return FALSE;
 | 
						|
          }
 | 
						|
        }
 | 
						|
      }
 | 
						|
    } 
 | 
						|
  }  
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 
 | 
						|
TExternal_app::TExternal_app(const char* p)
 | 
						|
             : _path(p), _exitcode(0)
 | 
						|
{
 | 
						|
}
 | 
						|
 |