source: trunk/dll/saveclip.c@ 1193

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

Improved comment on new "#if 0" lines.

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