//________________________________________________________________________________________________________________________ // **** Selezione del tipo di installazione (1st level) // **** Aggiornamento,installazione standard,installazione avanzata function _SelectSetupType(nRetv ) STRING szMsg[512]; BOOL bJunk,bReinstall; begin #ifdef __DEMO__ bSetupStandard=TRUE; #else bJunk = !bSetupStandard; //cerca il file con eventuali precedenti installazioni (Atwin.stp) if (Is( FILE_EXISTS, "C:\\Atwin.stp" )) then bSetupStandard = FALSE; bReinstall = TRUE; nRetv = AskOptions(EXCLUSIVE,"Si desidera effettuare:", "Aggiornamento di una precedente installazione",bReinstall, "Installazione &STANDARD",bSetupStandard, "Installazione &personalizzata e/o di rete",bJunk); if (nRetv != BACK && bReinstall) then _ChooseReinstall(nRetv); endif; else nRetv = AskOptions(EXCLUSIVE,"Si desidera effettuare:", "Installazione &STANDARD (scelta consigliata)",bSetupStandard, "Installazione &personalizzata e/o di rete",bJunk); endif; #endif end; //________________________________________________________________________________________________________________________ // **** Selezione del tipo di installazione (2nd level) // **** (programmi o postazione di rete) function _SelectSetupMode(nRetv ) STRING szMsg[512]; BOOL zInstallDemo,zInstallNetWrkChk; begin zInstallDemo = bInstallDemo; zInstallNetWrkChk = bInstallNetWrkChk; #ifdef __DEMO__ bInstallDemo=TRUE; #else //caso della reinstallazione su precedente versione: tutto quanto segue e' inutile quindi esce if (nReinstall > 0) then return; endif; //caso di installazione nuova... if bInstallNetWrkChk then bInstallEnv=FALSE; endif; if bSetupStandard then bInstallEnv=TRUE; else szMsg = "Il programma puo' essere installato in "; szMsg=szMsg + "modalita' postazione singola, postazione di rete su disco locale, "; szMsg=szMsg + "postazione di rete su disco di rete. Si desidera installare:"; nRetv = AskOptions(EXCLUSIVE,szMsg, "&in postazione singola (o server)", bInstallEnv, "in rete con &programmi su disco &locale", bInstallNetWrkChk ); endif; if bInstallNetWrkChk then bInstallEnv=TRUE; endif; #endif if (( zInstallDemo!=bInstallDemo) || (zInstallNetWrkChk!=bInstallNetWrkChk) ) then if bInstallDemo then bInstallPrg = TRUE; bInstallData=TRUE; bInstallDemoData=TRUE; else bInstallPrg = TRUE; endif; endif; end; //________________________________________________________________________________________________________________________ // *** Chiede la directory ove installare i programmi; function _SelectProgramDestination(nRetv) BOOL bReenterPath, bConfirmdatapath, bFoundInst, bRemoteExe, bRemoteData,bOk; STRING szPar, szInst; NUMBER nPar, nNextFree; begin // ricontrolla la presenza di una installazione // e determina la posizione della directory "DATI" //aggiornamento di una precedente installazione if (nReinstall > 0 ) then szConfigPath = szReinstallPath; bNuovaInst = FALSE; bInstallData = FALSE; endif; //se non esiste una precedente installazione->nuova installazione;necessiterį di un path di default per l'installazione if (szConfigPath = "") then bNuovaInst = TRUE; //se non e' stato scelto un aggiornamento e' comunque una nuova installazione! bInstallData = TRUE; szConfigPath = DEFAULT_LOCALPATH; endif; if (nReinstall = 0) then nRetv=AskDestPath( "", "", szConfigPath, 0 ); StrRemoveLastSlash(szConfigPath); if (nRetv=BACK) then return; endif; endif; bNuovaInst = ! _CheckExistingInst(szConfigPath); if (bNuovaInst && (! ExistsDir(szConfigPath))) then CreateDir(szConfigPath); endif; //per una nuova installazione:aggiunge un paragrafo relativo nel Atwin.stp nNextFree = 0; nPar = 1; szPar = "1"; bFoundInst = FALSE; while (GetProfString("C:\\Atwin.stp", szPar, "Program", szInst) = 0 && ! bFoundInst) if (_CheckExistingInst(szInst)) then bOk = szInst = szConfigPath; if (! bOk) then GetProfString("C:\\Atwin.stp", szPar, "CampoIni", szInst); bOk = szInst = szConfigPath ^ "\\campo.ini"; endif; if (bOk) then bFoundInst = TRUE; nReinstall = nPar; bSetupStandard = FALSE; //non puo' essere una installazione standard, sta sovrascrivendo una precedente installazione endif; else if (nNextFree = 0) then nNextFree = nPar; endif; endif; nPar = nPar + 1; NumToStr(szPar, nPar); endwhile; if (! bFoundInst) then if (nNextFree > 0) then nPar = nNextFree; endif; NumToStr(szPar, nPar); WriteProfString("C:\\Atwin.stp", szPar, "Program", szConfigPath); nNewInstall = nPar; endif; if (nReinstall > 0) then NumToStr(szPar, nReinstall); GetProfString("C:\\Atwin.stp", szPar, "CampoIni", szCampoIni); GetProfString("C:\\Atwin.stp", szPar, "Program", szAppPath); endif; if ( (szCampoIni = "") || (! Is (FILE_EXISTS, szCampoIni))) then szCampoIni = szConfigPath ^ "campo.ini"; endif; //esiste campo.ini -> e' una reinstallazione if ( Is (FILE_EXISTS, szCampoIni ) ) then GetProfString(szCampoIni, "Main", "Program",szAppRefPath ); GetProfString(szCampoIni, "Main", "Study",szDataPath ); _IsNetworkDrive(szAppPath, bRemoteExe); _IsNetworkDrive(szDataPath, bRemoteData); bInstallNetWrkChk = FALSE; bInstallEnv = ! bRemoteExe; //distingue tra dati in remoto e campo wst if (bRemoteData) then bInstallNetWrkChk = !bRemoteExe; endif; //non esiste campo.ini -> e' una installazione else szDataPath = szConfigPath ^ "DATI\\"; endif; if ( nReinstall > 0 ) then NumToStr(szPar, nReinstall); else NumToStr(szPar, nNewInstall); endif; //scrive su campo.stp.. WriteProfString("C:\\Atwin.stp", szPar, "CampoIni", ""); //..e l'application path e' lo stesso del campo.ini (ovvio,ba0.exe e' assieme a campo.ini) szAppPath = szConfigPath; return; end; //________________________________________________________________________________________________________________________ // *** Selezione dei componenti da installare (area dati, server chiave e master server) function _SelectWhatToInstall(nRetv) BOOL bJunk; STRING szMsg[512], szPar; NUMBER nServers; begin bInstallPrg=TRUE; bInstallData = (szDataPath != '')&&(! _CheckExistingData(szDataPath)); bInstallServer = FALSE; if (nReinstall > 0) then bInstallData = FALSE; NumToStr(szPar, nReinstall); GetProfInt("C:\\Atwin.stp", szPar, "Servers", nServers); bInstallServer = nServers != 0; endif; //installazione standard per utente basico; finisce qui if bSetupStandard then return; endif; //installazione avanzata repeat // Windows 95/98/ME or NT/2000/XP platforms if (bInstallNetWrkChk) then szMsg= "Setup installera' la postazione di lavoro.\nE' possibile installare anche l'area dati, il server di rete per le chiavi di protezione."; nRetv = AskOptions(NONEXCLUSIVE,szMsg, "Installa l'area dati", bInstallData , "Installa i servizi avanzati di rete (Lerch)", bInstallServer ); else szMsg= "E' possibile installare i programmi (ambiente e moduli), l'area dati, il server di rete per le chiavi di protezione. "; szMsg=szMsg + "\nSelezionare almeno una delle componenti"; nRetv = AskOptions(NONEXCLUSIVE,szMsg, "Installa i programmi", bInstallPrg, "Installa l'area dati", bInstallData , "Installa i servizi avanzati di rete (Lerch)", bInstallServer ); endif; until nRetv!=NEXT || bInstallData || bInstallPrg || bInstallServer; //viene aggiornato il file Atwin.stp con i valori relativi all'installazione del master server e del server di chiavi if (nReinstall > 0) then NumToStr(szPar, nReinstall); else NumToStr(szPar, nNewInstall); endif; nServers = 0; if (bInstallServer) then nServers = 1; endif; NumToStr(szTmp, nServers); WriteProfString("C:\\Atwin.stp", szPar, "Servers", szTmp); return ; end; //________________________________________________________________________________________________________________________ // *** In caso venga selezionata una installazione di rete, richiede i parametri necessari function _SelectNetConfig(nDirection ) STRING szText[ _MAX_LENGTH ], szModifiedPath[ _MAX_LENGTH ], szTemp[ _MAX_LENGTH ]; STRING szNetAppPath[ _MAX_LENGTH ], szPar[ _MAX_LENGTH ]; NUMBER nHandle; BOOL ok; begin if (!(bInstallNetWrkChk && bInstallPrg)) then return; endif; if (szAppRefPath = "") then GetProfString(szCampoIni, "Main", "Program", szAppRefPath); endif; szNetAppPath=szAppRefPath; szText = szText + "Inserire il percorso completo del direttorio di rete che contiene i files del programma. "; szText = szText + "Se tali files mancano, installarli secondo la modalita' 'postazione singola'. "; szText = szText + "Ogni postazione di rete verifichera' eventuali aggiornamenti di questa installazione "; szText = szText + "aggiornandosi automaticamente."; if (szNetAppPath = "") then szNetAppPath = DEFAULT_NETPATH; endif; ok=FALSE; while (!ok) nDirection = AskPath( szText , szNetAppPath, szModifiedPath ); if ( nDirection = NEXT ) then if ( _CheckExistingInst(szModifiedPath) ) then szNetAppPath = szModifiedPath; StrToUpper( szNetAppPath, szNetAppPath ); if szDataPath = "" then StrToUpper(szDataPath ,szModifiedPath); endif; bProgrammiServer = TRUE; ok = TRUE; else _Attenzione( "Impossibile trovare i files del programma in " + szModifiedPath ); endif; else ok = TRUE; endif; endwhile; szAppRefPath =szNetAppPath; StrRemoveLastSlash(szAppRefPath); end; //________________________________________________________________________________________________________________________ // *** Chiede dove sono i dati da utilizzare; se esistono gia' o vanno creati function _SelectDataDestination(nRetv) BOOL bConfirmdatapath; STRING szChangedPath[256] STRING sMsg[256] begin // ricontrolla la presenza di una installazione // e determina la posizione della directory "DATI" if bInstallData || bInstallPrg then if bInstallData then sMsg = "Setup installerą l'area dati nel seguente direttorio."; else sMsg = "Verrą utilizzata l'area dati che si trova nel seguente direttorio."; endif; sMsg = sMsg + "\nE' possibile cambiare il direttorio digitando il nuovo nome o scegliendo il pulsante "; repeat bConfirmdatapath=TRUE; nRetv=AskPath(sMsg ,szDataPath, szChangedPath); if (nRetv=BACK) then return ; endif; szDataPath=szChangedPath; bDatiPresenti = _CheckExistingData(szDataPath); if (bDatiPresenti && bInstallData) then bConfirmdatapath=_CanOverwrite(); endif; if ((! bDatiPresenti) && (! bInstallData)) then if (bSetupStandard) then bInstallData=TRUE; else MessageBox( "La cartella indicata non contiene dati. \nSe si desidera davvero utilizzare questa cartella, \nabilitare l'installazione dell'area dati" ,SEVERE); bConfirmdatapath=FALSE; endif; endif; until (bConfirmdatapath); endif; return ; end; //________________________________________________________________________________________________________________________ // **** Selezione del tipo di installazione dati function _SelectDataType( nRetv) BOOL bJunk; STRING szMsg[512]; begin if ( (!bInstallData) || (nReinstall > 0) ) then return; endif; #ifdef __DEMO__ bInstallDemoData=TRUE; #else szMsg= "Verranno installati nuovi archivi nell'area dati. \n"; szMsg= szMsg + "Si desidera precaricarli con dati dimostrativi ?"; repeat nRetv = AskOptions(NONEXCLUSIVE,szMsg, "carica i dati dimostrativi", bInstallDemoData); if nRetv=BACK then return ; endif; if bInstallDemoData then szInstType = INST_DEMO; else szInstType = INST_ENVIRONMENT; bInstallFirm = TRUE; endif; until nRetv=NEXT; #endif return ; end; //________________________________________________________________________________________________________________________ // *** sceglie la locazione della chiave (locale o server) function _SelectDongleServer(nRetv) STRING msg; BOOL bJunk; begin if (bInstallDemo || bSetupStandard) then bUseDongleServer=FALSE; else msg = "I programmi sono protetti da una chiave hardware.\n"; //se installi il server (quindi chiave in locale) lo usi if (bInstallServer) then bUseDongleServer=TRUE; msg = msg + "Su questa macchina sta per essere installato un server di autorizzazioni:"; nRetv = AskOptions(EXCLUSIVE,msg, "utilizza il server per il controllo delle autorizzazioni",bJunk); else if (_TCPIPPresent()) then // e' installato il TCP/IP o verra' installato; posso fare uso delle chiavi di rete msg = msg + "Il controllo delle autorizzazioni va effettuato:"; if (nReinstall > 0 ) then GetProfString(szCampoIni, "Server", "Dongle", szTmp); bJunk = (szTmp = ""); bUseDongleServer = ! bJunk; endif; nRetv = AskOptions(EXCLUSIVE,msg, "tramite chiave locale", bJunk, "tramite un server di chiavi", bUseDongleServer ); else bUseDongleServer=FALSE; nRetv = AskOptions(EXCLUSIVE, msg, "effettuare il controllo tramite chiave locale", bJunk); endif; endif; endif; return nRetv; end; //________________________________________________________________________________________________________________________ // *** Mette in Avvio Automatico il collegamento al server della chiave function _FindAutoStartFolder(nDirection) NUMBER nItems; NUMBER lResult; NUMBER listID; NUMBER nRetv; STRING szTempore,szStartFolder; BOOL bJunk; begin if (!bInstallServer) then return; endif; RegDBSetDefaultRoot(HKEY_CURRENT_USER); if RegDBGetKeyValueEx("\\.Default\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders","Startup",lResult,szAutoRunFolder,nItems) < 0 then // Registry access failed (16 bit DLL?) szAutoRunFolder=""; // try to determine the folder by names... listID = ListCreate(STRINGLIST); if (GetGroupNameList(listID)<0) then MessageBox("Impossibile leggere la lista delle cartelle dei programmi",SEVERE); endif; lResult= ListGetFirstString(listID,szTempore); while (lResult != END_OF_LIST) lResult = ListGetNextString(listID,szTempore); if szTempore = "Esecuzione Automatica" then szAutoRunFolder=szTempore; endif; if szTempore = "Startup" then szAutoRunFolder=szTempore; endif; endwhile; if szAutoRunFolder="" then _Attenzione("Non riesco a determinare la cartella di Esecuzione Automatica di Windows"); repeat szStartFolder=""; nDirection=SelectFolder("Cartella di Esecuzione Automatica",szAutoRunFolder,szAutoRunFolder); if nDirection = BACK then return; endif; if QueryProgGroup(szAutoRunFolder,szStartFolder,nItems) then _Attenzione("La cartella indicata non fa parte delle cartelle programmi di Windows"); nDirection=BACK; endif; until nDirection=NEXT; endif; endif; return ; end; //________________________________________________________________________________________________________________________ //*** setta il nome del server di autorizzazioni function _SelectDongleServerDestination(nDirection) NUMBER lResult; NUMBER listID; NUMBER nRetv; STRING szTempore[_MAX_LENGTH]; BOOL bJunk; begin if !bUseDongleServer then return; endif; if (nReinstall > 0 ) then GetProfString(szCampoIni, "Server", "Dongle", szDongleServerName); endif; // propone il nome dell'ultimo server di autorizzazioni (in caso si sia ritornati indietro nel corso // dell'installazione szTempore = szDongleServerName; // se l'installazione e' del tipo avanzata/installazione locale server e si vuole installare il server // di autorizzazioni, propone di default localhost, in quanto il server autorizzazioni e' in locale if ((!bInstallNetWrkChk) && (nReinstall <= 0) ) then szTempore = "localhost"; endif; SetDialogTitle(DLG_ASK_TEXT,"Server di autorizzazioni"); nDirection = AskText("L'installazione attuale farą riferimento ad un server di autorizzazioni. Inserire il nome del computer (NON preceduto da '\\\\') su cui é stato installato il server delle chiavi di protezione.",szTempore,szDongleServerName); if nDirection=BACK then szDongleServerName=szTempore; endif; return ; end; //________________________________________________________________________________________________________________________ // *** Mostra le opzioni scelte per l'installazione function _ConfirmInstallation(nDirection) STRING Msg,szInfo; NUMBER listInfo; begin //crea la lista delle informazioni listInfo = ListCreate(STRINGLIST); Msg = "Si e' scelto di installare "; if bInstallPrg then if bInstallDemo then Msg =Msg +"il programma in versione demo"; else Msg =Msg +"il programma in versione commerciale"; endif; else Msg =Msg +"l'area dati"; endif; Msg = Msg + " con le opzioni seguenti. \nPremendo Setup procedera' con l'installazione del programma."; // directory dei programmi (locale o di rete) if (bInstallNetWrkChk) then szInfo="Installazione di rete di riferimento:"; ListAddString(listInfo, szInfo, AFTER); szInfo=" " + szAppRefPath; ListAddString(listInfo, szInfo, AFTER); szInfo="Direttorio dei programmi locali: "; else szInfo="Direttorio dei programmi: "; endif; ListAddString(listInfo, szInfo, AFTER); szInfo=" " + szAppPath; ListAddString(listInfo, szInfo, AFTER); // directory dei dati (esistente o da creare) szInfo="Area dati "; if !bInstallData then szInfo=szInfo + "pre-esistente"; else if bInstallDemoData then szInfo=szInfo + "da installare (precaricata con archivi dimostrativi)"; else szInfo=szInfo + "da installare"; endif; endif; szInfo=szInfo + " in: "; ListAddString(listInfo, szInfo, AFTER); szInfo=" " + szDataPath; ListAddString(listInfo, szInfo, AFTER); // chiave di protezione (locale o con dongle server) #ifndef __DEMO__ szInfo="Controllo protezione: "; ListAddString(listInfo, szInfo, AFTER); if bUseDongleServer then szInfo=" attraverso il server '" + szDongleServerName +"'"; else szInfo=" attraverso chiave locale"; endif; ListAddString(listInfo, szInfo, AFTER); #endif // Mostra a video la lista nDirection = SdShowInfoList( "Conferma installazione", Msg, listInfo ); end; //________________________________________________________________________________________________________________________ // *** Installazione dell'area dati function _InstallData(nDirection) BOOL bReenterPath, bConfirmdatapath; STRING szTitle[_MAX_LENGTH]; STRING szPath[_MAX_LENGTH]; STRING szTemp[_MAX_LENGTH]; NUMBER nTmp; begin if (!bInstallData) then return; endif; nDirection=BACK; TARGETDIR = szDataPath; // i .z hanno gia' il sottodirettorio nel nome di file if ( CreateDir( TARGETDIR ) < 0 ) then _Attenzione( STR_DATA_DIR_NOTCREATED ); return; endif; // **************** // copia dati comuni, std, 770 o demo? SetColor(STATUSBAR,BLUE); Enable(FEEDBACK_OPERATION); Enable(STATUS); // ******** installa dati DEMO ? if bInstallDemoData then szTitle = "Installazione dati dimostrativi su " + szDataPath; FileSetBeginDefine ( "DDEMO"); if ( CompressGet( "DATIDEMO.Z", "*.*", INCLUDE_SUBDIR ) < 0) then szText = STR_ERR_DECOMPRESS + " il modulo Dati dimostrativi."; _Attenzione( szText ); endif; FileSetEndDefine ( "DDEMO"); StatusUpdate( ON, 100 ); SetStatusWindow( 0, szTitle ); _PerformSet ( "DDEMO"); // ******** installa dati iniziali ditte elseif bInstallFirm then szTitle = "Installazione dati comuni e standard su " + szDataPath; FileSetBeginDefine ( "DATI"); if ( CompressGet( "DATISTD.Z", "*.*", INCLUDE_SUBDIR ) < 0) then szText = STR_ERR_DECOMPRESS + " il modulo Dati ditta."; _Attenzione( szText ); endif; FileSetEndDefine ( "DATI"); SetStatusWindow( 0, szTitle ); StatusUpdate( ON, 100 ); _PerformSet ( "DATI"); endif; Disable(STATUS); // **************** _CopiaADMININI( ); _SetCampoIni(); // **************** // marca l'installazione dati con il tipo giusto szPath=szDataPath ^ "\\CONFIG"; szTemp=szPath ^ DATATYPE_FILE; if ( Is( FILE_EXISTS, szTemp ) ) then DeleteFile(szTemp); endif; OpenFileMode( FILE_MODE_APPEND ); CreateFile( nTmp, szPath, DATATYPE_FILE); WriteLine(nTmp,szInstType); CloseFile( nTmp ); nDirection=NEXT; end; //________________________________________________________________________________________________________________________ // *** Installa le dll, i programmi, aggiorna i registry ed i files di sistema; si sposta poi nella directory di // *** destinazione dell'installazione,copia l'install.ini function _InstallInitialFiles(nRetv) BOOL bReenterPath, bConfirmdatapath; STRING sTmp[32],sPath[64]; NUMBER direction; begin if (bInstallPrg) then if (bInstallEnv || bInstallDemo) then _ForceAttrib4Dll( ); // Effettua la vera e propria installazione di: dll,vxd,parte base necessaria installazione c++ _DeleteFilesMinima( ); _InstallFilesMinima( ); Disable( FEEDBACK_FULL ); Disable( STATUS ); VarRestore( SRCTARGETDIR ); // Ripristina il valore di TARGETDIR _UpdateStartMenu( ); // aggiorna il menu di avvio di windows ChangeDirectory(szAppPath); _CopiaINSTALLINI( ); _SetCampoIni(); nRetv=NEXT; endif; endif; end; //________________________________________________________________________________________________________________________ // *** installa il collegamento al master server nel menu autostart di windows function _InstallServerAutoStart(nDirection) STRING szTempore; begin if ( ! bInstallServer ) then return; endif; //server di controllo dei vari servers possibili szTempore = szAppPath ^ "\\servers\\lerch.exe"; AddFolderIcon( szAutoRunFolder, "Lerch", szTempore, "", szTempore, 0, "", REPLACE ); end; //________________________________________________________________________________________________________________________ // *** memorizza e resetta un eventuale valore di server di chiavi function _ResetDongleServer(szDongle) STRING szCampoIni; begin if ((! bUseDongleServer ) || (bInstallServer)) then szCampoIni = szConfigPath ^ "campo.ini"; if ( Is( FILE_EXISTS, szCampoIni ) ) then GetProfString(szCampoIni, "Server", "Dongle",szDongle ); WriteProfString(szCampoIni, "Server", "Dongle", ""); endif; endif; end; //________________________________________________________________________________________________________________________ // *** ripristina un eventuale valore di server di chiavi function _RestoreDongleServer(szDongle) STRING szCampoIni; begin if ((! bUseDongleServer) || (bInstallServer)) then szCampoIni = szConfigPath ^ "CAMPO.INI"; if ( Is( FILE_EXISTS, szCampoIni ) ) then WriteProfString(szCampoIni, "Server", "Dongle", szDongle); endif; endif; end;