source: trunk/dll/attribs.c@ 1036

Last change on this file since 1036 was 907, checked in by Steven Levine, 18 years ago

Avoid out of memory traps in Compare Directories
Rework Compare Directories progress display for 2 second update rate
Start refactoring to reduce dependence on fm3dll.h
Add timer services (IsITimerExpired etc.)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 12.6 KB
Line 
1
2/***********************************************************************
3
4 $Id: attribs.c 907 2008-01-06 07:26:17Z stevenhl $
5
6 attributes editor
7
8 Copyright (c) 1993, 1998 M. Kimes
9 Copyright (c) 2006 Steven H.Levine
10
11 14 Jul 06 SHL Use Runtime_Error
12 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
13 01 Sep 07 GKY Use xDosSetPathInfo to fix case where FS3 buffer crosses 64k boundry
14
15***********************************************************************/
16
17#include <ctype.h>
18
19#define INCL_DOS
20#define INCL_WIN
21
22#include "fm3dlg.h"
23#include "fm3str.h"
24#include "makelist.h" // LISTINFO
25#include "errutil.h" // Runtime_Error
26#include "strutil.h" // GetPString
27#include "fm3dll.h"
28
29static PSZ pszSrcFile = __FILE__;
30
31MRESULT EXPENTRY AttrListDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
32{
33 LISTINFO *li;
34
35 switch (msg) {
36 case WM_INITDLG:
37 if (!mp2)
38 WinDismissDlg(hwnd, 0);
39 else {
40 WinSetWindowPtr(hwnd, QWL_USER, mp2);
41 li = (LISTINFO *) mp2;
42 if (!li->list || !li->list[0]) {
43 WinSendMsg(hwnd, WM_CLOSE, MPVOID, MPVOID);
44 break;
45 }
46 }
47 WinSendDlgItemMsg(hwnd, ATR_YEAR, SPBM_SETTEXTLIMIT, MPFROMSHORT(4L),
48 MPVOID);
49 WinSendDlgItemMsg(hwnd, ATR_MONTH, SPBM_SETTEXTLIMIT, MPFROMSHORT(2L),
50 MPVOID);
51 WinSendDlgItemMsg(hwnd, ATR_DAY, SPBM_SETTEXTLIMIT, MPFROMSHORT(2L),
52 MPVOID);
53 WinSendDlgItemMsg(hwnd, ATR_HOUR, SPBM_SETTEXTLIMIT, MPFROMSHORT(2L),
54 MPVOID);
55 WinSendDlgItemMsg(hwnd, ATR_MINUTES, SPBM_SETTEXTLIMIT, MPFROMSHORT(2L),
56 MPVOID);
57 WinSendDlgItemMsg(hwnd, ATR_SECONDS, SPBM_SETTEXTLIMIT, MPFROMSHORT(2L),
58 MPVOID);
59 WinSendDlgItemMsg(hwnd, ATR_YEAR, SPBM_OVERRIDESETLIMITS,
60 MPFROMLONG(2200L), MPFROMLONG(1980L));
61 WinSendDlgItemMsg(hwnd, ATR_MONTH, SPBM_OVERRIDESETLIMITS,
62 MPFROMLONG(12L), MPFROMLONG(1L));
63 WinSendDlgItemMsg(hwnd, ATR_DAY, SPBM_OVERRIDESETLIMITS, MPFROMLONG(31L),
64 MPFROMLONG(1L));
65 WinSendDlgItemMsg(hwnd, ATR_HOUR, SPBM_OVERRIDESETLIMITS, MPFROMLONG(23L),
66 MPFROMLONG(0L));
67 WinSendDlgItemMsg(hwnd, ATR_MINUTES, SPBM_OVERRIDESETLIMITS,
68 MPFROMLONG(59L), MPFROMLONG(0L));
69 WinSendDlgItemMsg(hwnd, ATR_SECONDS, SPBM_OVERRIDESETLIMITS,
70 MPFROMLONG(59L), MPFROMLONG(0L));
71 WinCheckButton(hwnd, ATR_USEDATETIME, FALSE);
72 {
73 INT x;
74
75 for (x = 0; li->list[x]; x++) {
76 WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_INSERTITEM,
77 MPFROM2SHORT(LIT_END, 0), MPFROMP(li->list[x]));
78 WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_SELECTITEM,
79 MPFROM2SHORT(x, 0), MPFROMSHORT(TRUE));
80 }
81 }
82 PostMsg(hwnd, UM_UNDO, MPFROMLONG(((!li->list[1]) ? 1L : 0L)), MPVOID);
83 if (li->list[1])
84 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(ATR_NOW, 0), MPVOID);
85 break;
86
87 case UM_UNDO:
88 {
89 FILESTATUS3 fi;
90 long ro = 2, hi = 2, sy = 2, ar = 2;
91 BOOL allgrey;
92
93 allgrey = ((long)WinQueryButtonCheckstate(hwnd, ATR_READONLY) == 2 &&
94 (long)WinQueryButtonCheckstate(hwnd, ATR_SYSTEM) == 2 &&
95 (long)WinQueryButtonCheckstate(hwnd, ATR_HIDDEN) == 2 &&
96 (long)WinQueryButtonCheckstate(hwnd, ATR_ARCHIVED) == 2);
97 li = INSTDATA(hwnd);
98 if (li && li->list[0] && (allgrey || mp1) &&
99 !DosQueryPathInfo(li->list[0], FIL_STANDARD, &fi,
100 (ULONG) sizeof(fi))) {
101 ro = ((fi.attrFile & FILE_READONLY) != 0);
102 hi = ((fi.attrFile & FILE_HIDDEN) != 0);
103 sy = ((fi.attrFile & FILE_SYSTEM) != 0);
104 ar = ((fi.attrFile & FILE_ARCHIVED) != 0);
105 WinSendDlgItemMsg(hwnd, ATR_YEAR, SPBM_SETCURRENTVALUE,
106 MPFROMSHORT(fi.fdateLastWrite.year + 1980), MPVOID);
107 WinSendDlgItemMsg(hwnd, ATR_MONTH, SPBM_SETCURRENTVALUE,
108 MPFROMSHORT(fi.fdateLastWrite.month), MPVOID);
109 WinSendDlgItemMsg(hwnd, ATR_DAY, SPBM_SETCURRENTVALUE,
110 MPFROMSHORT(fi.fdateLastWrite.day), MPVOID);
111 WinSendDlgItemMsg(hwnd, ATR_HOUR, SPBM_SETCURRENTVALUE,
112 MPFROMSHORT(fi.ftimeLastWrite.hours), MPVOID);
113 WinSendDlgItemMsg(hwnd, ATR_MINUTES, SPBM_SETCURRENTVALUE,
114 MPFROMSHORT(fi.ftimeLastWrite.minutes), MPVOID);
115 WinSendDlgItemMsg(hwnd, ATR_SECONDS, SPBM_SETCURRENTVALUE,
116 MPFROMSHORT(fi.ftimeLastWrite.twosecs * 2), MPVOID);
117 }
118 WinCheckButton(hwnd, ATR_READONLY, ro);
119 WinCheckButton(hwnd, ATR_HIDDEN, hi);
120 WinCheckButton(hwnd, ATR_SYSTEM, sy);
121 WinCheckButton(hwnd, ATR_ARCHIVED, ar);
122 PostMsg(hwnd, UM_CONTROL, MPFROM2SHORT(ATR_READONLY, BN_CLICKED),
123 MPVOID);
124 PostMsg(hwnd, UM_CONTROL, MPFROM2SHORT(ATR_HIDDEN, BN_CLICKED), MPVOID);
125 PostMsg(hwnd, UM_CONTROL, MPFROM2SHORT(ATR_SYSTEM, BN_CLICKED), MPVOID);
126 PostMsg(hwnd, UM_CONTROL, MPFROM2SHORT(ATR_ARCHIVED, BN_CLICKED),
127 MPVOID);
128 }
129 return 0;
130
131 case WM_ADJUSTWINDOWPOS:
132 PostMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
133 break;
134
135 case UM_SETDIR:
136 PaintRecessedWindow(WinWindowFromID(hwnd, ATR_HELP), (HPS) 0, FALSE,
137 TRUE);
138 return 0;
139
140 case WM_CONTROL:
141 switch (SHORT1FROMMP(mp1)) {
142 case ATR_LISTBOX:
143 if (SHORT2FROMMP(mp1) == LN_ENTER) {
144
145 SHORT x;
146 CHAR szBuffer[CCHMAXPATH];
147
148 x = (SHORT) WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_QUERYSELECTION,
149 MPFROMSHORT(LIT_FIRST), MPVOID);
150 if (x >= 0) {
151 *szBuffer = 0;
152 WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_QUERYITEMTEXT,
153 MPFROM2SHORT(x, CCHMAXPATH), MPFROMP(szBuffer));
154 if (*szBuffer)
155 QuickView(hwnd, szBuffer);
156 }
157 }
158 else if (SHORT2FROMMP(mp1) == LN_KILLFOCUS)
159 WinSetDlgItemText(hwnd, ATR_HELP, NullStr);
160 else if (SHORT2FROMMP(mp1) == LN_SETFOCUS)
161 WinSetDlgItemText(hwnd, ATR_HELP,
162 GetPString(IDS_ATTRLISTBOXHELPTEXT));
163 break;
164 case ATR_YEAR:
165 if (SHORT2FROMMP(mp1) == SPBN_KILLFOCUS)
166 WinSetDlgItemText(hwnd, ATR_HELP, NullStr);
167 if (SHORT2FROMMP(mp1) == SPBN_SETFOCUS)
168 WinSetDlgItemText(hwnd, ATR_HELP, GetPString(IDS_ATTRYEARHELPTEXT));
169 break;
170 case ATR_MONTH:
171 if (SHORT2FROMMP(mp1) == SPBN_KILLFOCUS)
172 WinSetDlgItemText(hwnd, ATR_HELP, NullStr);
173 if (SHORT2FROMMP(mp1) == SPBN_SETFOCUS)
174 WinSetDlgItemText(hwnd, ATR_HELP, GetPString(IDS_ATTRMONTHHELPTEXT));
175 break;
176 case ATR_DAY:
177 if (SHORT2FROMMP(mp1) == SPBN_KILLFOCUS)
178 WinSetDlgItemText(hwnd, ATR_HELP, NullStr);
179 if (SHORT2FROMMP(mp1) == SPBN_SETFOCUS)
180 WinSetDlgItemText(hwnd, ATR_HELP, GetPString(IDS_ATTRDAYHELPTEXT));
181 break;
182 case ATR_HOUR:
183 if (SHORT2FROMMP(mp1) == SPBN_KILLFOCUS)
184 WinSetDlgItemText(hwnd, ATR_HELP, NullStr);
185 if (SHORT2FROMMP(mp1) == SPBN_SETFOCUS)
186 WinSetDlgItemText(hwnd, ATR_HELP, GetPString(IDS_ATTRHOURHELPTEXT));
187 break;
188 case ATR_MINUTES:
189 if (SHORT2FROMMP(mp1) == SPBN_KILLFOCUS)
190 WinSetDlgItemText(hwnd, ATR_HELP, NullStr);
191 if (SHORT2FROMMP(mp1) == SPBN_SETFOCUS)
192 WinSetDlgItemText(hwnd, ATR_HELP, GetPString(IDS_ATTRMINHELPTEXT));
193 break;
194 case ATR_SECONDS:
195 if (SHORT2FROMMP(mp1) == SPBN_KILLFOCUS)
196 WinSetDlgItemText(hwnd, ATR_HELP, NullStr);
197 if (SHORT2FROMMP(mp1) == SPBN_SETFOCUS)
198 WinSetDlgItemText(hwnd, ATR_HELP, GetPString(IDS_ATTRSECHELPTEXT));
199 break;
200 case ATR_READONLY:
201 case ATR_SYSTEM:
202 case ATR_HIDDEN:
203 case ATR_ARCHIVED:
204 WinSendMsg(hwnd, UM_CONTROL, mp1, mp2);
205 break;
206 }
207 return 0;
208
209 case UM_CONTROL:
210 switch (SHORT1FROMMP(mp1)) {
211 case ATR_READONLY:
212 case ATR_SYSTEM:
213 case ATR_HIDDEN:
214 case ATR_ARCHIVED:
215 {
216
217 LONG check = WinQueryButtonCheckstate(hwnd, SHORT1FROMMP(mp1));
218 CHAR s[80];
219
220 sprintf(s, "%s %s",
221 (SHORT1FROMMP(mp1) == ATR_READONLY) ?
222 GetPString(IDS_ATTRREADONLYBTEXT) :
223 (SHORT1FROMMP(mp1) == ATR_SYSTEM) ?
224 GetPString(IDS_ATTRSYSTEMBTEXT) :
225 (SHORT1FROMMP(mp1) == ATR_HIDDEN) ?
226 GetPString(IDS_ATTRHIDDENBTEXT) :
227 GetPString(IDS_ATTRARCHIVEDBTEXT),
228 (check == 1) ?
229 GetPString(IDS_ONTEXT) :
230 (check == 0) ?
231 GetPString(IDS_OFFTEXT) : GetPString(IDS_UNCHANGEDTEXT));
232 WinSetDlgItemText(hwnd, SHORT1FROMMP(mp1), s);
233 }
234 break;
235 }
236 return 0;
237
238 case WM_COMMAND:
239 switch (SHORT1FROMMP(mp1)) {
240 case ATR_LEAVEALL:
241 PostMsg(hwnd, UM_UNDO, MPVOID, MPVOID);
242 break;
243
244 case ATR_NOW:
245 {
246 time_t t;
247 struct tm *tm;
248
249 t = time(NULL);
250 tm = localtime(&t);
251 WinSendDlgItemMsg(hwnd, ATR_YEAR, SPBM_SETCURRENTVALUE,
252 MPFROMSHORT(tm->tm_year + 1900), MPVOID);
253 WinSendDlgItemMsg(hwnd, ATR_MONTH, SPBM_SETCURRENTVALUE,
254 MPFROMSHORT(tm->tm_mon + 1), MPVOID);
255 WinSendDlgItemMsg(hwnd, ATR_DAY, SPBM_SETCURRENTVALUE,
256 MPFROMSHORT(tm->tm_mday), MPVOID);
257 WinSendDlgItemMsg(hwnd, ATR_HOUR, SPBM_SETCURRENTVALUE,
258 MPFROMSHORT(tm->tm_hour), MPVOID);
259 WinSendDlgItemMsg(hwnd, ATR_MINUTES, SPBM_SETCURRENTVALUE,
260 MPFROMSHORT(tm->tm_min), MPVOID);
261 WinSendDlgItemMsg(hwnd, ATR_SECONDS, SPBM_SETCURRENTVALUE,
262 MPFROMSHORT(tm->tm_sec), MPVOID);
263 }
264 break;
265
266 case DID_OK:
267 if (!WinQueryButtonCheckstate(hwnd, ATR_USEDATETIME) &&
268 WinQueryButtonCheckstate(hwnd, ATR_HIDDEN) == 2 &&
269 WinQueryButtonCheckstate(hwnd, ATR_SYSTEM) == 2 &&
270 WinQueryButtonCheckstate(hwnd, ATR_READONLY) == 2 &&
271 WinQueryButtonCheckstate(hwnd, ATR_ARCHIVED) == 2) {
272 saymsg(MB_ENTER,
273 hwnd,
274 GetPString(IDS_UHYOTEXT), GetPString(IDS_ATTRADVANTAGETEXT));
275 break;
276 }
277 {
278 ULONG temp = 0;
279 FILESTATUS3 fi;
280 SHORT x;
281 APIRET rc;
282 USHORT state;
283
284 li = INSTDATA(hwnd);
285 if (!li) {
286 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
287 break;
288 }
289 {
290 CHAR szBuffer[CCHMAXPATH + 1];
291 UINT numfiles = 0, numalloc = 0;
292 INT error;
293
294 if (li->list)
295 FreeList(li->list);
296 li->list = NULL;
297 x = (SHORT) WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_QUERYSELECTION,
298 MPFROMSHORT(LIT_FIRST), MPVOID);
299 if (x >= 0) {
300 do {
301 *szBuffer = 0;
302 WinSendDlgItemMsg(hwnd, ATR_LISTBOX, LM_QUERYITEMTEXT,
303 MPFROM2SHORT(x, CCHMAXPATH),
304 MPFROMP(szBuffer));
305 if (*szBuffer && isalpha(*szBuffer) &&
306 !(driveflags[toupper(*szBuffer) - 'A'] &
307 DRIVE_NOTWRITEABLE)) {
308 error = AddToList(szBuffer, &li->list, &numfiles, &numalloc);
309 if (error) {
310 Runtime_Error(pszSrcFile, __LINE__, "AddToList");
311 break;
312 }
313 }
314 x = (SHORT) WinSendDlgItemMsg(hwnd, ATR_LISTBOX,
315 LM_QUERYSELECTION,
316 MPFROMSHORT(x), MPVOID);
317 } while (x >= 0);
318 }
319 }
320 if (!li->list || !li->list[0]) {
321 Runtime_Error(pszSrcFile, __LINE__, "list build failed");
322 break;
323 }
324 for (x = 0; li->list[x]; x++) {
325 DosError(FERR_DISABLEHARDERR);
326 rc = DosQueryPathInfo(li->list[x], FIL_STANDARD, &fi,
327 (ULONG) sizeof(fi));
328 if (rc)
329 continue;
330 if (WinQueryButtonCheckstate(hwnd, ATR_USEDATETIME)) {
331 WinSendDlgItemMsg(hwnd, ATR_YEAR, SPBM_QUERYVALUE, MPFROMP(&temp),
332 MPFROM2SHORT(0, SPBQ_DONOTUPDATE));
333 fi.fdateLastWrite.year = temp - 1980;
334 WinSendDlgItemMsg(hwnd, ATR_MONTH, SPBM_QUERYVALUE,
335 MPFROMP(&temp), MPFROM2SHORT(0,
336 SPBQ_DONOTUPDATE));
337 fi.fdateLastWrite.month = temp;
338 WinSendDlgItemMsg(hwnd, ATR_DAY, SPBM_QUERYVALUE, MPFROMP(&temp),
339 MPFROM2SHORT(0, SPBQ_DONOTUPDATE));
340 fi.fdateLastWrite.day = temp;
341 WinSendDlgItemMsg(hwnd, ATR_HOUR, SPBM_QUERYVALUE, MPFROMP(&temp),
342 MPFROM2SHORT(0, SPBQ_DONOTUPDATE));
343 fi.ftimeLastWrite.hours = temp;
344 WinSendDlgItemMsg(hwnd, ATR_MINUTES, SPBM_QUERYVALUE,
345 MPFROMP(&temp), MPFROM2SHORT(0,
346 SPBQ_DONOTUPDATE));
347 fi.ftimeLastWrite.minutes = temp;
348 WinSendDlgItemMsg(hwnd, ATR_SECONDS, SPBM_QUERYVALUE,
349 MPFROMP(&temp), MPFROM2SHORT(0,
350 SPBQ_DONOTUPDATE));
351 fi.ftimeLastWrite.twosecs = (temp / 2L);
352 }
353 fi.attrFile &= (~FILE_DIRECTORY);
354 state = (USHORT) WinSendDlgItemMsg(hwnd, ATR_READONLY,
355 BM_QUERYCHECK, MPVOID, MPVOID);
356 if (!state)
357 fi.attrFile &= (~FILE_READONLY);
358 else if (state == 1)
359 fi.attrFile |= FILE_READONLY;
360 state = (USHORT) WinSendDlgItemMsg(hwnd, ATR_HIDDEN, BM_QUERYCHECK,
361 MPVOID, MPVOID);
362 if (!state)
363 fi.attrFile &= (~FILE_HIDDEN);
364 else if (state == 1)
365 fi.attrFile |= FILE_HIDDEN;
366 state = (USHORT) WinSendDlgItemMsg(hwnd, ATR_SYSTEM, BM_QUERYCHECK,
367 MPVOID, MPVOID);
368 if (!state)
369 fi.attrFile &= (~FILE_SYSTEM);
370 else if (state == 1)
371 fi.attrFile |= FILE_SYSTEM;
372 state = (USHORT) WinSendDlgItemMsg(hwnd, ATR_ARCHIVED,
373 BM_QUERYCHECK, MPVOID, MPVOID);
374 if (!state)
375 fi.attrFile &= (~FILE_ARCHIVED);
376 else if (state == 1)
377 fi.attrFile |= FILE_ARCHIVED;
378 xDosSetPathInfo(li->list[x], FIL_STANDARD, &fi, sizeof(fi), 0);
379 }
380 WinDismissDlg(hwnd, 1);
381 }
382 break;
383
384 case IDM_HELP:
385 if (hwndHelp)
386 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
387 MPFROM2SHORT(HELP_ATTRIBSLIST, 0),
388 MPFROMSHORT(HM_RESOURCEID));
389 break;
390
391 case DID_CANCEL:
392 WinDismissDlg(hwnd, 0);
393 break;
394 }
395 return 0;
396 }
397 return WinDefDlgProc(hwnd, msg, mp1, mp2);
398}
399
400#pragma alloc_text(ATTRIBS,AttrListDlgProc)
Note: See TracBrowser for help on using the repository browser.