source: trunk/dll/eas.c@ 755

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

=Remove spurious error message

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