source: trunk/dll/eas.c@ 193

Last change on this file since 193 was 193, checked in by root, 20 years ago

Indent -i2

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