source: trunk/dll/eas.c@ 564

Last change on this file since 564 was 564, checked in by Steven Levine, 18 years ago

Release 3.05.beta08

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