source: trunk/dll/eas.c@ 1570

Last change on this file since 1570 was 1547, checked in by Gregg Young, 15 years ago

Improvements to collector opening directory container from the path of the selected item. More completely matches the change requested (Ticket 362).

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