#include #include #define __STDTYPES_CPP #include #include #include #include #if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_WIN32 #include #include #endif #include #include #include #include extern isfdptr *openf; extern isfdptr *ext_files; HIDDEN long _stdlevel = 0; // @doc INTERNAL // @func Ritorna il livello degli archivi long get_std_level() { return _stdlevel; } // @func Setta il livello degli archivi void set_std_level(const long l) { _stdlevel = l; } // @doc INTERNAL static int _login_status = 0; // @func Ritorna il numero di serie della chiave // // @rdesc Numero di serie della chiave int get_serial_number(const char* appname) { #ifdef _DEMO_ return 0; #else if (_login_status == 0) { if (HL_LOGIN(ModAd, DONT_CARE, REFKEY, VERKEY) == STATUS_OK) { _login_status = 1; getser(); } } if (_login_status != 1) { if (_login_status == 2) { rpc_UserLogout(); SerNo = 0xFFFF; } TConfig ini(CONFIG_INSTALL, "Server"); const char* server = ini.get("Dongle"); const char* guest = "******"; const char* utente = (!xvt_running() && !stricmp(appname, "ba0100")) ? guest : user(); if (rpc_UserLogin(server, utente, guest, appname)) { _login_status = 2; SerNo = rpc_DongleNumber(); } else _login_status = 0; } switch(_login_status) { case 1 : CGetAut(1) != 0; break; case 2 : rpc_DongleModules(_int_tab0); break; default: memset(_int_tab0, 0, sizeof(_int_tab0)); break; } return SerNo; #endif } bool test_assistance_year() { #ifndef _DEMO_ int dongle_year = TDate(TODAY).year(); if (SerNo > 0) { int new_year = 0; switch(_login_status) { case 1: { word dati[4]; HL_READ(60, (int*)&dati[0]); HL_READ(61, (int*)&dati[1]); HL_READ(62, (int*)&dati[2]); HL_READ(63, (int*)&dati[3]); HL_CODE(dati, HLBLOCK); new_year = int(dati[0]); } break; case 2: new_year = rpc_DongleYear(); break; default: break; } if (new_year >= 1997 && new_year <= dongle_year) dongle_year = new_year; } int app_year, dum1, dum2, dum3; bool ok = TApplication::get_version_info(app_year, dum1, dum2, dum3); if (ok) ok = app_year <= dongle_year; return ok; #else return TRUE; #endif // _DEMO_ } // @doc INTERNAL // @func Inizilizza le variabili globali void init_global_vars() { TPrefix& pref = prefix_init(); pref.set(""); _stdlevel = pref.filelevel(); FileDes d; CGetFile(LF_DIR, &d, _nolock, NORDIR); long maxfdir = d.EOX; pref.set("DEF"); CGetFile(LF_DIR, &d, _nolock, NORDIR); if (d.EOD > maxfdir) maxfdir = d.EOD; isjournal = FALSE; openf = new isfdptr[maxfdir]; openrec = new TRectype*[maxfdir]; ext_files = new isfdptr[maxfdir]; for (long i = 0; i < maxfdir; i++) { openf[i] = NULL; openrec[i] = NULL; ext_files[i] = NULL; } DB_init(); } // @doc INTERNAL // @func Dealloca le variabili globali void free_global_vars() { #if XVT_OS == XVT_OS_WIN || XVT_OS == XVT_OS_WIN32 if (_login_status == 2) rpc_UserLogout(); else HL_LOGOUT(); #endif if (openf != NULL) { delete openf; delete openrec; delete ext_files; prefix_destroy(); } // DB_exit(); } #ifndef FOXPRO #include // @doc EXTERNAL // @func Operatore per la creazione di un oggetto (sostituisce operatore C++) // // @rdesc Ritorna il puntatore all'oggetto creato void* operator new(size_t size) // @comm Per maggiori informazioni fare riferimento all'omonimo comando sull'help // in linea del C++. // Questa funzione viene implementata se non si opera in ambiante FoxPro. { void* mem = (void*)malloc(size); if (mem == NULL) fatal_box("Out of memory: can't allocate %u bytes", size); return mem; } // @doc EXTERNAL // @func Operatore per la distruzione di un oggetto (sostituisce operatore C++) void operator delete( void* ptr) // @parm Puntatore all'oggetto da distruggere // @comm Per maggiori informazioni fare riferimento all'omonimo comando sull'help // in linea del C++. // Nel caso venga passato un puntatore NULL viene emesso un . // Questa funzione viene implementata se non si opera in ambiante FoxPro. { CHECK(ptr, "Can't delete a NULL pointer"); free(ptr); } #endif // FOXPRO