source: trunk/dll/eas.c@ 1178

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

Ticket 187: Draft 1: Functions only

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