source: trunk/dll/eas.c@ 551

Last change on this file since 551 was 551, checked in by Gregg Young, 18 years ago

Indentation cleanup

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