source: trunk/dll/eas.c@ 382

Last change on this file since 382 was 382, checked in by root, 19 years ago

Use RuntimeError2

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