source: trunk/dll/info.c@ 201

Last change on this file since 201 was 186, checked in by root, 20 years ago

Use QWL_USER

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