source: trunk/dll/info.c

Last change on this file was 1916, checked in by Gregg Young, 7 days ago

Fix easize so that EAs larger than 32767 show their actual size instead of 32767

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