source: trunk/dll/saveclip.c@ 1844

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