source: trunk/dll/saveclip.c@ 1525

Last change on this file since 1525 was 1525, checked in by Gregg Young, 15 years ago

Fix save list files so it appends to a file when the append checkbox is selected (ticket 436)

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