home *** CD-ROM | disk | FTP | other *** search
/ On Hand / On_Hand_From_Softbank_1994_Release_2_Disc_1_1994.iso / 00083 / s / approach / disk1 / approach.ms_ / approach.bin
Text File  |  1993-08-18  |  50KB  |  1,404 lines

  1. '** $Header:   F:\newproj\install3\vcs\approach.msv   2.3   04 Aug 1993 17:05:00   JLevine  $
  2. '**************************************************************************
  3. '**                       Approach installation script
  4. '**************************************************************************
  5. '**
  6. '** Modifications:
  7. '** $Log:   F:\newproj\install3\vcs\approach.msv  $
  8. '** 
  9. '**    Rev 2.3   04 Aug 1993 17:05:00   JLevine
  10. '** 2.1 release
  11. '** 
  12. '**    Rev 2.2   13 Jul 1993 17:18:54   JLevine
  13. '** DriveType stuff
  14. '** 
  15. '**    Rev 2.1   12 Jul 1993 23:37:30   JLevine
  16. '** 2.1 installer
  17. '** 
  18. '**    Rev 2.0   21 Jun 1993 15:59:18   JLevine
  19. '** No change.
  20. '** 
  21. '**    Rev 1.4   02 Apr 1993 11:01:48   JLevine
  22. '** 2.03 changes
  23. '** 
  24. '**    Rev 1.3   02 Dec 1992 16:39:50   JLevine
  25. '** OurLoadString, localizable strings
  26. '** 
  27. '**    Rev 1.2   01 Dec 1992 10:23:38   JLevine
  28. '** 2.01i installer
  29. '** 
  30. '**    Rev 1.1   21 Oct 1992 10:35:16   JLevine
  31. '** Changes for UK release
  32. '** 
  33. '**    Rev 1.0   16 Oct 1992 16:04:10   JLevine
  34. '** Initial revision.
  35. '**
  36.  
  37. '$DEFINE NODEBUG  ''Define DEBUG for script development/debugging
  38.  
  39. '$INCLUDE 'setupapi.inc'
  40. '$INCLUDE 'msdetect.inc'
  41. '$INCLUDE 'msregdb.inc'
  42. '$INCLUDE 'approach.inc'
  43.  
  44. ''Dialog ID's
  45. CONST WELCOME          = 100 
  46. CONST WELCOMENODE    = 101
  47. CONST ASKQUIT          = 200
  48. CONST DESTPATH         = 300
  49. CONST EXITFAILURE      = 400
  50. CONST EXITQUIT         = 600
  51. CONST EXITSUCCESS      = 700
  52. CONST EXITNETWORKSUCCESS   = 701
  53. CONST OPTIONS          = 800
  54. CONST INSTOPTS            = 801
  55. CONST TEMPLATEOPTS    = 802
  56. CONST INSTSHARE        = 803
  57. CONST NETINSTOPTS    = 804
  58. CONST NETLICENSEOPTS = 805
  59. 'CONST LOTUSAPPDIR    = 806
  60. CONST APPHELP          = 900
  61. CONST APPHELPNOBACK    = 901
  62. CONST APPHELPNOCONT    = 902
  63. CONST APPINSTHELP        = 903
  64. CONST APPTEMPLATEHELP = 904
  65. CONST APPSHAREHELP     = 905
  66. CONST APPCUSTINSTHELP = 906
  67. CONST APPHELPYESNO    = 907
  68. CONST APPLICENSEHELP  = 908
  69. CONST APPNETHELP      = 909
  70. 'CONST LOTUSAPPHELP    = 910
  71. 'CONST COMMONDIRHELP   = 911
  72. 'CONST COMMONDIR       = 1000 
  73. CONST CUSTINST         = 6200
  74. CONST TOOBIGCUST        = 6300
  75. CONST TOOBIGFULL        = 6301
  76. CONST TOOBIGMIN        = 6302
  77. CONST BADPATH          = 6400
  78. CONST    CDCONFIRMINFO    = 7300
  79. CONST CDBADNAME        = 7700
  80. CONST BILLBOARD_REG  = 8000
  81. CONST BILLBOARD_2    = 8001
  82. CONST BILLBOARD_3    = 8002
  83. CONST BILLBOARD_4    = 8003   
  84.  
  85. CONST LOGO         = 2
  86.  
  87. ''File Types
  88. CONST APPFILES     = 1            ''Approach
  89. CONST OPTFILES1     = 2            ''Examples
  90. CONST OPTFILES2    = 3            ''Templates
  91. CONST OPTFILES3     = 4            ''Paradox
  92. CONST OPTFILES4     = 5            ''Oracle
  93. CONST OPTFILES5     = 6            ''SQL Server
  94. CONST OPTFILES6    = 7        ''ODBC
  95. CONST NUMFILETYPES = OPTFILES6
  96.  
  97. '' For templates
  98. CONST TEMPLATEREADME = 1        '' Do template readme files
  99. CONST SMALLBIZ         = 2            '' Do smallbiz templates
  100. CONST LARGEBIZ         = 3            '' Do largebiz templates
  101. CONST NUMTEMPLATES = LARGEBIZ
  102.  
  103. GLOBAL DEST$        ''Default destination directory.
  104. GLOBAL WINDRIVE$    ''Windows drive letter.
  105. 'GLOBAL STATUSBARDEST$
  106. 'GLOBAL ICONBARDEST$
  107. 'GLOBAL LOTUSAPPDIR$
  108. GLOBAL LICENSEDEST$  '' Licenser destination directory.
  109. GLOBAL LICENSEUTIL$  '' Licenser utility directory.
  110.  
  111. GLOBAL OPT1OPT$     ''Option selection from OptFiles1 option dialog.
  112. GLOBAL OPT2OPT$     ''Option selection from OptFiles2 option dialog.
  113. GLOBAL OPT3OPT$     ''Option selection from OptFiles2 option dialog.
  114. GLOBAL OPT4OPT$     ''Option selection from OptFiles2 option dialog.
  115. GLOBAL OPT5OPT$      ''Option selection from OptFiles5 option dialog
  116. GLOBAL OPT6OPT$     ''Option selection from OptFiles6 option dialog
  117.  
  118. ''CustInst list symbol names
  119. GLOBAL APPNEEDS$    ''Option list costs per drive
  120. GLOBAL OPT1NEEDS$
  121. GLOBAL OPT2NEEDS$
  122. GLOBAL OPT3NEEDS$
  123. GLOBAL OPT4NEEDS$
  124. GLOBAL OPT5NEEDS$
  125. GLOBAL OPT6NEEDS$
  126. GLOBAL LICENSEUTILNEEDS$
  127. GLOBAL EXTRACOSTS$  ''List of extra costs to add per drive
  128. GLOBAL BIGLIST$     ''List of option files cost calc results (boolean)
  129.  
  130. ''Dialog list symbol names
  131. GLOBAL CHECKSTATES$
  132. GLOBAL STATUSTEXT$
  133. GLOBAL DRIVETEXT$
  134.  
  135. GLOBAL HELPPROC$
  136. GLOBAL CUIDLL$
  137.  
  138. '' Flags
  139. GLOBAL instDiskFull%
  140. GLOBAL winDiskFull%
  141.  
  142. DECLARE SUB AddOptFilesToCopyList (ftype%)
  143. DECLARE SUB CreateOptDir (ftype%, DEST$) 
  144. DECLARE SUB RecalcOptFiles (ftype%)
  145. DECLARE SUB RecalcPath
  146. DECLARE SUB SetDriveStatus
  147. DECLARE FUNCTION MakePath (szDir$, szFile$) AS STRING
  148. DECLARE FUNCTION CompareLists(szList1$, szList2$) AS INTEGER
  149. DECLARE SUB CopyList(szList1$, szList2$)
  150. DECLARE SUB DoBadPathDlg
  151. 'DECLARE FUNCTION DoPathDlg() AS STRING
  152. DECLARE FUNCTION ValidateNewPath(oldPath$, newPath$) AS INTEGER
  153. DECLARE SUB ChangePathText(newPath$) 
  154. DECLARE SUB DoAskQuitDlg
  155. DECLARE SUB DoWelcomeDlg(szUserName$, szCompanyName$)
  156. DECLARE FUNCTION OurIsDirWritable(newPath$) AS INTEGER
  157.  
  158. INIT:
  159.     SetTitle GetString(STANDARD_CAPTION)
  160.     SetAbout GetString(COPYRIGHT_NAME), GetString(COPYRIGHT_NOTICE)
  161.  
  162. '' Hack to make node installations simpler    
  163.     IF GetSymbolValue("STF_MODE") = "ADMIN" THEN
  164.         SetSymbolValue "STF_MODE", "NODE"
  165.     END IF
  166.  
  167.      instDiskFull% = 0
  168.      winDiskFull% = 0
  169.     CUIDLL$ = "mscuistf.dll"            ''custom user interface dll
  170.     HELPPROC$ = "FHelpDlgProc"          ''Help dialog procedure
  171.  
  172.     SetBitmap CUIDLL$, LOGO
  173.      dummy% = ShowWindow (HwndFrame(), SW_SHOWMAXIMIZED)
  174.  
  175.     WINDRIVE$ = MID$(GetWindowsDir, 1, 1)
  176.  
  177.     
  178.     IF GetSymbolValue("STF_MODE") = "NETWORK" THEN
  179.        LICENSEUTIL$ = WINDRIVE$ + ":\LICENSER"
  180.        DEST$ = ""
  181.        LICENSEDEST$ = ""
  182.          
  183.        FOR i% = 1 TO 26 STEP 1
  184.           IF DriveType(i%) = DRIVE_REMOTE THEN
  185.              NetDrive$ = CHR$(i%+ASC("A")-1)
  186.              IF (DEST$ = "") AND (OurIsDirWritable(NetDrive$+GetString(NETWORK_DIR)) = 1) THEN
  187.                 DEST$ = NetDrive$+GetString(NETWORK_DIR)
  188.              ENDIF
  189.  
  190.              IF (LICENSEDEST$ = "") AND (OurIsDirWritable(NetDrive$+GetString(NETLICENSE_DIR)) = 1) THEN
  191.                 LICENSEDEST$ = NetDrive$+GetString(NETLICENSE_DIR)
  192.              END IF
  193.  
  194.              IF (DEST$ <> "") AND (LICENSEDEST$ <> "") THEN
  195.                 EXIT FOR
  196.              ENDIF
  197.           END IF
  198.        NEXT i%
  199.  
  200.        IF DEST$ = "" THEN
  201.           DEST$ = WINDRIVE$ + GetString(NETWORK_DIR)
  202.        END IF
  203.          
  204.        IF LICENSEDEST$ = "" THEN
  205.           LICENSEDEST$ = WINDRIVE$ + GetString(NETLICENSE_DIR)
  206.        END IF
  207.     ELSE
  208.        DEST$ = WINDRIVE$ + ":\APPROACH"
  209.     END IF
  210.  
  211.     szInf$ = GetSymbolValue("STF_SRCINFPATH")
  212.     IF szInf$ = "" THEN
  213.         szInf$ = GetSymbolValue("STF_CWDDIR")
  214.     END IF
  215.     szInf$ = szInf$ + "APPROACH.INF"
  216.    
  217. '
  218. ' Guess at a location for lotusapp & shared files
  219. '
  220.     LotIni1$ = GetWindowsDir
  221.      LotIni$ = LotIni1$+"LOTUS.INI"
  222. '   ICONBARDEST$ = GetIniKeyString(LotIni$, "Icon Palette", "Program Path")
  223. '   STATUSBARDEST$ = GetIniKeyString(LotIni$, "Status Bar", "Program Path")
  224. '
  225. '    IF GetSymbolValue("STF_MODE") = "NORMAL" THEN
  226. '         LOTUSAPPDIR$ = GetIniKeyString(LotIni$, "Lotus Applications", "Common Directory")
  227. '      IF LOTUSAPPDIR$ = "" THEN
  228. '           LOTUSAPPDIR$ = LotIni1$+"LOTUSAPP"
  229. '       ENDIF
  230. '
  231. '       IF ICONBARDEST$ = "" THEN
  232. '          ICONBARDEST$ = LOTUSAPPDIR$
  233. '       ENDIF
  234. '
  235. '       IF STATUSBARDEST$ = "" THEN
  236. '           STATUSBARDEST$ = LOTUSAPPDIR$
  237. '       ENDIF
  238. '    ELSEIF GetSymbolValue("STF_MODE") = "NODE" THEN
  239. '       LOTUSAPPDIR$ = GetIniKeyString(LotIni$, "Lotus Applications", "Net Common Directory")
  240. '       LOTUSAPPDIR2$ = GetIniKeyString(GetSymbolValue("STF_SRCDIR")+"INSTALL.INI", "Save Section", "Server Common Directory")
  241. '
  242. '       IF (LOTUSAPPDIR$ = "") OR ((LOTUSAPPDIR2$ <> "") AND (MID$(LOTUSAPPDIR$, 2) <> MID$(LOTUSAPPDIR2$, 2))) THEN
  243. '           LOTUSAPPDIR$ = LOTUSAPPDIR2$
  244. '       ENDIF
  245. '
  246. '       IF DoesDirExist(LOTUSAPPDIR$) = 0 THEN
  247. '           LOTUSAPPDIR$ = MID$(GetSymbolValue("STF_SRCDIR"), 1, 1) + MID$(LOTUSAPPDIR$, 2)
  248. '       ENDIF
  249. '    ELSEIF GetSymbolValue("STF_MODE") = "NETWORK" THEN
  250. '         LOTUSAPPDIR$ = GetIniKeyString(LotIni$, "Lotus Applications", "Net Common Directory")
  251. '       IF LOTUSAPPDIR$ = "" THEN
  252. '           LOTUSAPPDIR$ = MID$(DEST$, 1, 1)+":\LOTUSAPP"
  253. '       ENDIF
  254. '    ENDIF
  255.  
  256.     ReadInfFile szInf$
  257.  
  258.     ''CustInst list symbols
  259.     CHECKSTATES$ = "CheckItemsState"
  260.     STATUSTEXT$  = "StatusItemsText"
  261.     DRIVETEXT$   = "DriveStatusText"
  262.     FOR k% = APPFILES TO NUMFILETYPES STEP 1
  263.         AddListItem STATUSTEXT$, ""
  264.     NEXT k%
  265.     FOR l% = 1 TO 7 STEP 1
  266.         AddListItem DRIVETEXT$, ""
  267.     NEXT l%
  268.     ReplaceListItem DRIVETEXT$, 7, DEST$
  269.  
  270.     ''Disk cost list symbols
  271.     APPNEEDS$   = "AppNeeds"
  272.     OPT1NEEDS$  = "Opt1Needs"
  273.     OPT2NEEDS$  = "Opt2Needs"
  274.     OPT3NEEDS$  = "Opt3Needs"
  275.     OPT4NEEDS$  = "Opt4Needs"
  276.     OPT5NEEDS$  = "Opt5Needs"
  277.     OPT6NEEDS$  = "Opt6Needs"
  278.     EXTRACOSTS$ = "ExtraCosts"
  279.     BIGLIST$    = "BigList"
  280.     FOR m% = APPFILES TO NUMFILETYPES STEP 1
  281.         AddListItem BIGLIST$, ""
  282.     NEXT m%
  283.     FOR n% = 1 TO 26 STEP 1
  284.         AddListItem EXTRACOSTS$, "0"
  285.     NEXT n%
  286.  
  287.     OPT1OPT$ = "1"
  288.     OPT2OPT$ = "WhichTemplates"
  289.  
  290.     FOR o% = APPFILES TO NUMFILETYPES STEP 1
  291.         AddListItem CHECKSTATES$, "ON"
  292.     NEXT o%
  293.  
  294.     ''File Option Variables
  295.     IF GetSymbolValue("STF_MODE") = "NODE" THEN        
  296.        IF DoesFileExist(GetSymbolValue("STF_SRCDIR") + GetString(EXAMPLES_DIR) + "\" + GetSectionKeyFilename("Tutorial", "Tutorial Example File"), femExists) = 0 THEN 
  297.          ReplaceListItem CHECKSTATES$, OPTFILES1, "DISABLED"
  298.          OPT1OPT$ = "-1"
  299.        ELSE
  300.          OPT1OPT$ = "1"
  301.        ENDIF
  302.      
  303.        numTempls% = 0
  304.  
  305.        IF DoesFileExist(GetSymbolValue("STF_SRCDIR") + GetString(TEMPLATES_DIR) + "\" + GetSectionKeyFilename("Template Readme", "Template Documentation"), femExists) = 0 THEN
  306.            AddListItem OPT2OPT$, "DISABLED"
  307.        ELSE
  308.            AddListItem OPT2OPT$, "ON"
  309.            numTempls% = numTempls% + 1
  310.        ENDIF
  311.  
  312.        IF DoesFileExist(GetSymbolValue("STF_SRCDIR") + GetString(TEMPLATES_DIR) + "\" + GetString(SMALLBIZ_DIR) + "\" + GetSectionKeyFilename("Smallbiz Templates", "Small Business Template"), femExists) = 0 THEN
  313.            AddListItem OPT2OPT$, "DISABLED"
  314.        ELSE
  315.            AddListItem OPT2OPT$, "ON"
  316.            numTempls% = numTempls% + 1
  317.        ENDIF
  318.  
  319.        IF DoesFileExist(GetSymbolValue("STF_SRCDIR") + GetString(TEMPLATES_DIR) + "\" + GetString(LARGEBIZ_DIR) + "\" + GetSectionKeyFilename("Largebiz Templates", "Large Business Template"), femExists) = 0 THEN 
  320.            AddListItem OPT2OPT$, "DISABLED"
  321.        ELSE
  322.            AddListItem OPT2OPT$, "ON"
  323.            numTempls% = numTempls% + 1
  324.        ENDIF
  325.  
  326.        IF numTempls% = 0 THEN
  327.           ReplaceListItem CHECKSTATES$, OPTFILES2, "DISABLED"
  328.        ELSEIF numTempls% = 3 THEN
  329.           ReplaceListItem CHECKSTATES$, OPTFILES2, "ON"
  330.        ELSE
  331.             SetSymbolValue "IsMixed" + STR$(OPTFILES2), "MIXED"
  332.           ReplaceListItem CHECKSTATES$, OPTFILES2, "MIXED"
  333.        ENDIF
  334.  
  335.        FOR p% = OPTFILES3 TO NUMFILETYPES STEP 1
  336.           ReplaceListItem CHECKSTATES$, p%, "DISABLED"
  337.        NEXT p%
  338.  
  339.        OPT3OPT$ = "-1"
  340.        OPT4OPT$ = "-1"
  341.        OPT5OPT$ = "-1"
  342.        OPT6OPT$ = "-1"
  343.     ELSE
  344.        FOR q% = 1 TO NUMTEMPLATES STEP 1
  345.            AddListItem OPT2OPT$, "ON"
  346.        NEXT q%
  347.        OPT3OPT$ = "1"
  348.        OPT4OPT$ = "1"
  349.        OPT5OPT$ = "1"
  350.        OPT6OPT$ = "1"
  351.     ENDIF 
  352.  
  353. '$IFDEF DEBUG                 
  354.     i% = SetSizeCheckMode(scmOnIgnore)    '' could use scmOff; def = scmOnFatal
  355. '$ENDIF ''DEBUG
  356.  
  357.  
  358. WELCOME:
  359.     IF GetSymbolValue("STF_MODE") = "NODE" THEN            
  360. WELCOMENODE_LOOP:
  361.        sz$ = UIStartDlg(CUIDLL$, WELCOMENODE, "FInfoDlgProc", APPHELPNOBACK, HELPPROC$)
  362.  
  363.        IF sz$ = "CONTINUE" THEN
  364. ' Make sure they entered a user name
  365.           UIPop 1
  366.        ELSEIF sz$ = "EXIT" THEN
  367.           DoAskQuitDlg
  368.           GOTO WELCOMENODE_LOOP 
  369.        ELSE 
  370.           GOTO WELCOMENODE_LOOP
  371.        END IF
  372.     ELSE
  373.        DoWelcomeDlg szUserName$, szCompanyName$
  374.     ENDIF
  375.  
  376. INSTOPTS:
  377.     SetSymbolValue "EditTextIn", DEST$  
  378.     SetSymbolValue "EditFocus", "END"
  379.  
  380.     RecalcPath
  381.     SetDriveStatus
  382.  
  383. INSTOPTS_LOOP:
  384.        sz$ = UIStartDlg(CUIDLL$, INSTOPTS, "FInstOptsDlgProc", APPINSTHELP, HELPPROC$)
  385.  
  386.     opt$ = GetSymbolValue("ButtonChecked")
  387.      
  388.     IF sz$ = "CONTINUE" THEN
  389.         newInstPath$ = GetSymbolValue("EditTextOut")
  390.         instPathRC% = ValidateNewPath(DEST$, newInstPath$) 
  391.  
  392.           IF instPathRC% > 0 THEN
  393.                 ChangePathText(newInstPath$)
  394.         ELSEIF instPathRC% < 0 THEN 
  395.                 GOTO INSTOPTS_LOOP
  396.         END IF
  397.  
  398.         UIPop 1
  399.         IF opt$ = "1" THEN                            '' Full install
  400.                FOR r% = APPFILES TO NUMFILETYPES STEP 1
  401.                 IF GetListItem(CHECKSTATES$, r%) <> "DISABLED" THEN
  402.                       ReplaceListItem CHECKSTATES$, r%, "ON"
  403.                 ENDIF
  404.                NEXT r%
  405.             RecalcPath
  406.             SetDriveStatus
  407.                 IF instDiskFull% = 1 OR winDiskFull% = 1 THEN
  408.                    GOSUB TOOBIGFULL
  409.                SetSymbolValue "EditTextIn", DEST$  
  410.                 GOTO INSTOPTS_LOOP
  411.              END IF
  412.                 GOTO INSTALL
  413.          ELSEIF opt$ = "2" THEN                    '' Custom install
  414.              RecalcPath
  415.              SetDriveStatus
  416.                GOTO CUSTINST
  417.         ELSEIF opt$ = "3" THEN                     '' Minimum install
  418.                 ReplaceListItem CHECKSTATES$, APPFILES, "ON"
  419.                FOR s% = APPFILES+1 TO NUMFILETYPES STEP 1
  420.                 IF GetListItem(CHECKSTATES$, s%) <> "DISABLED" THEN
  421.                       ReplaceListItem CHECKSTATES$, s%, "OFF"
  422.                 ENDIF
  423.                NEXT s%
  424.             RecalcPath
  425.             SetDriveStatus
  426.                 IF instDiskFull% = 1 OR winDiskFull% = 1 THEN
  427.                 GOSUB TOOBIGMIN
  428.                SetSymbolValue "EditTextIn", DEST$  
  429.                 GOTO INSTOPTS_LOOP
  430.              END IF
  431.                 GOTO INSTALL
  432.           END IF
  433.     ELSEIF sz$ = "REACTIVATE" THEN
  434. '        RecalcPath
  435. '        SetDriveStatus
  436.           opt$ = ""
  437.         GOTO INSTOPTS_LOOP
  438.      ELSEIF sz$ = "EXIT" THEN
  439.         DoAskQuitDlg
  440.           opt$ = ""
  441.         GOTO INSTOPTS_LOOP
  442.     ELSEIF sz$ = "PATH" THEN
  443.        newPath$ = GetSymbolValue("EditTextOut")
  444.        pathDummy% = ValidateNewPath(DEST$, newPath$) 
  445.          IF pathDummy% < 0 THEN
  446.            GOTO INSTOPTS_LOOP
  447.        ELSEIF pathDummy > 0 THEN 
  448.            ChangePathText(newPath$) 
  449. '           RecalcPath
  450. '           SetDriveStatus
  451.        END IF
  452.        GOTO INSTOPTS_LOOP
  453.     ELSE
  454.           UIPop 1
  455.           GOTO WELCOME    
  456.     END IF
  457.  
  458.   
  459. CUSTINST:
  460.     SetSymbolValue "EditTextIn", DEST$  
  461.     SetSymbolValue "EditFocus", "END"
  462.  
  463. CUSTINST_LOOP:
  464.     sz$ = UIStartDlg(CUIDLL$, CUSTINST, "FCustInstDlgProc", APPCUSTINSTHELP, HELPPROC$)
  465.  
  466.     IF sz$ = "CONTINUE" THEN
  467.         ''Install only if it will fit.
  468.         newPath$ = GetSymbolValue("EditTextOut")
  469.         pathDummy% = ValidateNewPath(DEST$, newPath$) 
  470.           IF pathDummy% < 0 THEN
  471.             GOTO CUSTINST_LOOP
  472.         ELSEIF pathDummy > 0 THEN 
  473.             ChangePathText(newPath$) 
  474.         END IF
  475.           IF instDiskFull% = 1 OR winDiskFull% = 1 THEN
  476.            GOSUB TOOBIGCUST
  477.            GOTO CUSTINST_LOOP
  478.         END IF
  479.         UIPop 1
  480.         GOTO INSTALL
  481.     ELSEIF sz$ = "PATH" THEN
  482.         newPath$ = GetSymbolValue("EditTextOut")
  483.         pathDummy% = ValidateNewPath(DEST$, newPath$) 
  484.           IF pathDummy% < 0 THEN
  485.            GOTO CUSTINST_LOOP
  486.         ELSEIF pathDummy > 0 THEN 
  487.            ChangePathText(newPath$) 
  488.            RecalcPath
  489.            SetDriveStatus
  490.         END IF
  491.            GOTO CUSTINST_LOOP
  492.     ELSEIF sz$ = "CHK1" THEN
  493.         RecalcOptFiles APPFILES
  494.         SetDriveStatus
  495.         GOTO CUSTINST_LOOP
  496.     ELSEIF sz$ = "CHK2" THEN
  497.         RecalcOptFiles OPTFILES1
  498.         SetDriveStatus
  499.         GOTO CUSTINST_LOOP
  500.     ELSEIF sz$ = "CHK3" THEN
  501.         RecalcOptFiles OPTFILES2
  502.         SetDriveStatus
  503.         GOTO CUSTINST_LOOP
  504.     ELSEIF sz$ = "CHK4" THEN
  505.         RecalcOptFiles OPTFILES3
  506.         SetDriveStatus
  507.         GOTO CUSTINST_LOOP
  508.     ELSEIF sz$ = "CHK5" THEN
  509.         RecalcOptFiles OPTFILES4
  510.         SetDriveStatus
  511.         GOTO CUSTINST_LOOP
  512.     ELSEIF sz$ = "CHK6" THEN
  513.         RecalcOptFiles OPTFILES5
  514.         SetDriveStatus
  515.         GOTO CUSTINST_LOOP
  516.     ELSEIF sz$ = "CHK7" THEN
  517.         RecalcOptFiles OPTFILES6
  518.         SetDriveStatus
  519.         GOTO CUSTINST_LOOP
  520.     ELSEIF sz$ = "BTN3" THEN
  521.         GOTO OPTFILES2
  522.     ELSEIF sz$ = "REACTIVATE" THEN
  523.         RecalcPath
  524.         SetDriveStatus
  525.         GOTO CUSTINST_LOOP
  526.     ELSEIF sz$ = "EXIT" THEN
  527.         DoAskQuitDlg
  528.         GOTO CUSTINST_LOOP
  529.     ELSEIF sz$ = "BACK" THEN
  530.         UIPop 1            
  531.         GOTO INSTOPTS
  532.     ELSE
  533.         GOTO CUSTINST_LOOP
  534.     END IF                
  535.  
  536. INSTALL:
  537.  
  538. '    
  539. ' Refine location for lotusapp & shared files
  540. '
  541. '    IF GetSymbolValue("STF_MODE") = "NODE" THEN
  542. ' Do we even need to know the LOTUSAPPDIR?
  543. '       IF (ICONBARDEST$ = "") OR (DoesDirExist(ICONBARDEST$) = 0) OR (STATUSBARDEST$ = "") OR (DoesDirExist(STATUSBARDEST$) = 0) THEN
  544. 'LOTUSAPPDRIVE:
  545. '           SetSymbolValue "EditTextIn", ""
  546. 'LOTUSAPPDRIVE_LOOP:
  547. '                  
  548. '           sz$ = UIStartDlg(CUIDLL$, COMMONDIR, "FEditDlgProc", COMMONDIRHELP, HELPPROC$)
  549. '
  550. '           IF sz$ = "CONTINUE" THEN
  551. '              newLotAppDir$ = MID$(GetSymbolValue("EditTextOut"), 1, 1)+MID$(LOTUSAPPDIR$, 2)
  552. '              IF DoesDirExist(newLotAppDir$) = 0 THEN
  553. '                 DoBadPathDlg
  554. '                 GOTO LOTUSAPPDRIVE_LOOP
  555. '              END IF 
  556. '              LOTUSAPPDIR$ = newLotAppPath$
  557. '              UIPop 1
  558. '           ELSEIF sz$ = "REACTIVATE" THEN
  559. '              GOTO LOTUSAPPDRIVE_LOOP
  560. '           ELSEIF sz$ = "EXIT" THEN
  561. '              DoAskQuitDlg
  562. '              GOTO LOTUSAPPDRIVE_LOOP
  563. '           ELSE
  564. '              UIPop 1
  565. '              GOTO INSTOPTS
  566. '           END IF
  567. '
  568. '           IF (ICONBARDEST$ = "") OR (DoesDirExist(ICONBARDEST$) = 0) THEN
  569. '              ICONBARDEST$ = LOTUSAPPDIR$
  570. '           ENDIF   
  571. '
  572. '           IF (STATUSBARDEST$ = "") OR (DoesDirExist(STATUSBARDEST$) = 0) THEN
  573. '              STATUSBARDEST$ = LOTUSAPPDIR$
  574. '           ENDIF
  575. '       ENDIF
  576. '    ELSEIF GetSymbolValue("STF_MODE") = "NETWORK" THEN
  577.      IF GetSymbolValue("STF_MODE") = "NETWORK" THEN
  578. 'LOTUSAPPDIR:
  579. '       SetSymbolValue "EditTextIn", LOTUSAPPDIR$
  580. 'LOTUSAPPDIR_LOOP:
  581. '       sz$ = UIStartDlg(CUIDLL$, LOTUSAPPDIR, "FEditDlgProc", LOTUSAPPHELP, HELPPROC$)
  582. '
  583. '       IF sz$ = "CONTINUE" THEN
  584. '          newLotAppPath$ = GetSymbolValue("EditTextOut")
  585. '          IF ValidateNewPath(LOTUSAPPDIR$, newLotAppPath$) < 0 THEN
  586. '             GOTO LOTUSAPPDIR_LOOP
  587. '          END IF 
  588. '          LOTUSAPPDIR$ = newLotAppPath$
  589. '          UIPop 1
  590. '       ELSEIF sz$ = "REACTIVATE" THEN
  591. '          GOTO LOTUSAPPDIR_LOOP
  592. '       ELSEIF sz$ = "EXIT" THEN
  593. '          DoAskQuitDlg
  594. '          GOTO LOTUSAPPDIR_LOOP
  595. '       ELSE
  596. '          UIPop 1
  597. '          GOTO INSTOPTS
  598. '       END IF
  599. '
  600. '       ICONBARDEST$ = LOTUSAPPDIR$
  601. '       STATUSBARDEST$ = LOTUSAPPDIR$
  602. '
  603. NETOPTS:
  604.        SetSymbolValue "EditTextIn", LICENSEUTIL$    
  605.  
  606. NETOPTS_LOOP:
  607.         sz$ = UIStartDlg(CUIDLL$, NETINSTOPTS, "FEditDlgProc", APPNETHELP, HELPPROC$)
  608.  
  609.        IF sz$ = "CONTINUE" THEN
  610.              newLicUtilPath$ = GetSymbolValue("EditTextOut")
  611.  
  612.            IF ValidateNewPath(LICENSEUTIL$, newLicUtilPath$) < 0 THEN
  613.                GOTO NETOPTS_LOOP
  614.            END IF
  615.            LICENSEUTIL$ = newLicUtilPath$
  616.            UIPop 1
  617.        ELSEIF sz$ = "REACTIVATE" THEN
  618.            GOTO NETOPTS_LOOP
  619.         ELSEIF sz$ = "EXIT" THEN
  620.            DoAskQuitDlg
  621.            GOTO NETOPTS_LOOP
  622.        ELSE
  623.              UIPop 1
  624.              GOTO INSTOPTS
  625.        END IF
  626.  
  627. NETOPTS2:
  628.        SetSymbolValue "EditTextIn", LICENSEDEST$
  629.  
  630. NETOPTS2_LOOP:
  631.         sz$ = UIStartDlg(CUIDLL$, NETLICENSEOPTS, "FEditDlgProc", APPLICENSEHELP, HELPPROC$)
  632.  
  633.        IF sz$ = "CONTINUE" THEN
  634.                newLicPath$ = GetSymbolValue("EditTextOut")
  635.  
  636.            IF ValidateNewPath(LICENSEDEST$, newLicPath$) < 0 THEN
  637.                GOTO NETOPTS2_LOOP
  638.            END IF
  639.  
  640.            IF CountDirs(newLicPath$) <> 1 THEN
  641.               DoBadPathDlg
  642.               GOTO NETOPTS2_LOOP
  643.            END IF
  644.  
  645.            LICENSEDEST$ = newLicPath$
  646.            UIPop 1
  647.        ELSEIF sz$ = "REACTIVATE" THEN
  648.            GOTO NETOPTS2_LOOP
  649.         ELSEIF sz$ = "EXIT" THEN
  650.            DoAskQuitDlg
  651.            GOTO NETOPTS2_LOOP
  652.        ELSE
  653.              UIPop 1
  654.              GOTO NETOPTS
  655.        END IF
  656.      ENDIF
  657.  
  658.     ClearCopyList
  659.      FOR t% = APPFILES TO NUMFILETYPES STEP 1
  660.         AddOptFilesToCopyList t%
  661.          CreateOptDir t%, DEST$ 
  662.      NEXT t%
  663.  
  664. '' Grab important initialization information from the APPROACH.INI
  665.      AppIni1$ = GetWindowsDir
  666.      AppIni$ = AppIni1$+"APPROACH.INI"
  667.     IF GetListItem(CHECKSTATES$, APPFILES) = "ON" THEN
  668.          oldParadoxUserName$ = GetIniKeyString(AppIni$, "Approach", "sParadoxUserName")
  669.          oldParadoxNetFilePath$ = GetIniKeyString(AppIni$, "Approach", "sParadoxNetFilePath")
  670.          olddBaseFileSharingMethod$ = GetIniKeyString(AppIni$, "Approach", "sdBaseFileSharingMethod")
  671.          oldSQLReadOnly$ = GetIniKeyString(AppIni$, "SQL", "ReadOnly")
  672.      ELSE
  673.          oldParadoxUserName$ = ""
  674.          oldParadoxNetFilePath$ = ""
  675.          olddBaseFileSharingMethod$ = ""
  676.          oldSQLReadOnly$ = ""
  677.      END IF
  678.  
  679.      SetRestartDir GetSymbolValue("STF_CWDDIR")
  680.  
  681.     AddToBillboardList CUIDLL$, BILLBOARD_REG, "FBillboardDlgProc", 50
  682.     AddToBillboardList CUIDLL$, BILLBOARD_2, "FBillboardDlgProc", 50
  683.     AddToBillboardList CUIDLL$, BILLBOARD_3, "FBillboardDlgProc", 50       
  684.     AddToBillboardList CUIDLL$, BILLBOARD_4, "FBillboardDlgProc", 50
  685.  
  686.     CopyFilesInCopyList 
  687.  
  688.     ClearBillboardList
  689.  
  690. '' Don't version stamp or update INI or setup progman groups or register unless we're 
  691. '' installing APPROACH.EXE
  692.     IF GetListItem(CHECKSTATES$, APPFILES) = "ON" THEN
  693. '' Version stamp
  694.        IF GetSymbolValue("STF_MODE") <> "NODE" THEN            
  695.           IF szCompanyName$ = "" THEN
  696.              szCompanyName$ = " "
  697.           ENDIF
  698.           szData$ = CHR$(LEN(szUserName$)) + szUserName$ + CHR$(LEN(szCompanyName$)) + szCompanyName$
  699.           StampResource "Approach Files", "Approach Executable", DEST$, 6, 51, szData$, LEN(szData)
  700.        ENDIF
  701.    
  702.        IF GetSymbolValue("STF_MODE") <> "NETWORK" THEN
  703. '' Initialize uninitialized information into APPROACH.INI
  704.            IF oldParadoxUserName$ <> "" THEN
  705.               CreateIniKeyValue AppIni$, "Approach", "sParadoxUserName", oldParadoxUserName$, cmoNone
  706.            END IF
  707.            IF oldParadoxNetFilePath$ <> "" THEN
  708.                CreateIniKeyValue AppIni$, "Approach", "sParadoxNetFilePath", oldParadoxNetFilePath$, cmoNone
  709.            END IF
  710.            IF olddBaseFileSharingMethod$ <> "" THEN
  711.                CreateIniKeyValue AppIni$, "Approach", "sdBaseFileSharingMethod", olddBaseFileSharingMethod$, cmoNone
  712.            END IF
  713.            IF oldSQLReadOnly$ <> "" THEN
  714.                CreateIniKeyValue AppIni$, "SQL", "ReadOnly", oldSQLReadOnly$, cmoNone     
  715.            END IF
  716.       
  717. '' Change sParadoxSort to match current language
  718.            IF GetIniKeyString(AppIni$, "Approach", "sParadoxSort") = "" THEN
  719.                  language$ = UCASE$(GetIniKeyString("WIN.INI", "intl", "sLanguage"))
  720.                SELECT CASE language$
  721.                    CASE "ENU"
  722.                        CreateIniKeyValue AppIni$, "Approach", "sParadoxSort", "ASCII", cmoNone
  723.                    CASE "NOR", "DAN"
  724.                        CreateIniKeyValue AppIni$, "Approach", "sParadoxSort", "NORDAN", cmoNone                
  725.                    CASE "SVE", "FIN"
  726.                        CreateIniKeyValue AppIni$, "Approach", "sParadoxSort", "SWEDFIN", cmoNone                
  727.                    CASE ELSE
  728.                        CreateIniKeyValue AppIni$, "Approach", "sParadoxSort", "INTL", cmoNone
  729.                END SELECT    
  730.            END IF
  731.    
  732. '' icon path
  733.           CreateIniKeyValue AppIni$, "SmartIcons", "IconPath", DEST$+"\", cmoNone
  734.  
  735. '' Approach LOTUS.INI item
  736.           CreateIniKeyValue LotIni$, "Lotus Applications", "APPROACH", DEST$+"\APPROACH.EXE Lotus Approach", cmoNone
  737. '' Icon bar path & status bar path
  738. '          CreateIniKeyValue LotIni$, "Icon Palette", "Program Path", ICONBARDEST$, cmoNone
  739. '          CreateIniKeyValue LotIni$, "Status Bar", "Program Path", STATUSBARDEST$, cmoNone
  740. '
  741. '          IF (STATUSBARDEST$ = LOTUSAPPDIR$) OR (ICONBARDEST$ = LOTUSAPPDIR$) THEN
  742. '             IF GetSymbolValue("STF_MODE") = "NODE" THEN
  743. '                CreateIniKeyValue LotIni$, "Lotus Applications", "Net Common Directory", LOTUSAPPDIR$, cmoNone       
  744. '             ELSE
  745. '                CreateIniKeyValue LotIni$, "Lotus Applications", "Common Directory", LOTUSAPPDIR$, cmoNone       
  746. '             END IF
  747. '          END IF
  748. '       ELSE
  749. '          CreateIniKeyValue Dest$+"INSTALL.INI", "Save Section", "Server Common Directory", LOTUSAPPDIR$, cmoNone       
  750.        END IF
  751.                
  752. '' Create progman groups
  753.        IF GetListItem(CHECKSTATES$, APPFILES) = "ON" THEN
  754.            Lotus$ = GetString(LOTUSAPPS_NAME)
  755.              Approach$ = GetString(APPROACH_NAME)
  756.            CreateProgmanGroup Lotus$, "", cmoNone
  757.            ShowProgmanGroup  Lotus$, 1, cmoNone
  758.            IF GetSymbolValue("STF_MODE") = "NETWORK" THEN
  759.               CreateProgmanItem Lotus$, GetString(LICENSER_NAME), MakePath(LICENSEUTIL$,"licenser.exe"), "", cmoOverwrite
  760.            ELSEIF GetSymbolValue("STF_MODE") = "NODE" THEN
  761.               CreateProgmanItem Lotus$, Approach$, MakePath(GetSymbolValue("STF_SRCDIR"),"approach.exe"), ",,,,"+DEST$, cmoOverwrite
  762.               CreateProgmanItem Lotus$, GetString(APPROACH_README), "write.exe "+MakePath(GetSymbolValue("STF_SRCDIR"),"readme.wri"), "", cmoOverwrite
  763.            ELSE
  764.               CreateProgmanItem Lotus$, Approach$, MakePath(DEST$,"approach.exe"), "", cmoOverwrite
  765.               CreateProgmanItem Lotus$, GetString(APPROACH_README), "write.exe "+MakePath(DEST$,"readme.wri"), "", cmoOverwrite
  766.            END IF
  767.        END IF
  768.    
  769.    
  770. '' Register Approach -- delete any previous registration information, and add current info.
  771. REGISTER:
  772.         DeleteRegKey ".vew"
  773.         DeleteRegKey "ApproachView"
  774.         CreateRegKey ".vew"
  775.         CreateRegKeyValue ".vew", "ApproachView"
  776.    
  777.         CreateRegKey "ApproachView"
  778.        CreateRegKeyValue "ApproachView", "Approach View File"
  779.         CreateRegKeyValue "ApproachView\shell\print\command", MakePath(DEST$,"approach.exe")+" /p %1"
  780.         CreateRegKeyValue "ApproachView\shell\open\command", MakePath(DEST$,"approach.exe")+" %1"
  781.     END IF
  782.  
  783. ' Windows files 
  784. WINFILES:
  785.      IF RestartListEmpty() = 0 THEN
  786.         IF (GetWindowsMajorVersion() = 3) AND (GetWindowsMinorVersion() = 0) THEN
  787.              i% = DoMsgBox(GetString(ERROR_INUSE), GetString(STANDARD_CAPTION), MB_OK+MB_ICONHAND)
  788.          ELSE
  789. RESTART:
  790.              i% = DoMsgBox(GetString(ERROR_RESTART), GetString(STANDARD_CAPTION), MB_YESNO+MB_ICONHAND)
  791.              IF i% = IDYES THEN
  792.                  i% = ExitExecRestart()    
  793.                     ' If the installer is still running, there's a problem.  Windows may have already told them.
  794.                     GOTO RESTART
  795.               END IF
  796.          END IF
  797.      END IF
  798.                           
  799. QUIT:
  800.     ON ERROR GOTO ERRQUIT
  801.  
  802.     IF ERR = 0 THEN
  803.        IF GetSymbolValue("STF_MODE") = "NETWORK" THEN
  804.            dlg% = EXITNETWORKSUCCESS
  805.         ELSE 
  806.            dlg% = EXITSUCCESS
  807.         ENDIF
  808.     ELSEIF ERR = STFQUIT THEN
  809.         dlg% = EXITQUIT
  810.     ELSE
  811.         dlg% = EXITFAILURE
  812.     END IF
  813. QUITL1:
  814.     sz$ = UIStartDlg(CUIDLL$, dlg%, "FInfo1DlgProc", 0, "")
  815.     IF sz$ = "REACTIVATE" THEN
  816.         GOTO QUITL1
  817.     END IF
  818.     UIPop 1
  819.     END
  820.  
  821. ERRQUIT:
  822.     i% = DoMsgBox(GetString(ERROR_GENERAL), GetString(STANDARD_CAPTION), MB_OK+MB_TASKMODAL+MB_ICONHAND)
  823.     END
  824.  
  825.  
  826. OPTFILES2:
  827.      newopt$ = "CheckItemsOut"
  828.     sz$ = UIStartDlg(CUIDLL$, TEMPLATEOPTS, "FTemplateOptionsDlgProc", APPTEMPLATEHELP, HELPPROC$)
  829.  
  830.     IF sz$ = "CONTINUE" THEN
  831.         UIPop 1
  832.         IF CompareLists(newopt$, OPT2OPT$) <> 0 THEN
  833.                 CopyList OPT2OPT$, newopt$
  834.                 IF (GetListItem(OPT2OPT$, TEMPLATEREADME) = "OFF") AND (GetListItem(OPT2OPT$, SMALLBIZ) = "OFF") AND (GetListItem(OPT2OPT$, LARGEBIZ) = "OFF") THEN
  835.                     RemoveSymbol "IsMixed" + STR$(OPTFILES2)
  836.                     ReplaceListItem CHECKSTATES$, OPTFILES2, "OFF"
  837.                 ELSEIF (GetListItem(OPT2OPT$, TEMPLATEREADME) = "ON") AND (GetListItem(OPT2OPT$, SMALLBIZ) = "ON") AND (GetListItem(OPT2OPT$, LARGEBIZ) = "ON") THEN
  838.                     RemoveSymbol "IsMixed" + STR$(OPTFILES2)
  839.                     ReplaceListItem CHECKSTATES$, OPTFILES2, "ON"
  840.                 ELSE
  841.                     SetSymbolValue "IsMixed" + STR$(OPTFILES2), "MIXED"
  842.                     ReplaceListItem CHECKSTATES$, OPTFILES2, "MIXED"
  843.                 END IF
  844.             RecalcOptFiles OPTFILES2
  845.             SetDriveStatus
  846.         END IF
  847.         GOTO CUSTINST
  848.     ELSEIF sz$ = "REACTIVATE" THEN
  849.         RecalcPath
  850.         SetDriveStatus
  851.         GOTO OPTFILES2
  852.     ELSEIF sz$ = "BUTTON" THEN
  853.         IF CompareLists(newopt$, OPT2OPT$) <> 0 THEN
  854.                 CopyList OPT2OPT$, newopt$
  855.                 IF (GetListItem(OPT2OPT$, TEMPLATEREADME) = "OFF") AND (GetListItem(OPT2OPT$, SMALLBIZ) = "OFF") AND (GetListItem(OPT2OPT$, LARGEBIZ) = "OFF") THEN
  856.                     RemoveSymbol "IsMixed" + STR$(OPTFILES2)
  857.                     ReplaceListItem CHECKSTATES$, OPTFILES2, "OFF"
  858.                 ELSEIF (GetListItem(OPT2OPT$, TEMPLATEREADME) = "ON") AND (GetListItem(OPT2OPT$, SMALLBIZ) = "ON") AND (GetListItem(OPT2OPT$, LARGEBIZ) = "ON") THEN
  859.                     RemoveSymbol "IsMixed" + STR$(OPTFILES2)
  860.                     ReplaceListItem CHECKSTATES$, OPTFILES2, "ON"
  861.                 ELSE
  862.                     SetSymbolValue "IsMixed" + STR$(OPTFILES2), "MIXED"
  863.                     ReplaceListItem CHECKSTATES$, OPTFILES2, "MIXED"
  864.                 END IF
  865.             RecalcOptFiles OPTFILES2
  866.             SetDriveStatus
  867.         END IF
  868.         GOTO OPTFILES2
  869.     ELSEIF sz$ = "EXIT" THEN
  870.         DoAskQuitDlg
  871.         GOTO OPTFILES2
  872.     ELSE
  873.         UIPop 1
  874.         GOTO CUSTINST_LOOP
  875.     END IF
  876.  
  877.  
  878. TOOBIGCUST:
  879.     sz$ = UIStartDlg(CUIDLL$, TOOBIGCUST, "FInfo1DlgProc", 0, "")
  880.     IF sz$ = "REACTIVATE" THEN
  881.         RecalcPath
  882.         SetDriveStatus
  883.         GOTO TOOBIGCUST
  884.     END IF
  885.     UIPop 1
  886.     RETURN
  887.  
  888. TOOBIGFULL:
  889.     sz$ = UIStartDlg(CUIDLL$, TOOBIGFULL, "FInfo1DlgProc", 0, "")
  890.     IF sz$ = "REACTIVATE" THEN
  891.         RecalcPath
  892.         SetDriveStatus
  893.         GOTO TOOBIGFULL
  894.     END IF
  895.     UIPop 1
  896.     RETURN
  897.  
  898.  
  899. TOOBIGMIN:
  900.     sz$ = UIStartDlg(CUIDLL$, TOOBIGMIN, "FInfo1DlgProc", 0, "")
  901.     IF sz$ = "REACTIVATE" THEN
  902.         RecalcPath
  903.         SetDriveStatus
  904.         GOTO TOOBIGMIN
  905.     END IF
  906.     UIPop 1
  907.     RETURN
  908.  
  909. SUB CreateOptDir (ftype%, DEST$) STATIC
  910.     IF (GetListItem(CHECKSTATES$, ftype%) <> "OFF") AND (GetListItem(CHECKSTATES$, ftype%) <> "DISABLED") THEN
  911.         SrcDir$ = GetSymbolValue("STF_SRCDIR")
  912.          CreateDir DEST$, cmoNone
  913.         IF (ftype% = APPFILES) THEN
  914. '            IF (GetSymbolValue("STF_MODE") <> "NODE") THEN
  915. '               CreateDir LOTUSAPPDIR$, cmoNone
  916. '            ENDIF
  917.             IF (GetSymbolValue("STF_MODE") = "NETWORK") THEN
  918.                IF (FValidFATDir(LICENSEDEST$+"\APPROACH.V21") = 0) THEN
  919.                   CreateDir LICENSEDEST$+"APPROACH.V21", cmoNone
  920.                ELSE
  921.                   CreateDir LICENSEDEST$+"\APPROACH.V21", cmoNone
  922.                ENDIF
  923.                CreateDir LICENSEUTIL$, cmoNone
  924.             ENDIF
  925.         ELSEIF ftype% = OPTFILES1 THEN
  926.                 CreateDir DEST$+"\"+GetString(EXAMPLES_DIR), cmoNone
  927.         ELSEIF ftype% = OPTFILES2 THEN
  928.               IF (GetListItem(OPT2OPT$, TEMPLATEREADME) = "ON") OR (GetListItem(OPT2OPT$, SMALLBIZ) = "ON") OR (GetListItem(OPT2OPT$, LARGEBIZ) = "ON") THEN
  929.                      CreateDir DEST$+"\"+GetString(TEMPLATES_DIR), cmoNone
  930.                  ENDIF
  931.                 IF (GetListItem(OPT2OPT$, SMALLBIZ) = "ON") THEN
  932.                      CreateDir DEST$+"\"+GetString(TEMPLATES_DIR)+"\"+GetString(SMALLBIZ_DIR), cmoNone
  933.                 ENDIF
  934.                 IF (GetListItem(OPT2OPT$, LARGEBIZ) = "ON") THEN
  935.                     CreateDir DEST$+"\"+GetString(TEMPLATES_DIR)+"\"+GetString(LARGEBIZ_DIR), cmoNone
  936.                 ENDIF
  937.         END IF
  938.         SrcDir$ = ""
  939.     END IF
  940. END SUB
  941.  
  942.  
  943. '**
  944. '** Purpose:
  945. '**     Adds the specified option files to the copy list.
  946. '** Arguments:
  947. '**     ftype%  - type of files to add, one of the following:
  948. '**             APPFILES, OPTFILES1, OPTFILES2
  949. '** Returns:
  950. '**     none.
  951. '*************************************************************************
  952. SUB AddOptFilesToCopyList (ftype%) STATIC
  953.  
  954.     IF (GetListItem(CHECKSTATES$, ftype%) <> "OFF") AND (GetListItem(CHECKSTATES$, ftype%) <> "DISABLED") THEN
  955.         SrcDir$ = GetSymbolValue("STF_SRCDIR")           
  956.         IF ftype% = APPFILES THEN
  957.  
  958. ' HACK ALERT!  We need to copy shell.dll and ver.dll FIRST, so that we can be 
  959. ' sure they they've actually been copied.  We will then use them during the 
  960. ' following lines.
  961.             IF GetSymbolValue("STF_MODE") = "NETWORK" THEN
  962.                    AddSectionFilesToCopyList "Ver/Shell", SrcDir$, DEST$
  963.             ELSE
  964.                    IF IsWindowsShared() = 0 THEN
  965.                        AddSectionFilesToCopyList "Ver/Shell", SrcDir$, GetWindowsSysDir()
  966.                    ELSE
  967.                        AddSectionFilesToCopyList "Ver/Shell", SrcDir$, GetWindowsDir()
  968.                    ENDIF
  969.             ENDIF
  970.  
  971.             AddSectionFilesToCopyList "Approach Files", SrcDir$, DEST$
  972.             IF GetSymbolValue("STF_MODE") = "NODE" THEN
  973.                AddSectionFilesToCopyList "Design Iconbars", SrcDir$+"ICONS\DESGNICO\", DEST$+"\ICONS\DESGNICO"
  974.                AddSectionFilesToCopyList "Browse Iconbars", SrcDir$+"ICONS\BROWSICO\", DEST$+"\ICONS\BROWSICO"
  975.                AddSectionFilesToCopyList "Find Iconbars", SrcDir$+"ICONS\FINDICO\", DEST$+"\ICONS\FINDICO"
  976.                AddSectionFilesToCopyList "Preview Iconbars", SrcDir$+"ICONS\PREVICO\", DEST$+"\ICONS\PREVICO"
  977.             ELSE
  978.                AddSectionFilesToCopyList "Lotus Icon Bar Files", SrcDir$, DEST$
  979.                AddSectionFilesToCopyList "Lotus Status Bar Files", SrcDir$, DEST$
  980.                AddSectionFilesToCopyList "Design Iconbars", SrcDir, DEST$+"\ICONS\DESGNICO"
  981.                AddSectionFilesToCopyList "Browse Iconbars", SrcDir, DEST$+"\ICONS\BROWSICO"
  982.                AddSectionFilesToCopyList "Find Iconbars", SrcDir, DEST$+"\ICONS\FINDICO"
  983.                AddSectionFilesToCopyList "Preview Iconbars", SrcDir, DEST$+"\ICONS\PREVICO"
  984.             ENDIF
  985.  
  986. '            IF (GetSymbolValue("STF_MODE") <> "NODE") OR (ICONBARDEST$ <> LOTUSAPPDIR$)
  987. '               AddSectionFilesToCopyList "Lotus Icon Bar Files", SrcDir$, ICONBARDEST$
  988. '            ENDIF
  989.  
  990. '            IF (GetSymbolValue("STF_MODE") <> "NODE") OR (STATUSBARDEST$ <> LOTUSAPPDIR$)
  991. '               AddSectionFilesToCopyList "Lotus Status Bar Files", SrcDir$, STATUSBARDEST$
  992. '            ENDIF
  993.                
  994.             IF GetSymbolValue("STF_MODE") = "NETWORK" THEN
  995.                    AddSectionFilesToCopyList "Approach Initialization", SrcDir$, DEST$
  996.                    AddSectionFilesToCopyList "Windows Help", SrcDir$, DEST$
  997.                    AddSectionFilesToCopyList "Windows", SrcDir$, DEST$
  998.                AddSectionFilesToCopyList "Installation", SrcDir$, DEST$
  999.                AddSectionFilesToCopyList "Lotus Licenser Files", SrcDir$, LICENSEUTIL$
  1000.             ELSE
  1001.                    AddSectionFilesToCopyList "Approach Initialization", SrcDir$, GetWindowsDir()
  1002.                AddSectionFilesToCopyList "Windows Help", SrcDir$, GetWindowsDir()
  1003.                    IF IsWindowsShared() = 0 THEN
  1004.                        AddSectionFilesToCopyList "Windows", SrcDir$, GetWindowsSysDir()
  1005.                    ELSE
  1006.                        AddSectionFilesToCopyList "Windows", SrcDir$, GetWindowsDir()
  1007.                    ENDIF
  1008.             ENDIF
  1009.  
  1010.             IF GetSymbolValue("STF_MODE") = "NORMAL" THEN
  1011.                AddSectionFilesToCopyList "Workstation File", SrcDir$, DEST$
  1012.             ENDIF
  1013.         ELSEIF ftype% = OPTFILES1 THEN
  1014.             IF GetSymbolValue("STF_MODE") = "NODE" THEN
  1015.                AddSectionFilesToCopyList "Tutorial", SrcDir$+GetString(EXAMPLES_DIR), DEST$+"\"+GetString(EXAMPLES_DIR)
  1016.             ELSE
  1017.                AddSectionFilesToCopyList "Tutorial", SrcDir$, DEST$+"\"+GetString(EXAMPLES_DIR)
  1018.             END IF
  1019.                MakeListFromSectionKeys "Dummy", "Tutorial"
  1020.                 IF GetListLength("Dummy") = 0 THEN
  1021.                     ReplaceListItem CHECKSTATES$, ftype%, "DISABLED"
  1022.                 ENDIF
  1023.         ELSEIF ftype% = OPTFILES2 THEN
  1024.               IF (GetListItem(CHECKSTATES$, ftype%) = "ON") OR (GetListItem(OPT2OPT$, TEMPLATEREADME) = "ON") THEN
  1025.                 IF GetSymbolValue("STF_MODE") = "NODE" THEN
  1026.                        AddSectionFilesToCopyList "Template Readme", SrcDir$+GetString(TEMPLATES_DIR), DEST$+"\"+GetString(TEMPLATES_DIR)
  1027.                 ELSE
  1028.                        AddSectionFilesToCopyList "Template Readme", SrcDir$, DEST$+"\"+GetString(TEMPLATES_DIR)
  1029.                 ENDIF
  1030.                      MakeListFromSectionKeys "Dummy", "Template Readme"
  1031.                      IF GetListLength("Dummy") = 0 THEN
  1032.                          ReplaceListItem OPT2OPT$, TEMPLATEREADME, "DISABLED"
  1033.                      ENDIF
  1034.                 ENDIF
  1035.                 IF (GetListItem(CHECKSTATES$, ftype%) = "ON") OR (GetListItem(OPT2OPT$, SMALLBIZ) = "ON") THEN
  1036.                 IF GetSymbolValue("STF_MODE") = "NODE" THEN
  1037.                    AddSectionFilesToCopyList "Smallbiz Templates", SrcDir$+GetString(TEMPLATES_DIR)+"\"+GetString(SMALLBIZ_DIR), DEST$+"\"+GetString(TEMPLATES_DIR)+"\"+GetString(SMALLBIZ_DIR)
  1038.                 ELSE
  1039.                    AddSectionFilesToCopyList "Smallbiz Templates", SrcDir$, DEST$+"\"+GetString(TEMPLATES_DIR)+"\"+GetString(SMALLBIZ_DIR)
  1040.                 ENDIF
  1041.                      MakeListFromSectionKeys "Dummy", "Smallbiz Templates"
  1042.                      IF GetListLength("Dummy") = 0 THEN
  1043.                          ReplaceListItem OPT2OPT$, SMALLBIZ, "DISABLED"
  1044.                      ENDIF
  1045.                 ENDIF
  1046.                 IF (GetListItem(CHECKSTATES$, ftype%) = "ON") OR (GetListItem(OPT2OPT$, LARGEBIZ) = "ON") THEN
  1047.                 IF GetSymbolValue("STF_MODE") = "NODE" THEN
  1048.                    AddSectionFilesToCopyList "Largebiz Templates", SrcDir$+GetString(TEMPLATES_DIR)+"\"+GetString(LARGEBIZ_DIR), DEST$+"\"+GetString(TEMPLATES_DIR)+"\"+GetString(LARGEBIZ_DIR)
  1049.                 ELSE
  1050.                    AddSectionFilesToCopyList "Largebiz Templates", SrcDir$, DEST$+"\"+GetString(TEMPLATES_DIR)+"\"+GetString(LARGEBIZ_DIR)
  1051.                  ENDIF
  1052.                      MakeListFromSectionKeys "Dummy", "Largebiz Templates"
  1053.                      IF GetListLength("Dummy") = 0 THEN
  1054.                          ReplaceListItem OPT2OPT$, LARGEBIZ, "DISABLED"
  1055.                      ENDIF
  1056.                 ENDIF
  1057.                 IF (GetListItem(OPT2OPT$, TEMPLATEREADME) = "DISABLED") AND (GetListItem(OPT2OPT$, SMALLBIZ) = "DISABLED") AND (GetListItem(OPT2OPT$, LARGEBIZ) = "DISABLED") THEN
  1058.                      ReplaceListItem CHECKSTATES$, ftype%, "DISABLED"
  1059.                 ENDIF
  1060.         ELSEIF ftype% = OPTFILES3 THEN
  1061.             AddSectionFilesToCopyList "Paradox", SrcDir$, DEST$
  1062.                MakeListFromSectionKeys "Dummy", "Paradox"
  1063.                 IF GetListLength("Dummy") = 0 THEN
  1064.                     ReplaceListItem CHECKSTATES$, ftype%, "DISABLED"
  1065.                 ENDIF
  1066.         ELSEIF ftype% = OPTFILES4 THEN
  1067.             AddSectionFilesToCopyList "Oracle", SrcDir$, DEST$
  1068.                MakeListFromSectionKeys "Dummy", "Oracle"
  1069.                 IF GetListLength("Dummy") = 0 THEN
  1070.                     ReplaceListItem CHECKSTATES$, ftype%, "DISABLED"
  1071.                 ENDIF
  1072.         ELSEIF ftype% = OPTFILES5 THEN
  1073.             AddSectionFilesToCopyList "SQL Server", SrcDir$, DEST$
  1074.                MakeListFromSectionKeys "Dummy", "SQL Server"
  1075.                 IF GetListLength("Dummy") = 0 THEN
  1076.                     ReplaceListItem CHECKSTATES$, ftype%, "DISABLED"
  1077.                 ENDIF
  1078.         ELSEIF ftype% = OPTFILES6 THEN
  1079.             AddSectionFilesToCopyList "ODBC", SrcDir$, DEST$
  1080.                MakeListFromSectionKeys "Dummy", "ODBC"
  1081.                 IF GetListLength("Dummy") = 0 THEN
  1082.                     ReplaceListItem CHECKSTATES$, ftype%, "DISABLED"
  1083.                 ENDIF
  1084.         END IF
  1085.         SrcDir$ = ""
  1086.     END IF
  1087. END SUB
  1088.  
  1089.  
  1090. '**
  1091. '** Purpose:
  1092. '**     Recalculates disk space for the given option files and sets
  1093. '**      the status info symbol "StatusItemsText".
  1094. '** Arguments:
  1095. '**     ftype% - type of files to add, one of the following:
  1096. '**             APPFILES, OPTFILES1, OPTFILES2, OPTFILES3, OPTFILES4
  1097. '** Returns:
  1098. '**     none.
  1099. '*************************************************************************
  1100. SUB RecalcOptFiles (ftype%) STATIC
  1101.     CursorSave% = ShowWaitCursor()
  1102.     ClearCopyList
  1103.     AddOptFilesToCopyList ftype%
  1104.  
  1105.     fExtra% = 0
  1106.     IF ftype% = APPFILES THEN
  1107.         ListSym$ = APPNEEDS$
  1108.         IF GetListItem(CHECKSTATES$, APPFILES) = "ON" THEN
  1109.             ''Add extra cost to Windows drive for ini/progman, etc.
  1110.             ndrive% = ASC(ucase$(WINDRIVE$)) - ASC("A") + 1
  1111.             ReplaceListItem EXTRACOSTS$, ndrive%, "10240"
  1112.             fExtra% = 1
  1113.         END IF
  1114.     ELSEIF ftype% = OPTFILES1 THEN
  1115.         ListSym$ = OPT1NEEDS$
  1116.     ELSEIF ftype% = OPTFILES2 THEN
  1117.         ListSym$ = OPT2NEEDS$
  1118.     ELSEIF ftype% = OPTFILES3 THEN
  1119.         ListSym$ = OPT3NEEDS$
  1120.     ELSEIF ftype% = OPTFILES4 THEN
  1121.         ListSym$ = OPT4NEEDS$
  1122.     ELSEIF ftype% = OPTFILES5 THEN
  1123.         ListSym$ = OPT5NEEDS$
  1124.     ELSEIF ftype% = OPTFILES6 THEN
  1125.         ListSym$ = OPT6NEEDS$
  1126.     END IF
  1127.  
  1128.     StillNeed& = GetCopyListCost(EXTRACOSTS$, ListSym$, "")
  1129.  
  1130.     cost& = 0
  1131.     FOR u% = 1 TO 26 STEP 1
  1132.         cost&  = cost& + VAL(GetListItem(ListSym$, u%))
  1133.     NEXT u%
  1134.     ReplaceListItem STATUSTEXT$, ftype%, STR$(cost& / 1024) + GetString(KB_STRING)
  1135.  
  1136.     IF StillNeed& > 0 THEN
  1137.         ReplaceListItem BIGLIST$, ftype%, "YES"
  1138.     ELSE
  1139.         ReplaceListItem BIGLIST$, ftype%, ""
  1140.     END IF
  1141.  
  1142.     IF fExtra% THEN
  1143.         ReplaceListItem EXTRACOSTS$, ndrive%, "0"
  1144.     END IF
  1145.     RestoreCursor CursorSave%
  1146.     ListSym$ = ""
  1147. END SUB
  1148.  
  1149.  
  1150. '**
  1151. '** Purpose:
  1152. '**     Recalculates disk space and sets option status info according
  1153. '**     to the current destination path.
  1154. '** Arguments:
  1155. '**     none.
  1156. '** Returns:
  1157. '**     none.
  1158. '*************************************************************************
  1159. SUB RecalcPath STATIC
  1160.  
  1161.     CursorSave% = ShowWaitCursor()
  1162.  
  1163.      FOR v% = APPFILES TO NUMFILETYPES STEP 1
  1164.         RecalcOptFiles v%
  1165.      NEXT v%
  1166.     RestoreCursor CursorSave%
  1167. END SUB
  1168.  
  1169.  
  1170. '**
  1171. '** Purpose:
  1172. '**     Sets drive status info according to latest disk space calcs.
  1173. '** Arguments:
  1174. '**     none.
  1175. '** Returns:
  1176. '**     none.
  1177. '*************************************************************************
  1178. SUB SetDriveStatus STATIC
  1179.  
  1180.      k$ = GetString(KB_STRING)
  1181.     drive$ = MID$(DEST$, 1, 1)
  1182.     ndrive% = ASC(ucase$(drive$)) - ASC("A") + 1
  1183.     cost& = VAL(GetListItem(APPNEEDS$, ndrive%)) + VAL(GetListItem(OPT1NEEDS$, ndrive%)) + VAL(GetListItem(OPT2NEEDS$, ndrive%)) + VAL(GetListItem(OPT3NEEDS$, ndrive%)) + VAL(GetListItem(OPT4NEEDS$, ndrive%)) + VAL(GetListItem(OPT5NEEDS$, ndrive%)) 
  1184.     cost& = cost& + VAL(GetListItem(OPT6NEEDS$, ndrive%))
  1185.     free& = GetFreeSpaceForDrive(drive$)
  1186.      IF cost& > free& THEN
  1187.          instDiskFull% = 1
  1188.      ELSE
  1189.          instDiskFull% = 0
  1190.      ENDIF
  1191.     ReplaceListItem DRIVETEXT$, 1, drive$ + ":"
  1192.     ReplaceListItem DRIVETEXT$, 2, STR$(cost& / 1024) + k$
  1193.     ReplaceListItem DRIVETEXT$, 3, STR$(free& / 1024) + k$
  1194.  
  1195.     IF drive$ = WINDRIVE$ THEN
  1196.         ReplaceListItem DRIVETEXT$, 4, ""
  1197.         ReplaceListItem DRIVETEXT$, 5, ""
  1198.         ReplaceListItem DRIVETEXT$, 6, ""
  1199.     ELSE
  1200.         ndrive% = ASC(ucase$(WINDRIVE$)) - ASC("A") + 1
  1201.         cost& = VAL(GetListItem(APPNEEDS$, ndrive%)) + VAL(GetListItem(OPT1NEEDS$, ndrive%)) + VAL(GetListItem(OPT2NEEDS$, ndrive%)) + VAL(GetListItem(OPT3NEEDS$, ndrive%)) + VAL(GetListItem(OPT4NEEDS$, ndrive%)) + VAL(GetListItem(OPT5NEEDS$, ndrive%))
  1202.         cost& = cost& + VAL(GetListItem(OPT6NEEDS$, ndrive%))
  1203.         IF cost& = 0 THEN
  1204.                 winDiskFull% = 0        
  1205.             ReplaceListItem DRIVETEXT$, 4, ""
  1206.             ReplaceListItem DRIVETEXT$, 5, ""
  1207.             ReplaceListItem DRIVETEXT$, 6, ""
  1208.         ELSE
  1209.             free& = GetFreeSpaceForDrive(WINDRIVE$)
  1210.             ReplaceListItem DRIVETEXT$, 4, WINDRIVE$ + ":"
  1211.             ReplaceListItem DRIVETEXT$, 5, STR$(cost& / 1024) + k$
  1212.             ReplaceListItem DRIVETEXT$, 6, STR$(free& / 1024) + k$
  1213.                 IF cost& > free& THEN
  1214.                     winDiskFull% = 1       
  1215.                  ELSE
  1216.                     winDiskFull% = 0
  1217.                 ENDIF
  1218.         END IF
  1219.     END IF
  1220. END SUB
  1221.  
  1222.  
  1223. '**
  1224. '** Purpose:
  1225. '**     Appends a file name to the end of a directory path,
  1226. '**     inserting a backslash character as needed.
  1227. '** Arguments:
  1228. '**     szDir$  - full directory path (with optional ending "\")
  1229. '**     szFile$ - filename to append to directory
  1230. '** Returns:
  1231. '**     Resulting fully qualified path name.
  1232. '*************************************************************************
  1233. FUNCTION MakePath (szDir$, szFile$) STATIC AS STRING
  1234.     IF szDir$ = "" THEN
  1235.         MakePath = szFile$
  1236.     ELSEIF szFile$ = "" THEN
  1237.         MakePath = szDir$
  1238.     ELSEIF MID$(szDir$, LEN(szDir$), 1) = "\" THEN
  1239.         MakePath = szDir$ + szFile$
  1240.     ELSE
  1241.         MakePath = szDir$ + "\" + szFile$
  1242.     END IF
  1243. END FUNCTION
  1244.  
  1245. '**
  1246. '** Purpose:
  1247. '**     Compares two lists.
  1248. '** Arguments:
  1249. '**     szList1$, szList2$ - List names
  1250. '** Returns:
  1251. '**     The index where the lists differ, or 0 if they are the same. 
  1252. '*************************************************************************
  1253. FUNCTION CompareLists(szList1$, szList2$) STATIC AS INTEGER
  1254.     list1Len% = GetListLength(szList1)
  1255.      list2Len% = GetListLength(szList2)
  1256.      IF (list1Len% < list2Len%) THEN
  1257.          CompareLists = list1Len% + 1
  1258.      ELSEIF (list1Len% > list2Len%) THEN
  1259.          CompareLists = list2Len% + 1
  1260.      ELSE
  1261.          i% = list1Len
  1262.           WHILE GetListItem(szList1$, i%) = GetListItem(szList2$, i%)
  1263.             i% = i% - 1
  1264.                 IF i% = 0 THEN
  1265.                 EXIT WHILE
  1266.                 END IF
  1267.           WEND
  1268.           CompareLists = i%
  1269.      END IF
  1270. END FUNCTION
  1271.  
  1272.  
  1273. '**
  1274. '** Purpose:
  1275. '**     Copies szList2 into szList1.
  1276. '** Arguments:
  1277. '**     szList1$, szList2$ - List names
  1278. '*************************************************************************
  1279. SUB CopyList(szList1$, szList2$) STATIC
  1280.     RemoveSymbol(szList1)
  1281.      FOR w% = 1 TO GetListLength(szList2) STEP 1
  1282.          AddListItem szList1$, GetListItem(szList2$, w%) 
  1283.     NEXT w%
  1284. END SUB
  1285.  
  1286.  
  1287. SUB DoBadPathDlg STATIC
  1288. BADPATH_LOOP:
  1289.        sz$ = UIStartDlg(CUIDLL$, BADPATH, "FInfo1DlgProc", 0, "") 
  1290.     IF sz$ = "CONTINUE" THEN
  1291.        UIPop 1
  1292.     ELSE
  1293.        GOTO BADPATH_LOOP
  1294.     ENDIF
  1295. END SUB
  1296.  
  1297.  
  1298. SUB DoAskQuitDlg STATIC
  1299.     sz$ = UIStartDlg(CUIDLL$, ASKQUIT, "FQuitDlgProc", 0, "")
  1300.      WHILE sz$ = "REACTIVATE"
  1301.         sz$ = UIStartDlg(CUIDLL$, ASKQUIT, "FQuitDlgProc", 0, "")
  1302.      WEND
  1303.  
  1304.     IF sz$ = "EXIT" THEN
  1305.         UIPopAll
  1306.         ERROR STFQUIT
  1307.     ELSE
  1308.         UIPop 1
  1309.     END IF
  1310. END SUB
  1311.  
  1312.  
  1313. SUB DoWelcomeDlg(szUserName$, szCompanyName$) STATIC
  1314. WELCOME_LOOP:
  1315.     SetSymbolValue "WelcomeUserName", szUserName$
  1316.     SetSymbolValue "WelcomeCompanyName", szCompanyName$
  1317.  
  1318.     sz$ = UIStartDlg(CUIDLL$, WELCOME, "FInfoDlgProc", APPHELPNOBACK, HELPPROC$)
  1319.  
  1320.     IF sz$ = "CONTINUE" THEN
  1321. ' Make sure they entered a user name
  1322.         IF LEN(RTRIM$(LTRIM$(GetSymbolValue("WelcomeUserName")))) = 0 THEN
  1323. CDBADNAME_LOOP:
  1324.            sz2$ = UIStartDlg(CUIDLL$, CDBADNAME, "FInfo1DlgProc", 0, "")
  1325.            IF sz2$ = "REACTIVATE" THEN
  1326.               GOTO CDBADNAME_LOOP
  1327.            END IF
  1328.            UIPop 1
  1329.            GOTO WELCOME_LOOP
  1330.         ELSE
  1331. VERIFY_NAMES:
  1332.            sz2$ = UIStartDlg(CUIDLL$, CDCONFIRMINFO, "FInfo0DlgProc", APPHELPYESNO, HELPPROC$)
  1333.            IF sz2$ = "CONTINUE" THEN
  1334.               szUserName$ = RTRIM$(LTRIM$(GetSymbolValue("WelcomeUserName")))
  1335.               szCompanyName$ = RTRIM$(LTRIM$(GetSymbolValue("WelcomeCompanyName")))
  1336.               UIPop 2
  1337.            ELSEIF sz2$ = "BACK" THEN
  1338.               UIPop 1
  1339.               GOTO WELCOME_LOOP
  1340.            ELSE
  1341.               GOTO VERIFY_NAMES
  1342.            END IF 
  1343.         END IF
  1344.     ELSEIF sz$ = "EXIT" THEN
  1345.         DoAskQuitDlg
  1346.         GOTO WELCOME_LOOP 
  1347.     ELSE 
  1348.        GOTO WELCOME_LOOP
  1349.     END IF
  1350. END SUB
  1351.  
  1352. FUNCTION ValidateNewPath(oldPath$, newPath$) STATIC AS INTEGER
  1353.    ''Validate new path.
  1354.    IF (FValidFATDir(newPath$) = 0) OR (OurIsDirWritable(newPath$) = 0) THEN
  1355.      DoBadPathDlg
  1356.      ValidateNewPath% = -1 
  1357.    ELSE   
  1358.       IF (oldPath$ <> newPath$) AND (oldPath$ <> newPath$+"\") AND (oldPath$+"\" <> newPath$) THEN
  1359.          ValidateNewPath% = 1
  1360.       ELSE
  1361.          ValidateNewPath% = 0
  1362.       END IF
  1363.    END IF
  1364. END FUNCTION
  1365.  
  1366. SUB ChangePathText(newPath$) STATIC
  1367.    DEST$ = newPath$
  1368. ''Truncate display if too long.
  1369.    IF LEN(newPath$) > 23 THEN
  1370.       ReplaceListItem DRIVETEXT$, 7, MID$(DEST$, 1, 23)+"..."
  1371.    ELSE
  1372.       ReplaceListItem DRIVETEXT$, 7, DEST$
  1373.    END IF
  1374. END SUB
  1375.     
  1376. FUNCTION OurIsDirWritable(newPath$) STATIC AS INTEGER
  1377.    SPLITPATH newPath$, drive$, dir$, filename$, ext$
  1378.  
  1379. ' Order very important here
  1380.    IF IsDirWritable(newPath$) <> 0 THEN
  1381.       OurIsDirWritable% = 1
  1382. '         For some reason, the FValidDrive must not be in the same OR clause as IsDriveValid below
  1383.    ELSEIF FValidDrive(drive$) = 0 THEN    
  1384.       OurIsDirWritable% = 0
  1385.    ELSEIF (DoesDirExist(newPath$) <> 0) OR (DoesFileExist(newPath$, femExists) <> 0) OR (IsDriveValid(drive$) = 0) THEN 
  1386.       OurIsDirWritable% = 0
  1387.    ELSE
  1388. WRITE_LOOP:
  1389.       oldDir$ = dir$   
  1390.       IF (IsDirWritable(drive$ + dir$) <> 0) THEN
  1391.          OurIsDirWritable% = 1
  1392.       ELSE 
  1393.          dir$ = MID$(dir$, 1, LEN(dir$)-1)
  1394.          IF dir$ <> oldDir$ THEN
  1395.             GOTO WRITE_LOOP
  1396.          ELSE
  1397.             OurIsDirWritable% = 0
  1398.          ENDIF
  1399.       ENDIF         
  1400.    ENDIF
  1401. END FUNCTION
  1402.  
  1403.