source: trunk/dll/init.c@ 1117

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

Check disk free space before writing data files to prevent traps from being on a full disk (ticket 154)

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