source: trunk/dll/info.c@ 433

Last change on this file since 433 was 336, checked in by root, 19 years ago

Use Runtime_Error

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