source: trunk/dll/eas.c@ 1036

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

Fixed early memory free; Added free_... functions to make fortify checking easier; Added fortify scopes; Delete now moves to trash can on systems with the xworkplace trash can installed.

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