source: trunk/dll/eas.c@ 2

Last change on this file since 2 was 2, checked in by root, 23 years ago

Initial revision

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