source: trunk/dll/eas.c@ 730

Last change on this file since 730 was 730, checked in by Gregg Young, 18 years ago

Preliminary work on variable sized container buffers. Removes szFileName etc. Builds fine but traps.

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