home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 January / pcwk_01_1999_B.iso / Lotus123 / GERMAN / INSTALL.DSK / TOOLKIT.LSS < prev    next >
Text File  |  1996-11-13  |  257KB  |  7,157 lines

  1. ''**********************************************************************
  2. ''
  3. ''   Module Name:   cominst\toolkit\toolkit.lss
  4. ''
  5. ''   Module Code:   COMINST
  6. ''
  7. ''   Author:        Dave Dupre
  8. ''
  9. ''   Change History:
  10. ''   $Log:   //CIT/VOL1/CFLOG/logfiles/cominst/toolkit/toolkit@.lss  $
  11. '' 
  12. ''    Rev 1.268   13 Nov 1996 16:29:08   jdonohue
  13. '' Changed Lot_RegisterTypeLib to New_RegisterTypeLib (Scott Matsumoto version)
  14. '' Changed Old_RegisterTypeLib to Lot_RegisterTypeLib (original version)
  15. '' 
  16. ''    Rev 1.267   13 Nov 1996 12:21:08   jdonohue
  17. '' Adopted Scott Matsumoto's function for registering type libraries into
  18. '' Lot_RegisterTypeLib; renamed former toolkit function Old_RegisterTypeLib
  19. '' 
  20. ''    Rev 1.266   12 Nov 1996 15:22:28   jdonohue
  21. '' Ref. SPR: KAO3B8MB9
  22. '' Added Scott Matsimoto function RegisterTypeLib to Lot_RegisterTypeLib to
  23. '' complete type library registration
  24. '' 
  25. ''    Rev 1.265   25 Oct 1996 13:39:06   jdonohue
  26. '' Put miscellaneous objects in 'miscobj.ini' to circumvent 64K limit on 'cinstall.ini'
  27. '' 
  28. ''    Rev 1.264   19 Jul 1996 14:42:04   jdonohue
  29. '' Moved IncrementSharedDLLCount from main.lss to toolkit.lss
  30. '' 
  31. ''    Rev 1.263   11 Jul 1996 19:11:22   glutz
  32. '' Added SUB Lot_TurnOffNodeOptSections for cases where Suite does
  33. '' not surface the nodenodeoptions callback.
  34. '' 
  35. ''    Rev 1.262   05 Jul 1996 10:33:38   dfristro
  36. '' Changed IsDirWritable to IsPathWritable in Lot_GetNetHardDrive and
  37. '' Lot_GetLocalHardDrive.  This means we no longer insist that the dir exists,
  38. '' only that it can be created.
  39. '' 
  40. ''    Rev 1.261   14 Jun 1996 17:51:30   dfristro
  41. '' Simplified error message for excessive path length (SID_ERR_PATHLEN) to
  42. '' fix SPR RWIS36HHHN.
  43. '' 
  44. ''    Rev 1.260   14 Jun 1996 11:20:42   glutz
  45. '' SPR AFOG366LGN, Lot_AreAnyNodeOptionsAvail() was looking for reigistered
  46. '' options for each product instead of checking cinstall.ini.
  47. '' 
  48. ''    Rev 1.259   13 Jun 1996 08:31:54   glutz
  49. '' Took drive mapping out of IsPathWritable, changed order of checks in
  50. '' ValidateEditBox.
  51. '' 
  52. ''    Rev 1.258   10 Jun 1996 15:02:40   mhishinu
  53. '' Replaced two LEFT calls with LEFTBP to fix DBCS bug.
  54. '' 
  55. ''    Rev 1.257   10 Jun 1996 11:04:04   jdonohue
  56. '' Moved Lot_TrimEndSlash to setupapi.lss
  57. '' 
  58. ''    Rev 1.256   07 Jun 1996 14:56:10   jdonohue
  59. '' Ref SPR:     HAS2XQP8D
  60. '' Save number of installed objects, rather than counting cinstall.ini every time
  61. '' Use nulltrim on arguments in Lot_RegisterObject
  62. '' 
  63. ''    Rev 1.255   06 Jun 1996 11:36:42   jdonohue
  64. '' Ref SPR:     CDWT359P53
  65. '' Don't write miscellaneous object in cinstall.ini for registry uninstall key --
  66. '' this is automatically taken care of by uninstall
  67. '' 
  68. ''    Rev 1.254   05 Jun 1996 09:30:40   jdonohue
  69. '' Changed uninstall entry to delete entire uninstall entry, not just uninstallstring
  70. '' 
  71. ''    Rev 1.253   23 May 1996 12:21:34   jdonohue
  72. '' Replaced LEFTBP calls with LEFT
  73. '' 
  74. ''    Rev 1.252   16 May 1996 14:17:12   glutz
  75. '' RemovePriorVersion() buffers calls until told to execute.
  76. '' 
  77. ''    Rev 1.251   15 May 1996 13:21:32   jdonohue
  78. '' Ref SPR:    MSUN35PJBG
  79. '' Changed Winhelp call argument from "Overview" to "Install"
  80. '' 
  81. ''    Rev 1.250   02 May 1996 10:04:08   jdonohue
  82. '' Ref SPR:    RDOEHL4E94
  83. ''             PNOT2XUJRK
  84. '' Changed handling of writing uninstall string so that quotes are placed around
  85. '' arguments if the Windows new shell in use (Windows 95 and NT V. 4.0); quotes
  86. '' are NOT used for Windows NT 3.51 because of a bug in the MS Setup toolkit that
  87. '' truncates the command line with quotes.  So embedded spaces and other special
  88. '' characters (such as -) are NOT supported under Windows NT 3.51
  89. '' 
  90. ''    Rev 1.249   02 May 1996 09:22:04   glutz
  91. '' Added function RemovePriorVersion() for sspawning Uninstall.
  92. '' 
  93. ''    Rev 1.248   26 Apr 1996 08:51:38   jdonohue
  94. '' Ref SPR:    CDWT34ULDZ
  95. '' Added missing function DL_SetOraclePath (probably obsolete)
  96. '' 
  97. ''    Rev 1.247   11 Apr 1996 09:04:26   glutz
  98. '' Lot_FixupSourceDirectories check for sections in copy list.
  99. '' 
  100. ''    Rev 1.246   10 Apr 1996 16:26:20   jdonohue
  101. '' Added error checking to Lot_FixupSourceDirectories and OneUp
  102. '' 
  103. ''    Rev 1.245   10 Apr 1996 12:45:40   jdonohue
  104. '' Removed comments in Lot_FixupSourceDirectories -- enable stripping of path components
  105. '' 
  106. ''    Rev 1.244   05 Apr 1996 14:28:50   jdonohue
  107. '' Use new function FGetSectionFileList to get font filenames even if they
  108. '' have been renamed in the .INF file
  109. '' 
  110. ''    Rev 1.243   04 Apr 1996 21:41:46   glutz
  111. '' Added function Lot_AreAnyNodeOptionsAvail().
  112. '' 
  113. ''    Rev 1.242   04 Apr 1996 13:34:06   jdonohue
  114. '' Backed out fix for embedded spaces in pathnames (adding quotes) so that NT
  115. '' 3.51 uninstall icon will work for Suite 97 Beta 
  116. '' 
  117. ''    Rev 1.241   01 Apr 1996 15:10:14   jdonohue
  118. '' For Smartsuite, remove two levels of directory in MarkFixupSourceDirectory
  119. '' 
  120. ''    Rev 1.240   29 Mar 1996 16:25:26   jdonohue
  121. '' Added function OneUp which is called in Lot_FixupSourceDirectories to remove
  122. '' the last path element from the Smartmasters type destination symbol
  123. '' 
  124. ''    Rev 1.239   04 Mar 1996 08:32:08   jdonohue
  125. '' Remove 16 bit shared component support -- pass 1 : eliminate LOTUSAPP
  126. '' 
  127. ''    Rev 1.238   27 Feb 1996 15:32:24   jdonohue
  128. '' Added Lot_RegisterTypeLib that creates registry entries for Type Libraries
  129. '' 
  130. ''    Rev 1.237   15 Feb 1996 19:12:24   jdonohue
  131. '' Do not initialize LOTUSFONTSDIR
  132. '' 
  133. ''    Rev 1.236   31 Jan 1996 15:26:12   jdonohue
  134. '' Added code to delete the Product entries under Smartsuite for a single product
  135. '' install so that uninstall will work
  136. '' 
  137. ''    Rev 1.235   30 Jan 1996 15:04:50   jdonohue
  138. '' Added registry key value "InfFileName" for products in suite uninstall
  139. '' 
  140. ''    Rev 1.234   25 Jan 1996 16:28:22   jdonohue
  141. '' Added registry key under Products for prod/ver that are part of suite
  142. '' Added preliminary code for enabling single uninstall icon for suite
  143. '' Register uninstall registry objects under first product rather than UINST
  144. '' 
  145. ''    Rev 1.233   23 Jan 1996 16:27:00   cmoy
  146. '' HISHI: Merged FE changes
  147. '' 
  148. ''    Rev 1.232   19 Jan 1996 17:08:26   jdonohue
  149. '' Initialize SYM_LOTUSFONTSDIR$ in InitializeWinWinSysDir
  150. '' Add uninstall object for uninstall string
  151. '' 
  152. ''    Rev 1.231   18 Jan 1996 13:35:56   jdonohue
  153. '' Added function Lot_RegisterFonts to provide automatic font registration
  154. '' Removed functions Lot_AddFontByID and Lot_AddFontByName, not needed anymore
  155. '' 
  156. ''    Rev 1.230   17 Jan 1996 14:19:30   glutz
  157. '' Added SUB ComboSelChanged and FUNCTION GetPathFromComboEdit.
  158. '' 
  159. ''    Rev 1.229   04 Jan 1996 15:52:58   jdonohue
  160. '' Ref SPR:    TBAT2WAT6P
  161. '' Don't test InOrOut flag if file in copy list in Lot_WhereIsFeature -- this
  162. '' allows previously installed files to be found
  163. '' 
  164. ''    Rev 1.228   02 Jan 1996 16:15:28   jdonohue
  165. '' Use SYM_LOTUSFONTSDIR$ for location of fonts directory in Lot_AddFontByName
  166. '' 
  167. ''    Rev 1.227   22 Dec 1995 15:02:44   jdonohue
  168. '' Removed all references to SYM_PARENTDIR$ -- is now SYM_BASEDIR$ for all
  169. '' Added Function Lot_RegIni for future use
  170. '' 
  171. '' 
  172. ''    Rev 1.226   21 Dec 1995 14:09:16   jdonohue
  173. '' Added subs Lot_AddFontByID and Lot_AddFontByName.  These functions register a
  174. '' font with Windows and add to registry. It is assumed all fonts are installed
  175. '' to the Windows system directory
  176. '' 
  177. ''    Rev 1.225   14 Dec 1995 15:42:18   jdonohue
  178. '' Save original install directory location in  Lot_GetInstallDir instead of
  179. '' Lot_GetDestDirValueFromInstallini
  180. '' 
  181. ''    Rev 1.224   13 Dec 1995 16:29:54   jdonohue
  182. '' Ref SPR: PNOT2XUJRK
  183. '' Added quotes around pathname strings in command line to uninstall in
  184. '' Lot_RegisterUninstaller
  185. '' 
  186. ''    Rev 1.223   12 Dec 1995 11:29:48   jdonohue
  187. '' SPR Ref: TBAT2XLLZN
  188. '' Modified Lot_GetDestDirValueFromInstallini per Brian O'Donovan's suggestion t
  189. '' preserve the location of the cinstall.ini file in a static variable; this
  190. '' should point to the correct cinstall.ini for MLC installs as well
  191. '' 
  192. ''    Rev 1.222   11 Dec 1995 17:38:38   jdonohue
  193. '' Added PopulateCOBJECTLIST function to construct a list of objects in .INI 
  194. '' file; check list before creating miscellaneous object
  195. '' 
  196. ''    Rev 1.221   11 Dec 1995 14:06:32   jdonohue
  197. '' Lot_FixupSourceDirectories: added check for null source or destination
  198. '' 
  199. ''    Rev 1.220   11 Dec 1995 13:59:14   jdonohue
  200. '' Added subs Lot_FixupSourceDirectories and MarkFixupSourceDirSymbol for settin
  201. '' correct source location for node installs
  202. '' 
  203. ''    Rev 1.219   08 Nov 1995 16:58:30   tveerapp
  204. '' Fixes fot SPR#RMOO2xQQDY
  205. '' 
  206. ''    Rev 1.218   27 Oct 1995 17:07:26   glutz
  207. '' Lot_CheckPath does a NullTrim before proceeding.
  208. '' 
  209. ''    Rev 1.217   Oct 24 1995 16:55:18   cmoy
  210. '' removed eof char
  211. '' 
  212. ''    Rev 1.216   Oct 24 1995 16:25:58   mzgripce
  213. '' added Lot_CallWinhelp32 subroutine
  214. '' 
  215. ''    Rev 1.215   13 Oct 1995 15:41:14   amontalv
  216. '' For some reason the routine FGetListLength() was losing the symbol passed to it
  217. '' if it was called a second time.  We put a check in to make sure it doesn't.
  218. '' 
  219. ''    Rev 1.214   27 Sep 1995 11:18:44   jdonohue
  220. '' Don't change the destination directory symbols for non-server language instal
  221. '' 
  222. ''    Rev 1.213   22 Sep 1995 15:46:06   tveerapp
  223. '' Fixed spr#TBAT2W9U2Q. Lot_whereisfetaure was extended to look in the net
  224. '' components directory.
  225. '' 
  226. ''    Rev 1.212   22 Sep 1995 15:07:24   jdonohue
  227. '' Remove SYM_LOTUSUSERDIR$ processing
  228. '' 
  229. ''    Rev 1.211   15 Sep 1995 19:59:20   amontalv
  230. '' Added Lot_GetVol() and Lot_SplitAnyPath().
  231. '' 
  232. ''    Rev 1.210   14 Sep 1995 15:35:04   amontalv
  233. '' Don't register system path!
  234. '' 
  235. ''    Rev 1.209   14 Sep 1995 14:58:22   amontalv
  236. '' Added comments
  237. '' 
  238. ''    Rev 1.208   13 Sep 1995 17:03:06   amontalv
  239. '' Moved Lot_RegAppPath from setupapi.lss to toolkit.lss and also added a parameter.
  240. '' Lot_RegAppPath now register the registry entry .
  241. '' 
  242. ''    Rev 1.207   13 Sep 1995 14:20:22   glutz
  243. '' Added function GetLastPathComponent.
  244. '' 
  245. ''    Rev 1.206   12 Sep 1995 18:56:24   glutz
  246. '' Cleaned up some error reporting in ValidatePath, ValidateEditBox and
  247. '' ValidateBrowse.
  248. '' 
  249. ''    Rev 1.205   12 Sep 1995 11:55:54   tveerapp
  250. '' Added Lot_SaveFeaturesInInstNodeIni(), PopulateCINSTNODELIST .
  251. '' 
  252. ''    Rev 1.204   12 Sep 1995 11:18:18   glutz
  253. '' In ValidatePath set SYM_LAST_ERROR_SID to readonly before calling
  254. '' IsPathWritable.
  255. '' 
  256. ''    Rev 1.203   08 Sep 1995 14:41:44   glutz
  257. '' In ValidatePath the call to Lot_cleanPath is indepenent of volume type.
  258. '' 
  259. ''    Rev 1.202   08 Sep 1995 12:38:42   glutz
  260. '' For SPR CCOL2UKQD7 ValidatePath calls Lot_CleanPath first thing for UNC paths
  261. '' 
  262. ''    Rev 1.201   07 Sep 1995 15:22:08   amontalv
  263. '' Chop off the end of icon names longer than 40 characters if in NT.
  264. '' 
  265. ''    Rev 1.200   07 Sep 1995 10:42:26   tveerapp
  266. '' Added fix for node install network mapping in Lot_GetDestDirFromInstallIni.
  267. '' 
  268. ''    Rev 1.199   31 Aug 1995 14:00:48   tveerapp
  269. '' Fixed GetSymbolValue arg when building cinstnod.ini path
  270. '' 
  271. ''    Rev 1.198   31 Aug 1995 12:58:10   tveerapp
  272. '' NodeInstIni file path was not built correctly.Fix for spr# DCRP2UWNLS
  273. '' 
  274. ''    Rev 1.197   28 Aug 1995 16:53:00   jdonohue
  275. '' Changed USERDIR to LOTUSUSERDIR, lotususr to lotuser
  276. '' 
  277. ''    Rev 1.196   28 Aug 1995 13:32:14   amontalv
  278. '' Changed the uninstall entry to always be under \HLM\SOFTWARE\Microsoft\Windows\...
  279. '' and not \HLM\SOFTWARE\Microsoft\Windows NT\... when in NT.  Microsoft does this
  280. '' and it avoids security issues.
  281. '' 
  282. ''    Rev 1.195   24 Aug 1995 07:55:58   jdonohue
  283. '' Added SYM_USERDIR and set it
  284. '' 
  285. ''    Rev 1.194   23 Aug 1995 15:35:32   cmoy
  286. '' Added CONST MAX_NO_DRIVE_COMBOS
  287. '' 
  288. ''    Rev 1.193   21 Aug 1995 15:41:40   amontalv
  289. '' Put name of registry keys into globals.lss
  290. '' 
  291. ''    Rev 1.192   16 Aug 1995 20:33:28   amontalv
  292. '' Added code to do error messages for registry.
  293. '' 
  294. ''    Rev 1.191   16 Aug 1995 12:27:46   mmeth
  295. '' fix for  SPR# DCRP2UWNS9
  296. '' The node install was trying to write the path to the install directory
  297. '' into the registry.  Instead, we needed to write the path to the 
  298. '' target directory.
  299. '' 
  300. ''    Rev 1.190   15 Aug 1995 12:32:34   glutz
  301. '' Had to set the text for "Path not writable" just before displaying message.
  302. '' 
  303. ''    Rev 1.189   14 Aug 1995 17:00:22   amontalv
  304. '' During creation of Uninstall program group icon, I needed to point to the file again
  305. '' in the fourth parameter.  I though that that was starting directory, but seems to
  306. '' deal with icon.
  307. '' 
  308. ''    Rev 1.188   14 Aug 1995 11:12:28   jdonohue
  309. '' Allow filenames with more than 12 characters in MakePath
  310. '' 
  311. ''    Rev 1.187   09 Aug 1995 12:01:46   cmoy
  312. '' Commented out ProdAcronym variable. This is  not used
  313. '' 
  314. ''    Rev 1.186   Aug 09 1995 11:49:16   cmoy
  315. '' remove declaration on LOT_WRITECRITICALDIRECTORIES
  316. '' 
  317. ''    Rev 1.185   08 Aug 1995 12:55:14   tveerapp
  318. '' Added Lot_WriteCriticalDirectories. It is called in Lot_SaveFeaturesInInstal
  319. '' Ini. 
  320. '' 
  321. ''    Rev 1.184   07 Aug 1995 11:49:32   tveerapp
  322. '' Added a new function Lot_GetDestDirSymFrom InstallIni().
  323. '' 
  324. ''    Rev 1.183   07 Aug 1995 09:14:02   mmeth
  325. '' Fixed a typo I put in wrt a comment character.
  326. '' 
  327. ''    Rev 1.182   07 Aug 1995 08:24:52   mmeth
  328. '' Part 2 of fix for SPR# JHOH2M4HZL:
  329. '' No longer check length of strings being written in Lot_WriteToRiFile.
  330. '' Because this C function now truncates the length to 80 bytes + terminator
  331. '' itsself.  ALso changed the length of buffers to 82 in Lot_ReadDefaultsfromRi
  332. '' to handle the 80 bytes of characters plus terminating character.
  333. '' 
  334. ''    Rev 1.181   05 Aug 1995 13:27:10   jdonohue
  335. '' Backed out code to eliminate non-network drives for server install
  336. '' 
  337. ''    Rev 1.180   04 Aug 1995 17:27:08   amontalv
  338. '' Fixed command for uninstall icon.
  339. '' 
  340. ''    Rev 1.179   04 Aug 1995 16:38:36   glutz
  341. '' More subtle changes to ValidatePath.
  342. '' 
  343. ''    Rev 1.178   04 Aug 1995 12:24:04   glutz
  344. '' Cleaned up a problem displaying errors from ValidatePath.
  345. '' 
  346. ''    Rev 1.177   04 Aug 1995 08:42:58   glutz
  347. '' Changed the way ValidatePath handle some error messages.
  348. '' 
  349. ''    Rev 1.176   03 Aug 1995 15:41:22   amontalv
  350. '' Added one to length of registry entry for Uninstall.
  351. '' 
  352. ''    Rev 1.175   03 Aug 1995 15:32:42   glutz
  353. '' Changing method for error mesaages in ValidatePath.
  354. '' 
  355. ''    Rev 1.174   02 Aug 1995 16:20:10   amontalv
  356. '' Changed uninstall flags.  /L -> /O and /P -> /L
  357. '' 
  358. ''    Rev 1.173   02 Aug 1995 10:03:44   glutz
  359. '' Added unc volumes to server list in Lot_GetDriveFreeSpaceList.
  360. '' 
  361. ''    Rev 1.172   01 Aug 1995 16:14:52   amontalv
  362. '' Added uninstall information for ininstall icon
  363. '' 
  364. ''    Rev 1.171   01 Aug 1995 11:04:04   glutz
  365. '' Changed the order of some of the checks in ValidatePath so that UNC roots
  366. '' would be checked before invalid path names.
  367. '' 
  368. ''    Rev 1.170   31 Jul 1995 15:00:26   jdonohue
  369. '' Moved Reg_??? functions to Register.lss
  370. '' Added code to select only network drives for server install
  371. '' 
  372. ''    Rev 1.169   31 Jul 1995 10:54:28   amontalv
  373. '' No change
  374. '' 
  375. ''    Rev 1.168   28 Jul 1995 11:59:26   glutz
  376. '' IsPathWritable now passes the UNC path to Lot_CheckPath.
  377. '' 
  378. ''    Rev 1.167   27 Jul 1995 16:18:42   pdonahue
  379. '' added code to surface new error message 
  380. '' 
  381. ''    Rev 1.166   27 Jul 1995 14:01:34   amontalv
  382. '' Added call to create icons for uninstall in WinNt.
  383. '' 
  384. ''    Rev 1.165   27 Jul 1995 11:04:28   amontalv
  385. '' Added call Lot_AddLinkIconToFolder so that icon information can be sent
  386. '' when creating a shortcut.
  387. '' 
  388. ''    Rev 1.164   24 Jul 1995 11:39:38   glutz
  389. '' Read sn.dat from temp directory.
  390. '' 
  391. ''    Rev 1.163   20 Jul 1995 12:58:52   jdonohue
  392. '' Changed CopyFile to FCopyFile, which calls Win32 CopyFile instead of MS-Setup
  393. '' FCopyOneFile
  394. '' 
  395. ''    Rev 1.162   20 Jul 1995 10:53:54   glutz
  396. '' GetFreeSpace now returns K bytes so I made changes accordingly.
  397. '' 
  398. ''    Rev 1.161   20 Jul 1995 08:02:48   jdonohue
  399. '' Added check for null string in ValidatePath
  400. '' 
  401. ''    Rev 1.160   19 Jul 1995 16:37:24   glutz
  402. '' lcbNeed is now K bytes based so I took the \ 1024 out of CheskForSpace.
  403. '' 
  404. ''    Rev 1.159   18 Jul 1995 09:17:26   glutz
  405. '' ValidateBrowse was not updating edit box for UNC paths.
  406. '' 
  407. ''    Rev 1.158   17 Jul 1995 16:38:06   glutz
  408. '' Added function ValidateBrowse to set the combo and edit boxes after a browse.
  409. '' 
  410. ''    Rev 1.157   17 Jul 1995 15:52:12   glutz
  411. '' ValidatePath was checking path length before it was cleaning the path
  412. '' This would allow installation to \flw\..\
  413. '' 
  414. ''    Rev 1.156   17 Jul 1995 15:32:36   amontalv
  415. '' Changed the prodno in Lot_AddLinkToFolder to always be 1.
  416. '' 
  417. ''    Rev 1.155   17 Jul 1995 13:51:50   amontalv
  418. '' Added "Overview" to Windows Help, so that we would have the new help look.
  419. '' 
  420. ''    Rev 1.154   17 Jul 1995 13:33:08   glutz
  421. '' All error messages concerning paths are suppressed if a UNC volume
  422. '' cannot be mapped to a drive letter.
  423. '' 
  424. ''    Rev 1.153   13 Jul 1995 11:25:34   tveerapp
  425. '' Modified the comments for Reg_GetObsFiles.
  426. '' 
  427. ''    Rev 1.152   13 Jul 1995 11:22:26   tveerapp
  428. '' Added Reg_SetObsFiles, RegGetObsFilesto support Obsolete files flag.
  429. '' 
  430. ''    Rev 1.151   12 Jul 1995 16:53:26   glutz
  431. '' Had to limit the length of the unc volume int the insufficient disk
  432. '' space dialog.
  433. '' 
  434. ''    Rev 1.150   11 Jul 1995 12:09:24   tveerapp
  435. '' Changed Lot_RegiterUinstallhandler, Lot_RegisterObjects to not
  436. '' register during a server, distrbution install.
  437. '' 
  438. ''    Rev 1.149   07 Jul 1995 15:58:32   glutz
  439. '' Added UNC volumes to CheckForSpace routine.
  440. '' 
  441. ''    Rev 1.148   06 Jul 1995 12:23:04   mzgripce
  442. '' change the destination of the uninstaller fron the components directory
  443. '' to the windows directory
  444. '' 
  445. ''    Rev 1.147   28 Jun 1995 15:54:36   tveerapp
  446. '' Fixed EXECUTE requiring Sub Initialize.
  447. '' 
  448. ''    Rev 1.146   27 Jun 1995 15:54:32   mzgripce
  449. '' put the execute string between sub initialize and end sub to enable 
  450. '' on error / error # handeling for share processing
  451. '' 
  452. ''    Rev 1.145   23 Jun 1995 17:09:24   mzgripce
  453. '' fixed jmoy2t4pny pert 2 by compensating if the user starts a path with no \
  454. '' 
  455. ''    Rev 1.144   23 Jun 1995 12:47:42   mzgripce
  456. '' add program_group class 
  457. '' 
  458. ''    Rev 1.143   23 Jun 1995 12:22:12   jdonohue
  459. '' Added FindResourceinDLL function, add global string for name of our generic
  460. '' dialog proc and use in AddToBillboardList (original argument not used)
  461. '' 
  462. ''    Rev 1.142   22 Jun 1995 17:27:08   mzgripce
  463. '' add hive class to register object
  464. '' 
  465. ''    Rev 1.141   22 Jun 1995 12:43:56   jdonohue
  466. '' Revised AddToBillboardList to look for resource in list of DLLs
  467. '' 
  468. ''    Rev 1.140   22 Jun 1995 10:59:00   mzgripce
  469. '' change the cinstnode.ini filename to cinstnod.ini 
  470. '' 
  471. ''    Rev 1.139   21 Jun 1995 14:27:28   glutz
  472. '' Added function ValidateEditBox to check edit box
  473. '' strings for valid letter drives or UNC volumes
  474. '' 
  475. ''    Rev 1.138   19 Jun 1995 18:45:18   mzgripce
  476. '' change lot_callShare to call the sharetools if share or share32 are supported
  477. '' 
  478. ''    Rev 1.137   19 Jun 1995 17:40:12   mzgripce
  479. '' change the key Display Name to DisplayName (for uninstaller)
  480. '' 
  481. ''    Rev 1.136   19 Jun 1995 16:39:44   mzgripce
  482. '' add Lot_RegisterObject
  483. '' 
  484. ''    Rev 1.135   19 Jun 1995 10:27:20   amontalv
  485. '' Put in code to add function to New Folder button and Remove Folder button.  Also
  486. '' fixed some of the selection problems in the tree list.
  487. '' 
  488. ''    Rev 1.134   15 Jun 1995 19:41:30   amontalv
  489. '' Checked for and changed integers passed to C functions.  Changed to longs.
  490. '' 
  491. ''    Rev 1.133   15 Jun 1995 17:52:20   amontalv
  492. '' The problem with the program groups and errors with installed features was that
  493. '' the C code FFindFirst() expected a integer that contained the flag for which to look.
  494. '' In LotusScript when we called this function we passed an integer, but an integer
  495. '' in Script is different than an integer in C.  The fix is to convert the Script
  496. '' integer to a long using Clng() at the call for the C function.
  497. '' 
  498. ''    Rev 1.132   13 Jun 1995 17:27:08   mzgripce
  499. '' import FWriteDestinationSymAndVal, write Lot_WriteDestinationSymAndVal 
  500. '' subroutine and call it in Lot_SaveFeature to register the dir symbols
  501. '' and their values for uninstall
  502. '' 
  503. ''    Rev 1.131   12 Jun 1995 15:10:30   tveerapp
  504. '' Added a check in the function Lot_TrimEndSlash. Checks if the
  505. '' string is of length > 0. Script's MID$ chokes on an empty path string.
  506. '' 
  507. ''    Rev 1.130   09 Jun 1995 17:05:42   mzgripce
  508. '' added Lot_Register_Uninstaller
  509. '' 
  510. ''    Rev 1.129   09 Jun 1995 15:08:54   amontalv
  511. '' Added code to set global variable in START.LSS to error condition value.
  512. '' 
  513. ''    Rev 1.128   09 Jun 1995 14:25:58   glutz
  514. '' Fixed unc mapping bug
  515. '' 
  516. ''    Rev 1.127   09 Jun 1995 11:28:38   jdonohue
  517. '' Send quit message to WinHelp
  518. '' 
  519. ''    Rev 1.126   08 Jun 1995 16:48:54   jdonohue
  520. '' Added cancel option for tight disk space message box
  521. '' 
  522. ''    Rev 1.123   07 Jun 1995 17:50:12   amontalv
  523. '' Set the Selected folder to the root only the first time that
  524. '' Reg_SetProgManagerGroup is called.
  525. '' 
  526. ''    Rev 1.122   07 Jun 1995 16:30:44   amontalv
  527. '' Changed the Win95 start folder so that it initializes
  528. '' earlier in the program.  This should make automation
  529. '' easier to implement for it.  There are still a couple of
  530. '' bugs that I need to work out, but I feel that I should
  531. '' check what I have now.
  532. '' 
  533. ''    Rev 1.121   07 Jun 1995 11:23:24   glutz
  534. '' ValidatePath and IsPathwritable now work with UNC volumes
  535. '' 
  536. ''    Rev 1.120   06 Jun 1995 15:59:28   amontalv
  537. '' We are experiencing problems with LotusScript when we fill buffers with
  538. '' nulls and then pass them to C routines.  For the time being, it is suggested
  539. '' that we fill our buffers with spaces.  To this end (and to make it
  540. '' easier to change back later) I have created a small LotusScript routine
  541. '' named CreateBuffer.  You use it any time you ordinarily would use
  542. '' STRING$(num, 0).  CreateBuffer() just needs the num, it decides what to
  543. '' fill the buffer with (sorry about the grammer).  Right now it fill the
  544. '' buffer with spaces.  Later we will change it back to nulls.  Also look
  545. '' at the routine NullTrim().  It will get rid of final nulls and spaces.
  546. '' You can use this when getting a buffer that has been changed or filled
  547. '' in a external C routine.
  548. '' 
  549. ''    Rev 1.119   06 Jun 1995 15:34:44   mzgripce
  550. '' added 3 fields ti the prods struct to support moreDirectories prompt and
  551. '' 4 CIT functions (one set and three gets) to register this data with CIT
  552. '' 
  553. ''    Rev 1.118   05 Jun 1995 18:15:22   tveerapp
  554. '' Removed SetTheComponentsDir. This is taken care of in InitShare32
  555. '' in share32.lss.
  556. '' 
  557. ''    Rev 1.117   05 Jun 1995 16:37:20   amontalv
  558. '' Made changes for migrating to LotusScript version 3.0.37.
  559. '' 
  560. ''    Rev 1.116   02 Jun 1995 14:49:06   tveerapp
  561. '' Changed IDC_HELP to IDC_CITHELP.
  562. '' 
  563. ''    Rev 1.115   02 Jun 1995 08:54:26   glutz
  564. '' Lot_checkPath calls Lot_SplitUNCPath
  565. '' 
  566. ''    Rev 1.114   01 Jun 1995 17:02:04   glutz
  567. '' Lot_GheckPath works with UNC paths
  568. '' 
  569. ''    Rev 1.113   01 Jun 1995 11:11:44   amontalv
  570. '' Added API function CreateLink to create shortcuts.  Also added functions
  571. '' to save and get the link path to support the CreateLink.  I also changed
  572. '' the startup program folder code to use the default dialog proc and changed
  573. '' the default dialog proc to process directory trees.
  574. '' 
  575. ''    Rev 1.112   31 May 1995 09:52:20   callanan
  576. '' Accessing help from the lotustmp dir not the current directory as the 
  577. '' current directory changes when you change drive.
  578. '' 
  579. ''    Rev 1.111   30 May 1995 15:43:34   amontalv
  580. '' Made a new function PopupWithFunction.  PopupModalDlg now calls this.  Needed to
  581. '' do this to call dialog with my own dialog function.
  582. '' 
  583. ''    Rev 1.110   30 May 1995 13:09:32   jdonohue
  584. '' Pass DLL list in argument to FDoDialog
  585. '' 
  586. ''    Rev 1.109   30 May 1995 10:00:00   amontalv
  587. '' Added routine PopupFolderDlg to put up the Win95 Program folder dialog.
  588. '' 
  589. ''    Rev 1.108   25 May 1995 20:43:40   amontalv
  590. '' Checked in for Greg Lutz.  He commented out code that validated path in order
  591. '' to get long file names.
  592. '' 
  593. ''    Rev 1.107   19 May 1995 19:06:00   glutz
  594. '' Added some comments to UNC functions
  595. '' 
  596. ''    Rev 1.106   18 May 1995 12:21:20   tveerapp
  597. '' Added SetTheComponentsDir stub.MZ to fill in contents.
  598. '' 
  599. ''    Rev 1.105   18 May 1995 10:37:46   jdonohue
  600. '' Fixed logic for AddToBillboardList with multiple resource DLLs
  601. '' 
  602. ''    Rev 1.104   17 May 1995 17:53:50   mzgripce
  603. '' Change Reg_SetLicenserSupport() and Reg_SetLicenseSelected() to eliminate
  604. '' Licenser support 
  605. '' 
  606. ''    Rev 1.103   16 May 1995 17:13:06   amontalv
  607. '' Had to change the name of the dialog proc to _FNameOrgDlgProc@16.
  608. '' 
  609. ''    Rev 1.102   16 May 1995 17:07:56   glutz
  610. '' Split all automation functions out to automate.lss
  611. '' 
  612. ''    Rev 1.101   16 May 1995 09:19:52   glutz
  613. '' Added wrappers for
  614. '' FAddToDriveFreeSpaceList
  615. '' FIsUnvalidatedUNCPath
  616. '' FisValidUNCPath
  617. '' Added SUB Lot_SplitUNCPath
  618. '' Added functions'
  619. '' Lot_IsUnvalidatedUNCPath
  620. '' Lot_IsValidUNCPath
  621. '' Modified
  622. '' IsPathWritable
  623. '' ValidatePath
  624. '' SelectDriveCombo
  625. '' 
  626. ''    Rev 1.100   15 May 1995 11:19:18   jdonohue
  627. '' Call SetUpApi in initialize function
  628. '' 
  629. ''    Rev 1.99   11 May 1995 16:55:58   tveerapp
  630. '' Added a global variable gLogFile$ . Commented out the calls
  631. '' to WriteToLogFile - this is no longer a function.
  632. '' 
  633. ''    Rev 1.98   03 May 1995 18:17:40   mzgripce
  634. '' fix the syntax errors 
  635. '' 
  636. ''    Rev 1.97   03 May 1995 11:45:56   tveerapp
  637. '' Fixed the cfbuild-c2build merge.
  638. '' 
  639. ''    Rev 1.96   02 May 1995 17:51:08   mzgripce
  640. '' fixed some syntax errors in new features 
  641. '' 
  642. ''    Rev 1.95   02 May 1995 12:53:34   cmoy
  643. '' Merged c2 into cf build
  644. '' 
  645. ''    Rev 1.88   27 Apr 1995 16:48:10   mheerman
  646. '' Removed debug print from help case.
  647. ''    Rev 1.92F  26 Apr 1995 17:33:42   mzgripce
  648. '' replace TwoMainDirFlag with ExtraProdDirsNum and change the 
  649. '' subroutine and function name that process it.
  650. '' 
  651. ''    Rev 1.91F  25 Apr 1995 17:10:46   mzgripce
  652. '' add a new field: TwoMainDirFlag to ProdInfo Structure
  653. '' add SUBROUTINE Reg_SetTwoMainDirFlag and FUNCTION Reg_GetProdSupportForTwo-
  654. '' MainDir()
  655. '' change Reg_RegisterProductNames to set TwoMainDirFlag to 0
  656. '' 
  657. ''    Rev 1.87   14 Apr 1995 16:03:16   amontalv
  658. '' Deleted code that took care of final null in nul terminated strings.
  659. ''    Rev 1.90F  25 Apr 1995 11:45:20   tveerapp
  660. '' Added Lot_AutoCustomizeShare().
  661. '' 
  662. ''    Rev 1.86   10 Apr 1995 17:58:42   amontalv
  663. '' Made changes to functions and to some callback routines.
  664. ''    Rev 1.89F  24 Apr 1995 14:02:08   tveerapp
  665. '' Fixed Lot_AutoInstallCustomize.
  666. '' 
  667. ''    Rev 1.88   19 Apr 1995 14:38:24   jdonohue
  668. '' Changed SYM_CUIDLL$ from DLL name to list of DLLs in PopupMod..Dialog and 
  669. '' AddToBillboardList
  670. '' 
  671. ''    Rev 1.87F  13 Apr 1995 10:46:36   mzgripce
  672. '' Add Share32 field to ProdInfo struct
  673. '' Change Reg_RegiserProductNames to set the default of Share32 to 0
  674. '' added: Lot_AreShare32ToolsSupported(); Lot_GetShare32ToolsSize()
  675. '' Reg_GetProdSupportForShare32(); Reg_SetShare32Flag()
  676. '' 
  677. ''    Rev 1.86F  13 Apr 1995 19:00:20   tveerapp
  678. '' Added Lot_AutoInstallCustomize.
  679. '' 
  680. ''    Rev 1.85   05 Apr 1995 19:53:52   amontalv
  681. '' Porting to 32 bit.
  682. '' 
  683. ''    Rev 1.84   31 Mar 1995 18:47:52   amontalv
  684. '' Had to add aliases to function names for LotusScript to find them in DLLs
  685. '' 
  686. ''    Rev 1.83   20 Jan 1995 16:42:48   tveerapp
  687. '' 
  688. '' Fixed spr# ccol2nsl4. In autogetsetlicenser,moved the if licselected% to the right place.
  689. '' 
  690. ''    Rev 1.82   17 Jan 1995 16:45:12   tveerapp
  691. '' 
  692. '' Replaced existing error message for AutoCheckForspace.
  693. '' Fixes spr# TVEN2NBNEP.
  694. '' 
  695. ''    Rev 1.81   14 Jan 1995 15:58:54   jplump
  696. '' 
  697. '' Removed else case in Lot_AutoSuiteAppSelect. Before this routine
  698. '' is called in main, there is a check to see if the product is a
  699. '' SUITE; if it is not, this routine is not called. Therefore, the
  700. '' else case (if not Suite) in this routine won't happen. If the logic
  701. '' in main changes not to check for Suite, then the else case should
  702. '' not post an error for the user, but return to main without looking
  703. '' for Suite Applications.
  704. '' 
  705. ''    Rev 1.80   13 Jan 1995 11:28:18   jplump
  706. '' 
  707. '' In Lot_AutoGetInstallType, added option 4 (node). This option really doesn't
  708. '' do anything if the user has already done a server install and is doing a 
  709. '' legitimate node install. However, if the user has not done a server install
  710. '' and puts 4 as the install type, an error will be displayed. This error tells
  711. '' the user that he must to a server install first.
  712. '' 
  713. '' 
  714. '' 
  715. ''    Rev 1.79   11 Jan 1995 10:28:24   tveerapp
  716. '' 
  717. '' Fixed the logic in the AutoNodeoptions processing. Changed the OR to AND.
  718. '' The error should be signaled only if it is neither a 1 nor a 0.
  719. '' 
  720. ''    Rev 1.78   10 Jan 1995 19:04:38   jplump
  721. '' 
  722. '' When processing values from RSP file in automation,
  723. '' added check for missing value before casting string
  724. '' to integer. This is a workaround for a bug in
  725. '' LotusScript. An empty string should be a 0 when 
  726. '' cast to an integer (CINT), but it is not.
  727. '' SPR JMOY2N7QVK
  728. '' 
  729. ''    Rev 1.77   09 Jan 1995 16:50:32   tveerapp
  730. '' 
  731. '' Removed redundant code from Lot_CheckRSPPath as a result of the preious change(1).
  732. '' 
  733. ''    Rev 1.76   09 Jan 1995 16:48:04   tveerapp
  734. '' 
  735. '' Two changes:
  736. '' 1. Fixed the default for Lot_CheckRSPPath's return value to be "".
  737. '' 2. Fixed spr# JHOH2N7PHF
  738. '' 
  739. ''    Rev 1.75   07 Jan 1995 18:26:02   jplump
  740. '' 
  741. '' Made changes to keyword and section processing in Lot_Auto???
  742. '' functions to reflect changes in auto.rsp due to DOC review.
  743. '' 
  744. '' 
  745. ''    Rev 1.74   07 Jan 1995 15:56:20   jplump
  746. '' 
  747. '' In Lot_AutoCheckRSPPath fixed problem with function
  748. '' returning and invalid path. Calling functions should
  749. '' expect an empty string as a return value if the path
  750. '' is invalid.
  751. '' 
  752. ''    Rev 1.73   30 Dec 1994 14:12:28   jplump
  753. '' 
  754. '' Removed section name from error case in Select Applications processing
  755. '' 
  756. ''    Rev 1.72   30 Dec 1994 14:00:40   jplump
  757. '' 
  758. '' Added Lot_Auto_CheckRSPPath to validate paths in the response file.
  759. '' If the user does not supply a path in the rsp file, he\she will get
  760. '' this message: "Automated Install Error. Response File: One or more
  761. '' product directory paths are invalid in section:      " If the user
  762. '' supplies a path that is invalid, the invalid path message will be
  763. '' displayed first, and then Automated Install Error.
  764. '' 
  765. '' 
  766. ''    Rev 1.71   23 Dec 1994 18:34:30   jplump
  767. '' 
  768. '' Changed automation errors to be resourced errors.
  769. '' 
  770. ''    Rev 1.70   23 Dec 1994 14:07:44   jplump
  771. '' 
  772. '' Added Lot_AutoGetSetLicenserInfo
  773. '' Removed print statements
  774. '' Enhanced AutoDebug function
  775. '' 
  776. '' 
  777. ''    Rev 1.69   22 Dec 1994 15:09:08   tveerapp
  778. '' 
  779. '' Added Error Msg to AutoCheckForSpace
  780. '' 
  781. ''    Rev 1.68   22 Dec 1994 14:27:16   tveerapp
  782. '' 
  783. '' Fixed a type mismatch
  784. '' 
  785. ''    Rev 1.67   22 Dec 1994 14:22:42   tveerapp
  786. '' 
  787. '' Modified Lot_AutoGetProductDestDir.. for suite.
  788. '' 
  789. ''    Rev 1.66   22 Dec 1994 13:28:26   tveerapp
  790. '' 
  791. '' Fixed Lot_AutoSuiteAppSelect function.
  792. '' 
  793. ''    Rev 1.65   22 Dec 1994 11:38:52   tveerapp
  794. '' 
  795. '' Changed Lot_Check path to ValidatePath in Lot_AutoGetProductDestDir.
  796. '' 
  797. ''    Rev 1.64   21 Dec 1994 17:18:34   tveerapp
  798. '' 
  799. '' Fixed a type mismatch
  800. '' 
  801. ''    Rev 1.63   21 Dec 1994 17:08:22   tveerapp
  802. '' 
  803. '' Added Lot_AutoProcessNodeOptions.
  804. '' 
  805. ''    Rev 1.62   21 Dec 1994 14:58:44   tveerapp
  806. '' 
  807. '' Removed an erroneous end case
  808. '' 
  809. ''    Rev 1.61   21 Dec 1994 14:56:12   tveerapp
  810. '' 
  811. '' Fixed a typo
  812. '' 
  813. ''    Rev 1.60   21 Dec 1994 13:10:00   tveerapp
  814. '' 
  815. '' Added a missing end if and Next
  816. '' 
  817. ''    Rev 1.59   21 Dec 1994 13:03:12   tveerapp
  818. '' 
  819. '' Added Lot_AutoSuiteAppSel function. Added Error messages that need to be resourced!!
  820. '' Modified Lot-AutoGetSIzeofInstall.
  821. '' 
  822. ''    Rev 1.58   21 Dec 1994 11:54:48   tveerapp
  823. '' 
  824. '' Modified Lot_AutoGetBase function. It returns the base directory instead of setting it.
  825. '' 
  826. ''    Rev 1.57   12 Dec 1994 11:36:34   tveerapp
  827. '' 
  828. '' Incorporated jill's changes to Lot_AutoGetProductDestinationDir and
  829. '' Lot_AutoWriteOutDebugFile. Remmed out the existing functions. These
  830. '' can be removed after verfication with jill.
  831. '' 
  832. ''    Rev 1.56   12 Dec 1994 11:05:08   mzgripce
  833. '' 
  834. '' Added 4 funcs:Lot_AutoChangeLotusAppDir(), Lot_AutoConsolidateLotusAppDir()
  835. '' Lot_AutoConsolidateMoveCopy(), Lot_AutoIsThisNetLotusApp() 
  836. '' 
  837. ''    Rev 1.55   08 Dec 1994 20:10:34   jplump
  838. '' Added Lot_AutoWriteOutDebugFile
  839. '' Fixed Lot_AutoGetProductDestDirSymbol to use prodno%
  840. '' 
  841. ''    Rev 1.54   06 Dec 1994 17:21:00   tveerapp
  842. '' 
  843. '' Modified Lot_GetKeyValFromResponseFile to set gAutoFile$ to thw
  844. '' value of the symbol processed by shell in the command line.
  845. '' 
  846. ''    Rev 1.53   06 Dec 1994 10:23:54   tveerapp
  847. '' 
  848. '' Added Lot_AutoCinfigureAutoExec function and AutoInstallReboot.
  849. '' 
  850. ''    Rev 1.52   05 Dec 1994 15:09:52   jplump
  851. '' Added Lot_AutoGetUserInfo
  852. '' 
  853. ''    Rev 1.51   02 Dec 1994 15:56:56   cmoy
  854. '' 
  855. '' Merged automation files
  856. '' 
  857. ''    Rev 1.50   02 Dec 1994 15:10:42   cmoy
  858. '' 
  859. ''    Rev 1.11   01 Dec 1994 17:30:54   tveerapp
  860. '' 
  861. '' Added The AutoCheckSpace function.
  862. '' 
  863. ''    Rev 1.10   01 Dec 1994 10:22:16   jplump
  864. '' Added character checking to Lot_AutoGetProgramGroup
  865. '' 
  866. '' 
  867. '' 
  868. ''    Rev 1.9   30 Nov 1994 10:19:56   tveerapp
  869. '' Modified RegisterCallback function to register a callback only when not
  870. '' in the automation mode.
  871. '' 
  872. ''    Rev 1.8   29 Nov 1994 14:27:22   tveerapp
  873. '' Added a check to Lot_GetKeyValFromResponseFile.
  874. '' 
  875. ''    Rev 1.7   29 Nov 1994 12:53:34   tveerapp
  876. '' 
  877. '' Added i%, nProds to the declartions.D
  878. '' 
  879. ''    Rev 1.6   29 Nov 1994 12:45:54   tveerapp
  880. '' Modified Lot_AutoGetSizeOFinstall function. It returns an integer.
  881. '' 
  882. ''    Rev 1.5   29 Nov 1994 11:42:18   jplump
  883. '' 
  884. '' Added functions:  Lot_AutoGetSizeOfInstall & 
  885. '' Lot_AutoGetProgramGroup.
  886. '' 
  887. ''    Rev 1.4   23 Nov 1994 16:27:40   tveerapp
  888. '' 
  889. '' Added Lot_AutoGetInstallType function used in main.
  890. '' 
  891. ''    Rev 1.3   23 Nov 1994 15:22:02   tveerapp
  892. '' 
  893. '' Modified PopupModal for Automation.
  894. '' 
  895. ''    Rev 1.2   23 Nov 1994 14:02:02   jplump
  896. '' Added Lot_AutoGetBaseDirSymbol
  897. '' 
  898. ''    Rev 1.1   22 Nov 1994 16:34:40   jplump
  899. '' 
  900. '' Added INIT symbol processor
  901. '' 
  902. ''    Rev 1.0   22 Nov 1994 16:26:10   jplump
  903. '' Initial Revision
  904. ''==========
  905. '' 
  906. ''    Rev 1.47   02 Nov 1994 18:33:34   jplump
  907. '' Resourced error message in ModifyAutoexec()
  908. '' SID_ERR_AUTOEXEC_NOT_COPIED
  909. '' 
  910. '' Jill Salter Plump
  911. '' 
  912. '' 
  913. ''    Rev 1.46   03 Oct 1994 11:12:12   tveerapp
  914. '' Fixed spr# 1023351. Makepath checks for 13 chars. and a \.
  915. '' If valid accepts it else returns an empty string.
  916. '' 
  917. ''    Rev 1.45   27 Sep 1994 13:05:56   cmoy
  918. '' Added constants needed for rebooting and restarting
  919. '' 
  920. ''    Rev 1.44   22 Sep 1994 09:35:42   mzgripce
  921. '' Add CDOptDefaultSelected in PRODINFO structure
  922. '' Write: SUB Reg_ReSetCDOptionSelected
  923. ''  SUB Reg_ReSetCDOptionSelectedToDefault
  924. ''  SUB Reg_ReSetAllOptSelToDefaults
  925. '' all functions for cd settings checking and change the funcs that populates 
  926. '' 
  927. ''    Rev 1.43   02 Aug 1994 11:17:58   mzgripce
  928. '' To fix Node Options bug I commented out the call to the sub
  929. '' Reg_ReSetAllNodeOptsToDefaults in the function 
  930. '' Lot_AreAnyNodeOptAvailToSrv()
  931. '' 
  932. ''    Rev 1.42   21 Jul 1994 18:09:34   thangv
  933. '' Modified return value of IsNotesinpath to be 1  if it is not in
  934. '' lotus.ini. (this will reduce the ocuurences of autoexec change dialog
  935. '' showing up).
  936. '' 
  937. ''    Rev 1.41   13 Jun 1994 17:20:12   cmoy
  938. '' 
  939. '' ADDED GETBOOTDRIVE FUNCTIONALITY
  940. '' 
  941. ''    Rev 1.40   08 Jun 1994 17:05:12   mmeth
  942. '' Fixed PopulateCINSTALLLIST.  The bug in here was that we weren't writing ov
  943. '' previous versions of cinstall.ini correctly. gNCINSTALL set to -1 instead o
  944. '' 
  945. ''    Rev 1.39   05 Jun 1994 20:21:36   ptilton
  946. '' Added Global Subroutines for Setting OracleHomeDir & NotesDataDir
  947. '' Symbols.  Moved functions for determining values for symbols from 
  948. '' SHARE.LSS
  949. '' 
  950. ''    Rev 1.38   02 Jun 1994 12:35:32   thangv
  951. '' 
  952. '' Added TrimNetlotusapp function.
  953. '' 
  954. ''    Rev 1.37   31 May 1994 14:04:54   thangv
  955. '' 
  956. '' Added Showwaitcursor and restorecursor foe fine check in CheckforSpace.
  957. '' 
  958. ''    Rev 1.36   31 May 1994 13:40:04   mmeth
  959. '' Added Function Calls for Suite to handle previous versions
  960. '' 
  961. ''    Rev 1.35   26 May 1994 07:25:00   mmeth
  962. '' In CheckForSpace the variable notused1$ was refernced, but not declared.
  963. '' 
  964. ''    Rev 1.34   25 May 1994 17:10:12   cmoy
  965. '' 
  966. '' put up a please wait dialog in CheckForSpace
  967. '' 
  968. ''    Rev 1.33   24 May 1994 16:54:16   thangv
  969. '' Set the tab to 50 from 75 in CheckForSpace.
  970. '' 
  971. ''    Rev 1.32   24 May 1994 15:47:18   mmeth
  972. '' Fixed Performance problem having to do with reading and writing CINSTALL.IN
  973. '' 
  974. ''    Rev 1.31   23 May 1994 14:50:02   mzgripce
  975. '' fix a bug in IsThe Featureinstalled 
  976. '' 
  977. ''    Rev 1.30   20 May 1994 17:24:44   mmeth
  978. '' Modified Lot_IsTheFeatureInstalled. It uses a list (CINSTALL) and
  979. '' works faster.
  980. '' 
  981. ''    Rev 1.29   12 May 1994 11:20:24   mmeth
  982. '' Adding Icons for Lic and Install and using DoMsgBox instead of MessageBox
  983. '' 
  984. ''    Rev 1.28   29 Apr 1994 16:36:36   mzgripce
  985. '' 
  986. '' fixed spr # 28650
  987. '' 
  988. ''    Rev 1.27   28 Apr 1994 13:29:38   mzgripce
  989. '' 
  990. '' added Lot_IsDestVerNewerOrEqual()
  991. '' 
  992. ''    Rev 1.26   21 Apr 1994 15:32:40   mzgripce
  993. '' 
  994. '' implement the correct err message for too long path(SID_ERR_PATHLEN_...)
  995. '' 
  996. ''    Rev 1.25   20 Apr 1994 16:45:38   thangv
  997. '' Modified Lot_AreAnyNodeOptionsAvailToSrv function to check
  998. '' for any node options not being in the copylist.
  999. '' 
  1000. ''    Rev 1.24   20 Apr 1994 16:23:20   mzgripce
  1001. '' 
  1002. '' Reject paths that are too long.
  1003. '' 
  1004. ''    Rev 1.23   19 Apr 1994 10:28:32   thangv
  1005. '' Added FremoveSymbol(IDC_TEXT) in Popupmodal function
  1006. '' when exit button is selected.
  1007. '' 
  1008. ''    Rev 1.22   13 Apr 1994 09:55:28   cmoy
  1009. '' 
  1010. '' Added SHAREEXE and Notes as fields in Registration Database
  1011. '' Added SUBS:
  1012. '' Reg_SetSHAREEXESupport
  1013. '' Reg_SetNotesSupport
  1014. '' Added FUNCTIONS:
  1015. '' Reg_GetSHAREEXESupport
  1016. '' Reg_GetNotesSupport
  1017. '' GetNotesPathfromLotusIni
  1018. '' IsNotesInPath
  1019. '' IsShareInAUTOEXEC
  1020. '' ModifyAutoexec
  1021. '' GetBootDrive
  1022. '' Added Constants
  1023. '' MANotes
  1024. '' MAShare
  1025. '' 
  1026. ''    Rev 1.21   07 Apr 1994 16:41:12   mmeth
  1027. '' changed return code for EXECUTE statement to a public variable
  1028. '' 
  1029. ''    Rev 1.20   07 Apr 1994 12:38:20   mmeth
  1030. '' Modified DOEXEC to EXECUTE.
  1031. '' 
  1032. ''    Rev 1.19   06 Apr 1994 16:28:06   mmeth
  1033. '' Added a list gEXTRA.  This list gets initialized with an etra 200000
  1034. '' bytes for the Windows drive.  This can be modified by the product groups if
  1035. '' necessary. 
  1036. '' 
  1037. ''    Rev 1.18   04 Apr 1994 18:02:18   mmeth
  1038. '' Took out share.lss depednancies for those products that don't need it.
  1039. '' 
  1040. ''    Rev 1.17   23 Mar 1994 10:11:08   mmeth
  1041. '' WhereIsFeature... fixed for SmartSuiteNode case &
  1042. '' SaveFeatureInstalled... was fixedso it would write without adding extra "\"
  1043. '' 
  1044. ''    Rev 1.16   23 Mar 1994 09:17:52   mzgripce
  1045. '' add LOOKONNETLOTUSAPP to whereIsFeature 
  1046. '' 
  1047. ''    Rev 1.15   18 Mar 1994 18:30:50   mzgripce
  1048. '' change Lot_WhereIsFeature and save Destination Directories for suit server
  1049. '' 
  1050. ''    Rev 1.14   11 Mar 1994 16:58:56   thangv
  1051. '' Added the Dist field in the Registration database
  1052. '' Added The Reg_Set.. and Reg_GetProd.. functions for dist.
  1053. '' 
  1054. ''    Rev 1.13   10 Mar 1994 17:24:54   mzgripce
  1055. '' add Lot_InitializeWinWinsysSym subroutine
  1056. '' 
  1057. ''    Rev 1.12   01 Mar 1994 17:08:30   mzgripce
  1058. '' CALL FIsKeywordInCopyList into Lot_SaveNodeOptionsInInstallIni
  1059. '' 
  1060. ''    Rev 1.11   01 Mar 1994 12:13:14   mzgripce
  1061. '' added NodeOptDefaultSelected to PRODINFO type def
  1062. '' change: Reg_RegisterProductNames and Reg_SetNodeOptionSelected
  1063. '' added: Reg_IsNodeOptionDefaultSelected
  1064. ''        Reg_ReSetNodeOptionSelectedToDefault
  1065. ''        Reg_ReSetNodeOptionSelected and
  1066. ''        Reg_ReSetAllNodeOptsSelToDefaults
  1067. '' 
  1068. ''    Rev 1.10   24 Feb 1994 12:56:12   tingmann
  1069. '' add lot_lcbsettabs
  1070. '' 
  1071. ''    Rev 1.9   23 Feb 1994 18:14:30   mzgripce
  1072. '' fix Lot_SaveTheNodeOptionsInInstallIni() (replace"1" with STR(1))
  1073. '' 
  1074. ''    Rev 1.8   22 Feb 1994 17:04:24   mzgripce
  1075. '' add Lot_AreAnyNodeOptAvailToSrv()
  1076. '' 
  1077. ''    Rev 1.7   17 Feb 1994 10:24:46   mmeth
  1078. '' Added Reg_SetAllowUserToChoseInSMartSUite
  1079. '' 
  1080. ''    Rev 1.6   16 Feb 1994 14:40:06   tingmann
  1081. '' add reg_getproductname,reg_getuiinorout, lot_lcbsetsel
  1082. '' 
  1083. ''    Rev 1.5   16 Feb 1994 12:13:46   tingmann
  1084. '' fix END statement problem when running from DOEXEC (in QUIT sub)
  1085. '' 
  1086. ''    Rev 1.4   15 Feb 1994 15:01:38   mmeth
  1087. '' added pvcs line for toolkit.lss &
  1088. ''
  1089. ''   Creation Date: Wednesday January 5, 1994
  1090. ''
  1091. ''   Copyright Lotus Development Corporation, (c) 1994
  1092. ''
  1093. ''
  1094. ''   Description:
  1095. ''      
  1096. ''
  1097. ''   Additional authors: MZ
  1098. ''
  1099. ''   Change History:
  1100. ''----------------------------------------------------------------------
  1101. ''   Date     Vers. Pgmr  SPR#  Change
  1102. ''----------------------------------------------------------------------
  1103. '' 02-16-94   0032  MZ         Added Lot_AreAnyNodeOptAvailToSrv()
  1104. ''!
  1105. '' 02-16-94   0031  TQI           Fix exit problem when calling QUIT during DOEXEC
  1106. '' 02-14-94   0030  MZ          Added Lot_IsAnyNodeOptAvailToNode() and
  1107. ''                              Lot_AreNodeOptAvailToNodeForProd()
  1108. ''                              Lot_GetNumOfNodeOptAvailToNodeForProd()
  1109. '' 02-11-94   0029  MZ          Added Lot_SaveTheNodeOptionsInInstallIni(),
  1110. ''                              Lot_GetLastNodeOptNumber() and
  1111. ''                              Lot_IsTheNodeOptionsAvailToNode() functions
  1112. '' 02-07-94   0028  MZ          move Lot_SaveFeaturesInstaledInInstallIni()
  1113. ''                              and Lot_GetLastFeatureNumber() from share.lss
  1114. '' 02-06-94   0027  MMETH       fixed Lot_Toggle... and MsgBox-> MessageB
  1115. '' 02-04-94   0026  MMETH       Added defaults for Reg DB.
  1116. '' 02-03-94   0025  MMETH       added Lot_WhereIsFeature also moved 
  1117. ''                              Lot_IstheFeatureInstall from toolkit.lss
  1118. '' 02-01-94   0024  MZ          ADDED Lot_GetGroupName and set
  1119. ''                              Prods(gCurrNumOfProds%).ProgManagerGroup="Lotus Applications"
  1120. '' 02-01-94   0024  MMETH       INSTALL_SOURCE still coming up empty.
  1121. '' 01-31-94   0023  MMETH       Cleaned up CallProductFunctions and Back
  1122. '' 01-30-94   0022  MMETH       Removed CreateCOuntDir from remmed out code
  1123. '' 01-28-94   0021  MZ          Add:Reg_SetLicenseSelected
  1124. ''                                  Reg_IsLicenseSelected
  1125. ''                                  Reg_SetCountDirectory
  1126. ''                                  Reg_GetCountDirectory
  1127. ''                                  Reg_SetBillboardNumber
  1128. ''                                  Reg_GetBillboardNumber
  1129. ''                              Change Reg_RegisterProductNames to set the 
  1130. ''                              BillboardNumber to 0
  1131. '' 01-28-94   0022  MMETH       Fixed CallProducts for "BACK"
  1132. '' 01-28-94   0021  DND         Added Reg_GetSystemFileSize and
  1133. ''                              Reg_SetSystemFileSize.
  1134. '' 01-27-94   0020  DND         Lot_GetChapterValStr returns empty
  1135. ''                              string if chapter is not found.
  1136. '' 01-25-94   0019  DND         Move SetRestartDir, RestartListEmpty,
  1137. ''                              and ExitExecRestart from setupapi.
  1138. '' 01-25-94   0018  MMETH       Added Lot_TrimEndSlash
  1139. '' 01-24-94   0017  MMETH       Fix GetTheRealProdDir
  1140. '' 01-24-94   0016  TQI         Capture function returns (lsi36)
  1141. '' 01-24-94   0015  MMETH       Move GetTheRealProd from share.lss
  1142. ''                              added prodno% parm, and modified implememntaion
  1143. '' 01-21-94   0014  MMETH       Added Parms to Lot_CallProducts
  1144. '' 01-20-94   0013  DND         CheckForSpace no longer pops modeless
  1145. '' 01-20-94   0012  MZ          Modify Reg_SetSelectedInstallType() to set to 
  1146. ''                              complete if custom and/or laptop is not a
  1147. ''                              valid choice for the product.
  1148. '' 01-19-94   0011  DND         Modified the GetFirstDrive functions so
  1149. ''                              they now return with the default dir.
  1150. ''                              Made the AllDrive function more effecient.
  1151. '' 01-19-94   0010  MMETH       Changed CallProd family to use Reg_GetProductAcronym
  1152. '' 01-19-94   0009  MZ          Change TRUE/FALSE to 1/0 in Reg_* SUB/FUNCs
  1153. '' 01-19-94   0009  MMeth       Use SYM_UPDATELIST$. 
  1154. ''                              Added Reg_GetNumberOfProducts.
  1155. '' 01-19-94   0008  DND         Lot_Get/SetCurrentProduct saves and returns
  1156. ''                              an integer. This makes life much easier
  1157. ''                              for toolkit. Changed 
  1158. ''                              Reg_SetSelectedInstallTypes to
  1159. ''                              Reg_SetSelectedInstallType. Fixed 
  1160. ''                              SelectDriveCombo to accept a path.
  1161. ''                              Lot_ExtractDriveLetter returns lower case.
  1162. '' 01-19-94   0008  TQI         Use doexec instead of execute
  1163. '' 01-18-94   0007  MZ          move Lot_CleanPath() to setupapi.lss
  1164. '' 01-18-94   0006  MZ          Put in the Product registration database
  1165. '' 01-18-94   0005  DND         Added Lot_CleanPath
  1166. '' 01-12-94   0004  MMETH       Changed Return code of CallProd to string
  1167. '' 01-12-94   0003  mmeth            Lot_CallProductFunctions (func_name$, always%, parms$)
  1168. '' 01-12-94   0002  tqi         option declare
  1169. '' 01-10-94   0001  MZ          Make all symbols Constants and put them
  1170. ''                              in GLOBALS.LSS
  1171. '' 01-05-94   0000  DND         Initial checkin
  1172. ''----------------------------------------------------------------------
  1173. ''
  1174. ''**********************************************************************
  1175.  
  1176. 'USE "SETUPAPI"
  1177. USE "START"
  1178. USE "REGISTER"
  1179. OPTION DECLARE
  1180. '************ User messages
  1181.  
  1182. PUBLIC CONST WM_COMMAND        = 273
  1183. PUBLIC CONST WM_USER           = 1024
  1184. PUBLIC CONST UM_PAINTMODELESS  = (WM_USER+1000)
  1185. PUBLIC CONST UM_REBOOTFLAG     = (WM_USER+503)
  1186. PUBLIC CONST UM_RESTARTWINDOWS = (WM_USER+504)
  1187.  
  1188.  
  1189. '** Return codes for drive type
  1190. PUBLIC CONST DRIVE_REMOVABLE = 2
  1191. PUBLIC CONST DRIVE_FIXED     = 3
  1192. PUBLIC CONST DRIVE_REMOTE    = 4
  1193.  
  1194. '** Function return codes
  1195. PUBLIC CONST SUCCESS = 1
  1196. PUBLIC CONST FAILURE = 0
  1197. PUBLIC CONST MANotes = 1   '** used in ModifyAutoexec
  1198. PUBLIC CONST MAShare = 2   '** used in ModifyAutoexec
  1199.  
  1200. '** These numbers must match those in lcomstf\sections.h of lcomstf.dll!!
  1201. PUBLIC CONST F_NOTHING    = 0
  1202. PUBLIC CONST F_CHAPTER    = 1
  1203. PUBLIC CONST F_NAME       = 2
  1204. PUBLIC CONST F_INOROUT    = 4
  1205. PUBLIC CONST F_DISPLAY    = 8
  1206. PUBLIC CONST F_COMPLETE   = 16
  1207. PUBLIC CONST F_LAPTOP     = 32
  1208. PUBLIC CONST F_CUSTOM     = 64
  1209. PUBLIC CONST F_TIPS       = 128
  1210. PUBLIC CONST F_HELP       = 256
  1211. PUBLIC CONST F_DESTDIR    = 512
  1212. PUBLIC CONST F_BITMAP     = 1024
  1213. PUBLIC CONST F_EXCEPTION  = 2048
  1214. PUBLIC CONST F_SHARE      = 4096
  1215. PUBLIC CONST F_KEYWORD    = 8192
  1216. PUBLIC CONST F_DESTDIRSYM = 16384
  1217.  
  1218. PUBLIC CONST RT_BITMAP  = 2     'This should be a MAKEINTRESOURCE(2) really
  1219. PUBLIC CONST RT_DIALOG  = 5     'This should be a MAKEINTRESOURCE(5) really
  1220. PUBLIC CONST RT_STRING  = 6     'This should be a MAKEINTRESOURCE(6) really
  1221.  
  1222. 'The decorated name for the generic dialog procedure in dlgproc.c  JMD
  1223. PUBLIC CONST FNAMEORGDLGPROC$="_FNameOrgDlgProc@16"
  1224.  
  1225. 'needed in callbacks
  1226. PUBLIC CONST MAX_NO_DRIVECOMBOS = 4
  1227.  
  1228. '*****
  1229. 'NEEDED FOR THE ARRAY CINSTALL
  1230. DECLARE SUB PopulateCINSTALLLIST
  1231. DIM CINSTALL LIST AS STRING
  1232. DIM gNCINSTALL%
  1233.  
  1234. 'NEEDED FOR THE ARRAY CINSTNODE
  1235. DECLARE SUB PopulateCINSTNODELIST
  1236. DIM CINSTNODE LIST AS STRING
  1237. DIM gNCINSTNODE%
  1238.  
  1239. 'NEEDED FOR THE ARRAY COBJECT
  1240. DECLARE SUB PopulateCOBJECTLIST(iniPath$)
  1241. DIM COBJECT LIST AS INTEGER
  1242. DIM gNCOBJECT%
  1243.         
  1244. %rem
  1245.  Moved to register.lss
  1246. '******************** Product Registration  struc, array and count *********
  1247. TYPE PRODINFO
  1248.    Acronym                    AS STRING
  1249.    Name                       AS STRING
  1250.    Complete                   AS INTEGER
  1251.    Custom                     AS INTEGER
  1252.    Laptop                     AS INTEGER
  1253.    SelectedType               AS STRING
  1254.    UIInOrOut                  AS INTEGER
  1255.    AllowUserToPickInSuite     AS INTEGER
  1256.    FullSize                   AS LONG
  1257.    MinSize                    AS LONG
  1258.    Share                      AS INTEGER
  1259.    Share32                    AS INTEGER
  1260.    DataLens                   AS INTEGER
  1261.    SQL                        AS INTEGER
  1262.    Paradox                    AS INTEGER
  1263.    CDOpt                      AS STRING
  1264.    CDOptSelected              AS STRING
  1265.    CDOptDefaultSelected       AS STRING
  1266.    NodeOpt                    AS STRING
  1267.    NodeOptSelected            AS STRING
  1268.    NodeOptDefaultSelected     AS STRING
  1269.    Srv                        AS INTEGER
  1270.    Dist                       AS INTEGER
  1271.    ExtraProdDirsNum           AS INTEGER
  1272.    License                    AS INTEGER
  1273.    LicenseSelected            AS INTEGER
  1274.    CountDirectory             AS STRING
  1275.    ATM                        AS INTEGER
  1276.    DirSymList                 AS STRING         'Should be populated in Init
  1277.    ProgManagerGroup           AS STRING
  1278.     ProgFolder                                              AS STRING
  1279.    SystemFileSize             AS LONG
  1280.    BillboardNumber            AS INTEGER
  1281.    SHAREEXE                   AS INTEGER
  1282.    Notes                      AS INTEGER
  1283.    PreviousVersion            AS STRING      'This is a string for future purposes
  1284.    MoreDirsCBName             AS STRING
  1285.    MoreDirsDlgID              AS INTEGER
  1286.    MoreDirsHlpID              AS LONG
  1287.    ObsoleteFiles              AS INTEGER      'This is can be a string for future enhancements
  1288. END TYPE
  1289.  
  1290. DIM Prods(gMaxNumOfProds) AS PRODINFO  
  1291. DIM gCurrNumOfProds%                      '** Number of products
  1292. DIM gCurrentProduct%                      '** The current product
  1293. %endrem
  1294.  
  1295. '******************** Lotus DLL interface **************************
  1296.  
  1297. DECLARE PUBLIC FUNCTION FIsKeywordInCopyList LIB "lcomstf.dll" ALIAS "_FIsKeywordInCopyList@4" (ByVal szKeyword$) AS LONG
  1298. DECLARE PUBLIC FUNCTION FGetChapterFromKeyword LIB "lcomstf.dll" ALIAS "_FGetChapterFromKeyword@12" (ByVal szKeyword$, ByVal szChptname$, ByVal cbChptsize&) AS LONG
  1299. DECLARE PUBLIC FUNCTION FRemoveDir LIB "lcomstf.dll" ALIAS "_FRemoveDir@4" (ByVal szDir$) AS LONG
  1300. DECLARE PUBLIC FUNCTION FOpenInf LIB "lcomstf.dll" ALIAS "_FOpenInf@12" (ByVal szFile$,ByVal fCheck&,ByVal fCheckSyms&) AS LONG
  1301. DECLARE PUBLIC FUNCTION LcbGetChapterCost LIB "lcomstf.dll" ALIAS "_LcbGetChapterCost@16" (ByVal szchapter$,ByVal szextra$,ByVal szcost$, ByVal szneed$) AS LONG
  1302. DECLARE PUBLIC FUNCTION CbGetInfSectionKeyField LIB "lcomstf.dll" ALIAS "_CbGetInfSectionKeyField@20" (ByVal szSect$, ByVal szKey$, ByVal iField&, ByVal szBuf$, ByVal cbBuf&) AS LONG
  1303. DECLARE PUBLIC FUNCTION FMakeListInfSectionField LIB "lcomstf.dll" ALIAS "_FMakeListInfSectionField@12" (ByVal szSym$, ByVal szSect$, ByVal iField&) AS LONG
  1304. DECLARE PUBLIC FUNCTION FSetSymbolToListOfInfKeys LIB "lcomstf.dll" ALIAS "_FSetSymbolToListOfInfKeys@12" (ByVal szSym$, ByVal szSect$, ByVal fNulls&) AS LONG
  1305. DECLARE PUBLIC FUNCTION FAddSectionFilesToCopyList LIB "lcomstf.dll" ALIAS "_FAddSectionFilesToCopyList@12" (ByVal szSect$, ByVal szSrc$, ByVal szDest$) AS LONG
  1306. DECLARE PUBLIC FUNCTION FAddSectionKeyFileToCopyList LIB "lcomstf.dll" ALIAS "_FAddSectionKeyFileToCopyList@16" (ByVal szSect$, ByVal szKey$, ByVal szSrc$, ByVal szDest$) AS LONG
  1307. DECLARE PUBLIC FUNCTION FDumpCopyListToFile LIB "lcomstf.dll" ALIAS "_FDumpCopyListToFile@4" (ByVal szFile$) AS LONG
  1308. DECLARE PUBLIC SUB      ResetCopyList LIB "lcomstf.dll" ALIAS "_ResetCopyList@0" ()
  1309. DECLARE PUBLIC SUB      ResetFileCosts LIB "lcomstf.dll" ALIAS "_ResetFileCosts@0" ()
  1310. DECLARE PUBLIC FUNCTION FRemoveSectionFilesFromCopyList LIB "lcomstf.dll" ALIAS "_FRemoveSectionFilesFromCopyList@4" (ByVal szSect$) AS LONG
  1311. DECLARE PUBLIC FUNCTION FRemoveSectionKeyFileFromCopyList LIB "lcomstf.dll" ALIAS "_FRemoveSectionKeyFileFromCopyList@8" (ByVal szSect$, ByVal szKey$) AS LONG
  1312. DECLARE PUBLIC FUNCTION FSetBeepingMode LIB "lcomstf.dll" ALIAS "_FSetBeepingMode@4" (ByVal mode&) AS LONG
  1313. DECLARE PUBLIC SUB      ProSetPos LIB "lcomstf.dll" ALIAS "_ProSetPos@8" (ByVal x&, ByVal y&)
  1314. DECLARE PUBLIC FUNCTION GrcCopyFilesInCopyList LIB "lcomstf.dll" ALIAS "_GrcCopyFilesInCopyList@4" (ByVal hInstance&) AS LONG
  1315. DECLARE PUBLIC FUNCTION LcbGetCopyListCost LIB "lcomstf.dll" ALIAS "_LcbGetCopyListCost@12" (ByVal szExtraList$, ByVal szCostList$, ByVal szNeedList$) AS LONG
  1316. DECLARE PUBLIC FUNCTION FAddToBillboardList LIB "lcomstf.dll" ALIAS "_FAddToBillboardList@16" (ByVal szDll$, ByVal idDlg&, ByVal szProc$, ByVal lTicks&) AS LONG
  1317. DECLARE PUBLIC FUNCTION FClearBillboardList LIB "lcomstf.dll" ALIAS "_FClearBillboardList@0" () AS LONG
  1318. DECLARE PUBLIC FUNCTION SetCopyMode LIB "lcomstf.dll" ALIAS "_SetCopyMode@4" (ByVal fMode&) AS LONG
  1319. DECLARE PUBLIC FUNCTION GetCopyMode LIB "lcomstf.dll" ALIAS "_GetCopyMode@0" () AS LONG
  1320. DECLARE PUBLIC FUNCTION SetSizeCheckMode LIB "lcomstf.dll" ALIAS "_SetSizeCheckMode@4" (ByVal scmMode&) AS LONG
  1321. DECLARE PUBLIC FUNCTION LcbGetInfSectionSize LIB "lcomstf.dll" ALIAS "_LcbGetInfSectionSize@4" (ByVal szSect$)  AS LONG
  1322. DECLARE PUBLIC FUNCTION FSetSilent LIB "lcomstf.dll" ALIAS "_FSetSilent@4" (ByVal mode&) AS LONG
  1323. DECLARE PUBLIC FUNCTION ReadSerialNumber LIB "lcomstf.dll" ALIAS "_ReadSerialNumber@8" (ByVal szSrc$,ByVal szSerial$) AS LONG
  1324. DECLARE PUBLIC FUNCTION WriteUserRegistration LIB "lcomstf.dll" ALIAS "_WriteUserRegistration@16" (ByVal szRi$,ByVal szUser$,ByVal szCompany$,ByVal szSerial$) AS LONG
  1325. DECLARE PUBLIC FUNCTION ReadUserRegistration LIB "lcomstf.dll" ALIAS "_ReadUserRegistration@16" (ByVal szRi$,ByVal szUser$,ByVal szCompany$,ByVal szSerial$) AS LONG
  1326. DECLARE PUBLIC FUNCTION FPopulateLCB LIB "lcomstf.dll" ALIAS "_FPopulateLCB@8" (ByVal hDlg&,ByVal Chapter$) AS LONG
  1327. DECLARE PUBLIC FUNCTION FSetDateOfFile LIB "lcomstf.dll" ALIAS "_FSetDateOfFile@8" (ByVal szFile$,ByVal szDate$) AS LONG
  1328. DECLARE PUBLIC FUNCTION FGetFirstChild LIB "lcomstf.dll" ALIAS "_FGetFirstChild@12" (ByVal szChapter$,ByVal szFirsthapter$, ByVal nField&) AS LONG
  1329. DECLARE PUBLIC FUNCTION FGetFirst LIB "lcomstf.dll" ALIAS "_FGetFirst@12" (ByVal szChapter$,ByVal szFirsthapter$, ByVal nField&) AS LONG
  1330. DECLARE PUBLIC FUNCTION FGetChapterValStr LIB "lcomstf.dll" ALIAS "_FGetChapterValStr@16" (ByVal szChapter$,ByVal nField&, ByVal szBuf$,ByVal cbBuf&) AS LONG
  1331. DECLARE PUBLIC FUNCTION FGetChapterValInt LIB "lcomstf.dll" ALIAS "_FGetChapterValInt@12" (ByVal szChapter$,ByVal nField&, lpVal&) AS LONG
  1332. DECLARE PUBLIC FUNCTION FGetNextSibling LIB "lcomstf.dll" ALIAS "_FGetNextSibling@12" (ByVal szChapter$,ByVal szNextChapter$,ByVal nField&) AS LONG
  1333. DECLARE PUBLIC FUNCTION FGetNextChild LIB "lcomstf.dll" ALIAS "_FGetNextChild@4" (ByVal szNextChildChapter$) AS LONG
  1334. DECLARE PUBLIC FUNCTION FGetNext LIB "lcomstf.dll" ALIAS "_FGetNext@4" (ByVal szNextChapter$) AS LONG
  1335. DECLARE PUBLIC FUNCTION FToggleChapterFilesInCopyList LIB "lcomstf.dll" ALIAS "_FToggleChapterFilesInCopyList@4" (ByVal szChapter$) AS LONG
  1336. DECLARE PUBLIC FUNCTION LcbGetInfChapterSize LIB "lcomstf.dll" ALIAS "_LcbGetInfChapterSize@4" (ByVal szChapter$)  AS LONG
  1337. DECLARE PUBLIC FUNCTION FInitializeCopyList LIB "lcomstf.dll" ALIAS "_FInitializeCopyList@12" (ByVal szChpt$, ByVal szSourcedir$, ByVal nField&) AS LONG
  1338. DECLARE PUBLIC FUNCTION FRefreshDestination LIB "lcomstf.dll" ALIAS "_FRefreshDestination@4" (ByVal lpszSym$) AS LONG 
  1339. DECLARE PUBLIC FUNCTION FWriteDestinationSymAndVal LIB "lcomstf.dll" ALIAS "_FWriteDestinationSymAndVal@8" (ByVal lpszIniFile$,ByVal lpszIniSec$) AS LONG 
  1340. DECLARE PUBLIC FUNCTION FSetRestartDir LIB "lcomstf.dll" ALIAS "_FSetRestartDir@4" (ByVal szDir$) AS LONG
  1341. DECLARE PUBLIC FUNCTION FRestartListEmpty LIB "lcomstf.dll" ALIAS "_FRestartListEmpty@0" () AS LONG
  1342. DECLARE PUBLIC FUNCTION FExitExecRestart LIB "lcomstf.dll" ALIAS "_FExitExecRestart@0" () AS LONG
  1343. DECLARE PUBLIC FUNCTION Lot_CreateConsoleProcess LIB "lcomstf.dll" ALIAS "_Lot_CreateConsoleProcess@8" (ByVal lpExeName$, ByVal lpCommandLine$) AS INTEGER
  1344. DECLARE PUBLIC FUNCTION FGetSectionFileList LIB "lcomstf.dll" ALIAS "_FGetSectionFileList@12" (ByVal lpszSym$, ByVal lpszSection$, ByVal RenameFlag%) AS INTEGER
  1345.  
  1346. '****************  Tabs UI Declarations  *********************************
  1347.  
  1348. DECLARE PUBLIC FUNCTION DriveType LIB "mscuistf.dll" ALIAS "_DriveType@4" (ByVal drivetype&) AS LONG
  1349. DECLARE PUBLIC FUNCTION RegisterFunction LIB "mscuistf.dll"  ALIAS "_RegisterFunction@12" (ByVal sess&, ByVal modname$, ByVal fname$) AS INTEGER
  1350. DECLARE PUBLIC FUNCTION NotebookAddDlgPage LIB "mscuistf.dll" ALIAS "_NotebookAddDlgPage@24" (ByVal  hDlg&,_
  1351.     ByVal idNotebook&, ByVal  idDlg&, ByVal lpszDllName$, ByVal lpszDlgProc$,_
  1352.     ByVal lpszTab$) AS LONG
  1353. DECLARE PUBLIC FUNCTION FNotebookPageView LIB "mscuistf.dll" ALIAS "_FNotebookPageView@16" (ByVal hDlg&,_
  1354.           ByVal idNotebook&, ByVal  idDlg&, ByVal fShowPage&) AS LONG
  1355. DECLARE PUBLIC FUNCTION FNotebookTurnToPage LIB "mscuistf.dll" ALIAS "_FNotebookTurnToPage@12" (ByVal hDlg&,ByVal idNotebook&,ByVal id&) AS LONG
  1356. DECLARE PUBLIC FUNCTION NotebookGetPageHwnd LIB "mscuistf.dll" ALIAS "_NotebookGetPageHwnd@12" (ByVal hDlg&,ByVal idNotebook&,ByVal idPage&) AS LONG
  1357. DECLARE PUBLIC SUB      LCBResetContent LIB "mscuistf.dll" ALIAS "_LCBResetContent@4" (ByVal hDlg&)
  1358. DECLARE PUBLIC SUB      LCBSetRedraw LIB "mscuistf.dll" ALIAS "_LCBSetRedraw@8" (ByVal hDlg&, ByVal fRedraw&)
  1359. DECLARE PUBLIC FUNCTION LCBGetCount LIB "mscuistf.dll" ALIAS "_LCBGetCount@4" (ByVal hDlg&) AS LONG
  1360. DECLARE PUBLIC FUNCTION LCBAddItem LIB "mscuistf.dll" ALIAS "_LCBAddItem@8" (ByVal hDlg&, ByVal item$) AS LONG
  1361. DECLARE PUBLIC FUNCTION LCBReplaceItem LIB "mscuistf.dll" ALIAS "_LCBReplaceItem@16" (ByVal hDlg&, ByVal index&, ByVal itemnum&, ByVal item$) AS LONG
  1362. DECLARE PUBLIC FUNCTION LCBGetItem LIB "mscuistf.dll" ALIAS "_LCBGetItem@20" (ByVal hDlg&, ByVal index&, ByVal itemnum&, ByVal item$, ByVal itemmax&) AS LONG
  1363. DECLARE PUBLIC FUNCTION LCBToggleItem LIB "mscuistf.dll" ALIAS "_LCBToggleItem@8" (ByVal hDlg&, ByVal index&) AS LONG
  1364. DECLARE PUBLIC SUB      LCBSetSel LIB "mscuistf.dll" ALIAS "_LCBSetSel@8" (ByVal hDlg&, ByVal index&) 
  1365. DECLARE PUBLIC SUB      LCBSetTabs LIB "mscuistf.dll" ALIAS "_LCBSetTabs@20" (ByVal hDlg&, ByVal t1&,ByVal t2&,ByVal t3&,ByVal t4&)
  1366. DECLARE PUBLIC FUNCTION FGetDriveFreeSpaceList LIB "mscuistf.dll" ALIAS "_FGetDriveFreeSpaceList@4" (ByVal szSymbol$) AS LONG
  1367.  
  1368. '** UNC stuff
  1369. DECLARE PUBLIC FUNCTION FAddToDriveFreeSpaceList LIB "mscuistf.dll" ALIAS "_FAddToDriveFreeSpaceList@8" (ByVal szSymbol$,ByVal szNewItem$) AS LONG
  1370. DECLARE PUBLIC FUNCTION FIsUnvalidatedUNCPath LIB "mscuistf.dll" ALIAS "_FIsUnvalidatedUNCPath@4" (ByVal szPath$) AS LONG
  1371. DECLARE PUBLIC FUNCTION FIsValidUNCPath LIB "mscuistf.dll" ALIAS "_FIsValidUNCPath@4" (ByVal szPath$) AS LONG
  1372. DECLARE PUBLIC FUNCTION FGetGroupName LIB "mscuistf.dll" ALIAS "_FGetGroupName@12" (ByVal szGroupFileName$, ByVal szBuf$,ByVal cbBuf&) AS LONG
  1373. DECLARE PUBLIC FUNCTION RemovePriorVersion(ProdRegKeyName$,ProdVer$) AS INTEGER
  1374.  
  1375. '*************** Wrappers for MS functions that Lotus re-wrote **************
  1376.  
  1377. DECLARE PUBLIC SUB      ReadInfFile (szFile$)
  1378. DECLARE PUBLIC SUB      MakeListFromSectionKeys (szSymbol$, szSect$)
  1379. DECLARE PUBLIC SUB      MakeListFromSectionDate (szSym$, szSect$)
  1380. DECLARE PUBLIC SUB      MakeListFromSectionFilename (szSym$, szSect$)
  1381. DECLARE PUBLIC SUB      MakeListFromSectionSize (szSym$, szSect$)
  1382. DECLARE PUBLIC SUB      MakeListFromSectionVersion (szSym$, szSect$)
  1383. DECLARE PUBLIC FUNCTION SetSilentMode (mode%) AS INTEGER
  1384. DECLARE PUBLIC FUNCTION SetBeepingMode (mode%) AS INTEGER
  1385. DECLARE PUBLIC FUNCTION GetSectionKeyDate (szSect$, szKey$) AS STRING
  1386. DECLARE PUBLIC FUNCTION GetSectionKeyFilename (szSect$, szKey$) AS STRING
  1387. DECLARE PUBLIC FUNCTION GetSectionKeySize (szSect$, szKey$) AS LONG
  1388. DECLARE PUBLIC FUNCTION GetSectionKeyVersion (szSect$, szKey$) AS STRING
  1389. DECLARE PUBLIC SUB      RemoveDir (szDir$, cmo%)
  1390. DECLARE PUBLIC SUB      DumpCopyList (szFile$)
  1391. DECLARE PUBLIC SUB      ClearCopyList
  1392. DECLARE PUBLIC FUNCTION GetCopyListCost (szExtraList$, szCostList$, szNeedList$) AS LONG
  1393. DECLARE PUBLIC SUB      CopyFilesInCopyList
  1394. DECLARE PUBLIC SUB      AddSectionFilesToCopyList (szSect$, szSrc$, szDest$)
  1395. DECLARE PUBLIC SUB      AddSectionKeyFileToCopyList (szSect$, szKey$, szSrc$, szDest$)
  1396. DECLARE PUBLIC SUB      AddToBillboardList (szDll$, idDlg&, szProc$, lTicks&)
  1397. DECLARE PUBLIC SUB      AddBlankToBillboardList (lTicks&)
  1398. DECLARE PUBLIC SUB      ClearBillboardList
  1399. DECLARE PUBLIC SUB      SetCopyGaugePosition (x%, y%)
  1400. DECLARE PUBLIC SUB      SetRestartDir(szDir$)
  1401. DECLARE PUBLIC FUNCTION RestartListEmpty AS INTEGER
  1402. DECLARE PUBLIC FUNCTION ExitExecRestart AS INTEGER
  1403.  
  1404. '** Utility functions
  1405.  
  1406. DECLARE PUBLIC FUNCTION GetAbsPathFromIni(szFile$,szSect$,szKey$,nullflag%,invalidpathflag%) AS STRING
  1407. DECLARE PUBLIC FUNCTION MakePath (szDir$, szFile$) AS STRING
  1408. DECLARE PUBLIC SUB      ShowPathError (nmsg%, nDescription%, szPath$)
  1409. DECLARE PUBLIC SUB      ShowPathErrorNoDlgExit (nmsg%, nDescription%, szPath$)
  1410. DECLARE PUBLIC FUNCTION IsPathWritable (szPath$) AS INTEGER
  1411. DECLARE PUBLIC FUNCTION ValidatePath (szPath$) AS INTEGER
  1412. DECLARE PUBLIC FUNCTION RegisterCallback (ReturnStr$, FuncName$) AS INTEGER
  1413. DECLARE PUBLIC FUNCTION PopupModalDlg (Dlg%, HelpID&) AS STRING
  1414. DECLARE PUBLIC FUNCTION PopupModelessDlg (Dlg%, HelpID&) AS STRING
  1415. DECLARE PUBLIC FUNCTION SelectDriveCombo (ComboID$, path$) AS INTEGER
  1416. DECLARE PUBLIC FUNCTION CheckForSpace (DlgId%) AS INTEGER
  1417. DECLARE PUBLIC SUB      QUIT
  1418. DECLARE PUBLIC SUB      Lot_WriteDestinationSymAndVal(IniFileName$,IniSection$) 
  1419. DECLARE PUBLIC SUB      Lot_WriteCriticalDirectories (InstallIniFile$)
  1420. DECLARE PUBLIC FUNCTION Lot_WriteToRiFile (ripath$) AS INTEGER
  1421. DECLARE PUBLIC FUNCTION Lot_ReadDefaultsfromRi (default_ripath$) AS INTEGER
  1422. DECLARE PUBLIC FUNCTION Lot_AreShareToolsSupported () AS INTEGER
  1423. DECLARE PUBLIC FUNCTION Lot_AreShare32ToolsSupported () AS INTEGER
  1424. DECLARE PUBLIC FUNCTION Lot_CallSharedTool (func$) AS INTEGER
  1425. DECLARE PUBLIC FUNCTION GetNotesPathfromLotusIni() AS STRING
  1426. DECLARE PUBLIC FUNCTION IsNotesInPath() AS INTEGER
  1427. DECLARE PUBLIC FUNCTION IsShareInAUTOEXEC() AS INTEGER
  1428. DECLARE PUBLIC FUNCTION ModifyAutoexec(modflag%,directmod%,backup$) AS STRING
  1429. DECLARE PUBLIC FUNCTION GetBootDrive() AS STRING
  1430. DECLARE PUBLIC FUNCTION Lot_GetLotusNotesDataPath() AS STRING
  1431. DECLARE PUBLIC FUNCTION Lot_GetORACLEHomePath() AS STRING
  1432. DECLARE PUBLIC FUNCTION Lot_GetLotusNotesPrgPath() AS STRING
  1433. 'DECLARE PUBLIC FUNCTION GetLotusNotesDataPath(szFile$, szSect$, szKey$) AS STRING
  1434. DECLARE PUBLIC SUB      DL_SetOraclePath
  1435. DECLARE PUBLIC SUB      DL_SetNotesDataPath
  1436. DECLARE PUBLIC FUNCTION TrimNetlotusapp (ByVal path$) AS STRING
  1437. DECLARE PUBLIC FUNCTION GetLastPathComponent( ByVal szPath$) AS STRING
  1438. DECLARE PUBLIC SUB ComboSelChanged(BoxNo&, Inst%)
  1439. DECLARE PUBLIC FUNCTION GetPathFromComboEdit(hDlg&,BoxNo%) AS STRING
  1440. DECLARE PUBLIC FUNCTION OneUp(s$) AS STRING
  1441.  
  1442.  
  1443. '** Lotus functions
  1444.  
  1445. DECLARE PUBLIC FUNCTION Lot_GetLocalHardDrive (ProdSize&,DefaultDir$) AS STRING
  1446. DECLARE PUBLIC FUNCTION Lot_GetNetHardDrive (ProdSize&,DefaultDir$) AS STRING
  1447. DECLARE PUBLIC FUNCTION Lot_GetAllHardDrive(ProdSize&,DefaultDir$) AS STRING
  1448. DECLARE PUBLIC FUNCTION Lot_Dir  (szDir$) AS STRING
  1449. DECLARE PUBLIC FUNCTION Lot_GetChapterFromKeyword (szKeyword$) AS STRING
  1450. DECLARE PUBLIC FUNCTION Lot_CallProductFunctions (func_name$, BYVAL direction$, always%, back$, parms$) AS STRING
  1451. DECLARE PUBLIC FUNCTION Lot_CallOneProductFunction (prodno%, func_name$, BYVAL direction$, always%, parms$) AS STRING
  1452. DECLARE PUBLIC FUNCTION Lot_CheckPath (path$) AS INTEGER
  1453. DECLARE PUBLIC FUNCTION Lot_GetInfSectionSize (szSect$)  AS LONG
  1454. DECLARE PUBLIC SUB      Lot_RemoveSectionFilesFromCopyList (szSect$)
  1455. DECLARE PUBLIC SUB      Lot_RemoveSectionKeyFileFromCopyList (szSect$, szKey$)
  1456. DECLARE PUBLIC FUNCTION Lot_SetDateOfFile (szFile$, szDate$) AS INTEGER
  1457. DECLARE PUBLIC FUNCTION Lot_GetFirst (szChapt$, nFlag%) AS STRING
  1458. DECLARE PUBLIC FUNCTION Lot_GetNext () AS STRING
  1459. DECLARE PUBLIC FUNCTION Lot_AddPagetoNotebook (hDlg&,  Notebookid&, DlgId%,Tabstring$) AS INTEGER
  1460. DECLARE PUBLIC FUNCTION Lot_NotebookPageView (hDlg&,  Notebookid&, DlgId%, fShowPage%) AS INTEGER
  1461. DECLARE PUBLIC SUB      Lot_TurnToPage (hDlg&,Notebookid&, pageid%) 
  1462. DECLARE PUBLIC FUNCTION Lot_GetPagehandle  (hDlg&,Notebookid&,Pageid%) AS LONG
  1463. DECLARE PUBLIC SUB      Lot_LCBResetContent     (hDlg&)
  1464. DECLARE PUBLIC SUB      Lot_LCBSetRedraw        (hDlg&, fRedraw%)
  1465. DECLARE PUBLIC FUNCTION Lot_LCBGetCount    (hDlg&) AS INTEGER
  1466. DECLARE PUBLIC FUNCTION Lot_LCBAddItem     (hDlg&, item$) AS INTEGER
  1467. DECLARE PUBLIC FUNCTION Lot_LCBReplaceItem (hDlg&, index%, itemnum%, item$) AS INTEGER
  1468. DECLARE PUBLIC FUNCTION Lot_LCBGetItem     (hDlg&, index%, itemnum%) AS STRING
  1469. DECLARE PUBLIC FUNCTION Lot_LCBToggleItem  (hDlg&, index%) AS INTEGER
  1470. DECLARE PUBLIC SUB      Lot_LCBSetSel           (hDlg&, index%)
  1471. DECLARE PUBLIC SUB      Lot_LCBSetTabs           (hDlg&, t1%,t2%,t3%,t4%)
  1472. DECLARE PUBLIC FUNCTION Lot_GetFirstChild (szChapt$, nFlag%) AS STRING
  1473. DECLARE PUBLIC FUNCTION Lot_GetChapterValStr (szChapter$, nField%) AS STRING  
  1474. DECLARE PUBLIC FUNCTION Lot_GetChapterValInt (szChapter$,nField%) AS INTEGER  
  1475. DECLARE PUBLIC FUNCTION Lot_GetNextSibling (szChapter$,nField%) AS STRING
  1476. DECLARE PUBLIC FUNCTION Lot_GetNextChild () AS STRING
  1477. DECLARE PUBLIC FUNCTION Lot_GetInfChapterSize (szChapter$)  AS LONG
  1478. DECLARE PUBLIC SUB      Lot_ToggleChapterFilesInCopyList (szChapter$)  
  1479. DECLARE PUBLIC FUNCTION Lot_SetChapterFilesInCopyListInOrOut (szChapter$, InOrOut%)  AS INTEGER
  1480. DECLARE PUBLIC SUB      Lot_InitializeCopyList (chpt$, nField%) 
  1481. DECLARE PUBLIC SUB      Lot_RefreshDestination (symbol$) 
  1482. DECLARE PUBLIC SUB      Lot_GetDriveFreeSpaceList (szSymbol$)
  1483. DECLARE PUBLIC FUNCTION Lot_GetSharedToolsSize() AS INTEGER
  1484. DECLARE PUBLIC FUNCTION Lot_GetShared32ToolsSize() AS INTEGER
  1485. DECLARE PUBLIC FUNCTION Lot_MakeSizeString (size AS LONG) AS STRING
  1486. DECLARE PUBLIC FUNCTION Lot_ExtractDriveLetter (destdir$) AS STRING
  1487. DECLARE PUBLIC FUNCTION Lot_ExtractDirectory (destdir$) AS STRING
  1488. DECLARE PUBLIC FUNCTION Lot_GetGroupName ( szGroupFileName$) AS STRING  
  1489. DECLARE PUBLIC FUNCTION Lot_IsTheFeatureInstalled(s$) AS INTEGER
  1490. DECLARE PUBLIC FUNCTION Lot_WhereIsFeature(prodno%, featureId$, filetolookfor$) AS STRING
  1491. DECLARE PUBLIC FUNCTION Lot_GetDestDirValueFromInstallini(DestDirSym$) AS STRING
  1492. DECLARE PUBLIC SUB Lot_InitializeWinWinsysSym () 
  1493. DECLARE PUBLIC SUB Lot_InitializeEXTRA ()
  1494. DECLARE PUBLIC FUNCTION Lot_IsDestVerNewerOrEqual(DestinationPath$,SourceVer1&,SourceVer2&,SourceVer3&,SourceVer4&) AS INTEGER
  1495. DECLARE PUBLIC SUB      Lot_CallWinhelp32 (prodno%, network$, SectionName$, DestDirSym$, FileName$) 
  1496. DECLARE PUBLIC SUB Lot_FixupSourceDirectories
  1497. DECLARE PUBLIC SUB MarkFixupSourceDirSymbol(szSubdirSymbol$)
  1498. DECLARE PUBLIC FUNCTION Lot_RegIni(RegFileName$) AS INTEGER
  1499. DECLARE PUBLIC SUB Lot_RegisterFonts()
  1500. DECLARE PUBLIC FUNCTION Lot_RegisterTypeLib(ID$, Version$, Description$, helppath$, filename$, flags%) AS INTEGER
  1501. DECLARE PUBLIC FUNCTION New_RegisterTypeLib(typelibname as string, helpdir as string) as long
  1502. DECLARE PUBLIC SUB IncrementSharedDLLCount(s$)
  1503.  
  1504. '** UNC stuff
  1505. DECLARE PUBLIC SUB Lot_SplitUNCPath (szFullPath$, szVol$, szDirPath$)
  1506. DECLARE PUBLIC FUNCTION Lot_AddToDriveFreeSpaceList (szSymbol$, szNewItem$) AS LONG
  1507. DECLARE PUBLIC FUNCTION Lot_IsUnvalidatedUNCPath (szPath$) AS LONG
  1508. DECLARE PUBLIC FUNCTION Lot_IsValidUNCPath (szPath$) AS LONG
  1509. DECLARE PUBLIC FUNCTION FMapUNCVolume LIB "mscuistf.dll" ALIAS "_FMapUNCVolume@8" (ByVal szUNCRoot$, ByVal szDrive$) AS LONG
  1510. DECLARE PUBLIC FUNCTION FUnmapUNCVolume LIB "mscuistf.dll" ALIAS "_FUnmapUNCVolume@4" (ByVal szDrive$) AS LONG
  1511. DECLARE PUBLIC FUNCTION ValidateEditBox (hDlg&, Ctrl%) AS INTEGER
  1512. DECLARE PUBLIC FUNCTION ValidateBrowse (hDlg&, Ctrl%) AS INTEGER
  1513. '** end UNC stuff
  1514.  
  1515. 'Registration functions moved to REGISTER.LSS
  1516.  
  1517. DECLARE PUBLIC FUNCTION Lot_GetCurrentProduct() AS INTEGER
  1518. DECLARE PUBLIC SUB      Lot_SetCurrentProduct(ProdNo%) 
  1519. DECLARE PUBLIC FUNCTION Lot_GetInstallDir() AS STRING
  1520. DECLARE PUBLIC FUNCTION Lot_GetTheRealProdDir(prodno%) AS STRING
  1521. DECLARE PUBLIC FUNCTION Lot_Readserialnumber () AS INTEGER
  1522. DECLARE PUBLIC FUNCTION Lot_SaveFeaturesInstaledInInstallIni() AS INTEGER
  1523. DECLARE PUBLIC FUNCTION Lot_SaveFeaturesInstaledInInstNodeIni() AS INTEGER
  1524. DECLARE PUBLIC FUNCTION Lot_SaveTheNodeOptionsInInstallIni() AS INTEGER
  1525. DECLARE PUBLIC FUNCTION Lot_IsTheNodeOptionsAvailToNode(prodNum%,OptName$) AS INTEGER
  1526. DECLARE PUBLIC FUNCTION Lot_AreAnyNodeOptionsAvail() AS INTEGER
  1527. DECLARE PUBLIC FUNCTION Lot_IsAnyNodeOptAvailToNode()AS INTEGER
  1528. DECLARE PUBLIC FUNCTION Lot_AreNodeOptAvailToNodeForProd(prodNum%) AS INTEGER
  1529. DECLARE PUBLIC FUNCTION Lot_GetNumOfNodeOptAvailToNodeForProd(prodNum%) AS INTEGER
  1530. DECLARE PUBLIC FUNCTION Lot_AreAnyNodeOptAvailToSrv() AS INTEGER
  1531. DECLARE PUBLIC SUB Lot_TurnOffAllNodeOptSections()
  1532. DECLARE PUBLIC FUNCTION Lot_SaveTheCDOptionsInInstallIni() AS INTEGER
  1533. DECLARE PUBLIC FUNCTION Lot_IsTheCDOptionsAvailToNode(prodNum%,OptName$) AS INTEGER
  1534. DECLARE PUBLIC FUNCTION Lot_IsAnyCDOptAvailToNode()AS INTEGER
  1535. DECLARE PUBLIC FUNCTION Lot_AreCDOptAvailToNodeForProd(prodNum%) AS INTEGER
  1536. DECLARE PUBLIC FUNCTION Lot_GetNumOfCDOptAvailToNodeForProd(prodNum%) AS INTEGER
  1537. DECLARE PUBLIC FUNCTION Lot_AreAnyCDOptAvailToSrv() AS INTEGER
  1538.  
  1539. '** Win95 uninstaller functions
  1540. DECLARE PUBLIC FUNCTION Lot_RegisterUninstaller(ProdRegKeyName$,ProdVer$,_
  1541.                         ProdDisplayedName$,ProdInfPath$,_
  1542.                         LogFlag%,AutoFlag%,_
  1543.                         LangID$,LogFile$,RspFile$,_
  1544.                         UserName$ ) AS INTEGER
  1545. DECLARE PUBLIC FUNCTION Lot_RegisterObject(FeatureKeyWord$,ClassOfObject$,_
  1546.                         ObjectPath$)
  1547.  
  1548. '** Resource splitting functions
  1549.  
  1550. DECLARE PUBLIC FUNCTION FindResourceinDLL (idDlg&, ResType%) AS STRING
  1551.  
  1552. '** Local functions
  1553.  
  1554. DECLARE PUBLIC SUB DisplayWhenSpaceIsTight(szCost$,szNeed$)
  1555. DECLARE FUNCTION Lot_GetLastFeatureNumber() AS INTEGER
  1556. DECLARE FUNCTION Lot_GetLastNodeOptNumber(s$) AS INTEGER
  1557. DECLARE FUNCTION Lot_GetLastCDOptNumber(s$) AS INTEGER
  1558. 'Don't make this generally available
  1559. DECLARE FUNCTION AddFontResource LIB "gdi32" alias "AddFontResourceA" (ByVal szFFile$) AS INTEGER
  1560.  
  1561. '** Local globals
  1562.  
  1563. PUBLIC gEndStatementEncountered% ' TRUE when END statement encountered
  1564.  
  1565. '**************************************************************************
  1566.  
  1567. SUB INITIALIZE
  1568. '** Purpose:   Sets the begining of the Product registration array
  1569. '** Arguments:
  1570. '*************************************************************************
  1571.  gCurrNumOfProds% = 0
  1572.  gCurrentProduct% = 1
  1573. ' Moved from main because of symbol initialization in early LdString calls
  1574.  
  1575.    ON Error STFQUIT    GOTO MAINERROR
  1576.    ON Error STFERR     GOTO STFERR_
  1577.    ON Error STFTOGGLE  GOTO STFTOGGLEERR
  1578.  
  1579.     ToolKitInitalizeError& = 0
  1580.     SetUpAPI
  1581.  
  1582.     EXIT SUB
  1583.  
  1584. MAINERROR:
  1585.     ToolKitInitalizeError& = STFQUIT
  1586.     EXIT SUB
  1587.         
  1588. STFERR_:
  1589.     ToolKitInitalizeError& = STFERR
  1590.     EXIT SUB
  1591.  
  1592. STFTOGGLEERR:
  1593.     ToolKitInitalizeError& = STFTOGGLE
  1594.  
  1595. END SUB
  1596.  
  1597. PUBLIC FUNCTION Lot_GetSharedToolsSize() AS INTEGER
  1598. '** Purpose:
  1599. '**     Gets the size of the shared tools in Kb
  1600. '** Arguments:
  1601. '** Returns:
  1602. '**     the size or 0
  1603. '*************************************************************************
  1604.    DIM CurrChpt$, SharedID$, ShareSize&
  1605.  
  1606.    CurrChpt$ = Lot_GetFirst("", F_SHARE+F_INOROUT) 
  1607.    WHILE (CurrChpt$ <> "")
  1608.       SharedID$ = Lot_GetChapterValStr(CurrChpt$, F_SHARE)   
  1609.       IF SharedID$="IVCPROGRAM" OR _
  1610.      SharedID$="CONTAINERFILEPROGRAM" OR _
  1611.      SharedID$="DATALENSPROGRAM" OR _
  1612.      SharedID$="DATALENSDATA" OR _
  1613.      SharedID$="DIALOGEDITORPROGRAM" OR _
  1614.      SharedID$="DESKTOP" OR _
  1615.      SharedID$="DOCUMENTFILEFILTERSPROGRAM" OR _
  1616.      SharedID$="DOCUMENTFILEFILTERSFILTER" OR _
  1617.      SharedID$="GRAMMARCHECKERPROGRAM" OR _
  1618.      SharedID$="GRAMMARCHECKERDATA" OR _
  1619.      SharedID$="GRAPHICFILEFILTERSPROGRAM" OR _
  1620.      SharedID$="HYPHENATIONPROGRAM" OR _
  1621.      SharedID$="HYPHENATIONDATA" OR _
  1622.      SharedID$="ICONPALETTEPROGRAM" OR _
  1623.      SharedID$="INFOBOXPROGRAM" OR _
  1624.      SharedID$="SCRIPTPROGRAM" OR _
  1625.      SharedID$="MULTIMEDIAPROGRAM" OR _
  1626.      SharedID$="MULTIMEDIADATA" OR _
  1627.      SharedID$="SPELLCHECKERPROGRAM" OR _
  1628.      SharedID$="SPELLCHECKERDATA" OR _
  1629.      SharedID$="SPELLCHECKERUSER" OR _
  1630.      SharedID$="STATUSBARPROGRAM" OR _
  1631.      SharedID$="THESAURUSPROGRAM" OR _
  1632.      SharedID$="THESAURUSDATA" OR _
  1633.      SharedID$="TOOLSPROGRAM" OR _
  1634.      SharedID$="TOOLSDATA" OR _
  1635.      SharedID$="USERNAMESERVICESPROGRAM" OR _
  1636.      SharedID$="FILTERS" OR _
  1637.      SharedID$="EXCELFLT" THEN
  1638.      
  1639.         ShareSize& = ShareSize&+Lot_GetInfChapterSize(CurrChpt$)
  1640.  
  1641.       END IF
  1642.  
  1643.       CurrChpt$ = Lot_GetNext() 
  1644.  
  1645.    WEND
  1646.  
  1647.    Lot_GetSharedToolsSize = INT(ShareSize&/1024)
  1648.  
  1649. 'testint% = INT(ShareSize& / 1024)
  1650. 'Lot_GetSharedToolsSize = testint%
  1651. 'DoMsgBox("testint%", STR$(testint%), MB_OK)
  1652.  
  1653. END FUNCTION
  1654.  
  1655.  
  1656. PUBLIC FUNCTION Lot_GetShared32ToolsSize() AS INTEGER
  1657. '** Purpose:
  1658. '**     Gets the size of the shared tools for Win32 in Kb
  1659. '** Arguments:
  1660. '** Returns:
  1661. '**     the size or 0
  1662. '*************************************************************************
  1663.    DIM CurrChpt$, SharedID$, ShareSize&
  1664.  
  1665.    CurrChpt$ = Lot_GetFirst("", F_SHARE+F_INOROUT) 
  1666.    WHILE (CurrChpt$ <> "")
  1667.       SharedID$ = Lot_GetChapterValStr(CurrChpt$, F_SHARE)   
  1668.       IF SharedID$="WIN32IVCPROGRAM" OR _
  1669.      SharedID$="WIN32CONTAINERFILEPROGRAM" OR _
  1670.      SharedID$="WIN32DATALENSPROGRAM" OR _
  1671.      SharedID$="WIN32DATALENSDATA" OR _
  1672.      SharedID$="WIN32DIALOGEDITORPROGRAM" OR _
  1673.      SharedID$="WIN32DESKTOP" OR _
  1674.      SharedID$="WIN32DOCUMENTFILEFILTERSPROGRAM" OR _
  1675.      SharedID$="WIN32DOCUMENTFILEFILTERSFILTER" OR _
  1676.      SharedID$="WIN32GRAMMARCHECKERPROGRAM" OR _
  1677.      SharedID$="WIN32GRAMMARCHECKERDATA" OR _
  1678.      SharedID$="WIN32GRAPHICFILEFILTERSPROGRAM" OR _
  1679.      SharedID$="WIN32HYPHENATIONPROGRAM" OR _
  1680.      SharedID$="WIN32HYPHENATIONDATA" OR _
  1681.      SharedID$="WIN32ICONPALETTEPROGRAM" OR _
  1682.      SharedID$="WIN32INFOBOXPROGRAM" OR _
  1683.      SharedID$="WIN32SCRIPTPROGRAM" OR _
  1684.      SharedID$="WIN32MULTIMEDIAPROGRAM" OR _
  1685.      SharedID$="WIN32MULTIMEDIADATA" OR _
  1686.      SharedID$="WIN32SPELLCHECKERPROGRAM" OR _
  1687.      SharedID$="WIN32SPELLCHECKERDATA" OR _
  1688.      SharedID$="WIN32SPELLCHECKERUSER" OR _
  1689.      SharedID$="WIN32STATUSBARPROGRAM" OR _
  1690.      SharedID$="WIN32THESAURUSPROGRAM" OR _
  1691.      SharedID$="WIN32THESAURUSDATA" OR _
  1692.      SharedID$="WIN32TOOLSPROGRAM" OR _
  1693.      SharedID$="WIN32TOOLSDATA" OR _
  1694.      SharedID$="WIN32USERNAMESERVICESPROGRAM" OR _
  1695.      SharedID$="WIN32FILTERS" OR _
  1696.      SharedID$="WIN32EXCELFLT" THEN
  1697.      
  1698.         ShareSize& = ShareSize&+Lot_GetInfChapterSize(CurrChpt$)
  1699.  
  1700.       END IF
  1701.  
  1702.       CurrChpt$ = Lot_GetNext() 
  1703.  
  1704.    WEND
  1705.  
  1706.    Lot_GetShared32ToolsSize = INT(ShareSize&/1024)
  1707.  
  1708. 'testint% = INT(ShareSize& / 1024)
  1709. 'Lot_GetSharedToolsSize = testint%
  1710. 'DoMsgBox("testint%", STR$(testint%), MB_OK)
  1711.  
  1712. END FUNCTION
  1713.  
  1714.  
  1715. '*********************************************************
  1716.  
  1717. PUBLIC FUNCTION GetAbsPathFromIni(szFile$,szSect$,szKey$,nullflag%,invalidpathflag%) AS STRING
  1718. '** Purpose: This function is called whenever we need to retrieve a string
  1719. '**           from .ini file. Function returns a clean path (path returned from
  1720. '**           FCleanFatPath.    
  1721. '** Author:    JKK
  1722. '** Arguments:  Name of the .ini file, section name in the .ini file, key we
  1723. '**             are searching for and two integer flags, nullflag% & invalidpath%.
  1724. '**             Function puts up two error messages based on the value of nullflag%, and 
  1725. '**             invalidpath. 
  1726. '** Returns:   Function either returns null or the value of the string.
  1727. '**     
  1728. '*************************************************************************
  1729.   DIM rstring$, rv%, errText$
  1730.  
  1731.    GetAbsPathFromIni = ""
  1732.    rstring$ = GetIniKeyString(szFile$, szSect$, szKey$)
  1733.    If rstring$ <> "" Then
  1734.  
  1735.       rv% = Lot_CleanPath(rstring$)
  1736.  
  1737.       'tqi - I believe this trim should no longer be necessary, but no harm to leave it 
  1738.       errText$ =  NullTrim(szFile$)
  1739.       if rv% <> 0 Then
  1740.      GetAbsPathFromIni = rstring$
  1741.       elseif invalidpathflag% <> FALSE then
  1742.  
  1743.      ErrorMsg SID_ERR_GETINIKEYSTRING, errText$
  1744.      ERROR STFQUIT
  1745.  
  1746.       end if 
  1747.  
  1748.    elseif nullflag% <> FALSE then
  1749.  
  1750.       ErrorMsg SID_ERR_GETINIKEYSTRING, errText$
  1751.       ERROR STFQUIT
  1752.  
  1753.    else
  1754.       GetAbsPathFromIni = ""
  1755.    end if
  1756.  
  1757. END FUNCTION
  1758.  
  1759. PUBLIC FUNCTION MakePath (szDir$, szFile$) AS STRING
  1760. '** Purpose:
  1761. '**     Appends a file name to the end of a directory path,
  1762. '**     inserting a backslash character as needed.
  1763. '** Arguments:
  1764. '**     szDir$  - full directory path (with optional ending "\")
  1765. '**     szFile$ - filename to append to directory
  1766. '** Returns:
  1767. '**     Resulting fully qualified path name. (Lower Case)
  1768. '*************************************************************************
  1769.    DIM sz$
  1770.  
  1771.    IF szDir$ = "" THEN
  1772.       sz$ = szFile$
  1773.    ELSEIF szFile$ = "" THEN
  1774.       sz$ = szDir$
  1775.    ELSEIF LENBP(szFile$) > 12 THEN
  1776.       IF LENBP(szFile$) = 13 AND RIGHT$(szFile$,1) = "\" THEN
  1777.       sz$ = szDir$ + szFile$
  1778.       ELSE      
  1779. '       sz$ = ""
  1780.             sz$ = szDir$ + "\" + szFile$
  1781.       END IF
  1782.    ELSEIF MID$(szDir$, LEN(szDir$), 1) = "\" THEN
  1783.       sz$ = szDir$ + szFile$
  1784.    ELSE
  1785.       sz$ = szDir$ + "\" + szFile$
  1786.    END IF
  1787.  
  1788.    IF sz$ <> "" THEN
  1789.       MakePath = LCASE$(sz$)
  1790.    ELSE
  1791.       MakePath = sz$
  1792.    END IF
  1793.  
  1794.     
  1795.  
  1796. END FUNCTION
  1797.  
  1798. PUBLIC FUNCTION Lot_MakeSizeString(size&) AS STRING
  1799. '** Purpose:
  1800. '** Author:
  1801. '** Arguments:
  1802. '** Returns:
  1803. '**     
  1804. '*************************************************************************
  1805.    Lot_MakeSizeString = STR$(size&) + gStrK$
  1806. END FUNCTION
  1807. '*************************************************************************
  1808.  
  1809. PUBLIC FUNCTION Lot_ExtractDriveLetter(destdir$) AS STRING
  1810. '** Purpose:
  1811. '** Author:
  1812. '** Arguments:
  1813. '** Returns:
  1814. '**     
  1815. '*************************************************************************
  1816.   Lot_ExtractDriveLetter = LCASE$(MID$(destdir$, 1, 1))
  1817. END FUNCTION
  1818. '*************************************************************************
  1819.  
  1820. PUBLIC FUNCTION Lot_ExtractDirectory(destdir$) AS STRING
  1821. '** Purpose:
  1822. '** Author:
  1823. '** Arguments:
  1824. '** Returns:
  1825. '**     
  1826. '*************************************************************************
  1827.   Lot_ExtractDirectory = LCASE$(MID$(destdir$, 3))
  1828. END FUNCTION
  1829. '*************************************************************************
  1830. PUBLIC SUB      Lot_CallWinhelp32 (prodno%, network$, SectionName$, DestDirSym$, FileName$) 
  1831. '** Purpose:Calls winhelp32 to build GIDs at reinstall.
  1832. '** Author:MZ
  1833. '** Arguments:prodno%, 
  1834. '                    network$, 
  1835. '                    SectionName$, 
  1836. '                    DestDirSym$, 
  1837. '                    FileName$
  1838. '*************************************************************************
  1839. DIM ExecError%,CopyDestDir$
  1840.    IF GetListItem(SYM_INSTALLKINDS$, prodno%) = gREINSTALL$ THEN
  1841.         IF network$ = gSTANDARD$ OR network$ = gNODE$ THEN
  1842.            IF (Lot_IsTheFeatureInstalled(SectionName$) = 1) THEN
  1843.               'CopyDestDir$ = GetSymbolValue(DestDirSym$)
  1844.               CopyDestDir$ = Lot_WhereIsFeature(prodno%, SectionName$, FileName$)
  1845.          '     ExecError% = WinExec ("winhlp32 -g "+CopyDestDir$+FileName$, SW_HIDE)
  1846.               ExecError% = WinExec ("winhlp32 -g "+CopyDestDir$+FileName$, SW_SHOW)
  1847.            END IF
  1848.         END IF
  1849.    END IF
  1850. END SUB
  1851.  
  1852.  
  1853. '** UNC stuff
  1854.  
  1855.  
  1856. PUBLIC SUB Lot_SplitUNCPath (szFullPath$, szVol$, szDirPath$)
  1857. '** Purpose:Splits a string into a UNC volume and a directory path
  1858. '** Author:GJL
  1859. '** Arguments:A path string, a string for the UNC vol
  1860. '**             a string for the resulting dir path
  1861. '** Returns:If UNC vol is invalid szVol will be empty
  1862. '**     
  1863. '*************************************************************************
  1864.    DIM StrOff&, tmp&
  1865.  
  1866.    StrOff& = INSTR( szFullPath$, "\\" )
  1867.    IF StrOff = 1 THEN
  1868.       StrOff& = INSTR( MID$(szFullPath$, 3), "\" )
  1869.       IF StrOff > 0 THEN
  1870.     tmp& = StrOff + 3
  1871.     StrOff& = StrOff + 3
  1872.     StrOff& = INSTR( MID$(szFullPath$, tmp&), "\" ) - 1
  1873.     IF StrOff& > 0 THEN
  1874.        StrOff& = StrOff& + tmp&
  1875.        szVol$ = LEFT$(szFullPath$, StrOff& - 1)
  1876.        szDirPath$ = MID$(szFullPath$, StrOff)
  1877.     ELSE
  1878.        szVol$ = szFullPath$
  1879.        szDirPath = ""
  1880.     END IF
  1881.       ELSE 
  1882.     szVol$ = ""
  1883.     szDirPath = ""
  1884.       END IF
  1885.    ELSE
  1886.    szVol$ = ""
  1887.    szDirPath$ = szFullPath$       
  1888.    END IF
  1889. END SUB
  1890. '** end UNC stuff
  1891.  
  1892. PUBLIC SUB Lot_SplitAnyPath (szFullPath$, szVol$, szDirPath$)
  1893. '** Purpose:Splits a string into a volume and a directory path
  1894. '** Author:
  1895. '** Arguments:A path string, a string for the vol
  1896. '**             a string for the resulting dir path
  1897. '** Returns: Volume and directory
  1898. '**     
  1899. '*************************************************************************
  1900.  
  1901.     If Lot_IsUnvalidatedUNCPath(szFullPath$) Then
  1902.         Lot_SplitUNCPath szFullPath$, szVol$, szDirPath$
  1903.     Else
  1904.         szVol$ = LEFT$(szFullPath$, 2)
  1905.         szDirPath$ = MID$(szFullPath$,3)
  1906.     End If
  1907. END SUB
  1908.  
  1909. '***********************************************************************
  1910. PUBLIC FUNCTION Lot_GetVol (szFullPath$)
  1911. '**  Description:  
  1912. '**      Return the volume whether it is UNC or local.
  1913. '**    
  1914. '**  Explicit Parameters:
  1915. '**       szFullPath$        The path from which to extract the path.
  1916. '**
  1917. '**  Implicit Parameters:
  1918. '**  Returns:  The volume.
  1919. '***********************************************************************
  1920.  
  1921.  
  1922.     DIM szVol$, szDirPath$
  1923.  
  1924.     Lot_SplitAnyPath szFullPath$, szVol$, szDirPath$
  1925.  
  1926.     Lot_GetVol = szVol$
  1927. END FUNCTION
  1928.  
  1929. '***********************************************************************
  1930. '**
  1931. '**  Name: ShowPathError
  1932. '**  Description:  
  1933. '**      Display a path error
  1934. '**    
  1935. '**  Explicit Parameters:
  1936. '**   nmsg&          The error message number to display. Use 0 if none
  1937. '**   nDescription%  The description of the message
  1938. '**   szPath$        The path with the problem
  1939. '**
  1940. '**  Out symbols:
  1941. '**    
  1942. '**  Implicit Parameters:
  1943. '**    
  1944. '***********************************************************************
  1945.  
  1946. PUBLIC SUB ShowPathError (nmsg%, nDescription%, szPath$)
  1947.    DIM sz$
  1948.  
  1949.    sz$ = CHR$(10) + CHR$(10) + "     " + szPath$
  1950.    sz$ = NullTrim$(sz$)
  1951.    IF nDescription% <> 0 THEN
  1952.       sz$ = sz$ + CHR$(10) + CHR$(10) + LdString(nDescription%)
  1953.    END IF
  1954.    ErrorMsg nmsg%, sz$
  1955.  
  1956. END SUB
  1957.  
  1958. '***********************************************************************
  1959. '**
  1960. '**  Name: ShowPathErrorNoDlgExit
  1961. '**  Description:  
  1962. '**      Display a path error and tell the dialog not to exit
  1963. '**    
  1964. '**  Explicit Parameters:
  1965. '**   nmsg&          The error message number to display. Use 0 if none
  1966. '**   nDescription&  The description of the message
  1967. '**   szPath$        The path with the problem
  1968. '**
  1969. '**  Out symbols:
  1970. '**   __LASTSTATUS   Set to "Q" to tell script not to quit   
  1971. '**    
  1972. '**  Implicit Parameters:
  1973. '**    
  1974. '***********************************************************************
  1975.  
  1976. PUBLIC SUB ShowPathErrorNoDlgExit (nmsg%, nDescription%, szPath$)
  1977.  
  1978.    ShowPathError nmsg%, nDescription%, szPath$
  1979.    SetListItem "__LASTSTATUS", 1, "Q"
  1980.  
  1981. END SUB
  1982.  
  1983. '***********************************************************************
  1984. '**
  1985. '**  Name: IsPathWritable
  1986. '**  Description:  
  1987. '**      Determine if we can write to a path.
  1988. '**    
  1989. '**  Explicit Parameters:
  1990. '**      szPath$     Pathname with no filename.
  1991. '**
  1992. '**  Out symbols:
  1993. '**    
  1994. '**  Implicit Parameters:
  1995. '**
  1996. '**  Returns: 1 if path is writable
  1997. '**    
  1998. '***********************************************************************
  1999.  
  2000.  
  2001. PUBLIC FUNCTION IsPathWritable (szPath$) AS INTEGER
  2002.  
  2003.    DIM sz$, cb%, i%, j%
  2004.  
  2005.    '** We can't check if the path is writable if the syntax is bad
  2006.    IsPathWritable = 0
  2007.      sz$=szPath$
  2008.    IF Lot_CheckPath(szPath$) <> FALSE THEN
  2009.       '** Strip any trailing backslash
  2010.       IF cb% > 3 AND RIGHT$(sz$,1) = "\" THEN
  2011.      cb% = LEN(sz$)
  2012.      sz$ = MID$(sz$,1,(cb%-1))
  2013.       END IF
  2014.  
  2015.       '** Back through the directories until we find a directory that exists
  2016.       DO
  2017.      '** If the directory exists then return if the directory is writable
  2018.      IF LEN(sz$) <= 3 OR DoesDirExist(sz$) = 1 THEN
  2019.         IsPathWritable = IsDirWritable(sz$)
  2020.         IF IsPathWritable = FALSE THEN
  2021.               SetSymbolValue SYM_LAST_ERROR_SID$ , CStr(SID_DIR_READONLY)
  2022.             END IF
  2023.         EXIT DO
  2024.      END IF
  2025.  
  2026.      '** If dir does not exists then strip off the last dir and try again
  2027.      i% = INSTR(sz$,"\")
  2028.      IF i% = 0 THEN EXIT DO
  2029.      DO
  2030.         j% = INSTR((i%+1),sz$,"\")
  2031.         IF j% = 0 THEN
  2032.            IF i% = 3 THEN
  2033.           sz$ = MID$(sz$,1,3)        '** Handle root special
  2034.            ELSE
  2035.           sz$ = MID$(sz$,1,(i%-1))   '** Strip last directory
  2036.            END IF
  2037.            EXIT DO
  2038.         END IF
  2039.         i% = j%
  2040.      LOOP
  2041.       LOOP
  2042.    END IF
  2043. END FUNCTION
  2044.  
  2045. '***********************************************************************
  2046. '**
  2047. '**  Name: ValidatePath
  2048. '**  Description:  
  2049. '**      Determine if path is valid and display errors
  2050. '**
  2051. '**      THIS FUNCTION SHOULD ONLY BE USED FOR DESTINATION PATHS!!!
  2052. '**    
  2053. '**  Explicit Parameters:
  2054. '**      szPath$     Pathname with no filename
  2055. '**
  2056. '**  Out symbols:
  2057. '**    
  2058. '**  Implicit Parameters:
  2059. '**
  2060. '**  Returns: 1 if path is valid
  2061. '**    
  2062. '***********************************************************************
  2063.  
  2064. PUBLIC FUNCTION ValidatePath (szPath$) AS INTEGER
  2065.  
  2066.    DIM cch%, difflen% , notused&
  2067.    DIM volPath$, dirPath$, writable%, dirPathType$
  2068.  
  2069.    ValidatePath = FALSE
  2070.    if szPath$ = "" then 
  2071.       Exit Function
  2072.    End if
  2073.    cch% = LENBP(szPath$)
  2074.    difflen% = cch% + CINT(GetSymbolValue(SYM_DOSMAXPATHDIFF$))
  2075.    SetSymbolValue SYM_LAST_ERROR_SID$ , CStr(SID_ERR_DIRSYNTAXDESCRLONG)
  2076. '*** UNC stuff
  2077.    '** If it's a UNC path do some checks
  2078.  
  2079.    IF Lot_CleanPath(szPath$) = FALSE THEN
  2080.      ShowPathError SID_ERR_DIRSYNTAX,_
  2081.             CInt(GetSymbolValue(SYM_LAST_ERROR_SID$)), szPath$
  2082.      szPath$ = NullTrim$(szPath$)
  2083.      EXIT FUNCTION
  2084.    END IF
  2085.    
  2086.    IF Lot_IsUnvalidatedUNCPath(szPath$) = TRUE THEN
  2087.  
  2088.      Lot_SplitUNCPath szPath$, volPath$, dirPath$
  2089.  
  2090.      IF Lot_IsvalidUNCPath(volPath$) = FALSE THEN
  2091.        ShowPathError CInt(GetSymbolValue(SYM_LAST_ERROR_SID$)), 0, volPath$
  2092.  
  2093.      ELSEIF dirPath$ = "" OR Len(dirPath$) = 1 THEN
  2094.        ShowPathError SID_ERR_DIRSYNTAX, SID_ERR_DIRROOTDESCR, szPath$
  2095.  
  2096. '     ELSEIF Lot_CleanPath(szPath$) = FALSE THEN
  2097. '     ShowPathError SID_ERR_DIRSYNTAX,_
  2098. '            CInt(GetSymbolValue(SYM_LAST_ERROR_SID$)), szPath$
  2099.  
  2100. '** Make sure the path is not too long
  2101.      ELSEIF difflen% > MAX_DIR_PATH THEN
  2102.     '** This is only about the path length and might need a new message
  2103.        ErrorMsg SID_ERR_PATHLEN, ""
  2104.      ELSE
  2105.        SetSymbolValue SYM_LAST_ERROR_SID$ , CStr(SID_DIR_READONLY)
  2106.        writable% = IsPathWritable(szPath$)
  2107.        IF writable% = FALSE THEN
  2108.      ShowPathError CInt(GetSymbolValue(SYM_LAST_ERROR_SID$)), 0, szPath$
  2109.          ValidatePAth = FALSE
  2110.        ELSE
  2111.          ValidatePath = TRUE 
  2112.        END IF
  2113.      END IF
  2114. '*** end UNC stuff
  2115.    ELSE
  2116. '*** Check letter drives
  2117.       '** Make sure the drive is valid
  2118.       IF (MID$(szPath$,2,1) = ":" AND IsDriveValid(szPath$) = FALSE) THEN
  2119.     ShowPathError SID_DRV_NOTEXIST, 0, MID$(szPath$,1,2)
  2120.  
  2121.       '** Make sure the syntax of the path name is correct
  2122. '      ELSEIF Lot_CleanPath(szPath$) = FALSE THEN
  2123. '      ShowPathError SID_ERR_DIRSYNTAX,_
  2124. '             CInt(GetSymbolValue(SYM_LAST_ERROR_SID$)), szPath$
  2125.       '** Make sure not installing to the root
  2126.       ELSEIF (LEN(szPath$) = 2) OR (LEN(szPath$) = 3 _
  2127.          AND MID$(szPath$,3,1) = "\") THEN
  2128.     ShowPathError SID_ERR_DIRSYNTAX, SID_ERR_DIRROOTDESCR, szPath$
  2129.  
  2130.      '** Make sure the path is not too long
  2131.       ELSEIF difflen% > MAX_DIR_PATH THEN
  2132.     '** This is only about the path length and might need a new message
  2133.     ErrorMsg SID_ERR_PATHLEN, ""
  2134.       ELSE
  2135.     '** Make sure the path is writable
  2136.  
  2137.     writable% = IsPathWritable(szPath$)
  2138.     IF writable% = FALSE THEN
  2139.           SetSymbolValue SYM_LAST_ERROR_SID$ , CStr(SID_DIR_READONLY)
  2140.       ShowPathError CInt(GetSymbolValue(SYM_LAST_ERROR_SID$)), 0, szPath$
  2141.       ValidatePAth = FALSE
  2142.     ELSE
  2143.       ValidatePath = TRUE
  2144.     END IF
  2145.        END IF
  2146.    END IF
  2147.    szPath$ = NullTrim$(szPath$)
  2148. END FUNCTION
  2149.  
  2150. 'PUBLIC FUNCTION ValidateEditBox (hDlg&, Ctrl%) AS INTEGER
  2151. '** Purpose:check editbox text for valid volumes 
  2152. '** Author:
  2153. '** Arguments:
  2154. '** Returns:
  2155. '**     
  2156. '*************************************************************************
  2157. PUBLIC FUNCTION ValidateEditBox (hDlg&, Ctrl%) AS INTEGER
  2158.    DIM  eb$, vol$, path$, editbox$, combobox$, comboId%
  2159.  
  2160.    comboBox = "IDC_COMBO"+Right$(Str$(Ctrl%),1)
  2161.    editBox = "IDC_EDIT"+Right$(Str$(Ctrl%),1)
  2162.    comboId% = Ctrl% + 400
  2163. '**CB_GETCURSEL = 0x147 = 327
  2164.    ValidateEditBox = 1 + SendMessage(GetDlgItem(hDlg&,comboId%), 327, 0, 0)
  2165.    eb$=GetListItem("IDC_EDIT",Ctrl%)
  2166.    Lot_SplitUNCPath eb$, vol$, path$
  2167.    IF NOT vol$ = "" THEN
  2168. '** There is a UNC path in the edit box
  2169.       ValidateEditBox = SelectDriveCombo(combobox, vol$)
  2170.       IF ValidateEditBox = 0 THEN
  2171.         ShowPathError CInt(GetSymbolValue(SYM_LAST_ERROR_SID$)), 0, vol$
  2172.                 EXIT FUNCTION
  2173.       END IF
  2174.       IF ValidatePath(eb$) = FALSE THEN
  2175.         ValidateEditBox = 0
  2176.         EXIT FUNCTION
  2177.       END IF
  2178.    ELSE
  2179.       IF MID$(eb$,2,1) = ":" THEN
  2180. '** There is a drive letter in the edit box
  2181.      ValidateEditBox = SelectDriveCombo (comboBox, eb$)
  2182.      IF ValidateEditBox = 0 THEN
  2183.         ShowPathError SID_DRV_NOTEXIST, 0, Left$(eb$,2)
  2184.      ELSE
  2185.         SetListItem "IDC_EDIT", Ctrl%, Lot_ExtractDirectory(eb$)
  2186.         AddListItem SYM_UPDATELIST$, editBox
  2187.      END IF
  2188.       ELSE 
  2189.      IF MID$(eb$,1,1) <> "\" THEN
  2190.         SetListItem "IDC_EDIT", Ctrl%, "\"+eb$
  2191.         AddListItem SYM_UPDATELIST$, editBox
  2192.       
  2193.      END IF
  2194.       END IF
  2195.    END IF
  2196. END FUNCTION
  2197.  
  2198. 'PUBLIC FUNCTION ValidateBrowse (hDlg&, Ctrl%) AS INTEGER
  2199. '** Purpose:check browse results text for valid volumes 
  2200. '** Author:
  2201. '** Arguments:
  2202. '** Returns:
  2203. '**     
  2204. '*************************************************************************
  2205. PUBLIC FUNCTION ValidateBrowse (hDlg&, Ctrl%) AS INTEGER
  2206.    DIM  eb$, vol$, path$, editbox$, combobox$, comboId%
  2207.  
  2208.    comboBox = "IDC_COMBO"+Right$(Str$(Ctrl%),1)
  2209.    editBox = "IDC_EDIT"+Right$(Str$(Ctrl%),1)
  2210.    comboId% = Ctrl% + 400
  2211. '**CB_GETCURSEL = 0x147 = 327
  2212.    ValidateBrowse = 1 + SendMessage(GetDlgItem(hDlg&,comboId%), 327, 0, 0)
  2213.    eb$=GetSymbolValue("SYM_BROWSE_RESULT")
  2214.    Lot_SplitUNCPath eb$, vol$, path$
  2215.    IF NOT vol$ = "" THEN
  2216.       IF ValidatePath(eb$) = FALSE THEN
  2217.         ValidateBrowse = FALSE
  2218.         EXIT FUNCTION
  2219.       END IF
  2220.       ValidateBrowse = SelectDriveCombo(combobox, vol$)
  2221.       IF ValidateBrowse = 0 THEN
  2222.         ShowPathError CInt(GetSymbolValue(SYM_LAST_ERROR_SID$)), 0, vol$
  2223.       ELSE
  2224.     SetListItem "IDC_EDIT", Ctrl%, eb$
  2225.     AddListItem SYM_UPDATELIST$, editBox
  2226.       END IF
  2227.       EXIT FUNCTION
  2228.    ELSE
  2229.       IF MID$(eb$,2,1) = ":" THEN
  2230.      ValidateBrowse = SelectDriveCombo (comboBox, eb$)
  2231.      IF ValidateBrowse = 0 THEN
  2232.         ShowPathError SID_DRV_NOTEXIST, 0, Left$(eb$,2)
  2233.      ELSE
  2234.         SetListItem "IDC_EDIT", Ctrl%, Lot_ExtractDirectory(eb$)
  2235.         AddListItem SYM_UPDATELIST$, editBox
  2236.      END IF
  2237.       ELSE 
  2238.      IF MID$(eb$,1,1) <> "\" THEN
  2239.         SetListItem "IDC_EDIT", Ctrl%, "\"+eb$
  2240.         AddListItem SYM_UPDATELIST$, editBox
  2241.       
  2242.      END IF
  2243.       END IF
  2244.    END IF
  2245. END FUNCTION
  2246.  
  2247.  
  2248.  
  2249.  
  2250. PUBLIC FUNCTION Lot_Dir  (szDir$) AS STRING
  2251. '** Purpose:
  2252. '** Author:
  2253. '** Arguments:
  2254. '** Returns:
  2255. '**     
  2256. '*************************************************************************
  2257.     DIM DirRet$
  2258.  
  2259.     DirRet$ = Dir$(szDir$)
  2260.     Lot_Dir = DirRet$
  2261. END FUNCTION
  2262.  
  2263. PUBLIC FUNCTION Lot_GetLocalHardDrive(ProdSize&,DefaultDir$) AS STRING
  2264. '** Purpose:
  2265. '**     Gets the first writable local hard disk with enough space e.g. D:
  2266. '** Arguments:
  2267. '**     ProdSize& the minimum size requirements for installing a product
  2268. '**     DefaultDir$  the default directory to install to
  2269. '** Returns:
  2270. '**     D:\ + DefaultDir$ or an empty string
  2271. '*************************************************************************
  2272.    DIM Length%, count%, lDrive$, SpaceAvail&
  2273.  
  2274.    Lot_GetLocalHardDrive = ""
  2275.    Length% = GetListLength(SYM_LOCALHARDDRIVES$)
  2276.     IF Length% = 0 THEN
  2277.        GetLocalHardDrivesList SYM_LOCALHARDDRIVES$
  2278.        Length% = GetListLength(SYM_LOCALHARDDRIVES$)
  2279.     END IF
  2280.    FOR count% = 1 TO Length%
  2281.       lDrive$     = GetListItem(SYM_LOCALHARDDRIVES$, count%)
  2282.       SpaceAvail& = GetFreeSpaceForDrive(lDrive$)
  2283.       lDrive$     = lDrive$ + ":\" + DefaultDir$
  2284.       IF SpaceAvail& > (ProdSize& \ 1024) AND IsPathWritable(lDrive$) THEN
  2285.      Lot_GetLocalHardDrive = LCASE$(lDrive$)
  2286.      EXIT FUNCTION
  2287.       END IF
  2288.    NEXT
  2289.  
  2290. END FUNCTION
  2291.  
  2292. PUBLIC FUNCTION Lot_GetNetHardDrive(ProdSize&,DefaultDir$) AS STRING
  2293. '** Purpose:
  2294. '**     Gets the first writable network hard disk with enough space e.g. D:
  2295. '** Arguments:
  2296. '**     ProdSize& the minimum size requirements for installing a product
  2297. '**     DefaultDir$  the default directory to install to
  2298. '** Returns:
  2299. '**     D:\ + DefaultDir$ or an empty string
  2300. '*************************************************************************
  2301.    DIM Length%, count%, lDrive$, SpaceAvail&
  2302.  
  2303.    Lot_GetNetHardDrive = ""
  2304.    GetNetworkDrivesList SYM_NETHARDDRIVES$
  2305.    Length% = GetListLength(SYM_NETHARDDRIVES$)
  2306.    FOR count% = 1 TO Length%
  2307.       lDrive$     = GetListItem(SYM_NETHARDDRIVES$, count%)
  2308.       SpaceAvail& = GetFreeSpaceForDrive(lDrive$)
  2309.       lDrive$     = lDrive$ + ":\" + DefaultDir$
  2310.       IF SpaceAvail& > (ProdSize& \ 1024) AND IsPathWritable(lDrive$) THEN
  2311.      Lot_GetNetHardDrive = LCASE$(lDrive$)
  2312.      EXIT FUNCTION
  2313.       END IF
  2314.    NEXT
  2315.  
  2316. END FUNCTION
  2317.  
  2318. PUBLIC FUNCTION Lot_GetAllHardDrive(ProdSize&,DefaultDir$) AS STRING
  2319. '** Purpose:
  2320. '**     Gets the first writable local or network hard disk with enough 
  2321. '**     space e.g. D:
  2322. '** Arguments:
  2323. '**     ProdSize& the minimum size requirements for installing a product
  2324. '**     DefaultDir$  the default directory to install to
  2325. '** Returns:
  2326. '**     D:\ + DefaultDir$ or an empty string
  2327. '*************************************************************************
  2328.  
  2329.    DIM   drv$
  2330.  
  2331.    drv$ = Lot_GetLocalHardDrive(ProdSize&, DefaultDir$)
  2332.    IF drv$ <> "" THEN
  2333.       Lot_GetAllHardDrive = drv$
  2334.    ELSE
  2335.       Lot_GetAllHardDrive = Lot_GetNetHardDrive(ProdSize&, DefaultDir$)
  2336.    END IF
  2337.  
  2338. END FUNCTION
  2339.  
  2340. PUBLIC FUNCTION Lot_GetChapterFromKeyword (szKeyword$) AS STRING
  2341. '** Purpose: Get the chapter # given the Chapter name
  2342. '** Author:
  2343. '** Arguments:
  2344. '** Returns:
  2345. '**     
  2346. '*************************************************************************
  2347.     DIM g_strbuf$
  2348.  
  2349.     g_strbuf$ = CreateBuffer(256)
  2350.     If FGetChapterFromKeyword(szKeyword$, g_strbuf$, 256) = 0 Then
  2351.        Lot_GetChapterFromKeyword = ""
  2352.     Else
  2353.        Lot_GetChapterFromKeyword = NullTrim(g_strbuf$)
  2354.     End If
  2355. END FUNCTION
  2356.  
  2357. PUBLIC Lot_CallExec_RC$ 
  2358.  
  2359. PUBLIC FUNCTION Lot_CallProductFunctions (func_name$, BYVAL direction$, always%, back$, parms$) AS STRING
  2360. '** Purpose:
  2361. '** Author:
  2362. '** Arguments:
  2363. '**     func_name$: Name of function + prod Acronym will be called.
  2364. '**     always%: IF TRUE then alwasy calls function, otherwise only if product is turned on.
  2365. '**     direction$: determines the direction: gBACK means start at the last callback.
  2366. '** Returns:
  2367. '**     
  2368. '*************************************************************************
  2369.   DIM n%, i%, lname$, prodcall$, notused%, incr%
  2370.  
  2371.   Lot_CallProductFunctions = ""
  2372.   n% = Reg_GetNumberOfProducts()
  2373.   If direction$ = gBACK Then
  2374.     i% = n%
  2375.     incr% = 1
  2376.   Else
  2377.     i% = 1
  2378.     incr% = -1
  2379.   End If
  2380.   WHILE (i%  >= 1 AND i% <= n%)
  2381.  
  2382.      lname$ = Reg_GetProductAcronym(i%)
  2383.      If lname$ <> "" AND (always% <> FALSE OR Prods(i%).UIInOrOut <> FALSE) Then
  2384.             '
  2385.             ' construct a lotus script statement for EXECUTE. It will look
  2386.             ' something like this:
  2387.             '     INIT123(i%, "server$", parms$)
  2388.             '
  2389.     If parms$ <> "" Then
  2390.        prodcall$ = "Lot_CallExec_RC$  = " & func_name$ & lname$ & "(" & i% & "," & |"| & GetSymbolValue(SYM_NETWORK) & |"| & "," & |"| & direction$ & |"| &  "," & parms$ & ")"
  2391.     Else
  2392.        prodcall$ = "Lot_CallExec_RC$  = " & func_name$ & lname$ & "(" & i% & "," & |"| &  GetSymbolValue(SYM_NETWORK) & |"| & "," & |"| & direction$ & |"| & ")"
  2393.     End If
  2394.      ' DOEXEC removed and replaced by EXECUTE!
  2395.             ' call DOEXEC, which acts like the script EXECUTE statement.
  2396.             ' The difference is that DOEXEC operates in the default module,
  2397.             ' while  EXECUTE creates a temporary module that disappears once the
  2398.             ' call is made.  The first parameter to DOEXEC is a module name,
  2399.             ' which is made into a "USE modname" statement, if that module 
  2400.             ' name has not yet been USE'd via DOEXEC. The second arg is the
  2401.             ' statement to be run. Note - the args must be call by value,
  2402.             ' not reference (can be done by enclosing args in parens)       
  2403.  
  2404.           gEndStatementEncountered% = FALSE
  2405.     '** TV : old execute : on error doesn't work
  2406.     'EXECUTE(|USE "| & lname$ & |" : | & prodcall$)
  2407.     '** TV : new 
  2408.     EXECUTE(|USE "| & lname$ & |" : SUB INITIALIZE : | & prodcall$ & |:END SUB|)
  2409.  
  2410.           '  this gEndStatementEncountered flag is necessary because the Lotus
  2411.           '  END statement, which normally exists the entire program, only
  2412.     '  exits the top-level routine running in DOEXEC.  So,
  2413.           '  check this flag here, to see if we hit an END during DOEXEC.
  2414.  
  2415.           IF gEndStatementEncountered% = TRUE THEN
  2416.             END                                            ' exit the program
  2417.           END IF
  2418.  
  2419.     direction$ = Lot_CallExec_RC$
  2420.     If direction$ = gBACK Then
  2421.        incr% = -1
  2422.     Else
  2423.        incr% = 1
  2424.     End If
  2425.      End If
  2426.  
  2427.      If direction$ = gBACK AND back$ = gALLPRODUCTS then
  2428.        Lot_CallProductFunctions = direction$
  2429.        Exit Function
  2430.      End If
  2431.  
  2432.      i% = i% + incr%
  2433.   WEND
  2434.  
  2435.   Lot_CallProductFunctions = direction$
  2436.  
  2437. END FUNCTION
  2438.  
  2439. PUBLIC FUNCTION Lot_CallOneProductFunction (prodno%, func_name$, BYVAL direction$, always%, parms$) AS STRING
  2440. '** Purpose:
  2441. '** Author:
  2442. '** Arguments:
  2443. '** Returns:
  2444. '**     
  2445. '*************************************************************************
  2446.   DIM lname$, prodcall$, notused%
  2447.  
  2448.   Lot_CallOneProductFunction = ""
  2449.   lname$ = Reg_GetProductAcronym(prodno%)
  2450.   If lname$ <> "" Then
  2451.      '
  2452.      ' construct a lotus script statement for EXECUTE. It will look
  2453.      ' something like this:
  2454.      '     USE "123":INIT123(prodno%, "server$", parms$)
  2455.      '
  2456.      If parms$ <> "" Then
  2457.     prodcall$ = "Lot_CallExec_RC$  = " & func_name$ & lname$ & "(" & prodno% & "," & |"| & GetSymbolValue(SYM_NETWORK) & |"| & "," & |"| & direction$ & |"| & "," & parms$ & ")"
  2458.      Else
  2459.     prodcall$ = "Lot_CallExec_RC$  = " & func_name$ & lname$ & "(" & prodno% & "," & |"| &  GetSymbolValue(SYM_NETWORK) & |"| & "," & |"| & direction$ & |"| & ")"
  2460.      End If
  2461.  
  2462.      ' DOEXEC removed and replaced by EXECUTE!
  2463.             ' call DOEXEC, which acts like the script EXECUTE statement.
  2464.             ' The difference is that DOEXEC operates in the default module,
  2465.             ' while  EXECUTE creates a temporary module that disappears once the
  2466.             ' call is made.  The first parameter to DOEXEC is a module name,
  2467.             ' which is made into a "USE modname" statement, if that module 
  2468.             ' name has not yet been USE'd via DOEXEC. The second arg is the
  2469.             ' statement to be run. Note - the args must be call by value,
  2470.             ' not reference (can be done by enclosing args in parens)       
  2471.             
  2472.        gEndStatementEncountered% = FALSE            ' see Lot_CallProductFunctions
  2473.  
  2474.       '** TV : old execute : on error doesn't work
  2475.       'EXECUTE(|USE "| & lname$ & |" : | & prodcall$)
  2476.       '** TV : new 
  2477.       EXECUTE(|USE "| & lname$ & |" : SUB INITIALIZE : | & prodcall$ & |:END SUB|)
  2478.     
  2479.  
  2480.        IF gEndStatementEncountered% = TRUE THEN
  2481.             END                                            ' exit the program
  2482.        END IF
  2483.  
  2484.      Lot_CallOneProductFunction = Lot_CallExec_RC$
  2485.  
  2486.  
  2487.   End If
  2488.  
  2489.  
  2490. END FUNCTION
  2491.  
  2492. '*************************************************************************
  2493. PUBLIC FUNCTION Lot_CheckPath (path$) AS INTEGER
  2494. '** Purpose:
  2495. '** Author:
  2496. '** Arguments:
  2497. '** Returns:
  2498. '**     
  2499. '*************************************************************************
  2500.    DIM ldrive$, vol$, unused$
  2501.  
  2502.    Lot_CheckPath = FALSE
  2503.    path$ = NullTrim( path$ )
  2504.    IF path$ <> "" THEN
  2505.       Lot_SplitUNCPath path$, vol$, unused$
  2506.       IF vol$ = "" THEN
  2507.        ldrive$ = Lot_ExtractDriveLetter(path$)
  2508.  
  2509.        IF IsDriveValid(ldrive$) <> FALSE AND Lot_CleanPath(path$) <> FALSE THEN 
  2510.            Lot_CheckPath = TRUE
  2511.        END IF
  2512.       ELSE
  2513.        IF Lot_CleanPath(path$) <> FALSE THEN 
  2514.         Lot_CheckPath = TRUE
  2515.        END IF
  2516.       END IF
  2517.    END IF
  2518.  
  2519. END FUNCTION
  2520.  
  2521. PUBLIC FUNCTION Lot_GetFirst (szChapt$, nFlag%) AS STRING
  2522. '** Purpose:
  2523. '** Author:
  2524. '** Arguments:
  2525. '** Returns:
  2526. '**     
  2527. '*************************************************************************
  2528.   DIM g_strbuf$, Length%
  2529.  
  2530.   g_strbuf$ = CreateBuffer(256)
  2531.   if FGetFirst(szChapt$,g_strbuf$,CLng(nFlag%)) = 0 then
  2532.       Lot_GetFirst = ""     
  2533.   else
  2534.      Lot_GetFirst = NullTrim(g_strbuf)
  2535.  end if
  2536.  
  2537.  
  2538. END FUNCTION
  2539. '*************************************************************
  2540.  
  2541. PUBLIC FUNCTION Lot_GetNext () AS STRING
  2542. '** Purpose:
  2543. '** Author:
  2544. '** Arguments:
  2545. '** Returns:
  2546. '**     
  2547. '*************************************************************************
  2548.       DIM g_strbuf$
  2549.   
  2550.     g_strbuf$ = CreateBuffer(256)
  2551.     if FGetNext(g_strbuf$) = 0 then
  2552.        Lot_GetNext = ""         
  2553.     else
  2554.        Lot_GetNext = NullTrim(g_strbuf$)
  2555.      end if
  2556.  
  2557. END FUNCTION
  2558. '*************************************************************************
  2559.  
  2560. PUBLIC FUNCTION Lot_SetDateOfFile (szFile$, szDate$) AS INTEGER
  2561. '** Purpose:
  2562. '** Author:
  2563. '** Arguments:
  2564. '** Returns:
  2565. '**     
  2566. '*************************************************************************
  2567.   if FSetDateOfFile(szFile$,szDate$) = 0 then
  2568.     Lot_SetDateOfFile = 0   
  2569.   else
  2570.      Lot_SetDateOfFile = 1
  2571.   end if
  2572.  
  2573.  
  2574. END FUNCTION
  2575. '*************************************************************
  2576.  
  2577. PUBLIC SUB Lot_RemoveSectionFilesFromCopyList (szSect$) 
  2578. '** Purpose:
  2579. '** Author:
  2580. '** Arguments:
  2581. '** Returns:
  2582. '**     
  2583. '*************************************************************************
  2584. %rem
  2585.     if FValidInfSect(szSect$) = 0 then
  2586.     n% = 1
  2587.     else
  2588.     n% = 0
  2589.     end if
  2590.     if n% > 0 then
  2591.     BadArgErr n%, "Lot_RemoveSectionFilesFromCopyList", szSect$
  2592.     end if
  2593. %endrem ''DEBUG
  2594.  
  2595.     IF FRemoveSectionFilesFromCopyList (szSect$) = 0 THEN
  2596.     ErrorMsg SID_ERR_LOT_RSFFCL, ""
  2597.     ERROR STFQUIT
  2598.     END IF
  2599. END SUB
  2600. '*************************************************************************
  2601.  
  2602. PUBLIC SUB Lot_RemoveSectionKeyFileFromCopyList (szSect$, szKey$) 
  2603. '** Purpose:
  2604. '** Author:
  2605. '** Arguments:
  2606. '** Returns:
  2607. '**     
  2608. '*************************************************************************
  2609. %rem
  2610.     if FValidInfSect(szSect$) = 0 then
  2611.     n% = 1
  2612.     elseif szKey$ = "" then
  2613.     n% = 2
  2614.     else
  2615.     n% = 0
  2616.     end if
  2617.     if n% > 0 then
  2618.     BadArgErr n%, "Lot_RemoveSectionKeyFileFromCopyList", szSect$+", "+szKey$
  2619.     end if
  2620. %endrem ''DEBUG
  2621.  
  2622.     IF FRemoveSectionKeyFileFromCopyList (szSect$, szKey$) = 0 THEN
  2623.     ErrorMsg SID_ERR_LOT_RSKFFCL, ""
  2624.     ERROR STFQUIT
  2625.     END IF
  2626. END SUB
  2627. '*************************************************************************
  2628.  
  2629. PUBLIC FUNCTION Lot_GetInfSectionSize (szSect$)  AS LONG
  2630. '** Purpose:
  2631. '** Author:
  2632. '** Arguments:
  2633. '** Returns:
  2634. '**     
  2635. '*************************************************************************
  2636. %rem
  2637.     if FValidInfSect(szSect$) = 0 then
  2638.     n% = 1
  2639.     else
  2640.     n% = 0
  2641.     end if
  2642.     if n% > 0 then
  2643.     ERROR STFQUIT
  2644.     end if
  2645. %endrem
  2646.     Lot_GetInfSectionSize = LcbGetInfSectionSize(szSect$)
  2647. END FUNCTION
  2648.  
  2649. '** DND: These functions need an ASSERT!!!!!!!
  2650.  
  2651. PUBLIC FUNCTION Lot_AddPagetoNotebook (hDlg&,  Notebookid&,DlgId%, Tabstring$)   AS INTEGER
  2652. '** Purpose:
  2653. '** Author:
  2654. '** Arguments:
  2655. '** Returns:
  2656. '**     
  2657. '*************************************************************************
  2658.     DIM Dll$
  2659.     Dll$ = FindResourceinDLL (CLng(DlgId%), RT_DIALOG)
  2660.     If Dll$ = "" then
  2661.         Dll$ = "mscuistf.dll"
  2662.     End if
  2663.     Lot_AddPagetoNotebook = NotebookAddDlgPage(hDlg&,  Notebookid&,CLng(DlgId%), Dll$,FNAMEORGDLGPROC$,Tabstring$) 
  2664.     IF Lot_AddPagetoNotebook = 0 THEN
  2665.        ErrorMsg 0, "Error creating notebook page"
  2666.       ERROR STFQUIT
  2667.     END IF
  2668. END FUNCTION
  2669. '*************************************************************************
  2670.  
  2671. PUBLIC FUNCTION Lot_NotebookPageView (hDlg&,  Notebookid&, DlgId%, fShowPage%) AS INTEGER
  2672. '** Purpose:
  2673. '** Author:
  2674. '** Arguments:
  2675. '** Returns:
  2676. '**     
  2677. '*************************************************************************
  2678.    Lot_NotebookPageView = FNotebookPageView (hDlg&,  Notebookid&, CLng(DlgId%), CLng(fShowPage%))
  2679.    IF Lot_NotebookPageView = 0 THEN
  2680.       ErrorMsg 0, "Error viewing notebook page"
  2681.       ERROR STFQUIT
  2682.    END IF
  2683. END FUNCTION
  2684. '*************************************************************************
  2685.  
  2686. PUBLIC SUB Lot_TurnToPage (hDlg&,Notebookid&, pageid%) 
  2687. '** Purpose:
  2688. '** Author:
  2689. '** Arguments:
  2690. '** Returns:
  2691. '**     
  2692. '*************************************************************************
  2693.     IF  FNotebookTurnToPage(hDlg&,Notebookid&, CLng(pageid%)) <> 1 THEN
  2694.        ErrorMsg 0, "Error turning notebook page"
  2695.       ERROR STFQUIT
  2696.     END IF
  2697. END SUB
  2698. '*************************************************************************
  2699.  
  2700. PUBLIC FUNCTION Lot_GetPagehandle  (hDlg&,Notebookid&,Pageid%) AS LONG
  2701. '** Purpose:
  2702. '** Author:
  2703. '** Arguments:
  2704. '** Returns:
  2705. '**     
  2706. '*************************************************************************
  2707.     Lot_GetPagehandle = NotebookGetPageHwnd(hDlg&,Notebookid&,CLng(Pageid%)) 
  2708.     IF Lot_GetPagehandle = 0 THEN
  2709.        ErrorMsg 0, "Error getting the notebook page handle"
  2710.        ERROR STFQUIT
  2711.     END IF
  2712. END FUNCTION
  2713. '*************************************************************************
  2714.  
  2715. PUBLIC SUB Lot_LCBResetContent(hDlg&)
  2716. '** Purpose:
  2717. '** Author:
  2718. '** Arguments:
  2719. '** Returns:
  2720. '**     
  2721. '*************************************************************************
  2722.   LCBResetContent hDlg&
  2723. END SUB
  2724. '*************************************************************************
  2725.  
  2726. PUBLIC SUB Lot_LCBSetRedraw (hDlg&, fRedraw%)
  2727. '** Purpose:
  2728. '** Author:
  2729. '** Arguments:
  2730. '** Returns:
  2731. '**     
  2732. '*************************************************************************
  2733.   LCBSetRedraw hDlg&, CLng(fRedraw%)
  2734. END SUB
  2735. '*************************************************************************
  2736.  
  2737. PUBLIC FUNCTION Lot_LCBGetCount (hDlg&) AS INTEGER
  2738.  
  2739. '** Purpose:
  2740. '** Author:
  2741. '** Arguments:
  2742. '** Returns:
  2743. '**     
  2744. '*************************************************************************
  2745.  
  2746.    Lot_LCBGetCount = LCBGetCount(hDlg&)
  2747.  
  2748. END FUNCTION
  2749. '*************************************************************************
  2750.  
  2751. PUBLIC FUNCTION Lot_LCBAddItem (hDlg&, item$) AS INTEGER
  2752. '** Purpose:
  2753. '** Author:
  2754. '** Arguments:
  2755. '** Returns:
  2756. '**     
  2757. '*************************************************************************
  2758.      DIM rc%
  2759.  
  2760.    rc% = LCBAddItem (hDlg&, item$)
  2761.    If (rc% = 0) Then
  2762.       ErrorMsg 0, "Could not Add Item: "+item$+" to LCB on DLG: "+STR$(hDlg&)
  2763.       ERROR STFQUIT
  2764.    End If
  2765.    Lot_LCBAddItem= rc%
  2766.  
  2767. END FUNCTION
  2768. '*************************************************************************
  2769.  
  2770. PUBLIC FUNCTION Lot_LCBReplaceItem (hDlg&, index%, itemnum%, item$) AS INTEGER
  2771. '** Purpose:
  2772. '** Author:
  2773. '** Arguments:
  2774. '** Returns:
  2775. '**     
  2776. '*************************************************************************
  2777.    DIM rc%
  2778.  
  2779.    rc% = LCBReplaceItem (hDlg&, CLng(index%), CLng(itemnum%), item$)
  2780.    Lot_LCBReplaceItem = rc%
  2781.  
  2782. END FUNCTION
  2783. '*************************************************************************
  2784.  
  2785. PUBLIC FUNCTION Lot_LCBGetItem (hDlg&, index%, itemnum%) AS STRING
  2786. '** Purpose:
  2787. '** Author:
  2788. '** Arguments:
  2789. '** Returns:
  2790. '**???     
  2791. '*************************************************************************
  2792. DIM rc%
  2793. DIM szValue As String : szValue = CreateBuffer(cbSymValMax)
  2794.  
  2795.      rc% = LCBGetItem (hDlg&, CLng(index%), CLng(itemnum%), szValue$, cbSymValMax)
  2796.      Lot_LCBGetItem = NullTrim(szValue$)
  2797.  
  2798. END FUNCTION
  2799. '*************************************************************************
  2800.  
  2801. PUBLIC FUNCTION Lot_LCBToggleItem  (hDlg&, index%) AS INTEGER
  2802. '** Purpose:
  2803. '** Author:
  2804. '** Arguments:
  2805. '** Returns:
  2806. '**     
  2807. '*************************************************************************
  2808.    DIM rc%
  2809.  
  2810.    rc% = LCBToggleItem (hDlg&, CLng(index%))
  2811.    Lot_LCBToggleItem = rc%
  2812.  
  2813. END FUNCTION
  2814.  
  2815. '*************************************************************************
  2816.  
  2817. PUBLIC SUB Lot_LCBSetSel (hDlg&, index%)
  2818. ' wrapper 
  2819. '*************************************************************************
  2820.   LCBSetSel hDlg&, CLng(index%)
  2821. END SUB
  2822.  
  2823. '*************************************************************************
  2824.  
  2825. PUBLIC SUB Lot_LCBSetTabs (hDlg&, t1%, t2%, t3%, t4%)
  2826. ' wrapper 
  2827. '*************************************************************************
  2828.   LCBSetTabs hDlg&, CLng(t1%), CLng(t2%), CLng(t3%), CLng(t4%)
  2829. END SUB
  2830.  
  2831. '*************************************************************************
  2832.  
  2833. PUBLIC FUNCTION Lot_GetFirstChild (szChapt$, nFlag%) AS STRING
  2834. '** Purpose:
  2835. '** Author:
  2836. '** Arguments:
  2837. '** Returns:
  2838. '**     
  2839. '*************************************************************************
  2840. DIM szValue As String : szValue = CreateBuffer(cbSymValMax)
  2841.  
  2842.     if FGetFirstChild(szChapt$, szValue$, CLng(nFlag%)) = 0 then
  2843.      Lot_GetFirstChild = ""         
  2844.     else
  2845.      Lot_GetFirstChild = NullTrim(szValue$ )
  2846.     end if
  2847.  
  2848. END FUNCTION
  2849. '*************************************************************************
  2850.  
  2851. PUBLIC FUNCTION Lot_GetGroupName ( szGroupFileName$) AS STRING  
  2852. '** Purpose:
  2853. '** Author:
  2854. '** Arguments:
  2855. '** Returns:
  2856. '**     
  2857. '*************************************************************************
  2858.    DIM szValue As String : szValue = CreateBuffer(cbSymValMax)
  2859.  
  2860.    IF FGetGroupName(szGroupFileName$, szValue$, cbSymValMax) = 0 THEN
  2861.       Lot_GetGroupName = ""
  2862.    ELSE
  2863.       Lot_GetGroupName = NullTrim(szValue$)
  2864.    END IF
  2865.  
  2866. END FUNCTION
  2867. '*************************************************************************
  2868.  
  2869. PUBLIC FUNCTION Lot_GetChapterValStr (szChapter$, nField%)  AS STRING 
  2870. '** Purpose:
  2871. '** Author:
  2872. '** Arguments:
  2873. '** Returns:
  2874. '**     
  2875. '*************************************************************************
  2876.    DIM szValue As String : szValue = CreateBuffer(cbSymValMax)
  2877.  
  2878.    IF FGetChapterValStr(szChapter$, CLng(nField%), szValue$, cbSymValMax) = 0 THEN
  2879.       Lot_GetChapterValStr = ""
  2880.    ELSE
  2881.       Lot_GetChapterValStr = NullTrim(szValue$)
  2882.    END IF
  2883.  
  2884. END FUNCTION
  2885. '*************************************************************************
  2886.  
  2887. PUBLIC FUNCTION Lot_GetChapterValInt (szChapter$,nField%) AS INTEGER  
  2888. '** Purpose:
  2889. '** Author:
  2890. '** Arguments:
  2891. '** Returns:
  2892. '**     
  2893. '*************************************************************************
  2894.    DIM lpVal&
  2895.    
  2896.    if FGetChapterValInt(szChapter$, CLng(nField%),lpVal&) = 0 then
  2897.        Lot_GetChapterValInt = -1    
  2898.    else
  2899.       Lot_GetChapterValInt = CInt(lpVal&)
  2900.    end if
  2901.  
  2902. END FUNCTION
  2903. '*************************************************************************
  2904.  
  2905. PUBLIC FUNCTION Lot_GetNextSibling (szChapter$,nField%) AS STRING
  2906. '** Purpose:
  2907. '** Author:
  2908. '** Arguments:
  2909. '** Returns:
  2910. '**     
  2911. '*************************************************************************
  2912. DIM szValue As String : szValue = CreateBuffer(cbSymValMax)
  2913.  
  2914.     if FGetNextSibling(szChapter$, szValue$,CLng(nField%)) = 0 then
  2915.        Lot_GetNextSibling = ""  
  2916.     else
  2917.        Lot_GetNextSibling = NullTrim(szValue$)
  2918.     end if
  2919.  
  2920. END FUNCTION
  2921. '*************************************************************************
  2922.  
  2923. PUBLIC FUNCTION Lot_GetNextChild () AS STRING
  2924. '** Purpose:
  2925. '** Author:
  2926. '** Arguments:
  2927. '** Returns:
  2928. '**     
  2929. '*************************************************************************
  2930.    DIM g_strbuf$, Length%
  2931.  
  2932.    g_strbuf$ = CreateBuffer(256)
  2933.    if FGetNextChild(g_strbuf$) = 0 then
  2934.       Lot_GetNextChild = ""     
  2935.    else
  2936.       Lot_GetNextChild = NullTrim(g_strbuf$)
  2937.     end if
  2938.  
  2939. END FUNCTION
  2940. '*************************************************************************
  2941.  
  2942. PUBLIC FUNCTION Lot_GetInfChapterSize (szChapter$)  AS LONG
  2943. '** Purpose:
  2944. '** Author:
  2945. '** Arguments:
  2946. '** Returns:
  2947. '**     
  2948. '*************************************************************************
  2949.    DIM size&
  2950.  
  2951.    size&= LcbGetInfChapterSize(szChapter$)
  2952.    if size& = -1 then
  2953.      Lot_GetInfChapterSize = -1         
  2954.    else
  2955.      Lot_GetInfChapterSize = size&
  2956.    end if
  2957.  
  2958. END FUNCTION
  2959. '*************************************************************************
  2960.  
  2961. PUBLIC SUB Lot_ToggleChapterFilesInCopyList (szChapter$)  
  2962. '** Purpose:
  2963. '** Author:
  2964. '** Arguments:
  2965. '** Returns:
  2966. '**     
  2967. '*************************************************************************
  2968.  
  2969.    If FToggleChapterFilesInCopylist(szChapter$) = 0 Then
  2970.       ERROR STFTOGGLE
  2971.    End If
  2972.  
  2973. END SUB
  2974.  
  2975.  
  2976. '*************************************************************************
  2977.  
  2978. PUBLIC FUNCTION Lot_SetChapterFilesInCopyListInOrOut (szChapter$, InOrOut%) AS INTEGER
  2979. '** Purpose: Given a chapter, This function turns the feature on or off.
  2980. '**          It is written to be especially careful that features are not
  2981. '**          turned on if they are not allowed to be. Examples are:
  2982. '**          NODE: If the feaure doesn't exist on the Server
  2983. '**          ANY TYPE: If the feature is not in the INF file
  2984. '** Author: Marcel Meth
  2985. '** Arguments: szChapter$: The chapter number, e.g. "1.2.1"
  2986. '**               InOrOut: 1 for in, 0 for Out
  2987. '** Returns: Wheter the feature is actually In (1) or Out (0)
  2988. '**          regardless of what the request was.
  2989. '**     
  2990. '*************************************************************************
  2991. DIM curinorout%, FeatureToFind$
  2992.  
  2993.    If szChapter$ = "" Then
  2994.       Lot_SetChapterFilesInCopyListInOrOut  = 0
  2995.       Exit FUNCTION
  2996.    End If
  2997.  
  2998.    curinorout% = Lot_GetChapterValInt(szChapter$, F_INOROUT)
  2999.    '** If the current setting already equals the requested setting
  3000.    If InOrOut% = curinorout% Then
  3001.       Lot_SetChapterFilesInCopyListInOrOut  = InOrOut%
  3002.       Exit FUNCTION
  3003.    End If
  3004.  
  3005.    '** If the requested setting is IN
  3006.    If  InOrOut% = 1 THEN
  3007.       Lot_SetChapterFilesInCopyListInOrOut = 1
  3008.  
  3009.       '** For a node install, make sure the server has the feature
  3010.       If GetSymbolValue("NETWORK") = gNODE Then
  3011.      FeatureToFind$ = Lot_GetChapterValStr(szChapter$, F_KEYWORD)
  3012.      If Lot_IsTheFeatureInstalled(FeatureToFind$) = FALSE Then
  3013.         Lot_SetChapterFilesInCopyListInOrOut = 0
  3014.         Exit Function
  3015.      End If
  3016.       End If
  3017.  
  3018.       If FToggleChapterFilesInCopylist(szChapter$) = 0 Then
  3019.      Lot_SetChapterFilesInCopyListInOrOut = 0
  3020.       End If
  3021.  
  3022.    '** If the requested setting is OUT
  3023.    Else
  3024.       Lot_SetChapterFilesInCopyListInOrOut = 0
  3025.       If FToggleChapterFilesInCopylist(szChapter$) = 0 Then
  3026.      Lot_SetChapterFilesInCopyListInOrOut = 1
  3027.       End If
  3028.    End If
  3029.  
  3030. END FUNCTION
  3031.  
  3032.  
  3033. '*************************************************************************
  3034.  
  3035. PUBLIC SUB Lot_InitializeCopyList (szChpt$, nField%) 
  3036. '** Purpose:
  3037. '** Author:
  3038. '** Arguments:
  3039. '** Returns:
  3040. '**     
  3041. '*************************************************************************
  3042.    if FInitializeCopyList(szChpt$, GetSymbolValue(SYM_STF_SRCDIR$), CLng(nField%)) = 0 then
  3043.       ErrorMsg 0, "Error initializing the copylist: " + szChpt$
  3044.       ERROR STFQUIT
  3045.    end if
  3046. END SUB
  3047.  
  3048. '***********************************************************************
  3049. PUBLIC SUB Lot_TurnOffAllNodeOptSections
  3050. '**
  3051. '**Turns off all node options sections in copy list
  3052. '**Normally these get turned off and on by the callback
  3053. '**But Suit needs to be able to turn them all off without
  3054. '**surfacing the dialog
  3055. '**
  3056. '**No registration functions performed, just killing 
  3057. '**the sections in the copylist
  3058. '**
  3059. DIM AllProdNum%, prodNum%, AllOptNum%, chpt$, j%, OptKeyWord$
  3060. DIM notused%
  3061.  
  3062.     'Loop through the products and find the avail node options
  3063.   AllProdNum% = 0
  3064.   AllProdNum% = Reg_GetNumberOfProducts()
  3065.   IF AllProdNum% <> 0 THEN
  3066.     'Loop through the products
  3067.     FOR prodNum%=1 TO AllProdNum%
  3068.       AllOptNum% = 0
  3069.       AllOptNum% = Reg_GetNumofNodeOptions(prodNum%)
  3070.       chpt$ = Lot_GetChapterFromKeyword(Reg_GetProductAcronym(prodNum%)_
  3071.         + gTOP$)
  3072.       IF AllOptNum% <> 0 THEN
  3073.         ' Loop through the options
  3074.         FOR j% = 1 TO AllOptNum%
  3075.           OptKeyWord$ = Reg_GetNodeOptionStr(prodNum%,j%)
  3076.           chpt$ = Lot_GetChapterFromKeyword(OptKeyWord$)
  3077.           notused% = Lot_SetChapterFilesInCopyListInOrOut(chpt$, 0)
  3078.         NEXT
  3079.       END IF
  3080.     NEXT
  3081.   END IF
  3082. END SUB
  3083.  
  3084. '*************************************************************************
  3085.  
  3086. PUBLIC SUB Lot_InitializeWinWinsysSym () 
  3087. '** Purpose: Sets win and winsys symbols
  3088. '** Author:  MZ
  3089. '*************************************************************************
  3090. DIM systemDir$
  3091.  
  3092.    'Set Windows directory symbol
  3093.    systemDir$ = GetWindowsDir()
  3094.    SetSymbolValue SYM_WINDIR$, systemdir$
  3095.  
  3096.    'Get Windows System directory
  3097.    systemDir$ = GetWindowsSysDir()
  3098.  
  3099.    'Check if I can write to the window system dir. and set winsysdir symbol
  3100.    IF(IsDirWritable(systemDir$)) = 1 THEN
  3101.       SetSymbolValue SYM_WINSYSDIR$, systemDir$
  3102.    ELSE
  3103.       SetSymbolValue SYM_WINSYSDIR$, GetWindowsDir()
  3104.    END IF
  3105. END SUB
  3106.  
  3107. ''* INitialize the gEXTRA LIST to 200000 bytes for the windows drive.
  3108. PUBLIC SUB Lot_InitializeEXTRA
  3109.     DIM drv$, drvno%, i%
  3110.    '' Add extra "FUDGE" space on Windows drive to allow for activities
  3111.    '' in windows directory.
  3112.    If GetListLength(gEXTRA) = 0 Then
  3113.       drv$ = Lot_ExtractDriveLetter(GetWindowsDir())
  3114.       drvno% = ASC(drv$) - ASC("a") + 1
  3115.       FOR i% = 1 to 26
  3116.      If i% = drvno% Then
  3117.         AddlistItem gEXTRA, "200000"
  3118.      Else
  3119.         AddlistItem gEXTRA, ""
  3120.      End If
  3121.       NEXT
  3122.    End If
  3123. END SUB
  3124.  
  3125. PUBLIC SUB Lot_RefreshDestination (symbol$) 
  3126. '** Purpose:
  3127. '** Author:
  3128. '** Arguments:
  3129. '** Returns:
  3130. '**     
  3131. '*************************************************************************
  3132.    if FRefreshDestination(symbol$) = FALSE THEN
  3133.       ErrorMsg 0, "Lot_RefreshDestination error: " + symbol$
  3134.       ERROR STFQUIT
  3135.    end if
  3136. END SUB
  3137.  
  3138. '*************************************************************************
  3139. PUBLIC SUB Lot_WriteDestinationSymAndVal (IniFileName$,IniSection$) 
  3140. '** Purpose:
  3141. '** Author:
  3142. '** Arguments:
  3143. '** Returns:
  3144. '**     
  3145. '*************************************************************************
  3146.    if FWriteDestinationSymAndVal(IniFileName$,IniSection$) = FALSE THEN
  3147.       ErrorMsg 0, "Lot_WriteDestinationSymAndVal error."
  3148.       ERROR STFQUIT
  3149.    end if
  3150. END SUB
  3151. '*************************************************************************
  3152.  
  3153. PUBLIC SUB Lot_GetDriveFreeSpaceList (szSymbol$)
  3154. '** Purpose: Creates a list of available drives, with space available
  3155. '** Author:
  3156. '** Arguments: sySymbol$        Name of list
  3157. '**     
  3158. '*************************************************************************
  3159. DIM     i%, nd%, rc$
  3160.    if FGetDriveFreeSpaceList(szSymbol$) = FALSE THEN
  3161.       ErrorMsg SID_ERR_LOT_GDFSL, ""
  3162.       ERROR STFQUIT
  3163.    end if
  3164. END SUB
  3165.  
  3166. PUBLIC FUNCTION Lot_AddToDriveFreeSpaceList (szSymbol$, szNewItem$) AS LONG
  3167. '** Purpose:Add a drive to a drive free space combo control 
  3168. '** Author:GJL
  3169. '** Arguments:szSymbol$ symbol for combo control
  3170. '**             szNewItem$ drive or UNC volume to add
  3171. '** Returns:TRUE if successful 
  3172. '**     
  3173. '*************************************************************************
  3174. DIM ret&
  3175.    ret& = FAddToDriveFreeSpaceList(szSymbol$, szNewItem$)
  3176.    IF ret& = 0 THEN
  3177.     Lot_AddToDriveFreeSpaceList = FALSE
  3178.    ELSE
  3179.     Lot_AddToDriveFreeSpaceList  = TRUE
  3180.    END IF
  3181. END FUNCTION
  3182. '*************************************************************************
  3183.  
  3184.  
  3185. '**UNC stuff
  3186. PUBLIC FUNCTION Lot_IsUnvalidatedUNCPath(szPath$) AS LONG
  3187. '** Purpose:Checks for 2 leading backslashes on a path
  3188. '** Author:GJL
  3189. '** Arguments:szPath$ a path
  3190. '** Returns:
  3191. '**     
  3192. '*************************************************************************
  3193.    IF FIsUnvalidatedUNCPath(szPath$) = 1 THEN
  3194.     Lot_IsUnvalidatedUNCPath = TRUE
  3195.    ELSE   
  3196.     Lot_IsUnvalidatedUNCPath = FALSE
  3197. END IF
  3198. END FUNCTION
  3199.  
  3200. PUBLIC FUNCTION Lot_IsValidUNCPath(szPath$) AS LONG
  3201. '** Purpose:determine whether a UNC volume is valid
  3202. '** Author:GJL
  3203. '** Arguments:A UNC volume with no trailing backslash
  3204. '** Returns:
  3205. '**     
  3206. '*************************************************************************
  3207.    IF FIsValidUNCPath(szPath$) = 1 THEN
  3208.     Lot_IsValidUNCPath = TRUE
  3209.    ELSE
  3210.     Lot_IsValidUNCPath = FALSE
  3211.    END IF
  3212. END FUNCTION
  3213.  
  3214. '**end UNC stuff
  3215.  
  3216.  
  3217. PUBLIC FUNCTION PopupModelessDlg (Dlg%, HelpID&) AS STRING
  3218. '** Purpose:
  3219. '** Author:
  3220. '** Arguments:
  3221. '** Returns:
  3222. '*************************************************************************
  3223.    DIM cuidll$, szWnd$, notused$, notused1%
  3224.  
  3225.  '-   cuidll$ = GetSymbolValue(SYM_CUIDLL$)
  3226.  ' JMD
  3227.  ' SYM_CUIDLL is now a list of DLLs
  3228.  ' First one contains code (dialog procs) and common resources
  3229.  ' Others contain product specific resources
  3230.  'NOTE: common DLL MUST be listed FIRST in the INI file
  3231.  '------------------------------
  3232.     cuidll$ = GetSymbolValue(SYM_CUIDLL$)
  3233.  
  3234.    'UIStartDlg(cuidll$, Dlg&, "FNameOrgDlgProc", APPHELP, "FHelpDlgProc")
  3235.    notused$ = UIStartDlg(cuidll$, Dlg%, FNAMEORGDLGPROC$, 0, "")
  3236.  
  3237.    ''Make sure the dialog gets fully painted
  3238.    szWnd$ = GetSymbolValue(SYM_WNDHANDLE$)
  3239.    notused1% = SendMessage(VAL(szWnd$),UM_PAINTMODELESS,0,0)
  3240. END FUNCTION
  3241.  
  3242. PUBLIC FUNCTION PopupWithFunction (Dlg%, HelpID&, Func$) AS STRING
  3243. '** Purpose:   Surface modal dialog box
  3244. '** Author:
  3245. '** Arguments:  Dlg%      ID of dialog template
  3246. '**             HelpID&   ID of help topic
  3247. '**             Func$     Dialog procedure name
  3248. '** Returns:     Exit string
  3249. '*************************************************************************
  3250.     DIM cuidll$, sz$, cdir$, notused%
  3251.  
  3252.  ' JMD
  3253.  ' SYM_CUIDLL is now a list of DLLs
  3254.  ' First one contains code (dialog procs) and common resources
  3255.  ' Others contain product specific resources
  3256.  'NOTE: common DLL MUST be listed FIRST in the INI file
  3257.  '------------------------------
  3258.  
  3259.     If GetSymbolValue(SYM_AUTOMATIONINST$) = gTRUE$ Then EXIT FUNCTION
  3260.     
  3261.     cuidll$ = GetSymbolValue(SYM_CUIDLL$)
  3262.     DO
  3263.         sz$ = UIStartDlg(cuidll$, Dlg%, Func$, 0, "")
  3264.  
  3265.         SELECT CASE sz$
  3266.         case "IDC_EXIT"
  3267.             notused% = FRemoveSymbol("IDC_TEXT")
  3268.             QUIT
  3269.             SetListItem "__DLG_ID", 1, STR(Dlg%)
  3270.         case "IDC_CANCEL" 
  3271.             EXIT DO
  3272.         case "IDC_CONTINUE" 
  3273.             EXIT DO
  3274.         case "IDC_OK" 
  3275.             EXIT DO
  3276.         case "IDC_MENU"
  3277.             EXIT DO
  3278.         case "IDC_BACK"
  3279.             EXIT DO
  3280.         case "IDC_CITHELP"
  3281.             cdir$ = GetSymbolValue(SYM_STF_CWDDIR$) + gINSTALLHLP$
  3282.             notused% = WinHelp(HwndFrame(), cdir$+">Install", HELP_CONTEXT, HelpID&)
  3283.             SetListItem "RETFROMHELP", 1, "T"
  3284.         case "HELPKEY" 
  3285.             cdir$ = GetSymbolValue(SYM_STF_CWDDIR$) + gINSTALLHLP$
  3286.             notused% = WinHelp(HwndFrame(), cdir$+">Install", HELP_CONTEXT, HelpID&)
  3287.             SetListItem "RETFROMHELP", 1, "T"
  3288.         END SELECT
  3289.     LOOP
  3290.     PopupWithFunction = MID$(sz$,5,LEN(sz$)-4)
  3291.     UIPop 1
  3292.     notused% = WinHelp(HwndFrame(), cdir$+">Install", HELP_QUIT, HelpID&)
  3293. END FUNCTION
  3294.  
  3295. PUBLIC FUNCTION PopupModalDlg (Dlg%, HelpID&) AS STRING
  3296. '** Purpose:
  3297. '** Author:
  3298. '** Arguments:
  3299. '** Returns:
  3300. '*************************************************************************
  3301.     PopupModalDlg=PopupWithFunction(Dlg%, HelpID&, FNAMEORGDLGPROC$)
  3302. END FUNCTION
  3303.  
  3304. PUBLIC FUNCTION RegisterCallback (ModName$, FuncName$) AS INTEGER
  3305. '** Purpose:
  3306. '** Author:
  3307. '** Arguments:
  3308. '** Returns:
  3309. '*************************************************************************
  3310.   DIM rc%, automation$
  3311.  
  3312.   automation$ = GetSymbolValue(SYM_AUTOMATIONINST$)
  3313.   If  automation$ <> gTRUE$ Then
  3314.     RemoveSymbol(SYM_CALLBACK$)
  3315.     AddListItem SYM_CALLBACK$, FuncName$
  3316.     rc% = RegisterFunction(LSI_INFO(4),ModName$,FuncName$)
  3317.     If rc% = -4 Then
  3318.       ErrorMsg 0, "Maximum Number of Callbacks exceeded"
  3319.     End If
  3320.   End If
  3321. END FUNCTION
  3322.  
  3323. '*************************************************************************
  3324. '** FUNCTION SelectDriveCombo (ComboID$, path$)
  3325. '** Purpose:    Sets the ComboID dropdown to drive$
  3326. '**
  3327. '** IN SYMBOLS   Expects SYM_UPDATELIST$ to have an "ALL" entry
  3328. '**                 otherwise dropdown combo code asserts
  3329. '** OUT SYMBOLS  Adds 2 entries to the UPDATELIST 
  3330. '**     
  3331. '** Author:  Marcel Meth
  3332. '** Arguments:    ComboId$ - Id of the combo being set e.g. "IDC_COMBO1"
  3333. '**               path$ - Path that includes a drive letter or UNC vol.
  3334. '**     
  3335. '** If drive is not in combo box it will be added 
  3336. '**
  3337. '** Returns:  Index of the drive letter in the combo
  3338. '**     
  3339. '*************************************************************************
  3340. PUBLIC FUNCTION SelectDriveCombo (ComboID$, path$) AS INTEGER
  3341.    DIM n%, i%, drv$, dirpath$, position&, addRet&
  3342.    DIM FirstDriveLetter$
  3343.  
  3344.    n% = GetListLength(ComboID$)
  3345.    SelectDriveCombo = 1
  3346.    drv$ = Lot_ExtractDriveLetter(path$)
  3347. '** 
  3348. '** UNC path
  3349. '** 
  3350.    IF drv$ = "\" THEN
  3351.      Lot_SplitUNCPath path$, drv$, dirpath$
  3352.      IF Lot_IsvalidUNCPath(drv$) = FALSE THEN
  3353.        SelectDriveCombo = FALSE
  3354.        Exit FUNCTION
  3355.      END IF
  3356.      For i% = 1 to n%
  3357.        position& = InStr(LCASE$(GetListItem(ComboID$, i%)), LCASE$(drv$)) 
  3358.        If 0 < position Then
  3359.      AddListItem SYM_UPDATELIST$, ComboID$ 
  3360.      AddListItem SYM_UPDATELIST$, ComboID$ & "," & i%
  3361.      SelectDriveCombo = i%
  3362.      EXIT FUNCTION
  3363.        End If
  3364.      NEXT
  3365.      addRet& = Lot_AddToDriveFreeSpaceList(ComboID$, drv$)
  3366.      IF addRet&  = TRUE THEN
  3367.        i% = GetListLength(ComboID$)
  3368.        AddListItem SYM_UPDATELIST$, ComboID$ 
  3369.        AddListItem SYM_UPDATELIST$, ComboID$ & "," & i%
  3370.        SelectDriveCombo = i%
  3371.      ELSE 
  3372.        SelectDriveCombo = FALSE
  3373.      END IF
  3374. '** 
  3375. '** Drive letter given
  3376. '** 
  3377.    ELSE
  3378.      For i% = 1 to n%
  3379.        If drv$ = LCASE$(MID(GetListItem(ComboID$, i%), 1, 1)) Then
  3380.      AddListItem SYM_UPDATELIST$, ComboID$ 
  3381.      AddListItem SYM_UPDATELIST$, ComboID$ & "," & i%
  3382.      SelectDriveCombo = i% 
  3383.      EXIT FUNCTION
  3384.        End If
  3385.      Next
  3386. '** 
  3387. '** Drive not found in list
  3388. '** 
  3389.      IF Lot_AddToDriveFreeSpaceList(ComboID$, drv$)  = FALSE THEN
  3390.        SelectDriveCombo = FALSE
  3391.      ELSE
  3392.        i% = GetListLength(ComboID$)
  3393.        AddListItem SYM_UPDATELIST$, ComboID$ 
  3394.        AddListItem SYM_UPDATELIST$, ComboID$ & "," & i%
  3395.        SelectDriveCombo = i%
  3396.      END IF
  3397.    END IF
  3398.  
  3399. END FUNCTION
  3400.  
  3401. PUBLIC FUNCTION CheckForSpace(DlgId%) AS INTEGER
  3402. '** Purpose: Checks to see if there is enough space on dest directories
  3403. '**          First does a cheap check, followed, if need be by a high
  3404. '**          granularity check.
  3405. '** Author: Marcel Meth
  3406. '** Arguments:
  3407. '**     
  3408. '**     
  3409. '** Returns: SUCCESS/FAILURE
  3410. '**     
  3411. '*************************************************************************
  3412.     DIM lTicks&, lcb&, lNew&, i%, j%, lcbNeed&, dr$, s$, helpId&, rc$
  3413.     DIM notused1$, curcursor&, UNCSym$
  3414.  
  3415.    '** Try a quick check
  3416.    CheckForSpace = SUCCESS
  3417.    lTicks&       = GetTickCount()
  3418.    lcb&          = LcbGetChapterCost("", "", SYM_COST$, SYM_NEEDED$)
  3419.    IF lcb& = CLNG(0) THEN
  3420.       DO '** Keep the modeless up at least 2 seconds
  3421.      lNew& = GetTickCount()
  3422.       LOOP UNTIL (lNew& - lTicks&) > 2000
  3423.       DisplayWhenSpaceIsTight SYM_COST$, SYM_NEEDED$
  3424.       GOTO ENDCHECK
  3425.    END IF
  3426.    '** Try A High Granularity Check
  3427.    curcursor& = ShowWaitCursor()
  3428.    SetListItem "IDC_BMP", 1, STR$(IDD_MAXSCAN_BMP) '** put up the bitmap
  3429.    notused1$ = PopupModelessDlg(DB_CHECKSPACE, DB_CHECKSPACE)
  3430.    lcb& = GetCopyListCost (gEXTRA, SYM_COST$, SYM_NEEDED$)
  3431.    UIPOP 1     '** Bring down DB_CHECKSPACE
  3432.    RestoreCursor curcursor&
  3433.    IF lcb& = CLNG(0) THEN
  3434.       DisplayWhenSpaceIsTight SYM_COST$, SYM_NEEDED$
  3435.       GOTO ENDCHECK
  3436.    END IF
  3437.  
  3438.    '** If you get here then there was not enough space (Tab is CHR$(9))
  3439.    CheckForSpace = FAILURE
  3440.    RemoveSymbol "IDC_LIST1"
  3441.    FOR i% = 1 TO 26
  3442.       lcbNeed& = CLNG(GetListItem(SYM_NEEDED$, i%))
  3443.       IF  lcbNeed& > 0 THEN
  3444.      dr$ = CHR$(ASC("A")+i%-1) + ":" + CHR$(9)
  3445.      s$  = dr$ & (lcbNeed& + 4)
  3446.      AddlistItem "IDC_LIST1", s$ + gStrK$
  3447.       END IF
  3448.    NEXT
  3449.    j%=GetListLength("UNCVOLLIST")
  3450.    FOR i% = 1 to j%
  3451.       UNCSym$ = GetListItem("UNCVOLLIST",i%)
  3452.       lcbNeed& = CLNG(GetListItem(UNCSym$, 3))
  3453.       IF lcbNeed&  > 0 THEN
  3454.          IF IsDBCSFirstAtOffset(UNCSym$, 18) = 0 THEN
  3455.             s$ = Leftbp(UNCSym$, 18)
  3456.          ELSE
  3457.             s$ = Leftbp(UNCSym$, 17)
  3458.          END IF
  3459.          s$ = s$ & CHR$(9) & (lcbNeed& + 4)
  3460.      AddlistItem "IDC_LIST1", s$ + gStrK$
  3461.       END IF
  3462.    NEXT
  3463.  
  3464.  
  3465.    SetListItem "SETTABS1",1,"50"
  3466.    SetListItem "NORMALFONT", 1, STR$(IDC_TEXT1)
  3467.    SetListItem "NORMALFONT", 2, STR$(IDC_TEXT2)
  3468.    SetListItem "NORMALFONT", 3, STR$(IDC_TEXT3)
  3469.  
  3470.    helpId& = DlgId%
  3471.    rc$ = PopupModalDlg (DlgId%, helpId&)
  3472.  
  3473. ENDCHECK:
  3474.    RemoveSymbol(SYM_COST$)
  3475.    RemoveSymbol(SYM_NEEDED$)
  3476.  
  3477. END FUNCTION
  3478.  
  3479. '*************************************************************************
  3480. '** SUB DisplayWhenSpaceIsTight(szCost$,szNeed$)
  3481. '**
  3482. '** Purpose:    Display a warning message when disk space is tight
  3483. '**             You should only call this sub if you think there is
  3484. '**             enough disk space. This means that we will assume that
  3485. '**             szNeed$ contains only negative numbers.
  3486. '**
  3487. '**             The message will be displayed if 110% of cost will not
  3488. '**             fit on any one disk.
  3489. '**
  3490. '** Arguments:  szCost$ and szNeed$ - Symbols for cost and need
  3491. '**             Both symbol lists are expected to contain 26 numbers
  3492. '**     
  3493. '** Author:     DND
  3494. '**     
  3495. '*************************************************************************
  3496.  
  3497. PUBLIC SUB DisplayWhenSpaceIsTight(szCost$,szNeed$)
  3498.    DIM i%, lcbCost&, lcbNeed&, sz$, retcode%
  3499.    FOR i% = 1 TO 26
  3500.       lcbCost& =  (CLNG(GetListItem(szCost$, i%)) \ 1024) \ 10
  3501.       lcbNeed& = -CLNG(GetListItem(szNeed$, i%))
  3502.       IF lcbCost& > lcbNeed& THEN
  3503.      sz$ = LdString(SID_WARN_DISKSPACE1) + _
  3504.            LdString(SID_WARN_DISKSPACE2) + _
  3505.            LdString(SID_WARN_DISKSPACE3)
  3506.      'MessageBox sz$, MB_OK+MB_ICONINFORMATION, LdString(SID_TKT_STD_TITLE)
  3507.      retcode% = DoMsgBox(sz$,LdString(SID_TKT_STD_TITLE),MB_OKCANCEL _
  3508.                    +MB_ICONINFORMATION)
  3509.             if retcode% = IDCANCEL then
  3510.                 QUIT
  3511.             end if
  3512.      EXIT FOR
  3513.       END IF
  3514.    NEXT
  3515.  
  3516. END SUB
  3517.  
  3518. '******** Microsoft Functions that Lotus re-wrote **************************
  3519.  
  3520.  
  3521.  
  3522. PUBLIC SUB ReadInfFile (szFile$) 
  3523. '** Purpose:
  3524. '** Author:
  3525. '** Arguments: szFile$
  3526. '*************************************************************************
  3527. %rem
  3528. '    if FValidFATPath(szFile$) = 0 then
  3529. '        BadArgErr 1, "ReadInfFile", szFile$
  3530. '    end if
  3531. '    IF FOpenInf(szFile$, 1, 1) = 0 THEN
  3532. '        StfApiErr saeFail, "ReadInfFile", szFile$
  3533. %endrem
  3534.     IF FOpenInf(szFile$, 1, 0) = 0 THEN
  3535.     ErrorMsg SID_ERR_READINFFILE, ""
  3536.     ERROR STFQUIT
  3537.     END IF
  3538. END SUB
  3539.  
  3540. PUBLIC SUB MakeListFromSectionKeys(szSymbol$, szSect$) 
  3541. '** Purpose:
  3542. '** Author:
  3543. '** Arguments: szSymbol$, szSect$
  3544. '*************************************************************************
  3545. %rem
  3546.     if szSymbol$ = "" then
  3547.     n% = 1
  3548.     elseif FValidInfSect(szSect$) = 0 then
  3549.     n% = 2
  3550.     else
  3551.     n% = 0
  3552.     end if
  3553.     if n% > 0 then
  3554.     BadArgErr n%, "MakeListFromSectionKeys", szSymbol$+", "+szSect$
  3555.     end if
  3556. %endrem ''DEBUG
  3557.  
  3558.     IF FSetSymbolToListOfInfKeys(szSymbol$, szSect$, 1) = 0 THEN
  3559.     ErrorMsg SID_ERR_MAKELISTFROMSECTIONKEYS, ""
  3560.     ERROR STFQUIT
  3561.     END IF
  3562. END SUB
  3563.  
  3564. PUBLIC SUB MakeListFromSectionDate (szSym$, szSect$) 
  3565. '** Purpose:
  3566. '** Author:
  3567. '** Arguments: szSym$, szSect$
  3568. '** Returns:
  3569. '**     
  3570. '*************************************************************************
  3571. %rem
  3572.     if szSym$ = "" then
  3573.     n% = 1
  3574.     elseif FValidInfSect(szSect$) = 0 then
  3575.     n% = 2
  3576.     else
  3577.     n% = 0
  3578.     end if
  3579.     if n% > 0 then
  3580.     BadArgErr n%, "MakeListFromSectionDate", szSym$+", "+szSect$
  3581.     end if
  3582. %endrem ''DEBUG
  3583.  
  3584.     IF FMakeListInfSectionField(szSym$, szSect$, 5) = 0 THEN
  3585.     ErrorMsg SID_ERR_MAKELISTFROMSECTIONDATE, ""
  3586.     ERROR STFQUIT
  3587.     END IF
  3588. END SUB
  3589.  
  3590. PUBLIC SUB MakeListFromSectionFilename (szSym$, szSect$) 
  3591. '** Purpose:
  3592. '** Author:
  3593. '** Arguments: szSym$, szSect$
  3594. '** Returns:
  3595. '**     
  3596. '*************************************************************************
  3597. %rem
  3598.     if szSym$ = "" then
  3599.     n% = 1
  3600.     elseif FValidInfSect(szSect$) = 0 then
  3601.     n% = 2
  3602.     else
  3603.     n% = 0
  3604.     end if
  3605.     if n% > 0 then
  3606.     BadArgErr n%, "MakeListFromSectionFilename", szSym$+", "+szSect$
  3607.     end if
  3608. %endrem ''DEBUG
  3609.  
  3610.     IF FMakeListInfSectionField(szSym$, szSect$, 1) = 0 THEN
  3611.     ErrorMsg SID_ERR_MAKELISTFROMSECTIONFILENAME, ""
  3612.     ERROR STFQUIT
  3613.     END IF
  3614. END SUB
  3615.  
  3616. PUBLIC SUB MakeListFromSectionSize (szSym$, szSect$) 
  3617. '** Purpose:
  3618. '** Author:
  3619. '** Arguments: szSym$, szSect$
  3620. '** Returns:
  3621. '**     
  3622. '*************************************************************************
  3623. %rem
  3624.     if szSym$ = "" then
  3625.     n% = 1
  3626.     elseif FValidInfSect(szSect$) = 0 then
  3627.     n% = 2
  3628.     else
  3629.     n% = 0
  3630.     end if
  3631.     if n% > 0 then
  3632.     BadArgErr n%, "MakeListFromSectionSize", szSym$+", "+szSect$
  3633.     end if
  3634. %endrem ''DEBUG
  3635.  
  3636.     IF FMakeListInfSectionField(szSym$, szSect$, 15) = 0 THEN
  3637.     ErrorMsg SID_ERR_MAKELISTFROMSECTIONSIZE, ""
  3638.     ERROR STFQUIT
  3639.     END IF
  3640. END SUB
  3641.  
  3642. PUBLIC SUB MakeListFromSectionVersion (szSym$, szSect$) 
  3643. '** Purpose:
  3644. '** Author:
  3645. '** Arguments: szSym$, szSect$
  3646. '** Returns:
  3647. '**     
  3648. '*************************************************************************
  3649. %rem
  3650.     if szSym$ = "" then
  3651.     n% = 1
  3652.     elseif FValidInfSect(szSect$) = 0 then
  3653.     n% = 2
  3654.     else
  3655.     n% = 0
  3656.     end if
  3657.     if n% > 0 then
  3658.     BadArgErr n%, "MakeListFromSectionVersion", szSym$+", "+szSect$
  3659.     end if
  3660. %endrem ''DEBUG
  3661.  
  3662.     IF FMakeListInfSectionField(szSym$, szSect$, 19) = 0 THEN
  3663.     ErrorMsg SID_ERR_MAKELISTFROMSECTIONVERSION, ""
  3664.     ERROR STFQUIT
  3665.     END IF
  3666. END SUB
  3667.  
  3668. PUBLIC FUNCTION SetSilentMode (mode%)  AS INTEGER
  3669. '** Purpose:
  3670. '** Author:
  3671. '** Arguments: mode%
  3672. '** Returns:
  3673. '**     
  3674. '*************************************************************************
  3675.     DIM temp&
  3676.  
  3677.     temp& = CLNG ( mode% )
  3678.     SetSilentMode = FSetSilent( temp& )
  3679. END FUNCTION
  3680.  
  3681. PUBLIC FUNCTION SetBeepingMode (mode%)  AS INTEGER
  3682. '** Purpose:
  3683. '** Author:
  3684. '** Arguments: mode%
  3685. '** Returns:
  3686. '**     
  3687. '*************************************************************************
  3688.     DIM temp&
  3689.  
  3690.     temp& = CLNG ( mode% )
  3691.  
  3692.     SetBeepingMode = FSetBeepingMode( temp& )
  3693. END FUNCTION
  3694.  
  3695. PUBLIC FUNCTION GetSectionKeyDate (szSect$, szKey$)  AS STRING
  3696. '** Purpose:
  3697. '** Author:
  3698. '** Arguments: szSect$, szKey$
  3699. '** Returns:
  3700. '**     
  3701. '*************************************************************************
  3702. %rem
  3703.     if FValidInfSect(szSect$) = 0 then
  3704.     n% = 1
  3705.     elseif szKey$ = "" then
  3706.     n% = 2
  3707.     else
  3708.     n% = 0
  3709.     end if
  3710.     if n% > 0 then
  3711.     BadArgErr n%, "GetSectionKeyDate", szSect$+", "+szKey$
  3712.     end if
  3713. %endrem ''DEBUG
  3714.     DIM szBuf$, Length&
  3715.  
  3716.     szBuf$ = string$(128, 32) 
  3717.     Length& = CbGetInfSectionKeyField(szSect$, szKey$, 5, szBuf$, 128)
  3718.     IF Length& >= 128 THEN
  3719.     ErrorMsg SID_ERR_GETSECTIONKEYDATE, ""
  3720.     ERROR STFQUIT
  3721.     END IF
  3722.  
  3723.     IF Length& = -1 THEN
  3724.     ErrorMsg SID_ERR_GETSECTIONKEYDATE2, ""
  3725.     ERROR STFQUIT
  3726.     END IF
  3727.  
  3728.     GetSectionKeyDate = LEFT$ (szBuf$, CInt(Length&))
  3729.     szBuf$ = ""
  3730. END FUNCTION
  3731.  
  3732. PUBLIC FUNCTION GetSectionKeyFilename (szSect$, szKey$)  AS STRING
  3733. '** Purpose:
  3734. '** Author:
  3735. '** Arguments: szSect$, szKey$
  3736. '** Returns:
  3737. '**     
  3738. '*************************************************************************
  3739. %rem
  3740.     if FValidInfSect(szSect$) = 0 then
  3741.     n% = 1
  3742.     elseif szKey$ = "" then
  3743.     n% = 2
  3744.     else
  3745.     n% = 0
  3746.     end if
  3747.     if n% > 0 then
  3748.     BadArgErr n%, "GetSectionKeyFilename", szSect$+", "+szKey$
  3749.     end if
  3750. %endrem ''DEBUG
  3751.     DIM szBuf$, Length&
  3752.  
  3753.     szBuf$ = string$(128, 32)
  3754.     Length& = CbGetInfSectionKeyField(szSect$, szKey$, 1, szBuf$, 128)
  3755.     IF Length& >= 128 THEN
  3756.     ErrorMsg SID_ERR_GETSECTIONKEYFILENAME, ""
  3757.     ERROR STFQUIT
  3758.     END IF
  3759.  
  3760.     IF Length& = -1 THEN
  3761.     ErrorMsg SID_ERR_GETSECTIONKEYFILENAME2, ""
  3762.     ERROR STFQUIT
  3763.     END IF
  3764.  
  3765.     GetSectionKeyFilename = LEFT$ (szBuf$, CInt(Length&) )
  3766.     szBuf$ = ""
  3767. END FUNCTION
  3768.  
  3769. PUBLIC FUNCTION GetSectionKeySize (szSect$, szKey$)  AS LONG
  3770. '** Purpose:
  3771. '** Author:
  3772. '** Arguments: szSect$, szKey$
  3773. '** Returns:
  3774. '**     
  3775. '*************************************************************************
  3776. %rem
  3777.     if FValidInfSect(szSect$) = 0 then
  3778.     n% = 1
  3779.     elseif szKey$ = "" then
  3780.     n% = 2
  3781.     else
  3782.     n% = 0
  3783.     end if
  3784.     if n% > 0 then
  3785.     BadArgErr n%, "GetSectionKeySize", szSect$+", "+szKey$
  3786.     end if
  3787. %endrem ''DEBUG
  3788.     DIM szBuf$, Length&
  3789.  
  3790.     szBuf$ = string$(128, 32)
  3791.     Length& = CbGetInfSectionKeyField(szSect$, szKey$, 15, szBuf$, 128)
  3792.     IF Length& >= 128 THEN
  3793.     ErrorMsg SID_ERR_GETSECTIONKEYSIZE, ""
  3794.     ERROR STFQUIT
  3795.     END IF
  3796.  
  3797.     IF Length& = -1 THEN
  3798.     ErrorMsg SID_ERR_GETSECTIONKEYSIZE2, ""
  3799.     ERROR STFQUIT
  3800.     END IF
  3801.     
  3802.     GetSectionKeySize = VAL (LEFT$ (szBuf$, CInt(Length&)) )
  3803.     szBuf$ = ""
  3804. END FUNCTION
  3805.  
  3806. PUBLIC FUNCTION GetSectionKeyVersion (szSect$, szKey$)  AS STRING
  3807. '** Purpose:
  3808. '** Author:
  3809. '** Arguments: szSect$, szKey$
  3810. '** Returns:
  3811. '**     
  3812. '*************************************************************************
  3813. %rem
  3814.     if FValidInfSect(szSect$) = 0 then
  3815.     n% = 1
  3816.     elseif szKey$ = "" then
  3817.     n% = 2
  3818.     else
  3819.     n% = 0
  3820.     end if
  3821.     if n% > 0 then
  3822.     BadArgErr n%, "GetSectionKeyVersion", szSect$+", "+szKey$
  3823.     end if
  3824. %endrem ''DEBUG
  3825.     DIM szBuf$, Length&
  3826.  
  3827.     szBuf$ = string$(128, 32) 
  3828.     Length& = CbGetInfSectionKeyField(szSect$, szKey$, 19, szBuf$, 128)
  3829.     IF Length& >= 128 THEN
  3830.     ErrorMsg SID_ERR_GETSECTIONKEYVERSION, ""
  3831.     ERROR STFQUIT
  3832.     END IF
  3833.  
  3834.     IF Length& = -1 THEN
  3835.     ErrorMsg SID_ERR_GETSECTIONKEYVERSION2, ""
  3836.     ERROR STFQUIT
  3837.     END IF
  3838.  
  3839.     GetSectionKeyVersion = LEFT$ (szBuf$, CInt(Length&))
  3840.     szBuf$ = ""
  3841. END FUNCTION
  3842.  
  3843. PUBLIC SUB RemoveDir (szDir$, cmo%) 
  3844. '** Purpose:
  3845. '** Author:
  3846. '** Arguments: szDir$, cmo%
  3847. '*************************************************************************
  3848. %rem
  3849.     if FValidFATDir(szDir$) = 0 then
  3850.     BadArgErr 1, "RemoveDir", szDir$+", "+STR$(cmo%)
  3851.     end if
  3852. %endrem ''DEBUG
  3853.     IF FRemoveDir(szDir$) = 0 THEN
  3854.     ErrorMsg SID_ERR_REMOVEDIR, ""
  3855.     ERROR STFERR
  3856.     END IF
  3857. END SUB
  3858.  
  3859. PUBLIC SUB DumpCopyList (szFile$) 
  3860. '** Purpose:
  3861. '** Author:
  3862. '** Arguments: szFile$
  3863. '*************************************************************************
  3864. %rem
  3865.     if szFile$ = "" then
  3866.     BadArgErr 1, "DumpCopyList", szFile$
  3867.     end if
  3868. %endrem ''DEBUG
  3869.     IF FDumpCopyListToFile (szFile$) = 0 THEN
  3870.     ErrorMsg SID_ERR_DUMPCOPYLIST, ""
  3871.     ERROR STFERR
  3872.     END IF
  3873. END SUB
  3874.  
  3875. PUBLIC SUB ClearCopyList 
  3876. '** Purpose:
  3877. '** Author:
  3878. '** Arguments: None
  3879. '*************************************************************************
  3880.     ResetCopyList
  3881. END SUB
  3882.  
  3883. PUBLIC FUNCTION GetCopyListCost (szExtraList$, szCostList$, szNeedList$)  AS LONG
  3884. '** Purpose:
  3885. '** Author:
  3886. '** Arguments: szExtraList$, szCostList$, szNeedList$
  3887. '** Returns:
  3888. '**     
  3889. '*************************************************************************
  3890.     DIM lNeed&
  3891.  
  3892.     lNeed& = LcbGetCopyListCost (szExtraList$, szCostList$, szNeedList$)
  3893.     IF lNeed& < 0 THEN
  3894.     ErrorMsg SID_ERR_GETCOPYLISTCOST, ""
  3895.     ERROR STFQUIT
  3896.     END IF
  3897.     GetCopyListCost = lNeed&
  3898. END FUNCTION
  3899.  
  3900. PUBLIC SUB CopyFilesInCopyList 
  3901. '** Purpose:
  3902. '** Author:
  3903. '** Arguments:
  3904. '** Returns:
  3905. '**     
  3906. '*************************************************************************
  3907.     DIM grc&, notused%
  3908.  
  3909.     notused% = RemovePriorVersion("begin","execution")
  3910.  
  3911.     grc& = GrcCopyFilesInCopyList (HinstFrame())
  3912.  
  3913.     IF grc& = grcUserQuit THEN
  3914.     ErrorMsg SID_ERR_NOT_COMPLETE, ""
  3915.     ERROR STFQUIT
  3916.     ELSEIF grc& > 0 THEN
  3917.     ErrorMsg SID_ERR_NOT_COMPLETE, ""
  3918.     ERROR STFQUIT
  3919.     END IF
  3920. END SUB
  3921.  
  3922. PUBLIC SUB AddSectionFilesToCopyList (szSect$, szSrc$, szDest$) 
  3923. '** Purpose:
  3924. '** Author:
  3925. '** Arguments:
  3926. '** Returns:
  3927. '**     
  3928. '*************************************************************************
  3929. %rem
  3930.     if FValidInfSect(szSect$) = 0 then
  3931.     n% = 1
  3932.     elseif FValidFATDir(szSrc$) = 0 then
  3933.     n% = 2
  3934.     elseif FValidFATDir(szDest$) = 0 then
  3935.     n% = 3
  3936.     else
  3937.     n% = 0
  3938.     end if
  3939.     if n% > 0 then
  3940.     BadArgErr n%, "AddSectionFilesToCopyList", szSect$+", "+szSrc$+", "+szDest$
  3941.     end if
  3942. %endrem ''DEBUG
  3943.  
  3944.     IF FAddSectionFilesToCopyList (szSect$, szSrc$, szDest$) = 0 THEN
  3945.  
  3946.     ErrorMsg SID_ERR_ADDSECTIONFILESTOCOPYLIST, ""
  3947.     ERROR STFQUIT
  3948.     END IF
  3949. END SUB
  3950. '*************************************************************************
  3951.  
  3952. PUBLIC SUB AddSectionKeyFileToCopyList (szSect$, szKey$, szSrc$, szDest$) 
  3953. '** Purpose:
  3954. '** Author:
  3955. '** Arguments:
  3956. '** Returns:
  3957. '**     
  3958. '*************************************************************************
  3959. %rem
  3960.     if FValidInfSect(szSect$) = 0 then
  3961.     n% = 1
  3962.     elseif szKey$ = "" then
  3963.     n% = 2
  3964.     elseif FValidFATDir(szSrc$) = 0 then
  3965.     n% = 3
  3966.     elseif FValidFATDir(szDest$) = 0 then
  3967.     n% = 4
  3968.     else
  3969.     n% = 0
  3970.     end if
  3971.     if n% > 0 then
  3972.     BadArgErr n%, "AddSectionKeyFileToCopyList", szSect$+", "+szKey$+", "+szSrc$+", "+szDest$
  3973.     end if
  3974. %endrem ''DEBUG
  3975.  
  3976.     IF FAddSectionKeyFileToCopyList (szSect$, szKey$, szSrc$, szDest$) = 0 THEN
  3977.     ErrorMsg SID_ERR_ADDSECTIONKEYFILETOCOPYLIST, ""
  3978.     ERROR STFQUIT
  3979.     END IF
  3980. END SUB
  3981.  
  3982. PUBLIC SUB AddToBillboardList (szDll$, idDlg&, szProc$, lTicks&) 
  3983. '** Purpose:
  3984. '** Author:
  3985. '** Arguments:
  3986. '** Returns:
  3987. '**     
  3988. '** NOTE: Argument szProc$ not used -- retained for backward compatibility
  3989. '*************************************************************************
  3990. DIM rc&,i%, Dll$
  3991. %rem
  3992.     if szDll$ = "" then
  3993.     n% = 1
  3994.     elseif idDlg& = 0 then
  3995.     n% = 2
  3996.     elseif szProc$ = "" then
  3997.     n% = 3
  3998.     elseif lTicks& <= 0 then
  3999.     n% = 4
  4000.     else
  4001.     n% = 0
  4002.     end if
  4003.     if n% > 0 then
  4004.     BadArgErr n%, "AddToBillboardList", szDll$+", "+STR$(idDlg&)+", "+szProc$+", "+STR$(lTicks&)
  4005.     end if
  4006. %endrem ''DEBUG
  4007.     Dll$ = FindResourceinDLL (idDlg&, RT_DIALOG)
  4008.     if Dll$ <> "" then
  4009.         IF FAddToBillboardList(Dll$, idDlg&, FNAMEORGDLGPROC$, lTicks&) <> 0 THEN
  4010.               Exit Sub
  4011.         END IF
  4012.     End if
  4013. label1:
  4014.    ErrorMsg SID_ERR_ADDTOBILLBOARDLIST, ""
  4015.    ERROR STFQUIT
  4016.  
  4017. END SUB
  4018.  
  4019. PUBLIC FUNCTION FindResourceinDLL (idDlg&, ResType%) AS STRING
  4020. '** Purpose: Traverses the list of DLLs in SYM_CUIDLL$ until it finds the
  4021. '**                             one that contains the resource
  4022. '** Author:     JMDonohue
  4023. '** Arguments:  id%     Resource id number
  4024. '** Returns:    String containing the DLL name or null string if not found
  4025. '*************************************************************************
  4026.     DIM rc&,i%, Dll$, szDlls$
  4027.     i% = 1
  4028.     szDlls$ = GetSymbolValue(SYM_CUIDLL$)
  4029.     WHILE (TRUE)
  4030.         Dll$ =  Lot_GetNthFieldFromIniString (szDlls$, i%, "") 
  4031.         if Dll$ <> "" then
  4032.            rc& = GetModuleHandle(Dll$) 
  4033.             If rc& <> 0 Then
  4034.                 rc& = FindResource(rc&, idDlg&, ResType%) 
  4035.             End If
  4036.             If rc& <> 0 Then
  4037.                 FindResourceinDLL = Dll$
  4038.                 Exit Function
  4039.             End If
  4040.         else
  4041.             FindResourceinDLL = ""
  4042.             Exit Function
  4043.         end if
  4044.         i% = i% + 1
  4045.    WEND
  4046. END FUNCTION
  4047.  
  4048. PUBLIC SUB AddBlankToBillboardList (lTicks&) 
  4049. '** Purpose:
  4050. '** Author:
  4051. '** Arguments:
  4052. '** Returns:
  4053. '**     
  4054. '*************************************************************************
  4055. %rem
  4056.     if lTicks& <= 0 then
  4057.     BadArgErr 1, "AddBlankToBillboardList", STR$(lTicks&)
  4058.     end if
  4059. %endrem ''DEBUG
  4060.     IF FAddToBillboardList("", 0, "", lTicks&) = 0 THEN
  4061.     'YYYYYYIF FAddToBillboardList(NULL, 0, NULL, lTicks&) = 0 THEN
  4062.     ErrorMsg SID_ERR_ADDBLANKTOBILLBOARDLIST, ""
  4063.     ERROR STFQUIT
  4064.     END IF
  4065. END SUB
  4066.  
  4067. PUBLIC SUB ClearBillboardList 
  4068. '** Purpose:
  4069. '** Author:
  4070. '** Arguments:
  4071. '** Returns:
  4072. '**     
  4073. '*************************************************************************
  4074.     IF FClearBillboardList() = 0 THEN
  4075.     ErrorMsg SID_ERR_CLEARBILLBOARDLIST, ""
  4076.     ERROR STFQUIT
  4077.     END IF
  4078. END SUB
  4079.  
  4080. PUBLIC SUB SetCopyGaugePosition (x%, y%) 
  4081. '** Purpose:
  4082. '** Author:
  4083. '** Arguments:
  4084. '** Returns:
  4085. '**     
  4086. '*************************************************************************
  4087.     DIM xt&, yt&
  4088.  
  4089.     xt& = CLNG ( x% )
  4090.     yt& = CLNG ( y% )
  4091.     ProSetPos xt&, yt&
  4092. END SUB
  4093.  
  4094. PUBLIC SUB QUIT
  4095. '** Purpose:
  4096. '** Author:
  4097. '** Arguments:
  4098. '*************************************************************************
  4099.    DIM sz$
  4100.  
  4101.    sz$ = PopupModalDlg (DB_EXITHISTORY, DB_EXITHISTORY)
  4102.    If sz$ = "OK" Then
  4103.       UIPopAll
  4104.         gEndStatementEncountered% = TRUE      
  4105.       END
  4106.    End If
  4107. END SUB
  4108.  
  4109.  
  4110. '*************************************************************************
  4111. '** FUNCTION Lot_WriteToRiFile(ripath$) AS INTEGER
  4112. '**            
  4113. '** Purpose:   Writes user, company and serial number in 123w.ri file. 
  4114. '** Author:    JYOTI KEDIA
  4115. '** Arguments: None
  4116. '** Returns:   SUCCESS or Failure
  4117. '*************************************************************************
  4118.  
  4119. PUBLIC FUNCTION Lot_WriteToRiFile (ripath$) AS INTEGER
  4120. DIM  uname$, cname$, snum$
  4121.  
  4122.    Lot_WriteToRiFile = TRUE
  4123.  
  4124. '** Removed all checks on length of names mmeth-8/7/95
  4125. '** C Code now truncates strings if they are too long
  4126.    uname$ = GetSymbolValue("NAME")
  4127. 'print uname$,"uname$"
  4128.    cname$ = GetSymbolValue(SYM_COMPANY$)
  4129. 'print cname$,"cname$"
  4130.    snum$  = GetSymbolValue(SYM_SERIALNUM$)
  4131.  
  4132.    IF WriteUserRegistration(ripath$,uname$,cname$,snum$) <> 0 Then
  4133.       Lot_WriteToRiFile = FALSE
  4134.    End If
  4135.  
  4136. END FUNCTION
  4137.  
  4138. '*************************************************************************
  4139. '** FUNCTION Lot_ReadDefaultsfromRi(default_ripath$) AS INTEGER
  4140. '**
  4141. '** Purpose: For standard,Server and node install reads the default user,
  4142. '**          company name and serial number from 123w.ri file. For
  4143. '**            
  4144. '** Author:    JYOTI KEDIA
  4145. '** Arguments: Sets: SYM_NAME$, SYM_COMPANY$, SYM_SERIALNUM$
  4146. '** Returns:   TURE (SUCCESS)  FALSE (FAILURE)
  4147. '*************************************************************************
  4148.  
  4149. PUBLIC FUNCTION Lot_ReadDefaultsfromRi (default_ripath$) AS INTEGER
  4150. DIM rc%, lrc&, n%
  4151.  
  4152.    DIM buf1 AS STRING : buf1 = CreateBuffer(82)   '* These strings can be upto  80
  4153.    DIM buf2 AS STRING : buf2 = CreateBuffer(82)   '* bytes not including terminator.
  4154.    DIM buf3 AS STRING : buf3 = CreateBuffer(18)   '* See lcomstf\userreg.cpp &
  4155.                           '* callback.lss:WELCOMECB
  4156.  
  4157.    Lot_ReadDefaultsfromRi = FALSE
  4158.  
  4159.    lrc& = DoesFileExist(default_ripath$,femExists)
  4160.    if lrc& = 0 goto rinotfound
  4161.  
  4162.  
  4163.    lrc& = ReadUserRegistration(default_ripath$,buf1,buf2,buf3)
  4164.    If lrc& <> 0 goto rinotfound
  4165.  
  4166.    n% = LEN(buf1)
  4167.    SetSymbolValue SYM_NAME$, LEFT$(buf1, n%)
  4168.    n% = LEN(buf2)
  4169.    SetSymbolValue SYM_COMPANY$, LEFT$(buf2, n%)
  4170.    n% = LEN(buf3)
  4171.    SetSymbolValue SYM_SERIALNUM$, LEFT$(buf3, n%)
  4172.  
  4173.    Lot_ReadDefaultsfromRi = TRUE
  4174.  
  4175.    EXIT FUNCTION
  4176.  
  4177. rinotfound: 
  4178.    
  4179. END FUNCTION
  4180.  
  4181.  
  4182. PUBLIC FUNCTION Lot_GetCurrentProduct() AS INTEGER
  4183. '** Purpose:    This function will return the current product number
  4184. '** Parameters: 
  4185. '** Return:     Product number
  4186. '*************************************************************************
  4187.    Lot_GetCurrentProduct = gCurrentProduct%
  4188. END FUNCTION
  4189.  
  4190. PUBLIC SUB Lot_SetCurrentProduct(ProdNo%) 
  4191. '** Purpose:    Set the current product number
  4192. '** Parameters: ProdNo%  the product number
  4193. '*************************************************************************
  4194.    IF ProdNo% > gMaxNumOfProds% THEN
  4195. '      ERROR STFSETERROR
  4196.       ERROR STFQUIT
  4197.    END IF
  4198.    gCurrentProduct% = ProdNo%
  4199. END SUB
  4200.  
  4201. PUBLIC FUNCTION Lot_GetInstallDir() AS STRING
  4202. '** Purpose:    Return the directory where Install will be installed.
  4203. '** Parameters: 
  4204. '** Return:     Install dir
  4205. '*************************************************************************
  4206.    DIM s$, network$
  4207.     STATIC iniDir$    
  4208.  
  4209.     'Save initial value since it may change over course of install
  4210.     IF iniDir$ = "" THEN
  4211.         s$ = GetSymbolValue(SYM_SINGLESMARTSUITE$)
  4212.         network$ = GetSymbolValue(SYM_NETWORK$)
  4213.         IF network$ <> gNODE THEN
  4214.             IF s$ = gSMARTSUITE$ THEN
  4215.                 iniDir$ = GetSymbolValue(SYM_BASEDIR$)
  4216.             ELSE
  4217.                 s$ = Reg_GetDirSymbolList(1)     '** First product dir list
  4218.                 s$ = GetListItem(s$,1)           '** First directory symbol
  4219.                 iniDir$ = GetSymbolValue(s$)
  4220.             END IF
  4221.         ELSE
  4222.             iniDir$ = GetSymbolValue(SYM_STF_SRCDIR$)
  4223.         END IF
  4224.     END IF
  4225.     Lot_GetInstallDir = iniDir$
  4226.  
  4227. END FUNCTION
  4228.  
  4229. '** FUNCTION Lot_GetTheRealProdDir(prodno%) AS STRING
  4230. '**            
  4231. '** Purpose:   Retrieve the read 123 directory
  4232. '** Author:    JYOTI KEDIA
  4233. '** Arguments: None
  4234. '** Returns:   The 123 directory (with trailing backslash)
  4235. '*************************************************************************
  4236.  
  4237. PUBLIC FUNCTION Lot_GetTheRealProdDir(prodno%) AS STRING
  4238.    DIM sym$, prodsym$, progdir$, basedir$, l%, m%, disks$, dlen%
  4239.    
  4240.    If GetSymbolValue(SYM_NETWORK$) <> gNODE$ Then
  4241.       sym$ = Reg_GetDirSymbolList(prodno%)
  4242.       prodsym$ = GetListItem(sym$, 1)
  4243.       progdir$ = GetListItem(prodsym$,1)
  4244.    Else
  4245.       If GetSymbolValue (SYM_SINGLESMARTSUITE) =  gSINGLE$ Then
  4246.     disks$ = GetSymbolValue(SYM_INSTALL_SOURCE$)
  4247.     dlen% = LEN(disks$)
  4248.     If dlen% <=0 Then
  4249.        disks$ = GetSymbolValue(SYM_STF_SRCDIR$)
  4250.        dlen% = LEN(disks$)
  4251.      End If
  4252.     If MID$(disks$,dlen%,1) <> "\" Then
  4253.        disks$ = disks$ + "\"
  4254.     End If
  4255.     progdir$ = disks$
  4256.       Else
  4257.     '** USE THE product dir symbol, to extrapolate what
  4258.     '** the directory is on the server.
  4259.  
  4260. ''**** MMETH ???  STILL NEEDS WORK!
  4261. ''**** MMETH ???  I don't think SYMBASEDIR is always correct!
  4262.  
  4263.     sym$ = Reg_GetDirSymbolList(prodno%)
  4264.     prodsym$ = GetListItem(sym$, 1)
  4265.     progdir$ = GetListItem(prodsym$,1)
  4266.     basedir$ = GetSymbolValue (SYM_BASEDIR$)
  4267.     l% = INSTR(progdir$, basedir$)
  4268.     
  4269.     l% = INSTR(l%, progdir$, "\")
  4270.     m% = INSTR(l%, progdir$, "\")
  4271.  
  4272.     progdir$ = GetSymbolValue (SYM_INSTALL_SOURCE) +_
  4273.            RIGHT$( LEFT$ (progdir$, m%), l%)
  4274.            
  4275.       End If
  4276.    End If
  4277.  
  4278.    Lot_GetTheRealProdDir = progdir$
  4279.  
  4280. END FUNCTION
  4281.  
  4282.  
  4283. '*************************************************************************
  4284. '** FUNCTION Lot_ReadSerialNumber () AS INTEGER
  4285. '**
  4286. '** Purpose:   Reads serial number from SN.DAT and sets the symbol SERIALNUM.
  4287. '** Author:    JYOTI KEDIA
  4288. '** Arguments: None
  4289. '** Returns:   SUCCESS or FAILURE
  4290. '*************************************************************************
  4291.  
  4292. PUBLIC FUNCTION Lot_ReadSerialNumber () AS INTEGER
  4293.  
  4294.    DIM buf1 AS STRING : buf1 = CreateBuffer(18)
  4295.    DIM snpath$, rc&
  4296.  
  4297.    snpath$ = GetSymbolValue(SYM_STF_CWDDIR$)
  4298.    rc& = ReadSerialNumber(snpath$,buf1$)
  4299.    If rc& = 0 Then
  4300.       SetSymbolValue SYM_SERIALNUM$, NullTrim(buf1$)
  4301.       Lot_ReadSerialNumber = SUCCESS
  4302.    Else
  4303.       ErrorMsg SID_ERR_READSERIAL, ""
  4304.       Lot_ReadSerialNumber = FAILURE
  4305.    end if 
  4306.  
  4307. END FUNCTION
  4308.  
  4309. PUBLIC FUNCTION Lot_AreShareToolsSupported () AS INTEGER
  4310. '** Purpose:    Finds if any of the registered products supports share
  4311. '** Author:     MZ
  4312. '** Arguments:  None
  4313. '** Returns:    1 if there is at least one product that supports share
  4314. '**             0 if none of the registered prods supports share or if 
  4315. '**             no products are registered
  4316. '*************************************************************************
  4317.    DIM NumberOfProducts%,count%,ShareSupport%
  4318.    DIM network$, prod$
  4319.  
  4320.    network$ = GetSymbolValue(SYM_NETWORK$)
  4321.    ShareSupport%=0
  4322.    ' Find how many products are registered
  4323.    NumberOfProducts%=Reg_GetNumberOfProducts()
  4324.    IF(NumberOfProducts%<>0) THEN
  4325.       ' Loop through the products
  4326.       FOR count%=1 TO NumberOfProducts%
  4327.      IF Reg_GetProdSupportForShare(count%)=1 THEN
  4328.                 prod$ = Reg_GetProductAcronym(count%)
  4329.             IF network$ = gNODE$  THEN
  4330.                 If  prod$ <> "SUIT" THEN
  4331.                     prod$ = prod$ + gTOP$
  4332.                     If Lot_IsTheFeatureInstalled (prod$) = 1 Then
  4333.                     ShareSupport%=1
  4334.                     EXIT FOR
  4335.                     End If
  4336.                 End If
  4337.             ELSE
  4338.             ShareSupport%=1
  4339.             EXIT FOR
  4340.             END IF    
  4341.      END IF
  4342.       NEXT
  4343.    END IF
  4344.    Lot_AreShareToolsSupported=ShareSupport%
  4345. END FUNCTION
  4346.  
  4347. PUBLIC FUNCTION Lot_AreShare32ToolsSupported () AS INTEGER
  4348. '** Purpose:    Finds if any of the registered products supports share32
  4349. '** Author:     MZ
  4350. '** Arguments:  None
  4351. '** Returns:    1 if there is at least one product that supports share32
  4352. '**             0 if none of the registered prods supports share32 or if 
  4353. '**             no products are registered
  4354. '*************************************************************************
  4355.    DIM NumberOfProducts%,count%,Share32Support%
  4356.  
  4357.    Share32Support%=0
  4358.    ' Find how many products are registered
  4359.    NumberOfProducts%=Reg_GetNumberOfProducts()
  4360.    IF(NumberOfProducts%<>0) THEN
  4361.       ' Loop through the products
  4362.       FOR count%=1 TO NumberOfProducts%
  4363.      IF Reg_GetProdSupportForShare32(count%)=1 THEN
  4364.         Share32Support%=1
  4365.         EXIT FOR
  4366.      END IF
  4367.       NEXT
  4368.    END IF
  4369.    Lot_AreShare32ToolsSupported=Share32Support%
  4370. END FUNCTION
  4371.  
  4372. PUBLIC Lot_CallShareExec_RC%
  4373. PUBLIC FUNCTION Lot_CallSharedTool (func$) AS INTEGER
  4374. '** Purpose:    Simply calls a shared function through EXECUTE
  4375. '**             if share is loaded.  Using EXECUTE allows us to
  4376. '**             not load SHARE.LSS
  4377. '** Author:     MMETH
  4378. '** Arguments:  func$ the function to call.
  4379. '** Returns:    Whatever the function returns.
  4380. '**             
  4381. '*************************************************************************
  4382. DIM notused%
  4383.    Lot_CallSharedTool = 0
  4384.    IF Lot_AreShareToolsSupported () = 1 OR _
  4385.       Lot_AreShare32ToolsSupported () = 1 THEN
  4386.       'notused% = DOEXEC (("SHARE"), (prodcall$))
  4387.       gEndStatementEncountered% = FALSE
  4388.       EXECUTE(|USE "SHARE": sub initialize: Lot_CallShareExec_RC% =| & func$ & |:end sub|)
  4389.       'EXECUTE(|USE "SHARE" : Lot_CallShareExec_RC% = | & func$)
  4390.  
  4391.       '  this gEndStatementEncountered flag is necessary because the Lotus
  4392.       '  END statement, which normally exists the entire program, only
  4393.       '  exits the top-level routine running in DOEXEC.  So,
  4394.       '  check this flag here, to see if we hit an END during DOEXEC.
  4395.  
  4396.       IF gEndStatementEncountered% = TRUE THEN
  4397.      END                       ' exit the program
  4398.       END IF
  4399.  
  4400.       Lot_CallSharedTool = Lot_CallShareExec_RC%
  4401.    END IF
  4402.  
  4403. END FUNCTION
  4404.  
  4405.  
  4406. PUBLIC SUB SetRestartDir (szDir$) 
  4407. '** Purpose:
  4408. '** Author:
  4409. '** Arguments:
  4410. '** Returns:
  4411. '**     
  4412. '*************************************************************************
  4413.     ' This part doesn't really work any way.
  4414.     IF FSetRestartDir(szDir$) = FALSE THEN
  4415.     ErrorMsg SID_ERR_SETRESTARTDIR, ""
  4416.     ERROR STFQUIT
  4417.     END IF
  4418.  
  4419. END SUB
  4420.  
  4421. PUBLIC FUNCTION RestartListEmpty  AS INTEGER
  4422. '** Purpose:
  4423. '** Author:
  4424. '** Arguments:
  4425. '** Returns:
  4426. '**     
  4427. '*************************************************************************
  4428.  
  4429.     IF CInt(FRestartListEmpty()) = FALSE THEN
  4430.     RestartListEmpty = FALSE
  4431.     ELSE
  4432.     RestartListEmpty = TRUE
  4433.     END IF
  4434.  
  4435. END FUNCTION
  4436.  
  4437. PUBLIC FUNCTION ExitExecRestart  AS INTEGER
  4438. '** Purpose:
  4439. '** Author:
  4440. '** Arguments:
  4441. '** Returns:
  4442. '**     
  4443. '*************************************************************************
  4444.  
  4445.     ExitExecRestart = CInt(FExitExecRestart())
  4446.  
  4447. END FUNCTION
  4448.  
  4449.  
  4450. '** FUNCTION Lot_WhereIsFeature(prodno%, featureId$, filetolookfor$) AS STRING
  4451. '**            
  4452. '** Purpose:   THis function will return the location of the destdir
  4453. '**            for the section, if the feature is installed.
  4454. '**            This function should **NOT** be used before PostCopyConfig.
  4455. '**            In a node situation it can be used during PreCopyConfig for
  4456. '**            shared components ** only! **
  4457. '**            This function can be used for standard, node, and server. Later
  4458. '**            will provide directory suuport on CDs also. Clients should use this function
  4459. '**            heavily! Make sure to check for empty string return "".
  4460. '**
  4461. '**            This function assumes: 
  4462. '**            1. The feature you are looking for exists in the INF file
  4463. '**                 if it doesn't, then we will always report back "" since
  4464. '**                 we depend upon the inf to find the destination directory
  4465. '**            2. The location of the feature relative to the top level
  4466. '**               product directory is identical for server and node!
  4467. '**            
  4468. '**            3. all files that can be found on the server using this
  4469. '**               functions must reside somewher under the main product directory
  4470. '**
  4471. '**            If clients use this function heavily, the transition to CD's
  4472. '**            and Toolkit supported node options will be smooth.
  4473. '**
  4474. '** Author:    MARCEL METH
  4475. '**
  4476. '** Arguments:    prodno%: The product that we are looking for.
  4477. '**            FeatureId$: which is the name of the keyword ID as it appears
  4478. '**                        in the INF FILE.
  4479. '**        filetolookfor$: a file in this section that we can use to
  4480. '**                        confirm that we found the feature.
  4481. '** Returns:   returns the directory where the feature can be found or ""
  4482. '**            If it can't be found.
  4483. '*************************************************************************
  4484. PUBLIC FUNCTION Lot_WhereIsFeature(prodno%, featureId$, filetolookfor$) AS STRING
  4485.    DIM network$, dirsym$, chpt$, destdir$,s$,subdir$,installIniFile$
  4486.    
  4487.    network$ = GetSymbolValue(SYM_NETWORK$)
  4488.    s$ = GetSymbolValue(SYM_SINGLESMARTSUITE$)
  4489.  
  4490.    '***Processing Suit
  4491.    '******************
  4492.    IF s$ = gSMARTSUITE$ THEN
  4493.  
  4494.       '***Processing Suit Standard
  4495.       IF network$ = gSTANDARD$ THEN
  4496.      IF Lot_IsTheFeatureInstalled(featureId$) = 0 GOTO MAYBESUITCD
  4497.      '***Get the chapter
  4498.      chpt$ = Lot_GetChapterFromKeyWord(featureId$)
  4499.      IF chpt$ = "" GOTO NOFEATURE
  4500.      '***Get if the feature was installed
  4501. ' We want to find it even if it's been previously copied (i.e., not now in copy
  4502. ' list
  4503. '     InorOut% = Lot_GetChapterValInt(chpt$, F_INOROUT)
  4504. '     IF InorOut%=0 GOTO MAYBESUITCD
  4505.      '***Get the destination symbol
  4506.      dirsym$ = Lot_GetChapterValStr(chpt$, F_DESTDIRSYM)
  4507.      IF dirsym$ = "" GOTO NOFEATURE
  4508.      '***Get the destination directory
  4509.      destdir$ = GetSymbolValue(dirsym$)
  4510.      IF destdir$ = "" GOTO NOFEATURE
  4511.      IF DoesFileExist(destdir$+filetolookfor$,femExists) = 0 GOTO MAYBESUITCD
  4512.      '***Get the destination of the feature
  4513.      Lot_WhereIsFeature = destdir$
  4514.      EXIT FUNCTION
  4515.  
  4516.  
  4517.       '***Processing Suit Node
  4518.       ELSEIF network$ = gNODE$ THEN
  4519.      IF Lot_IsTheFeatureInstalled(featureId$) = 0 GOTO MAYBESUITCD
  4520.      '***Get the chapter
  4521.      chpt$ = Lot_GetChapterFromKeyWord(featureId$)
  4522.      '***Look on the node
  4523.      IF chpt$ <> "" THEN
  4524.         '***Get if the feature was installed
  4525. ' We want to find it even if it's been previously copied (i.e., not now in copy
  4526. ' list
  4527. '        InorOut% = Lot_GetChapterValInt(chpt$, F_INOROUT)
  4528. '        IF InorOut%=0 GOTO LOOKONSUITSRV
  4529.         '***Get the destination directory
  4530.         dirsym$ = Lot_GetChapterValStr(chpt$, F_DESTDIRSYM)
  4531.         destdir$ = GetSymbolValue(dirsym$)
  4532.         IF DoesFileExist(destdir$+filetolookfor$,femExists) <> 0 THEN 
  4533.            '***Returns the destination of the feature
  4534.            Lot_WhereIsFeature = destdir$
  4535.            EXIT FUNCTION
  4536.         ELSE 
  4537.            GOTO LOOKONSUITSRV
  4538.         END IF
  4539.      ELSE 
  4540.         GOTO LOOKONSUITSRV
  4541.      END IF
  4542.  
  4543.  
  4544.       '***Processing Suit Server
  4545.       ELSEIF network$ = gSERVER$ THEN
  4546.      IF Lot_IsTheFeatureInstalled(featureId$) = 0 GOTO MAYBESUITCD
  4547.      '***Get the chapter
  4548.      chpt$ = Lot_GetChapterFromKeyWord(featureId$)
  4549.      IF chpt$ = "" GOTO MAYBESUITCD
  4550.      '***Get if the feature was installed
  4551. ' We want to find it even if it's been previously copied (i.e., not now in copy
  4552. ' list
  4553. '     InorOut% = Lot_GetChapterValInt(chpt$, F_INOROUT)
  4554. '     IF InorOut%=0 GOTO MAYBESUITCD
  4555.      '***Get the destination symbol
  4556.      dirsym$ = Lot_GetChapterValStr(chpt$, F_DESTDIRSYM)
  4557.      IF dirsym$ = "" GOTO MAYBESUITCD
  4558.      '***Get the destination directory
  4559.      destdir$ = GetSymbolValue(dirsym$)
  4560.      IF DoesFileExist(destdir$+filetolookfor$,femExists) = 0 GOTO MAYBESUITCD
  4561.      '***Get the destination of the feature
  4562.      Lot_WhereIsFeature = destdir$
  4563.      EXIT FUNCTION
  4564.  
  4565.  
  4566.       '***Processing Suit Distribution
  4567.       ELSE  
  4568.      GOTO NOFEATURE
  4569.       END IF
  4570.  
  4571.    '***Processing Single product
  4572.    '****************************
  4573.    ELSEIF s$ = gSINGLE$ THEN
  4574.  
  4575.       '***Processing Single Product Standard
  4576.       IF network$ = gSTANDARD$ THEN
  4577.      IF Lot_IsTheFeatureInstalled(featureId$) = 0 GOTO MAYBESINGLECD
  4578.      '***Get the chapter
  4579.      chpt$ = Lot_GetChapterFromKeyWord(featureId$)
  4580.      IF chpt$ = "" GOTO NOFEATURE
  4581.      '***Get if the feature was installed
  4582. ' We want to find it even if it's been previously copied (i.e., not now in copy
  4583. ' list
  4584. '     InorOut% = Lot_GetChapterValInt(chpt$, F_INOROUT)
  4585. '     IF InorOut%=0 GOTO MAYBESINGLECD
  4586.      '***Get the destination symbol
  4587.      dirsym$ = Lot_GetChapterValStr(chpt$, F_DESTDIRSYM)
  4588.      IF dirsym$ = "" GOTO NOFEATURE
  4589.      '***Get the destination directory
  4590.      destdir$ = GetSymbolValue(dirsym$)
  4591.      IF destdir$ = "" GOTO NOFEATURE
  4592.      IF DoesFileExist(destdir$+filetolookfor$,femExists) = 0 GOTO MAYBESINGLECD
  4593.      '***Get the destination of the feature
  4594.      Lot_WhereIsFeature = destdir$
  4595.      EXIT FUNCTION
  4596.  
  4597.       '***Processing Single Product Node
  4598.       ELSEIF network$ = gNODE$ THEN
  4599.      IF Lot_IsTheFeatureInstalled(featureId$) = 0 GOTO MAYBESINGLECD
  4600.      '***Get the chapter
  4601.      chpt$ = Lot_GetChapterFromKeyWord(featureId$)
  4602.      '***Look on the node
  4603.      IF chpt$ <> "" THEN
  4604.         '***Get if the feature was installed
  4605. ' We want to find it even if it's been previously copied (i.e., not now in copy
  4606. ' list
  4607. '        InorOut% = Lot_GetChapterValInt(chpt$, F_INOROUT)
  4608. '        IF InorOut%=0 GOTO LOOKONSINGLESRV
  4609.         '***Get the destination directory
  4610.         dirsym$ = Lot_GetChapterValStr(chpt$, F_DESTDIRSYM)
  4611.         destdir$ = GetSymbolValue(dirsym$)
  4612.         IF DoesFileExist(destdir$+filetolookfor$,femExists) <> 0 THEN 
  4613.            '***Returns the destination of the feature
  4614.            Lot_WhereIsFeature = destdir$
  4615.            EXIT FUNCTION
  4616.         ELSE 
  4617.            GOTO LOOKONSINGLESRV
  4618.         END IF
  4619.      ELSE 
  4620.         GOTO LOOKONSINGLESRV
  4621.      END IF
  4622.  
  4623.        '***Processing Single Product Server
  4624.       ELSEIF network$ = gSERVER$ THEN
  4625.      IF Lot_IsTheFeatureInstalled(featureId$) = 0 GOTO MAYBESINGLECD
  4626.      '***Get the chapter
  4627.      chpt$ = Lot_GetChapterFromKeyWord(featureId$)
  4628.      IF chpt$ = "" GOTO MAYBESINGLECD
  4629.      '***Get if the feature was installed
  4630. ' We want to find it even if it's been previously copied (i.e., not now in copy
  4631. ' list
  4632. '     InorOut% = Lot_GetChapterValInt(chpt$, F_INOROUT)
  4633. '     IF InorOut%=0 GOTO MAYBESINGLECD
  4634.      '***Get the destination symbol
  4635.      dirsym$ = Lot_GetChapterValStr(chpt$, F_DESTDIRSYM)
  4636.      IF dirsym$ = "" GOTO MAYBESINGLECD
  4637.      '***Get the destination directory
  4638.      destdir$ = GetSymbolValue(dirsym$)
  4639.      IF DoesFileExist(destdir$+filetolookfor$,femExists) = 0 GOTO MAYBESINGLECD
  4640.      '***Get the destination of the feature
  4641.      Lot_WhereIsFeature = destdir$
  4642.      EXIT FUNCTION
  4643.  
  4644.       '***Processing Single Product Distribution
  4645.       ELSE  
  4646.      GOTO NOFEATURE
  4647.       END IF
  4648.    END IF
  4649.  
  4650.  
  4651.    Exit Function
  4652.    LOOKONSINGLESRV:
  4653.       destdir$ = GetSymbolValue(SYM_INSTALL_SOURCE$)
  4654.       IF destdir$ = ""  THEN  destdir$ = GetSymbolValue(SYM_STF_SRCDIR$)
  4655.       IF DoesFileExist(destdir$+filetolookfor$,femExists) = 0 GOTO LOOKONNETCOMPONENT
  4656.       Lot_WhereIsFeature = destdir$
  4657.       EXIT FUNCTION
  4658.  
  4659.    LOOKONSUITSRV:
  4660.       destdir$ = GetSymbolValue(SYM_INSTALL_SOURCE$)
  4661.       IF destdir$ = ""  THEN  destdir$ = GetSymbolValue(SYM_STF_SRCDIR$)
  4662.       installIniFile$ = MakePath(destdir$,gINSTALLINI$)
  4663.       subdir$ = GetIniKeyString(installIniFile$,"Destination Directories", Reg_GetProductAcronym(prodno%))
  4664.       IF DoesFileExist(destdir$+subdir$+filetolookfor$,femExists) = 0 GOTO LOOKONNETCOMPONENT
  4665.       Lot_WhereIsFeature = destdir$+subdir$
  4666.       EXIT FUNCTION
  4667.  
  4668.    LOOKONNETCOMPONENT:
  4669.       destdir$ = GetSymbolValue(SYM_NETCOMPONENT$)
  4670.       IF DoesFileExist(destdir$+filetolookfor$,femExists) = 0 GOTO NOFEATURE
  4671.       Lot_WhereIsFeature = destdir$
  4672.       EXIT FUNCTION
  4673.  
  4674.    MAYBESINGLECD:
  4675.       ''** MMETH WORK TO DO FOR CD; have a CDROOT symbol
  4676.    MAYBESUITCD:
  4677.       ''** MMETH WORK TO DO FOR CD; have a CDROOT symbol
  4678.  
  4679.    NOFEATURE:        
  4680.       Lot_WhereIsFeature = ""
  4681.  
  4682. END FUNCTION
  4683.  
  4684.  
  4685. PUBLIC FUNCTION Lot_IsTheFeatureInstalled(FeatureToFind$) AS INTEGER
  4686. '** Purpose:   Reads the chapters installed by the network  administrator 
  4687. '**            during server install into install.ini in the section
  4688. '**            [Server Feature Installed] and if the feature 
  4689. '**            was installed  returns 1 if not returns 0
  4690. '** Author:    MZ
  4691. '** Arguments: featureToFind$
  4692. '** Returns:   1 YES
  4693. '**            0 NO
  4694. '*************************************************************************
  4695.    DIM NetworkIns$ 
  4696.  
  4697.    'Identify if I am in node or server install
  4698.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  4699.  
  4700.    PopulateCINSTALLLIST
  4701.  
  4702.    IF NetworkIns$ <> gDISTRIBUTION THEN
  4703.  
  4704.       If ISELEMENT(CINSTALL(FeatureToFind$)) <> FALSE Then
  4705.      Lot_IsTheFeatureInstalled = 1
  4706.       Else
  4707.      Lot_IsTheFeatureInstalled = 0
  4708.       End If
  4709.    Else
  4710.       Lot_IsTheFeatureInstalled = 0
  4711.    End If
  4712.  END FUNCTION
  4713.  
  4714. PUBLIC FUNCTION Lot_SaveFeaturesInstaledInInstallIni() AS INTEGER
  4715. '** Purpose:   Saves the Features installed by the network  administrator 
  4716. '**            during server install into install.ini in the section
  4717. '**            [Server Feature Installed];  This is needed at Node
  4718. '**            install time
  4719. '**            MMETH added: Also save during standard so that
  4720. '**                         we have a record for standard install
  4721. '**            MZ    Added: save [Destination Directories] needed by Node
  4722. '**                         suit install
  4723. '** Author:    MZ
  4724. '** Arguments: None
  4725. '** Returns:   SUCCESS
  4726. '*************************************************************************
  4727.    DIM NetworkIns$, prodDir$, gInstallIniFile$, CurrChpt$, FeatureName$
  4728.    DIM FeatureNum%,s$,AllProdNum%,prodNum%,ProdAcronym$,BaseDir$,symList$
  4729.    DIM prodsym$,progdir$
  4730.    DIM installkind$
  4731.  
  4732.    'Identify if I am in server or standard install
  4733.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  4734.    IF NetworkIns$=gSERVER$ OR NetworkIns$=gSTANDARD THEN
  4735.  
  4736.       'Built the path to install.ini
  4737.       prodDir$ = Lot_GetInstallDir()
  4738.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  4739.  
  4740.       PopulateCINSTALLLIST
  4741.  
  4742.       'Loop through the chapters and log the features
  4743.      CurrChpt$ = Lot_GetFirst("", F_INOROUT) 
  4744.      WHILE (CurrChpt$ <> "")
  4745.     'Log all installed chapters
  4746.     FeatureName$ = Lot_GetChapterValStr(CurrChpt$, F_KEYWORD)
  4747.     If ISELEMENT(CINSTALL(FeatureName$)) = FALSE Then
  4748.        FeatureNum% = gNCINSTALL%    'Lot_GetLastFeatureNumber()
  4749.        CreateIniKeyValue gInstallIniFile$, "Server Feature Installed", "Feature"+LTRIM$(STR$(FeatureNum%+1)),FeatureName$, cmoOverwrite
  4750.        CINSTALL (FeatureName$) = "1"
  4751.        gNCINSTALL% = gNCINSTALL%+1
  4752.     END IF
  4753.     CurrChpt$ = Lot_GetNext() 
  4754.      WEND       
  4755.  
  4756.    END IF
  4757.    s$ = GetSymbolValue(SYM_SINGLESMARTSUITE$)
  4758.  
  4759.    'Identify if I am in server and suit install
  4760.     IF NetworkIns$=gSERVER$ AND s$ = gSMARTSUITE$ THEN
  4761.       'Loop through the products and log the directories
  4762.         AllProdNum% = 0
  4763.         AllProdNum% = Reg_GetNumberOfProducts()
  4764.         IF AllProdNum% <> 0 THEN
  4765.             BaseDir$= GetSymbolValue(SYM_BASEDIR$)
  4766.             FOR prodNum%=1 TO AllProdNum%
  4767.                 ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  4768.                 'Get the directory symbol
  4769.                 symList$ = Reg_GetDirSymbolList(prodNum%)
  4770.                 prodsym$ = GetListItem(symList$, 1)
  4771.                 progdir$ = GetListItem(prodsym$,1)
  4772.                 IF LEN(BaseDir$) < LEN(progdir$) THEN
  4773.                     CreateIniKeyValue gInstallIniFile$, "Destination Directories", ProdAcronym$,MID(progdir$,LEN(BaseDir$)+1), cmoOverwrite
  4774.                 END IF
  4775.             NEXT
  4776.       END IF
  4777.  
  4778.    END IF
  4779.  
  4780.    installkind$ = GetSymbolValue(SYM_INSTALLKIND$)
  4781.     'If we're a server, always write directories
  4782.     'Otherwise, write only if NOT a language install so that uninstall can work
  4783.     'correctly on the primary language
  4784.     IF NetworkIns$ = gSERVER$ OR installkind$ <> gLANGUAGEINSTALL$ THEN
  4785.    'write all destination symbols and their values
  4786.    Lot_WriteDestinationSymAndVal gInstallIniFile$, "Destination Symbols And Values" 
  4787.    Lot_WriteCriticalDirectories gInstallIniFile$
  4788.    IF GetSymbolValue(SYM_BASEDIR$) <>"" THEN
  4789.       CreateIniKeyValue gInstallIniFile$, _
  4790.             "Destination Symbols And Values", _
  4791.             "ParentDir",GetSymbolValue(SYM_BASEDIR$),_
  4792.             cmoOverwrite
  4793.    ELSE
  4794.       CreateIniKeyValue gInstallIniFile$, _
  4795.             "Destination Symbols And Values", _
  4796.             "ParentDir","", cmoOverwrite
  4797.    END IF
  4798.    END IF
  4799.  
  4800.    Lot_SaveFeaturesInstaledInInstallIni = SUCCESS
  4801. END FUNCTION
  4802.  
  4803. '*************************************************************************
  4804.  
  4805. PUBLIC FUNCTION Lot_SaveFeaturesInstaledInInstNodeIni() AS INTEGER
  4806. '** Purpose:   Saves the Features installed by the network  administrator 
  4807. '**            during server install into install.ini in the section
  4808. '**            [Server Feature Installed];  This is needed at Node
  4809. '**            install time
  4810. '**            MMETH added: Also save during standard so that
  4811. '**                         we have a record for standard install
  4812. '**            MZ    Added: save [Destination Directories] needed by Node
  4813. '**                         suit install
  4814. '** Author:    TV
  4815. '** Arguments: None
  4816. '** Returns:   SUCCESS
  4817. '*************************************************************************
  4818.    DIM NetworkIns$, prodDir$, gInstNodeIniFile$, CurrChpt$, FeatureName$
  4819.    DIM FeatureNum%,s$,AllProdNum%,prodNum%,ProdAcronym$,BaseDir$,symList$
  4820.    DIM prodsym$,progdir$, dirSym$, inidir$
  4821.  
  4822.    'Identify if I am in server or standard install
  4823.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  4824.    IF NetworkIns$=gNODE THEN
  4825.       'Built the path to cinstnod.ini
  4826.     dirSym$ = Reg_GetDirSymbolList(1)       '** First product dir list
  4827.     IF GetListLength(dirSym$) >= 1 THEN
  4828.         dirSym$ = GetListItem(dirSym$, 1)    '** First directory symbol
  4829.         inidir$ = GetSymbolValue(dirSym$) 
  4830.               gInstNodeIniFile$ = MakePath(inidir$,"cinstnod.ini")
  4831.     END IF
  4832.  
  4833.  
  4834.       PopulateCINSTNODELIST
  4835.  
  4836.       'Loop through the chapters and log the features
  4837.      CurrChpt$ = Lot_GetFirst("", F_INOROUT) 
  4838.      WHILE (CurrChpt$ <> "")
  4839.     'Log all installed chapters
  4840.     FeatureName$ = Lot_GetChapterValStr(CurrChpt$, F_KEYWORD)
  4841.     If ISELEMENT(CINSTNODE(FeatureName$)) = FALSE Then
  4842.        FeatureNum% = gNCINSTNODE%    'Lot_GetLastFeatureNumber()
  4843.        CreateIniKeyValue gInstNodeIniFile$, "Server Feature Installed", "Feature"+LTRIM$(STR$(FeatureNum%+1)),FeatureName$, cmoOverwrite
  4844.        CINSTNODE (FeatureName$) = "1"
  4845.        gNCINSTNODE% = gNCINSTNODE%+1
  4846.     END IF
  4847.     CurrChpt$ = Lot_GetNext() 
  4848.      WEND       
  4849.  
  4850.    END IF
  4851.    's$ = GetSymbolValue(SYM_SINGLESMARTSUITE$)
  4852.  
  4853.  
  4854.    'write all destination symbols and their values
  4855.    Lot_WriteDestinationSymAndVal gInstNodeIniFile$, "Destination Symbols And Values" 
  4856.    Lot_WriteCriticalDirectories gInstNodeIniFile$
  4857.    IF GetSymbolValue(SYM_BASEDIR$) <>"" THEN
  4858.       CreateIniKeyValue gInstNodeIniFile$, _
  4859.             "Destination Symbols And Values", _
  4860.             "ParentDir",GetSymbolValue(SYM_BASEDIR$),_
  4861.             cmoOverwrite
  4862.    ELSE
  4863.       CreateIniKeyValue gInstNodeIniFile$, _
  4864.             "Destination Symbols And Values", _
  4865.             "ParentDir","", cmoOverwrite
  4866.    END IF
  4867.  
  4868.    Lot_SaveFeaturesInstaledInInstNodeIni = SUCCESS
  4869. END FUNCTION
  4870.  
  4871. '*************************************************************************
  4872.  
  4873. FUNCTION Lot_GetLastFeatureNumber() AS INTEGER
  4874. '** Purpose:   Reads the features installed by the network  administrator 
  4875. '**            so far in the section [Server Feature Installed] and returns 
  4876. '**            the last number
  4877. '** Author:    MZ
  4878. '** Returns:   last number
  4879. '*************************************************************************
  4880.    DIM NetworkIns$, prodDir$, gInstallIniFile$, FeaturePref$
  4881.    DIM FeatureTag$, FeatureID$, rc%, lrc&
  4882.    STATIC FeatureNumber%
  4883.  
  4884.    'Identify if I am in node or server install
  4885.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  4886.  
  4887.    IF NetworkIns$=gSERVER$ OR NetworkIns$=gSTANDARD$ THEN
  4888.  
  4889.       'Built the path to install.ini
  4890.       prodDir$ = Lot_GetInstallDir()
  4891.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  4892.  
  4893.       FeaturePref$ = "Feature"
  4894.       FeatureNumber%=1
  4895.       FeatureTag$=FeaturePref$+LTRIM$(STR$(FeatureNumber%))
  4896.       FeatureID$ = GetIniKeyString(gInstallIniFile$,"Server Feature Installed", FeatureTag$)
  4897. 'print gInstallIniFile$,"Server Feature Installed", FeatureTag$, FeatureID$, "XXX"
  4898.       lrc& = DoesFileExist(gInstallIniFile$,femExists)
  4899.       IF lrc& = 1 THEN
  4900.      IF FeatureID$ = "" THEN
  4901.         Lot_GetLastFeatureNumber = 0
  4902.         EXIT FUNCTION
  4903.      ELSE   
  4904.         WHILE (FeatureID$ <> "")
  4905.            FeatureNumber% = FeatureNumber% + 1
  4906.            FeatureTag$=FeaturePref$+LTRIM$(STR$(FeatureNumber%))
  4907.            FeatureID$ = GetIniKeyString(gInstallIniFile$,"Server Feature Installed", FeatureTag$)
  4908. 'print "in while","Server Feature Installed", FeatureTag$, FeatureID$, "XXX1"
  4909.         WEND
  4910.         Lot_GetLastFeatureNumber = FeatureNumber%-1
  4911. 'print"FeatureNum% in the loop for getLastFeatureNum",STR$(FeatureNumber%)
  4912.         EXIT FUNCTION
  4913.     END IF
  4914.      
  4915.      ELSE
  4916.     '** DND: Look into using ShowPathError here. We should tell the
  4917.     '**      user where we looked for install.ini
  4918.     FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  4919.     'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  4920.      END IF
  4921.    END IF
  4922.  END FUNCTION
  4923. '*************************************************************************
  4924.  
  4925. PUBLIC FUNCTION Lot_SaveTheNodeOptionsInInstallIni() AS INTEGER
  4926. '** Purpose:   Saves the node options installed by the network  administrator 
  4927. '**            during server install into install.ini in the section
  4928. '**            [<Product acronym> Node Options];  This is needed at Node
  4929. '**            install time
  4930. '** Author:    MZ
  4931. '** Arguments: None
  4932. '** Returns:   SUCCESS
  4933. '*************************************************************************
  4934.    DIM NetworkIns$, prodDir$, gInstallIniFile$, OptName$
  4935.    DIM OptCount%, prodNum%, AllProdNum%, ProdAcronym$, AllOptNum%, OptNum%
  4936.  
  4937.    'Identify if I am in server install
  4938.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  4939.    IF NetworkIns$=gSERVER$ THEN
  4940.  
  4941.       'Built the path to install.ini
  4942.       prodDir$ = Lot_GetInstallDir()
  4943.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  4944.  
  4945.       'Loop through the products and log the node options
  4946.       AllProdNum% = 0
  4947.       AllProdNum% = Reg_GetNumberOfProducts()
  4948.       IF AllProdNum% <> 0 THEN
  4949.      FOR prodNum%=1 TO AllProdNum%
  4950.         AllOptNum% = 0
  4951.         AllOptNum% = Reg_GetNumofNodeOptions(prodNum%)
  4952.         IF AllOptNum% <> 0 THEN
  4953.            ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  4954.            'Loop though options
  4955.            FOR OptNum%=1 TO AllOptNum% 
  4956.           IF Reg_IsNodeOptionSelected(prodNum%,OptNum%)=STR(1) THEN
  4957.              OptName$ = Reg_GetNodeOptionStr(prodNum%,OptNum%)
  4958.              IF OptName$ <> "" AND FIsKeywordinCopyList (OptName$) <> FALSE THEN
  4959.             OptCount% = Lot_GetLastNodeOptNumber(ProdAcronym$)
  4960.             CreateIniKeyValue gInstallIniFile$, ProdAcronym$+" Node Options", "Option"+LTRIM$(STR$(OptCount%+1)),OptName$, cmoOverwrite
  4961.              END IF
  4962.           END IF
  4963.            NEXT
  4964.         END IF
  4965.  
  4966.      NEXT
  4967.       END IF
  4968.    END IF
  4969.    Lot_SaveTheNodeOptionsInInstallIni = SUCCESS
  4970. END FUNCTION
  4971. '*************************************************************************
  4972.  
  4973. FUNCTION Lot_GetLastNodeOptNumber(ProdAcronym$) AS INTEGER
  4974. '** Purpose:   Reads the node options installed by the network  administrator 
  4975. '**            so far in the section [<ProdAcronym$>+" Node Options"] and returns 
  4976. '**            the last number
  4977. '** Author:    MZ
  4978. '** Returns:   last number
  4979. '*************************************************************************
  4980.    DIM NetworkIns$, prodDir$, gInstallIniFile$
  4981.    DIM OptTag$, OptID$, OptPref$, lrc&
  4982.    STATIC OptNumber%
  4983.  
  4984.    'Identify if I am in node or server install
  4985.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  4986.  
  4987.    IF NetworkIns$=gSERVER$ THEN
  4988.  
  4989.       'Built the path to install.ini
  4990.       prodDir$ = Lot_GetInstallDir()
  4991.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  4992.  
  4993.       OptPref$ = "Option"
  4994.       OptNumber%=1
  4995.       OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  4996.       OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" Node Options", OptTag$)
  4997.       lrc& = DoesFileExist(gInstallIniFile$,femExists)
  4998.       IF lrc& = 1 THEN
  4999.      IF OptID$ = "" THEN
  5000.         Lot_GetLastNodeOptNumber = 0
  5001.         EXIT FUNCTION
  5002.      ELSE   
  5003.         WHILE (OptID$ <> "")
  5004.            OptNumber% = OptNumber% + 1
  5005.            OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5006.            OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" Node Options", OptTag$)
  5007.         WEND
  5008.         Lot_GetLastNodeOptNumber = OptNumber%-1
  5009.         EXIT FUNCTION
  5010.     END IF
  5011.      
  5012.      ELSE
  5013.     '** DND: Look into using ShowPathError here. We should tell the
  5014.     '**      user where we looked for install.ini
  5015.     FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  5016.     'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  5017.      END IF
  5018.    END IF
  5019.  END FUNCTION
  5020. '*************************************************************************
  5021.  
  5022. PUBLIC FUNCTION Lot_IsTheNodeOptionsAvailToNode(prodNum%,OptName$) AS INTEGER
  5023. '** Purpose:   Checks if the node options is available to node users
  5024. '**            by reading into install.ini in the section
  5025. '**            [<Product acronym> Node Options]; 
  5026. '** Author:    MZ
  5027. '** Arguments: None
  5028. '** Returns:   1 or 0 if it is or not available
  5029. '*************************************************************************
  5030.    DIM NetworkIns$, prodDir$, gInstallIniFile$, ProdAcronym$
  5031.    DIM OptTag$, OptID$, OptPref$, OptNumber%, rc%, lrc&
  5032.  
  5033.    'Identify if I am in node install
  5034.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5035.    IF NetworkIns$=gNODE$ THEN
  5036.  
  5037.       'Built the path to install.ini
  5038.       prodDir$ = Lot_GetInstallDir()
  5039.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5040.       ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  5041.       Lot_IsTheNodeOptionsAvailToNode = 0
  5042.  
  5043.       OptPref$ = "Option"
  5044.       OptNumber%=1
  5045.       OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5046.       OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" Node Options", OptTag$)
  5047.       lrc& = DoesFileExist(gInstallIniFile$,femExists)
  5048.       IF lrc& = 1 THEN
  5049.      IF OptID$ = OptName$ THEN
  5050.         Lot_IsTheNodeOptionsAvailToNode = 1
  5051.         EXIT FUNCTION
  5052.      ELSE   
  5053.         WHILE (OptID$ <> "")
  5054.            IF OptID$ = OptName$ THEN
  5055.           Lot_IsTheNodeOptionsAvailToNode = 1
  5056.           EXIT FUNCTION
  5057.            END IF
  5058.            OptNumber% = OptNumber% + 1
  5059.            OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5060.            OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" Node Options", OptTag$)
  5061.         WEND
  5062.         Lot_IsTheNodeOptionsAvailToNode = 0
  5063.         EXIT FUNCTION
  5064.     END IF
  5065.      
  5066.      ELSE
  5067.     '** DND: Look into using ShowPathError here. We should tell the
  5068.     '**      user where we looked for install.ini
  5069.     FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  5070.     'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  5071.      END IF
  5072.    END IF
  5073.  END FUNCTION
  5074. '*************************************************************************
  5075.  
  5076. PUBLIC FUNCTION Lot_IsAnyNodeOptAvailToNode() AS INTEGER
  5077. '** Purpose:   Checks if any node options are available to node users
  5078. '**            by reading into install.ini in the section
  5079. '**            [<Product acronym> Node Options]; 
  5080. '** Author:    MZ
  5081. '** Arguments: None
  5082. '** Returns:   1 or 0 if it is or not available
  5083. '*************************************************************************
  5084.    DIM NetworkIns$, prodDir$, gInstallIniFile$, ProdAcronym$,NumOfProds%
  5085.    DIM OptTag$, OptID$, OptPref$, OptNumber%, rc%, lrc&, prodNum%
  5086.  
  5087.    'Identify if I am in node install
  5088.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5089.    IF NetworkIns$=gNODE$ THEN
  5090.  
  5091.       'Built the path to install.ini
  5092.       prodDir$ = Lot_GetInstallDir()
  5093.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5094.  
  5095.       'Get all the products registered
  5096.       NumOfProds% = Reg_GetNumberOfProducts()
  5097.       IF NumOfProds% = 0 THEN
  5098.      Lot_IsAnyNodeOptAvailToNode = 0
  5099.      EXIT FUNCTION
  5100.       END IF
  5101.  
  5102.       lrc& = DoesFileExist(gInstallIniFile$,femExists)
  5103.       IF lrc& = 1 THEN
  5104.      'Loop through the products
  5105.      FOR prodNum% = 1 TO NumOfProds%
  5106.         ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  5107.  
  5108.         OptPref$ = "Option"
  5109.         OptNumber%=1
  5110.         OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5111.         OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" Node Options", OptTag$)
  5112.         IF OptID$ <> "" THEN
  5113.            Lot_IsAnyNodeOptAvailToNode = 1
  5114.            EXIT FUNCTION
  5115.        END IF
  5116.      NEXT 
  5117.      
  5118.       ELSE
  5119.      '** DND: Look into using ShowPathError here. We should tell the
  5120.      '**      user where we looked for install.ini
  5121.      FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  5122.      'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  5123.       END IF
  5124.  
  5125.    END IF
  5126.  END FUNCTION
  5127. '*************************************************************************
  5128.  
  5129. PUBLIC FUNCTION Lot_AreNodeOptAvailToNodeForProd(prodNum%) AS INTEGER
  5130. '** Purpose:   Checks if any node options are available to node users
  5131. '**            for the prodNum%, by reading into install.ini in the section
  5132. '**            [<Product acronym> Node Options]; 
  5133. '** Author:    MZ
  5134. '** Arguments: None
  5135. '** Returns:   1 or 0 if it is or not available
  5136. '*************************************************************************
  5137.    DIM NetworkIns$, prodDir$, gInstallIniFile$, ProdAcronym$,NumOfProds%
  5138.    DIM OptTag$, OptID$, OptPref$, OptNumber%, rc%, lrc&
  5139.  
  5140.    'Identify if I am in node install
  5141.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5142.    IF NetworkIns$=gNODE$ THEN
  5143.  
  5144.       'Built the path to install.ini
  5145.       prodDir$ = Lot_GetInstallDir()
  5146.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5147.  
  5148.       lrc& = DoesFileExist(gInstallIniFile$,femExists)
  5149.       IF lrc& = 1 THEN
  5150.      ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  5151.      OptPref$ = "Option"
  5152.      OptNumber%=1
  5153.      OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5154.      OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" Node Options", OptTag$)
  5155.      IF OptID$ <> "" THEN
  5156.         Lot_AreNodeOptAvailToNodeForProd = 1
  5157.         EXIT FUNCTION
  5158.      ELSE
  5159.         Lot_AreNodeOptAvailToNodeForProd = 0
  5160.         EXIT FUNCTION
  5161.      END IF
  5162.     
  5163.       ELSE
  5164.      '** DND: Look into using ShowPathError here. We should tell the
  5165.      '**      user where we looked for install.ini
  5166.      FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  5167.      'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  5168.       END IF
  5169.  
  5170.    END IF
  5171.  END FUNCTION
  5172. '*************************************************************************
  5173.  
  5174. PUBLIC FUNCTION Lot_GetNumOfNodeOptAvailToNodeForProd(prodNum%) AS INTEGER
  5175. '** Purpose:   Counts the node options available to node users
  5176. '**            for the prodNum%, by reading into install.ini in the section
  5177. '**            [<Product acronym> Node Options]; 
  5178. '** Author:    MZ
  5179. '** Arguments: None
  5180. '** Returns:   0 or num of options
  5181. '*************************************************************************
  5182.    DIM NetworkIns$, prodDir$, gInstallIniFile$, ProdAcronym$,NumOfOptions%
  5183.    DIM OptTag$, OptID$, OptPref$, OptNumber%, rc%, lrc&
  5184.  
  5185.    'Identify if I am in node install
  5186.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5187.    IF NetworkIns$=gNODE$ THEN
  5188.  
  5189.       'Built the path to install.ini
  5190.       prodDir$ = Lot_GetInstallDir()
  5191.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5192.  
  5193.       lrc& = DoesFileExist(gInstallIniFile$,femExists)
  5194.       IF lrc& = 1 THEN
  5195.      ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  5196.      OptPref$ = "Option"
  5197.      OptNumber%=1
  5198.      OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5199.      OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" Node Options", OptTag$)
  5200.      IF OptID$ <> "" THEN
  5201.         WHILE (OptID$ <> "")
  5202.            NumOfOptions% = OptNumber%
  5203.            OptNumber% = OptNumber% + 1
  5204.            OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5205.            OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" Node Options", OptTag$)
  5206.         WEND
  5207.       ELSE
  5208.         Lot_GetNumOfNodeOptAvailToNodeForProd = 0
  5209.         EXIT FUNCTION
  5210.      END IF
  5211.      Lot_GetNumOfNodeOptAvailToNodeForProd = NumOfOptions
  5212.      EXIT FUNCTION
  5213.     
  5214.       ELSE
  5215.      '** DND: Look into using ShowPathError here. We should tell the
  5216.      '**      user where we looked for install.ini
  5217.      FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  5218.      'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  5219.       END IF
  5220.  
  5221.    END IF
  5222.  END FUNCTION
  5223. '*************************************************************************
  5224.  
  5225. PUBLIC FUNCTION Lot_AreAnyNodeOptAvailToSrv() AS INTEGER
  5226. '** Purpose:   Checks the registration database to find the registred 
  5227. '**            node options
  5228. '** Author:    MZ
  5229. '** Arguments: None
  5230. '** Returns:   1 if there is at least 1 option or 0 if there is none
  5231. '*************************************************************************
  5232.    DIM NetworkIns$, prodDir$, gInstallIniFile$, OptName$, j%, nodeopt_flag%
  5233.    DIM OptCount%, prodNum%, AllProdNum%, ProdAcronym$, AllOptNum%, OptNum%
  5234.    DIM OptKeyword$, chpt$
  5235.  
  5236.    'Identify if I am in server install
  5237.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5238.    IF NetworkIns$=gSERVER$ THEN
  5239.  
  5240.       'Built the path to install.ini
  5241.       prodDir$ = Lot_GetInstallDir()
  5242.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5243.  
  5244.       'Loop through the products and check for node options
  5245.       AllProdNum% = 0
  5246.       nodeopt_flag% = 0
  5247.       AllProdNum% = Reg_GetNumberOfProducts()
  5248.       IF AllProdNum% <> 0 THEN
  5249.      FOR prodNum%=1 TO AllProdNum%
  5250.         AllOptNum% = 0
  5251.         AllOptNum% = Reg_GetNumofNodeOptions(prodNum%)
  5252.  
  5253. '            Reg_ReSetAllNodeOptsSelToDefaults prodNum%
  5254.         OptNum%=Reg_GetNumofNodeOptions(prodNum%)
  5255.      IF OptNum% <> 0 THEN
  5256.         chpt$ = Lot_GetChapterFromKeyword(Reg_GetProductAcronym(prodNum%) + gTOP$)
  5257.        ' Loop through the options
  5258.         FOR j% = 1 TO OptNum%
  5259.         OptKeyWord$ = Reg_GetNodeOptionStr(prodNum%,j%)
  5260.         chpt$ = Lot_GetChapterFromKeyword(OptKeyWord$)
  5261.         IF INT(Lot_GetChapterValInt(chpt$,F_INOROUT)) = 1 THEN
  5262.          nodeopt_flag% = 1
  5263.         END IF
  5264.         NEXT
  5265.      END IF
  5266.      
  5267.      IF AllOptNum% <> 0 AND nodeopt_flag% <> 0 THEN
  5268.            Lot_AreAnyNodeOptAvailToSrv=1
  5269.            EXIT FUNCTION
  5270.         END IF
  5271.      NEXT
  5272.       ELSE
  5273.      Lot_AreAnyNodeOptAvailToSrv=0
  5274.      EXIT FUNCTION
  5275.       END IF
  5276.    ELSE
  5277.       Lot_AreAnyNodeOptAvailToSrv=0
  5278.       EXIT FUNCTION
  5279.    END IF
  5280.  
  5281.    Lot_AreAnyNodeOptAvailToSrv=0
  5282. END FUNCTION
  5283. '*************************************************************************
  5284.  
  5285.  
  5286.  
  5287. PUBLIC FUNCTION Lot_SaveTheCDOptionsInInstallIni() AS INTEGER
  5288. '** Purpose:   Saves the CD options installed by the network  administrator 
  5289. '**            during server install into install.ini in the section
  5290. '**            [<Product acronym> CD Options];  This is needed at CD
  5291. '**            install time
  5292. '** Author:    MZ
  5293. '** Arguments: None
  5294. '** Returns:   SUCCESS
  5295. '*************************************************************************
  5296.    DIM NetworkIns$, prodDir$, gInstallIniFile$, OptName$
  5297.    DIM OptCount%, prodNum%, AllProdNum%, ProdAcronym$, AllOptNum%, OptNum%
  5298.  
  5299.    'Identify if I am in server install
  5300.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5301.    IF NetworkIns$=gSERVER$ THEN
  5302.  
  5303.       'Built the path to install.ini
  5304.       prodDir$ = Lot_GetInstallDir()
  5305.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5306.  
  5307.       'Loop through the products and log the CD options
  5308.       AllProdNum% = 0
  5309.       AllProdNum% = Reg_GetNumberOfProducts()
  5310.       IF AllProdNum% <> 0 THEN
  5311.      FOR prodNum%=1 TO AllProdNum%
  5312.         AllOptNum% = 0
  5313.         AllOptNum% = Reg_GetNumofCDOptions(prodNum%)
  5314.         IF AllOptNum% <> 0 THEN
  5315.            ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  5316.            'Loop though options
  5317.            FOR OptNum%=1 TO AllOptNum% 
  5318.           IF Reg_IsCDOptionSelected(prodNum%,OptNum%)=STR(1) THEN
  5319.              OptName$ = Reg_GetCDOptionStr(prodNum%,OptNum%)
  5320.              IF OptName$ <> "" AND FIsKeywordinCopyList (OptName$) <> FALSE THEN
  5321.             OptCount% = Lot_GetLastCDOptNumber(ProdAcronym$)
  5322.             CreateIniKeyValue gInstallIniFile$, ProdAcronym$+" CD Options", "Option"+LTRIM$(STR$(OptCount%+1)),OptName$, cmoOverwrite
  5323.              END IF
  5324.           END IF
  5325.            NEXT
  5326.         END IF
  5327.  
  5328.      NEXT
  5329.       END IF
  5330.    END IF
  5331.    Lot_SaveTheCDOptionsInInstallIni = SUCCESS
  5332. END FUNCTION
  5333. '*************************************************************************
  5334.  
  5335. FUNCTION Lot_GetLastCDOptNumber(ProdAcronym$) AS INTEGER
  5336. '** Purpose:   Reads the CD options installed by the network  administrator 
  5337. '**            so far in the section [<ProdAcronym$>+" CD Options"] and returns 
  5338. '**            the last number
  5339. '** Author:    MZ
  5340. '** Returns:   last number
  5341. '*************************************************************************
  5342.    DIM NetworkIns$, prodDir$, gInstallIniFile$
  5343.    DIM OptTag$, OptID$, OptPref$, rc%
  5344.    STATIC OptNumber%
  5345.  
  5346.    'Identify if I am in CD or server install
  5347.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5348.  
  5349.    IF NetworkIns$=gSERVER$ THEN
  5350.  
  5351.       'Built the path to install.ini
  5352.       prodDir$ = Lot_GetInstallDir()
  5353.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5354.  
  5355.       OptPref$ = "Option"
  5356.       OptNumber%=1
  5357.       OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5358.       OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" CD Options", OptTag$)
  5359.       IF DoesFileExist(gInstallIniFile$,femExists) = 1 THEN
  5360.      IF OptID$ = "" THEN
  5361.         Lot_GetLastCDOptNumber = 0
  5362.         EXIT FUNCTION
  5363.      ELSE   
  5364.         WHILE (OptID$ <> "")
  5365.            OptNumber% = OptNumber% + 1
  5366.            OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5367.            OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" CD Options", OptTag$)
  5368.         WEND
  5369.         Lot_GetLastCDOptNumber = OptNumber%-1
  5370.         EXIT FUNCTION
  5371.     END IF
  5372.      
  5373.      ELSE
  5374.     '** DND: Look into using ShowPathError here. We should tell the
  5375.     '**      user where we looked for install.ini
  5376.     FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  5377.     'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  5378.      END IF
  5379.    END IF
  5380.  END FUNCTION
  5381. '*************************************************************************
  5382.  
  5383. PUBLIC FUNCTION Lot_IsTheCDOptionsAvailToNode(prodNum%,OptName$) AS INTEGER
  5384. '** Purpose:   Checks if the CD options is available to node users
  5385. '**            by reading into install.ini in the section
  5386. '**            [<Product acronym> CD Options]; 
  5387. '** Author:    MZ
  5388. '** Arguments: None
  5389. '** Returns:   1 or 0 if it is or not available
  5390. '*************************************************************************
  5391.    DIM NetworkIns$, prodDir$, gInstallIniFile$, ProdAcronym$
  5392.    DIM OptTag$, OptID$, OptPref$, OptNumber%, rc%
  5393.  
  5394.    'Identify if I am in node install
  5395.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5396.    IF NetworkIns$=gNODE$ THEN
  5397.  
  5398.       'Built the path to install.ini
  5399.       prodDir$ = Lot_GetInstallDir()
  5400.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5401.       ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  5402.       Lot_IsTheCDOptionsAvailToNode = 0
  5403.  
  5404.       OptPref$ = "Option"
  5405.       OptNumber%=1
  5406.       OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5407.       OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" CD Options", OptTag$)
  5408.       IF DoesFileExist(gInstallIniFile$,femExists) = 1 THEN
  5409.      IF OptID$ = OptName$ THEN
  5410.         Lot_IsTheCDOptionsAvailToNode = 1
  5411.         EXIT FUNCTION
  5412.      ELSE   
  5413.         WHILE (OptID$ <> "")
  5414.            IF OptID$ = OptName$ THEN
  5415.           Lot_IsTheCDOptionsAvailToNode = 1
  5416.           EXIT FUNCTION
  5417.            END IF
  5418.            OptNumber% = OptNumber% + 1
  5419.            OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5420.            OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" CD Options", OptTag$)
  5421.         WEND
  5422.         Lot_IsTheCDOptionsAvailToNode = 0
  5423.         EXIT FUNCTION
  5424.     END IF
  5425.      
  5426.      ELSE
  5427.     '** DND: Look into using ShowPathError here. We should tell the
  5428.     '**      user where we looked for install.ini
  5429.     FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  5430.     'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  5431.      END IF
  5432.    END IF
  5433.  END FUNCTION
  5434. '*************************************************************************
  5435.  
  5436. PUBLIC FUNCTION Lot_IsAnyCDOptAvailToNode() AS INTEGER
  5437. '** Purpose:   Checks if any CD options are available to node users
  5438. '**            by reading into install.ini in the section
  5439. '**            [<Product acronym> CD Options]; 
  5440. '** Author:    MZ
  5441. '** Arguments: None
  5442. '** Returns:   1 or 0 if it is or not available
  5443. '*************************************************************************
  5444.    DIM NetworkIns$, prodDir$, gInstallIniFile$, ProdAcronym$,NumOfProds%
  5445.    DIM OptTag$, OptID$, OptPref$, OptNumber%, rc%,prodNum%
  5446.  
  5447.    'Identify if I am in node install
  5448.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5449.    IF NetworkIns$=gNODE$ THEN
  5450.  
  5451.       'Built the path to install.ini
  5452.       prodDir$ = Lot_GetInstallDir()
  5453.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5454.  
  5455.       'Get all the products registered
  5456.       NumOfProds% = Reg_GetNumberOfProducts()
  5457.       IF NumOfProds% = 0 THEN
  5458.      Lot_IsAnyCDOptAvailToNode = 0
  5459.      EXIT FUNCTION
  5460.       END IF
  5461.  
  5462.       IF DoesFileExist(gInstallIniFile$,femExists) = 1 THEN
  5463.      'Loop through the products
  5464.      FOR prodNum% = 1 TO NumOfProds%
  5465.         ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  5466.  
  5467.         OptPref$ = "Option"
  5468.         OptNumber%=1
  5469.         OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5470.         OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" CD Options", OptTag$)
  5471.         IF OptID$ <> "" THEN
  5472.            Lot_IsAnyCDOptAvailToNode = 1
  5473.            EXIT FUNCTION
  5474.        END IF
  5475.      NEXT 
  5476.      
  5477.       ELSE
  5478.      '** DND: Look into using ShowPathError here. We should tell the
  5479.      '**      user where we looked for install.ini
  5480.      FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  5481.      'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  5482.       END IF
  5483.  
  5484.    END IF
  5485.  END FUNCTION
  5486. '*************************************************************************
  5487.  
  5488. PUBLIC FUNCTION Lot_AreCDOptAvailToNodeForProd(prodNum%) AS INTEGER
  5489. '** Purpose:   Checks if any CD options are available to node users
  5490. '**            for the prodNum%, by reading into install.ini in the section
  5491. '**            [<Product acronym> CD Options]; 
  5492. '** Author:    MZ
  5493. '** Arguments: None
  5494. '** Returns:   1 or 0 if it is or not available
  5495. '*************************************************************************
  5496.    DIM NetworkIns$, prodDir$, gInstallIniFile$, ProdAcronym$,NumOfProds%
  5497.    DIM OptTag$, OptID$, OptPref$, OptNumber%, rc%
  5498.  
  5499.    'Identify if I am in node install
  5500.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5501.    IF NetworkIns$=gNODE$ THEN
  5502.  
  5503.       'Built the path to install.ini
  5504.       prodDir$ = Lot_GetInstallDir()
  5505.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5506.  
  5507.       IF DoesFileExist(gInstallIniFile$,femExists) = 1 THEN
  5508.      ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  5509.      OptPref$ = "Option"
  5510.      OptNumber%=1
  5511.      OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5512.      OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" CD Options", OptTag$)
  5513.      IF OptID$ <> "" THEN
  5514.         Lot_AreCDOptAvailToNodeForProd = 1
  5515.         EXIT FUNCTION
  5516.      ELSE
  5517.         Lot_AreCDOptAvailToNodeForProd = 0
  5518.         EXIT FUNCTION
  5519.      END IF
  5520.     
  5521.       ELSE
  5522.      '** DND: Look into using ShowPathError here. We should tell the
  5523.      '**      user where we looked for install.ini
  5524.      FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  5525.      'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  5526.       END IF
  5527.  
  5528.    END IF
  5529.  END FUNCTION
  5530. '*************************************************************************
  5531.  
  5532. PUBLIC FUNCTION Lot_GetNumOfCDOptAvailToNodeForProd(prodNum%) AS INTEGER
  5533. '** Purpose:   Counts the CD options available to node users
  5534. '**            for the prodNum%, by reading into install.ini in the section
  5535. '**            [<Product acronym> CD Options]; 
  5536. '** Author:    MZ
  5537. '** Arguments: None
  5538. '** Returns:   0 or num of options
  5539. '*************************************************************************
  5540.    DIM NetworkIns$, prodDir$, gInstallIniFile$, ProdAcronym$,NumOfOptions%
  5541.    DIM OptTag$, OptID$, OptPref$, OptNumber%, rc%
  5542.  
  5543.    'Identify if I am in node install
  5544.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5545.    IF NetworkIns$=gNODE$ THEN
  5546.  
  5547.       'Built the path to install.ini
  5548.       prodDir$ = Lot_GetInstallDir()
  5549.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5550.  
  5551.       IF DoesFileExist(gInstallIniFile$,femExists) = 1 THEN
  5552.      ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  5553.      OptPref$ = "Option"
  5554.      OptNumber%=1
  5555.      OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5556.      OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" CD Options", OptTag$)
  5557.      IF OptID$ <> "" THEN
  5558.         WHILE (OptID$ <> "")
  5559.            NumOfOptions% = OptNumber%
  5560.            OptNumber% = OptNumber% + 1
  5561.            OptTag$=OptPref$+LTRIM$(STR$(OptNumber%))
  5562.            OptID$ = GetIniKeyString(gInstallIniFile$,ProdAcronym$+" CD Options", OptTag$)
  5563.         WEND
  5564.       ELSE
  5565.         Lot_GetNumOfCDOptAvailToNodeForProd = 0
  5566.         EXIT FUNCTION
  5567.      END IF
  5568.      Lot_GetNumOfCDOptAvailToNodeForProd = NumOfOptions
  5569.      EXIT FUNCTION
  5570.     
  5571.       ELSE
  5572.      '** DND: Look into using ShowPathError here. We should tell the
  5573.      '**      user where we looked for install.ini
  5574.      FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  5575.      'DoMsgBox("INSTALL.INI is missing!!!! ",gInstallIniFile$ ,MB_OK)
  5576.       END IF
  5577.  
  5578.    END IF
  5579.  END FUNCTION
  5580. '*************************************************************************
  5581.  
  5582. PUBLIC FUNCTION Lot_AreAnyCDOptAvailToSrv() AS INTEGER
  5583. '** Purpose:   Checks the registration database to find the registred 
  5584. '**            CD options
  5585. '** Author:    MZ
  5586. '** Arguments: None
  5587. '** Returns:   1 if there is at least 1 option or 0 if there is none
  5588. '*************************************************************************
  5589.    DIM NetworkIns$, prodDir$, gInstallIniFile$, OptName$, j%, CDopt_flag%
  5590.    DIM OptCount%, prodNum%, AllProdNum%, ProdAcronym$, AllOptNum%, OptNum%
  5591.    DIM OptKeyword$, chpt$
  5592.  
  5593.    'Identify if I am in server install
  5594.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  5595.    IF NetworkIns$=gSERVER$ THEN
  5596.  
  5597.       'Built the path to install.ini
  5598.       prodDir$ = Lot_GetInstallDir()
  5599.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  5600.  
  5601.       'Loop through the products and check for CD options
  5602.       AllProdNum% = 0
  5603.       CDopt_flag% = 0
  5604.       AllProdNum% = Reg_GetNumberOfProducts()
  5605.       IF AllProdNum% <> 0 THEN
  5606.      FOR prodNum%=1 TO AllProdNum%
  5607.         AllOptNum% = 0
  5608.         AllOptNum% = Reg_GetNumofCDOptions(prodNum%)
  5609.  
  5610. '            Reg_ReSetAllCDOptsSelToDefaults prodNum%
  5611.         OptNum%=Reg_GetNumofCDOptions(prodNum%)
  5612.      IF OptNum% <> 0 THEN
  5613.         chpt$ = Lot_GetChapterFromKeyword(Reg_GetProductAcronym(prodNum%) + gTOP$)
  5614.        ' Loop through the options
  5615.         FOR j% = 1 TO OptNum%
  5616.         OptKeyWord$ = Reg_GetCDOptionStr(prodNum%,j%)
  5617.         chpt$ = Lot_GetChapterFromKeyword(OptKeyWord$)
  5618.         IF INT(Lot_GetChapterValInt(chpt$,F_INOROUT)) = 1 THEN
  5619.          CDopt_flag% = 1
  5620.         END IF
  5621.         NEXT
  5622.      END IF
  5623.      
  5624.      IF AllOptNum% <> 0 AND CDopt_flag% <> 0 THEN
  5625.            Lot_AreAnyCDOptAvailToSrv=1
  5626.            EXIT FUNCTION
  5627.         END IF
  5628.      NEXT
  5629.       ELSE
  5630.      Lot_AreAnyCDOptAvailToSrv=0
  5631.      EXIT FUNCTION
  5632.       END IF
  5633.    ELSE
  5634.       Lot_AreAnyCDOptAvailToSrv=0
  5635.       EXIT FUNCTION
  5636.    END IF
  5637.  
  5638.    Lot_AreAnyCDOptAvailToSrv=0
  5639. END FUNCTION
  5640. '*************************************************************************
  5641.  
  5642.  
  5643.  
  5644.  
  5645. '*************************************************************************
  5646. '** FUNCTION GetNotesPathfromLotusIni() AS STRING
  5647. '**
  5648. '** Purpose: Gets the notes dir path from Lotus.ini file, and searches for
  5649. '**          notes.exe in the product dir path. 
  5650. '**            
  5651. '** Author:    INSIK RHEE
  5652. '** Arguments: None
  5653. '** Returns:   if notes.exe does not exist in dir specified in lotus.ini, it
  5654. '**            returns "", otherwise returns the full path without filename.
  5655. '*************************************************************************
  5656.  
  5657.  
  5658. PUBLIC FUNCTION GetNotesPathfromLotusIni() AS STRING
  5659. DIM DestDir$, lotusinipath$, defdir$, temp%, ProdDir$, fullpath$, rv%
  5660.  
  5661.    DestDir$ = GetWindowsDir()
  5662.    lotusinipath$ = DestDir$ +"lotus.ini"
  5663.  
  5664.    if DoesFileExist(lotusinipath$,femExists) then
  5665.       defdir$ = GetIniKeyString(lotusinipath$,"Lotus Applications", "Notes")
  5666.       if defdir$ <> "" then
  5667.      temp% = INSTR(1,LCASE$(defdir$),"notes.exe")
  5668.      if temp% <> 0 then
  5669.         ProdDir$ = MID$(defdir$,1,(temp%-1))
  5670.         if ProdDir$ <> "" then
  5671.            fullpath$ = ProdDir$ + "notes.exe"
  5672.            if DoesFileExist(fullpath$, femExists) then
  5673.           GetNotesPathfromLotusIni = MID$(defdir$,1,(temp%-2))
  5674.           EXIT FUNCTION
  5675.            end if 
  5676.         end if 
  5677.      end if 
  5678.       end if 
  5679.    end if
  5680.  
  5681.    GetNotesPathfromLotusIni = ""
  5682.  
  5683. END FUNCTION
  5684.  
  5685. '*************************************************************************
  5686. '** FUNCTION IsNotesInPath AS INTEGER
  5687. '**
  5688. '** Purpose: Detects the presence of notes path in the autoexec.bat file
  5689. '**            
  5690. '** Author:    INSIK RHEE
  5691. '** Arguments: None
  5692. '** Returns:   1 if true, 0 if false.
  5693. '*************************************************************************
  5694.  
  5695. PUBLIC FUNCTION IsNotesInPath() AS INTEGER
  5696. DIM     notesdir$,autoexec$,Buffer$
  5697. DIM autofile%, FoundPath%
  5698.  
  5699.     notesdir$ = GetNotesPathfromLotusIni()
  5700.     IsNotesInPath = 0                                                                       ' default = FALSE
  5701.     if notesdir$ = "" then
  5702.         IsNotesInPath = 1
  5703.         EXIT FUNCTION
  5704.     end if
  5705.     autoexec$ = GetBootDrive() 
  5706.    IF autoexec$ <> "" THEN
  5707.       autoexec$ = autoexec$ + "autoexec.bat" 
  5708.    ELSE
  5709.       autoexec$ = "c:\" + "autoexec.bat"
  5710.    END IF
  5711.  
  5712.    autofile% = 111
  5713.     OPEN autoexec$ FOR INPUT AS autofile%
  5714.     Do Until EOF(autofile%)
  5715.         LINE INPUT #autofile%, Buffer$
  5716.         FoundPath% = INSTR(1,LCASE$(Buffer$), "path")
  5717.         if FoundPath% <> 0 Then                                                 ' path statement found.
  5718.             FoundPath% = INSTR(FoundPath%, LCASE$(Buffer$), LCASE$(notesdir$))
  5719.             if FoundPath% <> 0 Then 
  5720.                 IsNotesInPath = 1
  5721.                 CLOSE #autofile%
  5722.                 EXIT FUNCTION
  5723.             end if
  5724.         end if
  5725.     Loop
  5726.     CLOSE #autofile%
  5727.  
  5728. END FUNCTION
  5729.  
  5730. '*************************************************************************
  5731. '** FUNCTION IsShareInAUTOEXEC AS INTEGER
  5732. '**
  5733. '** Purpose: Detects the presence of SHARE.EXE in the autoexec.bat file
  5734. '**            
  5735. '** Author:    INSIK RHEE
  5736. '** Arguments: None
  5737. '** Returns:   1 if true, 0 if false.
  5738. '*************************************************************************
  5739.  
  5740. PUBLIC FUNCTION IsShareInAUTOEXEC() AS INTEGER
  5741. DIM   autoexec$,Buffer$
  5742. DIM   autofile%, FoundShare%
  5743.  
  5744.     IsShareInAUTOEXEC = 0                                                                   ' default = FALSE
  5745.    autoexec$ = GetBootDrive() 
  5746.    IF autoexec$ <> "" THEN
  5747.       autoexec$ = autoexec$ + "autoexec.bat" 
  5748.    ELSE
  5749.       autoexec$ = "c:\" + "autoexec.bat"
  5750.    END IF
  5751.  
  5752.     autofile% = 111
  5753.     OPEN autoexec$ FOR INPUT AS autofile%
  5754.     Do Until EOF(autofile%)
  5755.         LINE INPUT #autofile%, Buffer$
  5756.         FoundShare% = INSTR(1,LCASE$(Buffer$), "share")
  5757.         if FoundShare% <> 0 Then                                                        ' share statement found.
  5758.             IsShareInAUTOEXEC = 1
  5759.             CLOSE #autofile%
  5760.             EXIT FUNCTION
  5761.         end if
  5762.     Loop
  5763.    CLOSE #autofile%
  5764.  
  5765. END FUNCTION
  5766.  
  5767. '*************************************************************************
  5768. '** FUNCTION ModifyAutoexec AS STRING
  5769. '**
  5770. '** Purpose: Modifies autoexec.bat to include share and/or modify path to 
  5771. '**             include notes 
  5772. '**            
  5773. '** Author:    INSIK RHEE
  5774. '** Arguments:  modflag%        = bitwise flag on what to modify.
  5775. '**                             directmod%      = 1 to modify autoexec.bat (backing up old one)
  5776. '**                                                       0 to modify to a backup file 
  5777. '**                             backup$         = backup filename 
  5778. '** Returns:   NULL string if success.  string describing error otherwise
  5779. '**     NOTE: This function assumes that the caller has already used the 
  5780. '** IsNotesInPath and IsShareEnabled calls and will NOT check to see if 
  5781. '** the modifications are redundant.
  5782. '*************************************************************************
  5783.  
  5784.  
  5785. PUBLIC FUNCTION ModifyAutoexec(modflag%,directmod%,backup$) AS STRING
  5786. DIM     notesdir$,src$,dest$,Buffer$
  5787. DIM srcfile%,destfile%, FoundPath%, PathNext%
  5788.  
  5789.     srcfile% = 112
  5790.     destfile% = 113
  5791.     ModifyAutoexec=""                                                               ' default
  5792.     if (modflag% AND MANotes) then                          ' notes mod
  5793.         notesdir$ = GetNotesPathfromLotusIni()
  5794.     end if
  5795.    src$ = GetBootDrive() 
  5796.    IF src$ <> "" THEN
  5797.       dest$ = src$ + backup$
  5798.       src$ = src$ + "autoexec.bat"
  5799.     ELSE
  5800.       dest$ = "c:\" + backup$
  5801.       src$ = "c:\" + "autoexec.bat"
  5802.    END IF
  5803.  
  5804.     
  5805.     IF Win32CopyFile(src$, dest$, TRUE) = FALSE THEN
  5806.         ModifyAutoexec = LdString( SID_ERR_AUTOEXEC_NOT_COPIED )
  5807.         EXIT FUNCTION
  5808.     End If
  5809.  
  5810.     Win32CopyFile src$, dest$, TRUE
  5811.  
  5812.     if directmod% <> 0 then
  5813.         src$ = dest$
  5814.       dest$ = GetBootDrive()
  5815.       IF dest$ <> "" THEN
  5816.      dest$ = dest$ + "autoexec.bat" 
  5817.       ELSE
  5818.            dest$ = "c:\" + "autoexec.bat"
  5819.       END IF
  5820.    
  5821.     End If
  5822.     OPEN src$ FOR INPUT AS srcfile%
  5823.     OPEN dest$ FOR OUTPUT AS destfile%
  5824.     PathNext% = 0   ' set to 1 when path found, 2 after mod is done.
  5825.     Do Until EOF(srcfile%)
  5826.         LINE INPUT #srcfile%, Buffer$
  5827.         FoundPath% = INSTR(1,LCASE$(Buffer$), "path")
  5828.         if ((FoundPath% <> 0) AND (PathNext <> 2)) Then  ' path statement found.
  5829.             PathNext% = 1
  5830.         end if
  5831.         PRINT #destfile%, Buffer$
  5832.         if PathNext% = 1 Then
  5833.             if (modflag% AND MANotes) then
  5834.                 PRINT #destfile%, "PATH=%PATH%;"+notesdir$
  5835.             End If
  5836.             If (modflag% AND MAShare) then
  5837.                 PRINT #destfile%, "SHARE"
  5838.             End If
  5839.             PathNext% = 2
  5840.         End If
  5841.     Loop
  5842.     if PathNext% <> 2 Then                                                                  ' path statement not found?
  5843.         if (modflag% AND MANotes) then
  5844.             PRINT #destfile%, "PATH=%PATH%;"+notesdir$
  5845.         End If
  5846.         If (modflag% AND MAShare) then
  5847.             PRINT #destfile%, "SHARE"
  5848.         End If
  5849.     End If
  5850.     CLOSE #srcfile%, #destfile%
  5851. END FUNCTION
  5852.  
  5853. '*************************************************************************
  5854. '** FUNCTION GetBootDrive() AS STRING
  5855. '**
  5856. '** Purpose: Gets the boot drive letter and trailing slash (e.g. "C:\")
  5857. '**            
  5858. '** Author:    INSIK RHEE
  5859. '** Arguments: None
  5860. '** Returns:   Searches the fixed drive list for AUTOEXEC.BAT
  5861. '**                        returns null string if none found. (or READ_ONLY drive)
  5862. '*************************************************************************
  5863.  
  5864. PUBLIC FUNCTION GetBootDrive() AS STRING
  5865. DIM lDrive$, Length%, count%
  5866.     GetLocalHardDrivesList SYM_LOCALHARDDRIVES$
  5867.     Length% = GetListLength(SYM_LOCALHARDDRIVES$)
  5868.     FOR count% = 1 TO Length%
  5869.         lDrive$     = GetListItem(SYM_LOCALHARDDRIVES$, count%) + ":\"
  5870.         IF IsDirWritable(lDrive$) AND (DoesFileExist(lDrive$+"autoexec.bat",femExists)=1) THEN
  5871.         GetBootDrive$ = lDrive$
  5872.             EXIT FUNCTION
  5873.         END IF
  5874.     NEXT
  5875.     GetBootDrive$=""
  5876. END FUNCTION
  5877.  
  5878.  
  5879. PUBLIC SUB      DL_SetOraclePath
  5880. '** Purpose:   This subroutine Sets the Oracle Data Path symbol
  5881. '**            
  5882. '** Author:    JMD
  5883. '** Arguments: NONE
  5884. '*************************************************************************
  5885.     DIM TmpDDir$
  5886.     ' Should use this if NODE or STANDARD - 
  5887.     TmpDDir$ = Lot_GetORACLEHomePath() 
  5888.     IF TmpDDir$ <> "" THEN
  5889.        SetSymbolValue SYM_ORACLEHOMEDIR$, TmpDDir$
  5890.          Lot_RefreshDestination(SYM_ORACLEHOMEDIR$)
  5891.     End If
  5892. END SUB
  5893.  
  5894. PUBLIC SUB      DL_SetNotesDataPath
  5895. '** Purpose:   This subroutine Sets the DataLens specific symbols for the
  5896. '**            Notes Data Path.  This facilitates copying NSF files to the 
  5897. '**            proper DOC location
  5898. '** Author:    PJT
  5899. '** Arguments: NONE
  5900. '*************************************************************************
  5901.     DIM TmpDDir$
  5902.     ' Should use this if NODE or STANDARD - 
  5903.     TmpDDir$ = Lot_GetLotusNotesDataPath() 
  5904.     'print "Got Lotus Notes Data Directory of " & TmpDDir$
  5905.     IF TmpDDir$ <> "" THEN
  5906.        SetSymbolValue SYM_LOTUSNOTESDATADIR$, TmpDDir$
  5907.          Lot_RefreshDestination(SYM_LOTUSNOTESDATADIR$)
  5908.     End If
  5909. END SUB
  5910.  
  5911. PUBLIC FUNCTION Lot_GetLotusNotesDataPath() AS STRING
  5912. '** Purpose:         Returns the location for the Notes Data Directory
  5913. '** Author:          PTilton
  5914. '** Arguments:       None.
  5915. '** Returns:             NULL String if Notes Data Directory not found.
  5916. '**                  Otherwise, returns directory of Notes Data Directory.
  5917. '*************************************************************************
  5918.    DIM szDir$, szSearch$, szTmp$, rc%, lrc&
  5919.  
  5920.    Lot_GetLotusNotesDataPath = ""
  5921.    szTmp$ = GetIniKeyString( "Notes.ini", "Notes", "Directory")
  5922.    If szTmp$ <> "" Then
  5923.        lrc& = FDirExists ( szTmp$ )
  5924. '          print "Does Directory -" & szTmp$ & "- Exist: " & str( rc% )
  5925.        If (lrc& = 1) Then
  5926.           Lot_GetLotusNotesDataPath = szTmp$
  5927.        End If
  5928.    Else
  5929.       szTmp$ = GetIniKeyString( "Lotus.ini", "Lotus Applications", "Notes")
  5930.       szSearch$ = ucase$( szTmp$ )
  5931.       rc% = instr( szSearch$, "NOTES.EXE") 
  5932.       If rc% > 2 Then
  5933.           szDir$ = left$(szTmp$, rc% - 2 )
  5934. '                 print "Notes LOTUS.INI Data Directory: " & szDir$
  5935.           lrc& = FDirExists ( szDir$ )
  5936. '                 print "Does LOTUS.INI Directory Exist: " & str( lrc& )
  5937.           If (lrc& = 1) Then
  5938.              szTmp$ = GetIniKeyString( szDir$ & "\" & "Notes.ini", "Notes", "Directory")
  5939. '                        print "Notes Data Directory: " & szTmp$
  5940.              If szTmp$ <> "" Then
  5941.                 lrc& = FDirExists ( szTmp$ )
  5942. '                               print "Does Directory -" & szTmp$ & "- Exist: " & str( lrc& )
  5943.                 If (lrc& = 1) Then
  5944.                    Lot_GetLotusNotesDataPath = szTmp$
  5945.                 End If
  5946.          Else
  5947.             Lot_GetLotusNotesDataPath = szDir$
  5948.          End If
  5949.           End If
  5950.       End If
  5951.    End If
  5952. END FUNCTION
  5953. '*************************************************************************
  5954.  
  5955. PUBLIC FUNCTION Lot_GetLotusNotesPrgPath() AS STRING
  5956. '** Purpose:         Returns the location for the Notes Data Directory
  5957. '** Author:          PTilton
  5958. '** Arguments:       None.
  5959. '** Returns:             NULL String if Notes Data Directory not found.
  5960. '**                  Otherwise, returns directory of Notes Data Directory.
  5961. '*************************************************************************
  5962.    DIM szDir$, szSearch$, szTmp$, rc%, lrc&
  5963.    DIM szPath$, szFile$, szSect$, szKey$, szExe$
  5964.  
  5965.    szPath$ = GetSymbolValue( SYM_WINDIR$ ) & LdString( SID_DATALENS_NOTES_INI )
  5966.    szSect$ = LdString( SID_DATALENS_NOTES_SECT )
  5967.    szKey$ = LdString( SID_DATALENS_NOTES_KEY )
  5968.    szExe$ = LdString( SID_DATALENS_NOTES_EXE )
  5969.  
  5970.    Lot_GetLotusNotesPrgPath = ""
  5971.    szTmp$ = GetIniKeyString( szPath$, szSect$, szKey$ )
  5972.    szSearch$ = ucase$( szTmp$ )
  5973.    rc% = instr( szSearch$, szExe$) 
  5974.    If rc% > 2 Then
  5975.       szDir$ = left$(szTmp$, rc% - 2 )
  5976.       'print "Notes LOTUS.INI Program Directory: " & szDir$
  5977.       lrc& = FDirExists ( szDir$ )
  5978.       'print "Does LOTUS.INI Program Directory Exist: " & str( rc% )
  5979.       If (lrc& = 1) Then
  5980.      Lot_GetLotusNotesPrgPath = szDir$
  5981.       End If
  5982.    End If
  5983. END FUNCTION
  5984. '*************************************************************************
  5985.  
  5986. 'FUNCTION GetLotusNotesDataPath(szFile$, szSect$, szKey$) AS STRING
  5987. '** Purpose:         Returns the location for the Notes Data Directory
  5988. '** Author:          PTilton
  5989. '** Arguments:       None.
  5990. '** Returns:             NULL String if Notes Data Directory not found.
  5991. '**                  Otherwise, returns directory of Notes Data Directory.
  5992. '*************************************************************************
  5993. '   DIM szDir$, rc%
  5994.  
  5995. '   GetLotusNotesDataPath = ""
  5996.    
  5997. '   rc% = DoesIniSectionExist (szFile$, szSect$) 
  5998. '   print "Does Section [" & szSect$ & "] Exist in File("& szFile$ &": " & str( rc% )
  5999. '   If (rc% = 1) Then
  6000. '      rc% = DoesIniKeyExist (szFile$, szSect$, szKey$)
  6001. '      print "Does Key -" & szKey$ & "- Exist: " & str( rc% )
  6002. '      If (rc% = 1) Then
  6003. '         szDir$ = GetIniKeyString (szFile$, szSect$, szKey$)
  6004. '         print "Keyword -" & szKey$ & "- Value: " & szDir$
  6005. '         GetLotusNotesDataPath =szDir$
  6006. '      End If
  6007. '   End If
  6008. 'END FUNCTION
  6009. '*************************************************************************
  6010.  
  6011.  
  6012. PUBLIC FUNCTION Lot_GetORACLEHomePath() AS STRING
  6013. '** Purpose:         Returns the location for the ORACLE Home Directory
  6014. '** Author:          PTilton
  6015. '** Arguments:       None.
  6016. '** Returns:             NULL String if ORACLE Home Directory not found.
  6017. '**                  Otherwise, returns directory of ORACLE Home Directory.
  6018. '*************************************************************************
  6019.    DIM szPath$, szTmp$, rc%, lrc&, szFile$, szSect$, szKey$
  6020.  
  6021.    szPath$ = GetSymbolValue( SYM_WINDIR$ ) & LdString( SID_DATALENS_ORACLE_INI )
  6022.    szSect$ = LdString( SID_DATALENS_ORACLE_SECT )
  6023.    szKey$ = LdString( SID_DATALENS_ORACLE_KEY )
  6024.    Lot_GetORACLEHomePath = ""
  6025.    szTmp$ = GetIniKeyString ( szPath$, szSect$, szKey$ )
  6026.    'print "Oracle Home Directory: " & szTmp$
  6027.    If szTmp$ <> "" Then
  6028.        lrc& = FDirExists ( szTmp$ )
  6029.        'print "Does Directory -" & szTmp$ & "- Exist: " & str( lrc& )
  6030.        If (lrc& = 1) Then
  6031.           Lot_GetORACLEHomePath = szTmp$
  6032.        End If
  6033.    End If
  6034. END FUNCTION
  6035. '*************************************************************************
  6036.  
  6037. PUBLIC FUNCTION Lot_IsDestVerNewerOrEqual(DestinationPath$,sourcever1&,sourcever2&,sourcever3&,sourcever4&) AS INTEGER
  6038. '** Purpose:   This function validates the version of the file
  6039. '** Author:    MZ
  6040. '** Arguments: DestinationPath$,
  6041. '**            SourceVer1&,
  6042. '**            SourceVer2&,
  6043. '**            SourceVer3&,
  6044. '**            SourceVer4&
  6045. '** Returns:   1 if newer or equal
  6046. '**            0 if older or the file is not found or it does not have version
  6047. '*************************************************************************
  6048.    DIM DestFileVersion$
  6049.    DIM DestVer1&,DestVer2&,DestVer3&,DestVer4&, notused%
  6050.  
  6051.    'Find If the file exists
  6052.    IF DoesFileExist(DestinationPath$,femExists)=1 THEN
  6053.  
  6054.       'Find the version
  6055.       DestFileVersion$=GetVersionOfFile(DestinationPath$)
  6056.  
  6057.       'If no version found
  6058.       IF DestFileVersion$="" THEN
  6059.      Lot_IsDestVerNewerOrEqual = 0
  6060.      EXIT FUNCTION
  6061.  
  6062.       'If version found
  6063.       ELSE
  6064.      'Find the version components
  6065.      DestVer1&=GetVersionNthField(DestFileVersion$,1)
  6066.      DestVer2&=GetVersionNthField(DestFileVersion$,2)
  6067.      DestVer3&=GetVersionNthField(DestFileVersion$,3)
  6068.      DestVer4&=GetVersionNthField(DestFileVersion$,4)
  6069.  
  6070.      'Compare the version
  6071.      IF SourceVer1& > DestVer1& THEN
  6072.         Lot_IsDestVerNewerOrEqual = 0
  6073.         EXIT FUNCTION
  6074.      ELSEIF SourceVer1& = DestVer1& AND _
  6075.         SourceVer2& > DestVer2& THEN
  6076.         Lot_IsDestVerNewerOrEqual = 0
  6077.         EXIT FUNCTION
  6078.      ELSEIF SourceVer1& = DestVer1& AND _
  6079.         SourceVer2& = DestVer2& AND _
  6080.         SourceVer3& > DestVer3& THEN
  6081.         Lot_IsDestVerNewerOrEqual = 0
  6082.         EXIT FUNCTION
  6083.      ELSEIF SourceVer1& = DestVer1& AND _
  6084.         SourceVer2& = DestVer2& AND _
  6085.         SourceVer3& = DestVer3& AND _
  6086.         SourceVer4& > DestVer4& THEN
  6087.         Lot_IsDestVerNewerOrEqual = 0
  6088.         EXIT FUNCTION
  6089.      ELSEIF SourceVer1& = DestVer1& AND _
  6090.         SourceVer2& = DestVer2& AND _
  6091.         SourceVer3& = DestVer3& AND _
  6092.         SourceVer4& = DestVer4& THEN
  6093.         'Version is equal. Delete the source
  6094.         Lot_IsDestVerNewerOrEqual = 1
  6095.         EXIT FUNCTION
  6096.      ELSE
  6097.         'Dest is newer.
  6098.         Lot_IsDestVerNewerOrEqual = 1
  6099.         EXIT FUNCTION
  6100.      END IF
  6101.  
  6102.       END IF
  6103.    'file not found in the destination
  6104.    ELSE
  6105.       Lot_IsDestVerNewerOrEqual = 0
  6106.       EXIT FUNCTION
  6107.    END IF
  6108. END FUNCTION
  6109.  
  6110. CONST ObjectPrefix$="Object"
  6111. CONST gMISCINSTALLEDOBJECTS="Miscellaneous Installed Objects"
  6112.  
  6113. SUB PopulateCOBJECTLIST(iniPath$)
  6114. '*************************************************************************
  6115. '** Purpose:         Compiles a list of objects already in the cinstall or
  6116. '**                  cinstnod.ini file; populates list COBJECT
  6117. '** Author:          JMD
  6118. '** Arguments:       Full pathname of .INI file
  6119. '** Returns:             NULL String if Notes Data Directory not found.
  6120. '**                  Otherwise, returns directory of Notes Data Directory.
  6121. '*************************************************************************
  6122.    DIM Number%
  6123.    DIM Tag$, ID$, rc%
  6124.    STATIC gCOBJECTinited%  ''ASSUME gCOBJECTinited% starts as zero
  6125.  
  6126.    If  gCOBJECTinited% <> 1 THEN
  6127.         gNCOBJECT% = 0
  6128.       gCOBJECTinited% = 1
  6129.         IF DoesFileExist(iniPath$,femExists) = 1 THEN
  6130.             Erase COBJECT 
  6131.             Number%=1
  6132.             Tag$=ObjectPrefix$+LTRIM$(STR$(Number%))
  6133.             ID$ = GetIniKeyString(iniPath$, gMISCINSTALLEDOBJECTS, Tag$)
  6134.             WHILE ID$ <> ""
  6135.                 gNCOBJECT% = Number%
  6136.                 COBJECT (ID$) = gNCOBJECT%
  6137.                 Number% = Number% + 1
  6138.                 Tag$=ObjectPrefix$+LTRIM$(STR$(Number%))
  6139.                 ID$ = GetIniKeyString(iniPath$, gMISCINSTALLEDOBJECTS, Tag$)
  6140.             WEND
  6141.         END IF
  6142.     END IF
  6143.  
  6144. END SUB
  6145.  
  6146. SUB PopulateCINSTALLLIST
  6147.    DIM prodDir$, installIniFile$, FeaturePref$, Featurenumber%
  6148.    DIM FeatureTag$, FeatureID$, rc%
  6149.    STATIC gCINSTALLinited%  ''ASSUME gCINSTALLinited% starts as zero
  6150.  
  6151.    If  gCINSTALLinited% <> 1 Then
  6152.       gNCINSTALL% = 0
  6153.       gCINSTALLinited% = 1
  6154.  
  6155.       'Built the path to install.ini
  6156.       prodDir$ = Lot_GetInstallDir()
  6157.       installIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  6158.  
  6159.       FeaturePref$ = "Feature"
  6160.       FeatureNumber%=1
  6161.       FeatureTag$=FeaturePref$+LTRIM$(STR$(FeatureNumber%))
  6162.       FeatureID$ = GetIniKeyString(installIniFile$,"Server Feature Installed", FeatureTag$)
  6163.       IF DoesFileExist(installIniFile$,femExists) = 1 THEN
  6164.     IF FeatureID$ <> "" THEN
  6165.        DO
  6166.           CINSTALL (FeatureID$) = "1"
  6167.           gNCINSTALL% = gNCINSTALL%+1
  6168.           FeatureNumber% = FeatureNumber% + 1
  6169.           FeatureTag$=FeaturePref$+LTRIM$(STR$(FeatureNumber%))
  6170.           FeatureID$ = GetIniKeyString(installIniFile$,"Server Feature Installed", FeatureTag$)
  6171.        LOOP UNTIL FeatureID$ = ""
  6172.         END IF
  6173.       ELSE
  6174.      '** DND: Look into using ShowPathError here. We should tell the
  6175.      '**      user where we looked for install.ini
  6176.      FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  6177.       END IF
  6178.    END IF
  6179. END SUB
  6180.  
  6181. '*************************************************************************
  6182. SUB PopulateCINSTNODELIST
  6183.    DIM prodDir$, installIniFile$, FeaturePref$, Featurenumber%
  6184.    DIM FeatureTag$, FeatureID$, rc%, dirSym$, inidir$
  6185.    STATIC gCINSTNODEinited%  ''ASSUME gCINSTALLinited% starts as zero
  6186.  
  6187.    If  gCINSTNODEinited% <> 1 Then
  6188.       gNCINSTNODE% = 0
  6189.       gCINSTNODEinited% = 1
  6190.  
  6191.       'Built the path to cinstnod.ini
  6192.       dirSym$ = Reg_GetDirSymbolList(1)       '** First product dir list
  6193.       IF GetListLength(dirSym$) >= 1 THEN
  6194.         dirSym$ = GetListItem(dirSym$, 1)    '** First directory symbol
  6195.         inidir$ = GetSymbolValue(dirSym$) 
  6196.               installIniFile$ = MakePath(inidir$,"cinstnod.ini")
  6197.       END IF
  6198.  
  6199.       FeaturePref$ = "Feature"
  6200.       FeatureNumber%=1
  6201.       FeatureTag$=FeaturePref$+LTRIM$(STR$(FeatureNumber%))
  6202.       FeatureID$ = GetIniKeyString(installIniFile$,"Server Feature Installed", FeatureTag$)
  6203.       IF DoesFileExist(installIniFile$,femExists) = 1 THEN
  6204.     IF FeatureID$ <> "" THEN
  6205.        DO
  6206.           CINSTNODE (FeatureID$) = "1"
  6207.           gNCINSTNODE% = gNCINSTNODE%+1
  6208.           FeatureNumber% = FeatureNumber% + 1
  6209.           FeatureTag$=FeaturePref$+LTRIM$(STR$(FeatureNumber%))
  6210.           FeatureID$ = GetIniKeyString(installIniFile$,"Server Feature Installed", FeatureTag$)
  6211.        LOOP UNTIL FeatureID$ = ""
  6212.         END IF
  6213.       ELSE
  6214.      '** DND: Look into using ShowPathError here. We should tell the
  6215.      '**      user where we looked for install.ini
  6216.      FatalErrorMsg SID_ERR_INSTALLINI_MISSING, "", STFQUIT
  6217.       END IF
  6218.    END IF
  6219. END SUB
  6220.  
  6221. '*************************************************************************
  6222. '** PUBLIC FUNCTION TrimNetlotusapp (path$) AS STRING
  6223. '**
  6224. '** Purpose:   trims the net lotusapp directory to detect mapping. 
  6225. '** Author:    Thangv
  6226. '** Arguments: path$ 
  6227. '** Returns:   the modified path
  6228. '*************************************************************************
  6229.  
  6230. PUBLIC FUNCTION TrimNetlotusapp (ByVal path$) AS STRING
  6231.  
  6232.    DIM  firstslash%, newpath$, drive$
  6233.    
  6234.    TrimNetlotusapp = ""
  6235.    path$ = Lot_TrimEndSlash (path$)
  6236.    drive$ = LEFT(path$, 2)
  6237.    
  6238.    firstslash% = INSTR(1,path$,"\")
  6239.    WHILE firstslash% <> 0
  6240.       path$ = MID$(path$,firstslash%+1)
  6241.       newpath$ = drive$ + "\" + path$
  6242.       IF DoesDirExist(newpath$) = 1 THEN
  6243.      TrimNetlotusapp = newpath$ + "\"
  6244.      EXIT FUNCTION     
  6245.       ELSE 
  6246.      firstslash% = INSTR(1,path$,"\")                       
  6247.       END IF
  6248.    WEND
  6249.  
  6250. END FUNCTION
  6251.  
  6252. PUBLIC FUNCTION Lot_RegisterUninstaller(ProdRegKeyName$,ProdVer$,_
  6253.                     ProdDisplayedName$,ProdInfPath$,_
  6254.                     LogFlag%,AutoFlag%,_
  6255.                     LangID$,LogFile$,RspFile$,_
  6256.                     UserName$ ) AS INTEGER
  6257. '** Purpose:   Registers the uninstaller for a product and builds the uninstall
  6258. '**            command line. This function should be called in PostCopyConfig()
  6259. '** Author:    MZ
  6260. '** Arguments: ProdRegKeyName$     The name of the product key in the registry
  6261. '**            ProdVer$            The version of the product installed
  6262. '**            ProdDisplayedName$  The description of the product put into the registry
  6263. '**            ProdInfPath$        The path of the standalone/server INF file
  6264. '**            LogFlag%            TRUE/FALSE if you want uninstall to produce or not a log
  6265. '**            AutoFlag%           TRUE/FALSE if you want uninstall to run or not silantelly
  6266. '**            LangID$             The default language for uninstall
  6267. '**            LogFile$ (optional) The log file path to overwrite the default provided by uninstall
  6268. '**            RspFile$ (optional) The response file path to overwrite the default provided by uninstall
  6269. '**            UserName$(optional) The User Name
  6270. '** Returns:   True if worked False otherwise
  6271. '*************************************************************************
  6272. DIM gInstallIniFile$,cwd$,prodDir$,Network$,ProdNameAndVer$,CommandLine$ 
  6273. DIM Platform%, PlatformStr$, LReturn&, grouptitle$, Caption$, dirSym$, RegKey$
  6274. DIM s$, szkey$, IsRootProduct%
  6275.  
  6276.    'Validate the arguments
  6277.    IF ProdRegKeyName$ = "" OR _
  6278.       ProdVer$ = "" OR _
  6279.       ProdDisplayedName$ = "" OR _
  6280.       ProdInfPath$ = "" OR _
  6281.       LangID$ = "" THEN
  6282.       Lot_RegisterUninstaller = FALSE
  6283.    END IF
  6284.  
  6285.    IF LogFlag% <> FALSE AND LogFlag% <> TRUE THEN
  6286.       Lot_RegisterUninstaller = FALSE
  6287.    END IF
  6288.  
  6289.    IF AutoFlag% <> FALSE AND AutoFlag% <> TRUE THEN
  6290.       Lot_RegisterUninstaller = FALSE
  6291.    END IF
  6292.    
  6293.    Network$ = GetSymbolValue(SYM_NETWORK$)
  6294.  
  6295.  'TV: For server, distribution installs don't register uninstall
  6296.     IF Network$ = gSERVER$ OR Network$ = gDISTRIBUTION$ THEN EXIT FUNCTION
  6297.  
  6298.     ' The first product, either suite or this product for standalone
  6299.     ProdNameAndVer$ = MakePath(GetSymbolValue(SYM_REG_PRODUCTNAME$) , GetSymbolValue(SYM_REG_PRODUCTVER$))
  6300.     s$ = MakePath(ProdRegKeyName$, ProdVer$)
  6301.     IsRootProduct% = (ProdNameAndVer$ =  s$)
  6302. 'Only register suite uninstaller, or single product
  6303. IF IsRootProduct% THEN
  6304.     
  6305.    'Built the path to cinstall.ini
  6306.    IF Network$ = gNODE$ THEN
  6307.       'Get the target directory for the product
  6308.       dirSym$ = Reg_GetDirSymbolList(Lot_GetCurrentProduct())
  6309.       If GetListLength(dirSym$) >= 1 Then
  6310.          dirSym$ = GetListItem(dirSym$, 1)
  6311.          gInstallIniFile$ = GetSymbolValue(dirSym$)+"Cinstnod.ini"
  6312.       End If
  6313.    ELSEIF Network$=gSERVER$ OR Network$=gSTANDARD THEN
  6314.       'Get the install directory
  6315.       prodDir$ = Lot_GetInstallDir()
  6316.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  6317.    END IF
  6318.  
  6319.    'print gInstallIniFile$,"gInstallIniFile$"
  6320.    PlatformStr$ = gREGWINNAME
  6321.  
  6322.    'Write the uninstall key and registry values
  6323.     RegKey$=PlatformStr$+"\Uninstall\"+ProdRegKeyName$+" V"+ProdVer$
  6324.    LReturn& = Lot_RegCreateKeyEx(HKEY_LOCAL_MACHINE, RegKey$)
  6325.   'print " after calling Lot_RegCreateKeyEx in share32",LReturn&
  6326.   IF LReturn& <> ERROR_SUCCESS THEN
  6327.      Lot_RegisterUninstaller = FALSE
  6328.       RegErrorMsg SID_ERR_REG_CREATE, gHLM$+"\"+RegKey$,"",""
  6329.   END IF
  6330.         
  6331.   'Write the display name key and value
  6332.   'print " before calling Lot_CreateRegKeyValueEx in share32"        
  6333.   LReturn& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE, RegKey$,_
  6334.               "DisplayName",_
  6335.               REG_SZ,_
  6336.               ProdDisplayedName$, _
  6337.               LENBP(ProdDisplayedName$)+1)
  6338.   'print " after calling Lot_CreateRegKeyValueEx in share32",LReturn&
  6339.   IF LReturn& <> ERROR_SUCCESS THEN
  6340.       Lot_RegisterUninstaller = FALSE
  6341.        RegErrorMsg SID_ERR_REG_UNINST, gHLM$+RegKey$,"DisplayName",ProdDisplayedName$
  6342.   END IF
  6343.  
  6344.   'Build the command line
  6345.   CommandLine$ = | /T | & ProdRegKeyName & | /V | & ProdVer$
  6346.   IF IsNewShell() THEN
  6347.         CommandLine$ = CommandLine$ & | /I "| & ProdInfPath$ & |"|
  6348.         CommandLine$ = CommandLine$ & | /C "| & gInstallIniFile$ & |"|   
  6349.     ELSE
  6350. 'JMD:
  6351. '    NT 3.51 has a bug that truncates the command line in the program icon if
  6352. '    there are embedded quotes; therefore embedded quotes are NOT supported for
  6353. '    NT 3.51 (old Win 3.1 shell) only
  6354.         CommandLine$ = CommandLine$ & " /I " & ProdInfPath$
  6355.         CommandLine$ = CommandLine$ & " /C " & gInstallIniFile$
  6356.     END IF
  6357.   IF LogFlag% <> FALSE THEN
  6358.      CommandLine$ = CommandLine$+" /O "
  6359.   END IF
  6360.   IF LogFile$ <> "" THEN
  6361.      CommandLine$ = CommandLine$+LogFile$
  6362.   END IF
  6363.   IF AutoFlag% <> FALSE THEN
  6364.      CommandLine$ = CommandLine$+" /A "
  6365.   END IF
  6366.   IF RspFile$ <> "" THEN
  6367.      CommandLine$ = CommandLine$+RspFile$
  6368.   END IF
  6369.   CommandLine$ = CommandLine$+" /L "+LangID$
  6370.   IF UserName$ <> "" THEN
  6371.      CommandLine$ = CommandLine$+" /U "+UserName$
  6372.   END IF    
  6373.   CommandLine$ = GetWindowsDir()+gUNINSTALLEXE+CommandLine$
  6374.  
  6375.     ' Register it under the first product (suit or main product for single)
  6376.     s$ = Reg_GetProductAcronym(1) + gTOP$
  6377.   IF NOT IsNewShell() THEN
  6378.         Caption$ = ProdRegKeyName$+" V"+ProdVer$+" "+gUNINSTALL
  6379.       grouptitle$ = Reg_GetProgManagerGroupName(1)
  6380.     CreateProgmanItem grouptitle$, Caption$, CommandLine$, GetWindowsDir()+gUNINSTALLEXE, cmoOverwrite
  6381.     Lot_RegisterObject s$, UNIN_CLASS_ICON$, grouptitle$ + "\" + Caption$
  6382.   END IF
  6383.  
  6384.   'print CommandLine$,"CommandLine$"
  6385.   'Write the CommandLine
  6386.   'print " before calling Lot_CreateRegKeyValueEx in share32"        
  6387.   LReturn& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE, RegKey$,_
  6388.               "UninstallString",_
  6389.               REG_SZ,_
  6390.               CommandLine$, _
  6391.               LENBP(CommandLine$)+1)
  6392.   'print " after calling Lot_CreateRegKeyValueEx in share32",LReturn&        
  6393.  
  6394.   IF LReturn& <> ERROR_SUCCESS THEN
  6395.       Lot_RegisterUninstaller = FALSE
  6396.        RegErrorMsg SID_ERR_REG_UNINST, gHLM$+RegKey$,"UninstallString",CommandLine$
  6397.   ELSE
  6398.       Lot_RegisterUninstaller = TRUE
  6399.   END IF
  6400.  
  6401. END IF    ' IF IsRootProduct% 
  6402.  
  6403.     ' Register suite products for Suite uninstall
  6404.    s$ = GetSymbolValue(SYM_SINGLESMARTSUITE$)
  6405.     szkey$ = gREGLOTUS + ProdNameAndVer$ + "\Products\"
  6406.     szkey$ = szkey$  + ProdRegKeyName$ + "\" +  ProdVer$
  6407.     IF s$ = gSMARTSUITE$ THEN
  6408.         IF NOT IsRootProduct% THEN
  6409.             IF Lot_DoesRegKeyExistEx(HKEY_LOCAL_MACHINE, szKey$) = FALSE THEN
  6410.                 IF Lot_RegCreateKeyEx(HKEY_LOCAL_MACHINE, szKey$) <> 0 THEN
  6411.                     Lot_RegisterUninstaller = FALSE
  6412.                     EXIT FUNCTION
  6413.                 END IF
  6414.             END IF
  6415.             LReturn& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE, szKey$,_
  6416.               "InfFileName", REG_SZ, ProdInfPath$, LENBP(ProdInfPath$)+1)
  6417.         END IF
  6418.     ELSE
  6419.         ' Delete these entries so single prodcut uninstall can work
  6420.         IF Lot_DoesRegKeyExistEx(HKEY_LOCAL_MACHINE, szKey$) = TRUE THEN _
  6421.             LReturn& = Lot_RegDelAllSubKeys(HKEY_LOCAL_MACHINE, szKey)
  6422.     END IF
  6423.     Lot_RegisterUninstaller = (LReturn& = ERROR_SUCCESS)
  6424.  
  6425. END FUNCTION
  6426.  
  6427. PUBLIC FUNCTION Lot_RegisterObject(FeatureKeyWord$, ClassOfObject$, ObjectPath$)
  6428. '** Purpose:   Registers the [Miscellaneous Installed Objects] into cinstall.ini 
  6429. '**            for standalone installs and into cinsnode.ini for node installs
  6430. '** Author:    MZ
  6431. '** Arguments: FeatureKeyWord$     The KeyWord of the section that is associate 
  6432. '**                                with this object
  6433. '**            ClassOfObject$      The classes; The predefined (in globals.lss)
  6434. '**                                classes are: 
  6435. '**                                UNIN_CLASS_PROGRAM_GROUP$
  6436. '**                                UNIN_CLASS_ICON$
  6437. '**                                UNIN_CLASS_FOLDER$
  6438. '**                                UNIN_CLASS_SHORTCUT$
  6439. '**                                UNIN_CLASS_START_MENU_ENTRY$
  6440. '**                                UNIN_CLASS_REGISTRY_KEY$
  6441. '**                                UNIN_CLASS_REGISTRY_VALUE$
  6442. '**                                UNIN_CLASS_REGISTRY_HIVE$
  6443. '**                                UNIN_CLASS_FILE$
  6444. '**                                UNIN_CLASS_FILE_GROUP$
  6445. '**                                UNIN_CLASS_DIRECTORY$
  6446. '** Returns:   True if worked False otherwise
  6447. '*************************************************************************
  6448. DIM inidir$, s$,Network$
  6449. DIM NodeInstIniFile$,ObjectNum%,lrc&, ObjectPref$
  6450. DIM ObjectTag$, ObjectID$, LastObjectNumber%, dirSym$, temp%
  6451. DIM ObjectName$
  6452. STATIC iniPath$
  6453. STATIC ThisInstallType$
  6454.  
  6455.    'Get the install type
  6456.    Network$ = GetSymbolValue(SYM_NETWORK$)
  6457.    s$ = GetSymbolValue(SYM_SINGLESMARTSUITE$)
  6458.  
  6459.     IF NOT IsNewShell() AND ClassOfObject$ = UNIN_CLASS_ICON$ THEN
  6460.         temp% = INSTR(ObjectPath$, "\")
  6461.         IF LEN(ObjectPath$) > temp%+40 THEN
  6462.             ObjectPath$ = LEFT$(ObjectPath$, temp%+40)
  6463.         END IF
  6464.     END IF
  6465.  
  6466.     'TV: For server and distribution installs don't register any objects
  6467.     IF Network$ = gSERVER$ OR Network$ = gDISTRIBUTION$ THEN EXIT FUNCTION 
  6468.     
  6469.     '** Initialization:
  6470.     IF ThisInstallType$ <> Network$ THEN
  6471.         ThisInstallType$ = Network$
  6472.         '** Built the path to cinstall.ini (in standalone case) 
  6473.         '** or cinstnod.ini (in NODE case)
  6474.         IF Network$ = gNODE$ AND s$ = gSMARTSUITE$ THEN
  6475.             inidir$ = GetSymbolValue(SYM_BASEDIR$)
  6476.             NodeInstIniFile$ = inidir$+"cinstnod.ini"
  6477.             iniPath$ = NodeInstIniFile$
  6478.         ELSEIF Network$ = gNODE$ AND s$ = gSINGLE$ THEN
  6479.             dirSym$ = Reg_GetDirSymbolList(1)       '** First product dir list
  6480.             IF GetListLength(dirSym$) >= 1 THEN
  6481.                 dirSym$ = GetListItem(dirSym$, 1)    '** First directory symbol
  6482.                 inidir$ = GetSymbolValue(dirSym$) 
  6483.             ELSE
  6484.                 inidir$ = GetSymbolValue(SYM_STF_CWDDIR$)
  6485.             END IF
  6486.             NodeInstIniFile$ = inidir$+"cinstnod.ini"
  6487.             iniPath$ = NodeInstIniFile$
  6488.         ELSEIF Network$=gSTANDARD THEN
  6489.             'Get the install directory
  6490.             inidir$ = Lot_GetInstallDir()
  6491.             iniPath$ = MakePath(inidir$,gMISCOBJINI$)
  6492.         END IF
  6493.         'print iniPath$,"IniPath$"
  6494.         '** Construct a list of objects already there
  6495.         PopulateCOBJECTLIST(iniPath$)
  6496.     END IF
  6497.  
  6498.     '** See if the object's already there, if not, write a new object
  6499.     '** and add to List
  6500.  
  6501.     ObjectName$ = FeatureKeyWord$+","+ClassOfObject$+","+ObjectPath$
  6502.     ObjectName$ = NullTrim (ObjectName$)
  6503.    If ISELEMENT(COBJECT(ObjectName$)) = FALSE THEN 
  6504.         gNCOBJECT% = gNCOBJECT% + 1
  6505.         CreateIniKeyValue iniPath$, gMISCINSTALLEDOBJECTS,_
  6506.                     "Object"+LTRIM$(STR$(gNCOBJECT%)), _
  6507.                     ObjectName$,  cmoOverwrite
  6508.                 COBJECT (ObjectName$) = gNCOBJECT%
  6509.     END IF
  6510.  
  6511. END FUNCTION
  6512.  
  6513. '*************************************************************************
  6514. PUBLIC FUNCTION Lot_GetDestDirValueFromInstallini(DestDirSym$) AS STRING
  6515. '**
  6516. '** Purpose:   trims the net lotusapp directory to detect mapping. 
  6517. '** Author:    Thangv, PD, JMD
  6518. '** Arguments: path$ 
  6519. '** Returns:   the modified path
  6520. '*************************************************************************
  6521. DIM DestDirSymVal$, rv%, source$
  6522. DIM gInstallIniFile$,inidir$
  6523. DIM uncvol$, dirPath$
  6524. DIM iniPath$    
  6525.  
  6526.     Lot_GetDestDirValueFromInstallini = ""
  6527.     'Get the install directory
  6528.     'Save initial value since it may change over course of install
  6529.     inidir$ = Lot_GetInstallDir()
  6530.     gInstallIniFile$ = MakePath(inidir$,gINSTALLINI$)
  6531.     iniPath$ = gInstallIniFile$
  6532.     DestDirSymVal$ = GetIniKeyString(iniPath$,_
  6533.                  "Destination Symbols And Values", _
  6534.                  DestDirSym$)
  6535.     IF  DestDirSymVal$ <> "" THEN
  6536.         rv% = DoesDirExist(DestDirSymVal$)
  6537.         IF rv% = 0 THEN
  6538.                 '** TV: shouldn't get here even if destdirSymVal is UNC
  6539.         source$ =  GetSymbolValue(SYM_STF_SRCDIR$)
  6540.                 IF NOT Lot_IsUnvalidatedUNCPath(source$) THEN
  6541.                 DestDirSymVal$ = MID$(source$,1,1)+MID$(DestDirSymVal$,2)
  6542.                 ELSE
  6543.                         Lot_SplitUNCPath source$, uncvol$, dirPath$
  6544.                 DestDirSymVal$ = uncvol$ + MID$(DestDirSymVal$,3)
  6545.                 END IF        
  6546.         rv% = Lot_CleanPath(DestDirSymVal$)
  6547.  
  6548.             IF rv% = 0 THEN
  6549.                   ErrorMsg SID_ERR_NODENETMAP, ""
  6550.                   ERROR STFQUIT
  6551.         END IF
  6552.         END IF
  6553.     END IF
  6554.  
  6555.     Lot_GetDestDirValueFromInstallini = DestDirSymVal$
  6556. END FUNCTION
  6557.  
  6558. '*************************************************************************
  6559. PUBLIC SUB      Lot_WriteCriticalDirectories (InstallInifile$)
  6560. '**
  6561. '** Purpose:   writes out the critical directories for uninstall in 
  6562. '**            cinstall.ini, cinstnod.ini   
  6563. '** Author:    Thangv
  6564. '** Arguments: path to cinstall.ini/cinstnod.ini file 
  6565. '** Returns:   
  6566. '*************************************************************************
  6567.    DIM dirsyms%, gInstallIniFile$, prodDir$, progdir$
  6568.    DIM prodsym$, AllProdNum%, prodNum%, symList$, i%
  6569.  
  6570.       'the path to install.ini
  6571.       gInstallIniFile$ = InstallInifile$
  6572.  
  6573.    's$ = GetSymbolValue(SYM_SINGLESMARTSUITE$)
  6574.  
  6575.       'Loop through the products and log the directories
  6576.       AllProdNum% = 0
  6577.       AllProdNum% = Reg_GetNumberOfProducts()
  6578.       IF AllProdNum% <> 0 THEN
  6579.      'BaseDir$= GetSymbolValue(SYM_BASEDIR$)
  6580.      FOR prodNum%=1 TO AllProdNum%
  6581.         'ProdAcronym$ = Reg_GetProductAcronym(prodNum%)
  6582.         'Get the directory symbol
  6583.         symList$ = Reg_GetDirSymbolList(prodNum%)
  6584.         dirsyms% = GetListLength(symList$)
  6585.         FOR i% = 1 TO dirsyms% 
  6586.         prodsym$ = GetListItem(symList$, i%)
  6587.         progdir$ = GetSymbolValue(prodsym$)
  6588.         CreateIniKeyValue gInstallIniFile$, "Critical Directories", prodsym$, progdir$, cmoOverWrite
  6589.         NEXT
  6590.      NEXT
  6591.       END IF
  6592. END SUB
  6593.  
  6594.  
  6595. PUBLIC FUNCTION GetLastPathComponent( ByVal szPath$) AS STRING
  6596. '**
  6597. '** Purpose:   Returns the last component of a path
  6598. '**
  6599. '** Author:    GJL
  6600. '** Arguments: path 
  6601. '** Returns: The last dir name or file name, empty string if path
  6602. '**          ends in \
  6603. '*************************************************************************
  6604.     DIM offSet&, nextOff&
  6605.  
  6606.     GetLastPathComponent$ = szPath$
  6607.     offSet& = InStr(szPath$,"\")
  6608.     nextOff& = offSet&
  6609.  
  6610.     DO WHILE nextOff& <> 0
  6611.        nextOff = InStr(Mid$(szPath$,offset),"\")
  6612.        offSet& = offSet& + nextOff& 
  6613.  
  6614.     LOOP
  6615.     IF offSet& > 0 THEN
  6616.       GetLastPathComponent$ = Mid$(szPath$,offSet&)
  6617.     END IF
  6618. END FUNCTION
  6619.  
  6620. '*************************************************************************
  6621. FUNCTION Lot_AddToNTSystemPath(RegH&, RegKey$, VarName$, ByVal AddPath$) AS INTEGER
  6622.     DIM NewPath$, notused&, PathDir$
  6623.     DIM RegValLen&, Pos%, Resave%
  6624.  
  6625.     Lot_AddToNTSystemPath = 1
  6626.  
  6627.     If Lot_DoesRegKeyExistEx(RegH&, RegKey$) = FALSE THEN
  6628.         If Lot_RegCreateKeyEx(RegH&, RegKey$) <> 0 Then
  6629.             Lot_AddToNTSystemPath = 0
  6630.             EXIT FUNCTION
  6631.         End If
  6632.         NewPath = ""
  6633.     Else
  6634.         RegValLen&=CLNG(1024)
  6635.         NewPath$=CreateBuffer(RegValLen&)
  6636.         if Lot_GetRegKeyValueEx(RegH&, RegKey$, VarName$,_
  6637.                 REG_EXPAND_SZ&,NewPath$,RegValLen&) <> 0 Then
  6638.             NewPath = ""
  6639.         End If
  6640.     End If
  6641.  
  6642.     NewPath$ = NullTrim(NewPath$)        
  6643.     Resave%=0
  6644.     Do While AddPath$ <> ""
  6645.         Pos%=InStr(AddPath$,";")
  6646.  
  6647.         If Pos=0 Then
  6648.             PathDir$ = AddPath$
  6649.             AddPath = ""
  6650.         Else
  6651.             PathDir$ = Left$(AddPath$, Pos%-1)
  6652.             If RIGHT$(PathDir$,1) = "\" Then
  6653.                 PathDir$ = LEFT$(PathDir$, LEN(PathDir$)-1)
  6654.             End If
  6655.             AddPath = Right$(AddPath$, LEN(AddPath)-Pos%)
  6656.         End If
  6657.  
  6658.         If InStr(NewPath$,PathDir$) = 0 Then
  6659.            If NewPath = "" Then
  6660.                 NewPath=PathDir$
  6661.             Else
  6662.                 NewPath=NewPath$+";"+PathDir$
  6663.             End If
  6664.             Resave%=1
  6665.         End If
  6666.     Loop
  6667.     If Resave%=1 Then
  6668.         If Lot_CreateRegKeyValueEx(RegH&, RegKey$, VarName$,_
  6669.                REG_EXPAND_SZ&,NewPath$,LEN(NewPath$)+1) Then
  6670.             Lot_AddToNTSystemPath = 0
  6671.         End If
  6672.     End If
  6673.  
  6674. END FUNCTION
  6675.  
  6676. '*************************************************************************
  6677. PUBLIC FUNCTION Lot_RegAppPath(ProgName$, szProgPath$, ByVal szSearchPath$, ByVal fCompPath%, ByVal KeyWord$) AS INTEGER
  6678.  
  6679. '** Purpose:   Add application path to registry
  6680. '** Author:    OM
  6681. '** Arguments: 
  6682. '**        ProgName$:        Name of the program file
  6683. '**        szProgPath$:   This is the path of program named above. It
  6684. '**                            may be entered with or without the final '\'
  6685. '**        szSearchPath$: Directories separated by ';' to be added to search
  6686. '**                            path.  Directories should not have final '\'.
  6687. '**        fCompPath:        True if component path should be added to search
  6688. '**                            path.  False if not.
  6689. '**      KeyWord$:        The feature keyword associated with this object.
  6690. '**                            For example, "FLWCORE"
  6691. '**
  6692. '** Returns:   True if worked False otherwise
  6693. '*************************************************************************
  6694.     DIM RegKey$, RegH&, PathDir$, notused&, s$, network$ 
  6695.  
  6696.     szSearchPath$ = NullTrim(szSearchPath$)
  6697.     szSearchPath$ = LTrim(szSearchPath$)
  6698.     If fCompPath% Then
  6699.         network$ = GetSymbolValue(SYM_NETWORK$)
  6700.         IF network$ = gNODE$ THEN
  6701.             s$ = GetSymbolValue(SYM_NETCOMPONENT$)
  6702.         ELSE
  6703.             s$ = GetSymbolValue(SYM_COMPONENTSDIR$)
  6704.         END IF
  6705.         szSearchPath$ = szSearchPath$+";" + s$
  6706.         szSearchPath$ = NullTrim(szSearchPath$)
  6707.         szSearchPath$ = LEFT$(szSearchPath$,LEN(szSearchPath$)-1)
  6708.     End If
  6709.     
  6710.     Lot_RegAppPath = 1
  6711.  
  6712.     RegH&=HKEY_LOCAL_MACHINE&
  6713.     RegKey$=gREGWINNAME+gREGAPPPATH95+"\"+ProgName$
  6714.     If Lot_DoesRegKeyExistEx(RegH&, RegKey$) = FALSE THEN
  6715.         notused&=Lot_RegCreateKeyEx(RegH&, RegKey$)
  6716.     End If
  6717.     If NOT RIGHT$(szProgPath$,1) = "\" Then
  6718.         szProgPath$ = szProgPath$ + "\"
  6719.     End If
  6720.     PathDir$ = szProgPath+ProgName$
  6721.     if Lot_CreateRegKeyValueEx(RegH&,RegKey$,"",_
  6722.             REG_SZ,PathDir$,LEN(PathDir$)+1) OR _
  6723.          Lot_CreateRegKeyValueEx(RegH&,RegKey$,gREGAPPPATH95PATH,_
  6724.             REG_SZ,szSearchPath$,LEN(szSearchPath$)+1) Then
  6725.         Lot_RegAppPath = 0
  6726.     Else
  6727.         RegKey$ = gHLM$+"\"+RegKey$
  6728.         Lot_RegisterObject KeyWord$, UNIN_CLASS_REGISTRY_HIVE$, RegKey$
  6729.     End If        
  6730.  
  6731.     If NOT IsNewShell() Then
  6732.         If Lot_AddToNTSystemPath(HKEY_LOCAL_MACHINE&, _
  6733.             gREGAPPPATHNT1, gREGAPPPATHNTPATH, szSearchPath$) = 0 Then
  6734.             If Lot_AddToNTSystemPath(HKEY_CURRENT_USER&, _
  6735.                 gREGAPPPATHNT2, gREGAPPPATHNTPATH, szSearchPath$) = 0 Then
  6736.                 Lot_RegAppPath = 0
  6737.             Else
  6738.                 RegKey$ = gHCU$+"\"+gREGAPPPATHNTPATH
  6739. '                Lot_RegisterObject KeyWord$, UNIN_CLASS_REGISTRY_HIVE$, RegKey$
  6740.             End If
  6741.         Else
  6742.             RegKey$ = gHCU$+"\"+gREGAPPPATHNTPATH
  6743. '            Lot_RegisterObject KeyWord$, UNIN_CLASS_REGISTRY_HIVE$, RegKey$
  6744.         End If
  6745.     End If
  6746.     If Lot_RegAppPath = 0 Then
  6747.         RegErrorMsg SID_ERR_REG_APPPATH, RegKey$, gREGAPPPATH95PATH, szSearchPath$
  6748.     End If
  6749. END FUNCTION
  6750.  
  6751. DIM FixupDirectorySymbolList LIST AS STRING
  6752.  
  6753. PUBLIC SUB MarkFixupSourceDirSymbol(szSubdirSymbol$)
  6754. '*************************************************************************
  6755. '** Purpose: Adds the symbol to a list of subdirectory symbols that must
  6756. '**    be reset for a node install based on contents of cinstall.ini on the
  6757. '**   server
  6758. '**  
  6759. '** Author: JMDonohue
  6760. '** Arguments:    szSubdirSymbol$    Symbol to reset
  6761. '**************************************************************************
  6762.     if (ISELEMENT(FixupDirectorySymbolList(szSubdirSymbol$)) = 0 ) then _
  6763.         FixupDirectorySymbolList(szSubdirSymbol$) = "Yes"
  6764. END SUB
  6765.  
  6766. PUBLIC SUB Lot_FixupSourceDirectories
  6767. '*************************************************************************
  6768. '** Purpose: Changes the source location for node install files based on 
  6769. '**     the location recorded in the cinstall.ini file on the server
  6770. '**  
  6771. '** Author: JMDonohue
  6772. '** Arguments: 
  6773. '**************************************************************************
  6774.     DIM ret%, s$
  6775.     DIM rc%, Src$, chapter$, Dest$, DirSym$, Sect$
  6776.  
  6777.     FORALL sym IN FixupDirectorySymbolList 
  6778.  
  6779.         chapter$ = Lot_GetFirst("", F_NOTHING)
  6780.         WHILE (chapter$ <> "")
  6781.             DirSym$ = Lot_GetChapterValStr(chapter$, F_DESTDIRSYM)
  6782.             IF DirSym$ = ListTag(sym) AND _
  6783.             INT(Lot_GetChapterValInt(chapter$,F_INOROUT)) = 1 THEN
  6784.                 Src$ = Lot_GetDestDirValueFromInstallIni(DirSym$)
  6785.                 IF Src$ <> "" THEN 
  6786.                 '' Adjust the path to account for an extra product level for the 
  6787.                 '' filename in the node .INF file
  6788.                     Src$ = OneUp(Src$)
  6789.                     IF Src$ = "" THEN GOTO SYMBOLERROR
  6790.                     s$ = GetSymbolValue(SYM_SINGLESMARTSUITE$)
  6791.                     '' For suite, need to remove two levels
  6792.                     IF s$ = gSMARTSUITE$ THEN 
  6793.                         Src$ = OneUp(Src$)
  6794.                         IF Src$ = "" THEN GOTO SYMBOLERROR
  6795.                     END IF
  6796.                     Dest$ = GetSymbolValue(DirSym$)
  6797.                     Sect$ = Lot_GetChapterValStr(chapter$, F_NOTHING)
  6798.                     IF Dest$ <> "" and Sect$ <> "" THEN _
  6799.                         AddSectionFilesToCopyList Sect$, Src$, Dest$
  6800.                 END IF    
  6801.             END IF
  6802.             chapter$ = Lot_GetNext()
  6803.         WEND
  6804.     END FORALL
  6805.     ERASE FixupDirectorySymbolList 
  6806.     EXIT SUB
  6807.  
  6808. SYMBOLERROR:
  6809.     ErrorMsg 0, "Lot_FixupSourceDirectories: invalid symbol: "+DirSym$
  6810. '    ERROR STFQUIT
  6811.  
  6812. END SUB
  6813.  
  6814. PUBLIC FUNCTION Lot_RegIni(RegFileName$) AS INTEGER
  6815. '*************************************************************************
  6816. '** Purpose: Calls SDK program regini.exe to generate registry entries 
  6817. '**     described in script file
  6818. '** NOTE:    Entries in script file have the following format:
  6819. '**    KeyName
  6820. '**    ValueName = value
  6821. '**    e.g.,
  6822. '** \registry\machine\system\currentcontrolset\services\lanmanserver\parameters
  6823. '**      DiskSpaceThreshhold = REG_DWORD 0x00000000 
  6824. '**  
  6825. '** Author: JMDonohue
  6826. '** Arguments: 
  6827. '** RegFileName$    Name of script file for registry creation
  6828. '**************************************************************************
  6829.     Lot_RegIni = Lot_CreateConsoleProcess("regini.exe", RegFileName$)
  6830.     IF Lot_RegIni <> TRUE THEN    _
  6831.        ErrorMsg 0, "Error calling Lot_CreateConsoleProcess for regini.exe"
  6832. END FUNCTION
  6833.  
  6834. '*************************************************************************
  6835. PUBLIC SUB ComboSelChanged(BoxNo&, Inst%)
  6836. '** Purpose:   Handles change in combo box selection
  6837. '** Author:    GL
  6838. '** Arguments: 
  6839. '**        BoxNo%    combo/edit set. IDC_COMBO1 = 1
  6840. '**        Inst%        combo box item
  6841. '**
  6842. '*************************************************************************
  6843.     DIM    uncPath$, fullPath$, dirPath$
  6844.     DIM    curCombo$, uncOff&, unusedPath$
  6845.     DIM    comboBox$, editBox$
  6846.  
  6847.     comboBox = "IDC_COMBO"+Right$(Str$(BoxNo&),1)
  6848.     editBox = "IDC_EDIT"+Right$(Str$(BoxNo&),1)
  6849.  
  6850.     curCombo$ = GetListItem(comboBox, Inst%)
  6851.     fullPath$ = GetListItem("IDC_EDIT",CINT(BoxNo&))
  6852.     Lot_SplitUNCPath fullPath$, uncPath$, dirPath$
  6853.     uncOff& = INSTR(1, curCombo$, "\\") 
  6854.     IF uncOff > 0 THEN
  6855.         Lot_SplitUNCPath MID$(curCombo$, uncOff&), uncPath$, unusedPath$
  6856.     ELSE
  6857.       uncPath$ = ""
  6858.     END IF
  6859.     SetListItem "IDC_EDIT", CINT(BoxNo&), uncPath$ + dirPath$
  6860.     AddListItem SYM_UPDATELIST$, editBox
  6861.     EXIT SUB
  6862. END SUB
  6863.  
  6864. '*************************************************************************
  6865. PUBLIC FUNCTION GetPathFromComboEdit(hDlg&, BoxNo%) AS STRING
  6866. '** Purpose:   Builds path from combo/edit box
  6867. '** Author:    GL
  6868. '** Arguments: 
  6869. '**        hDlg&:    dialog handle
  6870. '**        BoxNo%    combo/edit set. IDC_COMBO1 = 1
  6871. '**
  6872. '** Returns:    Fully qualified path. Empty string on failure
  6873. '*************************************************************************
  6874.     DIM drvSel%, drvPath$, uncPath$, dirPath$, comboBox$
  6875.  
  6876.     comboBox = "IDC_COMBO"+Right$(Str$(BoxNo%),1)
  6877.     drvSel% = ValidateEditBox(hDlg&, BoxNo%)
  6878.   IF drvSel% = 0 THEN
  6879.         GetPathFromComboEdit = ""
  6880.         EXIT FUNCTION
  6881.     END IF
  6882.     Lot_SplitUNCPath GetListItem("IDC_EDIT", BoxNo%), uncPath$, dirPath$
  6883.     IF uncPath$ = "" THEN
  6884.         drvPath = LEFT$(GetListItem(comboBox, drvSel%), 2)
  6885.     ELSE
  6886.         drvPath = ""
  6887.     END IF
  6888.         GetPathFromComboEdit= drvPath$ + uncPath$ + dirPath$
  6889. END FUNCTION
  6890.  
  6891. PUBLIC SUB Lot_RegisterFonts()
  6892. '*************************************************************************
  6893. '** Purpose: Traverses the copy list looking for sections whose destination
  6894. '** directory symbol is "LOTUSFONTSDIR"; for each section, registers all 
  6895. '** font filenames with Windows, using the description corresponding to the
  6896. '** font name in 'shared.ini'
  6897. '** NOTE:    Entries in 'shared.ini' file have the following format:
  6898. '**    FontFileName = Description
  6899. '**    e.g.,
  6900. '**     ngoi____.ttf=News Gothic Italic (TrueType)
  6901. '** NOTE: This function should not be used by clients -- called as part of
  6902. '**    toolkit processing  
  6903. '**  
  6904. '** Author: JMDonohue
  6905. '**************************************************************************
  6906.     DIM s$, szSym$, szSect$, i%, j%, n%, chapter$, DirSym$, gSharedIniFile$ 
  6907.     DIM FontDescList LIST AS STRING
  6908.     DIM FontFile$, FontDesc$, winkey$, FontPath$, ret%, Size%, regStatus&, Key$ 
  6909.  
  6910.     szSym$ = "SECTIONFONTS"
  6911.    gSharedIniFile$ = MakePath(GetSymbolValue(SYM_STF_CWDDIR$), gSHAREDINI$)
  6912.     IF WhatPlatform() = PLATFORM_WIN95 THEN
  6913.         winkey$ = "Windows"
  6914.     ELSE
  6915.         winkey = "Windows NT"
  6916.     END IF
  6917.     Key$ = "SOFTWARE\Microsoft\" + WinKey$ + "\CurrentVersion\Fonts"
  6918.  
  6919.     chapter$ = Lot_GetFirst("", F_INOROUT)
  6920.     WHILE (chapter$ <> "")
  6921.         DirSym$ = Lot_GetChapterValStr(chapter$, F_DESTDIRSYM)
  6922.         IF DirSym$ = SYM_LOTUSFONTSDIR$ THEN 
  6923.             szSect$ = Lot_GetChapterValStr(chapter$, F_NOTHING)
  6924.             n% = FGetSectionFileList (szSym$, szSect$, 1)
  6925.             n% = GetListLength(szSym$)
  6926.             '' For each font in section, strip off path components
  6927.             '' and create list of filenames and descriptions        
  6928.             FOR i% = 1 TO n%
  6929.                 s$ = GetListItem(szSym$, i%) 
  6930.                 IF ISELEMENT(FontDescList(s$)) = FALSE THEN _
  6931.                     FontDescList(s$) = GetIniKeyString(gSharedIniFile$, "Fonts", s$)
  6932.             NEXT
  6933.             RemoveSymbol szSym$
  6934.         END IF
  6935.         chapter$ = Lot_GetNext()
  6936.     WEND
  6937. ' Traverse list, register all font files    
  6938. ' If font name not in database, use font name for description
  6939.     FORALL sym IN FontDescList
  6940.         FontFile$ = ListTag(sym)
  6941.         FontDesc$ = FontDescList(ListTag(sym))
  6942.         IF FontDesc$ = "" THEN FontDesc$ = FontFile$
  6943.         FontPath$ = GetSymbolValue(SYM_LOTUSFONTSDIR$) + FontFile$
  6944.         ret% = AddFontResource(FontPath$)
  6945.         Size% = len(FontPath$) + 1
  6946.         regStatus& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE, _
  6947.             Key$, FontDesc$, REG_SZ, FontPath$, Size%)
  6948.     END FORALL
  6949.     
  6950. END SUB
  6951.  
  6952. PUBLIC CONST LIBFLAG_FRESTRICTED = 1 
  6953. PUBLIC CONST LIBFLAG_FCONTROL = 2 
  6954. PUBLIC CONST LIBFLAG_FHIDDEN = 4 
  6955.  
  6956. Declare Function ltyplib Lib "OLEAUT32" Alias "LoadTypeLib" (Byval t As  Unicode String,  j As Long ) As Long
  6957. Declare Function rtyplib Lib "OLEAUT32" Alias "RegisterTypeLib" (Byval a As Long, Byval b As Unicode String, Byval c As Unicode String) As Long
  6958.  
  6959. PUBLIC FUNCTION New_RegisterTypeLib( typelibname as string, helpdir as string ) as long
  6960. ' Does registration for a type library, returns zero if successful
  6961. ' Originally by Scott Matsimoto
  6962.     Dim typlib As Long
  6963.     Dim hresult As Long
  6964.     typlib = 0
  6965.     
  6966.     hresult = ltyplib( typelibname, typlib)
  6967.     if hresult = 0 then
  6968.         hresult = rtyplib( typlib, typelibname, helpdir)
  6969.     end if
  6970.  
  6971.     New_RegisterTypeLib = hresult
  6972.     
  6973. END FUNCTION
  6974.  
  6975. PUBLIC FUNCTION Lot_RegisterTypeLib(ID$, Version$, Description$, helppath$, filename$, flags%) AS INTEGER
  6976. '*************************************************************************
  6977. '** Purpose: Creates necessary registry entries for Type Libraries
  6978. '**  
  6979. '** Arguments: 
  6980. '**        ID$                ID, "29130064-2EED-1069-BF5D-00DD011186B7", e.g. 
  6981. '**        Version$            Version
  6982. '**        Description$    Description
  6983. '**        helppath$        Pathname of directory containing help files
  6984. '**        filename$        Fully qualified name of file
  6985. '**        flags%            See below(default is 0):
  6986. '**  
  6987. '**  Flag Value            Description
  6988. '**  LIBFLAG_FCONTROL    The type library describes controls and should not be 
  6989. '**                              displayed in type browsers intended for nonvisual objects.
  6990. '**  LIBFLAG_FRESTRICTED    The type library is restricted and should not
  6991. '**                              be displayed to users.
  6992. '**  LIBFLAG_FHIDDEN        The type library should not be displayed to users, 
  6993. '**                              although its use is not restricted. To be used by
  6994. '**                              controls; hosts should create a new type library that
  6995. '**                              wraps the control with extended properties.
  6996. '**
  6997. '** Returns:    TRUE if successful, FALSE otherwise
  6998. '**  
  6999. '** Author: JMDonohue
  7000. '**************************************************************************
  7001.     DIM key$, s$, flagstr$
  7002.     DIM LReturn& 
  7003.     
  7004.     key$ = "Typelib\" + ID$ + "\" + Version$
  7005.     LReturn& = Lot_CreateRegKeyValueEx(HKEY_CLASSES_ROOT, key$,_
  7006.          "", REG_SZ, Description$,  LENBP(Description$)+1)
  7007.     IF LReturn& <> ERROR_SUCCESS THEN GOTO FAILED
  7008.     s$ = key$ + "\" + "0\win32"
  7009.     LReturn& = Lot_CreateRegKeyValueEx(HKEY_CLASSES_ROOT, s$,_
  7010.          "", REG_SZ, filename$,  LENBP(filename$)+1)
  7011.     IF LReturn& <> ERROR_SUCCESS THEN GOTO FAILED
  7012.     s$ = key$ + "\" + "HELPDIR"
  7013.     LReturn& = Lot_CreateRegKeyValueEx(HKEY_CLASSES_ROOT, s$,_
  7014.          "", REG_SZ, helppath$,  LENBP(helppath$)+1)
  7015.     IF LReturn& <> ERROR_SUCCESS THEN GOTO FAILED
  7016.     s$ = key$ + "\" + "FLAGS"
  7017.     flagstr$ = CStr(flags%)
  7018.     LReturn& = Lot_CreateRegKeyValueEx(HKEY_CLASSES_ROOT, s$,_
  7019.          "", REG_SZ, flagstr$,  LENBP(flagstr$)+1)
  7020.     IF LReturn& <> ERROR_SUCCESS THEN GOTO FAILED
  7021.     Lot_RegisterTypeLib = TRUE
  7022.     EXIT FUNCTION
  7023.  
  7024. FAILED:
  7025.     Lot_RegisterTypeLib = FALSE
  7026. END FUNCTION    
  7027.  
  7028. PUBLIC FUNCTION OneUp(s$) AS STRING
  7029. '*************************************************************************
  7030. '**    Purpose: Removes the last element of a filename
  7031. '**     e.g. d:\lotus\compnent ==> d:\lotus\
  7032. '**            
  7033. '** Author:    JMDonohue
  7034. '** Arguments: s$    string to strip
  7035. '** Returns: stripped string or null string if invalid
  7036. '**     
  7037. '*************************************************************************
  7038. DIM i%
  7039.     i% = Len(s$) - 1    'Assume last character is \
  7040.     DO 
  7041.         i% = i% - 1
  7042.         IF i% = 0 THEN
  7043.             ErrorMsg 0, "Toolkit:OneUp: String does not contain \: "+s$
  7044.             OneUp = ""
  7045.             EXIT FUNCTION
  7046.         END IF
  7047.     LOOP    UNTIL Mid(s$, i%, 1) = "\"
  7048.     OneUp =  Mid(s$, 1, i%)
  7049. END FUNCTION    
  7050.  
  7051.  
  7052. PUBLIC FUNCTION Lot_AreAnyNodeOptionsAvail() AS INTEGER
  7053. '*************************************************************************
  7054. '**Purpose:Determine whether any node options are available
  7055. '**for the products selected.
  7056. '**
  7057. '**Returns:TRUE if any options are available
  7058. '**        FALSE if none
  7059. '**
  7060. '**Autor:GLutz
  7061. '*************************************************************************
  7062. DIM AllProdNum%,AllOptNum%,prodNum%,chpt$
  7063.  
  7064.   Lot_AreAnyNodeOptionsAvail = FALSE
  7065.  
  7066.   'Loop through the products and find the avail node options
  7067.   AllProdNum% = 0
  7068.   AllProdNum% = Reg_GetNumberOfProducts()
  7069.   IF AllProdNum% <> 0 THEN
  7070.     'Loop through the products
  7071.     FOR prodNum%=1 TO AllProdNum%
  7072.       AllOptNum% = 0      
  7073.       AllOptNum% = Lot_GetNumOfNodeOptAvailToNodeForProd(prodNum%)
  7074.       IF AllOptNum% <> 0 THEN
  7075.         chpt$ = Lot_GetChapterFromKeyword(Reg_GetProductAcronym(prodNum%)_
  7076.                 + gTOP$)
  7077.         IF (INT(Lot_GetChapterValInt(chpt$,F_INOROUT)) = 1) THEN
  7078.           Lot_AreAnyNodeOptionsAvail = TRUE
  7079.           EXIT FUNCTION
  7080.         END IF
  7081.       END IF
  7082.     NEXT
  7083.   END IF
  7084. END FUNCTION
  7085.  
  7086. '***********************************************************************
  7087. PUBLIC FUNCTION RemovePriorVersion(ProdRegKeyName$,ProdVer$) AS INTEGER
  7088. '**
  7089. '**Removes previous installations of 32 bit product versions.
  7090. '**
  7091. '**Parameters:
  7092. '**                        ProdRegKeyName$:Product's registry name (WordPro)
  7093. '**                        ProdVer$:Version to be remove (96.0)
  7094. '**
  7095. '**
  7096. '**
  7097. DIM prodCount%, i%, status&, RegKey$, PlatformStr$
  7098. DIM cmdLine$, dwStatus&, cbBuf&, exeName$, newCmdLine$
  7099. STATIC cmdBuf(10) AS STRING, cmdCount%
  7100.  
  7101.   IF ProdRegKeyName$ = "begin" AND _
  7102.      ProdVer$ = "execution" THEN
  7103.     FOR i% = 0 TO cmdCount%
  7104.       '***This call launches uninstall
  7105.       '***dwStatus should be STILL_ACTIVE(259)
  7106.       dwStatus& = Lot_ExecUninstall(cmdBuf(i%))
  7107.           WHILE dwStatus& = STILL_ACTIVE
  7108.         dwStatus& = Lot_ExecUninstall("")
  7109.       WEND
  7110.     NEXT
  7111.   ELSEIF ProdRegKeyName$ = "reset" AND _
  7112.          ProdVer$ = "buffer" THEN
  7113.     cmdCount% = 0
  7114.   ELSE
  7115.     exeName$ = "lunin10.exe"
  7116.     PlatformStr$ = gREGWINNAME
  7117.  
  7118.     RegKey$=PlatformStr$+"\Uninstall\"+ProdRegKeyName$+" V"+ProdVer$
  7119.  
  7120.     '** returns ERROR_SUCCESS (0) 
  7121.     status& = Lot_GetRegKeyValueEx(HKEY_LOCAL_MACHINE,RegKey$,_
  7122.               "UninstallString",dwStatus&,cmdLine$,cbBuf&)
  7123.  
  7124.     IF status& = ERROR_SUCCESS THEN
  7125.       cmdLine$ = NullTrim(cmdLine$)
  7126. '***for dev purposes don't use automated uninstall
  7127.         cmdBuf(cmdCount%) = MID$(cmdLine$,INSTR(1,cmdLine$,_
  7128.                         exeName$,1)) + " /A upgrade.rsp /S"
  7129.         'cmdLine$ = MID$(cmdLine$,INSTR(1,cmdLine$,exeName$,1))
  7130.     cmdCount% = cmdCount% + 1
  7131.       END IF
  7132.   END IF
  7133. END FUNCTION
  7134.  
  7135. PUBLIC SUB IncrementSharedDLLCount(s$)
  7136. '****************************************************************************
  7137. '** Purpose: Increments the shared dll count in registry.
  7138. '**
  7139. '** Author:  JGHAZAL, JMD
  7140. '** Arguments: s$     shared file fully qualified pathname
  7141. '**
  7142. '****************************************************************************
  7143. DIM regStatus&, subkey$, Descnum as variant, nsize&, Descnum2&
  7144.  
  7145.     subkey$ = "SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDLLs"
  7146.     nsize& = 4
  7147.  
  7148.     IF Lot_GetRegKeyValueEx(HKEY_LOCAL_MACHINE, subkey$, s$, REG_DWORD, Descnum, nsize&) = 0 THEN
  7149.         Descnum2& = val(Descnum) + 1
  7150.     ELSE
  7151.         Descnum2& = 1
  7152.     END IF
  7153.     regStatus& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE, subkey$, s$, REG_DWORD, Descnum2&, nsize&)
  7154.  
  7155. END SUB
  7156.  
  7157.