source: trunk/dll/eas.c@ 847

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

Removed large file APIs from code where hey are not needed.

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