source: trunk/dll/saveclip.c@ 1158

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

Ticket 187: Draft 1: Functions only

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