source: trunk/dll/eas.c@ 1673

Last change on this file since 1673 was 1673, checked in by Gregg Young, 13 years ago

Update to Doxygen comment style Ticket 55. Also some minor code cleanup.

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