source: trunk/dll/eas.c@ 1673

Last change on this file since 1673 was 1673, checked in by Gregg Young, 13 years ago

Update to Doxygen comment style Ticket 55. Also some minor code cleanup.

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