source: trunk/dll/saveclip.c@ 1570

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

Changes to fopen and _fsopen to allow FM2 to be loaded in high memory

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