source: trunk/dll/eas.c@ 123

Last change on this file since 123 was 123, checked in by root, 21 years ago

Rework lstrip/rstrip usage

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