source: trunk/dll/attribs.c@ 1489

Last change on this file since 1489 was 1398, checked in by Gregg Young, 17 years ago

Move embeded strings to PCSZ variables or string table; Eliminate Error2 functions Runtime_Error with NULL format string returns "No data" error. Change declares from PSZ to PCSZ in functions where the variable isn't changed. Added btm as an executable file type in several additional places. Use fProtectOnly to prevent attempt to execute Dos and Win programs on "Protect only" installs in several additional places.

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