source: trunk/dll/info.c@ 1919

Last change on this file since 1919 was 1916, checked in by Gregg Young, 3 weeks 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
RevLine 
[36]1
2/***********************************************************************
3
4 $Id: info.c 1916 2025-11-01 18:30:47Z gyoung $
5
[576]6 Info windows
[36]7
8 Copyright (c) 1993-98 M. Kimes
[1498]9 Copyright (c) 2001, 2010 Steven H. Levine
[36]10
[131]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
[130]14 23 May 05 SHL Use QWL_USER
[162]15 25 May 05 SHL Use ULONGLONG and CommaFmtULL
[186]16 05 Jun 05 SHL Use QWL_USER
[336]17 14 Jul 06 SHL Use Runtime_Error
[575]18 24 Mar 07 SHL Correct FileInfoProc binary file detect
19 24 Mar 07 SHL Correct FileInfoProc/IconProc race crash
[618]20 19 Apr 07 SHL Sync with AcceptOneDrop GetOneDrop mods
[793]21 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
[805]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
[846]24 27 Sep 07 SHL Correct ULONGLONG size formatting
[897]25 30 Dec 07 GKY Use CommaFmtULL
[985]26 29 Feb 08 GKY Use xfree where appropriate
[1358]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.
[1391]30 11 Jan 08 GKY Add Write verify off and recures scan to drive info display when appropriate.
[1395]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
[1400]33 08 Mar 09 GKY Renamed commafmt.h i18nutil.h
[1439]34 12 Jul 09 GKY Remove code to update recursive scan setting which isn't user setable
[1444]35 22 Jul 09 GKY Check if drives support EAs add driveflag for this
36 22 Jul 09 GKY Add LocalHD driveflag
[1687]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
[1749]40 28 Apr 14 JBS Ticket #522: Ensure use of wrapper functions where needed
[1863]41 22 Aug 15 GKY Remove recurse scan code.
[36]42
43***********************************************************************/
44
[907]45#include <stdlib.h>
46#include <string.h>
47#include <ctype.h>
48#include <share.h>
49
[2]50#define INCL_DOS
51#define INCL_WIN
52#define INCL_GPI
[162]53#define INCL_LONGLONG
[2]54
[1183]55#include "fm3dll.h"
[1223]56#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
[1208]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)
[2]62#include "fm3dlg.h"
63#include "fm3str.h"
[907]64#include "makelist.h" // AddToList
65#include "errutil.h" // Dos_Error...
66#include "strutil.h" // GetPString
[1160]67#include "attribs.h" // AttrListDlgProc
68#include "defview.h" // DefaultView
69#include "info.h"
[1183]70#include "valid.h" // CheckDrive, IsBinary
[1160]71#include "seticon.h" // SetIconDlgProc
[1183]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
[1400]80#include "i18nutil.h" // CommaFmtULL
[1183]81#include "wrappers.h" // xDosFindFirst
[1039]82#include "fortify.h"
[1916]83#include "eas.h" // GetLargeEASize
[2]84
[1208]85// Data definitions
[2]86#pragma data_seg(DATA1)
[336]87static PSZ pszSrcFile = __FILE__;
88
[1208]89#pragma data_seg(GLOBAL1)
90INT driveflags[26];
91
[551]92CHAR *FlagMsg(CHAR drive, CHAR * buffer)
[336]93{
[551]94 ULONG x;
95 BOOL once = FALSE;
96 register CHAR *p;
[2]97
[551]98 if (buffer) {
[2]99 *buffer = 0;
100 p = buffer;
[551]101 if (isalpha(drive)) {
102 if (driveflags[toupper(drive) - 'A']) {
[1391]103 for (x = IDS_FLREMOVABLETEXT; x < IDS_FLRECURSESCANDONETEXT + 1; x++) {
[551]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 }
[2]121 }
122 else
[551]123 strcpy(buffer, "[None]");
[2]124 }
125 }
126 return buffer;
127}
128
[551]129MRESULT EXPENTRY DrvInfoProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[162]130{
131 CHAR *pszFileName;
[551]132 CHAR szMB[20];
133 CHAR szKB[20];
134 CHAR szUnits[20];
[336]135 APIRET rc;
[2]136
[551]137 switch (msg) {
138 case WM_INITDLG:
139 if (mp2) {
[2]140
[551]141 CHAR s[CCHMAXPATH * 2];
142 ULONG type;
[2]143
[1009]144 pszFileName = (CHAR *)mp2;
[551]145 WinSetWindowPtr(hwnd, QWL_USER, (PVOID) pszFileName);
146 WinSendDlgItemMsg(hwnd,
147 INFO_LABEL,
148 EM_SETTEXTLIMIT,
149 MPFROM2SHORT(CCHMAXPATHCOMP, 0), MPVOID);
[552]150 if (!(driveflags[toupper(*pszFileName) - 'A'] & DRIVE_NOSTATS)){
[551]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));
[552]161 }
[551]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)) {
[2]169
[551]170 CHAR FileSystem[CCHMAXPATH * 2];
[2]171
[551]172 sprintf(FileSystem,
173 GetPString(IDS_DRIVEINFOTITLETEXT), toupper(*pszFileName));
174 WinSetWindowText(hwnd, FileSystem);
[575]175 if (CheckDrive(toupper(*pszFileName), FileSystem, &type) != -1){
[2]176
[551]177 FSALLOCATE fsa;
[2]178
[552]179 if (type & (DRIVE_REMOTE | DRIVE_ZIPSTREAM | DRIVE_VIRTUAL)) {
[2]180
[551]181 CHAR Path[3], *pfsn, *pfsd;
182 ULONG Size;
183 APIRET rc;
184 PFSQBUFFER2 pfsq;
[2]185
[551]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;
[689]195 pfsn = (PCHAR)(pfsq->szName) + pfsq->cbName + 1;
[551]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 }
[2]203
[551]204 DosError(FERR_DISABLEHARDERR);
205 if (!DosQueryFSInfo(toupper(*pszFileName) - '@',
206 FSIL_ALLOC, &fsa, sizeof(FSALLOCATE))) {
[2]207
[551]208 struct
209 {
210 ULONG serial;
211 CHAR volumelength;
212 CHAR volumelabel[CCHMAXPATH];
213 }
214 volser;
[1543]215 ULONG percentfree, percentused;
[2]216
[551]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);
[575]225 WinSetDlgItemText(hwnd, INFO_SERIAL, s);
226 FlagMsg(*pszFileName, s);
[552]227 WinSetDlgItemText(hwnd, INFO_FLAGS, s);
[575]228 if (!(driveflags[toupper(*pszFileName) - 'A'] & DRIVE_NOSTATS)){
[551]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);
[162]239
[551]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, ' ');
[1402]248 sprintf(s, "%s, %s, %s %s%s",
249 szMB, szKB, szUnits,
250 GetPString(IDS_UNITTEXT), &"s"[fsa.cUnitAvail == 1L]);
[551]251 WinSetDlgItemText(hwnd, INFO_AVAILABLE, s);
252 sprintf(s,
[1402]253 GetPString(IDS_SECTORSTEXT),
254 fsa.cbSector,
255 fsa.cSectorUnit, &"s"[fsa.cSectorUnit == 1L]);
[551]256 WinSetDlgItemText(hwnd, INFO_ALLOCUNITS, s);
[552]257
[551]258 percentfree = (fsa.cUnitAvail && fsa.cUnit) ?
[1543]259 ((ULONG) fsa.cUnitAvail * 100) / (ULONG) fsa.cUnit : 0;
[551]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);
[575]278 WinSetDlgItemText(hwnd, INFO_FREEPERCENT, s);
279 }
280 else
[1498]281 WinSetDlgItemText(hwnd, INFO_AVAILABLE, (CHAR *) GetPString(IDS_STATSMEANINGLESSTEXT));
[551]282 }
283 else {
284 sprintf(FileSystem,
[1402]285 GetPString(IDS_CANTQUERYVOLTEXT),
286 toupper(*pszFileName));
[551]287 Notify(FileSystem);
288 WinDismissDlg(hwnd, 0);
289 }
290 }
291 else {
292 sprintf(FileSystem,
[1402]293 GetPString(IDS_CANTQUERYALLOCTEXT),
294 toupper(*pszFileName));
[551]295 Notify(FileSystem);
296 WinDismissDlg(hwnd, 0);
297 }
298 }
299 else {
300 FlagMsg(*pszFileName, s);
301 sprintf(FileSystem,
[1402]302 GetPString(IDS_DRIVEINACCESSIBLETEXT),
303 toupper(*pszFileName), s);
[551]304 Notify(FileSystem);
305 WinDismissDlg(hwnd, 0);
306 }
[2]307 }
[551]308 else {
309 WinDismissDlg(hwnd, 0);
310 }
311 }
312 else
313 WinDismissDlg(hwnd, 0);
314 break;
[2]315
[551]316 case WM_CONTROL:
317 return 0;
[2]318
[551]319 case WM_COMMAND:
320 switch (SHORT1FROMMP(mp1)) {
321 case DID_CANCEL:
322 WinDismissDlg(hwnd, 0);
323 break;
[2]324
[551]325 case IDM_HELP:
326 if (hwndHelp)
327 WinSendMsg(hwndHelp,
328 HM_DISPLAY_HELP,
329 MPFROM2SHORT(HELP_DRVINFO, 0), MPFROMSHORT(HM_RESOURCEID));
330 break;
[2]331
[551]332 case DID_OK:
333 pszFileName = INSTDATA(hwnd);
334 if (!(driveflags[toupper(*pszFileName) - 'A'] & DRIVE_NOTWRITEABLE)) {
[2]335
[551]336 CHAR s[CCHMAXPATHCOMP + 3];
[2]337
[551]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;
[2]349
[551]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 }
[2]368 }
[551]369 WinDismissDlg(hwnd, 1);
370 break;
371 }
372 return 0;
[2]373 }
[551]374 return WinDefDlgProc(hwnd, msg, mp1, mp2);
[2]375}
376
[575]377typedef struct {
[2]378 USHORT size;
[551]379 CHAR szFileName[CCHMAXPATH];
380 BOOL madechanges;
[575]381} FILESTUF;
[2]382
[575]383typedef struct {
384 USHORT size;
385 PFNWP oldproc;
386 FILESTUF *pfs;
387 HWND lasthwndMenu;
388} ICONSTUF;
389
[1673]390/**
[2]391 * subclass routine to allow changing a program's icon
392 */
393
[551]394MRESULT EXPENTRY IconProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[162]395{
[575]396 ICONSTUF *pis = (ICONSTUF *)WinQueryWindowPtr(hwnd, QWL_USER);
397 MRESULT mr;
398 CHAR *p;
399
[2]400 static BOOL emphasized = FALSE;
401
[575]402 if (!pis) {
[1398]403 Runtime_Error(pszSrcFile, __LINE__, NULL);
[575]404 if (msg != WM_DESTROY)
405 return WinDefWindowProc(hwnd, msg, mp1, mp2);
406 }
[2]407
[551]408 switch (msg) {
409 case DM_DRAGOVER:
410 if (!emphasized) {
411 emphasized = TRUE;
412 DrawTargetEmphasis(hwnd, emphasized);
413 }
[618]414 if (AcceptOneDrop(hwnd, mp1, mp2))
[551]415 return MRFROM2SHORT(DOR_DROP, DO_MOVE);
416 return MRFROM2SHORT(DOR_NEVERDROP, 0);
[2]417
[551]418 case DM_DRAGLEAVE:
419 emphasized = FALSE;
420 DrawTargetEmphasis(hwnd, emphasized);
421 break;
[2]422
[551]423 case DM_DROPHELP:
424 DropHelp(mp1, mp2, hwnd, GetPString(IDS_DROPCHGICONHELPTEXT));
425 return 0;
[2]426
[551]427 case DM_DROP:
428 {
429 HPOINTER hptr;
430 CHAR szFrom[CCHMAXPATH + 2];
431 ICONINFO ici;
[2]432
[551]433 emphasized = FALSE;
434 DrawTargetEmphasis(hwnd, emphasized);
[618]435 if (GetOneDrop(hwnd, mp1, mp2, szFrom, sizeof(szFrom))) {
[551]436 memset(&ici, 0, sizeof(ICONINFO));
437 ici.cb = sizeof(ICONINFO);
438 ici.fFormat = ICON_FILE;
439 ici.pszFileName = szFrom;
[575]440 if (!WinSetFileIcon((PSZ) pis->pfs->szFileName, (PICONINFO) & ici)) {
[551]441 ici.fFormat = ICON_CLEAR;
[575]442 WinSetFileIcon((PSZ) pis->pfs->szFileName, (PICONINFO) & ici);
[551]443 }
[575]444 hptr = WinLoadFileIcon(pis->pfs->szFileName, FALSE);
[551]445 if (!hptr)
[575]446 hptr = (!IsFile(pis->pfs->szFileName)) ? hptrDir : hptrFile;
447 if (pis && pis->oldproc) {
[551]448 WinShowWindow(hwnd, FALSE);
[575]449 pis->oldproc(hwnd, SM_SETHANDLE, MPFROMLONG(hptr), MPVOID);
[551]450 WinShowWindow(hwnd, TRUE);
451 WinInvalidateRect(WinQueryWindow(hwnd, QW_PARENT), NULL, TRUE);
452 }
[2]453 }
[551]454 }
455 return 0;
[2]456
[551]457 case WM_PAINT:
[575]458 mr = pis->oldproc(hwnd, msg, mp1, mp2);
459 PaintRecessedWindow(hwnd, (HPS) 0, FALSE, FALSE);
460 return mr;
[551]461 break;
[2]462
[551]463 case WM_MENUEND:
[575]464 if (pis->lasthwndMenu == (HWND)mp2)
465 WinDestroyWindow(pis->lasthwndMenu);
466 pis->lasthwndMenu = (HWND) 0;
[551]467 break;
[2]468
[551]469 case WM_CONTEXTMENU:
[575]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, '.');
[1398]475 if (!p || (stricmp(p, PCSZ_DOTICO) && stricmp(p, PCSZ_DOTPTR)))
[575]476 WinSendMsg(pis->lasthwndMenu,
477 MM_DELETEITEM,
478 MPFROM2SHORT(IDM_SELECTALL, TRUE), MPVOID);
479 PopupMenu(hwnd, hwnd, pis->lasthwndMenu);
[551]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) ?
[575]493 pis->pfs->szFileName : NULL));
[2]494 break;
[551]495 }
496 return 0;
[2]497
[551]498 case WM_DESTROY:
499 emphasized = FALSE;
[575]500 if (!pis)
501 return WinDefWindowProc(hwnd, msg, mp1, mp2);
[576]502 else {
[805]503 PFNWP oldproc = pis->oldproc;
[576]504 if (pis->lasthwndMenu)
[805]505 WinDestroyWindow(pis->lasthwndMenu);
[1039]506 free(pis);
[805]507 return oldproc(hwnd, msg, mp1, mp2);
[576]508 }
[551]509 break;
[2]510 }
511
[575]512 return pis->oldproc(hwnd, msg, mp1, mp2);
[2]513}
514
[551]515MRESULT EXPENTRY FileInfoProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[336]516{
[575]517 FILESTUF *pfs;
518 ICONSTUF *pis;
[805]519 CHAR **ppsz;
[2]520
[551]521 switch (msg) {
522 case WM_INITDLG:
523 if (!mp2) {
524 WinDismissDlg(hwnd, 1);
525 break;
526 }
[575]527 pfs = xmallocz(sizeof(FILESTUF), pszSrcFile, __LINE__);
528 if (!pfs) {
[551]529 WinDismissDlg(hwnd, 1);
530 break;
531 }
[575]532 pfs->size = sizeof(FILESTUF);
533 WinSetWindowPtr(hwnd, QWL_USER, pfs);
[551]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
[805]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]);
[551]545 WinSendDlgItemMsg(hwnd,
546 FLE_NAME,
547 LM_INSERTITEM,
548 MPFROM2SHORT(LIT_SORTASCENDING, 0), MPFROMP(s));
[2]549 }
[551]550 if (!x) {
551 WinDismissDlg(hwnd, 1);
552 break;
[2]553 }
[551]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 }
[575]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),
[551]570 IconProc);
571 break;
[2]572
[551]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:
[575]581 pfs = WinQueryWindowPtr(hwnd, QWL_USER);
582 if (pfs && *pfs->szFileName) {
[551]583
584 LISTINFO li;
[907]585 UINT numfiles = 0, numalloc = 0;
[551]586
587 memset(&li, 0, sizeof(LISTINFO));
[575]588 if (!AddToList(pfs->szFileName, &li.list, &numfiles, &numalloc)) {
[551]589 if (WinDlgBox(HWND_DESKTOP,
590 hwnd,
591 AttrListDlgProc,
592 FM3ModHandle,
593 ATR_FRAME, MPFROMP(&li)) && li.list && li.list[0]) {
[575]594 pfs->madechanges = TRUE;
[551]595 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
596 }
597 FreeList(li.list);
598 }
599 }
600 break;
[805]601 } // switch
[2]602 break;
[551]603 case FLE_NAME:
604 switch (SHORT2FROMMP(mp1)) {
605 case LN_ENTER:
606 case LN_SELECT:
[575]607 pfs = WinQueryWindowPtr(hwnd, QWL_USER);
608 if (!pfs) {
[1398]609 Runtime_Error(pszSrcFile, __LINE__, NULL);
[551]610 WinDismissDlg(hwnd, 1);
611 }
612 else {
[2]613
[551]614 SHORT sSelect;
[2]615
[551]616 sSelect = (SHORT) WinSendDlgItemMsg(hwnd,
617 FLE_NAME,
618 LM_QUERYSELECTION,
619 MPFROMSHORT(LIT_FIRST), MPVOID);
620 if (sSelect >= 0) {
[575]621 *pfs->szFileName = 0;
[551]622 WinSendDlgItemMsg(hwnd,
623 FLE_NAME,
624 LM_QUERYITEMTEXT,
625 MPFROM2SHORT(sSelect, CCHMAXPATH),
[575]626 MPFROMP(pfs->szFileName));
627 if (*pfs->szFileName) {
[551]628 if (SHORT2FROMMP(mp1) == LN_SELECT)
629 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
[1687]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);
[551]634 }
635 }
636 }
637 break;
638 }
639 break;
640 }
641 return 0;
[2]642
[551]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);
[575]667 pfs = WinQueryWindowPtr(hwnd, QWL_USER);
668 if (pfs && *pfs->szFileName) {
[551]669 CHAR s[97];
[897]670 CHAR szCmmaFmtFileSize[81], szCmmaFmtEASize[81];
[1397]671 CHAR szCmmaFmtFileEASize[81], szCmmaFmtFileEASizeK[81], szDate[DATE_BUF_BYTES];
[841]672 FILEFINDBUF4L fs;
[551]673 HDIR hdir = HDIR_CREATE;
[841]674 ULONG apptype = 1;
[551]675 FILE *fp;
676 HPOINTER hptr;
677 ARC_TYPE *info;
[1544]678 CHAR *mode;
[2]679
[551]680 DosError(FERR_DISABLEHARDERR);
[838]681 if (xDosFindFirst(pfs->szFileName,
682 &hdir,
683 FILE_NORMAL | FILE_ARCHIVED |
684 FILE_DIRECTORY | FILE_READONLY | FILE_HIDDEN |
685 FILE_SYSTEM,
[841]686 &fs, sizeof(fs), &apptype, FIL_QUERYEASIZEL)) {
[551]687 // Not found
688 SHORT sSelect, numitems;
[2]689
[1395]690 if (!fAlertBeepOff)
691 DosBeep(250, 100); // Wake up user
[551]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 }
[2]710 }
[551]711 else {
[1395]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);
[551]718 WinSetDlgItemText(hwnd, FLE_LASTWRITE, s);
719 if (fs.fdateCreation.year &&
[1395]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);
[551]726 WinSetDlgItemText(hwnd, FLE_CREATE, s);
727 }
728 if (fs.fdateLastAccess.year &&
[1395]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);
[551]735 WinSetDlgItemText(hwnd, FLE_LASTACCESS, s);
736 }
[897]737 CommaFmtULL(szCmmaFmtFileSize,
738 sizeof(szCmmaFmtFileSize), fs.cbFile, ' ');
739 CommaFmtULL(szCmmaFmtEASize,
[1916]740 sizeof(szCmmaFmtEASize), fs.cbList == 65535 ? GetLargeEASize(pfs->szFileName) : CBLIST_TO_EASIZE(fs.cbList), ' ');
[897]741 CommaFmtULL(szCmmaFmtFileEASize,
742 sizeof(szCmmaFmtFileEASize),
[1916]743 fs.cbFile + fs.cbList == 65535 ? GetLargeEASize(pfs->szFileName) : CBLIST_TO_EASIZE(fs.cbList),
[897]744 ' ');
745 CommaFmtULL(szCmmaFmtFileEASizeK,
746 sizeof(szCmmaFmtFileEASizeK),
[1916]747 fs.cbFile + fs.cbList == 65535 ? GetLargeEASize(pfs->szFileName) : CBLIST_TO_EASIZE(fs.cbList),
[897]748 'K');
[551]749 sprintf(s,
750 GetPString(IDS_SIZEINCLEASTEXT),
[897]751 szCmmaFmtFileSize,
752 szCmmaFmtEASize,
753 szCmmaFmtFileEASize,
754 szCmmaFmtFileEASizeK);
[551]755 WinSetDlgItemText(hwnd, FLE_SIZES, s);
[897]756 CommaFmtULL(szCmmaFmtFileSize,
757 sizeof(szCmmaFmtFileSize), fs.cbFileAlloc - fs.cbFile, ' ');
758 sprintf(s, "%s", szCmmaFmtFileSize);
[551]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);
[1749]769 if (!xDosQueryAppType(pfs->szFileName, &apptype)) {
[551]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 }
[575]823 hptr = WinLoadFileIcon(pfs->szFileName, FALSE);
[551]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);
[1544]836 WinEnableWindow(WinWindowFromID(hwnd, FLE_BINARY), TRUE);
837 mode = "rb";
838 fp = xfsopen(pfs->szFileName, mode, SH_DENYNO, pszSrcFile, __LINE__, TRUE);
[551]839 if (fp) {
[850]840 char buff[4096]; // 06 Oct 07 SHL protect against NTFS defect
[551]841 ULONG len;
842 APIRET rc;
[2]843
[551]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);
[575]851 info = find_type(pfs->szFileName, NULL);
[551]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);
[1544]861 }
862 mode = "ab";
863 fp = xfsopen(pfs->szFileName, mode, SH_DENYNO, pszSrcFile, __LINE__, TRUE);
[551]864 if (fp) {
865 WinCheckButton(hwnd, FLE_WRITEABLE, TRUE);
866 fclose(fp);
[1544]867 }
868 mode = "rb";
869 fp = xfsopen(pfs->szFileName, mode, SH_DENYRW, pszSrcFile, __LINE__, TRUE);
[551]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 }
[2]882 }
[551]883 }
884 return 0;
[2]885
[551]886 case WM_COMMAND:
887 switch (SHORT1FROMMP(mp1)) {
888 case DID_OK:
[575]889 pfs = WinQueryWindowPtr(hwnd, QWL_USER);
890 WinDismissDlg(hwnd, (pfs && pfs->madechanges) ? 2 : 1);
[551]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:
[575]899 pfs = WinQueryWindowPtr(hwnd, QWL_USER);
900 if (pfs && *pfs->szFileName)
901 OpenObject(pfs->szFileName, Settings, hwnd);
[551]902 break;
903 case FLE_EAS:
[575]904 pfs = WinQueryWindowPtr(hwnd, QWL_USER);
905 if (pfs && *pfs->szFileName) {
[2]906
[551]907 CHAR *list[2];
[2]908
[575]909 list[0] = pfs->szFileName;
[551]910 list[1] = NULL;
911 WinDlgBox(HWND_DESKTOP,
912 hwnd, DisplayEAsProc, FM3ModHandle, EA_FRAME, (PVOID) list);
[2]913 }
[551]914 break;
915 case DID_CANCEL:
[575]916 pfs = WinQueryWindowPtr(hwnd, QWL_USER);
917 WinDismissDlg(hwnd, (pfs && pfs->madechanges) ? 2 : 0);
[551]918 break;
919 }
920 return 0;
[2]921
[551]922 case WM_DESTROY:
[575]923 pfs = WinQueryWindowPtr(hwnd, QWL_USER);
[1009]924 xfree(pfs, pszSrcFile, __LINE__);
[551]925 break;
[2]926 }
[551]927 return WinDefDlgProc(hwnd, msg, mp1, mp2);
[2]928}
929
[551]930MRESULT EXPENTRY SetDrvProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
[336]931{
[551]932 switch (msg) {
933 case WM_INITDLG:
[1009]934 if (!mp2 || !isalpha(*(CHAR *)mp2))
[551]935 WinDismissDlg(hwnd, 0);
936 else {
[2]937
[551]938 CHAR s[80];
[2]939
[1009]940 WinSetWindowULong(hwnd, QWL_USER, (toupper(*(CHAR *)mp2) - 'A'));
941 sprintf(s, GetPString(IDS_DRIVEFLAGSTITLETEXT), toupper(*(CHAR *)mp2));
[551]942 WinSetWindowText(hwnd, s);
943 PostMsg(hwnd, UM_UNDO, MPVOID, MPVOID);
944 }
945 break;
[2]946
[551]947 case UM_UNDO:
948 {
949 ULONG drive = WinQueryWindowULong(hwnd, QWL_USER);
[2]950
[551]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));
[552]963 WinCheckButton(hwnd,DVS_VIRTUAL,
[575]964 ((driveflags[drive] & DRIVE_VIRTUAL) != 0));
[552]965 WinCheckButton(hwnd,DVS_RAMDISK,
[575]966 ((driveflags[drive] & DRIVE_RAMDISK) != 0));
[552]967 WinCheckButton(hwnd, DVS_BOOT,
[575]968 ((driveflags[drive] & DRIVE_BOOT) != 0));
[551]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));
[552]984 WinCheckButton(hwnd,DVS_NOSTATS,
[1354]985 ((driveflags[drive] & DRIVE_NOSTATS) != 0));
986 WinCheckButton(hwnd,DVS_WRITEVERIFYOFF,
987 ((driveflags[drive] & DRIVE_WRITEVERIFYOFF) != 0));
[1444]988 WinCheckButton(hwnd,DVS_LOCALHD,
989 ((driveflags[drive] & DRIVE_LOCALHD) != 0));
990 WinCheckButton(hwnd,DVS_NOEASUPPORT,
991 ((driveflags[drive] & DRIVE_NOEASUPPORT) != 0));
[551]992 }
993 return 0;
[2]994
[551]995 case WM_CONTROL:
996 return 0;
[2]997
[551]998 case WM_COMMAND:
999 switch (SHORT1FROMMP(mp1)) {
1000 case DID_OK:
1001 {
1002 ULONG drive = WinQueryWindowULong(hwnd, QWL_USER);
[2]1003
[551]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);
[575]1028 if (WinQueryButtonCheckstate(hwnd,DVS_NOSTATS))
1029 driveflags[drive] |= DRIVE_NOSTATS;
1030 else
[1354]1031 driveflags[drive] &= (~DRIVE_NOSTATS);
1032 if (WinQueryButtonCheckstate(hwnd,DVS_WRITEVERIFYOFF))
1033 driveflags[drive] |= DRIVE_WRITEVERIFYOFF;
1034 else
1035 driveflags[drive] &= (~DRIVE_WRITEVERIFYOFF);
[551]1036 {
1037 ULONG flags;
[1354]1038 CHAR FlagKey[80];
[2]1039
[1354]1040 sprintf(FlagKey, "%c.DriveFlags", (CHAR) (drive + 'A'));
[551]1041 flags = driveflags[drive];
1042 flags &= (~(DRIVE_REMOVABLE | DRIVE_NOTWRITEABLE |
1043 DRIVE_IGNORE | DRIVE_CDROM |
[1354]1044 DRIVE_REMOTE | DRIVE_RSCANNED |
[575]1045 DRIVE_BOOT | DRIVE_INVALID | DRIVE_ZIPSTREAM |
1046 DRIVE_VIRTUAL | DRIVE_RAMDISK));
[1354]1047 PrfWriteProfileData(fmprof, appname, FlagKey, &flags, sizeof(ULONG));
[551]1048 }
1049 }
1050 WinDismissDlg(hwnd, 1);
1051 break;
[2]1052
[551]1053 case DID_CANCEL:
1054 WinDismissDlg(hwnd, 0);
1055 break;
[2]1056
[551]1057 case IDM_UNDO:
1058 PostMsg(hwnd, UM_UNDO, MPVOID, MPVOID);
1059 break;
[2]1060
[551]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;
[2]1069 }
[551]1070 return WinDefDlgProc(hwnd, msg, mp1, mp2);
[2]1071}
[793]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.