//________________________________________________________________________________________________________________________ // *** Compila il file Campo.ini function _SetCampoIni( ) STRING szTmpPath[_MAX_LENGTH], szPrgPath[_MAX_LENGTH], szTestData, szTestProg; NUMBER nPos; begin StrToLower (szTmpPath, szCampoIni); nPos = StrFind(szTmpPath,"campo.ini"); StrSub (szPrgPath, szTmpPath, 0, nPos); if ( CreateDir( szPrgPath ) < 0 ) then _Errore( STR_DIR_NOTCREATED ); endif; ChangeDirectory( szPrgPath); // scrive le stesse cose nel file unico campo.ini , se esiste szTmpPath=szPrgPath ^ "CAMPO.INI"; //non scrive nulla in caso di aggiornamento di una vecchia installazione if (nReinstall <= 0) then WriteProfString(szTmpPath, "Main", "MailTo",""); WriteProfString(szTmpPath, "Main", "MaxHandles","32"); WriteProfString(szTmpPath, "Main", "Program",szAppRefPath); WriteProfString(szTmpPath, "Main", "Study",szDataPath); WriteProfString(szTmpPath, "Main", "Firm","COM"); szTestData = ""; szTestProg = ""; //SOLO se e' una installazione locale puo' fare il test del database (con conversione!) if (( ! bInstallNetWrkChk) && ( ! bInstallNetWrk )) then szTestData = "X"; szTestProg = "N"; endif; //se ho i programmi in locale ed idati in remoto posso fare l'aggiornamento dei programmi (NON dei dati) if (bInstallNetWrkChk) then szTestData = "N"; szTestProg = "X"; endif; //in caso di campo wst (tutto in remoto) NON testi un tubo! WriteProfString(szTmpPath, "Main", "TestDatabase",szTestData ); WriteProfString(szTmpPath, "Main", "TestPrograms",szTestProg ); endif; if (bInstallPrg) then if ((bUseDongleServer) && (!_TCPIPPresent())) then szDongleServerName=""; _Attenzione("Impossibile utilizzare il server di rete delle autorizzazioni: \nprotocollo TCP-IP non rilevato"); endif; WriteProfString(szTmpPath, "Server", "Dongle" , szDongleServerName); endif; szTmpPath=szPrgPath ^ "INSTALL.INI"; if (bInstallNetWrkChk) then WriteProfString(szTmpPath, "Main", "DiskPath",szAppRefPath); endif; end; //________________________________________________________________________________________________________________________ // **** Funzione per aggiornare i files di sistema in windows 95/98 (non + utilizzata dalla 2.0!) function _UpdateSysFiles( ) NUMBER nNotModify, nGoOut, nRet, nInfo, nCurFiles, nLen, nNr; STRING szTemp[_MAX_LENGTH], szWin_Ini[_MAX_LENGTH]; begin if (!bNuovaInst) && (!bInstallNetWrk) then return; endif; //serve solo per windows 95/98 e roba simile... if (szOSName = "Windows NT") then return; endif; nSystemFileModified = TRUE; nNotModify = FALSE; nInfo = FALSE; nGoOut = FALSE; SetDialogTitle(DLG_ASK_OPTIONS, "Modifica i files di sistema" ); Disable( BACKBUTTON ); SetDialogTitle(DLG_CANCEL, "Uscita" ); SetDialogTitle(DLG_OK, "Conferma" ); while (! nGoOut) if (!bNuovaInst) then nSystemFileModified=FALSE; nNotModify=TRUE; endif; nRet = AskOptions(EXCLUSIVE, STR_MODSYSFILES, STR_MODIFY, nSystemFileModified, STR_NOTMODIFY, nNotModify, STR_INFOMODIFY, nInfo ); if nInfo then // Mostra le informazioni if _PreviewBatch( ) then nSystemFileModified = TRUE; else nSystemFileModified = FALSE; endif; endif; nGoOut = TRUE; endwhile; //se il numero di files e' insufficiente in config.sys -> propone di incrementarlo VarSave(SRCTARGETDIR); SRCDIR = "C:\\"; CopyFile( "CONFIG.SYS", "CONFIG.PRA" ); VarRestore(SRCTARGETDIR); if (nSystemFileModified) then ConfigSetFileName( "C:\\CONFIG.SYS" ); else szTemp = TARGETDIR ^ "CONFIG.PRA"; ConfigSetFileName( szTemp ); endif; EzConfigGetValue( "FILES", nCurFiles ); if nCurFiles < NUM_FILES_IN_CONFIG then EzConfigSetValue( "FILES", NUM_FILES_IN_CONFIG ); endif; if nSystemFileModified then SprintfBox( WARNING, "Attenzione", STR_FILE_MODIFIED, TARGETDIR ); else SprintfBox( WARNING, "Attenzione", STR_FILE_NOTMODIFIED, TARGETDIR ); endif; end; //________________________________________________________________________________________________________________________ // *** Funzione per cancellare i files minimi per il fascicolatore function _DeleteFilesMinima( ) NUMBER pDataList, pProgramList, nFile, nFlag, nLen; STRING szPath [ _MAX_LENGTH ], szFileName [ _MAX_LENGTH ], szFC [ 2 ], szLine [ _MAX_LENGTH ]; begin if (!bNuovaInst) then szPath=szAppPath ^ "install.ini"; GetProfString(szPath,"Main","Demo",szFC); if szFC = "X" then // cancella tutti gli eseguibili per evitare sovrapposizioni tra versione demo e normale szPath=szAppPath; nLen=FindAllFiles(szAppPath, "*.EXE", szFileName, RESET); while (nLen=0 ) DeleteFile(szFileName); nLen=FindAllFiles(szAppPath, "*.EXE", szFileName, CONTINUE); endwhile; endif; endif; end; //________________________________________________________________________________________________________________________ // *** esegue effettivamente l'installazione dei files minimi di sistema (*.dll,*.vxd, parte della base necessaria a // *** lanciare poi l'installatore c++) function _InstallFilesMinima( ) NUMBER nRet, ntDisk, nHandle; BOOL bRightDisk; STRING szTemp [_MAX_LENGTH]; STRING szStatusText [_MAX_LENGTH]; begin // Backup TARGETDIR to local variable // Define fileset items // --------------------- // SetColor(STATUSBAR,BLUE); Enable(FEEDBACK_OPERATION); Enable(STATUS); FileSetBeginDefine ( "WIN"); if (szOSName != "Windows NT") then TARGETDIR = WINDIR ^ "SYSTEM"; if ( CompressGet( "WINSYS.Z", "*.*", INCLUDE_SUBDIR ) < 0) then szText = STR_ERR_DECOMPRESS + " la libreria WINSYS."; _Errore( szText ); endif; endif; FileSetEndDefine ( "WIN"); FileSetBeginDefine ( "BA"); TARGETDIR = szAppPath; if ( CreateDir( TARGETDIR ) < 0 ) then _Errore( STR_DIR_NOTCREATED ); else if ( CompressGet( "SYS.Z", "*.*", INCLUDE_SUBDIR ) < 0) then szText = STR_ERR_DECOMPRESS + " la libreria SYS."; _Errore( szText ); endif; szText = "BA.Z"; if ( CompressGet( szText, "*.*", INCLUDE_SUBDIR ) < 0) then szText = STR_ERR_DECOMPRESS + " il programma installatore"; _Errore( szText ); endif; if ( CompressGet( "RES.Z", "*.*", INCLUDE_SUBDIR ) < 0) then szText = STR_ERR_DECOMPRESS + " il programma installatore"; _Errore( szText ); endif; endif; FileSetEndDefine ( "BA"); StrToUpper( szAppPath, szAppPath ); szStatusText = "Installazione su " + szAppPath; StatusUpdate( ON, 50 ); SetStatusWindow( 0, "Installazione librerie ..." ); _PerformSet ( "WIN"); StatusUpdate( ON, 100 ); SetStatusWindow( 50, "Installazione programmi di ambiente .." ); _PerformSet ( "BA"); szTemp = szAppPath ^ "RecDesc"; CreateDir(szTemp); szTemp = szAppPath ^ "Servers"; CreateDir(szTemp); Disable(STATUS); end; //------------------------------------------------------------------------------------------------ function _PerformSet ( sFileset) NUMBER nDisk; BOOL bDone; NUMBER nRet, ntDisk, nHandle; BOOL bRightDisk; STRING szTemp [_MAX_LENGTH]; STRING szTmp [_MAX_LENGTH]; STRING szFileName [_MAX_LENGTH]; STRING szExt [_MAX_LENGTH]; STRING szText [_MAX_LENGTH]; STRING szEntDisk [_MAX_LENGTH]; STRING szMsg [_MAX_LENGTH]; begin bDone = FALSE; nDisk = 1; while ( !bDone ) nRet = FileSetPerformEz ( sFileset, 1); switch ( nRet ) case FS_TONEXTDISK: // non usato da FileSetPerformEz if nDisk > 0 then NumToStr( szExt, nDisk ); szEntDisk = STR_INSERTDISK + STR_TAGDISK1 + szExt; szTemp = "diskid" ^ szExt; SetDialogTitle ( DLG_ENTER_DISK, "Cambio disco" ); SetDialogTitle ( DLG_CANCEL, "Uscita" ); Suppress( ENTERDISK_ERRMSG, DISABLE ); bRightDisk = FALSE; while( !bRightDisk ) nRet = EnterDisk( szEntDisk, szTemp ); switch( nRet ) case DISKID: _Attenzione( "L'unita' indicata non e' valida." ); case BADPATH: _Attenzione( "Il percorso indicato non e' valido." ); case DRIVEOPEN: _Attenzione( "Inserire il disco nell'unita' indicata!" ); case BADTAGFILE: _Attenzione( "Il disco inserito non e' corretto. Inserire il disco richiesto." ); case CANCEL: _ExitOnConfirm( ); case OK: bRightDisk = TRUE; endswitch; endwhile; endif; case FS_OPERROR: Sprintf( szMsg, "E' stato rilevato un errore copiando il file %s. Il file non e' stato copiato.\n\nErrore FS_OPERROR.", ERRORFILENAME ); _Errore( szMsg ); case FS_GENERROR: Sprintf( szMsg, "E' stato rilevato un errore copiando il file %s. Il file non e' stato copiato.\n\nErrore FS_GENERROR.", ERRORFILENAME ); _Errore( szMsg ); case FS_TARGETREADONLY: szMsg="Impossibile scrivere nella directory di destinazione."; _Errore( szMsg ); case FS_INCORRECTDISK: _Attenzione( "Disco non valido.\n\nInserire il disco corretto." ); case FS_DISKONEREQUIRED: szEntDisk = STR_INSERTDISK + STR_TAGDISK1; _Attenzione( szEntDisk ); case FS_RESETREQUIRED: _Errore( "Impossibile copiare il file a causa di un errore interno." ); case FS_OUTOFSPACE: szMsg= "Lo spazio su disco non e' stato sufficiente per completare la copia dei files.\n\nErrore FS_OUTOFSPACE."; _Errore( szMsg ); case FS_DONE: bDone = TRUE; default : if ( nRet < 0 ) then szMsg = "Si e' verificato un errore copiando e decomprimendo il file " ^ ERRORFILENAME; _Errore( szMsg ); endif; endswitch; endwhile; FileSetEndPerform ( sFileset); end; //_______________________________________________________________________________________________________________________ // *** aggiorna il menu dei programmi di windows, aggiungendovi la directory del programma ed il link a ba0.exe function _UpdateStartMenu( ) STRING szItemName [_MAX_LENGTH], szFolder [_MAX_LENGTH], szCmdLine [_MAX_LENGTH], szIconPath [_MAX_LENGTH], szWorkingDir[_MAX_LENGTH]; begin Enable( HOURGLASS ); // Mostra Program Manager AppCommand( PROGMAN, CMD_RESTORE ); // Aggiunge il gruppo di programmi ed i programmi szFolder="CAMPO"; ShowGroup (szFolder , SW_NORMAL ); if ( TRUE) then // Aggiunge CAMPO Program Manager if bInstallDemo then szItemName = "CAMPO Demo"; elseif bInstallNetWrk then szItemName = "CAMPO WST"; else szItemName = "CAMPO"; endif; szCmdLine = szAppPath ^ "\\BA0.EXE"; szIconPath = szCmdLine; AddFolderIcon( szFolder, szItemName, szCmdLine, "", szIconPath, 0, "", REPLACE ); //AddProgItemEx ( szFolder, szItemName, szCmdLine, "", szIconPath, 0, "", REPLACE ); endif; AppCommand( PROGMAN, CMD_MINIMIZE ); Disable( HOURGLASS ); end; //----------------------------------------------------------------------------- function _CambiaDirectory( ) STRING szText[ _MAX_LENGTH ]; STRING szModifiedPath[ _MAX_LENGTH ]; STRING szUserSelectedDrive[ _MAX_LENGTH ]; STRING szIncorrectPath[ _MAX_LENGTH ]; begin szText = STR_TEXT1; SetDialogTitle( DLG_ASK_PATH, "Directory per installare i programmi" ); if ( AskPath( szText , szAppPath, szModifiedPath ) = OK ) then StrToUpper( szModifiedPath, szModifiedPath ); GetDisk( szModifiedPath, szUserSelectedDrive ); if ( Is ( VALID_PATH, szModifiedPath ) = 1 ) then if szAppPath != szModifiedPath then szAppPath = szModifiedPath; szDataPath = szAppPath ^ "DATI\\"; endif; szText = STR_DATATEXT1; SetDialogTitle( DLG_ASK_PATH, "Directory per installare i dati" ); if ( AskPath( szText , szDataPath, szModifiedPath ) = OK ) then StrToUpper( szModifiedPath, szModifiedPath ); GetDisk( szModifiedPath, szUserSelectedDrive ); if ( Is ( VALID_PATH, szModifiedPath ) = 1 ) then szDataPath = szModifiedPath; else szIncorrectPath = STR_INVALID_PATH + "\n" + szModifiedPath; _Attenzione( szIncorrectPath ); endif; endif; endif; endif; end; //________________________________________________________________________________________________________________________ // *** copia il file ADMIN.INI nella directory config che sta sotto la directory dati function _CopiaADMININI( ) STRING szPath[_MAX_LENGTH], szFileName[_MAX_LENGTH], szLine[ _MAX_LENGTH], szFC[ 2 ], szTmp[ _MAX_LENGTH]; NUMBER nFlag, nFileIn, nFileOut, nLoop; begin szPath = szDataPath ^ "CONFIG"; szTmp = szPath ^ "ADMIN.INI"; if ( ! Is( FILE_EXISTS, szTmp ) ) then if ExistsDir( szPath ) = NOTEXISTS then if ( CreateDir( szPath ) < 0 ) then _Errore( "Impossibile creare la directory CONFIG sotto i dati!" ); endif; endif; szFileName = "ADMIN.INI"; OpenFileMode( FILE_MODE_APPEND ); CreateFile( nFileOut, szPath, szFileName ); OpenFileMode( FILE_MODE_NORMAL ); szPath = szAppPath; OpenFile( nFileIn, szPath, szFileName ); nFlag = GetLine( nFileIn, szLine ); while( nFlag = 0 ) if szLine = "[Colors]" then nLoop = 0; while( nLoop = 0 ) WriteLine( nFileOut, szLine ); nFlag = GetLine( nFileIn, szLine ); nLoop = nFlag; if ( nLoop = 0 ) then StrSub( szFC, szLine, 0, 1 ); if ( szFC != "[" ) then nFlag = GetLine( nFileIn, szLine ); else nLoop = 1; endif; endif; endwhile; else if szLine = "[Font]" then nLoop = 0; while( nLoop = 0 ) WriteLine( nFileOut, szLine ); nFlag = GetLine( nFileIn, szLine ); nLoop = nFlag; if ( nLoop = 0 ) then StrSub( szFC, szLine, 0, 1 ); if ( szFC != "[" ) then nFlag = GetLine( nFileIn, szLine ); else nLoop = 1; endif; endif; endwhile; else nFlag = GetLine( nFileIn, szLine ); endif; endif; endwhile; CloseFile( nFileIn ); CloseFile( nFileOut ); endif; end; //________________________________________________________________________________________________________________________ // *** copia il file "install.ini" function _CopiaINSTALLINI( ) STRING szPath[_MAX_LENGTH], szFileName[_MAX_LENGTH], szLine[ _MAX_LENGTH], szFC[ 2 ], szTmp[ _MAX_LENGTH]; STRING szSrcPath[_MAX_LENGTH]; NUMBER nFlag, nFileOut, nLoop; begin // corregge il path dei dati in base all'installazione da dischetto o CD (o installazione di rete) szSrcPath = SRCDIR ; ParsePath(szPath,szSrcPath,DIRECTORY); //controlla la lunghezza della stringa del path (szPath): se >= 7 ->installazione da CD o rete //con immagini dei dischetti su DISK1, DISK2 ,...; se su CD/rete ->trimma la stringa del path in //modo che resti solo \DISK1 if (StrLength(szPath) >= 7) then StrSub(szTmp , szPath, (StrLength(szPath) - 7) ,6 ); nFileOut=StrFind(szTmp, "DISK"); if nFileOut>=0 then StrSub(szPath, szSrcPath ,0, StrLength(szSrcPath)- 7 + nFileOut); szSrcPath = szPath; endif; endif; //dopo aver completato la scrittura del path dei sorgenti di installazione (szSrcPath) gli aggiunge //la directory dei files compressi (zip se installazione normale, zipdemo se demo) if bInstallDemo then szSrcPath= szSrcPath ^ ZIPDEMO_DIRECTORY; else szSrcPath= szSrcPath ^ ZIP_DIRECTORY; endif; //quindi crea il nome completo di path dell'install.ini che si trova nella directory dei files compressi //che si vogliono scompattare.. szFileName = szSrcPath ^ "INSTALL.INI"; //..e trasforma szPath in .\install.ini (attualmente szAppPath é ignota) szPath= szAppPath ^ "INSTALL.INI"; //scrive delle "profile strings" nell'install.ini //scrive nel paragrafo [Main] il "DiskPath"=szSrcPath, il Producer, il DiskSize, la Versione //ACHTUNG! questo é l'install.ini che finisce nel root, con Versione=0; infatti szPath vale .\install.ini WriteProfString(szPath,"Main","DiskPath",szSrcPath); GetProfString(szFileName,"Main","Producer",szTmp); WriteProfString(szPath,"Main","Producer",szTmp); if bInstallDemo then szTmp = "X"; else szTmp = " "; endif; szPath=szAppPath ^ "install.ini"; if WriteProfString(szPath,"Main","Demo",szTmp) < 0 then _Attenzione("Impossibile scrivere il tipo della versione su install.ini"); endif; end; //________________________________________________________________________________________________________________________ // *** Crea un lista delle precedenti installazioni memorizzate nel file Campo.stp e genera //una option box con la lista,per lasciare scegliere all'utente quale installazione aggiornare function _ChooseReinstall(nRetv) LIST list; NUMBER nPar,i; STRING szInst,szIni,szPar,szComponents; begin list = ListCreate(STRINGLIST); szPar = "1"; nPar = 1; while (GetProfString("C:\\Campo.stp", szPar, "Program", szInst) = 0) //controlla se la precedente installazione e' di tipo campo wst if (GetProfString("C:\\Campo.stp", szPar, "CampoIni", szIni) = 0) then i = StrFind(szIni,"\\campo.ini"); StrSub(szInst, szIni, 0, i); if (!Is( FILE_EXISTS, szIni)) then szInst = szInst ^ " (RIMOSSA)"; endif; else if (!Is( FILE_EXISTS, szInst ^ "\\campo.aut")) then szInst = szInst ^ " (RIMOSSA)"; endif; endif; ListAddString(list, szInst, AFTER); nPar = nPar + 1; NumToStr(szPar, nPar); endwhile; szComponents = "Installazioni precedenti"; //crea la lista delle installazioni precedenti i = ListGetFirstString(list,szInst); while (i = 0) ComponentAddItem(szComponents, szInst, 0, szPar="1"); i = ListGetNextString(list,szInst); endwhile; nRetv = SdAskOptions("Installazioni precedenti", "Selezionare l'installazione da aggiornare", "", "", szComponents, EXCLUSIVE); nReinstall = 0; if (nRetv = NEXT) then nPar = 1; i = ListGetFirstString(list,szInst); while (i = 0) if (ComponentIsItemSelected(szComponents, szInst)) then if (StrFind(szInst, "(RIMOSSA)") < 0) then szReinstallPath = szInst; nReinstall = nPar; endif; endif; nPar = nPar+1; i = ListGetNextString(list,szInst); endwhile; endif; end; //________________________________________________________________________________________________________________________ // *** crea una lista con le unita' disco del computer, scegliendo poi quelle di rete (remote_drive) function _IsNetworkDrive(szPath, bRetval) STRING szDisk; NUMBER list, nCheck; begin bRetval = FALSE; if (GetDisk(szPath, szTmp) < 0) then return; endif; StrSub(szDisk,szTmp,0,1); list = ListCreate(STRINGLIST); if (GetValidDrivesList(list, REMOTE_DRIVE, -1) < 0) then ListDestroy(list); return; endif; nCheck = ListGetFirstString(list, szTmp); while (nCheck = 0 && ! bRetval) if (szTmp = szDisk) then bRetval = TRUE; endif; nCheck = ListGetNextString(list, szTmp); endwhile; ListDestroy(list); end; //________________________________________________________________________________________________________________________ // *** inizializza l'installazione function _ProgramPrologue() begin _GetOSName( ); // Reperisce il nome del sistema operativo in szOSName SetDialogTitle (DLG_ASK_OPTIONS, "Seleziona i componenti"); SetDialogTitle (DLG_ASK_TEXT, ""); SetDialogTitle (DLG_ASK_YESNO, "Domanda"); SetDialogTitle (DLG_ENTER_DISK, "Setup ha bisogno del prossimo disco"); SetDialogTitle (DLG_MSG_INFORMATION, "Messaggio"); SetDialogTitle (DLG_MSG_SEVERE, "Errore fatale"); SetDialogTitle (DLG_MSG_WARNING, "Attenzione"); SetDialogTitle( DLG_ASK_PATH, "Scelta direttorio" ); _DisattivaScreenSaver( ); // Disabilita lo screen-saver end; //________________________________________________________________________________________________________________________ // *** termina l'installazione function _ProgramEpilogue() begin _FineInstallazione( ); _RiattivaScreenSaver( ); end;