source: trunk/dll/eas.c@ 1039

Last change on this file since 1039 was 1039, checked in by Gregg Young, 17 years ago

Removed unnecessary xfrees and included fortify.h where needed; moved several misplaced (x)frees;

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