source: trunk/dll/eas.c@ 907

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