source: trunk/dll/eas.c@ 1546

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

Add menu item to allow opening of directory container from the collector based on the path of the selected item. (Ticket 362) Add open file button to EAs dialog to allow opening of a new file's eas (Ticket 439). Initial work on populating the help table (It provides F1 help a few more places) (Ticket 95). Some minor code cleanup and help file updates.

  • 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 1546 2010-10-23 22:33:00Z 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 free(eap);
1053 if (hptrIcon)
1054 WinDestroyPointer(hptrIcon);
1055 hptrIcon = (HPOINTER) 0;
1056 }
1057 break;
1058 } // switch
1059 return WinDefDlgProc(hwnd, msg, mp1, mp2);
1060}
1061
1062PVOID SaveEA(CHAR * filename, HOLDFEA * current, CHAR * newdata,
1063 BOOL silentfail)
1064{
1065 /* save an ea to disk */
1066
1067 PFEA2LIST pfealist = NULL;
1068 EAOP2 eaop;
1069 APIRET rc;
1070 ULONG ealen;
1071 USHORT len, *num, *plen;
1072 CHAR *p, *eaval;
1073
1074 if (!filename || !current)
1075 return (PVOID) pfealist;
1076 len = strlen(newdata);
1077 ealen = sizeof(FEA2LIST) + 24 + (ULONG) current->cbName + 1 +
1078 (ULONG)len + 4;
1079 switch (*(USHORT *) current->value) {
1080 case EAT_EA:
1081 case EAT_ASCII:
1082 break;
1083 case EAT_MVST:
1084 ealen += sizeof(USHORT) * 5;
1085 p = newdata;
1086 while (*p == '\n')
1087 p++;
1088 while (*p) {
1089 if (*p == '\n' && *(p + 1))
1090 ealen += sizeof(USHORT);
1091 p++;
1092 }
1093 break;
1094 case EAT_MVMT:
1095 ealen += sizeof(USHORT) * 5;
1096 p = newdata;
1097 while (*p == '\n')
1098 p++;
1099 while (*p) {
1100 if (*p == '\n' && *(p + 1))
1101 ealen += (sizeof(USHORT) * 2);
1102 p++;
1103 }
1104 break;
1105 default:
1106 return (PVOID) pfealist;
1107 }
1108
1109 rc = xDosAllocMem((PPVOID) & pfealist, ealen,
1110 PAG_COMMIT | PAG_READ | PAG_WRITE, pszSrcFile, __LINE__);
1111 if (rc)
1112 Dos_Error(MB_CANCEL, rc, HWND_DESKTOP, pszSrcFile, __LINE__,
1113 GetPString(IDS_OUTOFMEMORY));
1114 else {
1115 memset(pfealist, 0, ealen);
1116 pfealist->list[0].oNextEntryOffset = 0;
1117 pfealist->list[0].fEA = 0; //current->fEA;
1118
1119 pfealist->list[0].cbName = current->cbName;
1120 memcpy(pfealist->list[0].szName, current->name,
1121 pfealist->list[0].cbName + 1);
1122 eaval = pfealist->list[0].szName + pfealist->list[0].cbName + 1;
1123 switch (*(USHORT *) current->value) {
1124 case EAT_EA:
1125 case EAT_ASCII:
1126 *(USHORT *) eaval = *(USHORT *) current->value;
1127 eaval += sizeof(USHORT);
1128 *(USHORT *) eaval = (USHORT) len;
1129 eaval += sizeof(USHORT);
1130 memcpy(eaval, newdata, len);
1131 eaval += len;
1132 break;
1133 case EAT_MVST:
1134 *(USHORT *) eaval = (USHORT) EAT_MVST;
1135 eaval += sizeof(USHORT);
1136 *(USHORT *) eaval = *(USHORT *) (current->value + sizeof(USHORT));
1137 eaval += sizeof(USHORT);
1138 num = (USHORT *) eaval;
1139 *num = 0;
1140 eaval += sizeof(USHORT);
1141 *(USHORT *) eaval = (USHORT) EAT_ASCII;
1142 eaval += sizeof(USHORT);
1143 plen = (USHORT *) eaval;
1144 *plen = 0;
1145 eaval += sizeof(USHORT);
1146 p = newdata;
1147 while (*p == '\n')
1148 p++;
1149 while (*p) {
1150 while (*p) {
1151 if (*p == '\n')
1152 p++;
1153 *eaval++ = *p++;
1154 (*plen)++;
1155 }
1156 if (*p || *plen)
1157 (*num)++;
1158 if (*p) {
1159 plen = (USHORT *) eaval;
1160 *plen = 0;
1161 eaval += sizeof(USHORT);
1162 }
1163 }
1164 break;
1165/*
1166 cbList nextoffset fea cb cbval name.......
1167 000000 3C 00 00 00 00 00 00 00 6F 0B 24 00 2E 4B 45 59 < o
1168$ .KEY
1169 .................... eat code num eat
1170 000010 50 48 52 41 53 45 53 00 DF FF 00 00 02 00 FD FF PHRASES ßÿ ýÿ
1171 len.. phrase1............................ eat
1172 000020 0C 00 4B 65 79 20 70 68 72 61 73 65 20 31 FD FF
1173 Key phrase 1ýÿ
1174 len.. phrase2......................
1175 000030 0A 00 4B 65 79 20 70 68 72 61 73 65 Key phrase
1176 */
1177 case EAT_MVMT:
1178 *(USHORT *) eaval = (USHORT) EAT_MVMT;
1179 eaval += sizeof(USHORT);
1180 *(USHORT *) eaval = *(USHORT *) (current->value + sizeof(USHORT));
1181 eaval += sizeof(USHORT);
1182 num = (USHORT *) eaval;
1183 *num = 0;
1184 eaval += sizeof(USHORT);
1185 *(USHORT *) eaval = (USHORT) EAT_ASCII;
1186 eaval += sizeof(USHORT);
1187 plen = (USHORT *) eaval;
1188 *plen = 0;
1189 eaval += sizeof(USHORT);
1190 p = newdata;
1191 while (*p == '\n')
1192 p++;
1193 while (*p) {
1194 while (*p) {
1195 if (*p == '\n')
1196 p++;
1197 *eaval++ = *p++;
1198 (*plen)++;
1199 }
1200 if (*p || *plen)
1201 (*num)++;
1202 if (*p) {
1203 *(USHORT *) eaval = (USHORT) EAT_ASCII;
1204 eaval += sizeof(USHORT);
1205 plen = (USHORT *) eaval;
1206 *plen = 0;
1207 eaval += sizeof(USHORT);
1208 }
1209 }
1210 break;
1211 }
1212 pfealist->list[0].cbValue = /*(ULONG)*/ (eaval -
1213 (pfealist->list[0].szName +
1214 pfealist->list[0].cbName + 1));
1215 eaop.fpGEA2List = (PGEA2LIST) 0;
1216 eaop.fpFEA2List = pfealist;
1217 eaop.oError = 0;
1218 pfealist->cbList = 13 + (ULONG) pfealist->list[0].cbName +
1219 (ULONG)pfealist->list[0].cbValue;
1220
1221 rc = xDosSetPathInfo(filename, FIL_QUERYEASIZE,
1222 &eaop, sizeof(eaop), DSPI_WRTTHRU);
1223 if (rc) {
1224 DosFreeMem(pfealist);
1225 pfealist = NULL;
1226 }
1227 if (rc && !silentfail) {
1228 if (rc == ERROR_ACCESS_DENIED || rc == ERROR_SHARING_VIOLATION) {
1229 saymsg(MB_ENTER,
1230 HWND_DESKTOP,
1231 GetPString(IDS_OOPSTEXT),
1232 GetPString(IDS_CANTWRITEEATEXT), current->name, filename);
1233 }
1234 else {
1235 Dos_Error(MB_ENTER,
1236 rc,
1237 HWND_DESKTOP,
1238 pszSrcFile,
1239 __LINE__,
1240 GetPString(IDS_ERRORWRITEEATEXT),
1241 current->name, filename, eaop.oError);
1242 }
1243 }
1244 }
1245 return (PVOID) pfealist;
1246}
1247
1248HOLDFEA *GetFileEAs(CHAR * filename, BOOL ishandle, BOOL silentfail)
1249{
1250 /* load eas from disk into HOLDFEA linked list */
1251
1252 HOLDFEA *head = NULL, *info, *last = NULL;
1253 FILESTATUS4 fsa4;
1254 HFILE handle;
1255 ULONG action;
1256 APIRET rc;
1257
1258 if (!filename)
1259 return head;
1260 if (ishandle || !DosOpen(filename, &handle, &action, 0, 0,
1261 OPEN_ACTION_FAIL_IF_NEW |
1262 OPEN_ACTION_OPEN_IF_EXISTS,
1263 OPEN_FLAGS_NOINHERIT |
1264 OPEN_SHARE_DENYREADWRITE |
1265 OPEN_ACCESS_READWRITE, (PEAOP2)0)) {
1266 if (ishandle)
1267 handle = *(HFILE *) filename;
1268 if (!DosQueryFileInfo(handle, FIL_QUERYEASIZE, (PVOID)&fsa4,
1269 (ULONG) sizeof(fsa4)) &&
1270 fsa4.cbList > 4)
1271 {
1272 PDENA2 pdena;
1273 EAOP2 eaop;
1274 PGEA2LIST pgealist;
1275 PFEA2LIST pfealist;
1276 PGEA2 pgea;
1277 ULONG ulEntry = 1; // Ordinal of EA to return
1278 ULONG ulCount = 1; // # of EAs to return
1279
1280 pdena = xmalloc(65536 + 1024, pszSrcFile, __LINE__);
1281 if (pdena) {
1282 while (!DosEnumAttribute(ENUMEA_REFTYPE_FHANDLE,
1283 &handle,
1284 ulEntry,
1285 (PVOID)pdena,
1286 (ULONG)65536,
1287 &ulCount,
1288 ENUMEA_LEVEL_NO_VALUE) &&
1289 ulCount)
1290 {
1291 // 64 is for header and spare - fixme to allocate smarter
1292 pgealist = xmalloc(64 + pdena->cbName, pszSrcFile, __LINE__);
1293 if (pgealist) {
1294 pgealist->cbList = 64 + pdena->cbName;
1295 pgea = pgealist->list;
1296 pgea->oNextEntryOffset = 0;
1297 pgea->cbName = pdena->cbName;
1298 memcpy(pgea->szName, pdena->szName, pdena->cbName + 1);
1299 pfealist = xmallocz(64 + pdena->cbName + pdena->cbValue,
1300 pszSrcFile, __LINE__);
1301 if (pfealist) {
1302 pfealist->cbList = 64 + pdena->cbName + pdena->cbValue;
1303 eaop.fpGEA2List = pgealist;
1304 eaop.fpFEA2List = pfealist;
1305 eaop.oError = 0;
1306 rc = DosQueryFileInfo(handle, FIL_QUERYEASFROMLIST, (PVOID) & eaop,
1307 (ULONG) sizeof(EAOP2));
1308 if (rc) {
1309 if (!silentfail) {
1310 Dos_Error(MB_ENTER,
1311 rc,
1312 HWND_DESKTOP,
1313 pszSrcFile,
1314 __LINE__,
1315 GetPString(IDS_ERRORREADEATEXT), pdena->szName);
1316 }
1317 }
1318 else {
1319 info = xmalloc(sizeof(HOLDFEA), pszSrcFile, __LINE__);
1320 if (info) {
1321 // 05 Jul 07 SHL was one short
1322 info->pfea = xmalloc(eaop.fpFEA2List->cbList - sizeof(ULONG) + 1,
1323 pszSrcFile, __LINE__);
1324 memcpy(info->pfea, eaop.fpFEA2List->list,
1325 eaop.fpFEA2List->cbList - sizeof(ULONG));
1326 info->name = info->pfea->szName;
1327 info->cbName = info->pfea->cbName;
1328 info->cbValue = info->pfea->cbValue;
1329 info->value = info->pfea->szName + info->pfea->cbName + 1;
1330 info->value[info->cbValue] = 0;
1331 info->next = NULL;
1332 if (!head)
1333 head = info;
1334 else
1335 last->next = info;
1336 last = info;
1337 }
1338 }
1339 free(pfealist);
1340 }
1341 free(pgealist);
1342 }
1343 ulEntry += ulCount;
1344 } // while
1345 free(pdena);
1346 DosPostEventSem(CompactSem);
1347 }
1348 }
1349 if (!ishandle)
1350 DosClose(handle);
1351 }
1352 else {
1353 /* try it without opening it */
1354 if (!DosQueryPathInfo(filename, FIL_QUERYEASIZE, (PVOID) & fsa4,
1355 (ULONG) sizeof(fsa4)) &&
1356 fsa4.cbList > 4)
1357 {
1358 PDENA2 pdena;
1359 EAOP2 eaop;
1360 PGEA2LIST pgealist;
1361 PFEA2LIST pfealist;
1362 PGEA2 pgea;
1363 ULONG ulEntry = 1, ulCount = 1;
1364
1365 pdena = xmalloc(65536 + 1024, pszSrcFile, __LINE__);
1366 if (pdena) {
1367 while (!DosEnumAttribute
1368 (ENUMEA_REFTYPE_PATH, filename, ulEntry, (PVOID) pdena,
1369 (ULONG) 65536, &ulCount, ENUMEA_LEVEL_NO_VALUE) && ulCount)
1370 {
1371 pgealist = xmalloc(64 + pdena->cbName, pszSrcFile, __LINE__);
1372 if (pgealist) {
1373 pgealist->cbList = 64 + pdena->cbName;
1374 pgea = pgealist->list;
1375 pgea->oNextEntryOffset = 0;
1376 pgea->cbName = pdena->cbName;
1377 memcpy(pgea->szName, pdena->szName, pdena->cbName + 1);
1378 pfealist =
1379 xmallocz(64 + pdena->cbName + pdena->cbValue, pszSrcFile,
1380 __LINE__);
1381 if (pfealist) {
1382 pfealist->cbList = 64 + pdena->cbName + pdena->cbValue;
1383 eaop.fpGEA2List = pgealist;
1384 eaop.fpFEA2List = pfealist;
1385 eaop.oError = 0;
1386 rc = DosQueryPathInfo(filename, FIL_QUERYEASFROMLIST,
1387 (PVOID) & eaop, (ULONG) sizeof(EAOP2));
1388 if (!rc) {
1389 info = xmalloc(sizeof(HOLDFEA), pszSrcFile, __LINE__);
1390 if (info) {
1391 // 29 Nov 07 GKY One short (EA search crash)
1392 info->pfea =
1393 xmalloc(eaop.fpFEA2List->cbList - sizeof(ULONG) + 1,
1394 pszSrcFile, __LINE__);
1395 memcpy(info->pfea, eaop.fpFEA2List->list,
1396 eaop.fpFEA2List->cbList - sizeof(ULONG));
1397 info->name = info->pfea->szName;
1398 info->cbName = info->pfea->cbName;
1399 info->cbValue = info->pfea->cbValue;
1400 info->value = info->pfea->szName + info->pfea->cbName + 1;
1401 info->value[info->cbValue] = 0;
1402 info->next = NULL;
1403 if (!head)
1404 head = info;
1405 else
1406 last->next = info;
1407 last = info;
1408 }
1409 else
1410 free(pfealist);
1411 }
1412 else {
1413 free(pfealist);
1414 if (!silentfail) {
1415 if (rc == ERROR_ACCESS_DENIED
1416 || rc == ERROR_SHARING_VIOLATION) {
1417 rc =
1418 saymsg(MB_ENTER | MB_CANCEL, HWND_DESKTOP,
1419 GetPString(IDS_OOPSTEXT),
1420 GetPString(IDS_CANTREADEATEXT), filename,
1421 pdena->szName);
1422 if (rc == MBID_CANCEL) {
1423 free(pgealist);
1424 break;
1425 }
1426 }
1427 else {
1428 Dos_Error(MB_ENTER,
1429 rc,
1430 HWND_DESKTOP,
1431 pszSrcFile,
1432 __LINE__,
1433 GetPString(IDS_ERRORREADEATEXT), pdena->szName);
1434 }
1435 }
1436 }
1437 }
1438 free(pgealist);
1439 }
1440 ulEntry += ulCount;
1441 } // while
1442 free(pdena);
1443 DosPostEventSem(CompactSem);
1444 }
1445 }
1446 }
1447 return head;
1448}
1449
1450VOID Free_FEAList(HOLDFEA * pFEA)
1451{
1452 /* free a linked list of HOLDFEAs */
1453
1454 register HOLDFEA *next;
1455
1456 while (pFEA) {
1457 /* Free linked list */
1458 next = pFEA->next;
1459 xfree(pFEA->pfea, pszSrcFile, __LINE__);
1460 free(pFEA);
1461 pFEA = next;
1462 }
1463 DosPostEventSem(CompactSem);
1464}
1465
1466#pragma alloc_text(EAS,DisplayEAsProc,SaveEA,HexDumpEA,CheckEA,AddEAProc)
1467#pragma alloc_text(EAS1,HexDump,GetFileEAs,Free_FEAList)
1468
Note: See TracBrowser for help on using the repository browser.