source: trunk/dll/eas.c@ 1505

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

Changes to get FM2 to compile with the latest watcom 1.9 beta (mostly type casts of CHAR CONSTANT * to CHAR *). Changes to get the environment settings working everywhere again (broken by the change that moved commands to the INI); Added an environment size variable (set to 2048 which was the largest I found hard coded). Still need to find everywhere the environment size is set and use this variable.

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