'************************************************************************** '* Generic install script for Broderbund Products '************************************************************************** '$DEFINE DEBUG ''Define for script development/debugging ''parse command line for custom commands here GLOBAL build$ GLOBAL destCfgFile$ GLOBAL srcDirStr$ GLOBAL canChain$ GLOBAL chainWindow% DECLARE FUNCTION ParseCommand (commFlag$) AS STRING build$ = ParseCommand("B") destCfgFile$ = build$ canChain$ = ParseCommand("X") temp$ = ParseCommand("P") IF temp$ <> "" THEN chainWindow% = VAL(temp$) ELSE chainWindow% = 0 END IF '$INCLUDE 'setupapi.inc' '$INCLUDE 'msdetect.inc' '$INCLUDE 'msregdb.inc' ''Dialog ID's CONST WELCOME = 100 CONST NOMIDIWARN = 101 CONST NOWAVEWARN = 102 CONST DUPFILE = 103 CONST ASKQUIT = 200 CONST FONTERROR = 201 CONST DESTPATH = 300 CONST WININIBACKUP = 301 CONST EXITFAILURE = 400 CONST EXITQUIT = 600 CONST EXITSUCCESS = 700 CONST EXITSUCCESS1 = 701 CONST EXITSUCCESS2 = 702 CONST APPHELP = 900 CONST MIDILIST = 1901 CONST EXITINCOMPLETE = 1902 CONST CUSTINST = 6200 CONST TOOBIG = 6300 CONST BADPATH = 6400 '' Dialog Variable String IDs CONST PRODUCTNAME = 701 CONST CUSTSUPPNUM = 702 CONST SUCCESSCOMMENT = 703 CONST SUCCESSCOMMENT1 = 750 CONST SUCCESSCOMMENT2 = 751 CONST FILEPATH = 704 CONST CHAINTEXT = 705 ''Bitmap ID CONST LOGO = 1 CONST BROADKEY = 30706 GLOBAL WINDRIVE$ ''Windows drive letter. GLOBAL sourceDir$ ''Install from directory. GLOBAL destDir$ ''Default destination directory. GLOBAL cfgFile$ ''Config file containing custom info for installer GLOBAL logFile$ ''Log file for installer activities GLOBAL filesInstalled% ''0 = no files installed, 1 = files installed GLOBAL waveNeeded% ''0 = wave device not required by product, 1 = wave device is required by product GLOBAL waveCount% '' # of wave devices installed on system GLOBAL midiNeeded% ''0 = MIDI device not required by product, 1 = MIDI device is required by product GLOBAL midiCount% '' # of MIDI devices installed on system GLOBAL qtwNeeded% '' QuickTime for Windows required GLOBAL qtwVersion$ '' QuickTime for Windows version that is required GLOBAL fontsToInstall% ''0 = no fonts need be installed, 1 = fonts need to be installed GLOBAL fontsInstalled% ''0 = not installed, 1 = installed (partial or otherwise) GLOBAL fontInstallError% ''0 = no error GLOBAL wingNeeded% ''0 = WinG not required, 1 = WinG required GLOBAL winIniBkpFile$ ''Backup name for WIN.INI file GLOBAL szInf$ GLOBAL prodName$ GLOBAL CUIDLL$ GLOBAL filePathID$ GLOBAL replaceAll% GLOBAL ExcessNeeded& ''if > 0, indicates space unavailable for install GLOBAL sucCom$ GLOBAL qtwSucComm$ GLOBAL cmdLine$ GLOBAL midiCmdLine$ GLOBAL qtwCmdLine$ DECLARE FUNCTION MakePath (szDir$, szFile$) AS STRING DECLARE FUNCTION InstantString (varStr$) AS STRING DECLARE SUB DeinstFiles DECLARE FUNCTION AddDirToCopyList (theFile$,dir$,srcDir$,dstDir$,silent%) AS INTEGER DECLARE FUNCTION SetDriveStatus (silent%) AS INTEGER DECLARE SUB DoRegistrations DECLARE FUNCTION CreateRegEntries LIB "brodreg.dll" (srcCfgFile$,dstCfgFile$,varTable$,demarChar$) AS INTEGER DECLARE FUNCTION InstallFonts LIB "brodfont.dll" (installDir$, configFile$, winBackup$) AS INTEGER DECLARE FUNCTION DeinstallFonts LIB "brodfont.dll" (configFile$, winBackup$) AS INTEGER DECLARE FUNCTION SetParentWindow LIB "brodutil.dll" (parentWindow%) AS INTEGER DECLARE FUNCTION DeleteDirectory LIB "brodutil.dll" (directory$,silent%) AS INTEGER DECLARE FUNCTION DeinstallFiles LIB "brodutil.dll" (directory$,config$,section$,remove%) AS INTEGER DECLARE FUNCTION NotifyChain LIB "brodutil.dll" (chainWindow%,wParam%,theMess$) AS INTEGER DECLARE FUNCTION PGInstall LIB "brodpgi.dll" (theFile$,silent%,showGroup%) AS INTEGER DECLARE FUNCTION PGUninstall LIB "brodpgi.dll" (theFile$,prejudice%) AS INTEGER DECLARE FUNCTION GetNetPGSize LIB "brodpgi.dll" (theFile$) AS INTEGER DECLARE FUNCTION SelectMidiDevice LIB "brodmidi.dll" (cmdLine$) AS INTEGER DECLARE FUNCTION GetDriverCount LIB "brodmidi.dll" (driverType$) AS INTEGER DECLARE SUB InstallPGI DECLARE FUNCTION GetWinVerString LIB "brodutil.dll" AS INTEGER INIT: CUIDLL$ = "mscuistf.dll" ''Custom user interface dll HELPPROC$ = "FHelpDlgProc" ''Help dialog procedure szInf$ = GetSymbolValue("STF_SRCINFPATH") IF szInf$ = "" THEN szInf$ = GetSymbolValue("STF_CWDDIR") + "BBINSTAL.INF" ELSE SPLITPATH szInf$,bDrive$,bDir$,bFile$,bExt$ IF bDrive$ = "" THEN szInf$ = GetSymbolValue("STF_CWDDIR")+szInf$ END IF END IF ReadInfFile szInf$ IF GetWindowsMajorVersion() = 3 AND GetWindowsMinorVersion() < 20 THEN ELSE crap% = DoMsgBox("No installation is required on Windows 95. The CD will autorun on re-insertion.","No Install Required",MB_OK) END ENDIF WINDRIVE$ = MID$(GetWindowsDir, 1, 1) sourceDir$ = GetSymbolValue("STF_SRCDIR") IF LEN(sourceDir$) > 3 THEN sourceDir$ = Mid$(sourceDir$,1,LEN(sourceDir$)-1) END IF ''GET CONFIG FILE INFO SPLITPATH szInf$,bDrive$,bDir$,bFile$,bExt$ cfgFile$ = MakePath(sourceDir$,bFile$+".BDF") IF DoesFileExist(cfgFile$,femExists) = 1 THEN IF GetIniKeyString(cfgFile$,"directories","TargetDir") <> "" THEN destDir$ = WINDRIVE$+":\"+GetIniKeyString(cfgFile$,"directories","TargetDir") ELSE destDir$ = "" END IF IF destDir$ <> "" THEN logFile$ = MakePath(destDir$, "LOGFILE.OUT") ELSE logFile$ = "" END IF prodName$ = GetIniKeyString(cfgFile$, "product", "ProductName") waveNeeded% = VAL(GetIniKeyString(cfgFile$,"general","wavedevice")) midiNeeded% = VAL(GetIniKeyString(cfgFile$,"general","mididevice")) qtwNeeded% = VAL(GetIniKeyString(cfgFile$,"quicktime","qtwRequired")) qtwVersion$ = GetIniKeyString(cfgFile$,"quicktime","qtwVersion") fontsToInstall% = VAL(GetIniKeyString(cfgFile$,"general","fontinstall")) wingNeeded% = VAL(GetIniKeyString(cfgFile$,"general","wing")) sucCom$ = GetIniKeyString(cfgFile$,"general","successcomment") ''cmdLine$ = GetIniKeyString(cfgFile$,"general","chaincommand") midiCmdLine$ = GetIniKeyString(cfgFile$,"general","chaincommand") ''temporary solution qtwCmdLine$ = GetIniKeyString(cfgFile$,"quicktime","qtwCmdLine") qtwSucComm$ = GetIniKeyString(cfgFile$,"quicktime","qtwsuccomm") ELSEIF build$ <> "" THEN cfgFile$ = destCfgFile$ destDir$ = GetIniKeyString(cfgFile$,"directories","MediaBuildDir") IF destDir$ = "" THEN destDir$ = WINDRIVE$+":\BRODINST" END IF IF destCfgFile$ <> "" THEN SPLITPATH cfgFile$,bDrive$,bDir$,bFile$,bExt$ logFile$ = bDrive$+bDir+"LOGFILE.OUT" ELSEIF IsDirWritable(sourceDir$) = 1 THEN logFile$ = MakePath(sourceDir$, "LOGFILE.OUT") ELSE logFile$ = "" END IF prodName$ = "Installer for "+GetIniKeyString(cfgFile$, "product", "ProductName") waveNeeded% = 0 midiNeeded% = 0 qtwNeeded% = 0 qtwVersion$ = "" fontsToInstall% = 0 wingNeeded% = 0 sucCom$ = "" cmdLine$ = "" midiCmdLine$ = "" qtwCmdLine$ = "" qtwSucComm$ = "" ELSE cfgFile$ = "" destDir$ = WINDRIVE$+":\BRODINST" prodName$ = "Unspecified Product" waveNeeded% = 0 midiNeeded% = 0 qtwNeeded% = 0 qtwVersion$ = "" fontsToInstall% = 0 wingNeeded% = 0 sucCom$ = "" cmdLine$ = "" midiCmdLine$ = "" qtwCmdLine$ = "" qtwSucComm$ = "" IF IsDirWritable(sourceDir$) = 1 THEN logFile$ = MakePath(sourceDir$, "LOGFILE.OUT") ELSE logFile$ = "" END IF END IF filesInstalled% = 0 waveCount% = 0 midiCount% = 0 fontsInstalled% = 0 fontInstallError% = 0 winIniBkpFile$ = "WIN.BAK" skip% = 0 prodNameID$ = LTRIM$(STR$(PRODUCTNAME)) AddListItem "VarStringID", prodNameID$ SetSymbolValue prodNameID$,prodName$ filePathID$ = LTRIM$(STR$(FILEPATH)) AddListItem "VarStringID", filePathID$ something% = SetParentWindow(HwndFrame()) SetBitmap CUIDLL$, LOGO SetTitle GetSymbolValue(prodNameID$) ExcessNeeded& = 0 ''CustInst list symbols FOR i% = 1 TO 7 STEP 1 AddListItem "DriveStatusText", "" NEXT i% IF destDir$ <> "" THEN ReplaceListItem "DriveStatusText", 7, destDir$ END IF ''Disk cost list symbols FOR i% = 1 TO 26 STEP 1 AddListItem "ExtraCosts", "0" NEXT i% IF build$ <> "" THEN srcDirStr$ = GetIniKeyString(cfgFile$, "build", "sourcedir") ELSE srcDirStr$ = GetIniKeyString(cfgFile$,"directories","sourcedir") END IF '$IFDEF DEBUG i% = SetSizeCheckMode(scmOnIgnore) '' could use scmOff; def = scmOnFatal IF IsDriveValid(WINDRIVE$) = 0 THEN i% = DoMsgBox("Windows drive ('"+WINDRIVE$+"') is not a valid drive.", "DEBUG", MB_TASKMODAL+MB_ICONHAND+MB_OK) GOTO QUIT END IF '$ENDIF ''DEBUG WELCOME: SetSymbolValue "CENTERWINDOW", "BOTH" SetSymbolValue "OFFSETVERTPERC", "-10" sz$ = UIStartDlg(CUIDLL$, WELCOME, "FInfoDlgProc", APPHELP, HELPPROC$) IF sz$ = "CONTINUE" THEN UIPop 1 ELSE GOSUB ASKQUIT GOTO WELCOME END IF WAVESELECT: IF waveNeeded% = 0 THEN GOTO WAVESELECTEND END IF waveCount% = GetDriverCount("wave") IF waveCount% > 0 THEN GOTO WAVESELECTEND END IF sz$ = UIStartDlg(CUIDLL$,NOWAVEWARN,"FInfoDlgProc",APPHELP,HELPPROC$) IF sz$ = "CONTINUE" THEN UIPop 1 AddListItem "IncompleteInstall", "Your system has no wave drivers installed." GOTO WAVESELECTEND ELSE GOSUB ASKQUIT GOTO WAVESELECT END IF WAVESELECTEND: MIDISELECT: IF midiNeeded% = 0 THEN GOTO MIDISELECTEND END IF midiCount% = GetDriverCount("midi") IF midiCount% > 0 THEN IF cmdLine$ <> "" THEN cmdLine$ = cmdLine$+";" cmdLine$ = cmdLine$+midiCmdLine$ ELSE cmdLine$ = midiCmdLine$ END IF GOTO MIDISELECTEND END IF sz$ = UIStartDlg(CUIDLL$,NOMIDIWARN,"FInfoDlgProc",APPHELP,HELPPROC$) IF sz$ = "CONTINUE" THEN UIPop 1 AddListItem "IncompleteInstall", "Your system has no MIDI drivers installed." '' cmdLine$ = "" GOTO MIDISELECTEND ELSE GOSUB ASKQUIT GOTO MIDISELECT END IF MIDISELECTEND: QTWSELECT: IF qtwNeeded% = 0 THEN GOTO QTWSELECTEND ENDIF verString$ = GetVersionOfFile(GetWindowsSysDir+"QTIM.DLL") IF verString$ < qtwVersion$ THEN IF GetWindowsMajorVersion() = 3 AND GetWindowsMinorVersion() < 20 THEN ELSE qtwCmdLine95$ = GetIniKeyString(cfgFile$,"quicktime","qtw95CmdLine") IF qtwCmdLine$ <> "" THEN qtwCmdLine$ = qtwCmdLine$+";"+qtwCmdLine95$ END IF END IF ELSE qtwCmdLine$ = "" GOTO QTWSELECTEND END IF IF cmdLine$ <> "" THEN cmdLine$ = cmdLine$+";" cmdLine$ = cmdLine$+qtwCmdLine$ ELSE cmdLine$ = qtwCmdLine$ END IF QTWSELECTEND: CUSTINST: IF destDir$ = "" THEN GOTO CUSTINSTEND END IF result% = SetDriveStatus(1) sz$ = UIStartDlg(CUIDLL$, CUSTINST, "FCustInstDlgProc", APPHELP, HELPPROC$) IF sz$ = "CONTINUE" THEN ''Install only if it will fit. IF ExcessNeeded& > 0 THEN GOSUB TOOBIG GOTO CUSTINST END IF UIPop 1 ELSEIF sz$ = "PATH" THEN GOTO GETPATH ELSEIF sz$ = "REACTIVATE" THEN GOTO CUSTINST ELSEIF sz$ = "EXIT" THEN GOSUB ASKQUIT GOTO CUSTINST ELSEIF sz$ = "BACK" THEN UIPop 1 GOTO WELCOME ELSE GOSUB ASKQUIT GOTO CUSTINST END IF result% = SetDriveStatus(0) IF result% = 1 THEN GOTO CUSTINST END IF CUSTINSTEND: IF fontsToInstall% = 0 THEN GOTO GETWINIBKUPEND END IF GETWINIBKUP: SetSymbolValue "EditTextIn", winIniBkpFile$ SetSymbolValue "EditFocus", "END" GETWINIBKUPL1: sz$ = UIStartDlg(CUIDLL$, WININIBACKUP, "FEditDlgProc", APPHELP, HELPPROC$) winIniBkpFile$ = GetWindowsDir()+GetSymbolValue("EditTextOut") IF sz$ = "CONTINUE" THEN UIPop 1 ELSEIF sz$ = "REACTIVATE" THEN GOTO GETWINIBKUPL1 ELSEIF sz$ = "BACK" THEN UIPop 1 GOTO CUSTINST ELSE GOSUB ASKQUIT GOTO GETWINIBKUP END IF CopyFile GetWindowsDir()+"WIN.INI", winIniBkpFile$, cmoOverwrite, 0 GETWINIBKUPEND: ''BEGIN INSTALLATION PROCESS listLen% = GetListLength("NEWDIRLIST") SetSymbolValue "BASE0$",destDir$ FOR i% = 1 TO listLen% STEP 1 theDir$ = InstantString(GetListItem("NEWDIRLIST",i%)) IF theDir$ <> "" THEN CreateDir theDir$, cmoVital ReplaceListItem "DIRLIST",i%,theDir$ END IF NEXT RemoveSymbol "BASE0$" IF logFile$ <> "" THEN IF build$ = "" THEN logFile$ = MakePath(destDir$, "LOGFILE.OUT") END IF OpenLogFile logFile$, 0 WriteToLogFile " Destination directory: '" + destDir$ + "'" END IF ''INSTALL FILES filesInstalled% = 1 CopyFilesInCopyList ClearCopyList IF build$ = "" THEN IF cfgFile$ <> "" AND destDir$ <> "" THEN ''COPY INSTALLER CONFIG FILE TO DEST DIR, AND UPDATE WITH RUNTIME INFO SPLITPATH szInf$,bDrive$,bDir$,bFile$,bExt$ destCfgFile$ = MakePath(destDir$,bFile$+".CFG") CopyFile cfgFile$, destCfgFile$, cmoOverwrite, 0 ''[directories] section contains directory listings with no trailing \ IF INSTR(LEN(sourceDir$),sourceDir$,"\") > 0 THEN tempString$ = MID$(sourceDir$,1,LEN(sourceDir$)-1) ELSE tempString$ = sourceDir$ END IF CreateIniKeyValue destCfgFile$,"directories","InstallFromDir",tempString$, cmoOverwrite IF INSTR(LEN(destDir$),destDir$,"\") > 0 THEN tempString$ = MID$(destDir$,1,LEN(destDir$)-1) ELSE tempString$ = destDir$ END IF CreateIniKeyValue destCfgFile$,"directories","InstallToDir",tempString$, cmoOverwrite ''[install] section contains directory listings with a trailing \ IF INSTR(LEN(sourceDir$),sourceDir$,"\") > 0 THEN tempString$ = sourceDir$ ELSE tempString$ = sourceDir$+"\" END IF CreateIniKeyValue destCfgFile$,"install","InstallFromDir",tempString$, cmoOverwrite IF INSTR(LEN(destDir$),destDir$,"\") > 0 THEN tempString$ = destDir$ ELSE tempString$ = destDir$+"\" END IF CreateIniKeyValue destCfgFile$,"install","InstallToDir",tempString$, cmoOverwrite CreateIniKeyValue destCfgFile$, "install","InstallFromDrive", MID$(sourceDir$,1,1), cmoOverwrite CreateIniKeyValue destCfgFile$, "install","InstallToDrive", MID$(destDir$,1,1), cmoOverwrite ELSE destCfgFile$ = "" END IF ELSEIF destCfgFile$ <> "" THEN CreateIniKeyValue destCfgFile$,"directories","MediaBuildDir",destDir$,cmoOverwrite END IF ''INSTALL FONTS - IF NECESSARY IF fontsToInstall% = 0 THEN GOTO FONTINSTALLEND END IF FONTINSTALL: fontInstallError% = InstallFonts(destDir$,destCfgFile$,winIniBkpFile$) IF fontInstallError% > 0 THEN sz$ = UIStartDlg(CUIDLL$, FONTERROR, "FQuitDlgProc", 0, "") IF sz$ = "EXIT" THEN UIPopAll ERROR STFQUIT ELSEIF sz$ = "REACTIVATE" THEN GOTO FONTINSTALL ELSE UIPop 1 END IF AddListItem "IncompleteInstall", "Fonts are not installed correctly for this product." END IF fontsInstalled% = 1 FONTINSTALLEND: ''INSTALL PROGRAM GROUP AND PROGRAM GROUP ITEMS IF build$ = "" THEN InstallPGI '' progGroup$ = GetIniKeyString(cfgFile$,"proggroup","groupname") '' CreateProgmanGroup progGroup$,"",cmoVital '' IF GetWindowsMajorVersion() = 3 AND GetWindowsMinorVersion() < 20 THEN '' anerror% = PGInstall(cfgFile$,1,1) '' ELSE '' anerror% = PGInstall(cfgFile$,1,6) '' END IF END IF IF INSTR(LEN(sourceDir$),sourceDir$,"\") > 0 THEN varTable$ = "INSTALLFROMDIR|"+MID$(sourceDir$,1,LEN(sourceDir$)-1) ELSE varTable$ = "INSTALLFROMDIR|"+sourceDir$ END IF IF destDir$ <> "" THEN IF INSTR(LEN(destDir$),destDir$,"\") > 0 THEN varTable$ = varTable$+"|INSTALLTODIR|"+MID$(destDir$,1,LEN(destDir$)-1) ELSE varTable$ = varTable$+"|INSTALLTODIR|"+destDir$ END IF END IF result% = CreateRegEntries(cfgFile$,MakePath(destDir$,"install.log"),varTable$,"|") ''DoRegistrations IF logFile$ <> "" THEN CloseLogFile END IF QUIT: ON ERROR GOTO ERRQUIT IF ERR = 0 THEN GOTO GOODQUIT ELSE GOTO BADQUIT ENDIF GOODQUIT: IF GetListLength("IncompleteInstall") THEN SetSymbolValue "ListItemsIn", "" FOR i% = 1 TO GetListLength("IncompleteInstall") STEP 1 AddListItem "ListItemsIn", GetListItem("IncompleteInstall",i%) NEXT INCOMPLETEQUITL1: sz$ = UIStartDlg(CUIDLL$,EXITINCOMPLETE,"FList0DlgProc",0,"") IF sz$ = "REACTIVATE" THEN GOTO INCOMPLETEQUITL1 END IF UIPop 1 GOTO ENDINSTALL ELSEIF cmdLine$ = "" THEN GOODQUITL0: sucComID$ = LTRIM$(STR$(SUCCESSCOMMENT)) AddListItem "VarStringID", sucComID$ IF sucCom$ = "" THEN sucCom$ = "Have Fun!" END IF SetSymbolValue sucComID$,sucCom$ sz$ = UIStartDlg(CUIDLL$,EXITSUCCESS,"FList0DlgProc",0,"") IF sz$ = "REACTIVATE" THEN GOTO GOODQUITL0 END IF UIPop 1 GOTO ENDINSTALL ELSEIF midiCmdLine$ <> "" THEN sucCom1$ = sucCom$ dlg% = EXITSUCCESS1 IF qtwCmdLine$ <> "" THEN sucCom2$ = qtwSucComm$ dlg% = EXITSUCCESS2 GOTO TWOCHAIN ELSE GOTO ONECHAIN END IF ELSEIF qtwCmdLine$ <> "" THEN sucCom1$ = qtwSucComm$ dlg% = EXITSUCCESS1 GOTO ONECHAIN ELSE GOTO GOODQUITL0 END IF TWOCHAIN: sucComID2$ = LTRIM$(STR$(SUCCESSCOMMENT2)) AddListItem "VarStringID", sucComID2$ SetSymbolValue sucComID2$,sucCom2$ ONECHAIN: sucComID1$ = LTRIM$(STR$(SUCCESSCOMMENT1)) AddListItem "VarStringID", sucComID1$ SetSymbolValue sucComID1$,sucCom1$ chainID$ = LTRIM$(STR$(CHAINTEXT)) AddListItem "VarStringID", chainID$ GOODQUITL1: IF canChain$ = "Y" THEN ''SET VARIABLES FOR COMMAND LINE ''SET COMMAND LINE ''SEND COMMAND LINE TO PARENT EXECUTABLE IF INSTR(LEN(destDir$),destDir$,"\") > 0 THEN tempString$ = MID$(destDir$,1,LEN(destDir$)-1) ELSE tempString$ = destDir$ END IF SetSymbolValue "INSTALLTODIR$",tempString$ IF INSTR(LEN(sourceDir$),sourceDir$,"\") > 0 THEN tempString$ = MID$(sourceDir$,1,LEN(sourceDir$)-1) ELSE tempString$ = sourceDir$ END IF SetSymbolValue "INSTALLFROMDIR$",tempString$ SetSymbolValue "WINDOWS$",MID$(GetWindowsDir(),1,LEN(GetWindowsDir())-1) SetSymbolValue "WINSYS$",MID$(GetWindowsSysDir(),1,LEN(GetWindowsSysDir())-1) anerror% = NotifyChain(chainWindow%,0,InstantString(cmdLine$)) chainTxt$ = "Press OK to continue" ELSE chainTxt$ = "Please refer to the documentation for instructions on how to do this." END IF SetSymbolValue chainID$,chainTxt$ sz$ = UIStartDlg(CUIDLL$,dlg%,"FList0DlgProc",0,"") IF sz$ = "REACTIVATE" THEN GOTO GOODQUITL1 END IF UIPop 1 ENDINSTALL: END BADQUIT: IF ERR = STFQUIT THEN dlg% = EXITQUIT ELSE dlg% = EXITFAILURE END IF DeinstFiles BADQUITL1: sz$ = UIStartDlg(CUIDLL$, dlg%, "FInfo0DlgProc", 0, "") IF sz$ = "REACTIVATE" THEN GOTO BADQUITL1 END IF UIPop 1 END ERRQUIT: DeinstFiles i% = DoMsgBox("Setup sources were corrupted, call 555-1212!", "Setup Message", MB_OK+MB_TASKMODAL+MB_ICONHAND) END TOOBIG: sz$ = UIStartDlg(CUIDLL$, TOOBIG, "FInfo0DlgProc", 0, "") IF sz$ = "REACTIVATE" THEN GOTO TOOBIG END IF UIPop 1 RETURN BADPATH: sz$ = UIStartDlg(CUIDLL$, BADPATH, "FInfo0DlgProc", 0, "") IF sz$ = "REACTIVATE" THEN GOTO BADPATH END IF UIPop 1 RETURN ASKQUIT: SetSymbolValue "OFFSETVERTPERC", "-20" SetSymbolValue "OFFSETHORZPERC", "10" sz$ = UIStartDlg(CUIDLL$, ASKQUIT, "FQuitDlgProc", 0, "") RemoveSymbol "OFFSETHORZPERC" SetSymbolValue "OFFSETVERTPERC", "-10" IF sz$ = "EXIT" THEN UIPopAll ERROR STFQUIT ELSEIF sz$ = "REACTIVATE" THEN GOTO ASKQUIT ELSE UIPop 1 END IF RETURN GETPATH: SetSymbolValue "EditTextIn", destDir$ SetSymbolValue "EditFocus", "END" GETPATHL1: sz$ = UIStartDlg(CUIDLL$, DESTPATH, "FEditDlgProc", APPHELP, HELPPROC$) IF sz$ = "CONTINUE" THEN olddest$ = destDir$ destDir$ = GetSymbolValue("EditTextOut") ''Validate new path. IF IsDirWritable(destDir$) = 0 THEN GOSUB BADPATH GOTO GETPATHL1 END IF UIPop 1 ''Truncate display if too long. IF LEN(destDir$) > 23 THEN ReplaceListItem "DriveStatusText", 7, MID$(destDir$, 1, 23)+"..." ELSE ReplaceListItem "DriveStatusText", 7, destDir$ END IF olddest$ = "" result% = SetDriveStatus(1) GOTO CUSTINST ELSEIF sz$ = "REACTIVATE" THEN GOTO GETPATHL1 ELSEIF sz$ = "EXIT" THEN GOSUB ASKQUIT GOTO GETPATHL1 ELSEIF sz$ = "BACK" THEN UIPop 1 GOTO CUSTINST ELSE UIPop 1 GOTO CUSTINST END IF '** '** Purpose: '** Appends a file name to the end of a directory path, '** inserting a backslash character as needed. '** Arguments: '** szDir$ - full directory path (with optional ending "\") '** szFile$ - filename to append to directory '** Returns: '** Resulting fully qualified path name. '************************************************************************* FUNCTION MakePath (szDir$, szFile$) STATIC AS STRING IF szDir$ = "" THEN MakePath = szFile$ ELSEIF szFile$ = "" THEN MakePath = szDir$ ELSEIF MID$(szDir$, LEN(szDir$), 1) = "\" THEN MakePath = szDir$ + szFile$ ELSE MakePath = szDir$ + "\" + szFile$ END IF END FUNCTION FUNCTION InstantString (varStr$) STATIC AS STRING newStr$ = "" strLen% = LEN(varStr$) IF strLen = 0 THEN GOTO INSTANTSTRINGEXIT END IF strHead% = 1 WHILE (strHead% > 0) dollarPos1% = INSTR(strHead%,varStr$,"$") IF dollarPos1% > 0 THEN newStr$ = newStr$+MID$(varStr$,strHead%,dollarPos1%-strHead%) dollarPos2% = INSTR(dollarPos1% + 1,varStr$,"$") IF dollarPos2% > 0 THEN var$ = MID$(varStr$,dollarPos1% + 1,dollarPos2% - dollarPos1%) strHead% = dollarPos2%+1 IF strHead% > LEN(varStr$) THEN strHead% = 0 END IF ELSE var$ = MID$(varStr$,dollarPos1% + 1) strHead% = 0 END IF newStr$ = newStr$+GetSymbolValue(UCASE$(var$)) ELSE newStr$ = newStr$+MID$(varStr$,strHead%) strHead% = 0 END IF WEND INSTANTSTRINGEXIT: InstantString = newStr$ END FUNCTION FUNCTION AddDirToCopyList(theFile$,dir$,srcDir$,dstDir$,silent%) STATIC AS INTEGER result% = 0 IF srcDir$ = "" THEN GOTO ADDDIRTOCOPYLISTEXIT END IF IF dstDir$ = "" THEN GOTO ADDDIRTOCOPYLISTEXIT END IF baseSym$ = MID$(dir$,2,6) SetSymbolValue baseSym$,srcDir$ newSrcDir$ = InstantString(dir$) SetSymbolValue baseSym$,dstDir$ newDstDir$ = InstantString(dir$) IF dir$ = "$BASE0$" THEN '' IF MID$(dir$,1,1) = "$" AND LEN(dir$) = 7 THEN RemoveSymbol "DIRLIST" RemoveSymbol "NEWDIRLIST" END IF IF DoesDirExist(newDstDir$) = 0 THEN AddListItem "DIRLIST","" AddListItem "NEWDIRLIST",dir$ ELSE AddListItem "DIRLIST",dir$ AddListItem "NEWDIRLIST","" END IF IF DoesIniSectionExist(theFile$,dir$) = 1 THEN IF silent% = 0 THEN i% = 0 key$ = "f"+RTRIM$(LTRIM$(STR$(i%))) curFile$ = GetIniKeyString(theFile$,dir$,""""+key$+"""") curFile$ = GetNthFieldFromIniString(curFile$,2) halt% = 0 SetSymbolValue "CENTERWINDOW", "BOTH" WHILE curFile$ <> "" AND halt% = 0 fileExists% = DoesFileExist(newDstDir$+"\"+curFile$,femExists) IF fileExists% = 1 AND replaceAll% = 0 THEN SetSymbolValue filePathID$,newDstDir$+"\"+curFile$ sz$ = UIStartDlg(CUIDLL$, DUPFILE, "FInfoDlgProc", 0, "") IF sz$ = "CONTINUE" THEN ''this translates to "replace" AddSectionKeyFileToCopyList dir$,key$,newSrcDir$,newDstDir$ ELSEIF sz$ = "EXIT" THEN ''this translates to "replace ALL" AddSectionKeyFileToCopyList dir$,key$,newSrcDir$,newDstDir$ replaceAll% = 1 ELSEIF sz$ = "CANCEL" THEN ''this translates to "stop" halt% = 1 result% = 1 UIPop 1 GOTO ADDDIRTOCOPYLISTEXIT END IF UIPop 1 ELSE AddSectionKeyFileToCopyList dir$,key$,newSrcDir$,newDstDir$ END IF i% = i% + 1 key$ = "f"+RTRIM$(LTRIM$(STR$(i%))) curFile$ = GetIniKeyString(theFile$,dir$,""""+key$+"""") curFile$ = GetNthFieldFromIniString(curFile$,2) WEND ELSE AddSectionFilesToCopyList dir$,newSrcDir$,newDstDir$ END IF END IF IF DoesIniSectionExist(theFile$,dir$+"\") = 1 THEN subDirStr$ = GetIniKeyString(theFile$,dir$+"\","""subdirs""") i% = 1 subDir$ = GetNthFieldFromIniString(subDirStr$,i%) WHILE subDir$ <> "" subDir$ = dir$+"\"+subDir$ result% = AddDirToCopyList(theFile$,subDir$,srcDir$,dstDir$,silent%) IF result% = 1 THEN GOTO ADDDIRTOCOPYLISTEXIT END IF i% = i% + 1 subDir$ = GetNthFieldFromIniString(subDirStr$,i%) WEND END IF ADDDIRTOCOPYLISTEXIT: AddDirToCopyList = result% END FUNCTION FUNCTION SetDriveStatus(silent%) STATIC AS INTEGER ''Drive Status Text fields: '' 1: installation drive '' 2: install drive space required '' 3: install drive space available '' 4: Windows drive '' 5: Windows drive space required '' 6: Windows drive space available '' 7: Installation path result% = 0 ''CALCULATE COSTS ClearCopyList replaceAll% = 0 result% = AddDirToCopyList (szInf$,"$BASE0$",sourceDir$,destDir$,silent%) IF result% = 1 THEN ClearCopyList GOTO SETDRIVESTATUSEXIT END IF ''ADD FILES DESTINED FOR THE WINDOWS DIRECTORY ''SPECIAL NOTE: THIS CRAPPY MSSETUP CAN'T DEAL WITH THE PATH WINDOWS\SYSTEM, ''SO FILES DESTINED FOR THE WINDOWS\SYSTEM DIRECTORY SHOULD BE INCLUDED HERE IF wingNeeded% = 1 THEN IF GetWindowsMajorVersion() = 3 AND GetWindowsMinorVersion() < 20 THEN AddSectionFilesToCopyList "$WINDOWS$",sourceDir$,GetWindowsDir() END IF END IF i% = 0 tmpSrcDirStr$ = srcDirStr$ WHILE tmpSrcDirStr$ <> "" temp% = INSTR(tmpSrcDirStr$,",") IF temp% > 0 THEN curSrcDir$ = MID$(tmpSrcDirStr$,1,temp%-1) tmpSrcDirStr$ = MID$(tmpSrcDirStr$,temp%+1) ELSE curSrcDir$ = MID$(tmpSrcDirStr$,1) tmpSrcDirStr$ = "" END IF i% = i% + 1 baseStr$ = "$BASE"+RTRIM$(LTRIM$(STR$(i%)))+"$" result% = AddDirToCopyList (szInf$,baseStr$,curSrcDir$,destDir$,silent%) IF result% = 1 THEN ClearCopyList GOTO SETDRIVESTATUSEXIT END IF WEND ndrive% = ASC(ucase$(WINDRIVE$)) - ASC("A") + 1 '' ReplaceListItem "ExtraCosts", ndrive%, "10240" ReplaceListItem "ExtraCosts", ndrive%, RTRIM$(LTRIM$(STR$(GetNetPGSize(cfgFile$)))) ExcessNeeded& = GetCopyListCost("ExtraCosts", "AppNeeds", "") drive$ = MID$(destDir$, 1, 1) ndrive% = ASC(ucase$(drive$)) - ASC("A") + 1 cost& = VAL(GetListItem("AppNeeds", ndrive%)) IF cost& < 0 THEN cost& = 0 END IF free& = GetFreeSpaceForDrive(drive$) IF free& < 0 THEN free& = 0 END IF ReplaceListItem "DriveStatusText", 1, drive$ + ":" ReplaceListItem "DriveStatusText", 2, STR$(cost& / 1024) + " K" ReplaceListItem "DriveStatusText", 3, STR$(free& / 1024) + " K" IF drive$ <> WINDRIVE$ THEN ndrive% = ASC(ucase$(WINDRIVE$)) - ASC("A") + 1 cost& = VAL(GetListItem("AppNeeds", ndrive%)) IF cost& < 0 THEN cost& = 0 END IF ELSE cost& = 0 END IF IF cost& <> 0 THEN free& = GetFreeSpaceForDrive(WINDRIVE$) ReplaceListItem "DriveStatusText", 4, WINDRIVE$ + ":" ReplaceListItem "DriveStatusText", 5, STR$(cost& / 1024) + " K" ReplaceListItem "DriveStatusText", 6, STR$(free& / 1024) + " K" ELSE ReplaceListItem "DriveStatusText", 4, "" ReplaceListItem "DriveStatusText", 5, "" ReplaceListItem "DriveStatusText", 6, "" END IF SETDRIVESTATUSEXIT: SetDriveStatus = result% END FUNCTION SUB DeinstFiles STATIC listLen% = GetListLength("DIRLIST") IF listLen% = 0 THEN GOTO DEINSTFILESEXIT END IF clearDirList% = 1 clearNewDirList% = 1 SetSymbolValue "BASE0$",destDir$ FOR i% = listLen% TO 1 STEP -1 theDir$ = GetListItem("DIRLIST",i%) IF theDir$ <> "" THEN theNewDir$ = GetListItem("NEWDIRLIST",i%) IF theNewDir$ <> "" THEN result% = DeleteDirectory(theDir$,1) IF result% = 1 THEN clearNewDirList% = 0 ELSE ReplaceListItem "DIRLIST",i%,"" END IF ELSE clearDirList% = 0 IF filesInstalled% = 1 THEN junk% = DeinstallFiles(InstantString(theDir$),szInf$,theDir$,0) END IF END IF END IF NEXT RemoveSymbol "BASE0$" IF clearNewDirList% = 1 THEN RemoveSymbol "NEWDIRLIST" IF clearDirList% = 1 THEN RemoveSymbol "DIRLIST" END IF END IF filesInstalled% = 0 DEINSTFILESEXIT: END SUB FUNCTION ParseCommand (commFlag$) STATIC AS STRING ParseCommand = "" a% = INSTR(COMMAND$,"/"+commFlag$) IF a% = 0 THEN GOTO PARSECOMMANDEXIT END IF b% = INSTR(a%+1,COMMAND$,"/") IF b% > 0 THEN temp$ = MID$(COMMAND$,a%,b%-a%) C$ = MID$(COMMAND$,b%) ELSE temp$ = MID$(COMMAND$,a%) C$ = "" END IF IF a% > 1 THEN D$ = MID$(COMMAND$,1,a%-1) ELSE D$ = "" END IF COMMAND$ = D$+C$ ParseCommand = RTRIM$(LTRIM$(MID$(temp$,3))) PARSECOMMANDEXIT: END FUNCTION SUB DoRegistrations STATIC MakeListFromSectionKeys "REGLIST","REGEDIT" listLen% = GetListLength("REGLIST") IF listLen% = 0 THEN GOTO DOREGISTRATIONSEXIT END IF FOR i%=1 TO listLen% STEP 1 key$ = GetListItem("REGLIST",i%) keyValue$ = GetIniKeyString(szInf$,"REGEDIT",""""+key$+"""") IF INSTR(LEN(sourceDir$),destDir$,"\") > 0 THEN tempString$ = MID$(destDir$,1,LEN(destDir$)-1) ELSE tempString$ = destDir$ END IF SetSymbolValue "INSTALLTODIR$",tempString$ IF INSTR(LEN(sourceDir$),sourceDir$,"\") > 0 THEN tempString$ = MID$(sourceDir$,1,LEN(sourceDir$)-1) ELSE tempString$ = sourceDir$ END IF SetSymbolValue "INSTALLFROMDIR$",tempString$ SetSymbolValue "WINDOWS$",MID$(GetWindowsDir(),1,LEN(GetWindowsDir())-1) SetSymbolValue "WINSYS$",MID$(GetWindowsSysDir(),1,LEN(GetWindowsSysDir())-1) CreateRegKey key$ CreateRegKeyValue key$,InstantString(keyValue$) NEXT DOREGISTRATIONSEXIT: END SUB SUB InstallPGI STATIC progGroup$ = GetIniKeyString(cfgFile$,"proggroup","groupname") CreateProgmanGroup progGroup$,"",cmoVital IF GetWindowsMajorVersion() = 3 AND GetWindowsMinorVersion() < 20 THEN ShowProgmanGroup progGroup$, 1, cmoVital ELSE ShowProgmanGroup progGroup$, 6, cmoVital END IF pgiCountStr$ = GetIniKeyString(cfgFile$,"proggroup","pgicount") pgiCount% = VAL(pgiCountStr$) verNumber% = GetWinVerString() IF verNumber% = 0 THEN verString$ = "WinNT" ELSEIF verNumber% = 31 THEN verString$ = "Win31" ELSEIF verNumber% = 95 THEN verString$ = "Win95" ELSE verString$ = "" END IF FOR i%=1 TO pgiCount% STEP 1 pgiSection$ = "pgi"+LTRIM$(STR$(i%))+verString$ pgiCaption$ = GetIniKeyString(cfgFile$,pgiSection$,"pgicaption") pgiCmd$ = GetIniKeyString(cfgFile$,pgiSection$,"pgicmd") setupStart% = INSTR(sourceDir$,"\SETUP") installerDir$ = MID$(sourceDir$,1,setupStart%-1) SetSymbolValue "INSTALLFROMDIR$",installerDir$ pgiCmd$ = InstantString(pgiCmd$) CreateProgmanItem progGroup$, pgiCaption$, pgiCmd$, "", cmoOverwrite pgiCount% = pgiCount% - 1 NEXT INSTALLPGIEXIT: END SUB