source: trunk/dll/eas.c@ 1439

Last change on this file since 1439 was 1439, checked in by Gregg Young, 16 years ago

Changes to allow high mem loading of dll; Refactor .LONGNAME and .SUBJECT EA fetch to FetchCommonEAs. Add szFSType to FillInRecordFromFSA use to bypass EA scan and size formatting for tree container; Fix labels/FS type to work on scan on NOPRESCAN Drives; Fixed dbl directory names on restore of dir cnrs; (Tickets 47, 339, 363, 368, 369, 370)

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