source: trunk/dll/saveclip.c@ 1104

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

Replace save_dir2(dir) with strcpy(dir, pFM2SaveDirectory)

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