source: trunk/dll/saveclip.c@ 1398

Last change on this file since 1398 was 1398, checked in by Gregg Young, 17 years ago

Move embeded strings to PCSZ variables or string table; Eliminate Error2 functions Runtime_Error with NULL format string returns "No data" error. Change declares from PSZ to PCSZ in functions where the variable isn't changed. Added btm as an executable file type in several additional places. Use fProtectOnly to prevent attempt to execute Dos and Win programs on "Protect only" installs in several additional places.

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