home *** CD-ROM | disk | FTP | other *** search
/ CD Mania - The Perfect Multimedia Fun Pak! / cdmania.iso / wfsound.mst < prev   
Encoding:
Text File  |  1997-07-09  |  20.9 KB  |  855 lines

  1. '**************************************************************************
  2. '*                          CD Mania Install Script
  3. '*     version 1.3 CD   by Aaron Wallace  (c)1990-1997 PCSoftInc  
  4. '**************************************************************************
  5.  
  6. '' Define DEBUG for script debugging
  7.  
  8. '$INCLUDE 'setupapi.inc'
  9. '$INCLUDE 'msdetect.inc'
  10.  
  11. ''Dialog ID's
  12. CONST WELCOME      = 100
  13. CONST ASKQUIT      = 200
  14. CONST DESTPATH     = 300
  15. CONST EXITFAILURE  = 400
  16. CONST EXITQUIT     = 600
  17. CONST EXITSUCCESS  = 700
  18. CONST WHICHINST    = 800
  19. CONST APPHELP      = 900
  20. CONST WHICHINSTHLP = 910
  21. CONST SETOWNER       = 1000
  22. CONST TESTSOUND    = 1100
  23. CONST INSTALLDRV   = 1200
  24. CONST SOUNDPLAYED  = 1300
  25. CONST WAITDLG       = 1400
  26. CONST EXITREBOOT   = 1500
  27. CONST WHICHVOICE   = 1600
  28. CONST BBD1       = 5000
  29. CONST BBD2       = 5010
  30. CONST BBD3       = 5020
  31. CONST BBD4       = 5030
  32. CONST BBD5       = 5040
  33. CONST BBD6       = 5050
  34. CONST SOUNDSDLG    = 5200
  35. CONST TAPPSDLG     = 5300
  36. CONST VOICESDLG    = 5400
  37. CONST CUSTINST     = 6200
  38. CONST TOOBIG       = 6300
  39. CONST BADPATH      = 6400
  40.  
  41. '' For message boxes
  42. CONST MB_YESNO=4
  43. CONST MB_RETRYCANCEL=5
  44. CONST IDNO=7
  45. CONST IDYES=6
  46. CONST IDRETRY=4
  47. CONST IDCANCEL=2
  48.  
  49. ''Bitmap ID
  50. CONST LOGO         = 1
  51.  
  52. ''File Types
  53. CONST BASEFILES     = 1
  54. CONST TAPPFILES     = 2
  55. CONST SOUNDFILES    = 3
  56. CONST VOICEFILES    = 4
  57. CONST MAX_TYPES     = 4
  58.  
  59. ''Install directories, etc.
  60. GLOBAL DEST$        ''Default destination directory.
  61. GLOBAL WINDRIVE$    ''Windows drive letter.
  62. GLOBAL CUIDLL$        ''CUI DLL
  63. GLOBAL WINDIR$        ''Windows directory
  64. GLOBAL SYSDIR$        ''System directory
  65. GLOBAL WININI$        ''"win.ini"
  66. GLOBAL SYSINI$        ''GetWindowsDir() + "system.ini"
  67.  
  68. '' User info
  69. GLOBAL OWNER$        '' Product registered owner
  70. GLOBAL WORKPLACE$   '' Company or such
  71.  
  72. ''Install item lists
  73. GLOBAL BASE$        ''List of base files
  74. GLOBAL TAPPS$       ''List of all talking apps
  75. GLOBAL SOUNDS$      ''List of all sounds.
  76. GLOBAL VOICES$      ''List of available voices
  77.  
  78. GLOBAL BASEINST$    ''List of base files to install
  79. GLOBAL TAPPSINST$   ''List of Talking Apps to install
  80. GLOBAL SOUNDSINST$  ''List of sounds to install
  81. GLOBAL VOICESINST$  ''List of voices to install
  82.  
  83. ''Custom Install list symbol names
  84. GLOBAL BASENEEDS$   ''Option list costs per drive
  85. GLOBAL TAPPNEEDS$
  86. GLOBAL SOUNDNEEDS$
  87. GLOBAL VOICENEEDS$
  88. GLOBAL EXTRACOSTS$  ''List of extra costs to add per drive
  89.  
  90. ''Custom Install dialog list symbol names
  91. GLOBAL CHECKSTATES$ ''List of check box values
  92. GLOBAL STATUSTEXT$  ''List of values to initialize status items
  93. GLOBAL DRIVETEXT$   ''Drive space info, etc.
  94.  
  95. '' Install DSOUND
  96. GLOBAL INSTDSOUND%
  97.  
  98. '' Customize product
  99. GLOBAL CUSTOMIZE%
  100.  
  101. '' Test sound hardware
  102. GLOBAL DOTEST%
  103.  
  104. GLOBAL WFSFOUND%
  105. GLOBAL CUSTINSTALL%
  106.  
  107. '' Which type of install to perform, by default
  108. GLOBAL DEFINSTOPT$
  109.  
  110. ''Progman titles
  111. GLOBAL WFSAPP$        ''Name of WFS app
  112.  
  113. ''Win.ini [PCSoftInc ] install code
  114. GLOBAL INSTDIR$
  115.  
  116. ''Space requirements
  117. GLOBAL FITS%        '' > 0 if everything fits
  118.  
  119. DECLARE SUB RecalcOptFiles (ftype%)
  120. DECLARE FUNCTION MakePath (szDir$, szFile$) AS STRING
  121. DECLARE FUNCTION GetWindowsVersionCorrectly& ()
  122. DECLARE FUNCTION MakeVer& (x as integer, y as integer)
  123. DECLARE FUNCTION StringInList (s$, y$) AS INTEGER
  124.  
  125. DECLARE FUNCTION sndPlaySound LIB "MMSYSTEM.DLL" (f$, fl%) AS INTEGER
  126. DECLARE FUNCTION GetModuleHandle LIB "KERNEL" (f$) AS INTEGER
  127.  
  128. DECLARE SUB Ctl3dRegister LIB "WFSUI.DLL" (f%)
  129. DECLARE SUB Ctl3dAutoSubclass LIB "WFSUI.DLL" (f%)
  130. DECLARE SUB Ctl3dUnregister LIB "WFSUI.DLL" (f%)
  131.  
  132. DECLARE SUB RemoveSectionFiles (dest$, sect$)
  133. DECLARE SUB RemDirectory (d$)
  134. DECLARE FUNCTION HasSoundDriver() AS INTEGER
  135. DECLARE SUB SendProgmanCommand LIB "CUI.DLL" (s$)
  136. DECLARE SUB KillFiles LIB "CUI.DLL" (s$)
  137.  
  138. '' These are defined in wfs.inc (product-specific)
  139. DECLARE SUB SetProductTitles
  140. DECLARE FUNCTION InfFile() AS STRING
  141. DECLARE FUNCTION MakeInstDir(D$) AS STRING
  142. DECLARE SUB AddInfSectionNames (BASE$, TAPPS$, SOUNDS$, VOICES$, BASEINST$, TAPPSINST$, SOUNDSINST$, VOICESINST$)
  143. DECLARE SUB RecalcPath
  144. DECLARE SUB AddOptFilesToCopyList (ftype%)
  145. DECLARE SUB SetDriveStatus
  146. DECLARE SUB AddOptFiles
  147. DECLARE SUB ConfigureApps
  148. DECLARE SUB AddBillboards
  149. DECLARE SUB DoUninstall
  150.  
  151.  
  152. '' This is where it all begins!
  153.  
  154. INIT:
  155.  
  156.     CUIDLL$ = "cui.dll"
  157.     DEFINSTOPT$ = "1"
  158.     INSTDSOUND% = 0
  159.     CUSTOMIZE% = -1
  160.     DOTEST% = -1
  161.  
  162.     SetProductTitles
  163.  
  164.     HELPPROC$ = "FHelpDlgProc"        ''Help dialog procedure
  165.  
  166.     SetBitmap CUIDLL$, LOGO
  167.  
  168.  
  169. '' We don't do Windows 3.0...
  170.  
  171.     If GetWindowsVersionCorrectly() < MakeVer(3, 10) Then
  172.     i% = DoMsgBox("This product requires Windows version 3.10 or greater", WFSAPP$, MB_OK)
  173.     GOTO DONEFINIFIN
  174.     End If
  175.  
  176. '' We don't want these DLLs to be loaded quite yet...
  177. LookAround:
  178.     IF GetModuleHandle("SNDAPI") OR GetModuleHandle("WFSABOUT") THEN
  179.     i% = DoMsgBox("Please quit all other PCSoftInc  products before continuing with Setup.", WFSAPP$, MB_RETRYCANCEL)
  180.     IF i% = IDRETRY THEN
  181.         GOTO LookAround
  182.     ELSEIF i% = IDCANCEL THEN
  183.         GOTO DONEFINIFIN
  184.     END IF
  185.     END IF
  186.  
  187.     HCUI% = GetModuleHandle("CUI")
  188.     Ctl3dRegister(HCUI%)
  189.     Ctl3dAutoSubclass(HCUI%)
  190.  
  191. ''Find location of INF file and create a default dest. dir
  192.     szInf$ = GetSymbolValue("STF_SRCINFPATH")
  193.     IF szInf$ = "" THEN
  194.     szInf$ = GetSymbolValue("STF_CWDDIR") + InfFile()
  195.     END IF
  196.  
  197.     '' Load the INF file
  198.     ReadInfFile szInf$
  199.  
  200.     '' Construct default strings
  201.     WINDIR$ = GetWindowsDir()
  202.     SYSDIR$ = GetWindowsSysDir()
  203.     WININI$ = "win.ini"
  204.     SYSINI$ = MakePath(WINDIR$, "system.ini")
  205.  
  206.     '' Construct the default install path
  207.     WINDRIVE$ = MID$(WINDIR$, 1, 1)
  208.     DEST$ = MakeInstDir(WINDRIVE$)
  209.  
  210.     '' Setup install symbols
  211.     BASE$ = "Base Files"
  212.     TAPPS$ = "Talking Apps"
  213.     SOUNDS$ = "Sounds"
  214.     VOICES$ = "Voices"
  215.     BASEINST$ = "Base Files Inst"
  216.     TAPPSINST$ = "Talking Apps Inst"
  217.     SOUNDSINST$ = "Sounds Inst"
  218.     VOICESINST$ = "Voices Inst"
  219.  
  220.     SetSymbolValue BASE$, ""
  221.     SetSymbolValue TAPPS$, ""
  222.     SetSymbolValue SOUNDS$, ""
  223.     SetSymbolValue VOICES$, ""
  224.  
  225.     ''Set up symbols for the initial install dialog
  226.     RADIODEFAULT$ = "Radio Default"
  227.  
  228.     ''Set up symbols for the custom install dialog
  229.     CHECKSTATES$ = "CheckItemsState"
  230.     STATUSTEXT$  = "StatusItemsText"
  231.     DRIVETEXT$   = "DriveStatusText"
  232.     FOR i% = 1 TO 4 STEP 1
  233.     AddListItem CHECKSTATES$, "ON"
  234.     NEXT i%
  235.     FOR i% = 1 TO 4 STEP 1
  236.     AddListItem STATUSTEXT$, ""
  237.     NEXT i%
  238.     FOR i% = 1 TO 7 STEP 1
  239.     AddListItem DRIVETEXT$, ""
  240.     NEXT i%
  241.     ReplaceListItem DRIVETEXT$, 7, DEST$
  242.  
  243.     ''Disk cost list symbols
  244.     BASENEEDS$   = "BaseNeeds"
  245.     TAPPNEEDS$   = "TAppNeeds"
  246.     SOUNDNEEDS$  = "SoundNeeds"
  247.     VOICENEEDS$  = "VoiceNeeds"
  248.     EXTRACOSTS$  = "ExtraCosts"
  249.     FOR i% = 1 TO 26 STEP 1
  250.     AddListItem EXTRACOSTS$, "0"
  251.     NEXT i%
  252.  
  253.     ''Configure lists of installable files
  254.     AddInfSectionNames BASE$, TAPPS$, SOUNDS$, VOICES$, BASEINST$, TAPPSINST$, SOUNDSINST$, VOICESINST$
  255.  
  256. '$IFDEF DEBUG
  257.     i% = SetSizeCheckMode(scmOnIgnore)    '' could use scmOff; def = scmOnFatal
  258. '$ENDIF ''DEBUG
  259.  
  260.  
  261. '' Ask which voice to use
  262. '' See if users want an easy install, custom install, or no install...
  263. WHICHVOICE:
  264.     SetSymbolValue "RadioDefault", "1"
  265.  
  266.     sz$ = UIStartDlg(CUIDLL$, WHICHVOICE, "FRadioDlgProc", WHICHINSTHLP, HELPPROC$)
  267.     
  268.     ''sz$ is the button the user pressed; RADIODEFAULT$ is the option selected
  269.  
  270.     IF sz$ = "EXIT" THEN
  271.     GOSUB ASKQUIT
  272.     GOTO WHICHVOICE
  273.     ELSEIF sz$ = "CONTINUE" THEN
  274.     sz$ = GetSymbolValue("ButtonChecked")
  275.     IF sz$ = "1" THEN
  276.         UIPop 1
  277.         INSTSNDDIR$ = MakePath(GetSymbolValue("STF_SRCDIR"), "sounds\install\simmons")
  278.         GOTO WELCOME
  279.     ELSEIF sz$ = "2" THEN
  280.         UIPop 1
  281.         INSTSNDDIR$ = MakePath(GetSymbolValue("STF_SRCDIR"), "sounds\install\sultry")
  282.         GOTO WELCOME
  283.     ELSEIF sz$ = "3" THEN
  284.         UIPop 1
  285.         INSTSNDDIR$ = MakePath(GetSymbolValue("STF_SRCDIR"), "sounds\install\harold")
  286.         GOTO WELCOME
  287.     END IF
  288.     END IF
  289.     GOTO WHICHVOICE
  290.  
  291.  
  292. '' Display Welcome dialog
  293. WELCOME:
  294.     res% = sndPlaySound(MakePath(INSTSNDDIR$, "opening.wav"), 3)
  295.  
  296.     sz$ = UIStartDlg(CUIDLL$, WELCOME, "FInfoDlgProc", APPHELP, HELPPROC$)
  297.     
  298.     IF sz$ = "EXIT" THEN
  299.     GOSUB ASKQUIT
  300.     GOTO WELCOME
  301.     ELSEIF sz$ = "CONTINUE" THEN
  302.     UIPop 1
  303.     GOTO WHICHINST
  304.     END IF
  305.     GOTO WELCOME
  306.  
  307.  
  308. '' See if users want an easy install, custom install, or no install...
  309. WHICHINST:
  310.     SetSymbolValue "RadioDefault", DEFINSTOPT$
  311.  
  312.     res% = sndPlaySound(MakePath(INSTSNDDIR$, "install.wav"), 3)
  313.  
  314.     sz$ = UIStartDlg(CUIDLL$, WHICHINST, "FRadioDlgProc", WHICHINSTHLP, HELPPROC$)
  315.     
  316.     ''sz$ is the button the user pressed; RADIODEFAULT$ is the option selected
  317.  
  318.     IF sz$ = "EXIT" THEN
  319.     GOSUB ASKQUIT
  320.     GOTO WHICHINST
  321.     ELSEIF sz$ = "CONTINUE" THEN
  322.     sz$ = GetSymbolValue("ButtonChecked")
  323.     res% = sndPlaySound(MakePath(INSTSNDDIR$, "instcont.wav"), 2)
  324.     IF sz$ = "1" THEN
  325.         UIPop 1
  326.         CUSTINSTALL% = 0
  327.         GOTO CUSTOMIZE
  328.     ELSEIF sz$ = "2" THEN
  329.         UIPop 1
  330.         CUSTINSTALL% = -1
  331.         GOTO CUSTOMIZE
  332.     ELSEIF sz$ = "3" THEN
  333.         DoUninstall
  334.         GOTO WHICHINST
  335.     END IF
  336.     END IF
  337.     GOTO WHICHINST
  338.  
  339.  
  340. '' Customize the copy of the product
  341. CUSTOMIZE:
  342.     IF NOT CUSTOMIZE% THEN
  343.     GOTO SOUNDTEST
  344.     END IF
  345.  
  346.     res% = sndPlaySound(MakePath(INSTSNDDIR$, "customiz.wav"), 3)
  347.  
  348.     sz$ = UIStartDlg(CUIDLL$, SETOWNER, "FNameOrgDlgProc", WHICHINSTHLP, HELPPROC$)
  349.  
  350.     IF sz$ = "EXIT" THEN
  351.     GOSUB ASKQUIT
  352.     GOTO CUSTOMIZE
  353.     ELSEIF sz$ = "CONTINUE" THEN
  354.     OWNER$ = GetSymbolValue("NameOut")
  355.     WORKPLACE$ = GetSymbolValue("OrgOut")
  356.     UIPop 1
  357.     GOTO SOUNDTEST
  358.     ELSEIF sz$ = "BACK" THEN
  359.     UIPop 1
  360.     GOTO WHICHINST
  361.     END IF
  362.     GOTO CUSTOMIZE
  363.  
  364.  
  365. '' Test the sound system
  366. SOUNDTEST:
  367.     IF NOT DOTEST% THEN
  368.     GOTO DOINST
  369.     END IF
  370.  
  371.     sz$ = UIStartDlg(CUIDLL$, TESTSOUND, "FInfoDlgProc", WHICHINSTHLP, HELPPROC$)
  372.  
  373.     IF sz$ = "EXIT" THEN
  374.     GOSUB ASKQUIT
  375.     GOTO SOUNDTEST
  376.     ELSEIF sz$ = "CONTINUE" THEN
  377.     UIPop 1
  378.     IF HasSoundDriver() THEN
  379.         GOTO DOINST
  380.     ELSE
  381.         GOTO INSTDSOUND
  382.     END IF
  383.     ELSEIF sz$ = "BACK" THEN
  384.     UIPop 1
  385.     GOTO CUSTOMIZE
  386.     ELSEIF sz$ = "TEST" THEN
  387.     w$ = MakePath(INSTSNDDIR$, "test.wav")
  388.     res% = sndPlaySound(w$, 2)
  389.     UIPop 1
  390.     GOTO DIDPLAY
  391.     END IF
  392.     GOTO SOUNDTEST
  393.  
  394.  
  395. '' Did the sound play?
  396. DIDPLAY:
  397.     sz$ = UIStartDlg(CUIDLL$, SOUNDPLAYED, "FInfoDlgProc", WHICHINSTHLP, HELPPROC$)
  398.  
  399.     IF sz$ = "EXIT" THEN
  400.     GOSUB ASKQUIT
  401.     GOTO DIDPLAY
  402.     ELSEIF sz$ = "YES" THEN
  403.     UIPop 1
  404.     GOTO DOINST
  405.     ELSEIF sz$ = "NO" THEN
  406.     UIPop 1
  407.     GOTO INSTDSOUND
  408.     ELSEIF sz$ = "BACK" THEN
  409.     UIPop 1
  410.     GOTO SOUNDTEST
  411.     END IF
  412.     GOTO DIDPLAY
  413.  
  414.  
  415. '' Install DSOUND
  416. INSTDSOUND:
  417.     sz$ = UIStartDlg(CUIDLL$, INSTALLDRV, "FInfoDlgProc", WHICHINSTHLP, HELPPROC$)
  418.  
  419.     IF sz$ = "EXIT" THEN
  420.     GOSUB ASKQUIT
  421.     GOTO INSTDSOUND
  422.     ELSEIF sz$ = "INSTALL" THEN
  423.     UIPop 1
  424.     INSTDSOUND% = -1
  425.     GOTO DOINST
  426.     ELSEIF sz$ = "CONTINUE" THEN
  427.     UIPop 1
  428.     GOTO DOINST
  429.     ELSEIF sz$ = "BACK" THEN
  430.     UIPop 1
  431.     GOTO DIDPLAY
  432.     END IF
  433.     GOTO INSTDSOUND
  434.  
  435.  
  436. '' Do the appropriate type of install
  437. DOINST:
  438.     IF CUSTINSTALL% THEN
  439.     GOTO CUSTINST
  440.     END IF
  441.     '' else fall-thru
  442.  
  443. ''Perform a default installation (of all files and options)
  444. DEFINST:
  445.     RecalcPath
  446.     SetDriveStatus
  447.  
  448. GETDEFINSTPATH:
  449.     GOSUB GETPATH
  450.  
  451.     IF sz$ = "CONTINUE" THEN
  452.     ''Install only if it will fit.
  453.     IF FITS% > 0 THEN
  454.         GOSUB TOOBIG
  455.         GOTO GETDEFINSTPATH
  456.     END IF
  457.     UIPop 1
  458.     GOTO INSTALL
  459.     ELSEIF sz$ = "BACK" THEN
  460.     GOTO WHICHINST
  461.     END IF
  462.     GOTO GETDEFINSTPATH
  463.  
  464.  
  465. ''Perform a custom installation (let user choose files, etc)
  466. CUSTINST:
  467.     RecalcPath
  468.     SetDriveStatus
  469.  
  470.     res% = sndPlaySound(MakePath(INSTSNDDIR$, "custinst.wav"), 3)
  471.  
  472. CUSTINSTDLG:
  473.     sz$ = UIStartDlg(CUIDLL$, CUSTINST, "FCustInstDlgProc", APPHELP, HELPPROC$)
  474.  
  475.     IF sz$ = "CONTINUE" THEN
  476.     ''Install only if it will fit.
  477.     IF FITS% > 0 THEN
  478.         GOSUB TOOBIG
  479.         GOTO CUSTINSTDLG
  480.     END IF
  481.     UIPop 1
  482.     GOTO INSTALL
  483.     ELSEIF sz$ = "PATH" THEN
  484.     res% = sndPlaySound(MakePath(INSTSNDDIR$, "instdir.wav"), 3)
  485.     GOSUB GETPATH
  486.     GOTO CUSTINSTDLG
  487.     ELSEIF sz$ = "CHK1" THEN
  488.     RecalcOptFiles BASEFILES
  489.     SetDriveStatus
  490.     GOTO CUSTINSTDLG
  491.     ELSEIF sz$ = "CHK2" THEN
  492.     RecalcOptFiles TAPPFILES
  493.     SetDriveStatus
  494.     GOTO CUSTINSTDLG
  495.     ELSEIF sz$ = "CHK3" THEN
  496.     RecalcOptFiles SOUNDFILES
  497.     SetDriveStatus
  498.     GOTO CUSTINSTDLG
  499.     ELSEIF sz$ = "CHK4" THEN
  500.     RecalcOptFiles VOICEFILES
  501.     SetDriveStatus
  502.     GOTO CUSTINSTDLG
  503.     ELSEIF sz$ = "BTN2" THEN
  504.     GOTO TAPPFILES
  505.     ELSEIF sz$ = "BTN3" THEN
  506.     GOTO SOUNDFILES
  507.     ELSEIF sz$ = "BTN4" THEN
  508.     GOTO VOICEFILES
  509.     ELSEIF sz$ = "EXIT" THEN
  510.     GOSUB ASKQUIT
  511.     GOTO CUSTINST
  512.     END IF
  513.     GOTO CUSTINSTDLG
  514.  
  515.  
  516. INSTALL:
  517.     SetRestartDir DEST$
  518.     ClearCopyList
  519.  
  520.     AddOptFiles
  521.  
  522.     AddBillboards
  523.  
  524.     CreateDir DEST$, cmoNone
  525.  
  526.     UIPopAll
  527.  
  528.     res% = sndPlaySound(MakePath(INSTSNDDIR$, "copying.wav"), 3)
  529.  
  530.     ''Do the copyn'
  531.     SetCopyGaugePosition 10, 135
  532.     CopyFilesInCopyList
  533.  
  534.     ''Back up SYSTEM.INI and WIN.INI
  535.     CopyFile MakePath(WINDIR$, WININI$), MakePath(WINDIR$, "WIN.BAK"), cmoOverwrite, 0
  536.     CopyFile SYSINI$, MakePath(WINDIR$, "SYSTEM.BAK"), cmoOverwrite, 0
  537.  
  538.     '' Configure the installed applications
  539.     ConfigureApps
  540.  
  541.     ''See if we need to restart Windows to finish installing system files which may be in use
  542.     IF RestartListEmpty() = 0 THEN
  543.     i% = DoMsgBox("Certain system files that Setup needs to install are currently in use." + "  Please close all other applications and press OK.  Setup will exit Windows, install these files, and restart Windows.", WFSAPP$ + " Setup", MB_OK)
  544.     res% = sndPlaySound(MakePath(INSTSNDDIR$, "restart.wav"), 3)
  545.     i% = ExitExecRestart()
  546.     END IF
  547.  
  548. QUIT:
  549.     ON ERROR GOTO ERRQUIT
  550.  
  551.     IF ERR = 0 THEN
  552.     res% = sndPlaySound(MakePath(INSTSNDDIR$, "done.wav"), 3)
  553.     dlg% = EXITREBOOT
  554.     ELSEIF ERR = STFQUIT THEN
  555.     res% = sndPlaySound(MakePath(INSTSNDDIR$, "donerr.wav"), 3)
  556.     dlg% = EXITQUIT
  557.     ELSE
  558.  
  559. '$IFNDEF DEBUG
  560.     RESUME NEXT
  561. '$ELSE
  562.     dlg% = EXITFAILURE
  563. '$ENDIF
  564.  
  565.     END IF
  566. QUITL1:
  567.     sz$ = UIStartDlg(CUIDLL$, dlg%, "FInfo0DlgProc", 0, "")
  568.     res% = sndPlaySound(MakePath(INSTSNDDIR$, "finish.wav"), 2)
  569.     IF sz$ = "REACTIVATE" THEN
  570.     GOTO QUITL1
  571.     END IF
  572.     UIPop 1
  573.  
  574. DONEFINIFIN:
  575.     Ctl3dUnregister(HCUI%)
  576.     END
  577.  
  578. ERRQUIT:
  579.     res% = sndPlaySound(MakePath(INSTSNDDIR$, "calltech.wav"), 3)
  580.     i% = DoMsgBox("Setup sources were corrupted, call technical support services!", "Setup Error", MB_OK+MB_TASKMODAL+MB_ICONHAND)
  581.     Ctl3dUnregister(HCUI%)
  582.     END
  583.  
  584.  
  585.  
  586. GETPATH:
  587.     SetSymbolValue "EditTextIn", DEST$
  588.     SetSymbolValue "EditFocus", "END"
  589. GETPATHL1:
  590.     sz$ = UIStartDlg(CUIDLL$, DESTPATH, "FEditDlgProc", APPHELP, HELPPROC$)
  591.  
  592.     IF sz$ = "CONTINUE" THEN
  593.     olddest$ = DEST$
  594.     DEST$ = GetSymbolValue("EditTextOut")
  595.  
  596.     ''Validate new path.
  597.     IF IsDirWritable(DEST$) = 0 THEN
  598.         GOSUB BADPATH
  599.         GOTO GETPATHL1
  600.     END IF
  601.     res% = sndPlaySound(MakePath(INSTSNDDIR$, "donepath.wav"), 3)
  602.     UIPop 1
  603.  
  604.     ''Truncate display if too long.
  605.     IF LEN(DEST$) > 23 THEN
  606.         ReplaceListItem DRIVETEXT$, 7, MID$(DEST$, 1, 23)+"..."
  607.     ELSE
  608.         ReplaceListItem DRIVETEXT$, 7, DEST$
  609.     END IF
  610.  
  611.     ''Recalc if path changed.
  612.     IF (olddest$ <> DEST$) AND (olddest$ <> DEST$+"\") AND (olddest$+"\" <> DEST$) THEN
  613.         RecalcPath
  614.         SetDriveStatus
  615.     END IF
  616.  
  617.     olddest$ = ""
  618.     RETURN
  619.     ELSEIF sz$ = "EXIT" THEN
  620.     GOSUB ASKQUIT
  621.     GOTO GETPATHL1
  622.     ELSEIF sz$ = "BACK" THEN
  623.     UIPop 1
  624.     RETURN
  625.     END IF
  626.     GOTO GETPATHL1
  627.  
  628.  
  629. TAPPFILES:
  630.     SetSymbolValue "ListItemsIn", GetSymbolValue(TAPPS$)
  631.     SetSymbolValue "ListItemsOut", GetSymbolValue(TAPPSINST$)
  632. TAPPF:
  633.     sz$ = UIStartDlg(CUIDLL$, TAPPSDLG, "FMultiDlgProc", APPHELP, HELPPROC$)
  634.  
  635.     IF sz$ = "CONTINUE" THEN
  636.     UIPop 1
  637.     SetSymbolValue TAPPSINST$, GetSymbolValue("ListItemsOut")
  638.     RecalcOptFiles TAPPFILES
  639.     SetDriveStatus
  640.     GOTO CUSTINSTDLG
  641.     ELSEIF sz$ = "EXIT" THEN
  642.     GOSUB ASKQUIT
  643.     GOTO TAPPF
  644.     ELSE '' Back...
  645.     UIPop 1
  646.     GOTO CUSTINSTDLG
  647.     END IF
  648.     GOTO TAPPF
  649.  
  650.  
  651. SOUNDFILES:
  652.     SetSymbolValue "ListItemsIn", GetSymbolValue(SOUNDS$)
  653.     SetSymbolValue "ListItemsOut", GetSymbolValue(SOUNDSINST$)
  654. SOUNDF:
  655.     sz$ = UIStartDlg(CUIDLL$, SOUNDSDLG, "FMultiDlgProc", APPHELP, HELPPROC$)
  656.  
  657.     IF sz$ = "CONTINUE" THEN
  658.     UIPop 1
  659.     SetSymbolValue SOUNDSINST$, GetSymbolValue("ListItemsOut")
  660.     RecalcOptFiles SOUNDFILES
  661.     SetDriveStatus
  662.     GOTO CUSTINSTDLG
  663.     ELSEIF sz$ = "EXIT" THEN
  664.     GOSUB ASKQUIT
  665.     GOTO SOUNDF
  666.     ELSE '' Back...
  667.     UIPop 1
  668.     GOTO CUSTINSTDLG
  669.     END IF
  670.     GOTO SOUNDF
  671.  
  672.  
  673. VOICEFILES:
  674.     SetSymbolValue "ListItemsIn", GetSymbolValue(VOICES$)
  675.     SetSymbolValue "ListItemsOut", GetSymbolValue(VOICESINST$)
  676. VOICEF:
  677.     sz$ = UIStartDlg(CUIDLL$, VOICESDLG, "FMultiDlgProc", APPHELP, HELPPROC$)
  678.  
  679.     IF sz$ = "CONTINUE" THEN
  680.     UIPop 1
  681.     SetSymbolValue VOICESINST$, GetSymbolValue("ListItemsOut")
  682.     RecalcOptFiles VOICEFILES
  683.     SetDriveStatus
  684.     GOTO CUSTINSTDLG
  685.     ELSEIF sz$ = "EXIT" THEN
  686.     GOSUB ASKQUIT
  687.     GOTO VOICEF
  688.     ELSE '' Back...
  689.     UIPop 1
  690.     GOTO CUSTINSTDLG
  691.     END IF
  692.     GOTO VOICEF
  693.  
  694.  
  695. TOOBIG:
  696.     sz$ = UIStartDlg(CUIDLL$, TOOBIG, "FInfo0DlgProc", 0, "")
  697.     UIPop 1
  698.     RETURN
  699.  
  700.  
  701.  
  702. BADPATH:
  703.     sz$ = UIStartDlg(CUIDLL$, BADPATH, "FInfo0DlgProc", 0, "")
  704.     UIPop 1
  705.     RETURN
  706.  
  707.  
  708. ASKQUIT:
  709.     res% = sndPlaySound(MakePath(INSTSNDDIR$, "quit.wav"), 3)
  710.  
  711.     sz$ = UIStartDlg(CUIDLL$, ASKQUIT, "FQuitDlgProc", 0, "")
  712.  
  713.     IF sz$ = "EXIT" THEN
  714.     UIPopAll
  715.     ERROR STFQUIT
  716.     ELSEIF sz$ = "REACTIVATE" THEN
  717.     GOTO ASKQUIT
  718.     ELSE
  719.     UIPop 1
  720.     END IF
  721.     RETURN
  722.  
  723.  
  724. ''Recalculate space based on install options...
  725. SUB RecalcOptFiles (ftype%) STATIC
  726.  
  727.     CursorSave% = ShowWaitCursor()
  728.  
  729.     sz$ = UIStartDlg(CUIDLL$, WAITDLG, "FModelessDlgProc", APPHELP, HELPPROC$)
  730.  
  731.     ClearCopyList
  732.  
  733.     AddOptFilesToCopyList ftype%
  734.  
  735.     fExtra% = 0
  736.     IF ftype% = BASEFILES THEN
  737.     ListSym$ = BASENEEDS$
  738.     IF GetListItem(CHECKSTATES$, BASEFILES) = "ON" THEN
  739.         ''Add extra cost to Windows drive for ini/progman/pointers
  740.         ndrive% = ASC(ucase$(WINDRIVE$)) - ASC("A") + 1
  741.         ReplaceListItem EXTRACOSTS$, ndrive%, "65536"
  742.         fExtra% = 1
  743.     END IF
  744.     ELSEIF ftype% = TAPPFILES THEN
  745.     ListSym$ = TAPPNEEDS$
  746.     ELSEIF ftype% = SOUNDFILES THEN
  747.     ListSym$ = SOUNDNEEDS$
  748.     ELSEIF ftype% = VOICEFILES THEN
  749.     ListSym$ = VOICENEEDS$
  750.     END IF
  751.  
  752.     StillNeed& = GetCopyListCost(EXTRACOSTS$, ListSym$, "")
  753.  
  754.     cost& = 0
  755.     FOR i% = 1 TO 26 STEP 1
  756.     cost&  = cost& + VAL(GetListItem(ListSym$, i%))
  757.     NEXT i%
  758.     ReplaceListItem STATUSTEXT$, ftype%, STR$(cost& / 1024) + " K"
  759.  
  760.     IF fExtra% THEN
  761.     ReplaceListItem EXTRACOSTS$, ndrive%, "0"
  762.     END IF
  763.  
  764.     UIPop 1
  765.  
  766.     RestoreCursor CursorSave%
  767.  
  768.     ListSym$ = ""
  769. END SUB
  770.  
  771.  
  772. ''Make path from dir and szFile; add \  as needed
  773. FUNCTION MakePath (szDir$, szFile$) STATIC AS STRING
  774.     IF szDir$ = "" THEN
  775.     MakePath = szFile$
  776.     ELSEIF szFile$ = "" THEN
  777.     MakePath = szDir$
  778.     ELSEIF MID$(szDir$, LEN(szDir$), 1) = "\" THEN
  779.     MakePath = szDir$ + szFile$
  780.     ELSE
  781.     MakePath = szDir$ + "\" + szFile$
  782.     END IF
  783. END FUNCTION
  784.  
  785.  
  786. '' Return true if the given string is in the symbol's list
  787. FUNCTION StringInList (s$, y$) STATIC AS INTEGER
  788.     l% = GetListLength(y$)
  789.     FOR i% = 1 TO l
  790.     IF s$ = GetListItem(y$, i%) THEN
  791.         StringInList = -1
  792.         GOTO DONE
  793.     END IF
  794.     NEXT i%
  795.     StringInList = 0
  796. DONE:
  797. END FUNCTION
  798.  
  799.  
  800. ''Get Windows version in a useful way
  801. FUNCTION GetWindowsVersionCorrectly& () STATIC
  802.     GetWindowsVersionCorrectly = GetWindowsMajorVersion() * 256 + GetWindowsMinorVersion()
  803. END FUNCTION
  804.  
  805.  
  806. '' Turn x, y into a major.minor version long
  807. FUNCTION MakeVer& (x as integer, y as integer) STATIC
  808.     MakeVer = x * 256 + y
  809. END FUNCTION
  810.  
  811.  
  812. '' Remove all files in the given .INF section
  813. SUB RemoveSectionFiles (dest$, sect$) STATIC
  814.     foo$ = "foo"
  815.     MakeListFromSectionFilename foo$, sect$
  816.     l% = GetListLength(foo$)
  817.     FOR i% = 1 TO l% STEP 1
  818.     RemoveFile MakePath(dest$, GetListItem(foo$, i%)), cmoForce
  819.     NEXT i%
  820.     foo$ = ""
  821. END SUB
  822.  
  823.  
  824. '' Remove directory and all files in it, if it exists
  825. SUB RemDirectory(d$) STATIC
  826.     IF Exists(MakePath(d$, "NUL")) THEN
  827.     Kill MakePath(d$, "*.*")
  828.     RmDir d$
  829.     END IF
  830. END SUB
  831.  
  832.  
  833. '' Return True (-1) if the user has a sound driver in the [drivers]
  834. ''  section of win.ini.
  835. FUNCTION HasSoundDriver() STATIC AS INTEGER
  836.     r% = 0
  837.     IF GetIniKeyString(SYSINI$, "drivers", "wave") <> "" THEN
  838.     r% = -1
  839.     ELSEIF GetIniKeyString(SYSINI$, "drivers", "wave1") <> "" THEN
  840.     r% = -1
  841.     ELSEIF GetIniKeyString(SYSINI$, "drivers", "wave2") <> "" THEN
  842.     r% = -1
  843.     ELSEIF GetIniKeyString(SYSINI$, "drivers", "wave3") <> "" THEN
  844.     r% = -1
  845.     ELSEIF GetIniKeyString(SYSINI$, "drivers", "wave4") <> "" THEN
  846.     r% = -1
  847.     ELSEIF GetIniKeyString(SYSINI$, "drivers", "wave5") <> "" THEN
  848.     r% = -1
  849.     END IF
  850.     HasSoundDriver = r%
  851. END FUNCTION
  852.  
  853. '' Include product-specific function definitions
  854. '$INCLUDE 'specific.inc'
  855.