source: trunk/dll/eas.c@ 1179

Last change on this file since 1179 was 1179, checked in by John Small, 17 years ago

Ticket 187: Draft 2: Move remaining function declarations

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