source: trunk/dll/eas.c@ 1347

Last change on this file since 1347 was 1347, checked in by Gregg Young, 17 years ago

More code cleanup

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