source: trunk/dll/eas.c@ 1395

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

Allow user to turn off alert and/or error beeps in settings notebook. Ticket 341 Move repeated strings to PCSZs. Ticket 6 Add *DateFormat functions to format dates based on locale Ticket 28 Eliminate Win_Error2 by moving function names to PCSZs used in Win_Error Ticket 6

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 47.9 KB
Line 
1
2/***********************************************************************
3
4 $Id: eas.c 1395 2009-02-08 01:48:16Z gyoung $
5
6 Display/edit EAs
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2004, 2008 Steven H. Levine
10
11 01 Aug 04 SHL Rework lstrip/rstrip usage
12 06 Jun 05 SHL Indent -i2
13 06 Jun 05 SHL Rework DisplayEAsProc for VAC3.65 compat
14 06 Jun 05 SHL Drop unused variables
15 17 Jul 06 SHL Use Runtime_Error
16 22 Mar 07 GKY Use QWL_USER
17 05 Jul 07 SHL GetFileEAs: avoid heap corruption
18 15 Jul 07 GKY Allow subject edit of up to 256 chars
19 03 Aug 07 GKY Remove surrious error message
20 06 Aug 07 GKY Increase Subject EA to 1024
21 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
22 01 Sep 07 GKY Use xDosSetPathInfo to fix case where FS3 buffer crosses 64k boundry
23 29 Feb 08 GKY Use xfree where appropriate
24 07 Feb 09 GKY Allow user to turn off alert and/or error beeps in settings notebook.
25
26***********************************************************************/
27
28#include <stdlib.h>
29#include <stdio.h>
30#include <string.h>
31#include <ctype.h>
32
33#define INCL_WIN
34#define INCL_DOS
35#define INCL_DOSERRORS
36#define INCL_LONGLONG
37
38#include "fm3dll.h"
39#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
40#include "notebook.h" // Data declaration(s)
41#include "info.h" // Data declaration(s)
42#include "init.h" // Data declaration(s)
43#include "mainwnd.h" // Data declaration(s)
44#include "newview.h" // Data declarations
45#include "fm3dlg.h"
46#include "fm3str.h"
47#include "mle.h"
48#include "errutil.h" // Dos_Error...
49#include "strutil.h" // GetPString
50#include "defview.h" // QuickView
51#include "subj.h" // Subject
52#include "wrappers.h" // xDosSetPathInfo
53#include "eas.h"
54#include "strips.h" // bstrip
55#include "valid.h" // IsFile
56#include "misc.h" // PaintRecessedWindow
57#include "fortify.h"
58
59#pragma data_seg(DATA1)
60
61static PSZ pszSrcFile = __FILE__;
62
63static PVOID SaveEA(CHAR * filename, HOLDFEA * current, CHAR * newdata,
64 BOOL silentfail);
65
66typedef struct
67{
68 CHAR *name;
69 INT type;
70}
71RESERVEDEAS;
72
73typedef struct
74{
75 CHAR *filename;
76 HOLDFEA *head;
77}
78ADDEA;
79
80HOLDFEA *CheckEA(HOLDFEA * head, CHAR * eaname)
81{
82 /* return pointer to ea named eaname if found in linked list */
83
84 register HOLDFEA *info = NULL;
85
86 if (eaname && *eaname) {
87 info = head;
88 while (info) {
89 if (!strcmp(info->name, eaname))
90 return info;
91 info = info->next;
92 }
93 }
94 return info;
95}
96
97MRESULT EXPENTRY AddEAProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
98{
99 ADDEA *add;
100 HOLDFEA *head;
101 CHAR *filename;
102 static CHAR *forbidden[] = { ".ASSOCTABLE",
103 ".CLASSINFO",
104 ".ICON",
105 ".CODEPAGE",
106 ""
107 };
108 static RESERVEDEAS restypes[] = { ".TYPE", EAT_MVMT,
109 ".SUBJECT", EAT_ASCII,
110 ".COMMENTS", EAT_MVMT,
111 ".KEYPHRASES", EAT_MVMT,
112 ".HISTORY", EAT_MVMT,
113 ".LONGNAME", EAT_ASCII,
114 ".VERSION", EAT_ASCII,
115 "", 0
116 };
117
118 switch (msg) {
119 case WM_INITDLG:
120 if (!mp2) {
121 WinDismissDlg(hwnd, 0);
122 break;
123 }
124 WinSetWindowPtr(hwnd, QWL_USER, (PVOID) mp2);
125 WinSendDlgItemMsg(hwnd, EAC_NAME, EM_SETTEXTLIMIT,
126 MPFROM2SHORT(1024, 0), MPVOID);
127 WinCheckButton(hwnd, EAC_ASCII, TRUE);
128 break;
129
130 case WM_PAINT:
131 PostMsg(hwnd, UM_PAINT, MPVOID, MPVOID);
132 break;
133
134 case UM_PAINT:
135 PaintRecessedWindow(WinWindowFromID(hwnd, EAC_TEXT), (HPS) 0, FALSE,
136 FALSE);
137 return 0;
138
139 case WM_CONTROL:
140 return 0;
141
142 case WM_COMMAND:
143 switch (SHORT1FROMMP(mp1)) {
144 case DID_OK:
145 add = INSTDATA(hwnd);
146 head = add->head;
147 filename = add->filename;
148 {
149 CHAR s[1025];
150 INT x;
151 USHORT type = EAT_ASCII;
152
153 *s = 0;
154 WinQueryDlgItemText(hwnd, EAC_NAME, 1024, s);
155 bstrip(s);
156 if (!*s)
157 WinDismissDlg(hwnd, 0);
158 else {
159 if (CheckEA(head, s)) {
160 if (!fAlertBeepOff)
161 DosBeep(50, 100);
162 WinSetDlgItemText(hwnd, EAC_TEXT,
163 GetPString(IDS_EANAMEEXISTSTEXT));
164 break;
165 }
166 for (x = 0; *forbidden[x]; x++) {
167 if (!strcmp(forbidden[x], s)) {
168 if (!fAlertBeepOff)
169 DosBeep(50, 100);
170 WinSetDlgItemText(hwnd, EAC_TEXT,
171 GetPString(IDS_EANAMERESERVEDTEXT));
172 return 0;
173 }
174 }
175 if (WinQueryButtonCheckstate(hwnd, EAC_MVST))
176 type = EAT_MVST;
177 else if (WinQueryButtonCheckstate(hwnd, EAC_MVMT))
178 type = EAT_MVMT;
179 for (x = 0; *restypes[x].name; x++) {
180 if (!strcmp(restypes[x].name, s)) {
181 if (type != restypes[x].type) {
182 if (!fAlertBeepOff)
183 DosBeep(50, 100);
184 WinSetDlgItemText(hwnd, EAC_TEXT,
185 GetPString(IDS_EAWRONGTYPETEXT));
186 return 0;
187 }
188 break;
189 }
190 }
191 /* if we get here, create dummy ea */
192 {
193 PFEA2LIST pfealist = NULL;
194 EAOP2 eaop;
195 ULONG ealen;
196 CHAR *eaval;
197 APIRET rc;
198
199 ealen = sizeof(FEA2LIST) + strlen(s) + 64;
200 rc = DosAllocMem((PPVOID) & pfealist, ealen + 1,
201 OBJ_TILE | PAG_COMMIT | PAG_READ | PAG_WRITE);
202 if (rc)
203 Dos_Error(MB_CANCEL, rc, HWND_DESKTOP, pszSrcFile, __LINE__,
204 GetPString(IDS_OUTOFMEMORY));
205 else {
206 memset(pfealist, 0, ealen + 1);
207 pfealist->cbList = ealen;
208 pfealist->list[0].oNextEntryOffset = 0;
209 pfealist->list[0].fEA = 0;
210 pfealist->list[0].cbName = strlen(s);
211 strcpy(pfealist->list[0].szName, s);
212 eaval = pfealist->list[0].szName + strlen(s) + 1;
213 *(USHORT *) eaval = (USHORT) type;
214 eaval += sizeof(USHORT);
215 if (type == EAT_MVST || type == EAT_MVMT) {
216 *(USHORT *) eaval = (USHORT) 0; /* codepage */
217 eaval += sizeof(USHORT);
218 *(USHORT *) eaval = (USHORT) 1; /* number */
219 eaval += sizeof(USHORT);
220 *(USHORT *) eaval = (USHORT) EAT_ASCII; /* type */
221 eaval += sizeof(USHORT);
222 }
223 *(USHORT *) eaval = (USHORT) 4;
224 eaval += sizeof(USHORT);
225 memcpy(eaval, GetPString(IDS_FAKETEXT), 4);
226 pfealist->list[0].cbValue = 4 + (sizeof(USHORT) * 2) +
227 ((type == EAT_MVST ||
228 type == EAT_MVMT) ? sizeof(USHORT) * 3 : 0);
229 eaop.fpGEA2List = (PGEA2LIST) 0;
230 eaop.fpFEA2List = pfealist;
231 eaop.oError = 0;
232 xDosSetPathInfo(filename, FIL_QUERYEASIZE,
233 &eaop, sizeof(eaop), DSPI_WRTTHRU);
234 WinDismissDlg(hwnd, 1);
235 }
236 }
237 }
238 }
239 break;
240
241 case DID_CANCEL:
242 WinDismissDlg(hwnd, 0);
243 break;
244
245 case IDM_HELP:
246 if (hwndHelp)
247 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
248 MPFROM2SHORT(HELP_ADDEA, 0), MPFROMSHORT(HM_RESOURCEID));
249 break;
250 }
251 return 0;
252 }
253 return WinDefDlgProc(hwnd, msg, mp1, mp2);
254}
255
256static VOID HexDumpEA(HWND hwnd, HOLDFEA * info)
257{
258 if (info)
259 HexDump(WinWindowFromID(hwnd, EA_HEXDUMP), info->value, info->cbValue);
260}
261
262VOID HexDump(HWND hwnd, CHAR * value, ULONG cbValue)
263{
264 /* display a hexdump of a binary 'string' in listbox hwnd */
265
266 CHAR s[132];
267 register CHAR *p, *pp, *a;
268 register ULONG x = 0, y, z;
269
270 WinSendMsg(hwnd, LM_DELETEALL, MPVOID, MPVOID);
271 if (cbValue) {
272 pp = p = value;
273 while (x < cbValue) {
274 y = x;
275 sprintf(s, "%04lx ", x);
276 a = s + 6;
277 do {
278 sprintf(a, "%02x ", (UCHAR)*p);
279 a += 3;
280 p++;
281 x++;
282 }
283 while (x < cbValue && (x % 16));
284 if (x % 16) {
285 z = x;
286 while (z % 16) {
287 *a++ = ' ';
288 *a++ = ' ';
289 *a++ = ' ';
290 z++;
291 }
292 }
293 *a++ = ' ';
294 p = pp;
295 do {
296 if (*p)
297 *a++ = *p++;
298 else {
299 *a++ = '.';
300 p++;
301 }
302 *a = 0;
303 y++;
304 }
305 while (y < x);
306 if ((SHORT) WinSendMsg(hwnd, LM_INSERTITEM, MPFROM2SHORT(LIT_END, 0),
307 MPFROMP(s)) < 0)
308 break;
309 pp = p;
310 }
311 }
312}
313
314typedef struct
315{
316 USHORT size;
317 USHORT flags;
318 HOLDFEA *head, *current;
319 CHAR **list;
320 CHAR filename[CCHMAXPATH];
321}
322EAPROCDATA;
323
324MRESULT EXPENTRY DisplayEAsProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
325{
326 EAPROCDATA *eap;
327 HOLDFEA *info;
328 static HPOINTER hptrIcon = (HPOINTER) 0;
329
330 if (msg != WM_INITDLG)
331 eap = (EAPROCDATA *) WinQueryWindowPtr(hwnd, QWL_USER);
332
333 switch (msg) {
334 case WM_INITDLG:
335 if (!mp2) {
336 WinDismissDlg(hwnd, 0);
337 break;
338 }
339 eap = xmallocz(sizeof(EAPROCDATA), pszSrcFile, __LINE__);
340 if (!eap) {
341 WinDismissDlg(hwnd, 0);
342 break;
343 }
344 hptrIcon = WinLoadPointer(HWND_DESKTOP, FM3ModHandle, EA_FRAME);
345 WinDefDlgProc(hwnd, WM_SETICON, MPFROMLONG(hptrIcon), MPVOID);
346 eap->size = sizeof(EAPROCDATA);
347 eap->list = (CHAR **) mp2;
348 WinSetWindowPtr(hwnd, QWL_USER, (PVOID) eap);
349 WinSendDlgItemMsg(hwnd,
350 EA_ENTRY, EM_SETTEXTLIMIT, MPFROM2SHORT(40, 0), MPVOID);
351 MLEsetlimit(WinWindowFromID(hwnd, EA_MLE), 32767);
352 MLEsetformat(WinWindowFromID(hwnd, EA_MLE), MLFIE_NOTRANS);
353 {
354 INT x;
355 SHORT sSelect;
356 CHAR s[CCHMAXPATH];
357
358 for (x = 0; eap->list[x]; x++) {
359 if (DosQueryPathInfo(eap->list[x], FIL_QUERYFULLNAME, s, sizeof(s)))
360 strcpy(s, eap->list[x]);
361 if (IsFile(s) != -1)
362 WinSendDlgItemMsg(hwnd,
363 EA_NAMES,
364 LM_INSERTITEM,
365 MPFROM2SHORT(LIT_SORTASCENDING, 0), MPFROMP(s));
366 }
367 sSelect = (SHORT) WinSendDlgItemMsg(hwnd,
368 EA_NAMES,
369 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
370 if (sSelect > 0)
371 WinSendDlgItemMsg(hwnd,
372 EA_NAMES,
373 LM_SELECTITEM,
374 MPFROM2SHORT(0, 0), MPFROMSHORT(TRUE));
375 else
376 WinDismissDlg(hwnd, 0);
377 }
378 break;
379
380 case UM_SETDIR:
381 if (*eap->filename) {
382 if (eap->head)
383 Free_FEAList(eap->head);
384 eap->head = GetFileEAs(eap->filename, FALSE, FALSE);
385 if (!isalpha(*eap->filename) ||
386 (driveflags[toupper(*eap->filename) - 'A'] & DRIVE_NOTWRITEABLE)) {
387 WinEnableWindow(WinWindowFromID(hwnd, EA_CHANGE), FALSE);
388 WinEnableWindow(WinWindowFromID(hwnd, EA_ADD), FALSE);
389 WinEnableWindow(WinWindowFromID(hwnd, EA_DELETE), FALSE);
390 }
391 else {
392 WinEnableWindow(WinWindowFromID(hwnd, EA_CHANGE), TRUE);
393 WinEnableWindow(WinWindowFromID(hwnd, EA_ADD), TRUE);
394 WinEnableWindow(WinWindowFromID(hwnd, EA_DELETE), TRUE);
395 }
396 WinSendMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
397 }
398 break;
399
400 case UM_SETUP:
401 WinSendDlgItemMsg(hwnd, EA_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
402 WinShowWindow(WinWindowFromID(hwnd, EA_ENTRY), FALSE);
403 WinSetDlgItemText(hwnd, EA_ENTRY, NullStr);
404 WinShowWindow(WinWindowFromID(hwnd, EA_MLE), FALSE);
405 MLEclearall(WinWindowFromID(hwnd, EA_MLE));
406 WinShowWindow(WinWindowFromID(hwnd, EA_HEXDUMP), FALSE);
407 WinSendDlgItemMsg(hwnd, EA_HEXDUMP, LM_DELETEALL, MPVOID, MPVOID);
408 WinShowWindow(WinWindowFromID(hwnd, EA_CHANGE), FALSE);
409 WinShowWindow(WinWindowFromID(hwnd, EA_DELETE), FALSE);
410 eap->current = NULL;
411 if (eap->head) {
412 WinSetDlgItemText(hwnd, EA_TEXT, NullStr);
413 info = eap->head;
414 while (info) {
415 WinSendDlgItemMsg(hwnd, EA_LISTBOX, LM_INSERTITEM,
416 MPFROM2SHORT(LIT_END, 0), MPFROMP(info->name));
417 info = info->next;
418 }
419 WinSendDlgItemMsg(hwnd, EA_LISTBOX, LM_SELECTITEM,
420 MPFROM2SHORT(0, 0), MPFROM2SHORT(TRUE, 0));
421 }
422 else
423 WinSetDlgItemText(hwnd, EA_TEXT, GetPString(IDS_EANOEAS));
424 return 0;
425
426 case WM_PAINT:
427 PostMsg(hwnd, UM_PAINT, MPVOID, MPVOID);
428 break;
429
430 case UM_PAINT:
431 PaintRecessedWindow(WinWindowFromID(hwnd, EA_HELP), (HPS) 0, FALSE, TRUE);
432 PaintRecessedWindow(WinWindowFromID(hwnd, EA_TEXT), (HPS) 0, FALSE,
433 FALSE);
434 return 0;
435
436 case WM_CONTROL:
437 switch (SHORT1FROMMP(mp1)) {
438 case EA_NAMES:
439 switch (SHORT2FROMMP(mp1)) {
440 case LN_SETFOCUS:
441 WinSetDlgItemText(hwnd, EA_HELP, GetPString(IDS_EAFILENAMESHELPTEXT));
442 break;
443 case LN_KILLFOCUS:
444 WinSetDlgItemText(hwnd, EA_HELP, NullStr);
445 break;
446 case LN_ENTER:
447 case LN_SELECT:
448 {
449 CHAR s[1025];
450 SHORT sSelect;
451
452 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, EA_NAMES,
453 LM_QUERYSELECTION,
454 MPFROM2SHORT(LIT_FIRST, 0),
455 MPVOID);
456 if (sSelect >= 0) {
457 *s = 0;
458 WinSendDlgItemMsg(hwnd, EA_NAMES, LM_QUERYITEMTEXT,
459 MPFROM2SHORT(sSelect, 1024), MPFROMP(s));
460 if (*s) {
461 strcpy(eap->filename, s);
462 if (SHORT2FROMMP(mp1) == LN_SELECT)
463 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
464 else
465 QuickView(hwnd, eap->filename);
466 }
467 }
468 }
469 break;
470 }
471 break;
472
473 case EA_LISTBOX:
474 switch (SHORT2FROMMP(mp1)) {
475 case LN_SETFOCUS:
476 WinSetDlgItemText(hwnd, EA_HELP, GetPString(IDS_EATYPESHELPTEXT));
477 break;
478 case LN_KILLFOCUS:
479 WinSetDlgItemText(hwnd, EA_HELP, NullStr);
480 break;
481 case LN_SELECT:
482 {
483 CHAR s[1024];
484 SHORT sSelect;
485
486 eap->current = NULL;
487 if (eap->head) {
488 WinSetDlgItemText(hwnd, EA_TEXT, NullStr);
489 WinShowWindow(WinWindowFromID(hwnd, EA_ENTRY), FALSE);
490 WinSetDlgItemText(hwnd, EA_ENTRY, NullStr);
491 MLEclearall(WinWindowFromID(hwnd, EA_MLE));
492 WinShowWindow(WinWindowFromID(hwnd, EA_MLE), FALSE);
493 WinShowWindow(WinWindowFromID(hwnd, EA_CHANGE), FALSE);
494 WinShowWindow(WinWindowFromID(hwnd, EA_DELETE), FALSE);
495 WinShowWindow(WinWindowFromID(hwnd, EA_HEXDUMP), FALSE);
496 WinSendDlgItemMsg(hwnd, EA_HEXDUMP, LM_DELETEALL, MPVOID, MPVOID);
497 *s = 0;
498 sSelect = (USHORT) WinSendDlgItemMsg(hwnd, EA_LISTBOX,
499 LM_QUERYSELECTION,
500 MPFROMSHORT(LIT_FIRST),
501 MPVOID);
502 if (sSelect >= 0) {
503 WinSendDlgItemMsg(hwnd, EA_LISTBOX, LM_QUERYITEMTEXT,
504 MPFROM2SHORT(sSelect, 1024), MPFROMP(s));
505 if (*s) {
506
507 USHORT len, num, type;
508 CHAR *data;
509 CHAR last = '\n';
510 const CHAR *linefeed = "\n";
511 BOOL alltext;
512 IPT pos = 0;
513
514 info = eap->head;
515 while (info) {
516 if (!strcmp(s, info->name)) {
517 eap->current = info;
518 WinShowWindow(WinWindowFromID(hwnd, EA_DELETE), TRUE);
519 switch (*(USHORT *) info->value) {
520 case EAT_EA:
521 case EAT_ASCII:
522 if (!strcmp(info->name, SUBJECT))
523 WinSendDlgItemMsg(hwnd, EA_ENTRY,
524 EM_SETTEXTLIMIT,
525 MPFROM2SHORT(1024, 0), MPVOID);
526 else
527 WinSendDlgItemMsg(hwnd, EA_ENTRY,
528 EM_SETTEXTLIMIT,
529 MPFROM2SHORT(1024, 0), MPVOID);
530 WinSetDlgItemText(hwnd, EA_ENTRY,
531 info->value + (sizeof(USHORT) * 2));
532 WinShowWindow(WinWindowFromID(hwnd, EA_ENTRY), TRUE);
533 WinEnableWindow(WinWindowFromID(hwnd, EA_CHANGE),
534 FALSE);
535 WinShowWindow(WinWindowFromID(hwnd, EA_CHANGE), TRUE);
536 {
537 CHAR str[81];
538
539 sprintf(str,
540 GetPString(IDS_DATAANDBYTESTEXT),
541 (*(USHORT *) info->value == EAT_ASCII) ?
542 GetPString(IDS_TEXTTEXT) :
543 GetPString(IDS_EAREFTEXT), info->cbValue);
544 WinSetDlgItemText(hwnd, EA_TEXT, str);
545 }
546 break;
547 case EAT_MVST:
548 MLEclearall(WinWindowFromID(hwnd, EA_MLE));
549 num = *(USHORT *) (info->value + (sizeof(USHORT) * 2));
550 type = *(USHORT *) (info->value + (sizeof(USHORT) * 3));
551 if (type == EAT_ASCII) {
552 data = info->value + (sizeof(USHORT) * 4);
553 len = *(USHORT *) data;
554 data += sizeof(USHORT);
555 while ((data - info->value) + len <= info->cbValue) {
556 if (last != '\n') {
557 WinSendDlgItemMsg(hwnd,
558 EA_MLE,
559 MLM_SETIMPORTEXPORT,
560 MPFROMP(linefeed),
561 MPFROMLONG(1));
562 WinSendDlgItemMsg(hwnd,
563 EA_MLE,
564 MLM_IMPORT,
565 MPFROMP(&pos), MPFROMLONG(1));
566 }
567 WinSendDlgItemMsg(hwnd,
568 EA_MLE,
569 MLM_SETIMPORTEXPORT,
570 MPFROMP(data),
571 MPFROMLONG((ULONG) len));
572 WinSendDlgItemMsg(hwnd,
573 EA_MLE,
574 MLM_IMPORT,
575 MPFROMP(&pos),
576 MPFROMLONG((ULONG) len));
577 data += len;
578 last = *(data - 1);
579 if (data - info->value >= info->cbValue)
580 break;
581 len = *(USHORT *) data;
582 data += sizeof(USHORT);
583 }
584 WinShowWindow(WinWindowFromID(hwnd, EA_MLE), TRUE);
585 WinEnableWindow(WinWindowFromID(hwnd, EA_CHANGE),
586 FALSE);
587 WinShowWindow(WinWindowFromID(hwnd, EA_CHANGE), TRUE);
588 }
589 else {
590 WinShowWindow(WinWindowFromID(hwnd, EA_MLE), FALSE);
591 HexDumpEA(hwnd, info);
592 WinShowWindow(WinWindowFromID(hwnd, EA_HEXDUMP),
593 TRUE);
594 }
595 {
596 CHAR str[81];
597
598 sprintf(str,
599 GetPString(IDS_MVSTTEXT),
600 num,
601 (num == 1) ?
602 GetPString(IDS_YTEXT) :
603 GetPString(IDS_IESTEXT), info->cbValue);
604 WinSetDlgItemText(hwnd, EA_TEXT, str);
605 }
606 break;
607 case EAT_MVMT:
608 MLEclearall(WinWindowFromID(hwnd, EA_MLE));
609 num = *(USHORT *) (info->value + (sizeof(USHORT) * 2));
610 data = info->value + (sizeof(USHORT) * 3);
611 type = *(USHORT *) data;
612 data += sizeof(USHORT);
613 len = *(USHORT *) data;
614 data += sizeof(USHORT);
615 alltext = TRUE;
616 while ((data - info->value) - len <= info->cbValue) {
617 if (type != EAT_ASCII) {
618 alltext = FALSE;
619 break;
620 }
621 data += len;
622 if (data - info->value >= info->cbValue)
623 break;
624 type = *(USHORT *) data;
625 data += sizeof(USHORT);
626 len = *(USHORT *) data;
627 data += sizeof(USHORT);
628 }
629 if (alltext) {
630 data = info->value + (sizeof(USHORT) * 3);
631 type = *(USHORT *) data;
632 data += sizeof(USHORT);
633 len = *(USHORT *) data;
634 data += sizeof(USHORT);
635 while ((data - info->value) - len <= info->cbValue) {
636 if (last != '\n') {
637 WinSendDlgItemMsg(hwnd,
638 EA_MLE,
639 MLM_SETIMPORTEXPORT,
640 MPFROMP(linefeed),
641 MPFROMLONG(1));
642 WinSendDlgItemMsg(hwnd,
643 EA_MLE,
644 MLM_IMPORT,
645 MPFROMP(&pos), MPFROMLONG(1));
646 }
647 WinSendDlgItemMsg(hwnd,
648 EA_MLE,
649 MLM_SETIMPORTEXPORT,
650 MPFROMP(data),
651 MPFROMLONG((ULONG) len));
652 WinSendDlgItemMsg(hwnd,
653 EA_MLE,
654 MLM_IMPORT,
655 MPFROMP(&pos),
656 MPFROMLONG((ULONG) len));
657 data += len;
658 last = *(data - 1);
659 if (data - info->value >= info->cbValue)
660 break;
661 type = *(USHORT *) data;
662 data += sizeof(USHORT);
663 len = *(USHORT *) data;
664 data += sizeof(USHORT);
665 }
666 }
667 if (alltext) {
668 WinShowWindow(WinWindowFromID(hwnd, EA_MLE), TRUE);
669 WinEnableWindow(WinWindowFromID(hwnd,
670 EA_CHANGE), FALSE);
671 WinShowWindow(WinWindowFromID(hwnd, EA_CHANGE), TRUE);
672 }
673 else {
674 WinShowWindow(WinWindowFromID(hwnd, EA_MLE), FALSE);
675 HexDumpEA(hwnd, info);
676 WinShowWindow(WinWindowFromID(hwnd, EA_HEXDUMP),
677 TRUE);
678 }
679 {
680 CHAR str[81];
681
682 sprintf(str,
683 GetPString(IDS_MVMTTEXT),
684 num,
685 (num == 1) ?
686 GetPString(IDS_YTEXT) :
687 GetPString(IDS_IESTEXT),
688 info->cbValue,
689 (alltext) ?
690 GetPString(IDS_ALLTEXTTEXT) :
691 GetPString(IDS_MIXEDTYPESTEXT));
692 WinSetDlgItemText(hwnd, EA_TEXT, str);
693 }
694 break;
695 default:
696 HexDumpEA(hwnd, info);
697 WinShowWindow(WinWindowFromID(hwnd, EA_HEXDUMP), TRUE);
698 switch (*(USHORT *) info->value) {
699 case EAT_BINARY:
700 {
701 CHAR str[81];
702
703 sprintf(str,
704 GetPString(IDS_BINARYBYTESTEXT),
705 info->cbValue);
706 WinSetDlgItemText(hwnd, EA_TEXT, str);
707 }
708 break;
709 case EAT_BITMAP:
710 {
711 CHAR str[81];
712
713 sprintf(str,
714 GetPString(IDS_BITMAPBYTESTEXT),
715 info->cbValue);
716 WinSetDlgItemText(hwnd, EA_TEXT, str);
717 }
718 break;
719 case EAT_METAFILE:
720 {
721 CHAR str[81];
722
723 sprintf(str,
724 GetPString(IDS_METAFILEBYTESTEXT),
725 info->cbValue);
726 WinSetDlgItemText(hwnd, EA_TEXT, str);
727 }
728 break;
729 case EAT_ICON:
730 {
731 CHAR str[81];
732
733 sprintf(str,
734 GetPString(IDS_ICONBYTESTEXT),
735 info->cbValue);
736 WinSetDlgItemText(hwnd, EA_TEXT, str);
737 }
738 break;
739 case EAT_ASN1:
740 {
741 CHAR str[81];
742
743 sprintf(str,
744 GetPString(IDS_ASN1BYTESTEXT),
745 info->cbValue);
746 WinSetDlgItemText(hwnd, EA_TEXT, str);
747 }
748 break;
749 default:
750 {
751 CHAR str[81];
752
753 sprintf(str,
754 GetPString(IDS_UNKNOWNBYTESTEXT),
755 *(USHORT *) info->value, info->cbValue);
756 WinSetDlgItemText(hwnd, EA_TEXT, str);
757 }
758 break;
759 }
760 break;
761 }
762 }
763 info = info->next;
764 }
765 }
766 }
767 }
768 if (!isalpha(*eap->filename) ||
769 (driveflags[toupper(*eap->filename) - 'A'] &
770 DRIVE_NOTWRITEABLE)) {
771 WinEnableWindow(WinWindowFromID(hwnd, EA_CHANGE), FALSE);
772 WinEnableWindow(WinWindowFromID(hwnd, EA_ADD), FALSE);
773 WinEnableWindow(WinWindowFromID(hwnd, EA_DELETE), FALSE);
774 }
775 else {
776 WinEnableWindow(WinWindowFromID(hwnd, EA_CHANGE), TRUE);
777 WinEnableWindow(WinWindowFromID(hwnd, EA_ADD), TRUE);
778 WinEnableWindow(WinWindowFromID(hwnd, EA_DELETE), TRUE);
779 }
780 }
781 break;
782 }
783 break;
784
785 case EA_ENTRY:
786 switch (SHORT2FROMMP(mp1)) {
787 case EN_SETFOCUS:
788 WinSetDlgItemText(hwnd, EA_HELP, GetPString(IDS_EADATAHELPTEXT));
789 break;
790 case EN_KILLFOCUS:
791 WinSetDlgItemText(hwnd, EA_HELP, NullStr);
792 break;
793 case EN_CHANGE:
794 WinEnableWindow(WinWindowFromID(hwnd, EA_CHANGE), TRUE);
795 break;
796 }
797 break;
798
799 case EA_HEXDUMP:
800 switch (SHORT2FROMMP(mp1)) {
801 case LN_SETFOCUS:
802 WinSetDlgItemText(hwnd, EA_HELP, GetPString(IDS_EADATAHELPTEXT));
803 break;
804 case LN_KILLFOCUS:
805 WinSetDlgItemText(hwnd, EA_HELP, NullStr);
806 break;
807 }
808 break;
809
810 case EA_MLE:
811 switch (SHORT2FROMMP(mp1)) {
812 case MLN_SETFOCUS:
813 WinSetDlgItemText(hwnd, EA_HELP, GetPString(IDS_EADATAHELPTEXT));
814 break;
815 case MLN_KILLFOCUS:
816 WinSetDlgItemText(hwnd, EA_HELP, NullStr);
817 break;
818 case MLN_CHANGE:
819 WinEnableWindow(WinWindowFromID(hwnd, EA_CHANGE), TRUE);
820 break;
821 }
822 break;
823 }
824 return 0;
825
826 case WM_COMMAND:
827 switch (SHORT1FROMMP(mp1)) {
828 case EA_ADD:
829 {
830 ADDEA add;
831
832 add.filename = eap->filename;
833 add.head = eap->head;
834 if (WinDlgBox(HWND_DESKTOP, hwnd, AddEAProc, FM3ModHandle,
835 EAC_FRAME, &add)) {
836 Free_FEAList(eap->head);
837 eap->head = GetFileEAs(eap->filename, FALSE, FALSE);
838 WinSendMsg(hwnd, UM_SETUP, MPVOID, MPVOID);
839 }
840 }
841 break;
842 case EA_CHANGE:
843 if (!eap->current)
844 WinShowWindow(WinWindowFromID(hwnd, EA_CHANGE), FALSE);
845 else {
846
847 CHAR *s;
848 USHORT control;
849
850 if (!eap->head || !*eap->filename)
851 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
852 else {
853 switch (*(USHORT *) eap->current->value) {
854 case EAT_EA:
855 case EAT_ASCII:
856 control = EA_ENTRY;
857 break;
858 case EAT_MVMT:
859 control = EA_MLE;
860 break;
861 case EAT_MVST:
862 control = EA_MLE;
863 break;
864 default:
865 Runtime_Error(pszSrcFile, __LINE__, "unexpected type");
866 WinShowWindow(WinWindowFromID(hwnd, EA_CHANGE), FALSE);
867 control = 0;
868 }
869 if (control) {
870 s = xmalloc(32768, pszSrcFile, __LINE__);
871 if (s) {
872 *s = 0;
873 WinQueryDlgItemText(hwnd, control, 32767, (PCH) s);
874 if (!*s)
875 Runtime_Error2(pszSrcFile, __LINE__, IDS_NODATATEXT);
876 else {
877 PFEA2LIST pfealist;
878
879 pfealist = SaveEA(eap->filename, eap->current, s, FALSE);
880 if (!pfealist)
881 Runtime_Error(pszSrcFile, __LINE__, "SaveEA");
882 else {
883 PFEA2 pfea;
884
885 pfea = xmalloc(pfealist->cbList, pszSrcFile, __LINE__);
886 if (pfea) {
887 memcpy(pfea, pfealist->list,
888 pfealist->cbList - sizeof(ULONG));
889 free(eap->current->pfea);
890 eap->current->pfea = pfea;
891 eap->current->name = eap->current->pfea->szName;
892 eap->current->cbName = eap->current->pfea->cbName;
893 eap->current->cbValue = eap->current->pfea->cbValue;
894 eap->current->value = eap->current->pfea->szName +
895 eap->current->pfea->cbName + 1;
896 eap->current->value[eap->current->cbValue] = 0;
897 PostMsg(hwnd, WM_CONTROL,
898 MPFROM2SHORT(EA_LISTBOX, LN_SELECT), MPVOID);
899 }
900 DosFreeMem(pfealist);
901 }
902 }
903 free(s);
904 }
905 }
906 }
907 }
908 break;
909
910 case EA_DELETE:
911 if (eap->head && eap->current) {
912
913 EAOP2 eaop;
914 PFEA2LIST pfealist;
915 GEA2LIST gealist;
916 APIRET rc;
917 SHORT sSelect;
918
919 pfealist =
920 xmallocz(sizeof(FEA2LIST) + eap->current->cbName + 1, pszSrcFile,
921 __LINE__);
922 if (pfealist) {
923 pfealist->cbList = sizeof(FEA2LIST) + eap->current->cbName + 1;
924 pfealist->list[0].cbName = eap->current->cbName;
925 strcpy(pfealist->list[0].szName, eap->current->name);
926 pfealist->list[0].cbValue = 0;
927 memset(&gealist, 0, sizeof(GEA2LIST));
928 gealist.cbList = sizeof(GEA2LIST);
929 eaop.fpGEA2List = &gealist;
930 eaop.fpFEA2List = pfealist;
931 eaop.oError = 0;
932 rc = xDosSetPathInfo(eap->filename, FIL_QUERYEASIZE,
933 &eaop, sizeof(eaop), DSPI_WRTTHRU);
934 free(pfealist);
935 if (rc)
936 Dos_Error(MB_CANCEL, rc, hwnd, pszSrcFile, __LINE__,
937 "xDosSetPathInfo");
938 else {
939 sSelect = 0;
940 if (eap->current == eap->head) {
941 eap->head = eap->head->next;
942 free(eap->current->pfea);
943 free(eap->current);
944 eap->current = NULL;
945 }
946 else {
947 info = eap->head;
948 while (info) {
949 if (info->next == eap->current) {
950 sSelect++;
951 info->next = eap->current->next;
952 free(eap->current->pfea);
953 free(eap->current);
954 eap->current = NULL;
955 break;
956 }
957 sSelect++;
958 info = info->next;
959 }
960 }
961 WinSendDlgItemMsg(hwnd, EA_LISTBOX, LM_DELETEITEM,
962 MPFROM2SHORT(sSelect, 0), MPVOID);
963 WinShowWindow(WinWindowFromID(hwnd, EA_ENTRY), FALSE);
964 WinShowWindow(WinWindowFromID(hwnd, EA_MLE), FALSE);
965 WinShowWindow(WinWindowFromID(hwnd, EA_CHANGE), FALSE);
966 WinShowWindow(WinWindowFromID(hwnd, EA_DELETE), FALSE);
967 WinShowWindow(WinWindowFromID(hwnd, EA_HEXDUMP), FALSE);
968 WinSetDlgItemText(hwnd, EA_ENTRY, NullStr);
969 MLEclearall(WinWindowFromID(hwnd, EA_MLE));
970 WinSendDlgItemMsg(hwnd, EA_HEXDUMP, LM_DELETEALL, MPVOID, MPVOID);
971 if (sSelect && (SHORT) WinSendDlgItemMsg(hwnd, EA_LISTBOX,
972 LM_QUERYITEMCOUNT,
973 MPVOID, MPVOID) <=
974 sSelect)
975 sSelect--;
976 WinSendDlgItemMsg(hwnd, EA_LISTBOX, LM_SELECTITEM,
977 MPFROM2SHORT(sSelect, 0),
978 MPFROM2SHORT(TRUE, 0));
979 }
980 }
981 }
982 if (!eap->head)
983 WinSetDlgItemText(hwnd, EA_TEXT, GetPString(IDS_EANOEAS));
984 break;
985
986 case IDM_HELP:
987 if (hwndHelp)
988 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
989 MPFROM2SHORT(HELP_EAS, 0), MPFROMSHORT(HM_RESOURCEID));
990 break;
991
992 case DID_OK:
993 WinDismissDlg(hwnd, 1);
994 break;
995
996 case DID_CANCEL:
997 WinDismissDlg(hwnd, 0);
998 break;
999 }
1000 return 0;
1001
1002 case WM_CLOSE:
1003 break;
1004
1005 case WM_DESTROY:
1006 if (eap) {
1007 if (eap->head)
1008 Free_FEAList(eap->head);
1009 free(eap);
1010 if (hptrIcon)
1011 WinDestroyPointer(hptrIcon);
1012 hptrIcon = (HPOINTER) 0;
1013 }
1014 break;
1015 } // switch
1016 return WinDefDlgProc(hwnd, msg, mp1, mp2);
1017}
1018
1019PVOID SaveEA(CHAR * filename, HOLDFEA * current, CHAR * newdata,
1020 BOOL silentfail)
1021{
1022 /* save an ea to disk */
1023
1024 PFEA2LIST pfealist = NULL;
1025 EAOP2 eaop;
1026 APIRET rc;
1027 ULONG ealen;
1028 USHORT len, *num, *plen;
1029 CHAR *p, *eaval;
1030
1031 if (!filename || !current)
1032 return (PVOID) pfealist;
1033 len = strlen(newdata);
1034 ealen = sizeof(FEA2LIST) + 24 + (ULONG) current->cbName + 1 +
1035 (ULONG)len + 4;
1036 switch (*(USHORT *) current->value) {
1037 case EAT_EA:
1038 case EAT_ASCII:
1039 break;
1040 case EAT_MVST:
1041 ealen += sizeof(USHORT) * 5;
1042 p = newdata;
1043 while (*p == '\n')
1044 p++;
1045 while (*p) {
1046 if (*p == '\n' && *(p + 1))
1047 ealen += sizeof(USHORT);
1048 p++;
1049 }
1050 break;
1051 case EAT_MVMT:
1052 ealen += sizeof(USHORT) * 5;
1053 p = newdata;
1054 while (*p == '\n')
1055 p++;
1056 while (*p) {
1057 if (*p == '\n' && *(p + 1))
1058 ealen += (sizeof(USHORT) * 2);
1059 p++;
1060 }
1061 break;
1062 default:
1063 return (PVOID) pfealist;
1064 }
1065
1066 rc = DosAllocMem((PPVOID) & pfealist, ealen,
1067 OBJ_TILE | PAG_COMMIT | PAG_READ | PAG_WRITE);
1068 if (rc)
1069 Dos_Error(MB_CANCEL, rc, HWND_DESKTOP, pszSrcFile, __LINE__,
1070 GetPString(IDS_OUTOFMEMORY));
1071 else {
1072 memset(pfealist, 0, ealen);
1073 pfealist->list[0].oNextEntryOffset = 0;
1074 pfealist->list[0].fEA = 0; //current->fEA;
1075
1076 pfealist->list[0].cbName = current->cbName;
1077 memcpy(pfealist->list[0].szName, current->name,
1078 pfealist->list[0].cbName + 1);
1079 eaval = pfealist->list[0].szName + pfealist->list[0].cbName + 1;
1080 switch (*(USHORT *) current->value) {
1081 case EAT_EA:
1082 case EAT_ASCII:
1083 *(USHORT *) eaval = *(USHORT *) current->value;
1084 eaval += sizeof(USHORT);
1085 *(USHORT *) eaval = (USHORT) len;
1086 eaval += sizeof(USHORT);
1087 memcpy(eaval, newdata, len);
1088 eaval += len;
1089 break;
1090 case EAT_MVST:
1091 *(USHORT *) eaval = (USHORT) EAT_MVST;
1092 eaval += sizeof(USHORT);
1093 *(USHORT *) eaval = *(USHORT *) (current->value + sizeof(USHORT));
1094 eaval += sizeof(USHORT);
1095 num = (USHORT *) eaval;
1096 *num = 0;
1097 eaval += sizeof(USHORT);
1098 *(USHORT *) eaval = (USHORT) EAT_ASCII;
1099 eaval += sizeof(USHORT);
1100 plen = (USHORT *) eaval;
1101 *plen = 0;
1102 eaval += sizeof(USHORT);
1103 p = newdata;
1104 while (*p == '\n')
1105 p++;
1106 while (*p) {
1107 while (*p) {
1108 if (*p == '\n')
1109 p++;
1110 *eaval++ = *p++;
1111 (*plen)++;
1112 }
1113 if (*p || *plen)
1114 (*num)++;
1115 if (*p) {
1116 plen = (USHORT *) eaval;
1117 *plen = 0;
1118 eaval += sizeof(USHORT);
1119 }
1120 }
1121 break;
1122/*
1123 cbList nextoffset fea cb cbval name.......
1124 000000 3C 00 00 00 00 00 00 00 6F 0B 24 00 2E 4B 45 59 < o
1125$ .KEY
1126 .................... eat code num eat
1127 000010 50 48 52 41 53 45 53 00 DF FF 00 00 02 00 FD FF PHRASES ßÿ ýÿ
1128 len.. phrase1............................ eat
1129 000020 0C 00 4B 65 79 20 70 68 72 61 73 65 20 31 FD FF
1130 Key phrase 1ýÿ
1131 len.. phrase2......................
1132 000030 0A 00 4B 65 79 20 70 68 72 61 73 65 Key phrase
1133 */
1134 case EAT_MVMT:
1135 *(USHORT *) eaval = (USHORT) EAT_MVMT;
1136 eaval += sizeof(USHORT);
1137 *(USHORT *) eaval = *(USHORT *) (current->value + sizeof(USHORT));
1138 eaval += sizeof(USHORT);
1139 num = (USHORT *) eaval;
1140 *num = 0;
1141 eaval += sizeof(USHORT);
1142 *(USHORT *) eaval = (USHORT) EAT_ASCII;
1143 eaval += sizeof(USHORT);
1144 plen = (USHORT *) eaval;
1145 *plen = 0;
1146 eaval += sizeof(USHORT);
1147 p = newdata;
1148 while (*p == '\n')
1149 p++;
1150 while (*p) {
1151 while (*p) {
1152 if (*p == '\n')
1153 p++;
1154 *eaval++ = *p++;
1155 (*plen)++;
1156 }
1157 if (*p || *plen)
1158 (*num)++;
1159 if (*p) {
1160 *(USHORT *) eaval = (USHORT) EAT_ASCII;
1161 eaval += sizeof(USHORT);
1162 plen = (USHORT *) eaval;
1163 *plen = 0;
1164 eaval += sizeof(USHORT);
1165 }
1166 }
1167 break;
1168 }
1169 pfealist->list[0].cbValue = /*(ULONG)*/ (eaval -
1170 (pfealist->list[0].szName +
1171 pfealist->list[0].cbName + 1));
1172 eaop.fpGEA2List = (PGEA2LIST) 0;
1173 eaop.fpFEA2List = pfealist;
1174 eaop.oError = 0;
1175 pfealist->cbList = 13 + (ULONG) pfealist->list[0].cbName +
1176 (ULONG)pfealist->list[0].cbValue;
1177
1178 rc = xDosSetPathInfo(filename, FIL_QUERYEASIZE,
1179 &eaop, sizeof(eaop), DSPI_WRTTHRU);
1180 if (rc) {
1181 DosFreeMem(pfealist);
1182 pfealist = NULL;
1183 }
1184 if (rc && !silentfail) {
1185 if (rc == ERROR_ACCESS_DENIED || rc == ERROR_SHARING_VIOLATION) {
1186 saymsg(MB_ENTER,
1187 HWND_DESKTOP,
1188 GetPString(IDS_OOPSTEXT),
1189 GetPString(IDS_CANTWRITEEATEXT), current->name, filename);
1190 }
1191 else {
1192 Dos_Error(MB_ENTER,
1193 rc,
1194 HWND_DESKTOP,
1195 pszSrcFile,
1196 __LINE__,
1197 GetPString(IDS_ERRORWRITEEATEXT),
1198 current->name, filename, eaop.oError);
1199 }
1200 }
1201 }
1202 return (PVOID) pfealist;
1203}
1204
1205HOLDFEA *GetFileEAs(CHAR * filename, BOOL ishandle, BOOL silentfail)
1206{
1207 /* load eas from disk into HOLDFEA linked list */
1208
1209 HOLDFEA *head = NULL, *info, *last = NULL;
1210 FILESTATUS4 fsa4;
1211 HFILE handle;
1212 ULONG action;
1213 APIRET rc;
1214
1215 if (!filename)
1216 return head;
1217 if (ishandle || !DosOpen(filename, &handle, &action, 0, 0,
1218 OPEN_ACTION_FAIL_IF_NEW |
1219 OPEN_ACTION_OPEN_IF_EXISTS,
1220 OPEN_FLAGS_NOINHERIT |
1221 OPEN_SHARE_DENYREADWRITE |
1222 OPEN_ACCESS_READWRITE, (PEAOP2)0)) {
1223 if (ishandle)
1224 handle = *(HFILE *) filename;
1225 if (!DosQueryFileInfo(handle, FIL_QUERYEASIZE, (PVOID)&fsa4,
1226 (ULONG) sizeof(fsa4)) &&
1227 fsa4.cbList > 4)
1228 {
1229 PDENA2 pdena;
1230 EAOP2 eaop;
1231 PGEA2LIST pgealist;
1232 PFEA2LIST pfealist;
1233 PGEA2 pgea;
1234 ULONG ulEntry = 1; // Ordinal of EA to return
1235 ULONG ulCount = 1; // # of EAs to return
1236
1237 pdena = xmalloc(65536 + 1024, pszSrcFile, __LINE__);
1238 if (pdena) {
1239 while (!DosEnumAttribute(ENUMEA_REFTYPE_FHANDLE,
1240 &handle,
1241 ulEntry,
1242 (PVOID)pdena,
1243 (ULONG)65536,
1244 &ulCount,
1245 ENUMEA_LEVEL_NO_VALUE) &&
1246 ulCount)
1247 {
1248 // 64 is for header and spare - fixme to allocate smarter
1249 pgealist = xmalloc(64 + pdena->cbName, pszSrcFile, __LINE__);
1250 if (pgealist) {
1251 pgealist->cbList = 64 + pdena->cbName;
1252 pgea = pgealist->list;
1253 pgea->oNextEntryOffset = 0;
1254 pgea->cbName = pdena->cbName;
1255 memcpy(pgea->szName, pdena->szName, pdena->cbName + 1);
1256 pfealist = xmallocz(64 + pdena->cbName + pdena->cbValue,
1257 pszSrcFile, __LINE__);
1258 if (pfealist) {
1259 pfealist->cbList = 64 + pdena->cbName + pdena->cbValue;
1260 eaop.fpGEA2List = pgealist;
1261 eaop.fpFEA2List = pfealist;
1262 eaop.oError = 0;
1263 // saymsg(MB_ENTER,HWND_DESKTOP,"Debug1","\"%s\" %ld",pdena->szName,ulEntry);
1264 rc =
1265 DosQueryFileInfo(handle, FIL_QUERYEASFROMLIST, (PVOID) & eaop,
1266 (ULONG) sizeof(EAOP2));
1267 if (rc) {
1268 if (!silentfail) {
1269 Dos_Error(MB_ENTER,
1270 rc,
1271 HWND_DESKTOP,
1272 pszSrcFile,
1273 __LINE__,
1274 GetPString(IDS_ERRORREADEATEXT), pdena->szName);
1275 }
1276 }
1277 else {
1278 info = xmalloc(sizeof(HOLDFEA), pszSrcFile, __LINE__);
1279 if (info) {
1280 // 05 Jul 07 SHL was one short
1281 info->pfea = xmalloc(eaop.fpFEA2List->cbList - sizeof(ULONG) + 1,
1282 pszSrcFile, __LINE__);
1283 memcpy(info->pfea, eaop.fpFEA2List->list,
1284 eaop.fpFEA2List->cbList - sizeof(ULONG));
1285 info->name = info->pfea->szName;
1286 info->cbName = info->pfea->cbName;
1287 info->cbValue = info->pfea->cbValue;
1288 info->value = info->pfea->szName + info->pfea->cbName + 1;
1289 info->value[info->cbValue] = 0;
1290 info->next = NULL;
1291 if (!head)
1292 head = info;
1293 else
1294 last->next = info;
1295 last = info;
1296 }
1297 }
1298 free(pfealist);
1299 }
1300 free(pgealist);
1301 }
1302 ulEntry += ulCount;
1303 } // while
1304 free(pdena);
1305 DosPostEventSem(CompactSem);
1306 }
1307 }
1308 if (!ishandle)
1309 DosClose(handle);
1310 }
1311 else {
1312 /* try it without opening it */
1313 if (!DosQueryPathInfo(filename, FIL_QUERYEASIZE, (PVOID) & fsa4,
1314 (ULONG) sizeof(fsa4)) &&
1315 fsa4.cbList > 4)
1316 {
1317 PDENA2 pdena;
1318 EAOP2 eaop;
1319 PGEA2LIST pgealist;
1320 PFEA2LIST pfealist;
1321 PGEA2 pgea;
1322 ULONG ulEntry = 1, ulCount = 1;
1323
1324 pdena = xmalloc(65536 + 1024, pszSrcFile, __LINE__);
1325 if (pdena) {
1326 while (!DosEnumAttribute
1327 (ENUMEA_REFTYPE_PATH, filename, ulEntry, (PVOID) pdena,
1328 (ULONG) 65536, &ulCount, ENUMEA_LEVEL_NO_VALUE) && ulCount)
1329 {
1330 pgealist = xmalloc(64 + pdena->cbName, pszSrcFile, __LINE__);
1331 if (pgealist) {
1332 pgealist->cbList = 64 + pdena->cbName;
1333 pgea = pgealist->list;
1334 pgea->oNextEntryOffset = 0;
1335 pgea->cbName = pdena->cbName;
1336 memcpy(pgea->szName, pdena->szName, pdena->cbName + 1);
1337 pfealist =
1338 xmallocz(64 + pdena->cbName + pdena->cbValue, pszSrcFile,
1339 __LINE__);
1340 if (pfealist) {
1341 pfealist->cbList = 64 + pdena->cbName + pdena->cbValue;
1342 eaop.fpGEA2List = pgealist;
1343 eaop.fpFEA2List = pfealist;
1344 eaop.oError = 0;
1345 // saymsg(MB_ENTER,HWND_DESKTOP,"Debug2","\"%s\" %ld",pdena->szName,ulEntry);
1346 rc = DosQueryPathInfo(filename, FIL_QUERYEASFROMLIST,
1347 (PVOID) & eaop, (ULONG) sizeof(EAOP2));
1348 if (!rc) {
1349 info = xmalloc(sizeof(HOLDFEA), pszSrcFile, __LINE__);
1350 if (info) {
1351 // 29 Nov 07 GKY One short (EA search crash)
1352 info->pfea =
1353 xmalloc(eaop.fpFEA2List->cbList - sizeof(ULONG) + 1,
1354 pszSrcFile, __LINE__);
1355 memcpy(info->pfea, eaop.fpFEA2List->list,
1356 eaop.fpFEA2List->cbList - sizeof(ULONG));
1357 info->name = info->pfea->szName;
1358 info->cbName = info->pfea->cbName;
1359 info->cbValue = info->pfea->cbValue;
1360 info->value = info->pfea->szName + info->pfea->cbName + 1;
1361 info->value[info->cbValue] = 0;
1362 info->next = NULL;
1363 if (!head)
1364 head = info;
1365 else
1366 last->next = info;
1367 last = info;
1368 }
1369 else
1370 free(pfealist);
1371 }
1372 else {
1373 free(pfealist);
1374 if (!silentfail) {
1375 if (rc == ERROR_ACCESS_DENIED
1376 || rc == ERROR_SHARING_VIOLATION) {
1377 rc =
1378 saymsg(MB_ENTER | MB_CANCEL, HWND_DESKTOP,
1379 GetPString(IDS_OOPSTEXT),
1380 GetPString(IDS_CANTREADEATEXT), filename,
1381 pdena->szName);
1382 if (rc == MBID_CANCEL) {
1383 free(pgealist);
1384 break;
1385 }
1386 }
1387 else {
1388 Dos_Error(MB_ENTER,
1389 rc,
1390 HWND_DESKTOP,
1391 pszSrcFile,
1392 __LINE__,
1393 GetPString(IDS_ERRORREADEATEXT), pdena->szName);
1394 }
1395 }
1396 }
1397 }
1398 free(pgealist);
1399 }
1400 ulEntry += ulCount;
1401 } // while
1402 free(pdena);
1403 DosPostEventSem(CompactSem);
1404 }
1405 }
1406 }
1407 return head;
1408}
1409
1410VOID Free_FEAList(HOLDFEA * pFEA)
1411{
1412 /* free a linked list of HOLDFEAs */
1413
1414 register HOLDFEA *next;
1415
1416 while (pFEA) {
1417 /* Free linked list */
1418 next = pFEA->next;
1419 xfree(pFEA->pfea, pszSrcFile, __LINE__);
1420 free(pFEA);
1421 pFEA = next;
1422 }
1423 DosPostEventSem(CompactSem);
1424}
1425
1426#pragma alloc_text(EAS,DisplayEAsProc,SaveEA,HexDumpEA,CheckEA,AddEAProc)
1427#pragma alloc_text(EAS1,HexDump,GetFileEAs,Free_FEAList)
1428
Note: See TracBrowser for help on using the repository browser.