source: trunk/dll/info.c@ 162

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

Use ULONGLONG and CommaFmtULL

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