source: trunk/dll/init.c@ 1120

Last change on this file since 1120 was 1120, checked in by Gregg Young, 17 years ago

Check TMP directory space warn if lee than 5 MiB prevent archiver from opening if less than 10 KiB (It hangs and can't be closed) (Ticket 214) Also some cleanup of the error messages for CheckDriveSpaceAvail.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 53.0 KB
Line 
1
2/***********************************************************************
3
4 $Id: init.c 1120 2008-08-26 01:08:28Z gyoung $
5
6 Initialization
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2001, 2008 Steven H. Levine
10
11 11 Jun 02 SHL Add CheckVersion
12 11 Jun 03 SHL Add JFS and FAT32 support
13 25 Nov 03 SHL InitFM3DLL: correct strings error mesage
14 23 May 05 SHL Use datamin.h
15 26 May 05 SHL Comments
16 06 Jun 05 SHL indent -i2
17 06 Jun 05 SHL Rework FindSwapperDat for VAC3.65 compat
18 13 Jul 06 SHL Use Runtime_Error
19 13 Jul 06 SHL Sync with current style
20 29 Jul 06 SHL Use xfgets
21 22 Oct 06 GKY Add NDFS32 support
22 18 Feb 07 GKY Add ISOFS, RAMFS support
23 30 Mar 07 GKY Defined golbals for removing GetPString for window class names
24 21 Apr 07 GKY Find FM2Utils by path or utils directory eleminate fAddUtils global
25 15 Jun 07 SHL Make OpenWatcom compatible
26 23 Jun 07 GKY Fix WORPLACE_PROCESS enviroment check logic
27 28 Jun 07 SHL Rework WORKPLACE_PROCESS check to match reality
28 03 Aug 07 GKY Enlarged and made setable everywhere Findbuf (speed file loading)
29 06 Aug 07 GKY Reduce DosSleep times (ticket 148)
30 13 Aug 07 SHL Move #pragma alloc_text to end for OpenWatcom compat
31 18 Aug 07 JBS Added code to read Details* keys from the INI file (Ticket 118)
32 19 Aug 07 SHL Ensure FilesToGet in valid range
33 21 Aug 07 GKY Make Subject column in dircnr sizable and movable from the rigth to the left pane
34 23 Aug 07 SHL InitFM3DLL: report INI file DosSetPathInfo error correctly
35 23 Aug 07 SHL Use BldFullPathName
36 25 Aug 07 SHL Work around DosSetPathInfo kernel defect
37 01 Sep 07 GKY Use xDosSetPathInfo to fix case where FS3 buffer crosses 64k boundry
38 10 Nov 07 GKY Get thousands separator from country info for file sizes.
39 26 Nov 07 GKY Eliminate check of ext path on start up
40 17 Dec 07 GKY Make WPURLDEFAULTSETTINGS the fall back for ftp/httprun
41 13 Jan 08 GKY Get Subjectwidth/Subjectleft working in the collector.
42 12 Feb 08 SHL Compile OpenWatcom version into binary
43 29 Feb 08 GKY Changes to enable user settable command line length
44 29 Feb 08 GKY Refactor global command line variables to notebook.h
45 08 Mar 08 JBS Ticket 230: Replace prefixless INI keys for default directory containers with
46 keys using a "DirCnr." prefix
47 20 Apr 08 GKY Change default cmd line length to 1024 Ask once if user wants to reset it.
48 11 Jul 08 JBS Ticket 230: Simplified code and eliminated some local variables by incorporating
49 all the details view settings (both the global variables and those in the
50 DIRCNRDATA struct) into a new struct: DETAILS_SETTINGS.
51 16 JUL 08 GKY Use TMP directory for temp files
52 17 Jul 08 SHL Reduce code bulk in fUseTmp setup
53 19 Jul 08 GKY Use pFM2SaveDirectory, MakeTempName and move temp files to TMP subdirectory if (TMP).
54 20 Jul 08 JBS Ticket 114: Support user-selectable env. strings in Tree container.
55 20 Jul 08 GKY Add support to delete orphaned tmp directories without deleting tmp of other
56 running sessions
57 23 Aug 08 GKY Check that space on TMP & FM2 save drives exceed 5 GiB; Done to allow user setting of
58 minimum size in future
59
60***********************************************************************/
61
62#include <stdlib.h>
63#include <string.h>
64#include <share.h>
65#include <process.h>
66
67#define INCL_DOS
68#define INCL_WIN
69#define INCL_MMIOOS2
70#define INCL_GPI
71#define INCL_DOSERRORS
72#define INCL_LONGLONG
73#define INCL_DOSNLS
74#include <os2.h>
75#include <os2me.h>
76
77#define DEFINE_GLOBALS 1
78
79#include "fm3dlg.h"
80#include "datamin.h"
81#include "tools.h"
82#include "fm3str.h"
83#include "version.h"
84#include "pathutil.h" // BldFullPathName
85#include "arccnrs.h" // ArcClientWndProc
86#include "errutil.h" // Dos_Error...
87#include "strutil.h" // GetPString
88#include "fm3dll.h"
89#include "notebook.h" // command line variables (editor etc)
90#include "fortify.h"
91
92#ifdef __IBMC__
93#pragma alloc_text(INIT,LibMain,InitFM3DLL,DeInitFM3DLL)
94#pragma alloc_text(INIT1,StartFM3,FindSwapperDat)
95#endif
96
97extern int _CRT_init(void);
98extern void _CRT_term(void);
99
100#ifdef __WATCOMC__
101#define a(x) #x
102#define b(x) a(x)
103// Must be global to prevent warnings
104PSZ pszBuiltWith = "Built with OpenWatcom version " b(__WATCOMC__);
105#undef b
106#undef a
107#endif
108
109static PSZ pszSrcFile = __FILE__;
110
111BOOL CheckFileHeader(CHAR *filespec, CHAR *signature, LONG offset);
112
113VOID FindSwapperDat(VOID)
114{
115 CHAR filename[] = "C:\\CONFIG.SYS";
116 CHAR input[8192];
117 CHAR *p;
118 CHAR *pp;
119 FILE *fp;
120 FILEFINDBUF3L ffb;
121 ULONG nm;
122 ULONG size = sizeof(SwapperDat);
123 HDIR hdir = HDIR_CREATE;
124 APIRET rc = 1;
125
126 *SwapperDat = 0;
127 // Check already known
128 PrfQueryProfileData(fmprof, FM3Str, "SwapperDat", SwapperDat, &size);
129 if (*SwapperDat) {
130 nm = 1;
131 rc = DosFindFirst(SwapperDat,
132 &hdir,
133 FILE_NORMAL | FILE_ARCHIVED |
134 FILE_HIDDEN | FILE_SYSTEM | FILE_READONLY,
135 &ffb, sizeof(ffb), &nm, FIL_STANDARDL);
136 if (rc && rc != ERROR_FILE_NOT_FOUND && rc != ERROR_PATH_NOT_FOUND) {
137 FILEFINDBUF3 ffb;
138 rc = DosFindFirst(SwapperDat,
139 &hdir,
140 FILE_NORMAL | FILE_ARCHIVED |
141 FILE_HIDDEN | FILE_SYSTEM | FILE_READONLY,
142 &ffb, sizeof(ffb), &nm, FIL_STANDARD);
143 fNoLargeFileSupport = TRUE;
144 }
145 if (!rc) {
146 DosFindClose(hdir);
147 fp = fopen(SwapperDat, "r");
148 if (fp) {
149 fclose(fp);
150 *SwapperDat = 0;
151 rc = 1; // Force config.sys scan
152 }
153 }
154 else
155 *SwapperDat = 0;
156 }
157 // If not defined in INI or INI wrong, scan config.sys for SWAPPATH statement
158 if (rc) {
159 if (DosQuerySysInfo(QSV_BOOT_DRIVE,
160 QSV_BOOT_DRIVE,
161 &nm,
162 sizeof(ULONG))) {
163 nm = 3; // Assume drive C:
164 }
165 *filename = (CHAR) nm + '@';
166 fp = xfsopen(filename, "r", SH_DENYNO, pszSrcFile, __LINE__);
167 if (fp) {
168 while (!feof(fp)) {
169 if (!xfgets(input, sizeof(input), fp, pszSrcFile, __LINE__))
170 break;
171 lstrip(input);
172 if (!strnicmp(input, "SWAPPATH", 8)) {
173 p = input + 8;
174 while (*p == ' ')
175 p++;
176 if (*p == '=') {
177 p++;
178 stripcr(p);
179 rstrip(p);
180 while (*p == ' ')
181 p++;
182 if (*p == '\"') {
183 p++;
184 pp = p;
185 while (*pp && *pp != '\"')
186 *pp += 1;
187 if (*pp)
188 *pp = 0;
189 }
190 else {
191 pp = strchr(p, ' ');
192 if (pp)
193 *pp = 0;
194 }
195 if (*p) {
196 strncpy(SwapperDat, p, CCHMAXPATH);
197 SwapperDat[CCHMAXPATH - 1] = 0;
198 BldFullPathName(SwapperDat, SwapperDat, "SWAPPER.DAT");
199 hdir = HDIR_CREATE;
200 nm = 1;
201 rc = DosFindFirst(SwapperDat,
202 &hdir,
203 FILE_NORMAL | FILE_ARCHIVED |
204 FILE_HIDDEN | FILE_SYSTEM | FILE_READONLY,
205 &ffb, sizeof(ffb), &nm, FIL_STANDARD);
206 if (rc){
207 FILEFINDBUF3 ffb;
208 rc = DosFindFirst(SwapperDat,
209 &hdir,
210 FILE_NORMAL | FILE_ARCHIVED |
211 FILE_HIDDEN | FILE_SYSTEM | FILE_READONLY,
212 &ffb, sizeof(ffb), &nm, FIL_STANDARD);
213 fNoLargeFileSupport = TRUE;
214 }
215 if (!rc) {
216 DosFindClose(hdir);
217 PrfWriteProfileString(fmprof,
218 FM3Str, "SwapperDat", SwapperDat);
219 }
220 else
221 *SwapperDat = 0;
222 break;
223 }
224 }
225 } // if SWAPPATH
226 } // while
227 fclose(fp);
228 }
229 }
230}
231
232#ifdef __WATCOMC__
233
234unsigned APIENTRY LibMain(unsigned hModule,
235 unsigned ulFlag)
236{
237 CHAR *env;
238 CHAR stringfile[CCHMAXPATH];
239 FILESTATUS3 fsa;
240 APIRET rc;
241
242 switch (ulFlag) {
243 case 0:
244 // 14 Jun 07 SHL Already done for us
245 // if (_CRT_init() == -1)
246 // return 0UL;
247 FM3DllHandle = hModule;
248 strcpy(stringfile, "FM3RES.STR");
249 env = getenv("FM3INI");
250 if (env) {
251 DosError(FERR_DISABLEHARDERR);
252 rc = DosQueryPathInfo(env, FIL_STANDARD, &fsa, sizeof(fsa));
253 if (!rc) {
254 if (fsa.attrFile & FILE_DIRECTORY) {
255 BldFullPathName(stringfile, env, "FM3RES.STR");
256 DosError(FERR_DISABLEHARDERR);
257 if (DosQueryPathInfo(stringfile, FIL_STANDARD, &fsa, sizeof(fsa)))
258 strcpy(stringfile, "FM3RES.STR");
259 }
260 }
261 }
262 LoadStrings(stringfile);
263
264 DosError(FERR_DISABLEHARDERR);
265 /* strings here to prevent multiple occurences in DLL */
266 FM2Str = "FM/2";
267 FM3Str = "FM/3";
268 NullStr = "";
269 Default = "DEFAULT";
270 Settings = "SETTINGS";
271 WPProgram = "WPProgram";
272 FM3Folder = "<FM3_Folder>";
273 FM3Tools = "<FM3_Tools>";
274 DRM_OS2FILE = "DRM_OS2FILE";
275 DRM_FM2ARCMEMBER = "DRM_FM2ARCMEMBER";
276 DRF_FM2ARCHIVE = "DRF_FM2ARCHIVE";
277 DRMDRFLIST = "<DRM_OS2FILE,DRF_UNKNOWN>,"
278 "<DRM_DISCARD,DRF_UNKNOWN>," "<DRM_PRINT,DRF_UNKNOWN>";
279 DRMDRFOS2FILE = "<DRM_OS2FILE,DRF_UNKNOWN>";
280 DRMDRFFM2ARC = "<DRM_FM2ARCMEMBER,DRF_FM2ARCHIVE>";
281 DRM_FM2INIRECORD = "DRM_FM2INIRECORD";
282 DRF_FM2INI = "DRF_FM2INI";
283 SUBJECT = ".SUBJECT";
284 LONGNAME = ".LONGNAME";
285 HPFS = "HPFS";
286 JFS = "JFS";
287 CDFS = "CDFS";
288 ISOFS = "ISOFS";
289 FAT32 = "FAT32";
290 HPFS386 = "HPFS386";
291 CBSIFS = "CBSIFS";
292 NDFS32 = "NDFS32";
293 RAMFS = "RAMFS";
294 NTFS = "NTFS";
295 WC_OBJECTWINDOW = "WC_OBJECTWINDOW";
296 WC_BUBBLE = "WC_BUBBLE";
297 WC_TOOLBUTTONS = "WC_TOOLBUTTONS";
298 WC_DRIVEBUTTONS = "WC_DRIVEBUTTONS";
299 WC_DIRCONTAINER = "WC_DIRCONTAINER";
300 WC_DIRSTATUS = "WC_DIRSTATUS";
301 WC_TREECONTAINER = "WC_TREECONTAINER";
302 WC_TREEOPENBUTTON = "WC_TREEOPENBUTTON";
303 WC_TREESTATUS = "WC_TREESTATUS";
304 WC_MAINWND = "WC_MAINWND";
305 WC_MAINWND2 = "WC_MAINWND2";
306 WC_AUTOVIEW = "WC_AUTOVIEW";
307 WC_LED = "WC_LED";
308 WC_COLLECTOR = "WC_COLLECTOR";
309 WC_COLSTATUS = "WC_COLSTATUS";
310 WC_STATUS = "WC_STATUS";
311 WC_TOOLBACK = "WC_TOOLBACK";
312 WC_DRIVEBACK = "WC_DRIVEBACK";
313 WC_ARCCONTAINER = "WC_ARCCONTAINER";
314 WC_ARCSTATUS = "WC_ARCSTATUS";
315 WC_MLEEDITOR = "WC_MLEEDITOR";
316 WC_INIEDITOR = "WC_INIEDITOR";
317 WC_SEEALL = "WC_SEEALL";
318 WC_NEWVIEW = "WC_NEWVIEW";
319 WC_SEESTATUS = "WC_SEESTATUS";
320 WC_VIEWSTATUS = "WC_VIEWSTATUS";
321 WC_ERRORWND = "WC_ERRORWND";
322 WC_MINITIME = "WC_MINITIME";
323 WC_DATABAR = "WC_DATABAR";
324
325 /* end of strings */
326 memset(&RGBBLACK, 0, sizeof(RGB2));
327 RGBGREY.bRed = RGBGREY.bGreen = RGBGREY.bBlue = (BYTE)204;
328 RGBGREY.fcOptions = 0;
329 FM3UL = *(ULONG *)FM3Str;
330 DEBUG_STRING = "Debug -- please report to author";
331 break;
332 case 1:
333 StopPrinting = 1;
334 if (fmprof)
335 PrfCloseProfile(fmprof);
336 DosError(FERR_ENABLEHARDERR);
337 // 14 Jun 07 SHL Already done for us
338 // _CRT_term();
339 break;
340 default:
341 return 0UL;
342 }
343 return 1UL;
344}
345
346#else // __IBMC__
347
348unsigned long _System _DLL_InitTerm(unsigned long hModule,
349 unsigned long ulFlag)
350{
351 CHAR *env;
352 CHAR stringfile[CCHMAXPATH];
353 FILESTATUS3 fsa;
354 APIRET rc;
355
356 switch (ulFlag) {
357 case 0:
358 if (_CRT_init() == -1)
359 return 0UL;
360 FM3DllHandle = hModule;
361 strcpy(stringfile, "FM3RES.STR");
362 env = getenv("FM3INI");
363 if (env) {
364 DosError(FERR_DISABLEHARDERR);
365 rc = DosQueryPathInfo(env, FIL_STANDARD, &fsa, sizeof(fsa));
366 if (!rc) {
367 if (fsa.attrFile & FILE_DIRECTORY) {
368 BldFullPathName(stringfile, env, "FM3RES.STR");
369 DosError(FERR_DISABLEHARDERR);
370 if (DosQueryPathInfo(stringfile, FIL_STANDARD, &fsa, sizeof(fsa)))
371 strcpy(stringfile, "FM3RES.STR");
372 }
373 }
374 }
375 LoadStrings(stringfile);
376
377 DosError(FERR_DISABLEHARDERR);
378 /* strings here to prevent multiple occurences in DLL */
379 FM2Str = "FM/2";
380 FM3Str = "FM/3";
381 NullStr = "";
382 Default = "DEFAULT";
383 Settings = "SETTINGS";
384 WPProgram = "WPProgram";
385 FM3Folder = "<FM3_Folder>";
386 FM3Tools = "<FM3_Tools>";
387 DRM_OS2FILE = "DRM_OS2FILE";
388 DRM_FM2ARCMEMBER = "DRM_FM2ARCMEMBER";
389 DRF_FM2ARCHIVE = "DRF_FM2ARCHIVE";
390 DRMDRFLIST = "<DRM_OS2FILE,DRF_UNKNOWN>,"
391 "<DRM_DISCARD,DRF_UNKNOWN>," "<DRM_PRINT,DRF_UNKNOWN>";
392 DRMDRFOS2FILE = "<DRM_OS2FILE,DRF_UNKNOWN>";
393 DRMDRFFM2ARC = "<DRM_FM2ARCMEMBER,DRF_FM2ARCHIVE>";
394 DRM_FM2INIRECORD = "DRM_FM2INIRECORD";
395 DRF_FM2INI = "DRF_FM2INI";
396 SUBJECT = ".SUBJECT";
397 LONGNAME = ".LONGNAME";
398 HPFS = "HPFS";
399 JFS = "JFS";
400 CDFS = "CDFS";
401 ISOFS = "ISOFS";
402 FAT32 = "FAT32";
403 HPFS386 = "HPFS386";
404 CBSIFS = "CBSIFS";
405 NDFS32 = "NDFS32";
406 RAMFS = "RAMFS";
407 NTFS = "NTFS";
408 WC_OBJECTWINDOW = "WC_OBJECTWINDOW";
409 WC_BUBBLE = "WC_BUBBLE";
410 WC_TOOLBUTTONS = "WC_TOOLBUTTONS";
411 WC_DRIVEBUTTONS = "WC_DRIVEBUTTONS";
412 WC_DIRCONTAINER = "WC_DIRCONTAINER";
413 WC_DIRSTATUS = "WC_DIRSTATUS";
414 WC_TREECONTAINER = "WC_TREECONTAINER";
415 WC_TREEOPENBUTTON = "WC_TREEOPENBUTTON";
416 WC_TREESTATUS = "WC_TREESTATUS";
417 WC_MAINWND = "WC_MAINWND";
418 WC_MAINWND2 = "WC_MAINWND2";
419 WC_AUTOVIEW = "WC_AUTOVIEW";
420 WC_LED = "WC_LED";
421 WC_COLLECTOR = "WC_COLLECTOR";
422 WC_COLSTATUS = "WC_COLSTATUS";
423 WC_STATUS = "WC_STATUS";
424 WC_TOOLBACK = "WC_TOOLBACK";
425 WC_DRIVEBACK = "WC_DRIVEBACK";
426 WC_ARCCONTAINER = "WC_ARCCONTAINER";
427 WC_ARCSTATUS = "WC_ARCSTATUS";
428 WC_MLEEDITOR = "WC_MLEEDITOR";
429 WC_INIEDITOR = "WC_INIEDITOR";
430 WC_SEEALL = "WC_SEEALL";
431 WC_NEWVIEW = "WC_NEWVIEW";
432 WC_SEESTATUS = "WC_SEESTATUS";
433 WC_VIEWSTATUS = "WC_VIEWSTATUS";
434 WC_ERRORWND = "WC_ERRORWND";
435 WC_MINITIME = "WC_MINITIME";
436 WC_DATABAR = "WC_DATABAR";
437
438 /* end of strings */
439 memset(&RGBBLACK, 0, sizeof(RGB2));
440 RGBGREY.bRed = RGBGREY.bGreen = RGBGREY.bBlue = (BYTE)204;
441 RGBGREY.fcOptions = 0;
442 FM3UL = *(ULONG *)FM3Str;
443 DEBUG_STRING = "Debug -- please report to author";
444 break;
445 case 1:
446 StopPrinting = 1;
447 if (fmprof)
448 PrfCloseProfile(fmprof);
449 DosError(FERR_ENABLEHARDERR);
450 _CRT_term();
451 break;
452 default:
453 return 0UL;
454 }
455 return 1UL;
456}
457
458#endif // __IBMC__
459
460VOID APIENTRY DeInitFM3DLL(ULONG why)
461{
462 /* cleanup */
463 static CHAR s[CCHMAXPATH];
464 CHAR *enddir, szTempFile[CCHMAXPATH];
465 HDIR search_handle;
466 ULONG num_matches;
467 FILEFINDBUF3 ffb;
468
469 StopTimer();
470 StopPrinting = 1;
471
472 if (LogFileHandle)
473 fclose(LogFileHandle);
474
475 if (fmprof) {
476 PrfCloseProfile(fmprof);
477 fmprof = (HINI) 0;
478 if (fIniExisted) {
479 DosError(FERR_DISABLEHARDERR);
480 DosCopy("FM3.INI", "FM3INI.BAK", DCPY_EXISTING);
481 }
482 }
483
484 if (fToolsChanged)
485 save_tools(NULL);
486
487# ifdef __IBMC__
488 _fcloseall();
489# else // __WATCOMC__
490 fcloseall();
491# endif
492
493 save_dir(s);
494 if (s[strlen(s) - 1] != '\\')
495 strcat(s, "\\");
496 enddir = &s[strlen(s)];
497 if (*ArcTempRoot) {
498 strcat(s, ArcTempRoot);
499 strcat(s, "*");
500 search_handle = HDIR_CREATE;
501 num_matches = 1L;
502 if (!DosFindFirst(s,
503 &search_handle,
504 FILE_NORMAL | FILE_DIRECTORY |
505 FILE_SYSTEM | FILE_READONLY | FILE_HIDDEN |
506 FILE_ARCHIVED,
507 &ffb, sizeof(ffb), &num_matches, FIL_STANDARD)) {
508 do {
509 strcpy(enddir, ffb.achName);
510 if (ffb.attrFile & FILE_DIRECTORY) {
511 wipeallf("%s\\*", s);
512 DosDeleteDir(s);
513 }
514 else
515 unlinkf("%s", s);
516 }
517 while (!DosFindNext(search_handle,
518 &ffb, sizeof(ffb), &num_matches));
519 DosFindClose(search_handle);
520 }
521 }
522 if (pTmpDir)
523 strcpy(s, pTmpDir);
524 else
525 strcpy(s, pFM2SaveDirectory);
526 if (s[strlen(s) - 1] != '\\')
527 strcat(s, "\\");
528 enddir = &s[strlen(s)];
529 strcat(s, "$FM2LI$T.");
530 strcat(s, "???");
531 search_handle = HDIR_CREATE;
532 num_matches = 1;
533 if (!DosFindFirst(s,
534 &search_handle,
535 FILE_NORMAL | FILE_DIRECTORY |
536 FILE_SYSTEM | FILE_READONLY | FILE_HIDDEN |
537 FILE_ARCHIVED,
538 &ffb, sizeof(ffb), &num_matches, FIL_STANDARD)) {
539 do {
540 if (!(ffb.attrFile & FILE_DIRECTORY)) {
541 strcpy(enddir, ffb.achName);
542 unlinkf("%s", s);
543 }
544 }
545 while (!DosFindNext(search_handle,
546 &ffb, sizeof(ffb), &num_matches));
547 DosFindClose(search_handle);
548 }
549 BldFullPathName(szTempFile, pTmpDir, "$FM2PLAY.$$$");
550 DosForceDelete(szTempFile);
551 if (pTmpDir) {
552 wipeallf("%s\\*", pTmpDir);
553 DosDeleteDir(pTmpDir);
554 }
555 EndNote();
556 if (FM3ModHandle)
557 DosFreeModule(FM3ModHandle);
558
559 DosExitList(EXLST_REMOVE, DeInitFM3DLL);
560}
561
562BOOL InitFM3DLL(HAB hab, int argc, char **argv)
563{
564 /*
565 * this function should be called by any application using this DLL right
566 * after setting up a message queue
567 */
568
569 CLASSINFO clinfo;
570 APIRET rc;
571 APIRET rcl = 1;
572 APIRET rcq = 1;
573 PFN pfnResVersion = (PFN)NULL;
574 ULONG RVMajor = 0;
575 ULONG RVMinor = 0;
576 ULONG ret = 0;
577 FILESTATUS3 fs3; // 25 Aug 07 SHL
578 PSZ env;
579 CHAR dllfile[CCHMAXPATH];
580 ULONG size;
581
582 if (!StringsLoaded()) {
583 saymsg(MB_ENTER,
584 HWND_DESKTOP,
585 "Error",
586 "FM3RES.STR isn't in right format, at least "
587 "for this version of FM/2.");
588 return FALSE;
589 }
590
591 strcpy(dllfile, "FM3RES");
592 env = getenv("FM3INI");
593 if (env) {
594 DosError(FERR_DISABLEHARDERR);
595 rc = DosQueryPathInfo(env, FIL_STANDARD, &fs3, sizeof(fs3));
596 if (!rc) {
597 if (fs3.attrFile & FILE_DIRECTORY) {
598 BldFullPathName(dllfile, env, "FM3RES"); // 23 Aug 07 SHL
599 DosError(FERR_DISABLEHARDERR);
600 if (DosQueryPathInfo(dllfile, FIL_STANDARD, &fs3, sizeof(fs3)))
601 strcpy(dllfile, "FM3RES");
602 }
603 }
604 }
605 rcl = DosLoadModule(NULL, 0, dllfile, &FM3ModHandle);
606 if (rcl) {
607 saymsg(MB_CANCEL | MB_ICONEXCLAMATION,
608 HWND_DESKTOP,
609 GetPString(IDS_ERRORTEXT), GetPString(IDS_FM3RESERROR1TEXT));
610 return FALSE;
611 }
612 else {
613 rc = DosExitList(EXLST_ADD, DeInitFM3DLL);
614 if (rc) {
615 Dos_Error(MB_ENTER, rc, HWND_DESKTOP, pszSrcFile, __LINE__,
616 "DosExitList");
617 }
618 rcq = DosQueryProcAddr(FM3ModHandle, 1, "ResVersion", &pfnResVersion);
619 if (!rcq)
620 ret = pfnResVersion(&RVMajor, &RVMinor);
621 }
622 if (RVMajor < VERMAJOR || (RVMajor == VERMAJOR && RVMinor < VERMINOR)) {
623 saymsg(MB_ENTER,
624 HWND_DESKTOP,
625 GetPString(IDS_ERRORTEXT),
626 GetPString(IDS_FM3RESERROR2TEXT),
627 !rcq ?
628 GetPString(IDS_FM3RESERROR3TEXT) :
629 !rcl ?
630 GetPString(IDS_FM3RESERROR4TEXT) :
631 GetPString(IDS_FM3RESERROR5TEXT), RVMajor, RVMinor, rcl, rcq, ret);
632 return FALSE;
633 }
634
635 ArgDriveFlags(argc, argv);
636 FillInDriveFlags(NULL);
637
638 if (!*profile)
639 strcpy(profile, "FM3.INI");
640 mypid = getpid();
641 /* give default appname if none set by caller */
642 if (!*appname)
643 strcpy(appname, FM3Str);
644 /* save appname; may be reset below */
645 strcpy(realappname, appname);
646 if (!strcmp(appname, FM3Str))
647 DosSetMaxFH(100);
648 else if (!strcmp(appname, "VDir") ||
649 !strcmp(appname, "VTree") ||
650 !strcmp(appname, "VCollect") ||
651 !strcmp(appname, "SEEALL") || !strcmp(appname, "FM/4"))
652 DosSetMaxFH(60);
653 else
654 DosSetMaxFH(40);
655
656 if (DosQuerySysInfo(QSV_VERSION_MAJOR,
657 QSV_VERSION_MINOR,
658 OS2ver,
659 sizeof(OS2ver))) {
660 OS2ver[0] = 2;
661 OS2ver[1] = 1;
662 }
663
664 // set up default root names for temp file storage and archive goodies
665 env = getenv("TMP");
666 if (env == NULL)
667 env = getenv("TEMP");
668 if (env != NULL) {
669 DosError(FERR_DISABLEHARDERR);
670 rc = DosQueryPathInfo(env, FIL_STANDARD, &fs3, sizeof(fs3));
671 if (!rc) {
672 CHAR *enddir, *p, szTempName[CCHMAXPATH], temp[CCHMAXPATH];
673 FILEFINDBUF3 ffb;
674 HDIR search_handle;
675 ULONG num_matches, ul;
676
677 strcpy(szTempName, env);
678 if (szTempName[strlen(szTempName) - 1] != '\\')
679 strcat(szTempName, "\\");
680 enddir = &szTempName[strlen(szTempName)];
681 strcat(szTempName, "$FM2????.");
682 strcat(szTempName, "???");
683 search_handle = HDIR_CREATE;
684 num_matches = 1;
685 if (!DosFindFirst(szTempName,
686 &search_handle,
687 FILE_NORMAL | FILE_DIRECTORY |
688 FILE_SYSTEM | FILE_READONLY | FILE_HIDDEN |
689 FILE_ARCHIVED,
690 &ffb, sizeof(ffb), &num_matches, FIL_STANDARD)) {
691 do {
692 strcpy(enddir, ffb.achName);
693 p = strrchr(szTempName, '.');
694 if (p) {
695 p++;
696 ul = strtol(p, &p + 2, 16);
697 GetDosPgmName(ul, temp);
698 if (!strstr(temp, "FM/2") &&
699 !strstr(temp, "AV/2")) {
700 wipeallf("%s\\*", szTempName);
701 DosDeleteDir(szTempName);
702 }
703 }
704 }
705 while (!DosFindNext(search_handle,
706 &ffb, sizeof(ffb), &num_matches));
707 DosFindClose(search_handle);
708 }
709 if (fs3.attrFile & FILE_DIRECTORY) {
710 APIRET ret = 0;
711 strcpy(szTempName, env);
712 MakeTempName(szTempName, NULL, 1);
713 ret = DosCreateDir(szTempName, 0);
714 if (!ret) { //check writable
715 pTmpDir = xstrdup(szTempName, pszSrcFile, __LINE__);
716 }
717 }
718 }
719 }
720
721 //Save the FM2 save directory name. This is the location of the ini, dat files etc.
722 {
723 CHAR temp[CCHMAXPATH];
724 save_dir2(temp);
725 pFM2SaveDirectory = xstrdup(temp, pszSrcFile, __LINE__);
726 }
727 // Check free space on TMP and FM2 Save drives
728 {
729 ullTmpSpaceNeeded = 5120000;
730 if (pTmpDir && CheckDriveSpaceAvail(pTmpDir, ullTmpSpaceNeeded, 0) == 1) {
731 if (CheckDriveSpaceAvail(pFM2SaveDirectory, ullTmpSpaceNeeded, 0) == 0){
732 ret = saymsg(MB_YESNO,
733 HWND_DESKTOP,
734 NullStr,
735 GetPString(IDS_TMPDRIVESPACELIMITED),
736 pTmpDir);
737 if (ret == MBID_YES)
738 pTmpDir = pFM2SaveDirectory;
739 }
740 else
741 saymsg(MB_OK,
742 HWND_DESKTOP,
743 NullStr,
744 GetPString(IDS_SAVETMPDRIVESPACELIMITED),
745 pTmpDir,
746 pFM2SaveDirectory);
747 }
748 else if (CheckDriveSpaceAvail(pFM2SaveDirectory, ullTmpSpaceNeeded, 0) == 1)
749 saymsg(MB_OK,
750 HWND_DESKTOP,
751 NullStr,
752 GetPString(IDS_SAVEDRIVESPACELIMITED),
753 pFM2SaveDirectory);
754 }
755 BldFullPathName(ArcTempRoot, pTmpDir, fAmAV2 ? "$AV$ARC$" : "$FM$ARC$");
756
757 // initialize random number generator
758 srand(time(NULL) + clock());
759
760 priority_bumped();
761
762 /* _heapmin() is done in a separate thread -- start it */
763 if (_beginthread(HeapThread, NULL, 32768, NULL) == -1) {
764 Runtime_Error(pszSrcFile, __LINE__,
765 GetPString(IDS_COULDNTSTARTTHREADTEXT));
766 return FALSE;
767 }
768
769 /* timer messages are sent from a separate thread -- start it */
770 if (!StartTimer()) {
771 Runtime_Error(pszSrcFile, __LINE__,
772 GetPString(IDS_COULDNTSTARTTHREADTEXT));
773 return FALSE;
774 }
775
776 /* Are we the workplace shell? */
777 env = getenv("WORKPLACE_PROCESS");
778 fWorkPlace = env != NULL &&
779 (stricmp(env, "YES") == 0 || atoi(env) == 1);
780
781 if ((!strchr(profile, '\\') && !strchr(profile, ':')) ||
782 !(fmprof = PrfOpenProfile((HAB)0, profile)))
783 {
784 /* figure out where to put INI file... */
785 CHAR inipath[CCHMAXPATH];
786
787 DosError(FERR_DISABLEHARDERR);
788 strcpy(HomePath, pFM2SaveDirectory);
789 DosError(FERR_DISABLEHARDERR);
790 memset(driveserial, -1, sizeof(driveserial));
791 *inipath = 0;
792 env = getenv("FM3INI");
793 if (env) {
794 strcpy(inipath, env);
795 DosError(FERR_DISABLEHARDERR);
796 rc = DosQueryPathInfo(inipath, FIL_STANDARD, &fs3, sizeof(fs3));
797 if (!rc) {
798 if (fs3.attrFile & FILE_DIRECTORY)
799 BldFullPathName(inipath, inipath, profile);
800 }
801 }
802 if (!env) {
803 env = searchpath(profile);
804 if (!env)
805 env = profile;
806 strcpy(inipath, env);
807 }
808
809 /* in some odd cases the INI file can get set to readonly status */
810 /* here we test it and reset the readonly bit if necessary */
811 if (!*inipath)
812 strcpy(inipath, profile);
813 DosError(FERR_DISABLEHARDERR);
814
815 rc = DosQueryPathInfo(inipath, FIL_STANDARD, &fs3, sizeof(fs3));
816 if (rc) {
817 if (rc == ERROR_FILE_NOT_FOUND)
818 fWantFirstTimeInit = TRUE;
819 }
820 else {
821 if (!CheckFileHeader(inipath, "\xff\xff\xff\xff\x14\x00\x00\x00", 0L)) {
822 saymsg(MB_ENTER,HWND_DESKTOP,DEBUG_STRING,
823 "Check INI header failed will attempt to replace with backup \\
824 if backup fails or not found will open with new ini");
825 DosCopy("FM3.INI", "FM3INI.BAD", DCPY_EXISTING);
826 DosCopy("FM3INI.BAK", "FM3.INI", DCPY_EXISTING);
827 if (!CheckFileHeader(inipath, "\xff\xff\xff\xff\x14\x00\x00\x00", 0L)) {
828 DosCopy("FM3.INI", "FM3INI2.BAD", DCPY_EXISTING);
829 fWantFirstTimeInit = TRUE;
830 }
831 }
832 if (!fWantFirstTimeInit) {
833 fIniExisted = TRUE;
834 if (fs3.attrFile & (FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM)) {
835 fs3.attrFile &= ~(FILE_READONLY | FILE_HIDDEN | FILE_SYSTEM);
836 rc = xDosSetPathInfo(inipath, FIL_STANDARD, &fs3, sizeof(fs3), 0);
837 if (rc) {
838 Dos_Error(MB_ENTER, rc, HWND_DESKTOP, pszSrcFile, __LINE__,
839 GetPString(IDS_INIREADONLYTEXT), inipath);
840 }
841 }
842 }
843 }
844 fmprof = PrfOpenProfile((HAB)0, inipath);
845 if (!fmprof) {
846 strcpy(inipath, "FM3.INI");
847 fmprof = PrfOpenProfile((HAB)0, inipath);
848 }
849
850 // 10 Jan 08 SHL fixme to do first time if new ini
851 // 10 Jan 08 SHL post UM_FIRSTTIME to main window
852 if (!fmprof) {
853 Win_Error(NULLHANDLE, NULLHANDLE, pszSrcFile, __LINE__,
854 "PrfOpenProfile");
855 return FALSE;
856 }
857 }
858
859 FindSwapperDat();
860
861 size = sizeof(BOOL);
862 PrfQueryProfileData(fmprof,
863 FM3Str,
864 "SeparateParms",
865 &fSeparateParms,
866 &size);
867 if (!fSeparateParms)
868 strcpy(appname, FM3Str);
869
870 /* start help */
871 memset(&hini, 0, sizeof(HELPINIT));
872 hini.cb = sizeof(HELPINIT);
873 hini.ulReturnCode = 0;
874 hini.pszTutorialName = NULL;
875 hini.phtHelpTable = (PHELPTABLE) MAKELONG(ID_HELPTABLE, 0xffff);
876 hini.hmodAccelActionBarModule = (HMODULE) 0;
877 hini.idAccelTable = 0;
878 hini.idActionBar = 0;
879 hini.pszHelpWindowTitle = GetPString(IDS_FM2HELPTITLETEXT);
880 hini.fShowPanelId = CMIC_HIDE_PANEL_ID;
881 hini.pszHelpLibraryName = "FM3.HLP";
882 hwndHelp = WinCreateHelpInstance(hab, &hini);
883 if (!hwndHelp) {
884 static CHAR helppath[CCHMAXPATH]; // fixme to be local?
885
886 env = getenv("FM3INI");
887 if (env) {
888 strcpy(helppath, env);
889 DosError(FERR_DISABLEHARDERR);
890 rc = DosQueryPathInfo(helppath, FIL_STANDARD, &fs3, sizeof(fs3));
891 if (!rc) {
892 if (fs3.attrFile & FILE_DIRECTORY) {
893 BldFullPathName(helppath, helppath, "FM3.HLP");
894 hini.pszHelpLibraryName = helppath;
895 hwndHelp = WinCreateHelpInstance(hab, &hini);
896 }
897 }
898 }
899 }
900 if (!hwndHelp) {
901 saymsg(MB_ENTER | MB_ICONEXCLAMATION,
902 HWND_DESKTOP,
903 GetPString(IDS_FM2TROUBLETEXT),
904 GetPString(IDS_CANTLOADHELPTEXT),
905 GetPString(IDS_NOHELPACCEPTTEXT));
906 }
907
908 /* a couple of default window procs so we don't have to look them up later */
909 if (WinQueryClassInfo(hab, WC_CONTAINER, &clinfo))
910 PFNWPCnr = clinfo.pfnWindowProc;
911 // saymsg(MB_ENTER,HWND_DESKTOP,"Container flags:","%08lx",clinfo.flClassStyle);
912 if (WinQueryClassInfo(hab, WC_FRAME, &clinfo))
913 PFNWPFrame = clinfo.pfnWindowProc;
914 // saymsg(MB_ENTER,HWND_DESKTOP,"Frame flags:","%08lx",clinfo.flClassStyle);
915 if (WinQueryClassInfo(hab, WC_BUTTON, &clinfo))
916 PFNWPButton = clinfo.pfnWindowProc;
917 // saymsg(MB_ENTER,HWND_DESKTOP,"Button flags:","%08lx",clinfo.flClassStyle);
918 if (WinQueryClassInfo(hab, WC_STATIC, &clinfo))
919 PFNWPStatic = clinfo.pfnWindowProc;
920 // saymsg(MB_ENTER,HWND_DESKTOP,"Static flags:","%08lx",clinfo.flClassStyle);
921 if (WinQueryClassInfo(hab, WC_MLE, &clinfo))
922 PFNWPMLE = clinfo.pfnWindowProc;
923 // saymsg(MB_ENTER,HWND_DESKTOP,"MLE flags:","%08lx",clinfo.flClassStyle);
924 if (!PFNWPCnr || !PFNWPFrame || !PFNWPButton || !PFNWPStatic || !PFNWPMLE) {
925 Runtime_Error(pszSrcFile, __LINE__, "WinQueryClassInfo");
926 return FALSE;
927 }
928
929 /* register window classes we use */
930 WinRegisterClass(hab,
931 WC_MAINWND,
932 MainWndProc,
933 CS_SIZEREDRAW | CS_CLIPCHILDREN, sizeof(PVOID) * 8);
934 WinRegisterClass(hab,
935 WC_MAINWND2,
936 MainWndProc2,
937 CS_SIZEREDRAW | CS_CLIPCHILDREN, sizeof(PVOID) * 4);
938 WinRegisterClass(hab,
939 WC_TREECONTAINER,
940 TreeClientWndProc,
941 CS_SIZEREDRAW | CS_CLIPCHILDREN, sizeof(PVOID) * 2);
942 WinRegisterClass(hab,
943 WC_DIRCONTAINER,
944 DirClientWndProc,
945 CS_SIZEREDRAW | CS_CLIPCHILDREN, sizeof(PVOID) * 2);
946 WinRegisterClass(hab,
947 WC_COLLECTOR,
948 CollectorClientWndProc,
949 CS_SIZEREDRAW | CS_CLIPCHILDREN, sizeof(PVOID) * 2);
950 WinRegisterClass(hab,
951 WC_ARCCONTAINER,
952 ArcClientWndProc,
953 CS_SIZEREDRAW | CS_CLIPCHILDREN, sizeof(PVOID) * 2);
954 WinRegisterClass(hab,
955 WC_MLEEDITOR,
956 MLEEditorProc,
957 CS_SIZEREDRAW | CS_CLIPCHILDREN, sizeof(PVOID) * 2);
958 WinRegisterClass(hab,
959 WC_INIEDITOR,
960 IniProc,
961 CS_SIZEREDRAW | CS_CLIPCHILDREN, sizeof(PVOID) * 2);
962 WinRegisterClass(hab,
963 WC_TOOLBACK,
964 ToolBackProc,
965 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
966 sizeof(PVOID));
967 WinRegisterClass(hab,
968 WC_DRIVEBACK,
969 DriveBackProc,
970 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
971 sizeof(PVOID));
972 WinRegisterClass(hab,
973 WC_SEEALL,
974 SeeAllWndProc,
975 CS_SIZEREDRAW | CS_CLIPCHILDREN, sizeof(PVOID));
976 WinRegisterClass(hab,
977 WC_NEWVIEW,
978 ViewWndProc,
979 CS_SIZEREDRAW | CS_CLIPCHILDREN, sizeof(PVOID));
980 WinRegisterClass(hab,
981 WC_TOOLBUTTONS,
982 ChildButtonProc,
983 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
984 sizeof(PVOID));
985 WinRegisterClass(hab,
986 WC_DRIVEBUTTONS,
987 DriveProc,
988 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
989 sizeof(PVOID));
990 WinRegisterClass(hab,
991 WC_BUBBLE,
992 BubbleProc,
993 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
994 sizeof(ULONG) * 2);
995 WinRegisterClass(hab,
996 WC_STATUS,
997 StatusProc,
998 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
999 sizeof(ULONG));
1000 WinRegisterClass(hab,
1001 WC_DIRSTATUS,
1002 DirTextProc,
1003 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
1004 sizeof(ULONG));
1005 WinRegisterClass(hab,
1006 WC_TREESTATUS,
1007 TreeStatProc,
1008 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
1009 sizeof(ULONG));
1010 WinRegisterClass(hab,
1011 WC_ARCSTATUS,
1012 ArcTextProc,
1013 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
1014 sizeof(ULONG));
1015 WinRegisterClass(hab,
1016 WC_COLSTATUS,
1017 CollectorTextProc,
1018 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
1019 sizeof(ULONG));
1020 WinRegisterClass(hab,
1021 WC_SEESTATUS,
1022 SeeStatusProc,
1023 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
1024 sizeof(ULONG));
1025 WinRegisterClass(hab,
1026 WC_VIEWSTATUS,
1027 ViewStatusProc,
1028 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
1029 sizeof(ULONG));
1030 WinRegisterClass(hab,
1031 WC_ERRORWND,
1032 NotifyWndProc,
1033 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
1034 sizeof(PVOID));
1035 WinRegisterClass(hab,
1036 WC_MINITIME,
1037 MiniTimeProc,
1038 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
1039 sizeof(PVOID) * 2);
1040 WinRegisterClass(hab,
1041 WC_DATABAR,
1042 DataProc, CS_SIZEREDRAW, sizeof(PVOID));
1043 WinRegisterClass(hab,
1044 WC_TREEOPENBUTTON,
1045 OpenButtonProc,
1046 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
1047 sizeof(PVOID));
1048 WinRegisterClass(hab,
1049 WC_AUTOVIEW,
1050 AutoViewProc,
1051 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
1052 sizeof(PVOID));
1053 WinRegisterClass(hab,
1054 WC_LED,
1055 LEDProc,
1056 CS_SYNCPAINT | CS_SIZEREDRAW | CS_PARENTCLIP,
1057 sizeof(PVOID));
1058
1059 /*
1060 * set some defaults (note: everything else automatically initialized
1061 * to 0)
1062 */
1063 dsDirCnrDefault.detailssize = dsDirCnrDefault.detailsea = dsDirCnrDefault.detailslwdate =
1064 dsDirCnrDefault.detailslwtime = dsDirCnrDefault.detailsattr = dsDirCnrDefault.detailsicon =
1065 fAutoTile = fConfirmDelete = fLoadSubject = fUnHilite =
1066 fLoadLongnames = fToolbar = fSaveState = fGuessType = fToolbarHelp =
1067 fAutoAddDirs = fUseNewViewer = fDataToFore = fDataShowDrives =
1068 fSplitStatus = fDragndropDlg = fQuickArcFind = fKeepCmdLine =
1069 fMoreButtons = fDrivebar = fCollapseFirst = fSwitchTree =
1070 fSwitchTreeExpand = fNoSearch = fCustomFileDlg = fOtherHelp =
1071 fSaveMiniCmds = fUserComboBox = fFM2Deletes = fConfirmTarget =
1072 fShowTarget = fDrivebarHelp = fCheckMM = TRUE;
1073 ulCnrType = CCS_EXTENDSEL;
1074 FilesToGet = FILESTOGET_MIN;
1075 MaxComLineStrg = MAXCOMLINESTRGDEFAULT;
1076 AutoviewHeight = 48;
1077 strcpy(printer, "PRN");
1078 prnwidth = 80;
1079 prnlength = 66;
1080 prntmargin = 6;
1081 prnbmargin = 6;
1082 prnlmargin = 6;
1083 prnrmargin = 3;
1084 prnspacing = 1;
1085 prntabspaces = 8;
1086 CollectorsortFlags = sortFlags = SORT_DIRSFIRST;
1087 ullDATFileSpaceNeeded = 10000;
1088
1089 //Get default Country info
1090 {
1091 COUNTRYCODE Country = {0};
1092 ULONG ulInfoLen = 0;
1093 COUNTRYINFO CtryInfo = {0};
1094
1095 DosQueryCtryInfo(sizeof(CtryInfo), &Country,
1096 &CtryInfo, &ulInfoLen);
1097 *ThousandsSeparator = CtryInfo.szThousandsSeparator[0];
1098 }
1099
1100 // load preferences from profile (INI) file
1101 size = sizeof(ULONG);
1102 PrfQueryProfileData(fmprof, appname, "MaxComLineStrg", &MaxComLineStrg, &size);
1103 // Give user one chance to reset the default command line length to 1024 (4os2's unexpanded max)
1104 if (MaxComLineStrg == 2048) {
1105 BOOL MaxComLineChecked = FALSE;
1106
1107 size = sizeof(BOOL);
1108 PrfQueryProfileData(fmprof, appname, "MaxComLineChecked", &MaxComLineChecked, &size);
1109 if (!MaxComLineChecked) {
1110 ret = saymsg(MB_YESNO,
1111 HWND_DESKTOP,
1112 NullStr,
1113 GetPString(IDS_CHANGECMDLINELENGTHDEFAULT));
1114 if (ret == MBID_YES)
1115 MaxComLineStrg = 1024;
1116 MaxComLineChecked = TRUE;
1117 PrfWriteProfileData(fmprof, appname, "MaxComLineChecked", &MaxComLineChecked, sizeof(BOOL));
1118 }
1119 }
1120 if (MaxComLineStrg < CMDLNLNGTH_MIN)
1121 MaxComLineStrg = CMDLNLNGTH_MIN;
1122 else if (MaxComLineStrg > CMDLNLNGTH_MAX)
1123 MaxComLineStrg = CMDLNLNGTH_MAX;
1124 editor = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
1125 if (!editor)
1126 return 0; //already complained
1127 viewer = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
1128 if (!viewer)
1129 return 0; //already complained
1130 virus = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
1131 if (!virus)
1132 return 0; //already complained
1133 compare = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
1134 if (!compare)
1135 return 0; //already complained
1136 binview = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
1137 if (!binview)
1138 return 0; //already complained
1139 bined = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
1140 if (!bined)
1141 return 0; //already complained
1142 dircompare = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
1143 if (!dircompare)
1144 return 0; //already complained
1145 ftprun = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
1146 if (!ftprun)
1147 return 0; //already complained
1148 httprun = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
1149 if (!httprun)
1150 return 0; //already complained
1151 mailrun = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
1152 if (!mailrun)
1153 return 0; //already complained
1154 pszTreeEnvVarList = xmallocz(MaxComLineStrg, pszSrcFile, __LINE__);
1155 if (!pszTreeEnvVarList)
1156 return 0; //already complained
1157 size = sizeof(BOOL);
1158 PrfQueryProfileData(fmprof, appname, "ShowTarget", &fShowTarget, &size);
1159 size = sizeof(BOOL);
1160 PrfQueryProfileData(fmprof, appname, "CheckMM", &fCheckMM, &size);
1161 size = sizeof(BOOL);
1162 PrfQueryProfileData(fmprof, appname, "ChangeTarget", &fChangeTarget, &size);
1163 size = sizeof(BOOL);
1164 PrfQueryProfileData(fmprof, appname, "ConfirmTarget", &fConfirmTarget, &size);
1165 size = sizeof(BOOL);
1166 PrfQueryProfileData(fmprof, FM3Str, "CustomFileDlg", &fCustomFileDlg, &size);
1167 size = sizeof(BOOL);
1168 PrfQueryProfileData(fmprof, FM3Str, "SaveMiniCmds", &fSaveMiniCmds, &size);
1169 size = sizeof(BOOL);
1170 PrfQueryProfileData(fmprof, appname, "SaveBigCmds", &fSaveBigCmds, &size);
1171 size = sizeof(BOOL);
1172 PrfQueryProfileData(fmprof, appname, "NoFoldMenu", &fNoFoldMenu, &size);
1173 size = sizeof(BOOL);
1174 PrfQueryProfileData(fmprof, FM3Str, "ThreadNotes", &fThreadNotes, &size);
1175 size = sizeof(BOOL);
1176 PrfQueryProfileData(fmprof, FM3Str, "Prnpagenums", &prnpagenums, &size);
1177 size = sizeof(BOOL);
1178 PrfQueryProfileData(fmprof, FM3Str, "Prnalt", &prnalt, &size);
1179 size = sizeof(BOOL);
1180 PrfQueryProfileData(fmprof, FM3Str, "Prnformat", &prnformat, &size);
1181 size = sizeof(BOOL);
1182 PrfQueryProfileData(fmprof, FM3Str, "Prnformfeedbefore",
1183 &prnformfeedbefore, &size);
1184 size = sizeof(BOOL);
1185 PrfQueryProfileData(fmprof, FM3Str,
1186 "Prnformfeedafter",&prnformfeedafter, &size);
1187 size = sizeof(ULONG);
1188 PrfQueryProfileData(fmprof, FM3Str, "Prntabspaces", &prntabspaces, &size);
1189 size = sizeof(ULONG);
1190 PrfQueryProfileData(fmprof, FM3Str, "Prnwidth", &prnwidth, &size);
1191 size = sizeof(ULONG);
1192 PrfQueryProfileData(fmprof, FM3Str, "Prnlength", &prnlength, &size);
1193 size = sizeof(ULONG);
1194 PrfQueryProfileData(fmprof, FM3Str, "Prntmargin", &prntmargin, &size);
1195 size = sizeof(ULONG);
1196 PrfQueryProfileData(fmprof, FM3Str, "Prnbmargin", &prnbmargin, &size);
1197 size = sizeof(ULONG);
1198 PrfQueryProfileData(fmprof, FM3Str, "Prnlmargin", &prnlmargin, &size);
1199 size = sizeof(ULONG);
1200 PrfQueryProfileData(fmprof, FM3Str, "Prnrmargin", &prnrmargin, &size);
1201 size = sizeof(ULONG);
1202 PrfQueryProfileData(fmprof, FM3Str, "Prnspacing", &prnspacing, &size);
1203 size = sizeof(BOOL);
1204 PrfQueryProfileData(fmprof, FM3Str, "NoDead", &fNoDead, &size);
1205 size = sizeof(BOOL);
1206 PrfQueryProfileData(fmprof, FM3Str, "NoFinger", &fNoFinger, &size);
1207 size = sizeof(BOOL);
1208 PrfQueryProfileData(fmprof, appname, "SwitchTree", &fSwitchTree, &size);
1209 size = sizeof(BOOL);
1210 PrfQueryProfileData(fmprof, appname, "SwitchTreeExpand",
1211 &fSwitchTreeExpand, &size);
1212 size = sizeof(BOOL);
1213 PrfQueryProfileData(fmprof, appname, "SwitchTreeOnFocus",
1214 &fSwitchTreeOnFocus, &size);
1215 size = sizeof(BOOL);
1216 PrfQueryProfileData(fmprof, appname, "CollapseFirst",
1217 &fCollapseFirst, &size);
1218 size = sizeof(BOOL);
1219 PrfQueryProfileData(fmprof, appname, "FilesInTree",
1220 &fFilesInTree, &size);
1221 size = sizeof(BOOL);
1222 PrfQueryProfileData(fmprof, FM3Str, "TopDir", &fTopDir, &size);
1223 size = sizeof(BOOL);
1224 PrfQueryProfileData(fmprof, FM3Str, "LookInDir", &fLookInDir, &size);
1225 PrfQueryProfileString(fmprof, appname, "DefArc", NULL, szDefArc,
1226 sizeof(szDefArc));
1227 size = sizeof(ULONG);
1228 PrfQueryProfileData(fmprof, FM3Str, "AutoviewHeight",
1229 &AutoviewHeight, &size);
1230 size = sizeof(BOOL);
1231 PrfQueryProfileData(fmprof, FM3Str, "KeepCmdLine", &fKeepCmdLine, &size);
1232 if (strcmp(realappname, "FM/4")) {
1233 size = sizeof(BOOL);
1234 PrfQueryProfileData(fmprof, FM3Str, "MoreButtons", &fMoreButtons, &size);
1235 size = sizeof(BOOL);
1236 PrfQueryProfileData(fmprof, FM3Str, "Drivebar", &fDrivebar, &size);
1237 }
1238 else
1239 fDrivebar = fMoreButtons = TRUE;
1240 size = sizeof(BOOL);
1241 PrfQueryProfileData(fmprof, appname, "NoSearch", &fNoSearch, &size);
1242 size = sizeof(BOOL);
1243 PrfQueryProfileData(fmprof, appname, "GuessType", &fGuessType, &size);
1244 size = sizeof(BOOL);
1245 PrfQueryProfileData(fmprof, appname, "ViewChild", &fViewChild, &size);
1246 size = sizeof(BOOL);
1247 PrfQueryProfileData(fmprof, appname, "ShowEnv", &fShowEnv, &size);
1248 size = MaxComLineStrg;
1249 PrfQueryProfileData(fmprof, appname, "TreeEnvVarList", pszTreeEnvVarList, &size);
1250 size = sizeof(BOOL);
1251 PrfQueryProfileData(fmprof, appname, "LeaveTree", &fLeaveTree, &size);
1252 size = sizeof(BOOL);
1253 PrfQueryProfileData(fmprof, FM3Str, "Comments", &fComments, &size);
1254 size = sizeof(ULONG);
1255 PrfQueryProfileData(fmprof, appname, "WS_ANIMATE", &fwsAnimate, &size);
1256 if (fwsAnimate)
1257 fwsAnimate = WS_ANIMATE;
1258 size = sizeof(ULONG);
1259 size = sizeof(BOOL);
1260 PrfQueryProfileData(fmprof, appname, "SelectedAlways",
1261 &fSelectedAlways, &size);
1262 size = sizeof(BOOL);
1263 PrfQueryProfileData(fmprof, FM3Str, "ToolbarHelp", &fToolbarHelp, &size);
1264 size = sizeof(BOOL);
1265 PrfQueryProfileData(fmprof, FM3Str, "OtherHelp", &fOtherHelp, &size);
1266 size = sizeof(BOOL);
1267 PrfQueryProfileData(fmprof, FM3Str, "DrivebarHelp", &fDrivebarHelp, &size);
1268 size = sizeof(BOOL);
1269 PrfQueryProfileData(fmprof, appname, "AutoAddDirs", &fAutoAddDirs, &size);
1270 size = sizeof(BOOL);
1271 PrfQueryProfileData(fmprof, appname,
1272 "AutoAddAllDirs", &fAutoAddAllDirs, &size);
1273 size = sizeof(BOOL);
1274 PrfQueryProfileData(fmprof, FM3Str, "UserListSwitches",
1275 &fUserListSwitches, &size);
1276 size = sizeof(BOOL);
1277 PrfQueryProfileData(fmprof, appname, "UseNewViewer",
1278 &fUseNewViewer, &size);
1279 size = sizeof(BOOL);
1280 PrfQueryProfileData(fmprof, appname, "DefaultDeletePerm",
1281 &fDefaultDeletePerm, &size);
1282 size = sizeof(BOOL);
1283 PrfQueryProfileData(fmprof, FM3Str, "ExternalINIs",
1284 &fExternalINIs, &size);
1285 size = sizeof(BOOL);
1286 PrfQueryProfileData(fmprof, FM3Str, "ExternalCollector",
1287 &fExternalCollector, &size);
1288 size = sizeof(BOOL);
1289 PrfQueryProfileData(fmprof, FM3Str, "ExternalArcboxes",
1290 &fExternalArcboxes, &size);
1291 size = sizeof(BOOL);
1292 PrfQueryProfileData(fmprof, FM3Str, "ExternalViewer",
1293 &fExternalViewer, &size);
1294 size = sizeof(BOOL);
1295 PrfQueryProfileData(fmprof, FM3Str, "UseQProcStat",
1296 &fUseQProcStat, &size);
1297 size = sizeof(BOOL);
1298 PrfQueryProfileData(fmprof, FM3Str, "UseQSysState",
1299 &fUseQSysState, &size);
1300 size = sizeof(BOOL);
1301 PrfQueryProfileData(fmprof, FM3Str, "DataMin", &fDataMin, &size);
1302 size = sizeof(BOOL);
1303 PrfQueryProfileData(fmprof, appname, "DataToFore", &fDataToFore, &size);
1304 size = sizeof(BOOL);
1305 PrfQueryProfileData(fmprof, appname, "DataShowDrives",
1306 &fDataShowDrives, &size);
1307 size = sizeof(BOOL);
1308 PrfQueryProfileData(fmprof, appname, "DataInclRemote",
1309 &fDataInclRemote, &size);
1310 size = sizeof(BOOL);
1311 PrfQueryProfileData(fmprof, FM3Str, "SplitStatus", &fSplitStatus, &size);
1312 size = sizeof(BOOL);
1313 PrfQueryProfileData(fmprof, appname, "FolderAfterExtract",
1314 &fFolderAfterExtract, &size);
1315 size = sizeof(BOOL);
1316 PrfQueryProfileData(fmprof, FM3Str, "DullDatabar", &fDullMin, &size);
1317 size = sizeof(BOOL);
1318 PrfQueryProfileData(fmprof, appname, "BlueLED", &fBlueLED, &size);
1319 size = sizeof(BOOL);
1320 PrfQueryProfileData(fmprof, appname, "ConfirmDelete",
1321 &fConfirmDelete, &size);
1322 size = sizeof(BOOL);
1323 PrfQueryProfileData(fmprof, FM3Str, "SaveState", &fSaveState, &size);
1324 size = sizeof(BOOL);
1325 PrfQueryProfileData(fmprof, appname, "SyncUpdates", &fSyncUpdates, &size);
1326 size = sizeof(BOOL);
1327 PrfQueryProfileData(fmprof, appname, "LoadSubject", &fLoadSubject, &size);
1328 size = sizeof(BOOL);
1329 PrfQueryProfileData(fmprof, appname, "UnHilite", &fUnHilite, &size);
1330 size = sizeof(BOOL);
1331 PrfQueryProfileData(fmprof, FM3Str, "TileBackwards", &fTileBackwards, &size);
1332 size = sizeof(BOOL);
1333 PrfQueryProfileData(fmprof, appname, "LoadLongname", &fLoadLongnames, &size);
1334 size = sizeof(BOOL);
1335 PrfQueryProfileData(fmprof, appname, "VerifyWrites", &fVerify, &size);
1336 DosSetVerify(fVerify);
1337 size = sizeof(BOOL);
1338 PrfQueryProfileData(fmprof, appname, "DontMoveMouse", &fDontMoveMouse, &size);
1339 size = sizeof(BOOL);
1340 PrfQueryProfileData(fmprof, appname, "NoIconsFiles", &fNoIconsFiles, &size);
1341 size = sizeof(BOOL);
1342 PrfQueryProfileData(fmprof, appname, "NoIconsDirs", &fNoIconsDirs, &size);
1343 size = sizeof(BOOL);
1344 PrfQueryProfileData(fmprof, appname, "ForceUpper", &fForceUpper, &size);
1345 size = sizeof(BOOL);
1346 PrfQueryProfileData(fmprof, appname, "ForceLower", &fForceLower, &size);
1347 size = sizeof(BOOL);
1348 PrfQueryProfileData(fmprof, FM3Str, "TextTools", &fTextTools, &size);
1349 size = sizeof(BOOL);
1350 PrfQueryProfileData(fmprof, FM3Str, "ToolTitles", &fToolTitles, &size);
1351 size = sizeof(BOOL);
1352 PrfQueryProfileData(fmprof, appname, "DoubleClickOpens", &fDCOpens, &size);
1353 size = sizeof(BOOL);
1354 PrfQueryProfileData(fmprof, appname, "LinkSetsIcon", &fLinkSetsIcon, &size);
1355 size = sizeof(INT);
1356 PrfQueryProfileData(fmprof, appname, "Sort", &sortFlags, &size);
1357 size = sizeof(INT);
1358 PrfQueryProfileData(fmprof, appname, "TreeSort", &TreesortFlags, &size);
1359 size = sizeof(INT);
1360 PrfQueryProfileData(fmprof, appname,
1361 "CollectorSort", &CollectorsortFlags, &size);
1362 size = sizeof(targetdir);
1363 PrfQueryProfileData(fmprof, appname, "Targetdir", targetdir, &size);
1364 if (!IsValidDir(targetdir))
1365 *targetdir = 0;
1366 size = sizeof(extractpath);
1367 PrfQueryProfileData(fmprof, appname, "ExtractPath", extractpath, &size);
1368 size = sizeof(printer);
1369 PrfQueryProfileData(fmprof, appname, "Printer", printer, &size);
1370 size = MaxComLineStrg;
1371 PrfQueryProfileData(fmprof, appname, "DirCompare", dircompare,
1372 &size);
1373 size = MaxComLineStrg;
1374 PrfQueryProfileData(fmprof, appname, "Viewer", viewer, &size);
1375 size = MaxComLineStrg;
1376 PrfQueryProfileData(fmprof, appname, "Editor", editor, &size);
1377 size = MaxComLineStrg;
1378 PrfQueryProfileData(fmprof, appname, "BinView", binview, &size);
1379 size = MaxComLineStrg;
1380 PrfQueryProfileData(fmprof, appname, "BinEd", bined, &size);
1381 size = MaxComLineStrg;
1382 PrfQueryProfileData(fmprof, appname, "Compare", compare, &size);
1383 size = MaxComLineStrg;
1384 PrfQueryProfileData(fmprof, appname, "Virus", virus, &size);
1385 size = sizeof(BOOL);
1386 PrfQueryProfileData(fmprof, appname, "FtpRunWPSDefault", &fFtpRunWPSDefault, &size);
1387 size = MaxComLineStrg;
1388 PrfQueryProfileData(fmprof, appname, "FTPRun", ftprun, &size);
1389 if (!*ftprun)
1390 fFtpRunWPSDefault = TRUE;
1391 size = sizeof(BOOL);
1392 PrfQueryProfileData(fmprof, appname, "HttpRunWPSDefault", &fHttpRunWPSDefault, &size);
1393 size = MaxComLineStrg;
1394 PrfQueryProfileData(fmprof, appname, "HTTPRun", httprun, &size);
1395 if (!*httprun)
1396 fHttpRunWPSDefault = TRUE;
1397 size = MaxComLineStrg;
1398 PrfQueryProfileData(fmprof, appname, "MailRun", mailrun, &size);
1399 size = sizeof(ftprundir);
1400 PrfQueryProfileData(fmprof, appname, "FtpRunDir", ftprundir, &size);
1401 size = sizeof(httprundir);
1402 PrfQueryProfileData(fmprof, appname, "HttpRunDir", httprundir, &size);
1403 size = sizeof(mailrundir);
1404 PrfQueryProfileData(fmprof, appname, "MailRunDir", mailrundir, &size);
1405 size = sizeof(lasttoolbox);
1406 PrfQueryProfileData(fmprof, FM3Str, "LastToolBox", lasttoolbox,
1407 &size);
1408 size = sizeof(BOOL);
1409 PrfQueryProfileData(fmprof, appname, "LibPathStrictHttpRun", &fLibPathStrictHttpRun,
1410 &size);
1411 size = sizeof(BOOL);
1412 PrfQueryProfileData(fmprof, appname, "LibPathStrictFtpRun", &fLibPathStrictFtpRun,
1413 &size);
1414 size = sizeof(BOOL);
1415 PrfQueryProfileData(fmprof, appname, "LibPathStrictMailRun", &fLibPathStrictMailRun,
1416 &size);
1417 size = sizeof(BOOL);
1418 PrfQueryProfileData(fmprof, appname, "NoMailtoMailRun", &fNoMailtoMailRun,
1419 &size);
1420 size = sizeof(BOOL);
1421 PrfQueryProfileData(fmprof, appname, "FollowTree", &fFollowTree,
1422 &size);
1423 size = sizeof(BOOL);
1424 PrfQueryProfileData(fmprof, appname, "StartMaximized",
1425 &fStartMaximized, &size);
1426 if (!fStartMaximized) {
1427 size = sizeof(BOOL);
1428 PrfQueryProfileData(fmprof, appname, "StartMinimized",
1429 &fStartMinimized, &size);
1430 }
1431 size = sizeof(BOOL);
1432 PrfQueryProfileData(fmprof, appname, "DefaultCopy", &fCopyDefault, &size);
1433 size = sizeof(BOOL);
1434 PrfQueryProfileData(fmprof, appname, "IdleCopy", &fRealIdle, &size);
1435 size = sizeof(BOOL);
1436 PrfQueryProfileData(fmprof, appname, "ArcStuffVisible",
1437 &fArcStuffVisible, &size);
1438 size = sizeof(BOOL);
1439 PrfQueryProfileData(fmprof, FM3Str, "NoTreeGap", &fNoTreeGap, &size);
1440 size = sizeof(BOOL);
1441 PrfQueryProfileData(fmprof, FM3Str, "VTreeOpensWPS",
1442 &fVTreeOpensWPS, &size);
1443 size = sizeof(BOOL);
1444 PrfQueryProfileData(fmprof, appname, "RemoteBug", &fRemoteBug, &size);
1445 size = sizeof(BOOL);
1446 PrfQueryProfileData(fmprof, appname, "Drag&DropDlg",
1447 &fDragndropDlg, &size);
1448 size = sizeof(BOOL);
1449 PrfQueryProfileData(fmprof, FM3Str, "UserComboBox", &fUserComboBox, &size);
1450 size = sizeof(BOOL);
1451 PrfQueryProfileData(fmprof, FM3Str, "MinDirOnOpen", &fMinOnOpen, &size);
1452 size = sizeof(BOOL);
1453 PrfQueryProfileData(fmprof, appname, "QuickArcFind",
1454 &fQuickArcFind, &size);
1455 size = sizeof(BOOL);
1456 PrfQueryProfileData(fmprof, FM3Str, "NoRemovableScan",
1457 &fNoRemovableScan, &size);
1458 size = sizeof(ULONG);
1459 PrfQueryProfileData(fmprof, FM3Str, "NoBrokenNotify",
1460 &NoBrokenNotify, &size);
1461 size = sizeof(ULONG);
1462 PrfQueryProfileData(fmprof, appname, "ContainerType", &ulCnrType,
1463 &size);
1464 size = sizeof(ULONG);
1465 PrfQueryProfileData(fmprof, appname, "FilesToGet", &FilesToGet, &size);
1466 if (FilesToGet < FILESTOGET_MIN)
1467 FilesToGet = FILESTOGET_MIN;
1468 else if (FilesToGet > FILESTOGET_MAX)
1469 FilesToGet = FILESTOGET_MAX;
1470 size = sizeof(BOOL);
1471 PrfQueryProfileData(fmprof, FM3Str, "AutoView", &fAutoView, &size);
1472 size = sizeof(BOOL);
1473 PrfQueryProfileData(fmprof, FM3Str, "FM2Deletes", &fFM2Deletes, &size);
1474 size = sizeof(BOOL);
1475 PrfQueryProfileData(fmprof, FM3Str, "TrashCan", &fTrashCan, &size);
1476
1477 LoadDetailsSwitches("DirCnr", &dsDirCnrDefault);
1478
1479 /* load pointers and icons we use */
1480 hptrArrow = WinQuerySysPointer(HWND_DESKTOP, SPTR_ARROW, FALSE);
1481 hptrBusy = WinQuerySysPointer(HWND_DESKTOP, SPTR_WAIT, FALSE);
1482 hptrNS = WinQuerySysPointer(HWND_DESKTOP, SPTR_SIZENS, FALSE);
1483 hptrEW = WinQuerySysPointer(HWND_DESKTOP, SPTR_SIZEWE, FALSE);
1484 hptrFloppy = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, FLOPPY_ICON);
1485 hptrDrive = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, DRIVE_ICON);
1486 hptrRemovable = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, REMOVABLE_ICON);
1487 hptrCDROM = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, CDROM_ICON);
1488 hptrFile = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, FILE_ICON);
1489 hptrDir = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, DIR_FRAME);
1490 hptrArc = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, ARC_FRAME);
1491 hptrArt = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, ART_ICON);
1492 hptrSystem = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, FILE_SYSTEM_ICON);
1493 hptrHidden = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, FILE_HIDDEN_ICON);
1494 hptrReadonly = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, FILE_READONLY_ICON);
1495 hptrLast = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, LASTITEM_ICON);
1496 hptrRemote = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, REMOTE_ICON);
1497 hptrVirtual = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, VIRTUAL_ICON);
1498 hptrRamdisk = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, RAMDISK_ICON);
1499 if (!fNoDead)
1500 hptrFinger = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, FINGER_ICON);
1501 else
1502 hptrFinger = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, FINGER2_ICON);
1503 hptrApp = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, APP_ICON);
1504 hptrDunno = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, DUNNO_ICON);
1505 hptrEnv = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, ENV_ICON);
1506 hptrZipstrm = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, ZIPSTREAM_ICON);
1507
1508 // set up color array used by seeall.c and newview.c color dialog
1509
1510 standardcolors[0] = CLR_WHITE;
1511 standardcolors[1] = CLR_BLACK;
1512 standardcolors[2] = CLR_BLUE;
1513 standardcolors[3] = CLR_RED;
1514 standardcolors[4] = CLR_PINK;
1515 standardcolors[5] = CLR_GREEN;
1516 standardcolors[6] = CLR_CYAN;
1517 standardcolors[7] = CLR_YELLOW;
1518 standardcolors[8] = CLR_DARKGRAY;
1519 standardcolors[9] = CLR_DARKBLUE;
1520 standardcolors[10] = CLR_DARKRED;
1521 standardcolors[11] = CLR_DARKPINK;
1522 standardcolors[12] = CLR_DARKGREEN;
1523 standardcolors[13] = CLR_DARKCYAN;
1524 standardcolors[14] = CLR_BROWN;
1525 standardcolors[15] = CLR_PALEGRAY;
1526
1527 return TRUE;
1528}
1529
1530HWND StartFM3(HAB hab, INT argc, CHAR ** argv)
1531{
1532 HWND hwndFrame;
1533 HWND hwndClient;
1534 UINT x;
1535 ULONG FrameFlags = FCF_TITLEBAR | FCF_SYSMENU |
1536 FCF_SIZEBORDER | FCF_MINMAX |
1537 FCF_ACCELTABLE | FCF_MENU | FCF_ICON | FCF_TASKLIST | FCF_NOBYTEALIGN;
1538
1539 for (x = 1; x < argc; x++) {
1540 if (*argv[x] == '~' && !argv[x][1])
1541 fReminimize = TRUE;
1542 if (*argv[x] == '+' && !argv[x][1])
1543 fLogFile = TRUE;
1544 if (*argv[x] == '-') {
1545 if (!argv[x][1])
1546 fNoSaveState = TRUE;
1547 else
1548 strcpy(profile, &argv[x][1]);
1549 }
1550 }
1551
1552 hwndFrame = WinCreateStdWindow(HWND_DESKTOP,
1553 WS_VISIBLE,
1554 &FrameFlags,
1555 WC_MAINWND,
1556 NULL,
1557 WS_VISIBLE | WS_ANIMATE,
1558 FM3ModHandle, MAIN_FRAME, &hwndClient);
1559 if (hwndFrame) {
1560 WinSetWindowUShort(hwndFrame, QWS_ID, MAIN_FRAME);
1561 hwndMainMenu = WinWindowFromID(hwndFrame, FID_MENU);
1562 if (!WinRestoreWindowPos(FM2Str, "MainWindowPos", hwndFrame)) {
1563
1564 ULONG fl = SWP_MOVE | SWP_SIZE;
1565 RECTL rcl;
1566 ULONG icz = WinQuerySysValue(HWND_DESKTOP, SV_CYICON) * 3L;
1567 ULONG bsz = WinQuerySysValue(HWND_DESKTOP, SV_CYSIZEBORDER);
1568
1569 WinQueryWindowRect(HWND_DESKTOP, &rcl);
1570 rcl.yBottom += icz;
1571 rcl.yTop -= bsz;
1572 rcl.xLeft += bsz;
1573 rcl.xRight -= bsz;
1574 WinSetWindowPos(hwndFrame,
1575 HWND_TOP,
1576 rcl.xLeft,
1577 rcl.yBottom,
1578 rcl.xRight - rcl.xLeft, rcl.yTop - rcl.yBottom, fl);
1579 }
1580 if (fLogFile)
1581 LogFileHandle = _fsopen("FM2.LOG", "a+", SH_DENYWR);
1582 if (hwndHelp)
1583 WinAssociateHelpInstance(hwndHelp, hwndFrame);
1584 PostMsg(hwndClient, UM_SETUP, MPFROMLONG(argc), MPFROMP(argv));
1585 }
1586 return hwndFrame;
1587}
1588
1589BOOL CheckFileHeader(CHAR *filespec, CHAR *signature, LONG offset)
1590{
1591 HFILE handle;
1592 ULONG action;
1593 ULONG len = strlen(signature);
1594 ULONG l;
1595 // CHAR buffer[80];
1596 CHAR buffer[4096]; // 06 Oct 07 SHL Protect against NTFS defect
1597 BOOL ret = FALSE;
1598
1599 DosError(FERR_DISABLEHARDERR);
1600 if (DosOpen(filespec,
1601 &handle,
1602 &action,
1603 0,
1604 0,
1605 OPEN_ACTION_FAIL_IF_NEW |
1606 OPEN_ACTION_OPEN_IF_EXISTS,
1607 OPEN_FLAGS_FAIL_ON_ERROR |
1608 OPEN_FLAGS_NOINHERIT |
1609 OPEN_FLAGS_RANDOMSEQUENTIAL |
1610 OPEN_SHARE_DENYNONE | OPEN_ACCESS_READONLY, 0))
1611 ret = FALSE;
1612 else {
1613 // Try signature match
1614 l = len;
1615 l = min(l, 79);
1616 if (!DosChgFilePtr(handle,
1617 abs(offset),
1618 (offset >= 0) ?
1619 FILE_BEGIN : FILE_END, &len)) {
1620 if (!DosRead(handle, buffer, l, &len) && len == l) {
1621 if (!memcmp(signature, buffer, l))
1622 ret = TRUE; // Matched
1623 }
1624 }
1625 }
1626 DosClose(handle); /* Either way, we're done for now */
1627 return ret; /* Return TRUE if matched */
1628}
1629
1630int CheckVersion(int vermajor, int verminor)
1631{
1632 int ok = 0;
1633
1634 // fixme to do useful check - was missing in base source
1635
1636#if 0
1637 if (vermajor && verminor) {
1638 *vermajor = VERMAJOR;
1639 *verminor = VERMINOR;
1640 ok = 1;
1641 }
1642#endif
1643
1644 ok = 1;
1645
1646 return ok;
1647}
1648
1649#ifdef __WATCOMC__
1650#pragma alloc_text(INIT,LibMain,InitFM3DLL,DeInitFM3DLL)
1651#pragma alloc_text(INIT1,StartFM3,FindSwapperDat)
1652#endif
Note: See TracBrowser for help on using the repository browser.