|
|
1.1 root 1: '**************************************************************************
2: '* MSSetup Toolkit Sample 2
3: '**************************************************************************
4:
5: '$DEFINE DEBUG ''Define for script development/debugging
6:
7: '$INCLUDE 'setupapi.inc'
8: '$INCLUDE 'msdetect.inc'
9:
10: ''Dialog ID's
11: CONST ASKQUIT = 200
12: CONST DESTPATH = 300
13: CONST EXITFAILURE = 400
14: CONST EXITQUIT = 600
15: CONST EXITSUCCESS = 700
16: CONST OPTIONS = 800
17: CONST APPHELP = 900
18: CONST CUSTINST = 6200
19: CONST TOOBIG = 6300
20: CONST BADPATH = 6400
21:
22: ''Bitmap ID
23: CONST LOGO = 1
24:
25: ''File Types
26: CONST APPFILES = 1
27: CONST OPTFILES1 = 2
28: CONST OPTFILES2 = 3
29:
30:
31: GLOBAL DEST$ ''Default destination directory.
32: GLOBAL WINDRIVE$ ''Windows drive letter.
33: GLOBAL OPT1OPT$ ''Option selection from OptFiles1 option dialog.
34: GLOBAL OPT2OPT$ ''Option selection from OptFiles2 option dialog.
35:
36: ''CustInst list symbol names
37: GLOBAL APPNEEDS$ ''Option list costs per drive
38: GLOBAL OPT1NEEDS$
39: GLOBAL OPT2NEEDS$
40: GLOBAL EXTRACOSTS$ ''List of extra costs to add per drive
41: GLOBAL BIGLIST$ ''List of option files cost calc results (boolean)
42:
43: ''Dialog list symbol names
44: GLOBAL CHECKSTATES$
45: GLOBAL STATUSTEXT$
46: GLOBAL DRIVETEXT$
47:
48:
49: DECLARE SUB AddOptFilesToCopyList (ftype%)
50: DECLARE SUB RecalcOptFiles (ftype%)
51: DECLARE SUB RecalcPath
52: DECLARE SUB SetDriveStatus
53: DECLARE FUNCTION MakePath (szDir$, szFile$) AS STRING
54:
55:
56:
57: INIT:
58: CUIDLL$ = "mscuistf.dll" ''custom user interface dll
59: HELPPROC$ = "FHelpDlgProc" ''Help dialog procedure
60:
61: SetBitmap CUIDLL$, LOGO
62: SetTitle "MSSetup Toolkit Sample 2"
63:
64: szInf$ = GetSymbolValue("STF_SRCINFPATH")
65: IF szInf$ = "" THEN
66: szInf$ = GetSymbolValue("STF_CWDDIR") + "SAMPLE2.INF"
67: END IF
68: ReadInfFile szInf$
69:
70: WINDRIVE$ = MID$(GetWindowsDir, 1, 1)
71: DEST$ = WINDRIVE$ + ":\DEMO"
72:
73: ''CustInst list symbols
74: CHECKSTATES$ = "CheckItemsState"
75: STATUSTEXT$ = "StatusItemsText"
76: DRIVETEXT$ = "DriveStatusText"
77: FOR i% = 1 TO 3 STEP 1
78: AddListItem CHECKSTATES$, "ON"
79: NEXT i%
80: FOR i% = 1 TO 3 STEP 1
81: AddListItem STATUSTEXT$, ""
82: NEXT i%
83: FOR i% = 1 TO 7 STEP 1
84: AddListItem DRIVETEXT$, ""
85: NEXT i%
86: ReplaceListItem DRIVETEXT$, 7, DEST$
87:
88: ''Disk cost list symbols
89: APPNEEDS$ = "AppNeeds"
90: OPT1NEEDS$ = "Opt1Needs"
91: OPT2NEEDS$ = "Opt2Needs"
92: EXTRACOSTS$ = "ExtraCosts"
93: BIGLIST$ = "BigList"
94: FOR i% = 1 TO 3 STEP 1
95: AddListItem BIGLIST$, ""
96: NEXT i%
97: FOR i% = 1 TO 26 STEP 1
98: AddListItem EXTRACOSTS$, "0"
99: NEXT i%
100:
101: ''File Option Variables
102: OPT1OPT$ = "1"
103: OPT2OPT$ = "1"
104:
105: RecalcPath
106: SetDriveStatus
107:
108: '$IFDEF DEBUG
109: i% = SetSizeCheckMode(scmOnIgnore) '' could use scmOff; def = scmOnFatal
110: '$ENDIF ''DEBUG
111:
112:
113:
114: CUSTINST:
115: sz$ = UIStartDlg(CUIDLL$, CUSTINST, "FCustInstDlgProc", APPHELP, HELPPROC$)
116:
117: IF sz$ = "CONTINUE" THEN
118: ''Install only if it will fit.
119: FOR i% = 1 TO 3 STEP 1
120: IF GetListItem(BIGLIST$, i%) <> "" THEN
121: GOSUB TOOBIG
122: GOTO CUSTINST
123: END IF
124: NEXT i%
125: UIPop 1
126: GOTO INSTALL
127: ELSEIF sz$ = "PATH" THEN
128: GOTO GETPATH
129: ELSEIF sz$ = "CHK1" THEN
130: RecalcOptFiles APPFILES
131: SetDriveStatus
132: GOTO CUSTINST
133: ELSEIF sz$ = "CHK2" THEN
134: RecalcOptFiles OPTFILES1
135: SetDriveStatus
136: GOTO CUSTINST
137: ELSEIF sz$ = "CHK3" THEN
138: RecalcOptFiles OPTFILES2
139: SetDriveStatus
140: GOTO CUSTINST
141: ELSEIF sz$ = "BTN2" THEN
142: GOTO OPTFILES1
143: ELSEIF sz$ = "BTN3" THEN
144: GOTO OPTFILES2
145: ELSEIF sz$ = "REACTIVATE" THEN
146: RecalcPath
147: SetDriveStatus
148: GOTO CUSTINST
149: ELSE
150: GOSUB ASKQUIT
151: GOTO CUSTINST
152: END IF
153:
154:
155:
156: INSTALL:
157: ClearCopyList
158: AddOptFilesToCopyList APPFILES
159: AddOptFilesToCopyList OPTFILES1
160: AddOptFilesToCopyList OPTFILES2
161: CreateDir DEST$, cmoNone
162: CopyFilesInCopyList
163:
164: IF GetListItem(CHECKSTATES$, OPTFILES1) = "ON" THEN
165: ini$ = MakePath(DEST$, "DEMO.INI")
166: CreateIniKeyValue "WIN.INI", "MSSetup Sample 2", "Option1", OPT1OPT$, cmoNone
167: CreateIniKeyValue ini$, "Section 1", "Key 1", "Value 1" , cmoNone
168: CreateIniKeyValue ini$, "Section 2", "Key 2", "Value 2" , cmoNone
169: CreateIniKeyValue ini$, "Section 3", "Key 3", "Value 3" , cmoNone
170: ini$ = ""
171: END IF
172:
173: IF GetListItem(CHECKSTATES$, APPFILES) = "ON" THEN
174: CreateProgmanGroup "MSSetup Sample 2", "", cmoNone
175: ShowProgmanGroup "MSSetup Sample 2", 1, cmoNone
176: CreateProgmanItem "MSSetup Sample 2", "dialogs", "dlgedit.exe "+MakePath(DEST$,"dialogs.res"), "", cmoOverwrite
177: CreateProgmanItem "MSSetup Sample 2", "dlgprocs.c", "notepad.exe "+MakePath(DEST$,"dlgprocs.c"), "", cmoOverwrite
178: END IF
179:
180:
181: QUIT:
182: ON ERROR GOTO ERRQUIT
183:
184: IF ERR = 0 THEN
185: dlg% = EXITSUCCESS
186: ELSEIF ERR = STFQUIT THEN
187: dlg% = EXITQUIT
188: ELSE
189: dlg% = EXITFAILURE
190: END IF
191: QUITL1:
192: sz$ = UIStartDlg(CUIDLL$, dlg%, "FInfo0DlgProc", 0, "")
193: IF sz$ = "REACTIVATE" THEN
194: GOTO QUITL1
195: END IF
196: UIPop 1
197:
198: END
199:
200: ERRQUIT:
201: i% = DoMsgBox("Setup sources were corrupted, call 555-1212!", "Setup Message", MB_OK+MB_TASKMODAL+MB_ICONHAND)
202: END
203:
204:
205:
206: GETPATH:
207: SetSymbolValue "EditTextIn", DEST$
208: SetSymbolValue "EditFocus", "END"
209: GETPATHL1:
210: sz$ = UIStartDlg(CUIDLL$, DESTPATH, "FEditDlgProc", APPHELP, HELPPROC$)
211:
212: IF sz$ = "CONTINUE" THEN
213: olddest$ = DEST$
214: DEST$ = GetSymbolValue("EditTextOut")
215:
216: ''Validate new path.
217: IF IsDirWritable(DEST$) = 0 THEN
218: GOSUB BADPATH
219: GOTO GETPATHL1
220: END IF
221: UIPop 1
222:
223: ''Truncate display if too long.
224: IF LEN(DEST$) > 23 THEN
225: ReplaceListItem DRIVETEXT$, 7, MID$(DEST$, 1, 23)+"..."
226: ELSE
227: ReplaceListItem DRIVETEXT$, 7, DEST$
228: END IF
229:
230: ''Recalc if path changed.
231: IF (olddest$ <> DEST$) AND (olddest$ <> DEST$+"\") AND (olddest$+"\" <> DEST$) THEN
232: RecalcPath
233: SetDriveStatus
234: END IF
235:
236: olddest$ = ""
237: GOTO CUSTINST
238: ELSEIF sz$ = "REACTIVATE" THEN
239: RecalcPath
240: SetDriveStatus
241: GOTO GETPATHL1
242: ELSEIF sz$ = "EXIT" THEN
243: GOSUB ASKQUIT
244: GOTO GETPATHL1
245: ELSE
246: UIPop 1
247: GOTO CUSTINST
248: END IF
249:
250:
251:
252: OPTFILES1:
253: SetSymbolValue "RadioDefault", OPT1OPT$
254: OPT1L1:
255: sz$ = UIStartDlg(CUIDLL$, OPTIONS, "FRadioDlgProc", APPHELP, HELPPROC$)
256: newopt$ = GetSymbolValue("ButtonChecked")
257:
258: IF sz$ = "CONTINUE" THEN
259: UIPop 1
260: IF newopt$ <> OPT1OPT$ THEN
261: OPT1OPT$ = newopt$
262: RecalcOptFiles OPTFILES1
263: SetDriveStatus
264: END IF
265: newopt$ = ""
266: GOTO CUSTINST
267: ELSEIF sz$ = "REACTIVATE" THEN
268: RecalcPath
269: SetDriveStatus
270: GOTO OPT1L1
271: ELSEIF sz$ = "EXIT" THEN
272: GOSUB ASKQUIT
273: GOTO OPT1L1
274: ELSE
275: UIPop 1
276: newopt$ = ""
277: GOTO CUSTINST
278: END IF
279:
280:
281:
282: OPTFILES2:
283: SetSymbolValue "RadioDefault", OPT2OPT$
284: OPT2L1:
285: sz$ = UIStartDlg(CUIDLL$, OPTIONS, "FRadioDlgProc", APPHELP, HELPPROC$)
286: newopt$ = GetSymbolValue("ButtonChecked")
287:
288: IF sz$ = "CONTINUE" THEN
289: UIPop 1
290: IF newopt$ <> OPT2OPT$ THEN
291: OPT2OPT$ = newopt$
292: RecalcOptFiles OPTFILES2
293: SetDriveStatus
294: END IF
295: newopt$ = ""
296: GOTO CUSTINST
297: ELSEIF sz$ = "REACTIVATE" THEN
298: RecalcPath
299: SetDriveStatus
300: GOTO OPT2L1
301: ELSEIF sz$ = "EXIT" THEN
302: GOSUB ASKQUIT
303: GOTO OPT2L1
304: ELSE
305: UIPop 1
306: newopt$ = ""
307: GOTO CUSTINST
308: END IF
309:
310:
311:
312: TOOBIG:
313: sz$ = UIStartDlg(CUIDLL$, TOOBIG, "FInfo0DlgProc", 0, "")
314: IF sz$ = "REACTIVATE" THEN
315: RecalcPath
316: SetDriveStatus
317: GOTO TOOBIG
318: END IF
319: UIPop 1
320: RETURN
321:
322:
323:
324: BADPATH:
325: sz$ = UIStartDlg(CUIDLL$, BADPATH, "FInfo0DlgProc", 0, "")
326: IF sz$ = "REACTIVATE" THEN
327: RecalcPath
328: SetDriveStatus
329: GOTO BADPATH
330: END IF
331: UIPop 1
332: RETURN
333:
334:
335:
336: ASKQUIT:
337: sz$ = UIStartDlg(CUIDLL$, ASKQUIT, "FQuitDlgProc", 0, "")
338:
339: IF sz$ = "EXIT" THEN
340: UIPopAll
341: ERROR STFQUIT
342: ELSEIF sz$ = "REACTIVATE" THEN
343: GOTO ASKQUIT
344: ELSE
345: UIPop 1
346: END IF
347: RETURN
348:
349:
350:
351: '**
352: '** Purpose:
353: '** Adds the specified option files to the copy list.
354: '** Arguments:
355: '** ftype% - type of files to add, one of the following:
356: '** APPFILES, OPTFILES1, OPTFILES2
357: '** Returns:
358: '** none.
359: '*************************************************************************
360: SUB AddOptFilesToCopyList (ftype%) STATIC
361:
362: IF GetListItem(CHECKSTATES$, ftype%) = "ON" THEN
363: SrcDir$ = GetSymbolValue("STF_SRCDIR")
364: IF ftype% = APPFILES THEN
365: AddSectionFilesToCopyList "AppFiles", SrcDir$, DEST$
366: ELSEIF ftype% = OPTFILES1 THEN
367: AddSectionKeyFileToCopyList "OptFiles1", OPT1OPT$, SrcDir$, DEST$
368: ELSEIF ftype% = OPTFILES2 THEN
369: AddSectionKeyFileToCopyList "OptFiles2", OPT2OPT$, SrcDir$, DEST$
370: END IF
371: SrcDir$ = ""
372: END IF
373: END SUB
374:
375:
376: '**
377: '** Purpose:
378: '** Recalculates disk space for the given option files and sets
379: '** the status info symbol "StatusItemsText".
380: '** Arguments:
381: '** ftype% - type of files to add, one of the following:
382: '** APPFILES, OPTFILES1, OPTFILES2
383: '** Returns:
384: '** none.
385: '*************************************************************************
386: SUB RecalcOptFiles (ftype%) STATIC
387: CursorSave% = ShowWaitCursor()
388: ClearCopyList
389: AddOptFilesToCopyList ftype%
390:
391: fExtra% = 0
392: IF ftype% = APPFILES THEN
393: ListSym$ = APPNEEDS$
394: IF GetListItem(CHECKSTATES$, APPFILES) = "ON" THEN
395: ''Add extra cost to Windows drive for ini/progman, etc.
396: ndrive% = ASC(ucase$(WINDRIVE$)) - ASC("A") + 1
397: ReplaceListItem EXTRACOSTS$, ndrive%, "10240"
398: fExtra% = 1
399: END IF
400: ELSEIF ftype% = OPTFILES1 THEN
401: ListSym$ = OPT1NEEDS$
402: ELSEIF ftype% = OPTFILES2 THEN
403: ListSym$ = OPT2NEEDS$
404: END IF
405:
406: StillNeed& = GetCopyListCost(EXTRACOSTS$, ListSym$, "")
407:
408: cost& = 0
409: FOR i% = 1 TO 26 STEP 1
410: cost& = cost& + VAL(GetListItem(ListSym$, i%))
411: NEXT i%
412: ReplaceListItem STATUSTEXT$, ftype%, STR$(cost& / 1024) + " K"
413:
414: IF StillNeed& > 0 THEN
415: ReplaceListItem BIGLIST$, ftype%, "YES"
416: ELSE
417: ReplaceListItem BIGLIST$, ftype%, ""
418: END IF
419:
420: IF fExtra% THEN
421: ReplaceListItem EXTRACOSTS$, ndrive%, "0"
422: END IF
423: RestoreCursor CursorSave%
424: ListSym$ = ""
425: END SUB
426:
427:
428: '**
429: '** Purpose:
430: '** Recalculates disk space and sets option status info according
431: '** to the current destination path.
432: '** Arguments:
433: '** none.
434: '** Returns:
435: '** none.
436: '*************************************************************************
437: SUB RecalcPath STATIC
438:
439: CursorSave% = ShowWaitCursor()
440:
441: RecalcOptFiles APPFILES
442: RecalcOptFiles OPTFILES1
443: RecalcOptFiles OPTFILES2
444:
445: RestoreCursor CursorSave%
446: END SUB
447:
448:
449: '**
450: '** Purpose:
451: '** Sets drive status info according to latest disk space calcs.
452: '** Arguments:
453: '** none.
454: '** Returns:
455: '** none.
456: '*************************************************************************
457: SUB SetDriveStatus STATIC
458:
459: drive$ = MID$(DEST$, 1, 1)
460: ndrive% = ASC(ucase$(drive$)) - ASC("A") + 1
461: cost& = VAL(GetListItem(APPNEEDS$, ndrive%)) + VAL(GetListItem(OPT1NEEDS$, ndrive%)) + VAL(GetListItem(OPT2NEEDS$, ndrive%))
462: free& = GetFreeSpaceForDrive(drive$)
463: ReplaceListItem DRIVETEXT$, 1, drive$ + ":"
464: ReplaceListItem DRIVETEXT$, 2, STR$(cost& / 1024) + " K"
465: ReplaceListItem DRIVETEXT$, 3, STR$(free& / 1024) + " K"
466:
467: IF drive$ = WINDRIVE$ THEN
468: ReplaceListItem DRIVETEXT$, 4, ""
469: ReplaceListItem DRIVETEXT$, 5, ""
470: ReplaceListItem DRIVETEXT$, 6, ""
471: ELSE
472: ndrive% = ASC(ucase$(WINDRIVE$)) - ASC("A") + 1
473: cost& = VAL(GetListItem(APPNEEDS$, ndrive%)) + VAL(GetListItem(OPT1NEEDS$, ndrive%)) + VAL(GetListItem(OPT2NEEDS$, ndrive%))
474: IF cost& = 0 THEN
475: ReplaceListItem DRIVETEXT$, 4, ""
476: ReplaceListItem DRIVETEXT$, 5, ""
477: ReplaceListItem DRIVETEXT$, 6, ""
478: ELSE
479: free& = GetFreeSpaceForDrive(WINDRIVE$)
480: ReplaceListItem DRIVETEXT$, 4, WINDRIVE$ + ":"
481: ReplaceListItem DRIVETEXT$, 5, STR$(cost& / 1024) + " K"
482: ReplaceListItem DRIVETEXT$, 6, STR$(free& / 1024) + " K"
483: END IF
484: END IF
485: END SUB
486:
487:
488: '**
489: '** Purpose:
490: '** Appends a file name to the end of a directory path,
491: '** inserting a backslash character as needed.
492: '** Arguments:
493: '** szDir$ - full directory path (with optional ending "\")
494: '** szFile$ - filename to append to directory
495: '** Returns:
496: '** Resulting fully qualified path name.
497: '*************************************************************************
498: FUNCTION MakePath (szDir$, szFile$) STATIC AS STRING
499: IF szDir$ = "" THEN
500: MakePath = szFile$
501: ELSEIF szFile$ = "" THEN
502: MakePath = szDir$
503: ELSEIF MID$(szDir$, LEN(szDir$), 1) = "\" THEN
504: MakePath = szDir$ + szFile$
505: ELSE
506: MakePath = szDir$ + "\" + szFile$
507: END IF
508: END FUNCTION
509:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.