source: trunk/dll/saveclip.c@ 1212

Last change on this file since 1212 was 1212, checked in by John Small, 17 years ago

Ticket 187: Move data declarations/definitions out of fm3dll.h

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