source: trunk/dll/init.c@ 1431

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

Changed 3 way button to radio buttons and added rescan on change to add systype/label to tree enhancement.

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