source: trunk/dll/info.c@ 1863

Last change on this file since 1863 was 1863, checked in by Gregg Young, 10 years ago

Remove recurse scan code; fix A:\ drive not ready error caused by not moving the cursor from drive A:\ fast enough. Have Flesh remove pcis that have NullStr FileNames.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 32.7 KB
Line 
1
2/***********************************************************************
3
4 $Id: info.c 1863 2015-08-23 00:13:48Z gyoung $
5
6 Info windows
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2001, 2010 Steven H. Levine
10
11 16 Oct 02 SHL Handle large partitions
12 12 Feb 03 SHL FileInfoProc: standardize EA math
13 01 Aug 04 SHL Rework lstrip/rstrip usage
14 23 May 05 SHL Use QWL_USER
15 25 May 05 SHL Use ULONGLONG and CommaFmtULL
16 05 Jun 05 SHL Use QWL_USER
17 14 Jul 06 SHL Use Runtime_Error
18 24 Mar 07 SHL Correct FileInfoProc binary file detect
19 24 Mar 07 SHL Correct FileInfoProc/IconProc race crash
20 19 Apr 07 SHL Sync with AcceptOneDrop GetOneDrop mods
21 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
22 25 Aug 07 SHL Drop list from FILESTUF - data not static
23 25 Aug 07 SHL IconProc: do not use freed memory - random bad things happen
24 27 Sep 07 SHL Correct ULONGLONG size formatting
25 30 Dec 07 GKY Use CommaFmtULL
26 29 Feb 08 GKY Use xfree where appropriate
27 25 Dec 08 GKY Add code to allow write verify to be turned off on a per drive basis
28 25 Dec 08 GKY Add DRIVE_RSCANNED flag to monitor for the first recursive drive scan per session
29 to prevent duplicate directory names in tree following a copy before initial scan.
30 11 Jan 08 GKY Add Write verify off and recures scan to drive info display when appropriate.
31 07 Feb 09 GKY Allow user to turn off alert and/or error beeps in settings notebook.
32 07 Feb 09 GKY Add *DateFormat functions to format dates based on locale
33 08 Mar 09 GKY Renamed commafmt.h i18nutil.h
34 12 Jul 09 GKY Remove code to update recursive scan setting which isn't user setable
35 22 Jul 09 GKY Check if drives support EAs add driveflag for this
36 22 Jul 09 GKY Add LocalHD driveflag
37 17 Jan 10 GKY Changes to get working with Watcom 1.9 Beta (1/16/10). Mostly cast CHAR CONSTANT * as CHAR *.
38 20 Apr 13 GKY Double click on directory in Info listbox opens directory object instead of
39 causing an error message from DefaultView
40 28 Apr 14 JBS Ticket #522: Ensure use of wrapper functions where needed
41 22 Aug 15 GKY Remove recurse scan code.
42
43***********************************************************************/
44
45#include <stdlib.h>
46#include <string.h>
47#include <ctype.h>
48#include <share.h>
49
50#define INCL_DOS
51#define INCL_WIN
52#define INCL_GPI
53#define INCL_LONGLONG
54
55#include "fm3dll.h"
56#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
57#include "draglist.h" // Data declaration(s)
58#include "notebook.h" // Data declaration(s)
59#include "inis.h" // Data declaration(s)
60#include "init.h" // Data declaration(s)
61#include "mainwnd.h" // Data declaration(s)
62#include "fm3dlg.h"
63#include "fm3str.h"
64#include "makelist.h" // AddToList
65#include "errutil.h" // Dos_Error...
66#include "strutil.h" // GetPString
67#include "attribs.h" // AttrListDlgProc
68#include "defview.h" // DefaultView
69#include "info.h"
70#include "valid.h" // CheckDrive, IsBinary
71#include "seticon.h" // SetIconDlgProc
72#include "droplist.h" // AcceptOneDrop, DropHelp, GetOneDrop
73#include "eas.h" // DisplayEAsProc
74#include "misc.h" // DrawTargetEmphasis
75#include "notify.h" // Notify
76#include "shadow.h" // OpenObject
77#include "chklist.h" // PopupMenu
78#include "presparm.h" // SetPresParams
79#include "strips.h" // bstrip
80#include "i18nutil.h" // CommaFmtULL
81#include "wrappers.h" // xDosFindFirst
82#include "fortify.h"
83
84// Data definitions
85#pragma data_seg(DATA1)
86static PSZ pszSrcFile = __FILE__;
87
88#pragma data_seg(GLOBAL1)
89INT driveflags[26];
90
91CHAR *FlagMsg(CHAR drive, CHAR * buffer)
92{
93 ULONG x;
94 BOOL once = FALSE;
95 register CHAR *p;
96
97 if (buffer) {
98 *buffer = 0;
99 p = buffer;
100 if (isalpha(drive)) {
101 if (driveflags[toupper(drive) - 'A']) {
102 for (x = IDS_FLREMOVABLETEXT; x < IDS_FLRECURSESCANDONETEXT + 1; x++) {
103 if (driveflags[toupper(drive) - 'A'] &
104 (1 << (x - IDS_FLREMOVABLETEXT))) {
105 if (once) {
106 *p = ' ';
107 p++;
108 }
109 else
110 once = TRUE;
111 *p = '[';
112 p++;
113 strcpy(p, GetPString(x));
114 p += strlen(p);
115 *p = ']';
116 p++;
117 *p = 0;
118 }
119 }
120 }
121 else
122 strcpy(buffer, "[None]");
123 }
124 }
125 return buffer;
126}
127
128MRESULT EXPENTRY DrvInfoProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
129{
130 CHAR *pszFileName;
131 CHAR szMB[20];
132 CHAR szKB[20];
133 CHAR szUnits[20];
134 APIRET rc;
135
136 switch (msg) {
137 case WM_INITDLG:
138 if (mp2) {
139
140 CHAR s[CCHMAXPATH * 2];
141 ULONG type;
142
143 pszFileName = (CHAR *)mp2;
144 WinSetWindowPtr(hwnd, QWL_USER, (PVOID) pszFileName);
145 WinSendDlgItemMsg(hwnd,
146 INFO_LABEL,
147 EM_SETTEXTLIMIT,
148 MPFROM2SHORT(CCHMAXPATHCOMP, 0), MPVOID);
149 if (!(driveflags[toupper(*pszFileName) - 'A'] & DRIVE_NOSTATS)){
150 WinSendDlgItemMsg(hwnd,
151 INFO_FREE,
152 SLM_SETSLIDERINFO,
153 MPFROM2SHORT(SMA_SLIDERARMDIMENSIONS, 0),
154 MPFROM2SHORT(0, 0));
155 WinSendDlgItemMsg(hwnd,
156 INFO_USED,
157 SLM_SETSLIDERINFO,
158 MPFROM2SHORT(SMA_SLIDERARMDIMENSIONS, 0),
159 MPFROM2SHORT(0, 0));
160 }
161 if (driveflags[toupper(*pszFileName) - 'A'] & DRIVE_NOTWRITEABLE) {
162 WinSendDlgItemMsg(hwnd,
163 INFO_LABEL,
164 EM_SETREADONLY, MPFROM2SHORT(TRUE, 0), MPVOID);
165 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, DID_OK));
166 }
167 if (IsFullName(pszFileName)) {
168
169 CHAR FileSystem[CCHMAXPATH * 2];
170
171 sprintf(FileSystem,
172 GetPString(IDS_DRIVEINFOTITLETEXT), toupper(*pszFileName));
173 WinSetWindowText(hwnd, FileSystem);
174 if (CheckDrive(toupper(*pszFileName), FileSystem, &type) != -1){
175
176 FSALLOCATE fsa;
177
178 if (type & (DRIVE_REMOTE | DRIVE_ZIPSTREAM | DRIVE_VIRTUAL)) {
179
180 CHAR Path[3], *pfsn, *pfsd;
181 ULONG Size;
182 APIRET rc;
183 PFSQBUFFER2 pfsq;
184
185 Path[0] = toupper(*pszFileName);
186 Path[1] = ':';
187 Path[2] = 0;
188 Size = sizeof(s);
189 DosError(FERR_DISABLEHARDERR);
190 rc = DosQueryFSAttach(Path,
191 0, FSAIL_QUERYNAME, (PFSQBUFFER2) s, &Size);
192 if (!rc) {
193 pfsq = (PFSQBUFFER2) s;
194 pfsn = (PCHAR)(pfsq->szName) + pfsq->cbName + 1;
195 pfsd = pfsn + pfsq->cbFSDName + 1;
196 if (pfsq->cbFSAData && pfsd && *pfsd) {
197 sprintf(s, " (%s)", pfsd);
198 WinSetDlgItemText(hwnd, INFO_REALPATH, s);
199 }
200 }
201 }
202
203 DosError(FERR_DISABLEHARDERR);
204 if (!DosQueryFSInfo(toupper(*pszFileName) - '@',
205 FSIL_ALLOC, &fsa, sizeof(FSALLOCATE))) {
206
207 struct
208 {
209 ULONG serial;
210 CHAR volumelength;
211 CHAR volumelabel[CCHMAXPATH];
212 }
213 volser;
214 ULONG percentfree, percentused;
215
216 memset(&volser, 0, sizeof(volser));
217 DosError(FERR_DISABLEHARDERR);
218 if (!DosQueryFSInfo(toupper(*pszFileName) - '@',
219 FSIL_VOLSER,
220 &volser, (ULONG) sizeof(volser))) {
221 WinSetDlgItemText(hwnd, INFO_FS, FileSystem);
222 WinSetDlgItemText(hwnd, INFO_LABEL, volser.volumelabel);
223 sprintf(s, "%lx", volser.serial);
224 WinSetDlgItemText(hwnd, INFO_SERIAL, s);
225 FlagMsg(*pszFileName, s);
226 WinSetDlgItemText(hwnd, INFO_FLAGS, s);
227 if (!(driveflags[toupper(*pszFileName) - 'A'] & DRIVE_NOSTATS)){
228 CommaFmtULL(szMB, sizeof(szMB),
229 (ULONGLONG) fsa.cUnit *
230 (fsa.cSectorUnit * fsa.cbSector), 'M');
231 CommaFmtULL(szKB, sizeof(szKB),
232 (ULONGLONG) fsa.cUnit *
233 (fsa.cSectorUnit * fsa.cbSector), 'K');
234 CommaFmtULL(szUnits, sizeof(szUnits),
235 (ULONGLONG) fsa.cUnit, ' ');
236 sprintf(s, "%s, %s, %s %s%s", szMB, szKB, szUnits, GetPString(IDS_UNITTEXT), &"s"[fsa.cUnit == 1L]); // hack cough
237 WinSetDlgItemText(hwnd, INFO_TOTAL, s);
238
239 CommaFmtULL(szMB, sizeof(szMB),
240 (ULONGLONG) fsa.cUnitAvail *
241 (fsa.cSectorUnit * fsa.cbSector), 'M');
242 CommaFmtULL(szKB, sizeof(szKB),
243 (ULONGLONG) fsa.cUnitAvail *
244 (fsa.cSectorUnit * fsa.cbSector), 'K');
245 CommaFmtULL(szUnits, sizeof(szUnits),
246 (ULONGLONG) fsa.cUnitAvail, ' ');
247 sprintf(s, "%s, %s, %s %s%s",
248 szMB, szKB, szUnits,
249 GetPString(IDS_UNITTEXT), &"s"[fsa.cUnitAvail == 1L]);
250 WinSetDlgItemText(hwnd, INFO_AVAILABLE, s);
251 sprintf(s,
252 GetPString(IDS_SECTORSTEXT),
253 fsa.cbSector,
254 fsa.cSectorUnit, &"s"[fsa.cSectorUnit == 1L]);
255 WinSetDlgItemText(hwnd, INFO_ALLOCUNITS, s);
256
257 percentfree = (fsa.cUnitAvail && fsa.cUnit) ?
258 ((ULONG) fsa.cUnitAvail * 100) / (ULONG) fsa.cUnit : 0;
259 if (!percentfree && fsa.cUnitAvail)
260 percentfree = 1;
261 percentused = 100 - percentfree;
262 WinSendDlgItemMsg(hwnd,
263 INFO_USED,
264 SLM_SETSLIDERINFO,
265 MPFROM2SHORT(SMA_SLIDERARMPOSITION,
266 SMA_INCREMENTVALUE),
267 MPFROMSHORT(percentused));
268 WinSendDlgItemMsg(hwnd,
269 INFO_FREE,
270 SLM_SETSLIDERINFO,
271 MPFROM2SHORT(SMA_SLIDERARMPOSITION,
272 SMA_INCREMENTVALUE),
273 MPFROMSHORT(percentfree));
274 sprintf(s, "%u%%", percentused);
275 WinSetDlgItemText(hwnd, INFO_USEDPERCENT, s);
276 sprintf(s, "%u%%", percentfree);
277 WinSetDlgItemText(hwnd, INFO_FREEPERCENT, s);
278 }
279 else
280 WinSetDlgItemText(hwnd, INFO_AVAILABLE, (CHAR *) GetPString(IDS_STATSMEANINGLESSTEXT));
281 }
282 else {
283 sprintf(FileSystem,
284 GetPString(IDS_CANTQUERYVOLTEXT),
285 toupper(*pszFileName));
286 Notify(FileSystem);
287 WinDismissDlg(hwnd, 0);
288 }
289 }
290 else {
291 sprintf(FileSystem,
292 GetPString(IDS_CANTQUERYALLOCTEXT),
293 toupper(*pszFileName));
294 Notify(FileSystem);
295 WinDismissDlg(hwnd, 0);
296 }
297 }
298 else {
299 FlagMsg(*pszFileName, s);
300 sprintf(FileSystem,
301 GetPString(IDS_DRIVEINACCESSIBLETEXT),
302 toupper(*pszFileName), s);
303 Notify(FileSystem);
304 WinDismissDlg(hwnd, 0);
305 }
306 }
307 else {
308 WinDismissDlg(hwnd, 0);
309 }
310 }
311 else
312 WinDismissDlg(hwnd, 0);
313 break;
314
315 case WM_CONTROL:
316 return 0;
317
318 case WM_COMMAND:
319 switch (SHORT1FROMMP(mp1)) {
320 case DID_CANCEL:
321 WinDismissDlg(hwnd, 0);
322 break;
323
324 case IDM_HELP:
325 if (hwndHelp)
326 WinSendMsg(hwndHelp,
327 HM_DISPLAY_HELP,
328 MPFROM2SHORT(HELP_DRVINFO, 0), MPFROMSHORT(HM_RESOURCEID));
329 break;
330
331 case DID_OK:
332 pszFileName = INSTDATA(hwnd);
333 if (!(driveflags[toupper(*pszFileName) - 'A'] & DRIVE_NOTWRITEABLE)) {
334
335 CHAR s[CCHMAXPATHCOMP + 3];
336
337 *s = 0;
338 WinQueryDlgItemText(hwnd, INFO_LABEL, CCHMAXPATHCOMP, s);
339 bstrip(s);
340 if (*s) {
341 struct
342 {
343 ULONG serial;
344 CHAR volumelength;
345 CHAR volumelabel[CCHMAXPATH];
346 }
347 volser;
348
349 memset(&volser, 0, sizeof(volser));
350 DosError(FERR_DISABLEHARDERR);
351 if (!DosQueryFSInfo(toupper(*pszFileName) - '@',
352 FSIL_VOLSER,
353 &volser,
354 (ULONG) sizeof(volser)) &&
355 stricmp(s, volser.volumelabel)) {
356 memmove(s + 1, s, strlen(s) + 1);
357 *s = strlen(s + 1);
358 DosError(FERR_DISABLEHARDERR);
359 rc = DosSetFSInfo(toupper(*pszFileName) - '@',
360 2L, (PVOID) s, (ULONG) sizeof(s));
361 if (rc) {
362 Dos_Error(MB_CANCEL, rc, hwnd, __FILE__, __LINE__,
363 "DosSetFSInfo failed");
364 }
365 }
366 }
367 }
368 WinDismissDlg(hwnd, 1);
369 break;
370 }
371 return 0;
372 }
373 return WinDefDlgProc(hwnd, msg, mp1, mp2);
374}
375
376typedef struct {
377 USHORT size;
378 CHAR szFileName[CCHMAXPATH];
379 BOOL madechanges;
380} FILESTUF;
381
382typedef struct {
383 USHORT size;
384 PFNWP oldproc;
385 FILESTUF *pfs;
386 HWND lasthwndMenu;
387} ICONSTUF;
388
389/**
390 * subclass routine to allow changing a program's icon
391 */
392
393MRESULT EXPENTRY IconProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
394{
395 ICONSTUF *pis = (ICONSTUF *)WinQueryWindowPtr(hwnd, QWL_USER);
396 MRESULT mr;
397 CHAR *p;
398
399 static BOOL emphasized = FALSE;
400
401 if (!pis) {
402 Runtime_Error(pszSrcFile, __LINE__, NULL);
403 if (msg != WM_DESTROY)
404 return WinDefWindowProc(hwnd, msg, mp1, mp2);
405 }
406
407 switch (msg) {
408 case DM_DRAGOVER:
409 if (!emphasized) {
410 emphasized = TRUE;
411 DrawTargetEmphasis(hwnd, emphasized);
412 }
413 if (AcceptOneDrop(hwnd, mp1, mp2))
414 return MRFROM2SHORT(DOR_DROP, DO_MOVE);
415 return MRFROM2SHORT(DOR_NEVERDROP, 0);
416
417 case DM_DRAGLEAVE:
418 emphasized = FALSE;
419 DrawTargetEmphasis(hwnd, emphasized);
420 break;
421
422 case DM_DROPHELP:
423 DropHelp(mp1, mp2, hwnd, GetPString(IDS_DROPCHGICONHELPTEXT));
424 return 0;
425
426 case DM_DROP:
427 {
428 HPOINTER hptr;
429 CHAR szFrom[CCHMAXPATH + 2];
430 ICONINFO ici;
431
432 emphasized = FALSE;
433 DrawTargetEmphasis(hwnd, emphasized);
434 if (GetOneDrop(hwnd, mp1, mp2, szFrom, sizeof(szFrom))) {
435 memset(&ici, 0, sizeof(ICONINFO));
436 ici.cb = sizeof(ICONINFO);
437 ici.fFormat = ICON_FILE;
438 ici.pszFileName = szFrom;
439 if (!WinSetFileIcon((PSZ) pis->pfs->szFileName, (PICONINFO) & ici)) {
440 ici.fFormat = ICON_CLEAR;
441 WinSetFileIcon((PSZ) pis->pfs->szFileName, (PICONINFO) & ici);
442 }
443 hptr = WinLoadFileIcon(pis->pfs->szFileName, FALSE);
444 if (!hptr)
445 hptr = (!IsFile(pis->pfs->szFileName)) ? hptrDir : hptrFile;
446 if (pis && pis->oldproc) {
447 WinShowWindow(hwnd, FALSE);
448 pis->oldproc(hwnd, SM_SETHANDLE, MPFROMLONG(hptr), MPVOID);
449 WinShowWindow(hwnd, TRUE);
450 WinInvalidateRect(WinQueryWindow(hwnd, QW_PARENT), NULL, TRUE);
451 }
452 }
453 }
454 return 0;
455
456 case WM_PAINT:
457 mr = pis->oldproc(hwnd, msg, mp1, mp2);
458 PaintRecessedWindow(hwnd, (HPS) 0, FALSE, FALSE);
459 return mr;
460 break;
461
462 case WM_MENUEND:
463 if (pis->lasthwndMenu == (HWND)mp2)
464 WinDestroyWindow(pis->lasthwndMenu);
465 pis->lasthwndMenu = (HWND) 0;
466 break;
467
468 case WM_CONTEXTMENU:
469 if (pis->lasthwndMenu)
470 WinDestroyWindow(pis->lasthwndMenu);
471 pis->lasthwndMenu = WinLoadMenu(hwnd, FM3ModHandle, FLE_FRAME);
472 if (pis->lasthwndMenu) {
473 p = strrchr(pis->pfs->szFileName, '.');
474 if (!p || (stricmp(p, PCSZ_DOTICO) && stricmp(p, PCSZ_DOTPTR)))
475 WinSendMsg(pis->lasthwndMenu,
476 MM_DELETEITEM,
477 MPFROM2SHORT(IDM_SELECTALL, TRUE), MPVOID);
478 PopupMenu(hwnd, hwnd, pis->lasthwndMenu);
479 }
480 break;
481
482 case WM_COMMAND:
483 switch (SHORT1FROMMP(mp1)) {
484 case IDM_SELECTALL:
485 case IDM_DESELECTALL:
486 WinDlgBox(HWND_DESKTOP,
487 hwnd,
488 SetIconDlgProc,
489 FM3ModHandle,
490 SETICON_FRAME,
491 (PVOID) ((SHORT1FROMMP(mp1) == IDM_SELECTALL) ?
492 pis->pfs->szFileName : NULL));
493 break;
494 }
495 return 0;
496
497 case WM_DESTROY:
498 emphasized = FALSE;
499 if (!pis)
500 return WinDefWindowProc(hwnd, msg, mp1, mp2);
501 else {
502 PFNWP oldproc = pis->oldproc;
503 if (pis->lasthwndMenu)
504 WinDestroyWindow(pis->lasthwndMenu);
505 free(pis);
506 return oldproc(hwnd, msg, mp1, mp2);
507 }
508 break;
509 }
510
511 return pis->oldproc(hwnd, msg, mp1, mp2);
512}
513
514MRESULT EXPENTRY FileInfoProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
515{
516 FILESTUF *pfs;
517 ICONSTUF *pis;
518 CHAR **ppsz;
519
520 switch (msg) {
521 case WM_INITDLG:
522 if (!mp2) {
523 WinDismissDlg(hwnd, 1);
524 break;
525 }
526 pfs = xmallocz(sizeof(FILESTUF), pszSrcFile, __LINE__);
527 if (!pfs) {
528 WinDismissDlg(hwnd, 1);
529 break;
530 }
531 pfs->size = sizeof(FILESTUF);
532 WinSetWindowPtr(hwnd, QWL_USER, pfs);
533 {
534 USHORT ids[] = { FLE_SIZES, FLE_SLACK, FLE_LASTWRITE, FLE_CREATE,
535 FLE_LASTACCESS, 0
536 };
537 INT x;
538 CHAR s[CCHMAXPATH];
539
540 ppsz = (CHAR **)mp2;
541 for (x = 0; ppsz[x]; x++) {
542 if (DosQueryPathInfo(ppsz[x], FIL_QUERYFULLNAME, s, sizeof(s)))
543 strcpy(s, ppsz[x]);
544 WinSendDlgItemMsg(hwnd,
545 FLE_NAME,
546 LM_INSERTITEM,
547 MPFROM2SHORT(LIT_SORTASCENDING, 0), MPFROMP(s));
548 }
549 if (!x) {
550 WinDismissDlg(hwnd, 1);
551 break;
552 }
553 WinSendDlgItemMsg(hwnd,
554 FLE_NAME,
555 LM_SELECTITEM, MPFROM2SHORT(0, 0), MPFROMSHORT(TRUE));
556 for (x = 0; ids[x]; x++)
557 SetPresParams(WinWindowFromID(hwnd, ids[x]),
558 &RGBGREY, &RGBBLACK, &RGBBLACK, NULL);
559 }
560 pis = xmallocz(sizeof(ICONSTUF), pszSrcFile, __LINE__);
561 if (!pis) {
562 WinDismissDlg(hwnd, 1);
563 break;
564 }
565 WinSetWindowPtr(WinWindowFromID(hwnd, FLE_ICON), QWL_USER, (PVOID) pis);
566 pis->size = sizeof(ICONSTUF);
567 pis->pfs = pfs;
568 pis->oldproc = WinSubclassWindow(WinWindowFromID(hwnd, FLE_ICON),
569 IconProc);
570 break;
571
572 case WM_CONTROL:
573 switch (SHORT1FROMMP(mp1)) {
574 case FLE_READONLY:
575 case FLE_ARCHIVED:
576 case FLE_SYSTEM:
577 case FLE_HIDDEN:
578 switch (SHORT2FROMMP(mp1)) {
579 case BN_CLICKED:
580 pfs = WinQueryWindowPtr(hwnd, QWL_USER);
581 if (pfs && *pfs->szFileName) {
582
583 LISTINFO li;
584 UINT numfiles = 0, numalloc = 0;
585
586 memset(&li, 0, sizeof(LISTINFO));
587 if (!AddToList(pfs->szFileName, &li.list, &numfiles, &numalloc)) {
588 if (WinDlgBox(HWND_DESKTOP,
589 hwnd,
590 AttrListDlgProc,
591 FM3ModHandle,
592 ATR_FRAME, MPFROMP(&li)) && li.list && li.list[0]) {
593 pfs->madechanges = TRUE;
594 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
595 }
596 FreeList(li.list);
597 }
598 }
599 break;
600 } // switch
601 break;
602 case FLE_NAME:
603 switch (SHORT2FROMMP(mp1)) {
604 case LN_ENTER:
605 case LN_SELECT:
606 pfs = WinQueryWindowPtr(hwnd, QWL_USER);
607 if (!pfs) {
608 Runtime_Error(pszSrcFile, __LINE__, NULL);
609 WinDismissDlg(hwnd, 1);
610 }
611 else {
612
613 SHORT sSelect;
614
615 sSelect = (SHORT) WinSendDlgItemMsg(hwnd,
616 FLE_NAME,
617 LM_QUERYSELECTION,
618 MPFROMSHORT(LIT_FIRST), MPVOID);
619 if (sSelect >= 0) {
620 *pfs->szFileName = 0;
621 WinSendDlgItemMsg(hwnd,
622 FLE_NAME,
623 LM_QUERYITEMTEXT,
624 MPFROM2SHORT(sSelect, CCHMAXPATH),
625 MPFROMP(pfs->szFileName));
626 if (*pfs->szFileName) {
627 if (SHORT2FROMMP(mp1) == LN_SELECT)
628 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
629 else if (IsFile(pfs->szFileName))
630 DefaultView(hwnd,(HWND) 0, (HWND) 0, NULL, 32, pfs->szFileName);
631 else
632 DefaultView(hwnd,(HWND) 0, (HWND) 0, NULL, 2, pfs->szFileName);
633 }
634 }
635 }
636 break;
637 }
638 break;
639 }
640 return 0;
641
642 case UM_SETDIR:
643 WinCheckButton(hwnd, FLE_READONLY, FALSE);
644 WinCheckButton(hwnd, FLE_ARCHIVED, FALSE);
645 WinCheckButton(hwnd, FLE_SYSTEM, FALSE);
646 WinCheckButton(hwnd, FLE_HIDDEN, FALSE);
647 WinCheckButton(hwnd, FLE_DIRECTORY, FALSE);
648 WinCheckButton(hwnd, FLE_READABLE, FALSE);
649 WinCheckButton(hwnd, FLE_WRITEABLE, FALSE);
650 WinCheckButton(hwnd, FLE_OPEN, FALSE);
651 WinCheckButton(hwnd, FLE_BINARY, FALSE);
652 WinCheckButton(hwnd, FLE_ISARCHIVE, FALSE);
653 WinSetDlgItemText(hwnd, FLE_ARCNAME, NullStr);
654 WinCheckButton(hwnd, FLE_OS2FS, FALSE);
655 WinCheckButton(hwnd, FLE_OS2WIN, FALSE);
656 WinCheckButton(hwnd, FLE_OS2PM, FALSE);
657 WinCheckButton(hwnd, FLE_DOS, FALSE);
658 WinCheckButton(hwnd, FLE_32BIT, FALSE);
659 WinCheckButton(hwnd, FLE_WINREAL, FALSE);
660 WinCheckButton(hwnd, FLE_WINPROT, FALSE);
661 WinCheckButton(hwnd, FLE_WINENH, FALSE);
662 WinCheckButton(hwnd, FLE_DLL, FALSE);
663 WinCheckButton(hwnd, FLE_PHYSDRV, FALSE);
664 WinCheckButton(hwnd, FLE_VIRTDRV, FALSE);
665 WinCheckButton(hwnd, FLE_PROTDLL, FALSE);
666 pfs = WinQueryWindowPtr(hwnd, QWL_USER);
667 if (pfs && *pfs->szFileName) {
668 CHAR s[97];
669 CHAR szCmmaFmtFileSize[81], szCmmaFmtEASize[81];
670 CHAR szCmmaFmtFileEASize[81], szCmmaFmtFileEASizeK[81], szDate[DATE_BUF_BYTES];
671 FILEFINDBUF4L fs;
672 HDIR hdir = HDIR_CREATE;
673 ULONG apptype = 1;
674 FILE *fp;
675 HPOINTER hptr;
676 ARC_TYPE *info;
677 CHAR *mode;
678
679 DosError(FERR_DISABLEHARDERR);
680 if (xDosFindFirst(pfs->szFileName,
681 &hdir,
682 FILE_NORMAL | FILE_ARCHIVED |
683 FILE_DIRECTORY | FILE_READONLY | FILE_HIDDEN |
684 FILE_SYSTEM,
685 &fs, sizeof(fs), &apptype, FIL_QUERYEASIZEL)) {
686 // Not found
687 SHORT sSelect, numitems;
688
689 if (!fAlertBeepOff)
690 DosBeep(250, 100); // Wake up user
691 sSelect = (SHORT) WinSendDlgItemMsg(hwnd,
692 FLE_NAME,
693 LM_QUERYSELECTION,
694 MPFROMSHORT(LIT_FIRST), MPVOID);
695 if (sSelect >= 0) {
696 WinSendDlgItemMsg(hwnd,
697 FLE_NAME,
698 LM_DELETEITEM, MPFROMSHORT(sSelect), MPVOID);
699 numitems = (SHORT) WinSendDlgItemMsg(hwnd,
700 FLE_NAME,
701 LM_QUERYITEMCOUNT,
702 MPVOID, MPVOID);
703 if (numitems)
704 PostMsg(WinWindowFromID(hwnd, FLE_NAME),
705 LM_SELECTITEM,
706 MPFROMSHORT(((sSelect) ? sSelect - 1 : 0)),
707 MPFROMSHORT(TRUE));
708 }
709 }
710 else {
711 DosFindClose(hdir);
712 FDateFormat(szDate, fs.fdateLastWrite);
713 sprintf(s, "%s %02u%s%02u%s%02u",
714 szDate,
715 fs.ftimeLastWrite.hours, TimeSeparator,
716 fs.ftimeLastWrite.minutes, TimeSeparator, fs.ftimeLastWrite.twosecs * 2);
717 WinSetDlgItemText(hwnd, FLE_LASTWRITE, s);
718 if (fs.fdateCreation.year &&
719 fs.fdateCreation.month && fs.fdateCreation.day) {
720 FDateFormat(szDate, fs.fdateCreation);
721 sprintf(s, "%s %02u%s%02u%s%02u",
722 szDate,
723 fs.ftimeCreation.hours, TimeSeparator,
724 fs.ftimeCreation.minutes, TimeSeparator, fs.ftimeCreation.twosecs * 2);
725 WinSetDlgItemText(hwnd, FLE_CREATE, s);
726 }
727 if (fs.fdateLastAccess.year &&
728 fs.fdateLastAccess.month && fs.fdateLastAccess.day) {
729 FDateFormat(szDate, fs.fdateLastAccess);
730 sprintf(s, "%s %02u%s%02u%s%02u",
731 szDate,
732 fs.ftimeLastAccess.hours, TimeSeparator,
733 fs.ftimeLastAccess.minutes, TimeSeparator, fs.ftimeLastAccess.twosecs * 2);
734 WinSetDlgItemText(hwnd, FLE_LASTACCESS, s);
735 }
736 CommaFmtULL(szCmmaFmtFileSize,
737 sizeof(szCmmaFmtFileSize), fs.cbFile, ' ');
738 CommaFmtULL(szCmmaFmtEASize,
739 sizeof(szCmmaFmtEASize), CBLIST_TO_EASIZE(fs.cbList), ' ');
740 CommaFmtULL(szCmmaFmtFileEASize,
741 sizeof(szCmmaFmtFileEASize),
742 fs.cbFile + CBLIST_TO_EASIZE(fs.cbList),
743 ' ');
744 CommaFmtULL(szCmmaFmtFileEASizeK,
745 sizeof(szCmmaFmtFileEASizeK),
746 fs.cbFile + CBLIST_TO_EASIZE(fs.cbList),
747 'K');
748 sprintf(s,
749 GetPString(IDS_SIZEINCLEASTEXT),
750 szCmmaFmtFileSize,
751 szCmmaFmtEASize,
752 szCmmaFmtFileEASize,
753 szCmmaFmtFileEASizeK);
754 WinSetDlgItemText(hwnd, FLE_SIZES, s);
755 CommaFmtULL(szCmmaFmtFileSize,
756 sizeof(szCmmaFmtFileSize), fs.cbFileAlloc - fs.cbFile, ' ');
757 sprintf(s, "%s", szCmmaFmtFileSize);
758 WinSetDlgItemText(hwnd, FLE_SLACK, s);
759 WinCheckButton(hwnd,
760 FLE_READONLY, ((fs.attrFile & FILE_READONLY) != 0));
761 WinCheckButton(hwnd,
762 FLE_ARCHIVED, ((fs.attrFile & FILE_ARCHIVED) != 0));
763 WinCheckButton(hwnd,
764 FLE_DIRECTORY, ((fs.attrFile & FILE_DIRECTORY) != 0));
765 WinCheckButton(hwnd, FLE_HIDDEN, ((fs.attrFile & FILE_HIDDEN) != 0));
766 WinCheckButton(hwnd, FLE_SYSTEM, ((fs.attrFile & FILE_SYSTEM) != 0));
767 DosError(FERR_DISABLEHARDERR);
768 if (!xDosQueryAppType(pfs->szFileName, &apptype)) {
769 WinEnableWindow(WinWindowFromID(hwnd, FLE_OS2FS), TRUE);
770 WinEnableWindow(WinWindowFromID(hwnd, FLE_OS2WIN), TRUE);
771 WinEnableWindow(WinWindowFromID(hwnd, FLE_OS2PM), TRUE);
772 WinEnableWindow(WinWindowFromID(hwnd, FLE_BOUND), TRUE);
773 WinEnableWindow(WinWindowFromID(hwnd, FLE_32BIT), TRUE);
774 WinEnableWindow(WinWindowFromID(hwnd, FLE_DOS), TRUE);
775 WinEnableWindow(WinWindowFromID(hwnd, FLE_WINPROT), TRUE);
776 WinEnableWindow(WinWindowFromID(hwnd, FLE_WINREAL), TRUE);
777 WinEnableWindow(WinWindowFromID(hwnd, FLE_WINENH), TRUE);
778 WinEnableWindow(WinWindowFromID(hwnd, FLE_DLL), TRUE);
779 WinEnableWindow(WinWindowFromID(hwnd, FLE_PHYSDRV), TRUE);
780 WinEnableWindow(WinWindowFromID(hwnd, FLE_VIRTDRV), TRUE);
781 WinEnableWindow(WinWindowFromID(hwnd, FLE_PROTDLL), TRUE);
782 WinCheckButton(hwnd, FLE_OS2FS,
783 ((apptype & FAPPTYP_NOTWINDOWCOMPAT) &&
784 !(apptype & FAPPTYP_WINDOWCOMPAT)));
785 WinCheckButton(hwnd, FLE_OS2WIN,
786 ((apptype & FAPPTYP_WINDOWCOMPAT) &&
787 !(apptype & FAPPTYP_NOTWINDOWCOMPAT)));
788 WinCheckButton(hwnd, FLE_OS2PM,
789 ((apptype & FAPPTYP_WINDOWAPI) ==
790 FAPPTYP_WINDOWAPI));
791 WinCheckButton(hwnd, FLE_BOUND, ((apptype & FAPPTYP_BOUND) != 0));
792 WinCheckButton(hwnd, FLE_DLL, ((apptype & FAPPTYP_DLL) != 0));
793 WinCheckButton(hwnd, FLE_DOS, ((apptype & FAPPTYP_DOS) != 0));
794 WinCheckButton(hwnd, FLE_PHYSDRV,
795 ((apptype & FAPPTYP_PHYSDRV) != 0));
796 WinCheckButton(hwnd, FLE_VIRTDRV,
797 ((apptype & FAPPTYP_VIRTDRV) != 0));
798 WinCheckButton(hwnd, FLE_PROTDLL,
799 ((apptype & FAPPTYP_PROTDLL) != 0));
800 WinCheckButton(hwnd, FLE_WINREAL,
801 ((apptype & FAPPTYP_WINDOWSREAL) != 0));
802 WinCheckButton(hwnd, FLE_WINPROT,
803 ((apptype & FAPPTYP_WINDOWSPROT) != 0));
804 WinCheckButton(hwnd, FLE_32BIT, ((apptype & FAPPTYP_32BIT) != 0));
805 WinCheckButton(hwnd, FLE_WINENH, ((apptype & 0x1000) != 0));
806 }
807 else {
808 WinEnableWindow(WinWindowFromID(hwnd, FLE_OS2FS), FALSE);
809 WinEnableWindow(WinWindowFromID(hwnd, FLE_OS2WIN), FALSE);
810 WinEnableWindow(WinWindowFromID(hwnd, FLE_OS2PM), FALSE);
811 WinEnableWindow(WinWindowFromID(hwnd, FLE_BOUND), FALSE);
812 WinEnableWindow(WinWindowFromID(hwnd, FLE_32BIT), FALSE);
813 WinEnableWindow(WinWindowFromID(hwnd, FLE_DOS), FALSE);
814 WinEnableWindow(WinWindowFromID(hwnd, FLE_WINPROT), FALSE);
815 WinEnableWindow(WinWindowFromID(hwnd, FLE_WINREAL), FALSE);
816 WinEnableWindow(WinWindowFromID(hwnd, FLE_WINENH), FALSE);
817 WinEnableWindow(WinWindowFromID(hwnd, FLE_DLL), FALSE);
818 WinEnableWindow(WinWindowFromID(hwnd, FLE_PHYSDRV), FALSE);
819 WinEnableWindow(WinWindowFromID(hwnd, FLE_VIRTDRV), FALSE);
820 WinEnableWindow(WinWindowFromID(hwnd, FLE_PROTDLL), FALSE);
821 }
822 hptr = WinLoadFileIcon(pfs->szFileName, FALSE);
823 WinShowWindow(WinWindowFromID(hwnd, FLE_ICON), FALSE);
824 if (hptr) {
825 WinSendDlgItemMsg(hwnd,
826 FLE_ICON, SM_SETHANDLE, MPFROMLONG(hptr), MPVOID);
827 WinShowWindow(WinWindowFromID(hwnd, FLE_ICON), TRUE);
828 }
829 WinShowWindow(WinWindowFromID(hwnd, FLE_EAS), fs.cbList > 4);
830 if (!(fs.attrFile & FILE_DIRECTORY)) {
831 WinEnableWindow(WinWindowFromID(hwnd, FLE_READABLE), TRUE);
832 WinEnableWindow(WinWindowFromID(hwnd, FLE_WRITEABLE), TRUE);
833 WinEnableWindow(WinWindowFromID(hwnd, FLE_OPEN), TRUE);
834 WinEnableWindow(WinWindowFromID(hwnd, FLE_ISARCHIVE), TRUE);
835 WinEnableWindow(WinWindowFromID(hwnd, FLE_BINARY), TRUE);
836 mode = "rb";
837 fp = xfsopen(pfs->szFileName, mode, SH_DENYNO, pszSrcFile, __LINE__, TRUE);
838 if (fp) {
839 char buff[4096]; // 06 Oct 07 SHL protect against NTFS defect
840 ULONG len;
841 APIRET rc;
842
843 len = 512;
844 rc = DosRead(fileno(fp), buff, len, &len);
845 fclose(fp);
846 WinCheckButton(hwnd,
847 FLE_BINARY,
848 ((len && rc) ? IsBinary(buff, len) : 2));
849 WinCheckButton(hwnd, FLE_READABLE, TRUE);
850 info = find_type(pfs->szFileName, NULL);
851 if (info) {
852 WinCheckButton(hwnd, FLE_ISARCHIVE, 1);
853 if (info->id)
854 WinSetDlgItemText(hwnd, FLE_ARCNAME, info->id);
855 }
856 }
857 else {
858 WinCheckButton(hwnd, FLE_ISARCHIVE, 2);
859 WinCheckButton(hwnd, FLE_BINARY, 2);
860 }
861 mode = "ab";
862 fp = xfsopen(pfs->szFileName, mode, SH_DENYNO, pszSrcFile, __LINE__, TRUE);
863 if (fp) {
864 WinCheckButton(hwnd, FLE_WRITEABLE, TRUE);
865 fclose(fp);
866 }
867 mode = "rb";
868 fp = xfsopen(pfs->szFileName, mode, SH_DENYRW, pszSrcFile, __LINE__, TRUE);
869 if (!fp)
870 WinCheckButton(hwnd, FLE_OPEN, TRUE);
871 else
872 fclose(fp);
873 }
874 else {
875 WinEnableWindow(WinWindowFromID(hwnd, FLE_READABLE), FALSE);
876 WinEnableWindow(WinWindowFromID(hwnd, FLE_WRITEABLE), FALSE);
877 WinEnableWindow(WinWindowFromID(hwnd, FLE_OPEN), FALSE);
878 WinEnableWindow(WinWindowFromID(hwnd, FLE_ISARCHIVE), FALSE);
879 WinEnableWindow(WinWindowFromID(hwnd, FLE_BINARY), FALSE);
880 }
881 }
882 }
883 return 0;
884
885 case WM_COMMAND:
886 switch (SHORT1FROMMP(mp1)) {
887 case DID_OK:
888 pfs = WinQueryWindowPtr(hwnd, QWL_USER);
889 WinDismissDlg(hwnd, (pfs && pfs->madechanges) ? 2 : 1);
890 break;
891 case IDM_HELP:
892 if (hwndHelp)
893 WinSendMsg(hwndHelp,
894 HM_DISPLAY_HELP,
895 MPFROM2SHORT(HELP_INFO, 0), MPFROMSHORT(HM_RESOURCEID));
896 break;
897 case FLE_SETTINGS:
898 pfs = WinQueryWindowPtr(hwnd, QWL_USER);
899 if (pfs && *pfs->szFileName)
900 OpenObject(pfs->szFileName, Settings, hwnd);
901 break;
902 case FLE_EAS:
903 pfs = WinQueryWindowPtr(hwnd, QWL_USER);
904 if (pfs && *pfs->szFileName) {
905
906 CHAR *list[2];
907
908 list[0] = pfs->szFileName;
909 list[1] = NULL;
910 WinDlgBox(HWND_DESKTOP,
911 hwnd, DisplayEAsProc, FM3ModHandle, EA_FRAME, (PVOID) list);
912 }
913 break;
914 case DID_CANCEL:
915 pfs = WinQueryWindowPtr(hwnd, QWL_USER);
916 WinDismissDlg(hwnd, (pfs && pfs->madechanges) ? 2 : 0);
917 break;
918 }
919 return 0;
920
921 case WM_DESTROY:
922 pfs = WinQueryWindowPtr(hwnd, QWL_USER);
923 xfree(pfs, pszSrcFile, __LINE__);
924 break;
925 }
926 return WinDefDlgProc(hwnd, msg, mp1, mp2);
927}
928
929MRESULT EXPENTRY SetDrvProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
930{
931 switch (msg) {
932 case WM_INITDLG:
933 if (!mp2 || !isalpha(*(CHAR *)mp2))
934 WinDismissDlg(hwnd, 0);
935 else {
936
937 CHAR s[80];
938
939 WinSetWindowULong(hwnd, QWL_USER, (toupper(*(CHAR *)mp2) - 'A'));
940 sprintf(s, GetPString(IDS_DRIVEFLAGSTITLETEXT), toupper(*(CHAR *)mp2));
941 WinSetWindowText(hwnd, s);
942 PostMsg(hwnd, UM_UNDO, MPVOID, MPVOID);
943 }
944 break;
945
946 case UM_UNDO:
947 {
948 ULONG drive = WinQueryWindowULong(hwnd, QWL_USER);
949
950 WinCheckButton(hwnd, DVS_REMOVABLE,
951 ((driveflags[drive] & DRIVE_REMOVABLE) != 0));
952 WinCheckButton(hwnd, DVS_NOTWRITEABLE,
953 ((driveflags[drive] & DRIVE_NOTWRITEABLE) != 0));
954 WinCheckButton(hwnd, DVS_IGNORE,
955 ((driveflags[drive] & DRIVE_IGNORE) != 0));
956 WinCheckButton(hwnd, DVS_CDROM,
957 ((driveflags[drive] & DRIVE_CDROM) != 0));
958 WinCheckButton(hwnd, DVS_NOLONGNAMES,
959 ((driveflags[drive] & DRIVE_NOLONGNAMES) != 0));
960 WinCheckButton(hwnd, DVS_REMOTE,
961 ((driveflags[drive] & DRIVE_REMOTE) != 0));
962 WinCheckButton(hwnd,DVS_VIRTUAL,
963 ((driveflags[drive] & DRIVE_VIRTUAL) != 0));
964 WinCheckButton(hwnd,DVS_RAMDISK,
965 ((driveflags[drive] & DRIVE_RAMDISK) != 0));
966 WinCheckButton(hwnd, DVS_BOOT,
967 ((driveflags[drive] & DRIVE_BOOT) != 0));
968 WinCheckButton(hwnd, DVS_INVALID,
969 ((driveflags[drive] & DRIVE_INVALID) != 0));
970 WinCheckButton(hwnd, DVS_NOPRESCAN,
971 ((driveflags[drive] & DRIVE_NOPRESCAN) != 0));
972 WinCheckButton(hwnd, DVS_ZIPSTREAM,
973 ((driveflags[drive] & DRIVE_ZIPSTREAM) != 0));
974 WinCheckButton(hwnd, DVS_NOLOADICONS,
975 ((driveflags[drive] & DRIVE_NOLOADICONS) != 0));
976 WinCheckButton(hwnd, DVS_NOLOADSUBJS,
977 ((driveflags[drive] & DRIVE_NOLOADSUBJS) != 0));
978 WinCheckButton(hwnd, DVS_NOLOADLONGS,
979 ((driveflags[drive] & DRIVE_NOLOADLONGS) != 0));
980 WinCheckButton(hwnd, DVS_SLOW, ((driveflags[drive] & DRIVE_SLOW) != 0));
981 WinCheckButton(hwnd, DVS_INCLUDEFILES,
982 ((driveflags[drive] & DRIVE_INCLUDEFILES) != 0));
983 WinCheckButton(hwnd,DVS_NOSTATS,
984 ((driveflags[drive] & DRIVE_NOSTATS) != 0));
985 WinCheckButton(hwnd,DVS_WRITEVERIFYOFF,
986 ((driveflags[drive] & DRIVE_WRITEVERIFYOFF) != 0));
987 WinCheckButton(hwnd,DVS_LOCALHD,
988 ((driveflags[drive] & DRIVE_LOCALHD) != 0));
989 WinCheckButton(hwnd,DVS_NOEASUPPORT,
990 ((driveflags[drive] & DRIVE_NOEASUPPORT) != 0));
991 }
992 return 0;
993
994 case WM_CONTROL:
995 return 0;
996
997 case WM_COMMAND:
998 switch (SHORT1FROMMP(mp1)) {
999 case DID_OK:
1000 {
1001 ULONG drive = WinQueryWindowULong(hwnd, QWL_USER);
1002
1003 if (WinQueryButtonCheckstate(hwnd, DVS_NOPRESCAN))
1004 driveflags[drive] |= DRIVE_NOPRESCAN;
1005 else
1006 driveflags[drive] &= (~DRIVE_NOPRESCAN);
1007 if (WinQueryButtonCheckstate(hwnd, DVS_NOLOADICONS))
1008 driveflags[drive] |= DRIVE_NOLOADICONS;
1009 else
1010 driveflags[drive] &= (~DRIVE_NOLOADICONS);
1011 if (WinQueryButtonCheckstate(hwnd, DVS_NOLOADSUBJS))
1012 driveflags[drive] |= DRIVE_NOLOADSUBJS;
1013 else
1014 driveflags[drive] &= (~DRIVE_NOLOADSUBJS);
1015 if (WinQueryButtonCheckstate(hwnd, DVS_NOLOADLONGS))
1016 driveflags[drive] |= DRIVE_NOLOADLONGS;
1017 else
1018 driveflags[drive] &= (~DRIVE_NOLOADLONGS);
1019 if (WinQueryButtonCheckstate(hwnd, DVS_SLOW))
1020 driveflags[drive] |= DRIVE_SLOW;
1021 else
1022 driveflags[drive] &= (~DRIVE_SLOW);
1023 if (WinQueryButtonCheckstate(hwnd, DVS_INCLUDEFILES))
1024 driveflags[drive] |= DRIVE_INCLUDEFILES;
1025 else
1026 driveflags[drive] &= (~DRIVE_INCLUDEFILES);
1027 if (WinQueryButtonCheckstate(hwnd,DVS_NOSTATS))
1028 driveflags[drive] |= DRIVE_NOSTATS;
1029 else
1030 driveflags[drive] &= (~DRIVE_NOSTATS);
1031 if (WinQueryButtonCheckstate(hwnd,DVS_WRITEVERIFYOFF))
1032 driveflags[drive] |= DRIVE_WRITEVERIFYOFF;
1033 else
1034 driveflags[drive] &= (~DRIVE_WRITEVERIFYOFF);
1035 {
1036 ULONG flags;
1037 CHAR FlagKey[80];
1038
1039 sprintf(FlagKey, "%c.DriveFlags", (CHAR) (drive + 'A'));
1040 flags = driveflags[drive];
1041 flags &= (~(DRIVE_REMOVABLE | DRIVE_NOTWRITEABLE |
1042 DRIVE_IGNORE | DRIVE_CDROM |
1043 DRIVE_REMOTE | DRIVE_RSCANNED |
1044 DRIVE_BOOT | DRIVE_INVALID | DRIVE_ZIPSTREAM |
1045 DRIVE_VIRTUAL | DRIVE_RAMDISK));
1046 PrfWriteProfileData(fmprof, appname, FlagKey, &flags, sizeof(ULONG));
1047 }
1048 }
1049 WinDismissDlg(hwnd, 1);
1050 break;
1051
1052 case DID_CANCEL:
1053 WinDismissDlg(hwnd, 0);
1054 break;
1055
1056 case IDM_UNDO:
1057 PostMsg(hwnd, UM_UNDO, MPVOID, MPVOID);
1058 break;
1059
1060 case IDM_HELP:
1061 if (hwndHelp)
1062 WinSendMsg(hwndHelp,
1063 HM_DISPLAY_HELP,
1064 MPFROM2SHORT(HELP_FLAGS, 0), MPFROMSHORT(HM_RESOURCEID));
1065 break;
1066 }
1067 return 0;
1068 }
1069 return WinDefDlgProc(hwnd, msg, mp1, mp2);
1070}
1071
1072#pragma alloc_text(FMINFO,FileInfoProc,IconProc)
1073#pragma alloc_text(FMINFO2,SetDrvProc,DrvInfoProc)
Note: See TracBrowser for help on using the repository browser.