source: trunk/dll/eas.c@ 729

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

Enlarged # of chars in edit line for subject ea to be consistent with its use for storing URLs form mozilla browser downloads

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