home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 January / pcwk_01_1999_B.iso / Lotus123 / ITALIAN / INSTALL.DSK / SHARE32.LSS < prev    next >
Text File  |  1996-05-24  |  70KB  |  1,822 lines

  1. ''   Module Name:    share32.lss
  2. ''
  3. ''   Module Code:    TOOLKIT
  4. ''
  5. ''   Author:         MZ              
  6. ''
  7. ''   Creation Date:  Apr 12, 1995
  8. ''
  9. ''   Copyright Lotus Development Corporation, (c) 1991
  10. ''
  11. ''
  12. ''  
  13. ''   Description: 
  14. ''     Lotus script file for common install
  15. ''  
  16. ''
  17. ''   Additional authors:
  18. ''
  19. ''   Change History:
  20. ''   $Log:   //CIT/VOL1/CFLOG/logfiles/cominst/toolkit/share32@.lss  $
  21. '' 
  22. ''    Rev 1.89   24 May 1996 15:54:34   jdonohue
  23. '' Added code to uninstall "Fills" HCU key as shared component
  24. '' 
  25. ''    Rev 1.88   20 May 1996 14:33:02   jdonohue
  26. '' Only copy shared components to node if on server AND in copy list
  27. '' 
  28. ''    Rev 1.87   17 May 1996 12:03:12   jdonohue
  29. '' Ref SPR: RWIS35JHBH
  30. '' Added backslash to Chart "Style Directory" key and Spell "Data Path"
  31. '' Added backslash for HLM\S\L\C\LocalPath, Network Path and HCU\S\L\C\User Path
  32. '' 
  33. ''    Rev 1.86   15 May 1996 11:29:38   jdonohue
  34. '' Added special processing for Thesaurus data path registry key
  35. '' Changed filename "LTCHEN20.DLL" to "LTCHEN21.DLL"
  36. '' 
  37. ''    Rev 1.85   07 May 1996 16:07:54   jdonohue
  38. '' Ref SPR:    CDWT34YRNF
  39. '' Fixed error with LOTUSUSERDIR source not being set if not in cinstall.ini
  40. '' 
  41. ''    Rev 1.84   02 May 1996 17:02:28   jdonohue
  42. '' Added uninstall object for System Services registry hive created
  43. '' Fixed filename LTSIN31.DLL (was LTSIN30.DLL)
  44. '' 
  45. ''    Rev 1.83   12 Apr 1996 15:43:06   jdonohue
  46. '' Ref SPR:  LSCR34KT6H
  47. '' Added Append argument to Lot_CreateAndRegisterUserSubdir and Lot_CreateUserRegistryEntry 
  48. '' which if true will first check for an existing registry entry, and if value
  49. '' not found in semi-colon delimited list, will add it
  50. '' 
  51. ''    Rev 1.82   01 Apr 1996 13:20:08   jdonohue
  52. '' Fixed error in setting COMPONENTSDIR -- extra backslash
  53. '' 
  54. ''    Rev 1.81   28 Mar 1996 10:20:26   jdonohue
  55. '' Ref SPR: MAS33WPUU
  56. '' Added System Services value ADPT=LTLRN31.DLL
  57. '' Changed System Services version to 3.1 
  58. '' 
  59. ''    Rev 1.80   25 Mar 1996 12:47:58   jdonohue
  60. '' Ref SPR: SBRR33SSBY 
  61. '' Test DoesDirExist not FALSE, since its return value is not equal to script TRUE
  62. '' 
  63. ''    Rev 1.79   12 Mar 1996 16:06:54   jdonohue
  64. '' Added function Lot_CreateUserRegistryEntry
  65. '' Don't write HLM "LocalPath" for node
  66. '' Removed obsolete function Lot_WriteKey
  67. '' 
  68. ''    Rev 1.78   07 Mar 1996 11:30:34   jdonohue
  69. '' Set SYM_EXISTINGLOCALPATH$ based on HCU "Local Path" value for node to support
  70. '' multi-user configurations
  71. '' 
  72. ''    Rev 1.77   04 Mar 1996 08:32:02   jdonohue
  73. '' Remove 16 bit shared component support -- pass 1 : eliminate LOTUSAPP
  74. '' 
  75. ''    Rev 1.76   26 Jan 1996 13:40:18   cmoy
  76. '' HISHI: Merged FE changes
  77. '' 
  78. ''    Rev 1.75   25 Jan 1996 16:41:00   jdonohue
  79. '' Make entries for shared components for Suite so that Suite uninstall will not
  80. '' complain about unknown shared components
  81. '' 
  82. ''    Rev 1.74   22 Dec 1995 10:13:40   jdonohue
  83. '' Removed all references to SYM_PARENTDIR$ -- is now SYM_BASEDIR$ for all
  84. '' 
  85. ''    Rev 1.73   14 Dec 1995 13:22:40   jdonohue
  86. '' Ref SPR: THAY2XTUPX
  87. '' Added new sub Lot_CreateAndRegisterUserSubdir that creates registry entry for
  88. '' user path in HCU and creates the directory if it does not exist
  89. '' 
  90. ''    Rev 1.72   12 Dec 1995 12:58:50   glutz
  91. '' In InitSHARE32(), replaced IsDriveMapped() with DoesDirExist() when
  92. '' checking existing local path.  SPR# RMOO2XDRJY
  93. '' 
  94. ''    Rev 1.71   08 Nov 1995 17:02:50   tveerapp
  95. '' mariana's fix
  96. '' 
  97. ''    Rev 1.70   Oct 24 1995 16:56:20   cmoy
  98. '' removed eof char
  99. '' 
  100. ''    Rev 1.69   13 Oct 1995 14:42:24   jdonohue
  101. '' Added function Lot_RefreshLocalComponentDir that performs this resetting
  102. '' source directory for sections using symbols COMPONENTSDIR and LOTUSUSERDIR fo
  103. '' node installs
  104. '' 
  105. ''    Rev 1.68   10 Oct 1995 15:27:32   jdonohue
  106. '' Deleted registration of shared components for single product (SPR KHAN2WQMU4)
  107. '' 
  108. ''    Rev 1.67   03 Oct 1995 15:06:50   jdonohue
  109. '' For node, register the help registry entry under the first product
  110. '' 
  111. ''    Rev 1.66   02 Oct 1995 17:22:36   tveerapp
  112. '' Fixed spr for Spell Data path to include spell subdirectory.
  113. '' 
  114. ''    Rev 1.65   29 Sep 1995 14:53:44   tveerapp
  115. '' Fixed Spr#TBAT2WFLYM. If lotus Script or Chart is Installed, SystemServices
  116. '' key is written.
  117. '' 
  118. ''    Rev 1.64   29 Sep 1995 12:05:50   jdonohue
  119. '' Do not write shared component information in cinst???.ini if name or version
  120. '' blank
  121. '' 
  122. ''    Rev 1.63   29 Sep 1995 10:09:28   jdonohue
  123. '' Replace cinstall.ini corrupt message with "Drive not available" message if
  124. '' drive not mapped or UNC path invalid
  125. '' 
  126. ''    Rev 1.62   28 Sep 1995 13:35:32   jdonohue
  127. '' Don't use registry entry for validating existing network path for node
  128. '' 
  129. ''    Rev 1.61   25 Sep 1995 17:21:46   tveerapp
  130. '' Uncommented the changes I had commented out for testing.
  131. '' 
  132. ''    Rev 1.60   25 Sep 1995 15:23:00   tveerapp
  133. '' Fixed Spr# TBAT2VZL3X.  Spell registry entries. Also added code to write
  134. '' to HCU userpath in Lot_WriteLocalNetwork.
  135. '' 
  136. ''    Rev 1.59   25 Sep 1995 10:21:50   tveerapp
  137. '' Fixed spr#DCRP2W7PD7. Lot_WriteLocalNetCompPath was incorrectly writing
  138. '' out NetCompPath for standalone(which is not needed) and registering it for
  139. '' uninstall.
  140. '' 
  141. ''    Rev 1.58   Sep 25 1995 09:53:30   cmoy
  142. '' Added function Lot_RegisterHelpFile to add help files to registry and create
  143. '' entry in cinstall.ini for uninstall. Set value of symbol LOTUSUSERDIR to 
  144. '' point to components directory. Do not write dependencies to registry for NODE
  145. '' install
  146. '' 
  147. ''    Rev 1.57   22 Sep 1995 14:53:26   tveerapp
  148. '' Fixed the typ in SytemServices key.Spr#DCRP2WBJSE
  149. '' 
  150. ''    Rev 1.56   21 Sep 1995 18:12:26   tveerapp
  151. '' Fixed spr# TLAN2W7JNX. Registry entries for  Mobil Player.
  152. '' 
  153. ''    Rev 1.55   19 Sep 1995 17:39:20   tveerapp
  154. '' Added special registry processing for Chart in Lot_WriteShare32Registry().
  155. '' 
  156. ''    Rev 1.54   15 Sep 1995 16:55:02   amontalv
  157. '' Check for UNC path before changing drive.
  158. '' 
  159. ''    Rev 1.53   13 Sep 1995 17:46:06   jdonohue
  160. '' Use top section of first product to register directories for uninstall
  161. '' 
  162. ''    Rev 1.52   13 Sep 1995 16:05:24   jdonohue
  163. '' IsDriveMapped returns true only for fixed or remote drive that exists
  164. '' 
  165. ''    Rev 1.51   12 Sep 1995 11:00:24   tveerapp
  166. '' Changes in Lot_Write32Registry for writing to cinstnod.ini for a node install
  167. '' 
  168. ''    Rev 1.50   12 Sep 1995 10:34:52   jdonohue
  169. '' Create local and network component path if they don't exist, and register 
  170. '' them as objects for uninstall
  171. '' 
  172. ''    Rev 1.49   11 Sep 1995 15:58:50   jdonohue
  173. '' IsDriveMapped checks for UNC volumes that directory exists
  174. '' 
  175. ''    Rev 1.48   09 Sep 1995 16:43:24   tveerapp
  176. '' Fixed the suite node problem. Set the SYM_NETCOMPONENT symbol if a clean 
  177. '' path is found with the currently mapped drive.
  178. '' 
  179. ''    Rev 1.47   06 Sep 1995 09:22:30   tveerapp
  180. '' Fixed the suite node install problem.
  181. '' 
  182. ''    Rev 1.46   01 Sep 1995 15:14:00   jdonohue
  183. '' Resourced string for drive not mapped error
  184. '' 
  185. ''    Rev 1.45   01 Sep 1995 12:18:34   jdonohue
  186. '' Don't register HLM\lotus\prod\ver\Components\comp\ver for suite
  187. '' 
  188. ''    Rev 1.44   31 Aug 1995 11:44:34   jdonohue
  189. '' Added function IsDriveMapped to determine if drive letter is mapped and 
  190. '' available
  191. '' Only exit for non-available NetWorkPath if NODE install
  192. '' 
  193. ''    Rev 1.43   29 Aug 1995 10:52:18   jdonohue
  194. '' Check all drives for validating SYM_COMPONENTSDIR$
  195. '' 
  196. ''    Rev 1.42   28 Aug 1995 16:14:54   jdonohue
  197. '' Change help file procesing logic
  198. '' Popup message if shared component drive not mapped and exit
  199. '' 
  200. ''    Rev 1.42   28 Aug 1995 13:31:08   jdonohue
  201. '' Change help file procesing logic
  202. '' Popup message if shared component drive not mapped and exit
  203. '' 
  204. ''    Rev 1.40   25 Aug 1995 17:04:48   jdonohue
  205. '' Added support for node help file registration
  206. '' 
  207. ''    Rev 1.39   25 Aug 1995 16:04:04   jdonohue
  208. '' Take out print for failure to find destination path -- could happen for node
  209. '' 
  210. ''    Rev 1.38   24 Aug 1995 15:58:14   jdonohue
  211. '' Added help file registration to shared component processing
  212. '' 
  213. ''    Rev 1.35   23 Aug 1995 08:15:58   jdonohue
  214. '' Added helpfilename to shared database, read filename for language from 
  215. '' shared.ini
  216. '' 
  217. ''    Rev 1.34   21 Aug 1995 15:41:06   amontalv
  218. '' Put name of registry keys into globals.lss
  219. '' 
  220. ''    Rev 1.33   21 Aug 1995 15:15:54   jdonohue
  221. '' Consolidated share section building for different types
  222. '' 
  223. ''    Rev 1.32   16 Aug 1995 20:33:34   amontalv
  224. '' Added code to do error messages for registry.
  225. '' 
  226. ''    Rev 1.31   14 Aug 1995 15:08:36   tveerapp
  227. '' Removed the win.ini entry for teammail because the vim-over mapi has gone
  228. '' away.
  229. '' 
  230. ''    Rev 1.30   11 Aug 1995 09:31:54   jdonohue
  231. '' Don't write DLL name for component
  232. '' 
  233. ''    Rev 1.29   01 Aug 1995 14:54:20   jdonohue
  234. '' Removed extraneous set of quotes on version string
  235. '' 
  236. ''    Rev 1.28   24 Jul 1995 09:24:58   jdonohue
  237. '' Increment length for traling null in call to Lot_CreateRegKeyValueEx
  238. '' 
  239. ''    Rev 1.27   18 Jul 1995 11:08:00   jdonohue
  240. '' Make the shared component entry for the product/version
  241. '' 
  242. ''    Rev 1.26   17 Jul 1995 17:28:02   tveerapp
  243. '' Added code to Lot_WriteShare32registry to write into the win.ini for 
  244. '' TeamMail.
  245. '' 
  246. ''    Rev 1.25   17 Jul 1995 16:50:14   amontalv
  247. '' Changed code for registering dialog editor.
  248. '' 
  249. ''    Rev 1.24   17 Jul 1995 16:41:14   amontalv
  250. '' Added registration for dlg editor
  251. '' 
  252. ''    Rev 1.23   17 Jul 1995 15:36:24   amontalv
  253. '' Added Lot_AddLinkToFolder to add Dialog Editor in correct location.
  254. '' 
  255. ''    Rev 1.22   20 Jun 1995 17:42:50   mzgripce
  256. '' use trimendslash before calling the createregkeyval
  257. '' 
  258. ''    Rev 1.21   19 Jun 1995 19:10:40   mzgripce
  259. '' do the share32 operations only if share32 are supported 
  260. '' 
  261. ''    Rev 1.20   16 Jun 1995 15:34:50   cmoy
  262. '' mariana fixed registration for flw build
  263. '' 
  264. ''    Rev 1.19   15 Jun 1995 18:08:54   mzgripce
  265. '' attempt to fix local/network Path in Win95 registry
  266. '' 
  267. ''    Rev 1.18   12 Jun 1995 18:14:46   mzgripce
  268. '' populate the inifilename
  269. '' 
  270. ''    Rev 1.17   12 Jun 1995 18:05:26   mzgripce
  271. '' added fileininame and fix Dependents writing when tere are no dependents
  272. '' 
  273. ''    Rev 1.16   08 Jun 1995 17:04:00   mzgripce
  274. '' write WIN32 Shared Component Information in cinstall.ini for uninstall
  275. '' 
  276. ''    Rev 1.15   07 Jun 1995 18:56:16   mzgripce
  277. '' register the dependents for the components 
  278. '' 
  279. ''    Rev 1.14   07 Jun 1995 17:38:10   tveerapp
  280. '' For suite server install get the componentsdir value from response file
  281. '' for automation. The change is in InitShare32.
  282. '' 
  283. ''    Rev 1.13   07 Jun 1995 16:33:32   mzgripce
  284. '' fix the registry after the new script integration 
  285. '' 
  286. ''    Rev 1.12   06 Jun 1995 17:30:12   tveerapp
  287. '' ADDED check for single product server install in InitShare32.
  288. '' 
  289. ''    Rev 1.11   06 Jun 1995 16:44:44   tveerapp
  290. '' Added Code to InitShare32 to read in the COMPONENTSDIR from the
  291. '' response file for a single products server install (automated).
  292. '' 
  293. ''    Rev 1.10   06 Jun 1995 15:59:12   amontalv
  294. '' We are experiencing problems with LotusScript when we fill buffers with
  295. '' nulls and then pass them to C routines.  For the time being, it is suggested
  296. '' that we fill our buffers with spaces.  To this end (and to make it
  297. '' easier to change back later) I have created a small LotusScript routine
  298. '' named CreateBuffer.  You use it any time you ordinarily would use
  299. '' STRING$(num, 0).  CreateBuffer() just needs the num, it decides what to
  300. '' fill the buffer with (sorry about the grammer).  Right now it fill the
  301. '' buffer with spaces.  Later we will change it back to nulls.  Also look
  302. '' at the routine NullTrim().  It will get rid of final nulls and spaces.
  303. '' You can use this when getting a buffer that has been changed or filled
  304. '' in a external C routine.
  305. '' 
  306. ''    Rev 1.9   05 Jun 1995 18:03:08   tveerapp
  307. '' Modified InitShare32. Removed the check foe automated install.
  308. '' Initshare32 does the same processing for all kinds of
  309. '' install.
  310. '' 
  311. ''    Rev 1.8   04 Jun 1995 16:32:14   mzgripce
  312. '' debig populate and write to the registry 
  313. '' 
  314. ''    Rev 1.7   01 Jun 1995 15:40:50   mzgripce
  315. '' enable the registry calls and populate the datadriver struc
  316. '' 
  317. ''    Rev 1.6   22 May 1995 19:16:02   mzgripce
  318. '' read from the registry if the components directory already exists 
  319. '' 
  320. ''    Rev 1.5   21 May 1995 17:25:52   mzgripce
  321. '' set the component default value differently 
  322. '' 
  323. ''    Rev 1.4   16 May 1995 17:09:00   glutz
  324. '' Changed USE to AUTOMATE
  325. '' 
  326. ''    Rev 1.3   13 May 1995 16:59:44   mzgripce
  327. '' added Lot_Save32ShareConfig... function and Populate32SharedData subroutine
  328. '' 
  329. ''    Rev 1.2   03 May 1995 18:16:14   mzgripce
  330. '' move some functions from share.lss and debug the syntax errors 
  331. '' 
  332. ''    Rev 1.1   17 Apr 1995 16:47:38   mzgripce
  333. '' add more functionality
  334. '' 
  335. ''    Rev 1.0   13 Apr 1995 11:23:46   mzgripce
  336. '' Initial Revision
  337. '' 
  338. ''    Rev 1.0   13 Apr 1995 11:00:02   mzgripce
  339. '' Initial Revision
  340. '' 
  341. '' 
  342. ''----------------------------------------------------------------------
  343. USE "AUTOMATE"
  344. OPTION DECLARE
  345.  
  346. 'Global variables
  347. PUBLIC gLotusIniPath AS STRING
  348. PUBLIC gLotusappIniPath AS STRING
  349. PUBLIC gLotusBcfDir AS STRING
  350. PUBLIC gLotusappDir AS STRING
  351. PUBLIC g32DataLensInstalled AS INTEGER
  352.  
  353. 'Global Functions
  354. DECLARE PUBLIC FUNCTION InitSHARE32 () AS INTEGER
  355. DECLARE PUBLIC FUNCTION ConfigSHARE32 () AS INTEGER
  356. DECLARE PUBLIC FUNCTION AddSHARE32Icons () AS INTEGER
  357. DECLARE PUBLIC FUNCTION Lot_LocalGetPathFromIni(szFile$,szSect$,szKey$,nullflag%,invalidpathflag%) AS STRING
  358. DECLARE PUBLIC FUNCTION Lot_GetLotusiniPath (s$) AS INTEGER
  359. DECLARE PUBLIC FUNCTION Lot_GetSharedIniPathName() AS STRING
  360. DECLARE PUBLIC FUNCTION Lot_GetLotusappiniPath (s1$, s2$,s3$) AS INTEGER
  361. DECLARE PUBLIC FUNCTION IsDriveMapped(szPath$) AS INTEGER
  362. DECLARE PUBLIC SUB Lot_RegisterHelpFile(szKey$, szDir$, FileName$)
  363. DECLARE PUBLIC FUNCTION Lot_RefreshLocalComponentDir () AS INTEGER
  364.  
  365.  
  366. 'Local Functions
  367. DECLARE FUNCTION Lot_GetAllShared32Installed () AS INTEGER
  368. DECLARE FUNCTION Lot_WriteRegistryLocalNetworkPath() AS INTEGER
  369. DECLARE FUNCTION Lot_Save32ShareConfigInInstallIni() AS INTEGER
  370. DECLARE SUB Populate32SHAREDDATA
  371. DECLARE SUB Lot_WriteShare32InTheRegistry
  372. DECLARE SUB PopupMappingErrorMsgExit(szPath$)
  373. DECLARE SUB Lot_CreateAndRegisterUserSubdir(szSubKey$, szValueName$, LocCompPath$, bAppend%)
  374. DECLARE SUB Lot_CreateUserRegistryEntry(szSubKey$, szValueName$, Value$, bAppend%)
  375.  
  376.  
  377. 'Data Structure
  378.  
  379. '******************** Win 32 Shared features data driver *********
  380. TYPE WIN32SHARED
  381.    SharedIniWin32SecName      AS STRING
  382.    Win32ComponentName         AS STRING
  383.    ListOfFilesInWin32Section  AS STRING    'List
  384.    DestSubdir                 AS STRING
  385.    INFSharedKey               AS STRING
  386.    ListOfINFSectionKeywords   AS STRING    'List
  387.    IniFileName                AS STRING
  388.    IniSectionName             AS STRING
  389.    IniEntryName               AS STRING
  390.    KeyFileName                AS STRING
  391.    HelpFileNames              AS STRING    'List
  392.    RegistrationKey            AS STRING    
  393.    Version                    AS STRING
  394.    ListOfDependsOnNames       AS STRING
  395.    ListOfDependsOnVers        AS STRING
  396. END TYPE
  397.  
  398. DIM Shared32Data(gMaxNumOfSharedKeywords) AS WIN32SHARED
  399. DIM Shared32DataCount AS INTEGER        'The current number of structs
  400.  
  401.  
  402. DIM SectTypeList LIST AS STRING
  403. SUB Initialize
  404.     SectTypeList(1) = "Program"
  405.     SectTypeList(2) = "User"
  406.     SectTypeList(3) = "Data"
  407.     SectTypeList(4) = "Filters"
  408. END SUB
  409.  
  410. PUBLIC FUNCTION InitSHARE32 () AS INTEGER
  411. '** Purpose:    Initialize COMPONENTSDIR$ destination
  412. '**             symbols 
  413. '**             and for automated install 
  414. '**              sets SYM_AUTO_COMPONENTSDIR$
  415. '** Author:     MZ                             
  416. '** Arguments:  None
  417. '** Returns:    SUCCESS
  418. '*************************************************************************
  419.    DIM componentsDir$, possibleDrv$
  420.    DIM availSpace&, network$, cwd$, gInstallIniFile$, rc%, netComponent$
  421.    DIM netComponentIni$, keyvalue$
  422.    DIM rv%, notused%, SameFlag$
  423.    DIM source$, FLWPath$, drive$, RCDialog$, AutoLotusapp$
  424.    DIM KeyHandle&, RegKeyReturn&,AutoComponents$,CompPathLen&
  425.    DIM ExistingLocalPath$, ExistingNetworkPath$
  426.  
  427.    CompPathLen&=CLNG(1024)
  428.    ExistingLocalPath$ = CreateBuffer(1024)
  429.    ExistingNetworkPath$ = CreateBuffer(1024)
  430.    'print "ExistingLocalPath$" ,ExistingLocalPath$
  431.    'print "CompPathLen&",CompPathLen&
  432.   
  433.    '** Execute the rest only if there is a registered product that supports 
  434.    '** share32; Prods(i%)Share32=1
  435.     InitSHARE32 = SUCCESS
  436.    IF Lot_AreShare32ToolsSupported() <> 1 THEN EXIT FUNCTION
  437.  
  438.     network$ = GetSymbolValue(SYM_NETWORK$)
  439.  
  440.     'Get the local and network paths from the registry if they exist
  441.     '***************************************************************
  442.     '** Standard takes its value from HLM\SOFTWARE\Lotus\components\LocalPath
  443.     '** Node takes its value from HCU\SOFTWARE\Lotus\components\User Path
  444.     SELECT CASE network$
  445.    CASE gSTANDARD$ 
  446.      keyvalue$ = "LocalPath"
  447.      RegKeyReturn& =  Lot_GetRegKeyValueEx(HKEY_LOCAL_MACHINE, gREGLOTUSCOMP, keyvalue$, 0, _
  448.             ExistingLocalPath$, CompPathLen&)
  449.    CASE gNODE$ 
  450.      keyvalue$ = "User Path"
  451.      RegKeyReturn& =  Lot_GetRegKeyValueEx(HKEY_CURRENT_USER, gREGLOTUSCOMP, keyvalue$, 0, _
  452.             ExistingLocalPath$, CompPathLen&)
  453.     END SELECT 
  454.     'print "afer calling Lot_GetRegKeyValueExRegKeyReturn&,",RegKeyReturn&
  455.     ExistingLocalPath$=NullTrim(ExistingLocalPath$)
  456.     ExistingLocalPath$ = Lot_TrimEndSlash(ExistingLocalPath$)
  457.     'print "ExistingLocalPath$,CompPathLen&  **"+ExistingLocalPath$+"**",CompPathLen&
  458.     IF RegKeyReturn& = ERROR_SUCCESS AND _
  459.       DoesDirExist(ExistingLocalPath$) <> FALSE THEN
  460.         SetSymbolValue SYM_EXISTINGLOCALPATH$, ExistingLocalPath$+"\"
  461.     ELSE
  462.         ExistingLocalPath$ = ""
  463.     END IF
  464.  
  465.     'print "before calling Lot_GetRegKeyValueEx"
  466.     RegKeyReturn& = Lot_GetRegKeyValueEx(HKEY_LOCAL_MACHINE,_
  467.         gREGLOTUSCOMP,_
  468.         "NetworkPath",REG_SZ, _
  469.         ExistingNetworkPath$, _
  470.         CompPathLen&)
  471.     'print "afer calling Lot_GetRegKeyValueExRegKeyReturn&,",RegKeyReturn&
  472.     IF RegKeyReturn& = ERROR_SUCCESS THEN
  473.         ExistingNetworkPath$=NullTrim(ExistingNetworkPath$)
  474.         ExistingNetworkPath$= Lot_TrimEndSlash(ExistingNetworkPath$)+"\"
  475.         'print ExistingNetworkPath$,"ExistingNetworkPath$ share32.lss"
  476.         SetSymbolValue SYM_EXISTINGNETPATH$, ExistingNetworkPath$
  477.     ELSE
  478.         SetSymbolValue SYM_EXISTINGNETPATH$, ""
  479.     END IF
  480.  
  481.     'Built the default components directory location
  482.     '************************************************
  483.     '    IN Standalone OR node single product
  484.     '       preexisting one  OR
  485.     '       ParentDir+gCOMPONENET
  486.     '    IN Standalone OR node suite
  487.     '       preexisting one  OR
  488.     '       BaseDir+gCOMPONENET
  489.     '    IN Server single product
  490.     '       ParentDir+gCOMPONENET
  491.     '    IN Server suite
  492.     '       BaseDir+gCOMPONENET
  493.     '    IN Distribution single product OR suite
  494.     '       Do not set components directory
  495.     'print "building the default components dir; ExistingLocalPath$=",ExistingLocalPath$
  496.  
  497.     IF ExistingLocalPath$ <> "" THEN
  498.         IF (network$ = gSTANDARD$ OR network$ = gNODE$) THEN
  499.             'print "in standard or node with preexisting compDir"
  500.             componentsDir$ = LCASE$(ExistingLocalPath$)+"\"
  501.         ELSEIF network$ = gSERVER$ THEN
  502.             componentsDir$ = GetSymbolValue(SYM_BASEDIR)+gCOMPONENTS$+"\"
  503.         END IF
  504.     ELSE   'if no preexisting local component
  505.         'print " no preexisting comp dir"
  506.         componentsDir$ = GetSymbolValue(SYM_BASEDIR)+gCOMPONENTS$+"\"
  507.     END IF
  508.     IF ExistingLocalPath$ = "" OR network$ <> gDISTRIBUTION$ THEN
  509.         SetSymbolValue SYM_COMPONENTSDIR$,componentsDir$
  510.         'print "componentsDir$ in INITShare32", componentsDir$
  511.     END IF
  512.  
  513.     'print "GetSymbolValue(SYM_COMPONENTSDIR$)=", GetSymbolValue(SYM_COMPONENTSDIR$)
  514.     'Set the name of the component dir
  515.     SetSymbolValue SYM_COMPONENTSDIR$+gNAME$, LdString(SID_SHARED_LOTUS_TOOLS)
  516.     'print "2"   
  517.  
  518.     '*** AUTOMATION: single product & suite server install get compnent dir from
  519.     '*** response file.
  520.     IF GetSymbolValue (SYM_AUTOMATIONINST$) = gTRUE$ AND _
  521.         network$ = gSERVER$   THEN
  522.         componentsDir$ = Lot_GetKeyValFromResponseFile("Shared Components","COMPONENTSDIR")
  523.         IF RIGHT$(componentsDir$, 1) <> "\" THEN
  524.             componentsDir$ = componentsDir$+ "\"
  525.         END IF
  526.         IF ValidatePath (componentsDir$) <> FALSE THEN
  527.             SetSymbolValue SYM_COMPONENTSDIR$,componentsDir$
  528.             'print "in automation"                            
  529.         ELSE
  530.             ErrorMsg SID_ERR_AUTO_INSTALL, LdString (SID_ERR_AUTO_COMPNENTSDIR)
  531.             ERROR STFQUIT
  532.         END IF
  533.     END IF
  534.       
  535.     'Set NETCOMPONENT symbol
  536.     '***********************
  537.     IF network$ = gNODE$ THEN
  538.         'Get the current working directory
  539.         cwd$ = GetSymbolValue(SYM_STF_CWDDIR$)
  540.         source$ = GetSymbolValue(SYM_STF_SRCDIR$)
  541.         gInstallIniFile$ = cwd$+gINSTALLINI$
  542.         rc% = DoesFileExist(gInstallIniFile$,femExists)
  543.         IF rc% = 1 THEN
  544.             netComponentIni$ = GetIniKeyString(gInstallIniFile$,"Server Configuration of Shared Tools", SYM_COMPONENTSDIR$)
  545.            netComponent$ = Lot_LocalGetPathFromIni(gInstallIniFile$,"Server Configuration of Shared Tools", SYM_COMPONENTSDIR$,NULLSTROK,INVALIDSTROK)
  546.            'print netComponent$,"netComponent$ in share32.lss"
  547.            SameFlag$ = GetIniKeyString(gInstallIniFile$, _
  548.                "Server Configuration of Shared Tools", _
  549.                "SameDriveForComponent")
  550.            'print SameFlag$,"SameFlag$"
  551.            IF netComponent$ = "" THEN
  552.                    '** TV: netComponent comes back empty (win32) beacuse FValidPath fails
  553.             '** if the drive does not exist    
  554.                   rv% = 0
  555.                          IF SameFlag$ = "1" THEN
  556.                      netComponent$ = GetIniKeyString(gInstallIniFile$,"Server Configuration of Shared Tools", SYM_COMPONENTSDIR$)
  557.                      IF netComponent$ <> "" AND NOT Lot_IsUnvalidatedUNCPath(netComponent$) THEN
  558.                         Lot_SplitAnyPath netComponent$, possibleDrv$, componentsDir$
  559.                         netComponent$ = Lot_GetVol(source$)+componentsDir$
  560.                       rv% = Lot_CleanPath(netComponent$)
  561.                      END IF
  562.                    END IF
  563.                       IF rv% = 0 THEN
  564.                   'print "0", gInstallIniFile$
  565.                '   ErrorMsg SID_ERR_INSTALLINI_CORRUPT, CHR$(10) + CHR$(10)+netComponent$
  566.                'gEndStatementEncountered% = TRUE
  567.                 PopupMappingErrorMsgExit(netComponentIni$)
  568.                EXIT FUNCTION
  569.                'FatalErrorMsg SID_ERR_INSTALLINI_CORRUPT, netComponent$, STFQUIT
  570.              ELSE
  571.                SetSymbolValue SYM_NETCOMPONENT$, netComponent$
  572.                  END IF
  573.               ELSE
  574.             IF SameFlag$ = "1" AND NOT Lot_IsUnvalidatedUNCPath(netComponent$) THEN
  575.                 Lot_SplitAnyPath netComponent$, possibleDrv$, componentsDir$
  576.                 SetSymbolValue SYM_NETCOMPONENT$, Lot_GetVol(source$)+componentsDir$
  577.             ELSE
  578.                 SetSymbolValue SYM_NETCOMPONENT$, netComponent$
  579.             END IF
  580.            END IF
  581.  
  582.              ELSE
  583.             'print "1", gInstallIniFile$
  584.             ErrorMsg SID_ERR_INSTALLINI_MISSING, CHR$(10) + CHR$(10)+gInstallIniFile$
  585.                 gEndStatementEncountered% = TRUE
  586.                 EXIT FUNCTION
  587.                'FatalErrorMsg SID_ERR_INSTALLINI_MISSING, gInstallIniFile$, STFQUIT
  588.         END IF
  589.  
  590.     END IF
  591.  
  592.     '*** Should compare SYM_EXISTINGNETPATH$ and SYM_NETCOMPONENT$ at this point
  593.     '*** and tell the user that a previous node install will not be valid if they 
  594.     '*** choose to continue with dialog YES/EXIT INSTALL
  595.     '!! JMD@
  596.  
  597.     'Initialize global gLotusIniPath$
  598.     gLotusIniPath$ = CreateBuffer$(256)
  599.     notused% = Lot_GetLotusiniPath(gLotusIniPath$)
  600.     'print gLotusIniPath$,"gLotusIniPath$"
  601.  
  602.     gLotusappIniPath$=CreateBuffer(256)
  603.     gLotusBcfDir$=CreateBuffer(256)
  604.  
  605.   'print"4"   
  606.   'print GetSymbolValue(SYM_COMPONENTSDIR$)
  607.     'For now, the local user directory is the local components directory,
  608.     'c:\lotus\compnent, e.g.
  609.     SetSymbolValue SYM_LOTUSUSERDIR$, GetSymbolValue(SYM_COMPONENTSDIR$)
  610. END FUNCTION
  611. '*************************************************************************
  612.  
  613.  
  614. PUBLIC FUNCTION ConfigSHARE32 () AS INTEGER
  615. '** Purpose:    Read the copy list and depending on the Shared tools 
  616. '**             installed update lotus.ini and lotusapp.ini
  617. '** Author:     MZ
  618. '** Arguments:  None
  619. '** Returns:    SUCCESS
  620. '*************************************************************************
  621.    DIM NetworkIns$, notused%
  622.  
  623.    ' this will be replaced with Populate... and WriteShare32...
  624. '   notused% = Lot_GetAllShared32Installed()
  625.  
  626.    notused% = Lot_GetLotusappiniPath(gLotusappIniPath, gLotusappDir, gLotusBcfDir)
  627.  
  628.    '** Execute the rest only if there is a registered product that supports 
  629.    '** share Prods(i%)Share=1
  630.    IF Lot_AreShare32ToolsSupported()=1 THEN
  631.       'Write the INI files for standard and node install and save the config in server
  632.       NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  633.  
  634.       IF NetworkIns$ = gSTANDARD$ OR NetworkIns$ = gNODE$ THEN
  635.      'print "before calling WriteReg"
  636.       notused% = Lot_WriteRegistryLocalNetworkPath()
  637.       ELSEIF NetworkIns$ = gSERVER$ THEN
  638.       'Save the server configuration in the install.ini (to be used by the node install)
  639.       notused% = Lot_Save32ShareConfigInInstallIni()
  640.       END IF
  641.       IF Lot_IsTheFeatureInstalled("WIN32SHRDBASEPRG")=1 OR _
  642.      Lot_IsTheFeatureInstalled("WIN32SHRINFORMIXPRG")=1 OR _
  643.      Lot_IsTheFeatureInstalled("WIN32SHRIBMPRG")=1 OR _
  644.      Lot_IsTheFeatureInstalled("WIN32SHRSQLPRG")=1 OR _
  645.      Lot_IsTheFeatureInstalled("WIN32SHRPARADOXPRG")=1 OR _
  646.      Lot_IsTheFeatureInstalled("WIN32SHRNOTESSQLPRG")=1 OR _
  647.      Lot_IsTheFeatureInstalled("WIN32SHRSPREADSHEETPRG")=1 OR _
  648.      Lot_IsTheFeatureInstalled("WIN32SHRIBMDB2PRG")=1 OR _
  649.      Lot_IsTheFeatureInstalled("WIN32SHRDB2SQLDSPRG")=1 OR _
  650.      Lot_IsTheFeatureInstalled("WIN32SHRDB2_SQL400PRG")=1 OR _
  651.      Lot_IsTheFeatureInstalled("WIN32SHRIBM_DDCS_2PRG")=1 OR _
  652.      Lot_IsTheFeatureInstalled("WIN32SHRODBCDRVRPRG")=1 OR _
  653.      Lot_IsTheFeatureInstalled("WIN32SHRODBCWKSPRG")=1 OR _
  654.      Lot_IsTheFeatureInstalled("WIN32SHRODBCTEXTPRG")=1 OR _
  655.      Lot_IsTheFeatureInstalled("WIN32SHRORACLEPRG")=1 OR _
  656.      Lot_IsTheFeatureInstalled("WIN32SHRODBCBTRIEVEPRG")=1 OR _
  657.      Lot_IsTheFeatureInstalled("WIN32SHRODBCFOXBASEPRG")=1 OR _
  658.      Lot_IsTheFeatureInstalled("WIN32SHRODBCACCESSPRG")=1 OR _
  659.      Lot_IsTheFeatureInstalled("WIN32SHRODBCPARADOXPRG")=1 OR _
  660.      Lot_IsTheFeatureInstalled("WIN32SHRODBCDB2PRG")=1 OR _
  661.      Lot_IsTheFeatureInstalled("WIN32SHRODBCORACLEPRG")=1 OR _
  662.      Lot_IsTheFeatureInstalled("WIN32SHRODBCSQLSVRPRG")=1 THEN 
  663.         g32DataLensInstalled = 1
  664.        ELSE
  665.         g32DataLensInstalled = 0
  666.       END IF
  667.  
  668.       'Write lotus.bcf file
  669.       'print STR$(g32DataLensInstalled)
  670.       IF (NetworkIns$ = gSTANDARD$ OR NetworkIns$ = gSERVER$) AND _
  671.      g32DataLensInstalled = 1 THEN
  672. '         notused% = Lot_WriteLotusBcfFile()
  673.       END IF
  674.  
  675.  
  676.       IF (NetworkIns$ = gSTANDARD$ OR NetworkIns$ = gNODE$) AND _
  677.      g32DataLensInstalled = 1 THEN
  678. '         notused% = Lot_WriteODBCINST()
  679.       END IF     
  680.       'Write the Registry
  681.       Lot_WriteShare32InTheRegistry
  682.  
  683.    END IF
  684.  
  685.  
  686. ConfigSHARE32=SUCCESS
  687. END FUNCTION
  688. '*************************************************************************
  689.  
  690. PUBLIC FUNCTION AddSHARE32Icons() AS INTEGER
  691. '** Purpose:   Puts up the shared tools icons
  692. '** Author:    MZ
  693. '** Returns:   1 if success
  694. '***************************************************
  695. DIM grouptitle$,Lotusappdir$,dlgeditor$,Network$, IconName$
  696. DIM Feature$
  697.  
  698.    IF Lot_AreShare32ToolsSupported()=1 THEN
  699.  
  700.      Network$ = GetSymbolValue(SYM_NETWORK$)
  701.      grouptitle$ = Reg_GetProgManagerGroupName(1)
  702.   END IF
  703. AddSHARE32Icons=SUCCESS
  704. END FUNCTION
  705. '*************************************************************************
  706.  
  707.  
  708. FUNCTION Lot_GetAllShared32Installed() AS INTEGER
  709. '** Purpose:    This function searches the copy list and populates the 
  710. '**             RegEntry list with the entries that have to be updated
  711. '**             for standalone install and reades the cinstall.ini for
  712. '**             node install
  713. '** Author:     MZ
  714. '** Arguments:  None
  715. '** Symbols Out:RegEntry
  716. '** Returns:    SUCCESS
  717. '*************************************************************************
  718.    DIM network$,currchpt$,sharedid$
  719.    DIM SectionPref$,SectionNumber%,SectionTag$,SectionName$
  720.    DIM INFSecKeyWordPref$, INFSecKeyWordNum%, INFSecKeyWordTag$, INFSecKeyWordName$
  721.    DIM INFShrKey$,gSharedIniFile$
  722.  
  723.    IF Lot_AreShare32ToolsSupported()=1 THEN
  724.  
  725.      gSharedIniFile$ = Lot_GetSharedIniPathName()
  726.      network$ = GetSymbolValue(SYM_NETWORK$)
  727.      IF network$ = gSTANDARD$ THEN
  728.         'The call to Lot_GetChapterValStr returns a comment when no value is found
  729.  
  730.         CurrChpt$ = Lot_GetFirst("", F_SHARE+F_INOROUT) 
  731.         WHILE (CurrChpt$ <> "")
  732.        SharedID$ = Lot_GetChapterValStr(CurrChpt$, F_SHARE)   
  733.               IF SharedID$ <> "" THEN
  734.                  IF MID$(SharedID$,1,5) = "WIN32" THEN
  735.                     INFSecKeyWordName$ = Lot_GetChapterValStr(CurrChpt$, F_KEYWORD)   
  736.  
  737.              'print SharedID$,INFSecKeyWordName$,"Add KeyWord"
  738.              AddListItem SYM_REGENTRY$,INFSecKeyWordName$
  739.           END IF
  740.        END IF
  741.        CurrChpt$ = Lot_GetNext() 
  742.         WEND
  743.         Lot_GetAllShared32Installed = SUCCESS
  744.  
  745.         'End of the processing for STANDARD
  746.  
  747.       ELSEIF network$ = gNODE$ THEN
  748.  
  749.         'Initialize the loop
  750.         SectionPref$="Section"
  751.         SectionNumber%=1
  752.         SectionTag$=SectionPref$+LTRIM$(STR(SectionNumber%))
  753.         'print "SectionTag$",SectionTag$ 
  754.         'print "gSharedIniFile$ where used",gSharedIniFile$ 
  755.         SectionName$ = GetIniKeyString(gSharedIniFile$,_
  756.                      "Win32 Sections",_ 
  757.                      SectionTag$)
  758.         'print "SectionName$",SectionName$
  759.  
  760.         'Using the shared.ini as a data driver I find all the shared sections installed
  761.         '
  762.         DO
  763.        'Process Program section
  764.        '***********************
  765.        'Process User, Data, and Filter section
  766.        '**************************************
  767.         FORALL SectType IN SectTypeList
  768.         
  769.        INFShrKey$ = GetIniKeyString(gSharedIniFile$,_
  770.                      SectionName$+" "+SectType,_
  771.                      "INFSharedKey")
  772.        'print INFShrKey$,"INFShrKey$"
  773.        IF INFShrKey$ <> "" THEN
  774.  
  775.           'Initialize the loop
  776.           INFSecKeyWordPref$="INFSectionKeyword"
  777.           INFSecKeyWordNum%=1
  778.           INFSecKeyWordTag$=INFSecKeyWordPref$+LTRIM$(STR(INFSecKeyWordNum%))
  779.           'print "INFSecKeyWordTag$",INFSecKeyWordTag$ 
  780.           INFSecKeyWordName$ = GetIniKeyString(gSharedIniFile$,_
  781.                          SectionName$+" "+SectType,_
  782.                          INFSecKeyWordTag$)
  783.           'print "INFSecKeyWordName$",INFSecKeyWordName$
  784.           'print "SectionName$", SectionName$
  785.  
  786.           DO
  787.  
  788.              IF INFSecKeyWordName$ <> "" THEN
  789.             IF Lot_IsTheFeatureInstalled(INFSecKeyWordName$) THEN
  790.                AddListItem SYM_REGENTRY$,INFSecKeyWordName$
  791.             END IF
  792.              END IF
  793.  
  794.              INFSecKeyWordNum%=INFSecKeyWordNum%+1
  795.              INFSecKeyWordTag$=INFSecKeyWordPref$+LTRIM$(STR(INFSecKeyWordNum%))
  796.              'print "INFSecKeyWordTag$",INFSecKeyWordTag$ 
  797.              INFSecKeyWordName$ = GetIniKeyString(gSharedIniFile$,_
  798.                             SectionName$+" "+SectType,_
  799.                             INFSecKeyWordTag$)
  800.  
  801.           LOOP UNTIL INFSecKeyWordName$ = ""
  802.        END IF
  803.  
  804.         END FORALL 
  805.  
  806.        SectionNumber%=SectionNumber%+1
  807.        SectionTag$=SectionPref$+LTRIM$(STR(SectionNumber%))
  808.        'print "SectionTag$",SectionTag$ 
  809.        'print "gSharedIniFile$ where used",gSharedIniFile$ 
  810.        SectionName$ = GetIniKeyString(gSharedIniFile$, _
  811.                     "Win32 Sections",_ 
  812.                     SectionTag$)
  813.  
  814.          LOOP UNTIL SectionName$ = ""
  815.  
  816.      END IF
  817.  
  818.    END IF
  819.    Lot_GetAllShared32Installed = SUCCESS
  820.  
  821. END FUNCTION
  822.  
  823. '*************************************************************************
  824. FUNCTION Lot_WriteRegistryLocalNetworkPath() AS INTEGER
  825. '** Purpose:    This function writes into the Registry
  826. '**     NOTE: This function should only be called for standard or node install
  827. '** Author:     MZ
  828. '** Arguments:  None
  829. '** Symbols In: SYM_COMPONENTSDIR$,SYM_NETCOMPONENT$
  830. '** Returns:    SUCCESS
  831. '*************************************************************************
  832.    DIM RegEntryListLen%,network$,EntryCount%,Entry$,notused%
  833.    DIM s$, LocCompPath$, NetCompPath$, UserPath$, LReturn&
  834.  
  835.    IF Lot_AreShare32ToolsSupported()=1 THEN
  836.    
  837.       LocCompPath$=GetSymbolValue(SYM_COMPONENTSDIR$)
  838.       NetCompPath$=GetSymbolValue(SYM_NETCOMPONENT$) 
  839.       UserPath$=GetSymbolValue(SYM_LOTUSUSERDIR$)
  840.  
  841.         'Make sure ends in trailing backslash
  842.       LocCompPath$=Lot_TrimEndSlash(LocCompPath$)
  843.       NetCompPath$=Lot_TrimEndSlash(NetCompPath$)
  844.         LocCompPath$= LocCompPath$ + "\"
  845.         NetCompPath$= NetCompPath$ + "\"
  846.  
  847.       '*** TV: HCU user path for Chart,Spell, Filters,etc.
  848.         Lot_CreateAndRegisterUserSubdir gREGLOTUSCOMP, "User Path", UserPath$, FALSE
  849.  
  850.       network$ = GetSymbolValue(SYM_NETWORK$)
  851.         'Standard install, write to "LocalPath" in HLM
  852.       IF network$ <> gNODE$ THEN
  853.             LReturn& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE,_
  854.                       gREGLOTUSCOMP, "LocalPath", REG_SZ,_
  855.                       LocCompPath$, LENBP(LocCompPath$)+1)
  856.             IF LReturn& <> ERROR_SUCCESS THEN 
  857.                 RegErrorMsg SID_ERR_REG_GENERIC, gHLM$+"\"+gREGLOTUSCOMP,"LocalPath",LocCompPath$
  858.             END IF
  859.             'Create the paths if they don't exist
  860.             'and register the directory under the first product for uninstall
  861.             IF DoesDirExist(LocCompPath$) <> TRUE THEN 
  862.                 Lot_CreateDirectory(LocCompPath$) 
  863.                 s$ = Lot_GetChapterFromKeyword(Reg_GetProductAcronym(1) + gTOP$)
  864.                 s$ = Lot_GetChapterValStr(s$, F_KEYWORD)   
  865.                 Lot_RegisterObject s$, UNIN_CLASS_DIRECTORY$, LocCompPath$
  866.             END IF
  867.       
  868.         ELSE
  869.             'Write NetComponent Path into the registry
  870.          LReturn& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE,_
  871.                       gREGLOTUSCOMP, "NetworkPath", REG_SZ,_
  872.                       NetCompPath$, LENBP(NetCompPath$)+1)
  873.               IF LReturn& <> ERROR_SUCCESS THEN
  874.                RegErrorMsg SID_ERR_REG_GENERIC, gHLM$+"\"+gREGLOTUSCOMP,"NetworkPath",NetCompPath$
  875.               END IF
  876.  
  877.       END IF
  878.  
  879.       'Populate the 32SHAREDATA array of WIN32SHARED structures
  880.       Populate32SHAREDDATA
  881.  
  882.    END IF
  883.  
  884.    Lot_WriteRegistryLocalNetworkPath = SUCCESS
  885. END FUNCTION
  886. '*************************************************************************
  887.  
  888. SUB Populate32SHAREDDATA
  889. '** Purpose:    This subroutine is to populate the 32SHAREDATA array of 
  890. '**             WIN32SHARED structure by reading the data driver shared.ini
  891. '** Author:     MZ
  892. '** Arguments:  None
  893. '** Symbols In: 
  894. '** Returns:    SUCCESS
  895. '*************************************************************************
  896.    DIM network$,currchpt$,sharedid$, rc%
  897.    DIM SectionPref$,SectionNumber%,SectionTag$,SectionName$
  898.    DIM INFSecKeyWordPref$, INFSecKeyWordNum%, INFSecKeyWordTag$
  899.    DIM INFShrKey$,SectionExist%,INFSecKeyWordName$,gSharedIniFile$
  900.    DIM FilePref$,FileNumber%,FileTag$,FileName$,FileList$,KeyWordList$
  901.    DIM HelpFileNumber%
  902.    DIM DependsOnName$,DependsOnNameNum%,DependsOnNameTag$,DependsOnNameList$
  903.    DIM DependsOnVer$,DependsOnVerNum%, DependsOnVerTag$,DependsOnVerList$
  904.    DIM DependsOnNamePref$, DependsOnVerPref$ 
  905.  
  906.    gSharedIniFile$ = Lot_GetSharedIniPathName()
  907.    Shared32DataCount = 1
  908.  
  909.    'print "Shared32DataCount 1", Shared32DataCount
  910.    'print "gSharedIniFile$", gSharedIniFile$
  911.  
  912.    'Initialize the loop
  913.    SectionPref$="Section"
  914.    SectionNumber%=1
  915.    SectionTag$=SectionPref$+LTRIM$(STR(SectionNumber%))
  916.    'print "SectionTag$",SectionTag$ 
  917.    'print "gSharedIniFile$ where used",gSharedIniFile$ 
  918.    SectionName$ = GetIniKeyString(gSharedIniFile$,_
  919.                   "Win32 Sections",_ 
  920.                   SectionTag$)
  921.    'print "SectionName$",SectionName$
  922.  
  923.    'Using the shared.ini as a data driver I find all the shared sections installed
  924.    '
  925.    DO
  926.       'Process All Section Types in SectTypeList
  927.       '*****************************************
  928.         FORALL SectType IN SectTypeList
  929.  
  930.       IF DoesIniSectionExist (gSharedIniFile$,SectionName$+" "+SectType) = 1 THEN
  931.       'print "result of the DoesIniSectionExist =",rc%
  932.  
  933.      '***Populate the SharedIniWin32SecName
  934.      Shared32Data(Shared32DataCount).SharedIniWin32SecName=_
  935.                      SectionName$+" "+SectType
  936.     'print Shared32Data(Shared32DataCount).SharedIniWin32SecName,"Shared32Data(Shared32DataCount).SharedIniWin32SecName"
  937.  
  938.      '***Populate the Win32ComponentName
  939.      Shared32Data(Shared32DataCount).Win32ComponentName=_
  940.               GetIniKeyString(gSharedIniFile$,SectionName$+" "+SectType,_
  941.                      "Win32ComponentName")
  942.     'print Shared32Data(Shared32DataCount).Win32ComponentName,"Shared32Data(Shared32DataCount).Win32ComponentName"
  943.  
  944.  
  945.      '***Populate the list ListOfFilesInWin32Section
  946.      'Initialize the loop
  947.      FilePref$ = "file"
  948.      FileNumber% = 1
  949.      FileTag$ = FilePref$+LTRIM$(STR(FileNumber%))
  950.  
  951.      FileName$ = GetIniKeyString(gSharedIniFile$,_
  952.                      SectionName$+" "+SectType,_
  953.                      FileTag$)
  954.     'print FileName$,"FileName$"
  955.  
  956.      'make the filelist name 
  957.      FileList$ = "FileList"+LTRIM$(STR(Shared32DataCount))
  958.      IF FileName$ <> "" THEN
  959.  
  960.         DO
  961.           
  962.            SetListItem FileList$,  FileNumber%, FileName$
  963.            FileNumber% = FileNumber% + 1
  964.            FileTag$ = FilePref$+LTRIM$(STR(FileNumber%))
  965.            FileName$ = GetIniKeyString(gSharedIniFile$,_
  966.                      SectionName$+" "+SectType,_
  967.                      FileTag$)
  968.            'print FileName$,"FileName$"
  969.         LOOP UNTIL FileName$ =""
  970.      ELSE
  971.         SetListItem FileList$,  FileNumber%, FileName$
  972.      END IF
  973.  
  974.      'Determine the associated help files for the current language
  975.      FilePref$ = "helpfile"
  976.      FileNumber% = 1
  977.      HelpFileNumber% = 1
  978.      FileTag$ = FilePref$+LTRIM$(STR(FileNumber%))
  979.      'Save the helpfile names for the current language
  980.      DO
  981.          FileName$ = GetIniKeyString(gSharedIniFile$,_
  982.                              SectionName$+" "+SectType, FileTag$)
  983.         IF Lot_GetNthFieldFromIniString (FileName$, 1, "") = _
  984.                 GetSymbolValue(SYM_INSTALL_LANGUAGE$) THEN
  985.             FileName$ = Lot_GetNthFieldFromIniString (FileName$, 2, "")        
  986.             Shared32Data(Shared32DataCount).HelpFileNames = "HelpFiles"+ _
  987.                 LTRIM$(STR(Shared32DataCount))
  988.             SetListItem Shared32Data(Shared32DataCount).HelpFileNames, _
  989.                 HelpFileNumber%, FileName$
  990.             HelpFileNumber% = HelpFileNumber% + 1
  991.         END IF
  992.         FileNumber% = FileNumber% + 1
  993.         FileTag$ = FilePref$+LTRIM$(STR(FileNumber%))
  994.      LOOP UNTIL FileName$ =""
  995.  
  996.      '***Populate DestSubdir
  997.      Shared32Data(Shared32DataCount).DestSubdir=_
  998.                      GetIniKeyString(gSharedIniFile$,_
  999.                          SectionName$+" "+SectType,_ 
  1000.                          "DestSubdir")
  1001.     'print Shared32Data(Shared32DataCount).DestSubdir,"Shared32Data(Shared32DataCount).DestSubdir"
  1002.  
  1003.      '***Populate INFSharedKey
  1004.      Shared32Data(Shared32DataCount).INFSharedKey=_
  1005.                      GetIniKeyString(gSharedIniFile$,_
  1006.                          SectionName$+" "+SectType,_ 
  1007.                          "INFSharedKey")
  1008.    
  1009.      '***Populate the list ListOfINFSectionKeywords
  1010.      'Initialize the loop
  1011.      INFSecKeyWordPref$ = "INFSectionKeyword"
  1012.      INFSecKeyWordNum% = 1
  1013.      INFSecKeyWordTag$ = INFSecKeyWordPref$+LTRIM$(STR(INFSecKeyWordNum%))
  1014.  
  1015.      INFSecKeyWordName$ = GetIniKeyString(gSharedIniFile$,_
  1016.                      SectionName$+" "+SectType,_
  1017.                      INFSecKeyWordTag$)
  1018.     'print INFSecKeyWordName$,"INFSecKeyWordName$" 
  1019.  
  1020.      'make the KeyWordList name 
  1021.      KeyWordList$ = "KeyWordList"+LTRIM$(STR(Shared32DataCount))
  1022.  
  1023.      IF INFSecKeyWordName$ <> "" THEN
  1024.          DO
  1025.  
  1026.            SetListItem KeyWordList$, INFSecKeyWordNum%, INFSecKeyWordName$
  1027.            INFSecKeyWordNum% = INFSecKeyWordNum% + 1
  1028.            INFSecKeyWordTag$ = INFSecKeyWordPref$+LTRIM$(STR(INFSecKeyWordNum%))
  1029.            INFSecKeyWordName$ = GetIniKeyString(gSharedIniFile$,_
  1030.                          SectionName$+" "+SectType,_
  1031.                          INFSecKeyWordTag$)
  1032.            'print INFSecKeyWordName$,"INFSecKeyWordName$" 
  1033.         LOOP UNTIL INFSecKeyWordName$ =""
  1034.      ELSE
  1035.         SetListItem KeyWordList$, INFSecKeyWordNum%, INFSecKeyWordName$
  1036.      END IF
  1037.  
  1038.      '***Populate IniFileName
  1039.      IF SectType = "Program" THEN
  1040.          Shared32Data(Shared32DataCount).IniFileName=_
  1041.                      GetIniKeyString(gSharedIniFile$,_
  1042.                          SectionName$+" "+SectType,_ 
  1043.                          "IniFileName")
  1044.     'print Shared32Data(Shared32DataCount).IniFileName,"Shared32Data(Shared32DataCount).IniFileName" 
  1045.     END IF
  1046.  
  1047.      '***Populate IniSectionName
  1048.      Shared32Data(Shared32DataCount).IniSectionName=_
  1049.                      GetIniKeyString(gSharedIniFile$,_
  1050.                          SectionName$+" "+SectType,_ 
  1051.                          "IniSectionName")
  1052.     'print Shared32Data(Shared32DataCount).IniSectionName,"Shared32Data(Shared32DataCount).IniSectionName" 
  1053.  
  1054.  
  1055.      '***Populate IniEntryName
  1056.      Shared32Data(Shared32DataCount).IniEntryName=_
  1057.                      GetIniKeyString(gSharedIniFile$,_
  1058.                          SectionName$+" "+SectType,_ 
  1059.                          "IniEntry")
  1060.  
  1061.      '***Populate KeyFileName
  1062.      Shared32Data(Shared32DataCount).KeyFileName=_
  1063.                      GetIniKeyString(gSharedIniFile$,_
  1064.                          SectionName$+" "+SectType,_ 
  1065.                          "KeyFileName")
  1066.      'printShared32Data(Shared32DataCount).KeyFileName,"Shared32Data(Shared32DataCount).KeyFileName" 
  1067.  
  1068.  
  1069.      '***Populate the RegistrationKey
  1070.      Shared32Data(Shared32DataCount).RegistrationKey=_
  1071.                      GetIniKeyString(gSharedIniFile$,_
  1072.                          SectionName$+" "+SectType,_ 
  1073.                          "RegistrationKey")
  1074.      'printShared32Data(Shared32DataCount).RegistrationKey,"Shared32Data(Shared32DataCount).RegistrationKey" 
  1075.  
  1076.      '***Populate the Version
  1077.      Shared32Data(Shared32DataCount).Version=_
  1078.                      GetIniKeyString(gSharedIniFile$,_
  1079.                          SectionName$+" "+SectType,_ 
  1080.                          "Version")
  1081.      'printShared32Data(Shared32DataCount).Version,"Shared32Data(Shared32DataCount).Version" 
  1082.  
  1083.      '***Populate the list ListOfDependsOnNames
  1084.      'Initialize the loop
  1085.      DependsOnNamePref$ = "DependsOnName"
  1086.      DependsOnNameNum% = 1
  1087.      DependsOnNameTag$ = DependsOnNamePref$+LTRIM$(STR(DependsOnNameNum%))
  1088.  
  1089.      DependsOnName$ = GetIniKeyString(gSharedIniFile$,_
  1090.                      SectionName$+" "+SectType,_
  1091.                      DependsOnNameTag$)
  1092.      'print DependsOnName$,"DependsOnName$" 
  1093.  
  1094.      'make the DependsOnNameList name 
  1095.      DependsOnNameList$ = "DependsOnNameList"+LTRIM$(STR(Shared32DataCount))
  1096.  
  1097.      IF DependsOnName$ <> "" THEN
  1098.          DO
  1099.  
  1100.            SetListItem DependsOnNameList$, DependsOnNameNum%, DependsOnName$
  1101.            DependsOnNameNum% = DependsOnNameNum% + 1
  1102.            DependsOnNameTag$ = DependsOnNamePref$+LTRIM$(STR(DependsOnNameNum%))
  1103.            DependsOnName$ = GetIniKeyString(gSharedIniFile$,_
  1104.                          SectionName$+" "+SectType,_
  1105.                          DependsOnNameTag$)
  1106.            'print DependsOnName$,"DependsOnName$" 
  1107.         LOOP UNTIL DependsOnName$ =""
  1108.      ELSE
  1109.         SetListItem DependsOnNameList$, DependsOnNameNum%, DependsOnName$
  1110.         'print DependsOnName$,"DependsOnName$ if empty" 
  1111.      END IF
  1112.  
  1113.  
  1114.      '***Populate the list ListOfDependsOnVers
  1115.      'Initialize the loop
  1116.      DependsOnVerPref$ = "DependsOnVer"
  1117.      DependsOnVerNum% = 1
  1118.      DependsOnVerTag$ = DependsOnVerPref$+LTRIM$(STR(DependsOnVerNum%))
  1119.  
  1120.      DependsOnVer$ = GetIniKeyString(gSharedIniFile$,_
  1121.                      SectionName$+" "+SectType,_
  1122.                      DependsOnVerTag$)
  1123.      'print DependsOnVer$,"DependsOnVer$" 
  1124.  
  1125.      'make the DependsOnVerList name 
  1126.      DependsOnVerList$ = "DependsOnVerList"+LTRIM$(STR(Shared32DataCount))
  1127.  
  1128.      IF DependsOnVer$ <> "" THEN
  1129.          DO
  1130.  
  1131.            SetListItem DependsOnVerList$, DependsOnVerNum%, DependsOnVer$
  1132.            DependsOnVerNum% = DependsOnVerNum% + 1
  1133.            DependsOnVerTag$ = DependsOnVerPref$+LTRIM$(STR(DependsOnVerNum%))
  1134.            DependsOnVer$ = GetIniKeyString(gSharedIniFile$,_
  1135.                          SectionName$+" "+SectType,_
  1136.                          DependsOnVerTag$)
  1137.            'print DependsOnVer$,"DependsOnVer$" 
  1138.         LOOP UNTIL DependsOnVer$ =""
  1139.      ELSE
  1140.         SetListItem DependsOnVerList$, DependsOnVerNum%, DependsOnVer$
  1141.         'print DependsOnVer$,"DependsOnVer$ if empty" 
  1142.      END IF
  1143.  
  1144.  
  1145.  
  1146.      Shared32DataCount = Shared32DataCount+1
  1147.      'print Shared32DataCount,"Shared32DataCount 2"
  1148.       END IF ' end of processing all section types
  1149.         
  1150.         END FORALL 
  1151.  
  1152.       SectionNumber%=SectionNumber%+1
  1153.       SectionTag$=SectionPref$+LTRIM$(STR(SectionNumber%))
  1154.       'print "SectionTag$",SectionTag$ 
  1155.       'print "gSharedIniFile$ where used",gSharedIniFile$ 
  1156.       SectionName$ = GetIniKeyString(gSharedIniFile$,_
  1157.                      "Win32 Sections",_ 
  1158.                      SectionTag$)     
  1159.       'print "SectionName$",SectionName$ 
  1160.  
  1161.    LOOP UNTIL SectionName$ = ""
  1162.  
  1163.  
  1164. END SUB
  1165.  
  1166.  
  1167. '*************************************************************************
  1168. PUBLIC FUNCTION Lot_LocalGetPathFromIni(szFile$,szSect$,szKey$,nullflag%,invalidpathflag%) AS STRING
  1169. '** Purpose: This function is called whenever we need to retrieve a string
  1170. '**           from .ini file. Function returns a clean path (path returned from
  1171. '**           FCleanFatPath.    
  1172. '** Author:    JKK/MZ
  1173. '** Arguments:  Name of the .ini file, section name in the .ini file, key we
  1174. '**             are searching for and two integer flags, nullflag% & invalidpath%.
  1175. '**             Function puts up two error messages based on the value of nullflag%, and 
  1176. '**             invalidpath. 
  1177. '** Returns:   Function either returns null or the value of the string.
  1178. '**     
  1179. '*************************************************************************
  1180.   DIM rstring$, rv%, errText$
  1181.  
  1182.    Lot_LocalGetPathFromIni = ""
  1183.    rstring$ = GetIniKeyString(szFile$, szSect$, szKey$)
  1184.  
  1185.    If rstring$ <> "" Then
  1186.       rv% = Lot_CleanPath(rstring$)
  1187.  
  1188.       if rv% <> 0 Then
  1189.      Lot_LocalGetPathFromIni = rstring$
  1190.       elseif invalidpathflag% <> FALSE then
  1191.         Lot_LocalGetPathFromIni = ""
  1192.         EXIT FUNCTION
  1193.      end if 
  1194.  
  1195.       elseif nullflag% <> FALSE then
  1196.      Lot_LocalGetPathFromIni = ""
  1197.      EXIT FUNCTION
  1198.  
  1199.    else
  1200.       Lot_LocalGetPathFromIni = ""
  1201.    end if 
  1202.  
  1203. END FUNCTION
  1204.  
  1205. PUBLIC FUNCTION Lot_GetLotusiniPath(gLotusIniPath$) AS INTEGER
  1206. '** Purpose:    This function builds and sets the global for lotus.ini 
  1207. '**             path 
  1208. '** Author:     MZ
  1209. '** Arguments:  gLotusIniPath$
  1210. '** Returns:    SUCCESS
  1211. '*************************************************************************
  1212.    'Get the path to the lotus.ini
  1213.    gLotusIniPath$ = MakePath( GetWindowsDir(), gLOTUSINI$)
  1214.  
  1215.    Lot_GetLotusiniPath = SUCCESS
  1216.  
  1217. END FUNCTION
  1218. '*************************************************************************
  1219.  
  1220.  
  1221. PUBLIC FUNCTION Lot_GetSharedIniPathName() AS STRING
  1222. '** Purpose:   Builds the path to the datadriver file shared.ini
  1223. '** Author:    MZ
  1224. '** Returns:   the path$ to shared.ini
  1225. '*************************************************************************
  1226. DIM cwd$,gSharedIniFile$
  1227.    'Get the current working directory
  1228.    cwd$ = GetSymbolValue(SYM_STF_CWDDIR$)
  1229.    gSharedIniFile$ = MakePath(cwd$,gSHAREDINI$)
  1230.    Lot_GetSharedIniPathName=gSharedIniFile$
  1231. END FUNCTION
  1232. '*************************************************************************
  1233.  
  1234.  
  1235. PUBLIC FUNCTION Lot_GetLotusappiniPath(gLotusappIniPath$, gLotusappDir$, gLotusBcfDir$) AS INTEGER
  1236. '** Purpose:    This function builds and sets the global for lotusapp.ini 
  1237. '**             path and directory
  1238. '** Author:     MZ
  1239. '** Arguments:  gLotusappIniPath$, gLotusappDir$,gLotusBcfDir$
  1240. '** Returns:    SUCCESS
  1241. '*************************************************************************
  1242.    'Get the path to lotusapp.ini 
  1243.     gLotusappIniPath$=gLotusappDir$+"lotusapp.ini"
  1244.  
  1245.    'Get the path to lotus.BCF 
  1246.    gLotusBcfDir$ = gLotusappDir$+"datalens\"+ gLOTUSBCF$
  1247.    'print "where this is set gLotusBcfDir",gLotusBcfDir
  1248.  
  1249.    Lot_GetLotusappiniPath = SUCCESS
  1250.  
  1251. END FUNCTION
  1252. '*************************************************************************
  1253.  
  1254. FUNCTION Lot_Save32ShareConfigInInstallIni() AS INTEGER
  1255. '** Purpose:   Saves the components dir and SameDriveForComponent flag  
  1256. '**            into install.ini in the section [Server Configuration of  
  1257. '**            Shared Tools];  This is needed at Node install time
  1258. '** Author:    MZ
  1259. '** Arguments: None
  1260. '** Returns:   SUCCESS
  1261. '*************************************************************************
  1262. DIM networkins$,proddir$,ginstallinifile$,proddrv$
  1263. DIM componentsdir$, componentsdrv$
  1264.  
  1265.    'Identify if I am in server install
  1266.    NetworkIns$ = GetSymbolValue(SYM_NETWORK$)
  1267.    IF Lot_AreShare32ToolsSupported()=1 THEN
  1268.  
  1269.       IF NetworkIns$=gSERVER$ THEN
  1270.  
  1271.          'Built the path to install.ini
  1272.          prodDir$ = Lot_GetInstallDir()
  1273.          gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  1274.  
  1275.          'Log the COMPONENT directory
  1276.          componentsDir$ = GetSymbolValue(SYM_COMPONENTSDIR$)
  1277.          CreateIniKeyValue gInstallIniFile$,_
  1278.             "Server Configuration of Shared Tools",_
  1279.             SYM_COMPONENTSDIR$, _
  1280.             componentsDir$,_
  1281.             cmoOverwrite
  1282.  
  1283.          'Log a flag that tells if the product is in the same drive with components
  1284.          prodDrv$ = LCASE$(Lot_GetVol(prodDir$))
  1285.          componentsDrv$ = LCASE$(Lot_GetVol(componentsDir$))
  1286.          IF prodDrv$ = componentsDrv$ THEN
  1287.         CreateIniKeyValue gInstallIniFile$,_
  1288.                "Server Configuration of Shared Tools",_
  1289.                "SameDriveForComponent",_
  1290.                "1", cmoOverwrite
  1291.          ELSE
  1292.         CreateIniKeyValue gInstallIniFile$,_
  1293.                "Server Configuration of Shared Tools",_
  1294.                "SameDriveForComponent", "0", cmoOverwrite
  1295.          END IF
  1296.  
  1297.  
  1298.       END IF
  1299.    END IF
  1300.  
  1301.    Lot_Save32ShareConfigInInstallIni = SUCCESS
  1302. END FUNCTION
  1303.  
  1304. CONST REGSYSTEMSERVICES = "SystemServices\3.1"
  1305.  
  1306. '*************************************************************************
  1307.  
  1308. SUB Lot_WriteShare32InTheRegistry
  1309. '** Purpose:    This subroutine is to use the 32SHAREDATA array of 
  1310. '**             WIN32SHARED structure and write the registry key if the feature was installed
  1311. '** Author:     MZ
  1312. '** Arguments:  None
  1313. '** Symbols In: 
  1314. '** Returns:    SUCCESS
  1315. '*************************************************************************
  1316. DIM NumOfStrucs%, StrucCount%, KeyWordListLen%, KeyWordCount%, InstalledFlag%
  1317. DIM KWList$, KeyWordName$,Network$,LReturn&, ComponentNameAndVer$, path$, ver$
  1318. DIM DependsOnNameList$,DependsOnVerList$,DependsOnListLen%,DependsOnCount% 
  1319. DIM ListLength%, FileName$, ListName$, Count%, s$, KeyWordList$, i%, kw$
  1320. DIM gInstallIniFile$,cwd$,prodDir$,lenVer%, dirSym$, inidir$
  1321. DIM LocCompPath$, file$, keyvalname1$, keyval1&, keyvalname2$, keyval2&
  1322. DIM CompPath$, UserPath$, key$
  1323.     IF Lot_AreShare32ToolsSupported() <> 1 THEN EXIT SUB
  1324.  
  1325.    'Get how many shared32 sections I have to process
  1326.    NumOfStrucs% = Shared32DataCount
  1327.    IF NumOfStrucs% = 0 THEN EXIT SUB
  1328.  
  1329.    Network$ = GetSymbolValue(SYM_NETWORK$)
  1330.  
  1331.    'Built the path to install.ini
  1332.    IF Network$ = gNODE$ THEN
  1333.       'Get the current working directory
  1334.       'cwd$ = GetSymbolValue(SYM_STF_CWDDIR$)
  1335.       'gInstallIniFile$ = cwd$+gINSTALLINI$
  1336.        dirSym$ = Reg_GetDirSymbolList(1)       '** First product dir list
  1337.     IF GetListLength(dirSym$) >= 1 THEN
  1338.         dirSym$ = GetListItem(dirSym$, 1)    '** First directory symbol
  1339.         inidir$ = GetSymbolValue(dirSym$) 
  1340.               gInstallIniFile$ = MakePath(inidir$,"cinstnod.ini")
  1341.     END IF
  1342.    ELSEIF Network$=gSERVER$ OR Network$=gSTANDARD THEN
  1343.       'Get the install directory
  1344.       prodDir$ = Lot_GetInstallDir()
  1345.       gInstallIniFile$ = MakePath(prodDir$,gINSTALLINI$)
  1346.    END IF
  1347.  
  1348.    'print gInstallIniFile$,"gInstallIniFile$"
  1349.  
  1350.       'Write the appropriate entries
  1351. FOR StrucCount% = 1 TO NumOfStrucs%
  1352.     'Make the keyWordListName
  1353.     KWList$ = "KeyWordList"+LTRIM$(STR(StrucCount%))
  1354.     'print KWList$, "KWList$"
  1355.  
  1356.     'Get the number of the keywords 
  1357.     KeyWordListLen% = GetListLength(KWList$)
  1358.     'print KeyWordListLen%,"KeyWordListLen%"
  1359.      
  1360.     'See if this feature was installed
  1361.     'This will be true if one or more sections are installed    
  1362.     InstalledFlag% = 0
  1363.     IF KeyWordListLen% <> 0 THEN
  1364.     FOR KeyWordCount% = 1 TO KeyWordListLen%
  1365.         KeyWordName$ = GetListItem(KWList$,KeyWordCount%)
  1366.         keyvalname1$ =    Shared32Data(StrucCount%).RegistrationKey
  1367.         keyvalname2$ =    Shared32Data(StrucCount%).Version 
  1368.         ' JMD: Only write the entry if registry info provided
  1369.         IF keyvalname1$ <> "" AND keyvalname2$ <> "" THEN
  1370.             ComponentNameAndVer$ = keyvalname1$ + "\" + keyvalname2$ 
  1371.             SELECT CASE network$
  1372.             CASE gSTANDARD$ 
  1373.                 IF (FIsKeywordinCopyList (KeyWordName$) = 1) THEN
  1374.                     'Write it in cinstall.ini for uninstall 
  1375.                     'print ComponentNameAndVer$,"ComponentNameAndVer$"
  1376.                     CreateIniKeyValue gInstallIniFile$,_
  1377.                                      "WIN32 Shared Component Information",_
  1378.                                      KeyWordName$, _
  1379.                                      ComponentNameAndVer$,_
  1380.                                      cmoOverwrite
  1381.                     InstalledFlag% = 1
  1382.                 END IF
  1383.                  
  1384.             CASE gNODE$ 
  1385.                 IF Lot_IsTheFeatureInstalled(KeyWordName$) = 1 THEN
  1386.                     'Write it in cinstnode.ini for uninstall 
  1387.                     'print ComponentNameAndVer$,"ComponentNameAndVer$"
  1388.                     CreateIniKeyValue gInstallIniFile$,_
  1389.                                      "WIN32 Shared Component Information",_
  1390.                                      KeyWordName$, _
  1391.                                      ComponentNameAndVer$,_
  1392.                                      cmoOverwrite
  1393.                     InstalledFlag% = 1
  1394.                 END IF
  1395.             END SELECT
  1396.         END IF
  1397.     NEXT
  1398.     END IF
  1399.  
  1400.      'Write the registry entries for this feature
  1401.      'only if installed and node or standard
  1402.     IF InstalledFlag% = 0 THEN GOTO DONEXTONE
  1403.     IF network$ <> gSTANDARD$ AND network$ <> gNODE$ THEN GOTO DONEXTONE
  1404.  
  1405.     '**************************
  1406.     '** Registry Key Processing
  1407.     '**************************
  1408.     
  1409.     STATIC SSFlag%
  1410.  
  1411.     IF Shared32Data(StrucCount%).RegistrationKey <> "" THEN
  1412.         'WriteTheComponent Key and Version
  1413.         ComponentNameAndVer$ = Shared32Data(StrucCount%).RegistrationKey+"\"+Shared32Data(StrucCount%).Version 
  1414.         LReturn& = Lot_RegCreateKeyEx(HKEY_LOCAL_MACHINE,_
  1415.               gREGLOTUSCOMP+"\"+ComponentNameAndVer$)
  1416.  
  1417.         '*** TV: Special processing for System Services
  1418.         '*** Used by Lotus Script and Chart    
  1419.         
  1420.         IF Shared32Data(StrucCount%).Win32ComponentName =    "Lotus Script" _
  1421.         OR Shared32Data(StrucCount%).Win32ComponentName =    "Chart" THEN
  1422.  
  1423.             key$ = gREGLOTUSCOMP+ "\" + REGSYSTEMSERVICES
  1424.             LReturn& = Lot_RegCreateKeyEx(HKEY_LOCAL_MACHINE, key$)
  1425.             ' Write entry for uninstall -- only for Lotus Script so it won't get
  1426.             ' deleted if Chart goes
  1427.             s$    = Shared32Data(StrucCount%).Win32ComponentName 
  1428.             IF s$    = "Lotus Script" AND NOT SSFlag% THEN 
  1429.                 KWList$ = "KeyWordList"+LTRIM$(STR(StrucCount%))
  1430.                 KeyWordListLen% = GetListLength(KWList$)
  1431.                 IF KeyWordListLen% <> 0 THEN
  1432.                 ' Find the first installed section, use for uninstall object
  1433.                 FOR KeyWordCount% = 1 TO KeyWordListLen%
  1434.                     KeyWordName$ = GetListItem(KWList$,KeyWordCount%)
  1435.                     IF Lot_IsTheFeatureInstalled(KeyWordName$) = 1 AND NOT SSFlag% THEN 
  1436.                         SSFlag% = TRUE
  1437.                         Lot_RegisterObject KeyWordName$, UNIN_CLASS_REGISTRY_HIVE$, _
  1438.                             gHLM$ + "\" + key$
  1439.                     END IF        
  1440.                 NEXT
  1441.                 END IF    
  1442.             END IF    
  1443.             file$ = "LTCHEN21.DLL"
  1444.             LReturn& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE, key$, _
  1445.                      "INFO", REG_SZ, file$, LEN(file$)+1)
  1446.             file$ = "LTSIN31.DLL"
  1447.             LReturn& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE, key$, _
  1448.                      "LSI", REG_SZ, file$, LEN(file$)+1)
  1449.             file$ = "LTLRN31.DLL"
  1450.             LReturn& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE, key$, _
  1451.                      "ADPT", REG_SZ, file$, LEN(file$)+1)
  1452.         END IF
  1453.  
  1454.         '*** TV: Special processing for Chart
  1455.         LocCompPath$=Lot_TrimEndSlash(GetSymbolValue(SYM_COMPONENTSDIR$))
  1456.         LocCompPath$ = LocCompPath$ + "\"  
  1457.         '** should actually be WIN32SHRCHARTUSER
  1458.         IF Shared32Data(StrucCount%).Win32ComponentName =    "Chart"     THEN
  1459.             Lot_CreateAndRegisterUserSubdir gREGLOTUSCOMP+"\"+ComponentNameAndVer$, _
  1460.                  "Style Directory", LocCompPath$, FALSE
  1461.         END IF
  1462.         '*** end special processing
  1463.     
  1464.         '*** TV: Special processing for Mobil Player
  1465.         IF Shared32Data(StrucCount%).Win32ComponentName =    "Mobil Player" THEN
  1466.           LocCompPath$=Lot_TrimEndSlash(GetSymbolValue(SYM_COMPONENTSDIR$))
  1467.  
  1468.             keyvalname1$ =    "Keep Metafile Size"
  1469.             keyval1& = 00000000
  1470.             LReturn& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE,_
  1471.                       gREGLOTUSCOMP+"\"+ComponentNameAndVer$, _
  1472.                       keyvalname1$, REG_DWORD,_
  1473.                       keyval1&, 4)
  1474.  
  1475.             keyvalname2$ =    "Dither Grad Fills in Metafiles"
  1476.             keyval2& = 00000001
  1477.             LReturn& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE,_
  1478.                       gREGLOTUSCOMP+"\"+ComponentNameAndVer$, _
  1479.                       keyvalname2$, REG_DWORD,_
  1480.                       keyval2&, 4)
  1481.             
  1482.             LReturn& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE,_
  1483.                       gREGLOTUSCOMP+"\"+ComponentNameAndVer$, _
  1484.                      "Working Directory", REG_SZ,_
  1485.                       LocCompPath$, LENBP(LocCompPath$)+1)
  1486.         END IF
  1487.         '*** end special processing for Player
  1488.           
  1489.         '*** TV: Special processing for Spell Data, User and Thesaurus
  1490.         IF Shared32Data(StrucCount%).Win32ComponentName =    "Spell Checker" _
  1491.         OR Shared32Data(StrucCount%).Win32ComponentName =    "Thesaurus" THEN
  1492.             '*** Spell or Thesaurus Data Path
  1493.             IF network$ = gSTANDARD$ THEN
  1494.                 CompPath$ = GetSymbolValue(SYM_COMPONENTSDIR$) + "spell\"
  1495.             ELSE 
  1496.                 '*** has to be node
  1497.                 CompPath$ = GetSymbolValue(SYM_NETCOMPONENT$) + "spell\"
  1498.             END IF
  1499.             LReturn& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE,_
  1500.                       gREGLOTUSCOMP+"\"+ComponentNameAndVer$, _
  1501.                      "Data Path", REG_SZ,_
  1502.                       CompPath$, LENBP(CompPath$)+1)
  1503.  
  1504.             '*** Spell Multi User Path
  1505.             IF Shared32Data(StrucCount%).Win32ComponentName = "Spell Checker" THEN
  1506.                 UserPath$ = GetSymbolValue(SYM_LOTUSUSERDIR$) + "spell"
  1507.                 Lot_CreateAndRegisterUserSubdir gREGLOTUSCOMP+"\"+ComponentNameAndVer$, _
  1508.                      "Multi User Path", UserPath$, TRUE
  1509.             END IF
  1510.         END IF
  1511.         '*** end special processing for Spell
  1512.  
  1513.         '*** JMD: Special processing for Fills
  1514.         '  Wordpro is creating the keys -- we just set up to uninstall them here
  1515.         IF Shared32Data(StrucCount%).Win32ComponentName =    "Fills" THEN
  1516.                 Lot_RegisterObject KeyWordName$, UNIN_CLASS_REGISTRY_HIVE$, _
  1517.                     gHCU$ + "\" + gREGLOTUSCOMP+"\" + "Fills"
  1518.         END IF
  1519.         
  1520.         'Make entries so that Suite uninstall will not complain about unknown
  1521.         'shared components
  1522.         IF GetSymbolValue(SYM_SINGLESMARTSUITE$) = gSMARTSUITE$ THEN _
  1523.             LReturn& = Lot_RegCreateKeyEx(HKEY_LOCAL_MACHINE,_
  1524.                 gREGLOTUS+_
  1525.                 GetSymbolValue(SYM_REG_PRODUCTNAME$)+"\"+_
  1526.                 GetSymbolValue(SYM_REG_PRODUCTVER$)+"\"+_
  1527.                 "Components\"+_
  1528.                 ComponentNameAndVer$)
  1529.  
  1530.         'Write the help files into the Win95 Regisry
  1531.         '-------------------------------------------
  1532.         'ListName will be blank if no help files exist for feature
  1533.         ListName$ = Shared32Data(StrucCount%).HelpFileNames
  1534.         IF ListName$ = "" GOTO HELPDONE
  1535.  
  1536.         SELECT CASE network$
  1537.         CASE gSERVER$
  1538.                   GOTO HELPDONE
  1539.         CASE gDISTRIBUTION$
  1540.                   GOTO HELPDONE
  1541.         CASE gSTANDARD$ 
  1542.         ' Get the destination directory corresponding to the keyword 
  1543.         ' by finding it from first installed section
  1544.             KWList$ = "KeyWordList"+LTRIM$(STR(StrucCount%))
  1545.             KeyWordListLen% = GetListLength(KWList$)
  1546.             FOR KeyWordCount% = 1 TO KeyWordListLen%
  1547.                 KeyWordName$ = GetListItem(KWList$,KeyWordCount%)
  1548.                 s$ =  Lot_GetChapterFromKeyword(KeyWordName$)
  1549.                 IF s$ <> "" THEN s$ = Lot_GetChapterValStr(s$, F_DESTDIRSYM)
  1550.                 IF s$ <> "" THEN s$ = GetSymbolValue(s$)
  1551.                 if s$ <> "" THEN EXIT FOR
  1552.             NEXT    
  1553.         CASE gNODE$ 
  1554.         ' Register the help registry entry under the first product
  1555.             KeyWordName$ = Reg_GetProductAcronym(1) + gTOP$
  1556.         ' For node, assume all help files are in the NETCOMPONENT on the server
  1557.             s$ = GetSymbolValue(SYM_NETCOMPONENT$)
  1558.         END SELECT
  1559.         if s$ = "" THEN GOTO HELPDONE
  1560.  
  1561.         'Add subdirectory under main compnent directory, if any
  1562.         IF Shared32Data(StrucCount%).DestSubdir <> "" THEN _
  1563.             s$ = MakePath(s$, Shared32Data(StrucCount%).DestSubdir)
  1564.         IF RIGHT$(s$, 1) <> "\" THEN  s$ = s$+ "\"
  1565.         ' Traverse the list of help files looking for installed ones
  1566.         IF s$ <> ""    THEN
  1567.             ListLength% = GetListLength(ListName$)
  1568.             FOR Count% = 1 TO ListLength%
  1569.                 FileName$ = GetListItem(ListName$, Count%)
  1570.                 IF DoesFileExist(s$+FileName$,femExists) = 1 THEN _
  1571.                     Lot_RegisterHelpFile KeyWordName$, s$, FileName$
  1572.             NEXT
  1573.         END IF
  1574. HELPDONE:
  1575.  
  1576.         'Writes the Dependents if they exists
  1577.         'but not for node install, since no shared components are on node
  1578.     IF network$ <> gNODE$ THEN
  1579.         'make the DependsOnNameList name 
  1580.         DependsOnNameList$ = "DependsOnNameList"+LTRIM$(STR(StrucCount%))
  1581.         'make the DependsOnVerList name 
  1582.         DependsOnVerList$ = "DependsOnVerList"+LTRIM$(STR(StrucCount%))
  1583.         DependsOnListLen% = 0
  1584.         DependsOnListLen% = GetListLength(DependsOnNameList$)
  1585.         lenVer% =GetListLength(DependsOnVerList$)
  1586.         IF lenVer% = DependsOnListLen%  AND DependsOnListLen% <> 0 AND _
  1587.           GetListItem(DependsOnNameList$,1) <> "" THEN
  1588.             FOR DependsOnCount% = 1 TO DependsOnListLen%
  1589.                 ver$ = GetListItem(DependsOnVerList$,DependsOnCount%)
  1590.                 LReturn& = Lot_RegCreateKeyEx(HKEY_LOCAL_MACHINE,_
  1591.                                 gREGLOTUSCOMP+"\"+ComponentNameAndVer$+"\Dependents\"+GetListItem(DependsOnNameList$,DependsOnCount%))
  1592.                  'print " before calling Lot_CreateRegKeyValueEx in share32"        
  1593.                 LReturn& = Lot_CreateRegKeyValueEx(HKEY_LOCAL_MACHINE,_
  1594.                       gREGLOTUSCOMP+"\"+ComponentNameAndVer$+"\Dependents\"+GetListItem(DependsOnNameList$,DependsOnCount%),_
  1595.                       "Version",_
  1596.                       REG_SZ,_
  1597.                       ver$, _
  1598.                       LEN(ver$)+1)
  1599.                  IF LReturn& <> ERROR_SUCCESS THEN
  1600.                     RegErrorMsg SID_ERR_REG_GENERIC, gHLM$+"\"+gREGLOTUSCOMP+"\"+ComponentNameAndVer$+"\Dependents\"+GetListItem(DependsOnNameList$,DependsOnCount%),"Version",ver$
  1601.                  END IF
  1602.                 'print " after calling Lot_CreateRegKeyValueEx in share32",LReturn&        
  1603.             NEXT
  1604.         END IF
  1605.     END IF
  1606.  
  1607.     END IF        ' Registry processing           
  1608.            
  1609.     '**********************
  1610.     '** INI File Processing
  1611.     '**********************
  1612. 'If there is an Ini entry write it
  1613. IF Shared32Data(StrucCount%).IniFileName <> "" AND _
  1614. Shared32Data(StrucCount%).IniSectionName <> "" AND _
  1615. Shared32Data(StrucCount%).IniEntryName <> ""  THEN
  1616.     IF Shared32Data(StrucCount%).DestSubdir <> "" THEN
  1617.         path$ = GetSymbolValue(SYM_COMPONENTSDIR)+Shared32Data(StrucCount%).DestSubdir
  1618.     ELSE
  1619.         path$ = Lot_TrimEndSlash(GetSymbolValue(SYM_COMPONENTSDIR$))
  1620.     END IF
  1621.     IF Shared32Data(StrucCount%).IniEntryName <> "Common Directory"  THEN
  1622.         CreateIniKeyValue MakePath( GetWindowsDir(), Shared32Data(StrucCount%).IniFileName), _
  1623.          Shared32Data(StrucCount%).IniSectionName, _
  1624.          Shared32Data(StrucCount%).IniEntryName, _
  1625.          path$, cmoOverwrite
  1626.     END IF
  1627. END IF ' end of writing the ini entry
  1628.  
  1629.  
  1630. DONEXTONE:
  1631. NEXT        ' NumOfStrucs
  1632.  
  1633. END SUB
  1634.  
  1635. SUB PopupMappingErrorMsgExit(szPath$)
  1636. '** Purpose:   If components directory drive not mapped or unc path invalid,
  1637. '** popup a dialog and exit
  1638. '**                 
  1639. '** Author:    JMD
  1640. '** Arguments: szPath$    Path 
  1641. '*************************************************************************
  1642.     DIM sz$, i%
  1643.     sz$ = LdString(SID_ERR_DRIVENOTMAPPED)
  1644.     i% = INSTR(sz$, "%")
  1645.     sz$ = MID(sz$, 1, i%-1) + szPath$ + MID(sz$, i%+2, LEN(sz$))
  1646.     i% = DoMsgBox (sz$, LdString(SID_TKT_STD_TITLE) , MB_OK)
  1647.     gEndStatementEncountered% = TRUE
  1648. END SUB
  1649.  
  1650. CONST DRIVE_UNKNOWN     = 0
  1651. CONST DRIVE_NO_ROOT_DIR = 1
  1652. CONST DRIVE_REMOVABLE   = 2
  1653. CONST DRIVE_FIXED       = 3
  1654. CONST DRIVE_REMOTE      = 4
  1655. CONST DRIVE_CDROM       = 5
  1656. CONST DRIVE_RAMDISK     = 6
  1657.  
  1658.  
  1659. PUBLIC FUNCTION IsDriveMapped(szPath$) AS INTEGER
  1660. '** Purpose:    Determine if a drive letter for shared component is currently
  1661. '** mapped or if UNC volume if the directory exists
  1662. '** Author:     JMD
  1663. '** Arguments:  Drive$        Drive letter to test
  1664. '** Returns:    TRUE if mapped
  1665. '*************************************************************************
  1666.     DIM sz$, lDrive$, i%, length%, drivetype%, uncOff&
  1667.  
  1668.     IsDriveMapped = FALSE
  1669.     IF szPath$="" THEN EXIT FUNCTION
  1670.     uncOff& = INSTR(1, szPath$, "\\")
  1671.     ' UNC Volume, check if directory exists
  1672.     IF uncOff > 0 THEN
  1673.         IF DoesDirExist(szPath$) = 1  THEN IsDriveMapped = TRUE
  1674.         EXIT FUNCTION
  1675.     END IF
  1676.     sz$ = LCASE(Lot_ExtractDriveLetter(szPath$)) 
  1677.     GetValidDrivesList("Drives")
  1678.     length% = GetListLength("Drives")
  1679.     FOR i% = 1 TO length%
  1680.         lDrive$ = GetListItem("Drives", i%)
  1681.         'See if it's really there
  1682.         IF LCASE(lDrive$) = sz$ THEN
  1683.             drivetype% = GetDriveType(LEFT(lDrive$,1)+ ":\")
  1684.             IF drivetype% = DRIVE_FIXED THEN IsDriveMapped = TRUE
  1685.             IF drivetype% = DRIVE_REMOTE THEN IsDriveMapped = TRUE
  1686.         END IF
  1687.     NEXT
  1688.     RemoveSymbol "Drives"
  1689. END FUNCTION
  1690.  
  1691. PUBLIC SUB Lot_RegisterHelpFile(szKey$, szDir$, FileName$)
  1692. '** Purpose:    Register help file in Windows registry and record it as an 
  1693. '**                 object in cinstall.ini for uninstall
  1694. '** Author:       JMD
  1695. '** Arguments:    szKey$        Section keyword
  1696. '**                 szDir$        Path to help file
  1697. '**                 FileName$   Help file name
  1698. '*************************************************************************
  1699.  
  1700.     DIM Size%
  1701.     Size% = lenbp(szDir$) + 1
  1702.     Lot_CreateRegKeyValueEx HKEY_LOCAL_MACHINE, gREGWINDOWSHELP, FileName$, _
  1703.         REG_SZ, szDir$, Size%
  1704.     Lot_RegisterObject szKey$, UNIN_CLASS_REGISTRY_VALUE$,_
  1705.         gHLM$ + "\" + gREGWINDOWSHELP + "\" + FileName$
  1706.  
  1707. END SUB
  1708.  
  1709. PUBLIC FUNCTION Lot_RefreshLocalComponentDir () AS INTEGER
  1710. '** Purpose:    Traverses the list of shared 32 bit component sections and if 
  1711. '**                 any are copied to the node it resets the source directory to the
  1712. '**                corresponding value in the "cinstall.ini" file
  1713. '** Author:     JMD
  1714. '** Arguments:  None
  1715. '** Returns:    SUCCESS
  1716. '*************************************************************************
  1717.     DIM Network$, ServerComponentPath$, KeyWordName$
  1718.     DIM ServerUserPath$, Source$, Dest$, Chapter$, ChapterSpec$, s$
  1719.  
  1720.     'Function only valid for node installs
  1721.    Network$ = GetSymbolValue(SYM_NETWORK$)
  1722.    IF Network$ <> gNODE$ THEN EXIT FUNCTION
  1723.     'Read the server locations corresponding to these special symbols
  1724.     ServerComponentPath$ = Lot_GetDestDirValueFromInstallini(SYM_COMPONENTSDIR$)
  1725.     ServerUserPath$ = Lot_GetDestDirValueFromInstallini(SYM_LOTUSUSERDIR$)
  1726.      'If no entry for User Directory on Server, assume same as components
  1727.      IF ServerUserPath$ = "" THEN ServerUserPath$ = ServerComponentPath$ 
  1728.     'Traverse the copy list for shared sections
  1729.     Chapter$ = Lot_GetFirst("", F_SHARE) 
  1730.     WHILE (Chapter$ <> "")
  1731.         KeyWordName$ = Lot_GetChapterValStr(Chapter$, F_KEYWORD)
  1732.         ' If the feature exists on the server, and it wants to be copied now..
  1733.         IF Lot_IsTheFeatureInstalled(KeyWordName$) = 1 AND _
  1734.             (CINT(FIsKeywordinCopyList (KeyWordName$)) <> FALSE) THEN
  1735.             s$ = Lot_GetChapterValStr(Chapter$, F_DESTDIRSYM)
  1736.             'Find out if it is a user or component section
  1737.             IF (s$ = SYM_LOTUSUSERDIR$) THEN
  1738.                 Source$ = ServerUserPath$ 
  1739.                 Dest$ = GetSymbolValue(s$)
  1740.             ELSEIF (s$ = SYM_COMPONENTSDIR$) THEN    
  1741.                 Source$ = ServerComponentPath$ 
  1742.                 Dest$ = GetSymbolValue(s$)
  1743.             ELSE    
  1744.                 'Could be WIN, WINSYS, don't reset
  1745.                 GOTO NEXTONE
  1746.             END IF
  1747.             ChapterSpec$ = Lot_GetChapterValStr(Chapter$, F_NOTHING)
  1748.             AddSectionFilesToCopyList ChapterSpec$,Source$,Dest$
  1749.         END IF
  1750. NEXTONE:
  1751.       Chapter$ = Lot_GetNext() 
  1752.     WEND
  1753.    Lot_RefreshLocalComponentDir = SUCCESS
  1754. END FUNCTION
  1755.  
  1756.  
  1757. SUB Lot_CreateAndRegisterUserSubdir(szSubKey$, szValueName$, LocCompPath$, bAppend%)
  1758. '** Purpose:    Create a user registry key for a user path, and verify that the
  1759. '**                path exists; if not, create it
  1760. '** Author:       JMD
  1761. '** Arguments:    
  1762. '**                szSubKey$        Registry key (of HCU)
  1763. '**                szValueName$    Registry value name
  1764. '**                LocCompPath$    Path to register and verify existence
  1765. '**                bAppend%            TRUE if append to existing entry
  1766. '*************************************************************************
  1767.     DIM s$
  1768.     'Make sure ends in trailing backslash
  1769.     LocCompPath$=Lot_TrimEndSlash(LocCompPath$)
  1770.     LocCompPath$= LocCompPath$ + "\"
  1771.     Lot_CreateUserRegistryEntry szSubKey$, szValueName$, LocCompPath$, bAppend%
  1772.     'Create the paths if they don't exist
  1773.     'and register the directory under the first product for uninstall
  1774.     IF DoesDirExist(LocCompPath$) = FALSE THEN 
  1775.         Lot_CreateDirectory(LocCompPath$) 
  1776.        s$ = Lot_GetChapterFromKeyword(Reg_GetProductAcronym(1) + gTOP$)
  1777.        s$ = Lot_GetChapterValStr(s$, F_KEYWORD)   
  1778.         Lot_RegisterObject s$, UNIN_CLASS_DIRECTORY$, LocCompPath$
  1779.     END IF
  1780. END SUB
  1781.  
  1782. SUB Lot_CreateUserRegistryEntry(szSubKey$, szValueName$, Value$, bAppend%)
  1783. '** Purpose:    Create a user registry key entry
  1784. '** Author:       JMD
  1785. '** Arguments:    
  1786. '**                szSubKey$        Registry key (of HCU)
  1787. '**                szValueName$    Registry value name
  1788. '**                Value$            Registry value 
  1789. '**                bAppend%            TRUE if append to existing entry
  1790. '*************************************************************************
  1791.     DIM gbuf$, nsize&, ret&, NewValue$, i%, s$
  1792.     NewValue$ = Value$
  1793.     IF bAppend% THEN
  1794.         ret& =  Lot_GetRegKeyValueEx(HKEY_CURRENT_USER, szSubKey$, szValueName$, _
  1795.                     0, gbuf$, nsize&) 
  1796.         gbuf$ = NullTrim(gbuf$)
  1797.         'Found the key, parse it and add to it
  1798.         IF ret& = ERROR_SUCCESS THEN
  1799.             DIM VALUELIST LIST AS INTEGER
  1800.             'Make a list of the values already there
  1801.             i% = 1
  1802.             DO
  1803.                 s$ =  Lot_GetNthFieldFromIniString (gbuf$, i%, ";")
  1804.                 s$ =  LCASE(s$)
  1805.                 VALUELIST(s$) = 1
  1806.                 i% = i% + 1
  1807.             LOOP UNTIL s$=""
  1808.             'Add it if it's not already there -- to beginning of list
  1809.             IF ISELEMENT(VALUELIST(LCASE(Value$))) THEN 
  1810.             '  It's already there -- no need to do anything
  1811.                 EXIT SUB
  1812.             ELSE
  1813.                 NewValue = Value$ + ";" + gbuf$
  1814.             END IF
  1815.         END IF
  1816.     END IF
  1817.     ret& = Lot_CreateRegKeyValueEx(HKEY_CURRENT_USER,_
  1818.                       szSubKey$,  szValueName, REG_SZ, NewValue$, LENBP(NewValue$)+1)
  1819.     IF ret& <> ERROR_SUCCESS THEN _
  1820.         RegErrorMsg SID_ERR_REG_GENERIC, gHCU$+"\"+szSubKey$,szValueName,NewValue$
  1821. END SUB
  1822.