source: trunk/dirsize.c@ 97

Last change on this file since 97 was 97, checked in by root, 21 years ago

Total drives >4GB better

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.8 KB
Line 
1
2/***********************************************************************
3
4 $Id: dirsize.c 97 2004-05-21 15:21:41Z root $
5
6 Directory sizes applet
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2004 Steven H.Levine
10
11 Revisions 11 Jun 02 SHL - Baseline
12 06 Jan 04 SHL - Total drives >4GB better
13
14***********************************************************************/
15
16#define INCL_DOS
17#define INCL_WIN
18
19#include <os2.h>
20#include <stdarg.h>
21#include <stdio.h>
22#include <stdlib.h>
23#include <string.h>
24#include <ctype.h>
25
26#include "dll\fm3dll.h"
27#include "dll\fm3dlg.h"
28#include "dirsize.h"
29
30
31MRESULT EXPENTRY DirMainProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
32{
33 static CHAR curdir[4];
34
35 switch(msg)
36 {
37 case WM_INITDLG:
38 *curdir = 0;
39 WinSendMsg(hwnd,UM_UNDO,MPVOID,MPVOID);
40 break;
41
42 case UM_UNDO:
43 {
44 ULONG x;
45 ULONG ulDriveMap;
46 ULONG ulDriveNum;
47 CHAR dirname[] = " :\\";
48 BOOL first = TRUE;
49
50 WinSendDlgItemMsg(hwnd,DIRSIZE_LISTBOX,LM_DELETEALL,MPVOID,MPVOID);
51
52 DosError(FERR_DISABLEHARDERR);
53 DosQCurDisk(&ulDriveNum,&ulDriveMap);
54
55 for (x = 2;x < 26;x++) {
56 if ((ulDriveMap & (1L << x)) && !(driveflags[x] & DRIVE_IGNORE)) {
57 *dirname = (CHAR)x + 'A';
58 WinSendDlgItemMsg(hwnd,DIRSIZE_LISTBOX,LM_INSERTITEM,
59 MPFROM2SHORT(LIT_END,0),MPFROMP(dirname));
60 if(first) {
61 WinSendDlgItemMsg(hwnd,DIRSIZE_LISTBOX,LM_SELECTITEM,
62 MPFROMSHORT(0),MPFROMSHORT(TRUE));
63 first = FALSE;
64 }
65 }
66 }
67 }
68 return 0;
69
70 case UM_RESCAN:
71 {
72 CHAR FileSystem[CCHMAXPATH];
73 CHAR s[CCHMAXPATH * 2];
74 FSALLOCATE fsa;
75 ULONG type;
76 USHORT percentused;
77 USHORT percentfree;
78 struct {
79 ULONG serial;
80 CHAR volumelength;
81 CHAR volumelabel[CCHMAXPATH];
82 } volser;
83 INT removable;
84
85 WinSetDlgItemText(hwnd,DIRSIZE_LABEL,"");
86 WinSetDlgItemText(hwnd,DIRSIZE_UNITSFREE,"");
87 WinSetDlgItemText(hwnd,DIRSIZE_UNITSUSED,"");
88 WinSetDlgItemText(hwnd,DIRSIZE_UNITSIZE,"");
89 WinSetDlgItemText(hwnd,DIRSIZE_PERCENT,"");
90 WinSetDlgItemText(hwnd,DIRSIZE_BYTESUSED,"");
91 WinSetDlgItemText(hwnd,DIRSIZE_BYTESFREE,"");
92 WinSetDlgItemText(hwnd,DIRSIZE_IFS,"");
93 WinSetDlgItemText(hwnd,DIRSIZE_LOCAL,"");
94 WinSendDlgItemMsg(hwnd,DIRSIZE_SLIDER,SLM_SETSLIDERINFO,
95 MPFROM2SHORT(SMA_SLIDERARMPOSITION,
96 SMA_INCREMENTVALUE),
97 MPFROMSHORT(0));
98 removable = CheckDrive(toupper(*curdir),FileSystem,&type);
99 if (removable != -1) {
100 if (type & DRIVE_ZIPSTREAM)
101 WinSetDlgItemText(hwnd,DIRSIZE_LOCAL,"Zipstream drive");
102 else if (type & DRIVE_REMOTE)
103 WinSetDlgItemText(hwnd,DIRSIZE_LOCAL,"Remote drive");
104 else {
105 sprintf(s,"Local drive%s",(removable) ? " (removable)" : "");
106 WinSetDlgItemText(hwnd,DIRSIZE_LOCAL,s);
107 }
108 sprintf(s,"IFS: %s",FileSystem);
109 WinSetDlgItemText(hwnd,DIRSIZE_IFS,s);
110 memset(&volser,0,sizeof(volser));
111 DosError(FERR_DISABLEHARDERR);
112 if (!DosQueryFSInfo(toupper(*curdir) - '@',FSIL_VOLSER,
113 &volser,(ULONG)sizeof(volser))) {
114 sprintf(s,"Label: %s",volser.volumelabel);
115 WinSetDlgItemText(hwnd,DIRSIZE_LABEL,s);
116 }
117 if (!DosQueryFSInfo(toupper(*curdir) - '@',
118 FSIL_ALLOC,&fsa,sizeof(FSALLOCATE))) {
119 percentfree = fsa.cUnit ?
120 (fsa.cUnitAvail * 100) / fsa.cUnit :
121 0;
122 if (!percentfree && fsa.cUnitAvail)
123 percentfree = 1;
124 percentused = 100 - percentfree;
125 sprintf(s,"Units free: %lu",fsa.cUnitAvail);
126 WinSetDlgItemText(hwnd,DIRSIZE_UNITSFREE,s);
127 sprintf(s,"Unit size: %lu x %u = %lu",
128 fsa.cSectorUnit,
129 fsa.cbSector,
130 fsa.cSectorUnit * fsa.cbSector);
131 WinSetDlgItemText(hwnd,DIRSIZE_UNITSIZE,s);
132 sprintf(s,"Units used: %lu",fsa.cUnit - fsa.cUnitAvail);
133 WinSetDlgItemText(hwnd,DIRSIZE_UNITSUSED,s);
134 sprintf(s,"Bytes free: %.0f",
135 (float)fsa.cUnitAvail * (fsa.cSectorUnit * fsa.cbSector));
136 WinSetDlgItemText(hwnd,DIRSIZE_BYTESFREE,s);
137 sprintf(s,"Bytes used: %.0f",
138 (float)(fsa.cUnit - fsa.cUnitAvail) *
139 (fsa.cSectorUnit * fsa.cbSector));
140 WinSetDlgItemText(hwnd,DIRSIZE_BYTESUSED,s);
141 sprintf(s,"Percent used: %u%%",percentused);
142 WinSetDlgItemText(hwnd,DIRSIZE_PERCENT,s);
143 WinSendDlgItemMsg(hwnd,DIRSIZE_SLIDER,SLM_SETSLIDERINFO,
144 MPFROM2SHORT(SMA_SLIDERARMPOSITION,
145 SMA_INCREMENTVALUE),
146 MPFROMSHORT(percentused));
147 WinShowWindow(WinWindowFromID(hwnd,DIRSIZE_SLIDER),TRUE);
148 }
149 }
150 else {
151 WinSetDlgItemText(hwnd,DIRSIZE_LOCAL,"Drive not ready.");
152 WinShowWindow(WinWindowFromID(hwnd,DIRSIZE_SLIDER),FALSE);
153 }
154 }
155 return 0;
156
157 case WM_CONTROL:
158 switch(SHORT1FROMMP(mp1)) {
159 case DIRSIZE_LISTBOX:
160 switch(SHORT2FROMMP(mp1)) {
161 case LN_ENTER:
162 WinPostMsg(hwnd,WM_COMMAND,MPFROM2SHORT(DID_OK,0),MPVOID);
163 break;
164 case LN_SELECT:
165 {
166 SHORT x;
167
168 x = (SHORT)WinSendDlgItemMsg(hwnd,DIRSIZE_LISTBOX,
169 LM_QUERYSELECTION,
170 MPFROMSHORT(LIT_FIRST),
171 MPVOID);
172 if (x >= 0) {
173 WinSendDlgItemMsg(hwnd,DIRSIZE_LISTBOX,
174 LM_QUERYITEMTEXT,
175 MPFROM2SHORT(x,sizeof(curdir)),
176 MPFROMP(curdir));
177 WinPostMsg(hwnd,UM_RESCAN,MPVOID,MPVOID);
178 }
179 }
180 break;
181 }
182 break;
183 }
184 return 0;
185
186 case WM_COMMAND:
187 switch(SHORT1FROMMP(mp1)) {
188 case DID_CANCEL:
189 WinDismissDlg(hwnd,0);
190 break;
191
192 case DID_OK:
193 if (*curdir) {
194 WinSetWindowPos(hwnd,HWND_TOP,0,0,0,0,SWP_HIDE);
195 WinDlgBox(HWND_DESKTOP,hwnd,
196 DirSizeProc,FM3ModHandle,
197 DSZ_FRAME,curdir);
198 WinSetWindowPos(hwnd,HWND_TOP,0,0,0,0,SWP_SHOW);
199 }
200 else
201 DosBeep(50,100);
202 break;
203 }
204 return 0;
205 } // switch
206 return WinDefDlgProc(hwnd,msg,mp1,mp2);
207}
208
209
210#ifdef NEVER
211
212VOID APIENTRY deinit (ULONG why)
213{
214 if (fmprof)
215 PrfCloseProfile(fmprof);
216 fmprof = (HINI)0;
217
218 flushall();
219
220 DosExitList(EXLST_REMOVE,deinit);
221}
222
223#endif
224
225
226int main (int argc,char *argv[])
227{
228 HAB hab;
229 HMQ hmq;
230 static CHAR fullname[CCHMAXPATH];
231 INT x;
232 ULONG rcl;
233
234 DosError(FERR_DISABLEHARDERR);
235 *fullname = 0;
236 for(x = 1;x < argc;x++) {
237 if (!strchr("/;,`\'",*argv[x]) &&
238 !*fullname &&
239 (IsRoot(argv[x]) ||
240 IsFile(argv[x]) == 0)) {
241 if (IsRoot(argv[x]))
242 strcpy(fullname,argv[x]);
243 else if (DosQueryPathInfo(argv[x],
244 FIL_QUERYFULLNAME,
245 fullname,
246 sizeof(fullname)))
247 *fullname = 0;
248 }
249 }
250
251# ifdef NEVER
252 DosExitList(EXLST_ADD,deinit);
253# endif
254
255 hab = WinInitialize(0);
256 if (hab) {
257 hmq = WinCreateMsgQueue(hab,384);
258 if (hmq) {
259 if (InitFM3DLL(hab,argc,argv)) {
260 if (!*fullname)
261 rcl = WinDlgBox(HWND_DESKTOP,
262 HWND_DESKTOP,
263 DirMainProc,
264 0,
265 DIRSIZE_FRAME,
266 NULL);
267 else
268 rcl = WinDlgBox(HWND_DESKTOP,
269 HWND_DESKTOP,
270 DirSizeProc,
271 FM3ModHandle,
272 DSZ_FRAME,
273 fullname);
274 if (rcl == DID_ERROR)
275 rcl = WinGetLastError(hab);
276 }
277 WinDestroyMsgQueue(hmq);
278 }
279 WinTerminate(hab);
280 }
281 return 0;
282
283} // main
284
Note: See TracBrowser for help on using the repository browser.