source: trunk/dll/init.c@ 1439

Last change on this file since 1439 was 1439, checked in by Gregg Young, 16 years ago

Changes to allow high mem loading of dll; Refactor .LONGNAME and .SUBJECT EA fetch to FetchCommonEAs. Add szFSType to FillInRecordFromFSA use to bypass EA scan and size formatting for tree container; Fix labels/FS type to work on scan on NOPRESCAN Drives; Fixed dbl directory names on restore of dir cnrs; (Tickets 47, 339, 363, 368, 369, 370)

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