source: trunk/dll/eas.c@ 1627

Last change on this file since 1627 was 1627, checked in by Gregg Young, 14 years ago

Add a low mem version of xDosAlloc* wrappers; move error checking into all the xDosAlloc* wrappers. Ticket 471

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