source: trunk/dll/eas.c@ 1628

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

Hard coded the flags for the xDosAlloc* wrappers and added a description for each of them.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 48.9 KB
Line 
1
2/***********************************************************************
3
4 $Id: eas.c 1628 2011-08-27 19:35:39Z 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 = /*(ULONG)*/ (eaval -
1204 (pfealist->list[0].szName +
1205 pfealist->list[0].cbName + 1));
1206 eaop.fpGEA2List = (PGEA2LIST) 0;
1207 eaop.fpFEA2List = pfealist;
1208 eaop.oError = 0;
1209 pfealist->cbList = 13 + (ULONG) pfealist->list[0].cbName +
1210 (ULONG)pfealist->list[0].cbValue;
1211
1212 rc = xDosSetPathInfo(filename, FIL_QUERYEASIZE,
1213 &eaop, sizeof(eaop), DSPI_WRTTHRU);
1214 if (rc) {
1215 DosFreeMem(pfealist);
1216 pfealist = NULL;
1217 }
1218 if (rc && !silentfail) {
1219 if (rc == ERROR_ACCESS_DENIED || rc == ERROR_SHARING_VIOLATION) {
1220 saymsg(MB_ENTER,
1221 HWND_DESKTOP,
1222 GetPString(IDS_OOPSTEXT),
1223 GetPString(IDS_CANTWRITEEATEXT), current->name, filename);
1224 }
1225 else {
1226 Dos_Error(MB_ENTER,
1227 rc,
1228 HWND_DESKTOP,
1229 pszSrcFile,
1230 __LINE__,
1231 GetPString(IDS_ERRORWRITEEATEXT),
1232 current->name, filename, eaop.oError);
1233 }
1234 }
1235 }
1236 return (PVOID) pfealist;
1237}
1238
1239HOLDFEA *GetFileEAs(CHAR * filename, BOOL ishandle, BOOL silentfail)
1240{
1241 /* load eas from disk into HOLDFEA linked list */
1242
1243 HOLDFEA *head = NULL, *info, *last = NULL;
1244 FILESTATUS4 fsa4;
1245 HFILE handle;
1246 ULONG action;
1247 APIRET rc;
1248
1249 if (!filename)
1250 return head;
1251 if (ishandle || !DosOpen(filename, &handle, &action, 0, 0,
1252 OPEN_ACTION_FAIL_IF_NEW |
1253 OPEN_ACTION_OPEN_IF_EXISTS,
1254 OPEN_FLAGS_NOINHERIT |
1255 OPEN_SHARE_DENYREADWRITE |
1256 OPEN_ACCESS_READWRITE, (PEAOP2)0)) {
1257 if (ishandle)
1258 handle = *(HFILE *) filename;
1259 if (!DosQueryFileInfo(handle, FIL_QUERYEASIZE, (PVOID)&fsa4,
1260 (ULONG) sizeof(fsa4)) &&
1261 fsa4.cbList > 4)
1262 {
1263 PDENA2 pdena;
1264 EAOP2 eaop;
1265 PGEA2LIST pgealist;
1266 PFEA2LIST pfealist;
1267 PGEA2 pgea;
1268 ULONG ulEntry = 1; // Ordinal of EA to return
1269 ULONG ulCount = 1; // # of EAs to return
1270
1271 pdena = xmalloc(65536 + 1024, pszSrcFile, __LINE__);
1272 if (pdena) {
1273 while (!DosEnumAttribute(ENUMEA_REFTYPE_FHANDLE,
1274 &handle,
1275 ulEntry,
1276 (PVOID)pdena,
1277 (ULONG)65536,
1278 &ulCount,
1279 ENUMEA_LEVEL_NO_VALUE) &&
1280 ulCount)
1281 {
1282 // 64 is for header and spare - fixme to allocate smarter
1283 pgealist = xmalloc(64 + pdena->cbName, pszSrcFile, __LINE__);
1284 if (pgealist) {
1285 pgealist->cbList = 64 + pdena->cbName;
1286 pgea = pgealist->list;
1287 pgea->oNextEntryOffset = 0;
1288 pgea->cbName = pdena->cbName;
1289 memcpy(pgea->szName, pdena->szName, pdena->cbName + 1);
1290 pfealist = xmallocz(64 + pdena->cbName + pdena->cbValue,
1291 pszSrcFile, __LINE__);
1292 if (pfealist) {
1293 pfealist->cbList = 64 + pdena->cbName + pdena->cbValue;
1294 eaop.fpGEA2List = pgealist;
1295 eaop.fpFEA2List = pfealist;
1296 eaop.oError = 0;
1297 rc = DosQueryFileInfo(handle, FIL_QUERYEASFROMLIST, (PVOID) & eaop,
1298 (ULONG) sizeof(EAOP2));
1299 if (rc) {
1300 if (!silentfail) {
1301 Dos_Error(MB_ENTER,
1302 rc,
1303 HWND_DESKTOP,
1304 pszSrcFile,
1305 __LINE__,
1306 GetPString(IDS_ERRORREADEATEXT), pdena->szName);
1307 }
1308 }
1309 else {
1310 info = xmalloc(sizeof(HOLDFEA), pszSrcFile, __LINE__);
1311 if (info) {
1312 // 05 Jul 07 SHL was one short
1313 info->pfea = xmalloc(eaop.fpFEA2List->cbList - sizeof(ULONG) + 1,
1314 pszSrcFile, __LINE__);
1315 memcpy(info->pfea, eaop.fpFEA2List->list,
1316 eaop.fpFEA2List->cbList - sizeof(ULONG));
1317 info->name = info->pfea->szName;
1318 info->cbName = info->pfea->cbName;
1319 info->cbValue = info->pfea->cbValue;
1320 info->value = info->pfea->szName + info->pfea->cbName + 1;
1321 info->value[info->cbValue] = 0;
1322 info->next = NULL;
1323 if (!head)
1324 head = info;
1325 else
1326 last->next = info;
1327 last = info;
1328 }
1329 }
1330 free(pfealist);
1331 }
1332 free(pgealist);
1333 }
1334 ulEntry += ulCount;
1335 } // while
1336 free(pdena);
1337 DosPostEventSem(CompactSem);
1338 }
1339 }
1340 if (!ishandle)
1341 DosClose(handle);
1342 }
1343 else {
1344 /* try it without opening it */
1345 if (!DosQueryPathInfo(filename, FIL_QUERYEASIZE, (PVOID) & fsa4,
1346 (ULONG) sizeof(fsa4)) &&
1347 fsa4.cbList > 4)
1348 {
1349 PDENA2 pdena;
1350 EAOP2 eaop;
1351 PGEA2LIST pgealist;
1352 PFEA2LIST pfealist;
1353 PGEA2 pgea;
1354 ULONG ulEntry = 1, ulCount = 1;
1355
1356 pdena = xmalloc(65536 + 1024, pszSrcFile, __LINE__);
1357 if (pdena) {
1358 while (!DosEnumAttribute
1359 (ENUMEA_REFTYPE_PATH, filename, ulEntry, (PVOID) pdena,
1360 (ULONG) 65536, &ulCount, ENUMEA_LEVEL_NO_VALUE) && ulCount)
1361 {
1362 pgealist = xmalloc(64 + pdena->cbName, pszSrcFile, __LINE__);
1363 if (pgealist) {
1364 pgealist->cbList = 64 + pdena->cbName;
1365 pgea = pgealist->list;
1366 pgea->oNextEntryOffset = 0;
1367 pgea->cbName = pdena->cbName;
1368 memcpy(pgea->szName, pdena->szName, pdena->cbName + 1);
1369 pfealist =
1370 xmallocz(64 + pdena->cbName + pdena->cbValue, pszSrcFile,
1371 __LINE__);
1372 if (pfealist) {
1373 pfealist->cbList = 64 + pdena->cbName + pdena->cbValue;
1374 eaop.fpGEA2List = pgealist;
1375 eaop.fpFEA2List = pfealist;
1376 eaop.oError = 0;
1377 rc = DosQueryPathInfo(filename, FIL_QUERYEASFROMLIST,
1378 (PVOID) & eaop, (ULONG) sizeof(EAOP2));
1379 if (!rc) {
1380 info = xmalloc(sizeof(HOLDFEA), pszSrcFile, __LINE__);
1381 if (info) {
1382 // 29 Nov 07 GKY One short (EA search crash)
1383 info->pfea =
1384 xmalloc(eaop.fpFEA2List->cbList - sizeof(ULONG) + 1,
1385 pszSrcFile, __LINE__);
1386 memcpy(info->pfea, eaop.fpFEA2List->list,
1387 eaop.fpFEA2List->cbList - sizeof(ULONG));
1388 info->name = info->pfea->szName;
1389 info->cbName = info->pfea->cbName;
1390 info->cbValue = info->pfea->cbValue;
1391 info->value = info->pfea->szName + info->pfea->cbName + 1;
1392 info->value[info->cbValue] = 0;
1393 info->next = NULL;
1394 if (!head)
1395 head = info;
1396 else
1397 last->next = info;
1398 last = info;
1399 }
1400 else
1401 free(pfealist);
1402 }
1403 else {
1404 free(pfealist);
1405 if (!silentfail) {
1406 if (rc == ERROR_ACCESS_DENIED
1407 || rc == ERROR_SHARING_VIOLATION) {
1408 rc =
1409 saymsg(MB_ENTER | MB_CANCEL, HWND_DESKTOP,
1410 GetPString(IDS_OOPSTEXT),
1411 GetPString(IDS_CANTREADEATEXT), filename,
1412 pdena->szName);
1413 if (rc == MBID_CANCEL) {
1414 free(pgealist);
1415 break;
1416 }
1417 }
1418 else {
1419 Dos_Error(MB_ENTER,
1420 rc,
1421 HWND_DESKTOP,
1422 pszSrcFile,
1423 __LINE__,
1424 GetPString(IDS_ERRORREADEATEXT), pdena->szName);
1425 }
1426 }
1427 }
1428 }
1429 free(pgealist);
1430 }
1431 ulEntry += ulCount;
1432 } // while
1433 free(pdena);
1434 DosPostEventSem(CompactSem);
1435 }
1436 }
1437 }
1438 return head;
1439}
1440
1441VOID Free_FEAList(HOLDFEA * pFEA)
1442{
1443 /* free a linked list of HOLDFEAs */
1444
1445 register HOLDFEA *next;
1446
1447 while (pFEA) {
1448 /* Free linked list */
1449 next = pFEA->next;
1450 xfree(pFEA->pfea, pszSrcFile, __LINE__);
1451 free(pFEA);
1452 pFEA = next;
1453 }
1454 DosPostEventSem(CompactSem);
1455}
1456
1457#pragma alloc_text(EAS,DisplayEAsProc,SaveEA,HexDumpEA,CheckEA,AddEAProc)
1458#pragma alloc_text(EAS1,HexDump,GetFileEAs,Free_FEAList)
1459
Note: See TracBrowser for help on using the repository browser.