home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 2 / CD ACTUAL VOL 2.iso / programa / tunplus / tun / tunmail.ms_ / tunmail.ms
Encoding:
Text File  |  1995-09-15  |  28.9 KB  |  1,075 lines

  1. '**************************************************************************
  2. '*                   Tun MAIL Setup installation script
  3. '**************************************************************************
  4.  
  5. '$DEFINE DEBUG  ''Define for script development/debugging
  6.  
  7. '$INCLUDE 'setupapi.inc'
  8. '$INCLUDE 'msdetect.inc'
  9.  
  10.  
  11. GLOBAL ASKCUSTOM$
  12. GLOBAL FINDINSTTYPE$
  13. GLOBAL ENCRYPTDLG$ 
  14. GLOBAL COPYFILES$ 
  15. GLOBAL ENCRYPTFILES$ 
  16. GLOBAL CREATEINIFILES$ 
  17. GLOBAL ADDPATH$
  18. GLOBAL ASKTCPCONF$
  19. GLOBAL RUNTCPCONF$
  20. GLOBAL CREATEGROUPS$ 
  21. GLOBAL szSN$
  22. GLOBAL szAK$
  23. GLOBAL szLS$
  24. GLOBAL DEST$        ''Default destination directory.
  25.  
  26. '$INCLUDE 'setup.inc'
  27.  
  28. ''Dialog ID's
  29. CONST ASKQUIT      = 200
  30. CONST DESTPATH     = 300
  31. CONST EXITFAILURE  = 400
  32. CONST EXITQUIT     = 600
  33. CONST EXITSUCCESS  = 700
  34. CONST OPTIONS      = 800
  35. CONST APPHELP      = 900
  36. CONST DIREXIST     = 1000
  37. CONST CUSTINST     = 6200
  38. CONST TOOBIG       = 6300
  39. CONST BADPATH      = 6400
  40. CONST CDGETNAMEORG = 7500
  41. CONST CDBADORG     = 7800
  42. CONST MODELESS     = 5000
  43. CONST MODELESS2    = 5001
  44. CONST ASKUPDATE    = 5003
  45. CONST ASKYESNOBACK = 5004
  46. CONST ASKYESNO     = 5005
  47. CONST CDBADFILE    = 7200
  48. CONST GETSERIALNUM = 1100
  49. CONST WINPATH      = 1300
  50.  
  51. ''Bitmap ID
  52. CONST LOGO         = 1
  53.  
  54. ''File Types
  55. CONST APPFILES     = 1
  56. CONST OPTFILES1    = 2
  57. CONST OPTFILES2    = 3
  58. CONST OPTFILES3    = 4
  59. CONST OPTFILES4    = 5
  60. CONST CRYPTFILES   = 100
  61. CONST CRYPTCTL3D   = 101
  62.  
  63. ''Standard dialog button IDs 
  64. CONST IDOK         = 1
  65. CONST IDCANCEL     = 2
  66. CONST IDABORT      = 3
  67. CONST IDRETRY      = 4
  68. CONST IDIGNORE     = 5
  69. CONST IDYES        = 6
  70. CONST IDNO         = 7
  71.  
  72. GLOBAL DESTKER$   ''Default destination sub-directory.
  73. GLOBAL DESTMAIL$   ''Default destination sub-directory.
  74. GLOBAL DESTCOM$   ''Default destination sub-directory.
  75. GLOBAL SETUPPROG$   ''Full Path of DLL to be load.
  76. GLOBAL FILEPATH$    ''Temp File Path.
  77. GLOBAL WINDRIVE$    ''Windows drive letter.
  78. GLOBAL OPT1OPT$     ''Option selection from OptFiles1 option dialog.
  79. GLOBAL OPT2OPT$     ''Option selection from OptFiles1 option dialog.
  80. GLOBAL OPT3OPT$     ''Option selection from OptFiles1 option dialog.
  81. GLOBAL OPT4OPT$     ''Option selection from OptFiles1 option dialog.
  82.  
  83. ''CustInst list symbol names
  84. GLOBAL APPNEEDS$    ''Option list costs per drive
  85. GLOBAL OPT1NEEDS$
  86. GLOBAL OPT2NEEDS$
  87. GLOBAL OPT3NEEDS$
  88. GLOBAL OPT4NEEDS$
  89. GLOBAL EXTRACOSTS$  ''List of extra costs to add per drive
  90. GLOBAL BIGLIST$     ''List of option files cost calc results (boolean)
  91.  
  92. ''Dialog list symbol names
  93. GLOBAL CHECKSTATES$
  94. GLOBAL STATUSTEXT$
  95. GLOBAL DRIVETEXT$
  96. ''
  97.  
  98. GLOBAL DiskFileVersion$ 
  99. GLOBAL MasterFileVersion$ 
  100. GLOBAL TCPCONF$ 
  101. GLOBAL INSTALLEDKER%
  102. GLOBAL INSTALLKER%
  103. GLOBAL INSTALLEDMAIL%
  104. GLOBAL INSTALLMAIL%
  105. GLOBAL INSTALLCRYPT%
  106. GLOBAL INSTALLCTL3D%
  107. GLOBAL FINDTUNPATH%
  108.  
  109.  
  110.  
  111. DECLARE SUB RegisterCtl3d LIB "tunmail.dll"
  112. DECLARE SUB UnregisterCtl3d LIB "tunmail.dll"
  113. DECLARE SUB ShowMaximize LIB "tuncomm.dll" (frame%)
  114. DECLARE SUB SetCharSet LIB "tuncomm.dll" (szDir$,szFile$)
  115. DECLARE FUNCTION CustomSetup LIB "tuncomm.dll" (frame%,szDir$)
  116. DECLARE FUNCTION AddTunDir LIB "tuncomm.dll" (szDir$) AS INTEGER
  117. DECLARE FUNCTION FindExistingPath LIB "tuncomm.dll" (szDir$) AS INTEGER
  118. DECLARE FUNCTION EncryptFile LIB "tuncomm.dll" (szPath$, szSer$, szKey$, szLi$) AS INTEGER
  119. DECLARE FUNCTION AddLangMenu LIB "tuncomm.dll" (szPath$) AS INTEGER
  120. DECLARE FUNCTION CreatIniKer LIB "tuncomm.dll" (Path$,InstTcp%) AS INTEGER
  121. DECLARE FUNCTION CreatIniMail LIB "tuncomm.dll" (Path$) AS INTEGER
  122. DECLARE FUNCTION MyExitWindows LIB "tuncomm.dll" (nType%) AS INTEGER
  123.  
  124.      
  125. DECLARE FUNCTION IsInstalled (szSection$,szKey$,szFile$,szPath$) AS INTEGER
  126. DECLARE SUB AddOptFilesToCopyList (ftype%)
  127. DECLARE SUB RecalcOptFiles (ftype%)
  128. DECLARE SUB RecalcPath
  129. DECLARE SUB SetDriveStatus
  130. DECLARE FUNCTION MakePath (szDir$, szFile$) AS STRING
  131. DECLARE FUNCTION MakeString (i%) AS STRING
  132. DECLARE FUNCTION IsNewer (szVersion1$, szVersion2$) AS INTEGER
  133.  
  134.  
  135.  
  136. INIT:
  137.     CUIDLL$ = "tunmail.dll"            ''custom user interface dll
  138.     HELPPROC$ = "FHelpDlgProc"          ''Help dialog procedure
  139.  
  140. ''
  141. ''      Setup control screen:
  142. ''        Maximize Window, Add bitmap to CUIDLL, Set Window Title 
  143. ''
  144.     WndFrame% = HwndFrame()
  145.     ShowMaximize WndFrame%
  146.     SetBitmap CUIDLL$, LOGO
  147.     SetTitle "Tun MAIL - Setup"
  148.  
  149. ''
  150. ''      Read INF file
  151. ''
  152.     szInf$ = GetSymbolValue("STF_SRCINFPATH")
  153.     IF szInf$ = "" THEN
  154.     szInf$ = GetSymbolValue("STF_CWDDIR") + "tunmail.INF"
  155.     END IF
  156.     ReadInfFile szInf$
  157.  
  158. ''
  159. ''  Init Variables
  160. ''
  161.     WINDRIVE$ = MID$(GetWindowsDir, 1, 1)
  162.     IF DEST$ = "" THEN
  163.       DEST$ = WINDRIVE$ + ":\TUN"
  164.     ENDIF
  165.  
  166.     ''CustInst list symbols
  167.     CHECKSTATES$ = "CheckItemsState"
  168.     STATUSTEXT$  = "StatusItemsText"
  169.     DRIVETEXT$   = "DriveStatusText"
  170.     FOR i% = 1 TO 6 STEP 1
  171.     AddListItem CHECKSTATES$, "OFF"
  172.     NEXT i%
  173.     FOR i% = 1 TO 6 STEP 1
  174.     AddListItem STATUSTEXT$, ""
  175.     NEXT i%
  176.     FOR i% = 1 TO 7 STEP 1
  177.     AddListItem DRIVETEXT$, ""
  178.     NEXT i%
  179.     ReplaceListItem DRIVETEXT$, 7, DEST$
  180.  
  181.     ''Disk cost list symbols
  182.     APPNEEDS$   = "AppNeeds"
  183.     OPT1NEEDS$  = "Opt1Needs"
  184.     OPT2NEEDS$  = "Opt2Needs"
  185.     OPT3NEEDS$  = "Opt3Needs"
  186.     OPT4NEEDS$  = "Opt4Needs"
  187.     EXTRACOSTS$ = "ExtraCosts"
  188.     BIGLIST$    = "BigList"
  189.     FOR i% = 1 TO 6 STEP 1
  190.     AddListItem BIGLIST$, ""
  191.     NEXT i%
  192.     FOR i% = 1 TO 26 STEP 1
  193.     AddListItem EXTRACOSTS$, "0"
  194.     AddListItem OPT1NEEDS$, "0"
  195.     AddListItem OPT2NEEDS$, "0"
  196.     AddListItem OPT3NEEDS$, "0"
  197.     AddListItem OPT4NEEDS$, "0"
  198.     NEXT i%
  199.  
  200.     ''File Option Variables
  201.     OPT1OPT$ = "1"
  202.     OPT2OPT$ = "1"
  203.     OPT3OPT$ = "1"
  204.     OPT4OPT$ = "1"
  205.  
  206.     INSTALLEDKER% = 0 
  207.     
  208.     RecalcPath
  209.     SetDriveStatus
  210.     
  211.  
  212. '$IFDEF DEBUG
  213.     i% = SetSizeCheckMode(scmOnIgnore)    '' could use scmOff; def = scmOnFatal
  214. '$ENDIF ''DEBUG
  215.  
  216.     RegisterCtl3d
  217.  
  218. IF ASKCUSTOM$ <> "NO" THEN
  219. CUSTINST:
  220.     sz$ = UIStartDlg(CUIDLL$, CUSTINST, "FCustInstDlgProc", APPHELP, HELPPROC$)
  221.  
  222.     IF sz$ = "CONTINUE" THEN
  223.     ''Install only if it will fit.
  224.     FOR i% = 1 TO 6 STEP 1
  225.         IF GetListItem(BIGLIST$, i%) <> "" THEN
  226.         GOSUB TOOBIG
  227.         GOTO CUSTINST
  228.         END IF
  229.     NEXT i%
  230.     UIPop 1
  231.     GOTO INSTALL
  232.     ELSEIF sz$ = "PATH" THEN
  233.     GOTO GETPATH
  234.     ELSEIF sz$ = "CHK2" THEN
  235.     RecalcOptFiles OPTFILES1
  236.     SetDriveStatus
  237.     GOTO CUSTINST
  238.     ELSEIF sz$ = "CHK3" THEN
  239.     RecalcOptFiles OPTFILES2
  240.     SetDriveStatus
  241.     GOTO CUSTINST
  242.     ELSEIF sz$ = "CHK4" THEN
  243.     RecalcOptFiles OPTFILES3
  244.     IF INSTALLEDKER% <> 1 THEN
  245.       RecalcOptFiles OPTFILES4
  246.     ENDIF
  247.     SetDriveStatus
  248.     GOTO CUSTINST
  249.     ELSEIF sz$ = "REACTIVATE" THEN
  250.     RecalcPath
  251.     SetDriveStatus
  252.     GOTO CUSTINST
  253.     ELSE
  254.     GOSUB ASKQUIT
  255.     GOTO CUSTINST
  256.     END IF
  257. ENDIF
  258.  
  259. INSTALL:
  260.  
  261. ''
  262. ''      Init path sub-directory
  263. ''
  264.  
  265.     DESTKER$= MakePath( DEST$, "KERNELW")
  266.     DESTMAIL$= MakePath( DEST$, "MAIL")
  267.     DESTCOM$= MakePath( DEST$, "COMMON")
  268.  
  269. ''
  270. ''      Find type of installation
  271. ''
  272. IF GetListItem(CHECKSTATES$, OPTFILES3) = "ON" THEN
  273.   INSTALLKER% = 1
  274.   IF FINDINSTTYPE$ <> "NO" THEN
  275.  
  276.     FILEPATH$= MakePath( DESTKER$, "TUNTCPIP.DLL")
  277.     IF DoesFileExist ( FILEPATH$, femExits) = 1 THEN
  278.       MasterFileVersion$ = GetSectionKeyVersion("KernelFiles","TUNTCPIP.DLL")
  279.       DiskFileVersion$ = GetVersionOfFile( FILEPATH$)
  280.       INSTALLEDKER% = IsNewer( DiskFileVersion$, MasterFileVersion$) 
  281.     ENDIF
  282.  
  283.     IF INSTALLEDKER% = 1 THEN
  284.       SetSymbolValue "TitleYesNoBack", "Update"
  285.       SetSymbolValue "MessageYesNoBack", "The same version of Tun KERNEL has been found. Do you want to overwrite it ?" 
  286. INSK1:
  287.       sz$ = UIStartDlg(CUIDLL$, ASKYESNOBACK, "FAskYesNoBackDlgProc", 0, "")
  288.       UIPop 1
  289.       IF sz$ = "YES" THEN
  290.     INSTALLKER% = 1 
  291.       ELSEIF sz$ = "BACK" THEN
  292.     GOTO CUSTINST 
  293.       ELSEIF sz$ = "REACTIVATE" THEN
  294.         GOTO INSK1
  295.       ELSE
  296.     INSTALLKER% = 0
  297.       ENDIF
  298.     ELSEIF INSTALLEDKER% = 2 THEN
  299.       SetSymbolValue "TitleYesNoBack", "Update"
  300.       SetSymbolValue "MessageYesNoBack", "A previous version of Tun KERNEL has been found. Do you want to overwrite it ?" 
  301. INSK2:
  302.       sz$ = UIStartDlg(CUIDLL$, ASKYESNOBACK, "FAskYesNoBackDlgProc", 0, "")
  303.       UIPop 1
  304.       IF sz$ = "YES" THEN
  305.     INSTALLKER% = 2 
  306.       ELSEIF sz$ = "BACK" THEN
  307.     GOTO CUSTINST 
  308.       ELSEIF sz$ = "REACTIVATE" THEN
  309.         GOTO INSK2
  310.       ELSE
  311.     INSTALLKER% = 0
  312.       ENDIF
  313.     ELSE
  314.       INSTALLKER% = 1
  315.     ENDIF
  316.   ENDIF
  317. ELSE
  318.   INSTALLKER% = 0
  319. ENDIF
  320.  
  321. INSTALLEDMAIL% = 0
  322. INSTALLMAIL% = 1
  323. INSTALLCRYPT% = 1
  324. INSTALLCTL3D% = 1
  325. IF FINDINSTTYPE$ <> "NO" THEN
  326.  
  327. FILEPATH$= MakePath( DESTMAIL$, "BIN\WMAIL2.EXE")
  328.   IF DoesFileExist ( FILEPATH$, femExits) = 1 THEN
  329.     MasterFileVersion$ = GetSectionKeyVersion("MailFiles","WMAIL2.EXE")
  330.     DiskFileVersion$ = GetVersionOfFile( FILEPATH$)
  331.     INSTALLEDMAIL% = IsNewer( DiskFileVersion$, MasterFileVersion$) 
  332.   ENDIF
  333.  
  334.   IF INSTALLEDMAIL% = 1 THEN
  335.     SetSymbolValue "TitleYesNoBack", "Update"
  336.     SetSymbolValue "MessageYesNoBack", "The same version of Tun MAIL has been found. Do you want to overwrite it ?" 
  337. INSM1:
  338.     sz$ = UIStartDlg(CUIDLL$, ASKYESNOBACK, "FAskYesNoBackDlgProc", 0, "")
  339.     UIPop 1
  340.     IF sz$ = "YES" THEN
  341.       INSTALLMAIL% = 1 
  342.     ELSEIF sz$ = "BACK" THEN
  343.       GOTO CUSTINST 
  344.     ELSEIF sz$ = "REACTIVATE" THEN
  345.       GOTO INSM1
  346.     ELSE
  347.       INSTALLMAIL% = 0
  348.     ENDIF
  349.   ELSEIF INSTALLEDMAIL% = 2 THEN
  350.     SetSymbolValue "TitleYesNoBack", "Update"
  351.     SetSymbolValue "MessageYesNoBack", "A previous version of Tun MAIL has been found. Do you want to overwrite it ?" 
  352. INSM2:
  353.     sz$ = UIStartDlg(CUIDLL$, ASKYESNOBACK, "FAskYesNoBackDlgProc", 0, "")
  354.     UIPop 1
  355.     IF sz$ = "YES" THEN
  356.       INSTALLMAIL% = 2 
  357.     ELSEIF sz$ = "BACK" THEN
  358.       GOTO CUSTINST 
  359.     ELSEIF sz$ = "REACTIVATE" THEN
  360.         GOTO INSM2
  361.     ELSE
  362.       INSTALLMAIL% = 0
  363.     ENDIF
  364.   ELSE
  365.     INSTALLMAIL% = 1
  366.   ENDIF
  367.  
  368. '' Tuncrypt ?
  369.   fInst% = IsInstalled ("CryptFiles","TUNCRYPT.DLL","TUNCRYPT.DLL",DESTCOM$)
  370.   IF fInst% <> 2 AND fInst% <> 4 THEN 
  371.      INSTALLCRYPT%=0
  372.   ENDIF
  373.  
  374. '' CTL3D ?
  375.   fInst% = IsInstalled ("Ctl3dFiles","CTL3D.TUN","CTL3D.DLL",GetWindowsSysDir)
  376.   IF fInst% = 0 OR fInst% = 1 THEN 
  377.      INSTALLCTL3D%=0
  378.   ELSEIF fInst% = 2 THEN
  379.      INSTALLCTL3D%=2
  380.   ENDIF
  381.  
  382. ENDIF
  383. IF INSTALLMAIL% = 0 AND INSTALLKER%= 0 THEN
  384.   GOTO CUSTINST
  385. ENDIF
  386.  
  387. ''
  388. ''      Serialization Dialogue Box
  389. ''
  390. IF ENCRYPTDLG$ <> "NO" THEN
  391. SERIAL:
  392.     sz$ = UIStartDlg(CUIDLL$, GETSERIALNUM, "FNameOrgDlgProc", APPHELP, HELPPROC$)
  393.     IF sz$ = "CANCEL" THEN
  394.       sz$ = UIStartDlg(CUIDLL$, CDBADORG, "FInfoDlgProc", 0, "" )
  395.       UIPop 1
  396.       GOTO SERIAL
  397.     ELSEIF sz$ = "EXIT" THEN
  398.       GOSUB ASKQUIT
  399.       GOTO SERIAL
  400.     ELSEIF sz$ <> "CONTINUE" THEN
  401.       GOTO SERIAL
  402.     ENDIF
  403.        
  404.     szSN$ = GetSymbolValue( "NameOut" )
  405.     szAK$ = GetSymbolValue( "OrgOut" )
  406.     szLS$ = GetSymBolValue( "LicenseStringOut" )
  407.     szHEAD$ = MID$( szSN$, 4, 2 )
  408.     IF szHEAD$ <> "02" AND szHEAD$ <> "03" THEN
  409. BADF1:
  410.       sz$ = UIStartDlg(CUIDLL$, CDBADFILE, "FInfoDlgProc", 0, "" )
  411.       UIPop 1
  412.       IF sz$ = "EXIT" THEN
  413.           GOTO ASKQUIT
  414.           GOTO SERIAL
  415.           ELSEIF sz$ = "CONTINUE" THEN
  416.           GOTO SERIAL
  417.           ELSE
  418.               GOTO BADF1
  419.       ENDIF
  420.     ENDIF
  421.     UIPop 1
  422. ENDIF
  423.  
  424.  
  425. ''
  426. ''      Copy procedure
  427. ''
  428. IF COPYFILES$ <> "NO" THEN
  429.     ClearCopyList
  430.     AddOptFilesToCopyList APPFILES
  431.     AddOptFilesToCopyList OPTFILES1
  432.     AddOptFilesToCopyList OPTFILES2
  433.     IF INSTALLKER% <> 0 THEN
  434.       AddOptFilesToCopyList OPTFILES3
  435.       IF INSTALLKER% = 1 THEN
  436.     AddOptFilesToCopyList OPTFILES4
  437.       ENDIF
  438.     ENDIF
  439.     IF INSTALLCRYPT% = 1 THEN
  440.       AddOptFilesToCopyList CRYPTFILES
  441.     ENDIF
  442.     IF INSTALLCTL3D% <> 0 THEN
  443.       AddOptFilesToCopyList CTL3DFILES
  444.     ENDIF
  445.     CreateDir DEST$, cmoNone
  446.     SetRestartDir MakePath( DEST$, "TMP")
  447.     CopyFilesInCopyList
  448. ''
  449. ''    TUN MAIL needed directories creation
  450. ''
  451.     CreateDir MakePath( DESTMAIL$ , "EMAILDAT"), cmoNone    
  452.     CreateDir MakePath( DESTMAIL$ , "EMAILDAT\SPOOL"), cmoNone    
  453.     CreateDir MakePath( DESTMAIL$ , "SPOOL"), cmoNone    
  454.  
  455.  
  456. ENDIF
  457.  
  458. ''
  459. ''      Encrypt procedure
  460. ''
  461. IF ENCRYPTFILES$ <> "NO" THEN
  462.  
  463. ''    SetSymbolValue "NameOut", szSN$
  464. ''   SetSymbolValue "OrgOut", szAK$
  465. ''    SetSymBolValue "LicenseStringOut", szLS$
  466. ''IF INSTALLKER% = 1 THEN
  467. ''    SetSymbolValue "PathFiles", DESTKER$
  468. ''    SetSymbolValue "ProgramType", "KER" 
  469. ''    sz$ = UIStartDlg(CUIDLL$, MODELESS, "FModelessDlgProc", 0, "" )
  470. ''    UIPop 1
  471. ''ENDIF
  472. ''    SetSymbolValue "PathFiles", MakePath( DESTMAIL$, "BIN")
  473. ''    SetSymbolValue "ProgramType", "MAIL" 
  474. ''    sz$ = UIStartDlg(CUIDLL$, MODELESS, "FModelessDlgProc", 0, "" )
  475. ''    UIPop 1
  476.  
  477.     fEncryt%=EncryptFile(DESTCOM$, szSN$, szAK$, szLS$)
  478.  
  479. ENDIF
  480.  
  481. ''
  482. ''       Installation of CTL3D.DLL if required
  483. ''
  484. CTL3D:
  485.    szNF$ = MakePath(DESTCOM$ , "CTL3D.TUN")
  486.    szOF$ = GetWindowsSysDir() + "CTL3D.DLL"
  487.    IF INSTALLCTL3D% = 2 THEN 
  488. CTL3D1:
  489.      sz$ = UIStartDlg(CUIDLL$, ASKUPDATE, "FAskUpdateDlgProc", 0, "")
  490.      IF sz$ = "YES" THEN
  491.        CopyFile szOF$, GetWindowsSysDir() + "CTL3D.OLD", cmoOverwrite, 0
  492.        CopyFile szNF$, szOF$, cmoOverwrite, 0 
  493.      ELSEIF sz$ = "REACTIVATE" THEN
  494.         GOTO CTL3D1
  495.      ENDIF
  496.      UIPop 1
  497.    ELSEIF INSTALLCTL3D% = 1 THEN
  498.        CopyFile szNF$, szOF$, cmoOverwrite, 0 
  499.    ENDIF
  500.  
  501. ''
  502. ''      Modification/Creation of Tun MAIL / Tun KERNEL entry in TUN.INI
  503. ''
  504. IF CREATEINIFILES$ <> "NO" THEN
  505.  
  506.     CursorSave% = ShowWaitCursor()
  507.  
  508.     szLG$ = MID$( szSN$, 3, 1 )
  509.     nLG% = (ASC(MID$(szSN$,6,1)) - ASC("0")) * 10 + (ASC(MID$(szSN$,7,1)) - ASC("0"))
  510.     IF DoesIniKeyExist( MakePath( GetWindowsDir(), "TUN.INI"), "Language", "Language") = 0 THEN
  511.     IF nLG% = 1 THEN
  512.         szLGN$= "01"
  513.     ELSEIF nLG% > 3 THEN
  514.         szLGN$ = MakeString(nLG% - 2 ) 
  515.     ELSE
  516.         szLGN$ ="00"
  517.     END IF
  518.         CreateIniKeyValue MakePath( GetWindowsDir(), "TUN.INI"), "Language", "Language", szLGN$ ,cmoOverwrite
  519.     END IF
  520.  
  521. IF INSTALLCRYPT% = 1 THEN
  522.   i%=AddLangMenu(DESTCOM$)
  523. ENDIF
  524.  
  525. IF INSTALLKER% <> 0 THEN
  526.  i%= CreatIniKer(DESTKER$,0)
  527. ENDIF
  528.  
  529. i%= CreatIniMail(DESTMAIL$)
  530.  
  531.     RestoreCursor CursorSave%
  532. ENDIF
  533.  
  534. ''
  535. ''      Add Path of Tun KERNEL in AUTOEXEC.BAT
  536. ''
  537. FINDTUNPATH%=1
  538. IF ADDPATH$ <> "NO" THEN
  539.  
  540. IF INSTALLKER% <> 0 THEN
  541.   FINDTUNPATH% = FindExistingPath(DESTKER$)
  542.   IF FINDTUNPATH% = 0 THEN
  543.     i% = AddTunDir(DESTKER$)
  544.   ENDIF
  545. ENDIF
  546. ENDIF
  547.  
  548. ''
  549. ''     Ask to configure TCP/IP 
  550. ''
  551. TCPCONF$ = "NO"
  552.  
  553. IF ASKTCPCONF$ <> "NO" THEN
  554.  
  555. IF INSTALLKER% <> 0 THEN
  556.     SetSymbolValue "MessageYesNo", "Do you want to configure TCP/IP now ? This can be done later running the Administrator"
  557.     SetSymbolValue "TitleYesNo", "TCP/IP Configuration"
  558.     TCPCONF$ = UIStartDlg(CUIDLL$, ASKYESNO, "FAskYesNoDlgProc", 0, "" )
  559.     UIPop 1
  560. ENDIF
  561.  
  562. ENDIF
  563.  
  564. ''
  565. ''      TUN KERNEL ProgramGroup and ProgramItem creation  
  566. ''
  567.  
  568. IF CREATEGROUPS$ <> "NO" THEN
  569.  
  570. IF INSTALLKER% <> 0 THEN
  571.     CreateProgmanGroup "Tun KERNEL", "", cmoNone
  572.     ShowProgmanGroup  "Tun KERNEL", 1, cmoNone
  573.     CreateProgmanItem "Tun KERNEL", "Admin", MakePath( DESTKER$, "WTUNTCPW.EXE -NFS -NFSD -LPR -LPD -FTPD" ), "", cmoOverwrite
  574.     CreateProgmanItem "Tun KERNEL", "WTCPIP", MakePath( DESTKER$, "WTCPIP.EXE" ), "", cmoOverwrite
  575.     CreateProgmanItem "Tun KERNEL", "Ping", MakePath( DESTKER$, "WPING.EXE" ), "", cmoOverwrite
  576.  
  577. ENDIF
  578.  
  579. ''
  580. ''    TUN MAIL ProgramGroup and ProgramItem creation     
  581. ''
  582.  
  583.     CreateProgmanGroup "Tun MAIL", "", cmoNone
  584.     ShowProgmanGroup  "Tun MAIL", 1, cmoNone
  585.     CreateProgmanItem "Tun MAIL", "Email", MakePath( DESTMAIL$, "BIN\WMAIL2.EXE" ), "", cmoOverwrite
  586.     CreateProgmanItem "Tun MAIL", "Remote Mailer", MakePath( DESTMAIL$, "BIN\RMAIL.EXE"), "", cmoOverwrite
  587.  
  588. ENDIF
  589.  
  590. ''
  591. ''      Run TCP/IP Custom Dialogs
  592. ''
  593. IF RUNTCPCONF$ <> "NO" THEN
  594.  
  595. IF INSTALLKER% <> 0 THEN
  596.   IF TCPCONF$= "YES" THEN
  597.     SETUPPROG$= MakePath( DESTKER$, "WTCPDLG.DLL")
  598.     i% = CustomSetup( WndFrame%, SETUPPROG$)
  599.   ENDIF
  600. ENDIF
  601. ENDIF
  602.  
  603. QUIT:
  604.     ON ERROR GOTO ERRQUIT
  605.  
  606.     IF ERR = 0 THEN
  607.     dlg% = EXITSUCCESS
  608.     IF COPYFILES$ <> "NO" THEN
  609.       IF RestartListEmpty() = 0 THEN
  610.         dumb% = ExitExecRestart()
  611.       END IF
  612.     ENDIF
  613.         IF FINDTUNPATH% = 0 THEN
  614. REBOOT1:
  615.           SetSymbolValue "TitleYesNo", "Restart System"
  616.           SetSymbolValue "MessageYesNo", "Setup has modified AUTOEXEC.BAT file. Do you want to restart the computer ?" 
  617.           sz$ = UIStartDlg(CUIDLL$, ASKYESNO, "FAskYesNoDlgProc", 0, "")
  618.           UIPop 1
  619.           IF sz$ <> "NO" THEN
  620.          i%=MyExitWindows(1)
  621.              GOTO REBOOT1
  622.           ENDIF
  623.         ENDIF
  624.     ELSEIF ERR = STFQUIT THEN
  625.     dlg% = EXITQUIT
  626.     ELSE
  627.     dlg% = EXITFAILURE
  628.     END IF
  629. QUITL1:
  630.     sz$ = UIStartDlg(CUIDLL$, dlg%, "FInfo0DlgProc", 0, "")
  631.     IF sz$ = "REACTIVATE" THEN
  632.     GOTO QUITL1
  633.     END IF
  634.     UnregisterCtl3d
  635.     UIPop 1
  636.  
  637.     END
  638.  
  639. ERRQUIT:
  640.     i% = DoMsgBox("Les sources de Setup ne sont plus valide, appelez le support technique!", "Message Setup", MB_OK+MB_TASKMODAL+MB_ICONHAND)
  641.     END
  642.  
  643.  
  644.  
  645. GETPATH:
  646.     SetSymbolValue "EditTextIn", DEST$
  647.     SetSymbolValue "EditFocus", "END"
  648. GETPATHL1:
  649.     sz$ = UIStartDlg(CUIDLL$, DESTPATH, "FEditDlgProc", APPHELP, HELPPROC$)
  650.  
  651.     IF sz$ = "CONTINUE" THEN
  652.     olddest$ = DEST$
  653.     DEST$ = GetSymbolValue("EditTextOut")
  654.  
  655.     ''Validate new path.
  656.     IF IsDirWritable(DEST$) = 0 THEN
  657.         GOSUB BADPATH
  658.         GOTO GETPATHL1
  659.     END IF
  660.     UIPop 1
  661.  
  662.     ''Truncate display if too long.
  663.     IF LEN(DEST$) > 23 THEN
  664.         ReplaceListItem DRIVETEXT$, 7, MID$(DEST$, 1, 23)+"..."
  665.     ELSE
  666.         ReplaceListItem DRIVETEXT$, 7, DEST$
  667.     END IF
  668.  
  669.     ''Recalc if path changed.
  670.     IF (olddest$ <> DEST$) AND (olddest$ <> DEST$+"\") AND (olddest$+"\" <> DEST$) THEN
  671.         RecalcPath
  672.         SetDriveStatus
  673.     END IF
  674.  
  675.     olddest$ = ""
  676.     GOTO CUSTINST
  677.     ELSEIF sz$ = "REACTIVATE" THEN
  678.     RecalcPath
  679.     SetDriveStatus
  680.     GOTO GETPATHL1
  681.     ELSEIF sz$ = "EXIT" THEN
  682.     GOSUB ASKQUIT
  683.     GOTO GETPATHL1
  684.     ELSE
  685.     UIPop 1
  686.     GOTO CUSTINST
  687.     END IF
  688.  
  689.  
  690. GETPATHWIN:
  691.     SetSymbolValue "EditTextIn", WINSOCKPATH$
  692.     SetSymbolValue "EditFocus", "END"
  693. GETPATHL1WIN:
  694.     sz$ = UIStartDlg(CUIDLL$, WINPATH, "FEditDlgProc", APPHELP, HELPPROC$)
  695.  
  696.     IF sz$ = "CONTINUE" THEN
  697.     oldwinsockpath$ = WINSOCKPATH$
  698.     WINSOCKPATH$ = GetSymbolValue("EditTextOut")
  699.  
  700.     ''Validate new path.
  701.     IF IsDirWritable(WINSOCKPATH$) = 0 THEN
  702.         GOSUB BADPATH
  703.         GOTO GETPATHL1WIN
  704.     END IF
  705.     UIPop 1
  706.  
  707.     ''Truncate display if too long.
  708.     IF LEN(WINSOCKPATH$) > 23 THEN
  709.         ReplaceListItem DRIVETEXT$, 4, MID$(WINSOCKPATH$, 1, 23)+"..."
  710.     ELSE
  711.         ReplaceListItem DRIVETEXT$, 4, WINSOCKPATH$
  712.     END IF
  713.  
  714.     oldwinsockpath$ = ""
  715.     GOTO CUSTINST
  716.     ELSEIF sz$ = "REACTIVATE" THEN
  717.     GOTO GETPATHL1WIN
  718.     ELSEIF sz$ = "EXIT" THEN
  719.     GOSUB ASKQUIT
  720.     GOTO GETPATHL1WIN
  721.     ELSE
  722.     UIPop 1
  723.     GOTO CUSTINST
  724.     END IF
  725.  
  726. ''OPTFILES1:
  727. ''    SetSymbolValue "RadioDefault", OPT1OPT$
  728. ''OPT1L1:
  729. ''    sz$ = UIStartDlg(CUIDLL$, OPTIONS, "FRadioDlgProc", APPHELP, HELPPROC$)
  730. ''    newopt$ = GetSymbolValue("ButtonChecked")
  731. ''
  732. ''    IF sz$ = "CONTINUE" THEN
  733. ''        UIPop 1
  734. ''        IF newopt$ <> OPT1OPT$ THEN
  735. ''            OPT1OPT$ = newopt$
  736. ''            RecalcOptFiles OPTFILES1
  737. ''            SetDriveStatus
  738. ''        END IF
  739. ''        newopt$ = ""
  740. ''        GOTO CUSTINST
  741. ''    ELSEIF sz$ = "REACTIVATE" THEN
  742. ''        RecalcPath
  743. ''        SetDriveStatus
  744. ''        GOTO OPT1L1
  745. ''    ELSEIF sz$ = "EXIT" THEN
  746. ''        GOSUB ASKQUIT
  747. ''        GOTO OPT1L1
  748. ''    ELSE
  749. ''        UIPop 1
  750. ''        newopt$ = ""
  751. ''        GOTO CUSTINST
  752. ''    END IF
  753.  
  754.  
  755.  
  756. ''OPTFILES2:
  757. ''    SetSymbolValue "RadioDefault", OPT2OPT$
  758. ''OPT2L1:
  759. ''    sz$ = UIStartDlg(CUIDLL$, OPTIONS, "FRadioDlgProc", APPHELP, HELPPROC$)
  760. ''    newopt$ = GetSymbolValue("ButtonChecked")
  761. ''
  762. ''    IF sz$ = "CONTINUE" THEN
  763. ''        UIPop 1
  764. ''        IF newopt$ <> OPT2OPT$ THEN
  765. ''            OPT2OPT$ = newopt$
  766. ''            RecalcOptFiles OPTFILES2
  767. ''            SetDriveStatus
  768. ''        END IF
  769. ''        newopt$ = ""
  770. ''        GOTO CUSTINST
  771. ''    ELSEIF sz$ = "REACTIVATE" THEN
  772. ''        RecalcPath
  773. ''        SetDriveStatus
  774. ''        GOTO OPT2L1
  775. ''    ELSEIF sz$ = "EXIT" THEN
  776. ''        GOSUB ASKQUIT
  777. ''        GOTO OPT2L1
  778. ''    ELSE
  779. ''        UIPop 1
  780. ''        newopt$ = ""
  781. ''        GOTO CUSTINST
  782. ''    END IF
  783.  
  784. ASKUPDATE:
  785.      sz$ = UIStartDlg(CUIDLL$, ASKUPDATE, "FAskUpdateDlgProc", 0, "")
  786.     IF sz$ = "YES" THEN
  787.        CopyFile szOF$, GetWindowsSysDir() + "CTL3D.OLD", cmoOverwrite, 0
  788.        CopyFile szNF$, szOF$, cmoOverwrite, 0 
  789.     ENDIF
  790.         
  791.      UIPop 1
  792.      RETURN
  793.  
  794. TOOBIG:
  795.     sz$ = UIStartDlg(CUIDLL$, TOOBIG, "FInfo0DlgProc", 0, "")
  796.     IF sz$ = "REACTIVATE" THEN
  797.     RecalcPath
  798.     SetDriveStatus
  799.     GOTO TOOBIG
  800.     END IF
  801.     UIPop 1
  802.     RETURN
  803.  
  804.  
  805.  
  806. BADPATH:
  807.     sz$ = UIStartDlg(CUIDLL$, BADPATH, "FInfo0DlgProc", 0, "")
  808.     IF sz$ = "REACTIVATE" THEN
  809.     RecalcPath
  810.     SetDriveStatus
  811.     GOTO BADPATH
  812.     END IF
  813.     UIPop 1
  814.     RETURN
  815.  
  816.  
  817. ASKQUIT:
  818.     sz$ = UIStartDlg(CUIDLL$, ASKQUIT, "FQuitDlgProc", 0, "")
  819.  
  820.     IF sz$ = "EXIT" THEN
  821.     UIPopAll
  822.     ERROR STFQUIT
  823.     ELSEIF sz$ = "REACTIVATE" THEN
  824.     GOTO ASKQUIT
  825.     ELSE
  826.     UIPop 1
  827.     END IF
  828.     RETURN
  829.  
  830.  
  831.  
  832. '**
  833. '** Purpose:
  834. '**     Adds the specified option files to the copy list.
  835. '** Arguments:
  836. '**     ftype%  - type of files to add, one of the following:
  837. '**             APPFILES, OPTFILES1, OPTFILES2
  838. '** Returns:
  839. '**     none.
  840. '*************************************************************************
  841. SUB AddOptFilesToCopyList (ftype%) STATIC
  842.  
  843.     SrcDir$ = GetSymbolValue("STF_SRCDIR")
  844.     IF ftype% = APPFILES THEN
  845.     AddSectionFilesToCopyList "MailFiles", SrcDir$, DEST$
  846.     ELSEIF ftype% = OPTFILES1 AND GetListItem(CHECKSTATES$, OPTFILES1) = "ON" THEN
  847.     AddSectionFilesToCopyList "Pop3MFiles", SrcDir$, DEST$
  848.     ELSEIF ftype% = OPTFILES2 AND GetListItem(CHECKSTATES$, OPTFILES2) = "ON" THEN
  849.     AddSectionFilesToCopyList "FaxFiles", SrcDir$, DEST$
  850.     ELSEIF ftype% = OPTFILES3 AND GetListItem(CHECKSTATES$, OPTFILES3) = "ON" THEN
  851.     AddSectionFilesToCopyList "KernelFiles", SrcDir$, DEST$
  852.     ELSEIF ftype% = OPTFILES4  THEN
  853.     AddSectionFilesToCopyList "KernelnFiles", SrcDir$, DEST$
  854.     ELSEIF ftype% = CRYPTFILES  THEN
  855.     AddSectionFilesToCopyList "CryptFiles", SrcDir$, DEST$
  856.     ELSEIF ftype% = CTL3DFILES  THEN
  857.     AddSectionFilesToCopyList "Ctl3dFiles", SrcDir$, DEST$
  858.     ENDIF
  859.     SrcDir$ = ""
  860.  
  861. END SUB
  862.  
  863.  
  864. '**
  865. '** Purpose:
  866. '**     Recalculates disk space for the given option files and sets
  867. '**     the status info symbol "StatusItemsText".
  868. '** Arguments:
  869. '**     ftype% - type of files to add, one of the following:
  870. '**             APPFILES, OPTFILES1, OPTFILES2
  871. '** Returns:
  872. '**     none.
  873. '*************************************************************************
  874. SUB RecalcOptFiles (ftype%) STATIC
  875.     CursorSave% = ShowWaitCursor()
  876.     ClearCopyList
  877.     AddOptFilesToCopyList ftype%
  878.  
  879.     fExtra% = 0
  880.     IF ftype% = APPFILES THEN
  881.     ListSym$ = APPNEEDS$
  882. ''        IF GetListItem(CHECKSTATES$, APPFILES) = "ON" THEN
  883.         ''Add extra cost to Windows drive for ini/progman, etc.
  884.         ndrive% = ASC(ucase$(WINDRIVE$)) - ASC("A") + 1
  885.         ReplaceListItem EXTRACOSTS$, ndrive%, "10240"
  886.         fExtra% = 1
  887. ''        END IF
  888.     ELSEIF ftype% = OPTFILES1 THEN
  889.     ListSym$ = OPT1NEEDS$
  890.     ELSEIF ftype% = OPTFILES2 THEN
  891.     ListSym$ = OPT2NEEDS$
  892.     ELSEIF ftype% = OPTFILES3 THEN
  893.     ListSym$ = OPT3NEEDS$
  894.     ELSEIF ftype% = OPTFILES4 THEN
  895.     ListSym$ = OPT4NEEDS$
  896.     END IF
  897.  
  898.     StillNeed& = GetCopyListCost(EXTRACOSTS$, ListSym$, "")
  899.  
  900.     cost& = 0
  901.     FOR i% = 1 TO 26 STEP 1
  902.     cost&  = cost& + VAL(GetListItem(ListSym$, i%))
  903.     NEXT i%
  904.     ReplaceListItem STATUSTEXT$, ftype%, STR$(cost& / 1024) + " K"
  905.  
  906.     IF StillNeed& > 0 THEN
  907.     ReplaceListItem BIGLIST$, ftype%, "YES"
  908.     ELSE
  909.     ReplaceListItem BIGLIST$, ftype%, ""
  910.     END IF
  911.  
  912.     IF fExtra% THEN
  913.     ReplaceListItem EXTRACOSTS$, ndrive%, "0"
  914.     END IF
  915.     RestoreCursor CursorSave%
  916.     ListSym$ = ""
  917. END SUB
  918.  
  919.  
  920. '**
  921. '** Purpose:
  922. '**     Recalculates disk space and sets option status info according
  923. '**     to the current destination path.
  924. '** Arguments:
  925. '**     none.
  926. '** Returns:
  927. '**     none.
  928. '*************************************************************************
  929. SUB RecalcPath STATIC
  930.  
  931.     CursorSave% = ShowWaitCursor()
  932.  
  933.     DESTKER$= MakePath( DEST$, "KERNELW")
  934.     FILEPATH$= MakePath( DESTKER$, "TUNTCPIP.DLL")
  935.     IF DoesFileExist ( FILEPATH$, femExits) = 1 THEN
  936.       MasterFileVersion$ = GetSectionKeyVersion("KernelFiles","TUNTCPIP.DLL")
  937.       DiskFileVersion$ = GetVersionOfFile( FILEPATH$)
  938.       INSTALLEDKER% = IsNewer( DiskFileVersion$, MasterFileVersion$) 
  939.     ENDIF
  940.     RecalcOptFiles APPFILES
  941.     RecalcOptFiles OPTFILES1
  942.     RecalcOptFiles OPTFILES2
  943.     IF INSTALLEDKER% <> 1 THEN
  944.       ReplaceListItem CHECKSTATES$, OPTFILES3, "ON"
  945.     ELSE
  946.       ReplaceListItem CHECKSTATES$, OPTFILES3, "OFF"
  947.     ENDIF
  948.     RecalcOptFiles OPTFILES3
  949.     IF INSTALLEDKER% <> 1 THEN
  950.       RecalcOptFiles OPTFILES4
  951.     ENDIF
  952.  
  953.     RestoreCursor CursorSave%
  954. END SUB
  955.  
  956.  
  957. '**
  958. '** Purpose:
  959. '**     Sets drive status info according to latest disk space calcs.
  960. '** Arguments:
  961. '**     none.
  962. '** Returns:
  963. '**     none.
  964. '*************************************************************************
  965. SUB SetDriveStatus STATIC
  966.  
  967.     drive$ = MID$(DEST$, 1, 1)
  968.     ndrive% = ASC(ucase$(drive$)) - ASC("A") + 1
  969.     cost& = VAL(GetListItem(APPNEEDS$, ndrive%)) +VAL(GetListItem(OPT1NEEDS$, ndrive%)) +VAL(GetListItem(OPT2NEEDS$, ndrive%)) +VAL(GetListItem(OPT3NEEDS$, ndrive%)) +VAL(GetListItem(OPT4NEEDS$, ndrive%))
  970.     free& = GetFreeSpaceForDrive(drive$)
  971.     ReplaceListItem DRIVETEXT$, 1, drive$ + ":"
  972.     ReplaceListItem DRIVETEXT$, 2, STR$(cost& / 1024) + " K"
  973.     ReplaceListItem DRIVETEXT$, 3, STR$(free& / 1024) + " K"
  974.  
  975.     IF drive$ = WINDRIVE$ THEN
  976. ''      ReplaceListItem DRIVETEXT$, 4, ""
  977.     ReplaceListItem DRIVETEXT$, 5, ""
  978.     ReplaceListItem DRIVETEXT$, 6, ""
  979.     ELSE
  980.     ndrive% = ASC(ucase$(WINDRIVE$)) - ASC("A") + 1
  981.         cost& = VAL(GetListItem(APPNEEDS$, ndrive%)) +VAL(GetListItem(OPT1NEEDS$, ndrive%)) +VAL(GetListItem(OPT2NEEDS$, ndrive%)) +VAL(GetListItem(OPT3NEEDS$, ndrive%)) +VAL(GetListItem(OPT4NEEDS$, ndrive%))
  982.     IF cost& = 0 THEN
  983. ''          ReplaceListItem DRIVETEXT$, 4, ""
  984.         ReplaceListItem DRIVETEXT$, 5, ""
  985.         ReplaceListItem DRIVETEXT$, 6, ""
  986.     ELSE
  987.         free& = GetFreeSpaceForDrive(WINDRIVE$)
  988. ''          ReplaceListItem DRIVETEXT$, 4, WINDRIVE$ + ":"
  989.         ReplaceListItem DRIVETEXT$, 5, STR$(cost& / 1024) + " K"
  990.         ReplaceListItem DRIVETEXT$, 6, STR$(free& / 1024) + " K"
  991.     END IF
  992.     END IF
  993. END SUB
  994.  
  995.  
  996. '**
  997. '** Purpose:
  998. '**     Appends a file name to the end of a directory path,
  999. '**     inserting a backslash character as needed.
  1000. '** Arguments:
  1001. '**     szDir$  - full directory path (with optional ending "\")
  1002. '**     szFile$ - filename to append to directory
  1003. '** Returns:
  1004. '**     Resulting fully qualified path name.
  1005. '*************************************************************************
  1006. FUNCTION MakePath (szDir$, szFile$) STATIC AS STRING
  1007.     IF szDir$ = "" THEN
  1008.     MakePath = szFile$
  1009.     ELSEIF szFile$ = "" THEN
  1010.     MakePath = szDir$
  1011.     ELSEIF MID$(szDir$, LEN(szDir$), 1) = "\" THEN
  1012.     MakePath = szDir$ + szFile$
  1013.     ELSE
  1014.     MakePath = szDir$ + "\" + szFile$
  1015.     END IF
  1016. END FUNCTION
  1017.  
  1018. FUNCTION MakeString (i%) STATIC AS STRING
  1019.  
  1020.     Number$ = "0123456789"
  1021.     MakeString = "0" + MID$(Number$,i%+1 ,1)
  1022.     
  1023. END FUNCTION
  1024.  
  1025. '**
  1026. '** Purpose:
  1027. '**     Newest version 
  1028. '** Arguments:
  1029. '**     szVersion1$ - N.N.N.N version string 1 
  1030. '**     szVersion2$ - N.N.N.N version string 2 
  1031. '** Returns:
  1032. '**     If szVersion1$ > szVersion2$  return 0 
  1033. '**     If szVersion1$ = szVersion2$  return 1 
  1034. '**     If szVersion1$ < szVersion2$  return 2 
  1035. '*************************************************************************
  1036. FUNCTION IsNewer (szVersion1$, szVersion2$) STATIC AS INTEGER
  1037.     IF GetVersionNthField(szVersion1$,1) < GetVersionNthField(szVersion2$,1) THEN
  1038.     IsNewer = 2
  1039.     ELSEIF GetVersionNthField(szVersion1$,1) > GetVersionNthField(szVersion2$,1) THEN
  1040.     IsNewer = 0
  1041.     ELSE 
  1042.     IF GetVersionNthField(szVersion1$,2) < GetVersionNthField(szVersion2$,2) THEN
  1043.       IsNewer = 2
  1044.     ELSEIF GetVersionNthField(szVersion1$,2) > GetVersionNthField(szVersion2$,2) THEN
  1045.     IsNewer = 0
  1046.     ELSE
  1047.       IF GetVersionNthField(szVersion1$,3) < GetVersionNthField(szVersion2$,3) THEN
  1048.         IsNewer = 2
  1049.       ELSEIF GetVersionNthField(szVersion1$,3) > GetVersionNthField(szVersion2$,3) THEN
  1050.         IsNewer = 0
  1051.       ELSE
  1052.         IF GetVersionNthField(szVersion1$,4) < GetVersionNthField(szVersion2$,4) THEN
  1053.           IsNewer = 2
  1054.         ELSEIF GetVersionNthField(szVersion1$,4) > GetVersionNthField(szVersion2$,4) THEN
  1055.           IsNewer = 0
  1056.         ELSE
  1057.           IsNewer = 1
  1058.         END IF
  1059.       END IF
  1060.     END IF
  1061.     END IF
  1062. END FUNCTION
  1063.  
  1064. FUNCTION IsInstalled(szSection$,szKey$,szFile$,szPath$) STATIC AS INTEGER 
  1065.  
  1066.     IsInstalled = 4
  1067.     FILEPATH$= MakePath( szPath$, szFile$)
  1068.     IF DoesFileExist ( FILEPATH$, femExists) = 1 THEN
  1069.       MasterFileVersion$ = GetSectionKeyVersion(szSection$,szKey$)
  1070.       DiskFileVersion$ = GetVersionOfFile( FILEPATH$)
  1071.       IsInstalled = IsNewer( DiskFileVersion$, MasterFileVersion$) 
  1072.     ENDIF
  1073.  
  1074. END FUNCTION
  1075.