source: trunk/dll/info.c@ 1039

Last change on this file since 1039 was 1039, checked in by Gregg Young, 17 years ago

Removed unnecessary xfrees and included fortify.h where needed; moved several misplaced (x)frees;

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