source: trunk/dll/eas.c@ 775

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

Minor clean up add comments re recent changes

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