source: trunk/dll/saveclip.c@ 1400

Last change on this file since 1400 was 1400, checked in by Gregg Young, 16 years ago

Remainder of changes to rename commafmt.h/c (Ticket 28, 82); Additional strings moved to PCSZs in init.c (Ticket 6); Added WriteDetailsSwitches used it and LoadDetailsSwitches to consolidate inline code (Ticket 343, 344)

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