source: trunk/dll/saveclip.c@ 1627

Last change on this file since 1627 was 1627, checked in by Gregg Young, 14 years ago

Add a low mem version of xDosAlloc* wrappers; move error checking into all the xDosAlloc* wrappers. Ticket 471

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 27.2 KB
Line 
1
2/***********************************************************************
3
4 $Id: saveclip.c 1627 2011-08-26 21:48:06Z gyoung $
5
6 Save file list to clipboard
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2005, 2008 Steven H. Levine
10
11 12 Feb 03 SHL SaveListDlgProc: standardize EA math
12 01 Aug 04 SHL Rework lstrip/rstrip usage
13 01 Aug 04 SHL Rework fixup usage
14 24 May 05 SHL Rework for CNRITEM.szSubject
15 17 Jul 06 SHL Use Runtime_Error
16 29 Jul 06 SHL Use xfgets
17 22 Mar 07 GKY Use QWL_USER
18 06 Aug 07 GKY Increase Subject EA to 1024
19 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
20 27 Sep 07 SHL Correct ULONGLONG size formatting
21 16 Nov 07 SHL Ensure fixup buffer sufficiently large
22 30 Dec 07 GKY Use CommaFmtULL
23 16 Feb 08 GKY Changed _fsopen flag so a new list file can be created
24 19 Jul 08 GKY Replace save_dir2(dir) with pFM2SaveDirectory and use BldFullPathName
25 20 Jul 08 GKY Modify ListtoClipHab to provide either fullpath name or filename for save to clipboard
26 24 Aug 08 GKY Warn full drive on save of .DAT file; prevent loss of existing file
27 07 Feb 09 GKY Add *DateFormat functions to format dates based on locale
28 07 Feb 09 GKY Allow user to turn off alert and/or error beeps in settings notebook.
29 07 Feb 09 GKY Move repeated strings to PCSZs.
30 08 Mar 09 GKY Renamed commafmt.h i18nutil.h
31 08 Mar 09 GKY Removed variable aurguments from docopyf and unlinkf (not used)
32 12 Jul 09 GKY Add xDosQueryAppType and xDosAlloc... to allow FM/2 to load in high memory
33 29 May 10 GKY Fix SaveListDlgProc to append to a file when Append checkbox is selected
34 26 Aug 11 GKY Add a low mem version of xDosAlloc* wrappers; move error checking into all the
35 xDosAlloc* wrappers.
36
37***********************************************************************/
38
39#include <stdlib.h>
40#include <string.h>
41#include <share.h>
42
43#define INCL_WIN
44#define INCL_LONGLONG
45
46#include "fm3dll.h"
47#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
48#include "arccnrs.h" // Data declaration(s)
49#include "notebook.h" // Data declaration(s)
50#include "init.h" // Data declaration(s)
51#include "fm3dlg.h"
52#include "fm3str.h"
53#include "saveclip.h"
54#include "makelist.h" // AddToList
55#include "errutil.h" // Dos_Error...
56#include "strutil.h" // GetPString
57#include "pathutil.h" // BldFullPathName
58#include "literal.h" // fixup
59#include "subj.h" // Subject
60#include "getnames.h" // export_filename
61#include "copyf.h" // unlinkf
62#include "wrappers.h" // xfgets
63#include "strips.h" // bstrip
64#include "misc.h" // CheckDriveSpaceAvail
65#include "i18nutil.h" // CommaFmtULL
66#include "valid.h" // IsRoot
67#include "dirs.h" // save_dir2
68#include "fortify.h"
69
70static PSZ pszSrcFile = __FILE__;
71
72//static VOID ListToClipboard(HWND hwnd, CHAR ** list, ULONG append);
73
74static CHAR **ListFromClipboardHab(HAB hab);
75static BOOL SaveToClipHab(HAB hab, CHAR * text, BOOL append);
76
77#define MAX_PATTERN_BYTES 80
78
79BOOL SaveToClip(HWND hwnd, CHAR * text, BOOL append)
80{
81 HAB hab = WinQueryAnchorBlock(hwnd);
82
83 return SaveToClipHab(hab, text, append);
84}
85
86BOOL SaveToClipHab(HAB hab, CHAR * text, BOOL append)
87{
88 CHAR *clip = NULL, *hold = NULL, *p;
89 ULONG len;
90 BOOL ret = FALSE;
91
92 if (text) {
93 len = strlen(text);
94 p = text;
95 while (*p) {
96 if (*p == '\n' && (p == text || *(p - 1) != '\r'))
97 len++;
98 p++;
99 }
100 if (len) {
101 if (WinOpenClipbrd(hab)) {
102 if (append)
103 clip = (CHAR *)WinQueryClipbrdData(hab, CF_TEXT);
104 if (clip)
105 len += strlen(clip) + 1;
106 if (!xDosAllocSharedMem((PPVOID) &hold, (PSZ) NULL, len, PAG_COMMIT |
107 OBJ_GIVEABLE | PAG_READ | PAG_WRITE, __FILE__, __LINE__)) {
108 *hold = 0;
109 if (clip)
110 strcpy(hold, clip);
111 p = hold + strlen(hold);
112 strcpy(p, text);
113 while (*p) {
114 if (*p == '\n' && (p == hold || *(p - 1) != '\r')) {
115 memmove(p + 1, p, strlen(p) + 1);
116 *p = '\r';
117 }
118 p++;
119 }
120 WinEmptyClipbrd(hab);
121 if (!WinSetClipbrdData(hab, (ULONG) hold, CF_TEXT, CFI_POINTER))
122 DosFreeMem(hold);
123 else
124 ret = TRUE;
125 }
126 WinCloseClipbrd(hab);
127 }
128 }
129 }
130 return ret;
131}
132
133#if 0 // JBS 11 Sep 08
134VOID ListToClipboard(HWND hwnd, CHAR ** list, ULONG append)
135{
136 HAB hab = WinQueryAnchorBlock(hwnd);
137
138 ListToClipboardHab(hab, list, append);
139}
140#endif
141
142VOID ListToClipboardHab(HAB hab, CHAR ** list, ULONG append)
143{
144 CHAR *text = NULL, **clip = NULL, *p = NULL, temp[CCHMAXPATH];
145 INT x;
146 ULONG len = 0;
147
148 if (list && list[0]) {
149 for (x = 0; list[x]; x++) {
150 if (append == IDM_SAVETOCLIPFILENAME ||
151 append == IDM_APPENDTOCLIPFILENAME) {
152 p = strrchr(list[x], '\\');
153 if (p) {
154 p++;
155 strcpy(temp, p);
156 free(list[x]);
157 list[x] = xstrdup(temp, __FILE__, __LINE__);
158 }
159 }
160 len += strlen(list[x]) + 2;
161 }
162 if (len)
163 len++;
164 if (len) {
165 if (append == IDM_APPENDTOCLIP ||
166 append == IDM_APPENDTOCLIP2 ||
167 append == IDM_APPENDTOCLIPFILENAME)
168 clip = ListFromClipboardHab(hab);
169 if (clip && clip[0]) {
170 for (x = 0; clip[x]; x++)
171 len += strlen(clip[x]) + 2;
172 len++;
173 }
174 if (WinOpenClipbrd(hab)) {
175 if (!DosAllocSharedMem((PPVOID) &text, (PSZ) NULL, len, PAG_COMMIT |
176 OBJ_GIVEABLE | PAG_READ | PAG_WRITE)) {
177 *text = 0;
178 if (clip && clip[0]) {
179 for (x = 0; clip[x]; x++) {
180 strcat(text, clip[x]);
181 strcat(text, "\r\n");
182 }
183 }
184 for (x = 0; list[x]; x++) {
185 strcat(text, list[x]);
186 strcat(text, "\r\n");
187 }
188 text[strlen(text) - 2] = 0;
189 WinEmptyClipbrd(hab);
190 if (!WinSetClipbrdData(hab, (ULONG) text, CF_TEXT, CFI_POINTER))
191 DosFreeMem(text);
192 }
193 WinCloseClipbrd(hab);
194 }
195 if (clip)
196 FreeList(clip);
197 }
198 }
199}
200
201CHAR **ListFromClipboard(HWND hwnd)
202{
203 HAB hab = WinQueryAnchorBlock(hwnd);
204
205 return ListFromClipboardHab(hab);
206}
207
208CHAR **ListFromClipboardHab(HAB hab)
209{
210 CHAR *p, *pp, *text = NULL, **list = NULL;
211 UINT numfiles = 0, numalloced = 0;
212
213 if (WinOpenClipbrd(hab)) {
214 p = (CHAR *)WinQueryClipbrdData(hab, CF_TEXT);
215 if (p && *p)
216 text = xstrdup(p, pszSrcFile, __LINE__);
217 WinCloseClipbrd(hab);
218 if (text) {
219 bstrip(text);
220 pp = text;
221 p = strchr(pp, '\r');
222 if (!p)
223 p = strchr(pp, '\n');
224 while (p && *p) {
225 *p = 0;
226 p++;
227 while (*p == '\r' || *p == '\n' || *p == ' ' || *p == '\t')
228 p++;
229 rstrip(pp);
230 if (*pp) {
231 if (AddToList(pp, &list, &numfiles, &numalloced))
232 break;
233 }
234 pp = p;
235 p = strchr(pp, '\r');
236 if (!p)
237 p = strchr(pp, '\n');
238 }
239 free(text);
240 }
241 }
242 return list;
243}
244
245MRESULT EXPENTRY SaveListDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
246{
247 HWND hwndCnr;
248 CHAR savename[CCHMAXPATH] = "";
249 CHAR pattern[81];
250
251 switch (msg) {
252 case WM_INITDLG:
253 if (!mp2) {
254 Runtime_Error(pszSrcFile, __LINE__, NULL);
255 WinDismissDlg(hwnd, 0);
256 }
257 else {
258 WinSetWindowPtr(hwnd, QWL_USER, mp2);
259 hwndCnr = *(HWND *) mp2;
260 WinSendDlgItemMsg(hwnd,
261 SAV_FILENAME,
262 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
263 WinSendDlgItemMsg(hwnd,
264 SAV_PATTERN,
265 EM_SETTEXTLIMIT, MPFROM2SHORT(80, 0), MPVOID);
266 *savename = *pattern = 0;
267 {
268 ULONG size;
269
270 size = CCHMAXPATH;
271 PrfQueryProfileData(fmprof,
272 appname, "SaveToListName", savename, &size);
273 size = MAX_PATTERN_BYTES + 1;
274 PrfQueryProfileData(fmprof,
275 appname, "SaveToListPattern", pattern, &size);
276 }
277 WinSetDlgItemText(hwnd, SAV_FILENAME, savename);
278 if (!*pattern)
279 strcpy(pattern, "%F %s");
280 {
281 CHAR temp[MAX_PATTERN_BYTES * 4 + 1];
282
283 fixup(pattern, temp, sizeof(temp), strlen(pattern));
284 WinSetDlgItemText(hwnd, SAV_PATTERN, temp);
285 }
286 {
287 FILE *fp;
288 CHAR s[CCHMAXPATH + 14];
289 CHAR *moder = "r";
290
291 BldFullPathName(s, pFM2SaveDirectory, PCSZ_PATTERNSDAT);
292 fp = xfsopen(s, moder, SH_DENYWR, pszSrcFile, __LINE__, TRUE);
293 if (fp) {
294 while (xfgets(s, 81, fp, pszSrcFile, __LINE__)) {
295 stripcr(s);
296 if (*s && *s != ';')
297 WinSendMsg(WinWindowFromID(hwnd, SAV_LISTBOX), LM_INSERTITEM,
298 MPFROM2SHORT(LIT_SORTASCENDING, 0), MPFROMP(s));
299 }
300 fclose(fp);
301 }
302 if (!WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_QUERYITEMCOUNT,
303 MPVOID, MPVOID))
304 WinEnableWindow(WinWindowFromID(hwnd, SAV_LISTBOX), FALSE);
305 }
306 }
307 break;
308
309 case UM_SETDIR:
310 {
311 SHORT sSelect, sMax;
312 CHAR szBuffer[CCHMAXPATH + 14];
313 FILE *fp;
314 CHAR *modew = "w";
315
316 sMax = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
317 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
318 if (sMax > 0) {
319 BldFullPathName(szBuffer, pFM2SaveDirectory, PCSZ_PATTERNSDAT);
320 if (CheckDriveSpaceAvail(szBuffer, ullDATFileSpaceNeeded, 1) == 2)
321 break; //already gave error msg
322 fp = xfopen(szBuffer, modew, pszSrcFile, __LINE__, FALSE);
323 if (fp) {
324 fputs(GetPString(IDS_LISTPATTERNTEXT), fp);
325 for (sSelect = 0; sSelect < sMax; sSelect++) {
326 *szBuffer = 0;
327 WinSendDlgItemMsg(hwnd,
328 SAV_LISTBOX,
329 LM_QUERYITEMTEXT,
330 MPFROM2SHORT(sSelect, 81), MPFROMP(szBuffer));
331 if (*szBuffer)
332 fprintf(fp, "%s\n", szBuffer);
333 }
334 fclose(fp);
335 }
336 }
337 else if (!sMax) {
338 BldFullPathName(szBuffer, pFM2SaveDirectory, PCSZ_PATTERNSDAT);
339 unlinkf(szBuffer);
340 }
341 }
342 return 0;
343
344 case WM_CONTROL:
345 if (SHORT1FROMMP(mp1) == SAV_LISTBOX) {
346
347 SHORT sSelect;
348 CHAR szBuffer[81];
349
350 switch (SHORT2FROMMP(mp1)) {
351 case LN_SELECT:
352 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
353 LM_QUERYSELECTION,
354 MPFROMSHORT(LIT_FIRST), MPVOID);
355 if (sSelect >= 0) {
356 *szBuffer = 0;
357 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_QUERYITEMTEXT,
358 MPFROM2SHORT(sSelect, 81), MPFROMP(szBuffer));
359 if (*szBuffer)
360 WinSetDlgItemText(hwnd, SAV_PATTERN, szBuffer);
361 }
362 break;
363
364 case LN_ENTER:
365 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
366 break;
367 }
368 }
369 return 0;
370
371 case WM_COMMAND:
372 hwndCnr = *(HWND *) INSTDATA(hwnd);
373 switch (SHORT1FROMMP(mp1)) {
374 case DID_CANCEL:
375 WinDismissDlg(hwnd, 0);
376 break;
377
378 case IDM_HELP:
379 if (hwndHelp)
380 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
381 MPFROM2SHORT(HELP_SAVETOLIST, 0),
382 MPFROMSHORT(HM_RESOURCEID));
383 break;
384
385 case SAV_FIND:
386 {
387 *savename = 0;
388 WinQueryDlgItemText(hwnd, SAV_FILENAME, CCHMAXPATH, savename);
389 if (!*savename)
390 strcpy(savename, PCSZ_STARDOTLST);
391 if (export_filename(hwnd, savename, 1) && *savename) {
392 if (!strchr(savename, '.'))
393 strcat(savename, PCSZ_DOTLST);
394 WinSetDlgItemText(hwnd, SAV_FILENAME, savename);
395 }
396 }
397 break;
398
399 case SAV_ADD:
400 case SAV_DEL:
401 case DID_OK:
402 WinEnableWindow(hwnd, FALSE);
403 {
404 PCNRITEM pci;
405 FILE *fp;
406 CHAR *p, *pp, temp;
407 CHAR szCmmaFmtFileSize[81];
408 INT attribute = CRA_CURSORED;
409 SHORT sSelect;
410
411 *pattern = 0;
412 WinQueryDlgItemText(hwnd, SAV_PATTERN, 80, pattern);
413 if (!*pattern) {
414 WinEnableWindow(hwnd, TRUE);
415 if (!fAlertBeepOff)
416 DosBeep(150, 100);
417 break;
418 }
419 {
420 switch (SHORT1FROMMP(mp1)) {
421 case SAV_ADD:
422 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
423 LM_SEARCHSTRING,
424 MPFROM2SHORT(0, LIT_FIRST),
425 MPFROMP(pattern));
426 if (sSelect < 0) {
427 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_INSERTITEM,
428 MPFROM2SHORT(LIT_SORTASCENDING, 0),
429 MPFROMP(pattern));
430 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
431 }
432 WinEnableWindow(hwnd, TRUE);
433 return 0;
434
435 case SAV_DEL:
436 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
437 LM_QUERYSELECTION,
438 MPFROM2SHORT(LIT_FIRST, 0),
439 MPVOID);
440 if (sSelect >= 0) {
441 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_DELETEITEM,
442 MPFROM2SHORT(sSelect, 0), MPVOID);
443 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
444 }
445 WinEnableWindow(hwnd, TRUE);
446 return 0;
447 }
448 }
449 literal(pattern);
450 if (!*pattern) {
451 WinEnableWindow(hwnd, TRUE);
452 if (!fAlertBeepOff)
453 DosBeep(250, 100);
454 break;
455 }
456 PrfWriteProfileString(fmprof, appname, "SaveToListPattern", pattern);
457 *savename = 0;
458 WinQueryDlgItemText(hwnd, SAV_FILENAME, CCHMAXPATH, savename);
459 bstrip(savename);
460 if (!*savename) {
461 WinEnableWindow(hwnd, TRUE);
462 if (!fAlertBeepOff)
463 DosBeep(100, 100);
464 break;
465 }
466 if (stricmp(savename, "PRN") &&
467 strnicmp(savename, "\\DEV\\LPT", 8) && !strchr(savename, '.'))
468 strcat(savename, PCSZ_DOTLST);
469 PrfWriteProfileString(fmprof, appname, "SaveToListName", savename);
470 pci = (PCNRITEM) WinSendMsg(hwndCnr,
471 CM_QUERYRECORDEMPHASIS,
472 MPFROMLONG(CMA_FIRST),
473 MPFROMSHORT(attribute));
474 if (pci && (INT) pci != -1) {
475 if (pci->rc.flRecordAttr & CRA_SELECTED) {
476 attribute = CRA_SELECTED;
477 pci = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS,
478 MPFROMLONG(CMA_FIRST), MPFROMSHORT(attribute));
479 }
480 }
481 if (!pci || (INT) pci == -1)
482 Runtime_Error(pszSrcFile, __LINE__, NULL);
483 else {
484 CHAR *moder = "r+";
485
486 fp = xfsopen(savename, moder, SH_DENYWR, pszSrcFile, __LINE__, FALSE);
487 if (fp) {
488 fseek(fp, 0, SEEK_SET);
489 if (WinQueryButtonCheckstate(hwnd, SAV_APPEND) == 0)
490 DosSetFileSize((HFILE) fileno(fp), 0);
491 else
492 fseek(fp, 0, SEEK_END);
493 while (pci && (INT) pci != -1) {
494 if (!(pci->rc.flRecordAttr & CRA_FILTERED)) {
495 p = pattern;
496 while (*p) {
497 if (*p == '%') {
498 p++;
499 switch (*p) {
500 case 's':
501 fputs(pci->pszSubject, fp);
502 break;
503 case 'S':
504 fprintf(fp, "%-40s", pci->pszSubject);
505 break;
506 case 'Z':
507 CommaFmtULL(szCmmaFmtFileSize,
508 sizeof(szCmmaFmtFileSize), pci->cbFile, ' ');
509 fprintf(fp, "%-13s", szCmmaFmtFileSize);
510 break;
511 case 'z':
512 CommaFmtULL(szCmmaFmtFileSize,
513 sizeof(szCmmaFmtFileSize), pci->cbFile, ' ');
514 fprintf(fp, "%s", szCmmaFmtFileSize);
515 break;
516 case 'E':
517 fprintf(fp, "%-5u", pci->easize);
518 break;
519 case 'e':
520 fprintf(fp, "%u", pci->easize);
521 break;
522 case 'd':
523 case 'D':
524 {
525 CHAR szDate[DATE_BUF_BYTES];
526
527 DateFormat(szDate, pci->date);
528 fprintf(fp,"%s", szDate);
529 break;
530 }
531 case 't':
532 case 'T':
533 fprintf(fp,
534 "%02u%s%02u%s%02u",
535 pci->time.hours, TimeSeparator,
536 pci->time.minutes, TimeSeparator, pci->time.seconds);
537 break;
538 case 'l':
539 fputs(pci->pszLongName, fp);
540 break;
541 case 'L':
542 fprintf(fp, "%-40s", pci->pszLongName);
543 break;
544 case 'F':
545 case 'f':
546 if (IsRoot(pci->pszFileName))
547 pp = pci->pszFileName;
548 else {
549 pp = strrchr(pci->pszFileName, '\\');
550 if (pp)
551 pp++;
552 else
553 pp = pci->pszFileName;
554 }
555 if (*p == 'F')
556 fprintf(fp, "%-13s", pp);
557 else
558 fputs(pp, fp);
559 break;
560 case 'p':
561 fputs(pci->pszFileName, fp);
562 break;
563 case 'P':
564 temp = 0;
565 if (!IsRoot(pci->pszFileName)) {
566 pp = strrchr(pci->pszFileName, '\\');
567 if (pp) {
568 temp = *pp;
569 *pp = 0;
570 }
571 }
572 fputs(pci->pszFileName, fp);
573 if (temp)
574 *pp = temp;
575 break;
576 case '$':
577 fputc(*pci->pszFileName, fp);
578 break;
579 case '%':
580 fputc('%', fp);
581 break;
582 }
583 }
584 else
585 fputc(*p, fp);
586 p++;
587 }
588 fputs("\n", fp);
589 }
590 pci = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, MPFROMP(pci),
591 MPFROMSHORT(attribute));
592 }
593 fclose(fp);
594 }
595 }
596 }
597 WinEnableWindow(hwnd, TRUE);
598 WinDismissDlg(hwnd, 1);
599 break;
600 }
601 return 0;
602 }
603 return WinDefDlgProc(hwnd, msg, mp1, mp2);
604}
605
606MRESULT EXPENTRY SaveAllListDlgProc(HWND hwnd, ULONG msg, MPARAM mp1,
607 MPARAM mp2)
608{
609
610 CHAR **list;
611 CHAR savename[CCHMAXPATH] = "";
612 CHAR pattern[81];
613
614 switch (msg) {
615 case WM_INITDLG:
616 if (!mp2) {
617 Runtime_Error(pszSrcFile, __LINE__, NULL);
618 WinDismissDlg(hwnd, 0);
619 }
620 else {
621 WinSetWindowPtr(hwnd, QWL_USER, mp2);
622 list = (CHAR **) mp2;
623 WinSendDlgItemMsg(hwnd,
624 SAV_FILENAME,
625 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
626 WinSendDlgItemMsg(hwnd,
627 SAV_PATTERN,
628 EM_SETTEXTLIMIT, MPFROM2SHORT(80, 0), MPVOID);
629 *savename = *pattern = 0;
630 {
631 ULONG size;
632
633 size = CCHMAXPATH;
634 PrfQueryProfileData(fmprof,
635 appname, "SaveToListName", savename, &size);
636 size = MAX_PATTERN_BYTES + 1;
637 PrfQueryProfileData(fmprof,
638 appname, "SaveToListPattern", pattern, &size);
639 }
640 WinSetDlgItemText(hwnd, SAV_FILENAME, savename);
641 if (!*pattern)
642 strcpy(pattern, "%F %s");
643 {
644 CHAR temp[MAX_PATTERN_BYTES * 4 + 1];
645
646 fixup(pattern, temp, sizeof(temp), strlen(pattern));
647 WinSetDlgItemText(hwnd, SAV_PATTERN, temp);
648 }
649 {
650 FILE *fp;
651 CHAR s[CCHMAXPATH + 14];
652 CHAR *moder = "r";
653
654 BldFullPathName(s, pFM2SaveDirectory, PCSZ_PATTERNSDAT);
655 fp = xfsopen(s, moder, SH_DENYWR, pszSrcFile, __LINE__, TRUE);
656 if (fp) {
657 while (xfgets(s, 81, fp, pszSrcFile, __LINE__)) {
658 stripcr(s);
659 if (*s && *s != ';')
660 WinSendMsg(WinWindowFromID(hwnd, SAV_LISTBOX), LM_INSERTITEM,
661 MPFROM2SHORT(LIT_SORTASCENDING, 0), MPFROMP(s));
662 }
663 fclose(fp);
664 }
665 if (!WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_QUERYITEMCOUNT,
666 MPVOID, MPVOID))
667 WinEnableWindow(WinWindowFromID(hwnd, SAV_LISTBOX), FALSE);
668 }
669 }
670 break;
671
672 case UM_SETDIR:
673 {
674 SHORT sSelect, sMax;
675 CHAR szBuffer[CCHMAXPATH + 14];
676 FILE *fp;
677 CHAR *modew = "w";
678
679 sMax = (SHORT) WinSendDlgItemMsg(hwnd,
680 SAV_LISTBOX,
681 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
682 if (sMax > 0) {
683 BldFullPathName(szBuffer, pFM2SaveDirectory, PCSZ_PATTERNSDAT);
684 if (CheckDriveSpaceAvail(szBuffer, ullDATFileSpaceNeeded, 1) == 2)
685 break; //already gave error msg
686 fp = xfopen(szBuffer, modew, pszSrcFile, __LINE__, FALSE);
687 if (fp) {
688 fputs(GetPString(IDS_LISTPATTERNTEXT), fp);
689 for (sSelect = 0; sSelect < sMax; sSelect++) {
690 *szBuffer = 0;
691 WinSendDlgItemMsg(hwnd,
692 SAV_LISTBOX,
693 LM_QUERYITEMTEXT,
694 MPFROM2SHORT(sSelect, 81), MPFROMP(szBuffer));
695 if (*szBuffer)
696 fprintf(fp, "%s\n", szBuffer);
697 }
698 fclose(fp);
699 }
700 }
701 else if (!sMax) {
702 BldFullPathName(szBuffer, pFM2SaveDirectory, PCSZ_PATTERNSDAT);
703 unlinkf(szBuffer);
704 }
705 }
706 return 0;
707
708 case WM_CONTROL:
709 if (SHORT1FROMMP(mp1) == SAV_LISTBOX) {
710
711 SHORT sSelect;
712 CHAR szBuffer[81];
713
714 switch (SHORT2FROMMP(mp1)) {
715 case LN_SELECT:
716 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
717 LM_QUERYSELECTION,
718 MPFROMSHORT(LIT_FIRST), MPVOID);
719 if (sSelect >= 0) {
720 *szBuffer = 0;
721 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_QUERYITEMTEXT,
722 MPFROM2SHORT(sSelect, 81), MPFROMP(szBuffer));
723 if (*szBuffer)
724 WinSetDlgItemText(hwnd, SAV_PATTERN, szBuffer);
725 }
726 break;
727
728 case LN_ENTER:
729 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
730 break;
731 }
732 }
733 return 0;
734
735 case WM_COMMAND:
736 list = (CHAR **) INSTDATA(hwnd);
737 switch (SHORT1FROMMP(mp1)) {
738 case DID_CANCEL:
739 WinDismissDlg(hwnd, 0);
740 break;
741
742 case IDM_HELP:
743 if (hwndHelp)
744 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
745 MPFROM2SHORT(HELP_SAVETOLIST, 0),
746 MPFROMSHORT(HM_RESOURCEID));
747 break;
748
749 case SAV_FIND:
750 {
751 *savename = 0;
752 WinQueryDlgItemText(hwnd, SAV_FILENAME, CCHMAXPATH, savename);
753 if (!*savename)
754 strcpy(savename, PCSZ_STARDOTLST);
755 if (export_filename(hwnd, savename, 1) && *savename) {
756 if (!strchr(savename, '.'))
757 strcat(savename, PCSZ_DOTLST);
758 WinSetDlgItemText(hwnd, SAV_FILENAME, savename);
759 }
760 }
761 break;
762
763 case SAV_ADD:
764 case SAV_DEL:
765 case DID_OK:
766 WinEnableWindow(hwnd, FALSE);
767 {
768 FILE *fp;
769 CHAR *p, *pp, temp;
770 INT x = 0;
771 SHORT sSelect;
772 FILEFINDBUF4L ffb4;
773 ULONG nm;
774 HDIR hdir;
775 CHAR longname[CCHMAXPATH], subject[1024];
776
777 *pattern = 0;
778 WinQueryDlgItemText(hwnd, SAV_PATTERN, 80, pattern);
779 if (!*pattern) {
780 WinEnableWindow(hwnd, TRUE);
781 if (!fAlertBeepOff)
782 DosBeep(150, 100);
783 break;
784 }
785 {
786 switch (SHORT1FROMMP(mp1)) {
787 case SAV_ADD:
788 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
789 LM_SEARCHSTRING,
790 MPFROM2SHORT(0, LIT_FIRST),
791 MPFROMP(pattern));
792 if (sSelect < 0) {
793 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_INSERTITEM,
794 MPFROM2SHORT(LIT_SORTASCENDING, 0),
795 MPFROMP(pattern));
796 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
797 }
798 WinEnableWindow(hwnd, TRUE);
799 return 0;
800
801 case SAV_DEL:
802 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
803 LM_QUERYSELECTION,
804 MPFROM2SHORT(LIT_FIRST, 0),
805 MPVOID);
806 if (sSelect >= 0) {
807 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_DELETEITEM,
808 MPFROM2SHORT(sSelect, 0), MPVOID);
809 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
810 }
811 WinEnableWindow(hwnd, TRUE);
812 return 0;
813 }
814 }
815 literal(pattern);
816 if (!*pattern) {
817 WinEnableWindow(hwnd, TRUE);
818 if (!fAlertBeepOff)
819 DosBeep(250, 100);
820 break;
821 }
822 PrfWriteProfileString(fmprof, appname, "SaveToListPattern", pattern);
823 *savename = 0;
824 WinQueryDlgItemText(hwnd, SAV_FILENAME, CCHMAXPATH, savename);
825 bstrip(savename);
826 if (!*savename) {
827 WinEnableWindow(hwnd, TRUE);
828 if (!fAlertBeepOff)
829 DosBeep(100, 100);
830 break;
831 }
832 if (stricmp(savename, "PRN") &&
833 strnicmp(savename, "\\DEV\\LPT", 8) && !strchr(savename, '.'))
834 strcat(savename, PCSZ_DOTLST);
835 PrfWriteProfileString(fmprof, appname, "SaveToListName", savename);
836 if (!list || !list[0])
837 Runtime_Error(pszSrcFile, __LINE__, NULL);
838 else {
839 CHAR *moder = "r+";
840 fp = xfsopen(savename, moder, SH_DENYWR, pszSrcFile, __LINE__, FALSE);
841 if (fp) {
842 fseek(fp, 0, SEEK_SET);
843 if (WinQueryButtonCheckstate(hwnd, SAV_APPEND) == 0)
844 DosSetFileSize((HFILE) fileno(fp), 0);
845 else
846 fseek(fp, 0, SEEK_END);
847 while (list[x]) {
848 hdir = HDIR_CREATE;
849 nm = 1;
850 *subject = *longname = 0;
851 if (!xDosFindFirst(list[x], &hdir,
852 FILE_NORMAL | FILE_DIRECTORY |
853 FILE_READONLY | FILE_ARCHIVED |
854 FILE_HIDDEN | FILE_SYSTEM,
855 &ffb4, sizeof(ffb4), &nm, FIL_QUERYEASIZEL)) {
856 /* load the object's Subject, if required */
857 if (ffb4.cbList > 4) {
858 APIRET rc;
859 EAOP2 eaop;
860 PGEA2LIST pgealist;
861 PFEA2LIST pfealist;
862 PGEA2 pgea;
863 PFEA2 pfea;
864 CHAR *value;
865
866 pgealist =
867 xmallocz(sizeof(GEA2LIST) + 64, pszSrcFile, __LINE__);
868 if (pgealist) {
869 pgea = &pgealist->list[0];
870 strcpy(pgea->szName, SUBJECT);
871 pgea->cbName = strlen(pgea->szName);
872 pgea->oNextEntryOffset = 0;
873 pgealist->cbList = sizeof(GEA2LIST) + pgea->cbName;
874 pfealist = xmallocz(1024, pszSrcFile, __LINE__);
875 if (pfealist) {
876 pfealist->cbList = 1024;
877 eaop.fpGEA2List = pgealist;
878 eaop.fpFEA2List = pfealist;
879 eaop.oError = 0;
880 rc = DosQueryPathInfo(list[x],
881 FIL_QUERYEASFROMLIST,
882 (PVOID) & eaop,
883 (ULONG) sizeof(EAOP2));
884 if (!rc) {
885 pfea = &eaop.fpFEA2List->list[0];
886 value = pfea->szName + pfea->cbName + 1;
887 value[pfea->cbValue] = 0;
888 if (*(USHORT *) value == EAT_ASCII)
889 strncpy(subject, value + (sizeof(USHORT) * 2), 1023);
890 subject[1023] = 0;
891 }
892 free(pfealist);
893 }
894 free(pgealist);
895 }
896 }
897 /* load the object's longname */
898 if (ffb4.cbList > 4) {
899 APIRET rc;
900 EAOP2 eaop;
901 PGEA2LIST pgealist;
902 PFEA2LIST pfealist;
903 PGEA2 pgea;
904 PFEA2 pfea;
905 CHAR *value;
906
907
908 pgealist =
909 xmallocz(sizeof(GEA2LIST) + 64, pszSrcFile, __LINE__);
910 if (pgealist) {
911 pgea = &pgealist->list[0];
912 strcpy(pgea->szName, LONGNAME);
913 pgea->cbName = strlen(pgea->szName);
914 pgea->oNextEntryOffset = 0;
915 pgealist->cbList = sizeof(GEA2LIST) + pgea->cbName;
916 pfealist = xmallocz(1024, pszSrcFile, __LINE__);
917 if (pfealist) {
918 pfealist->cbList = 1024;
919 eaop.fpGEA2List = pgealist;
920 eaop.fpFEA2List = pfealist;
921 eaop.oError = 0L;
922 rc = DosQueryPathInfo(list[x],
923 FIL_QUERYEASFROMLIST,
924 (PVOID) & eaop,
925 (ULONG) sizeof(EAOP2));
926 if (!rc) {
927 pfea = &eaop.fpFEA2List->list[0];
928 value = pfea->szName + pfea->cbName + 1;
929 value[pfea->cbValue] = 0;
930 if (*(USHORT *) value == EAT_ASCII)
931 strncpy(longname, value +
932 (sizeof(USHORT) * 2), CCHMAXPATHCOMP);
933 longname[CCHMAXPATHCOMP - 1] = 0;
934 }
935 free(pfealist);
936 }
937 free(pgealist);
938 }
939 }
940
941 p = pattern;
942 while (*p) {
943 if (*p == '%') {
944 p++;
945 switch (*p) {
946 CHAR szCmmaFmtFileSize[81];
947 case 's':
948 fputs(subject, fp);
949 break;
950 case 'S':
951 fprintf(fp, "%-40s", subject);
952 break;
953 case 'Z':
954 CommaFmtULL(szCmmaFmtFileSize,
955 sizeof(szCmmaFmtFileSize), ffb4.cbFile, ' ');
956 fprintf(fp, "%-13s", szCmmaFmtFileSize);
957 break;
958 case 'z':
959 CommaFmtULL(szCmmaFmtFileSize,
960 sizeof(szCmmaFmtFileSize), ffb4.cbFile, ' ');
961 fprintf(fp, "%s", szCmmaFmtFileSize);
962 break;
963 case 'E':
964 fprintf(fp, "%-5u", CBLIST_TO_EASIZE(ffb4.cbList));
965 break;
966 case 'e':
967 fprintf(fp, "%u", CBLIST_TO_EASIZE(ffb4.cbList));
968 break;
969 case 'd':
970 case 'D':
971 {
972 CHAR szDate[DATE_BUF_BYTES];
973
974 FDateFormat(szDate, ffb4.fdateLastWrite);
975 fprintf(fp,"%s", szDate);
976 break;
977 }
978 case 't':
979 case 'T':
980 fprintf(fp,
981 "%02u%s%02u%s%02u",
982 ffb4.ftimeLastWrite.hours,
983 TimeSeparator,
984 ffb4.ftimeLastWrite.minutes,
985 TimeSeparator,
986 ffb4.ftimeLastWrite.twosecs * 2);
987 break;
988 case 'l':
989 fputs(longname, fp);
990 break;
991 case 'L':
992 fprintf(fp, "%-40s", longname);
993 break;
994 case 'F':
995 case 'f':
996 if (IsRoot(list[x]))
997 pp = list[x];
998 else {
999 pp = strrchr(list[x], '\\');
1000 if (pp)
1001 pp++;
1002 else
1003 pp = list[x];
1004 }
1005 if (*p == 'F')
1006 fprintf(fp, "%-13s", pp);
1007 else
1008 fputs(pp, fp);
1009 break;
1010 case 'p':
1011 fputs(list[x], fp);
1012 break;
1013 case 'P':
1014 temp = 0;
1015 if (!IsRoot(list[x])) {
1016 pp = strrchr(list[x], '\\');
1017 if (pp) {
1018 temp = *pp;
1019 *pp = 0;
1020 }
1021 }
1022 fputs(list[x], fp);
1023 if (temp)
1024 *pp = temp;
1025 break;
1026 case '$':
1027 fputc(*list[x], fp);
1028 break;
1029 case '%':
1030 fputc('%', fp);
1031 break;
1032 }
1033 }
1034 else
1035 fputc(*p, fp);
1036 p++;
1037 }
1038 fputs("\n", fp);
1039 DosFindClose(hdir);
1040 }
1041 x++;
1042 }
1043 fclose(fp);
1044 }
1045 }
1046 }
1047 WinEnableWindow(hwnd, TRUE);
1048 WinDismissDlg(hwnd, 1);
1049 break;
1050 }
1051 return 0;
1052 }
1053 return WinDefDlgProc(hwnd, msg, mp1, mp2);
1054}
1055
1056#pragma alloc_text(FMCLIPBOARDIN,SaveToClip,SaveToClipHab)
1057#pragma alloc_text(FMCLIPBOARDOUT,ListToClipboardHab)
1058#pragma alloc_text(FMCLIPBOARDOUT,ListFromClipboard,ListFromClipboardHab)
1059#pragma alloc_text(SAVELIST,SaveListDlgProc,SaveAllListDlgProc)
Note: See TracBrowser for help on using the repository browser.