source: trunk/dll/saveclip.c@ 1118

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

Clean up of fix for trap caused by FM/2 being on a full disk. It now preserves the data files. (Ticket 152, 271)

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 24.9 KB
Line 
1
2/***********************************************************************
3
4 $Id: saveclip.c 1118 2008-08-24 20:52:23Z 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 if (CheckDriveSpaceAvail(szBuffer, ullDATFileSpaceNeeded, 1) == 2)
285 break; //already gave error msg
286 fp = xfopen(szBuffer, "w", pszSrcFile, __LINE__);
287 if (fp) {
288 fputs(GetPString(IDS_LISTPATTERNTEXT), fp);
289 for (sSelect = 0; sSelect < sMax; sSelect++) {
290 *szBuffer = 0;
291 WinSendDlgItemMsg(hwnd,
292 SAV_LISTBOX,
293 LM_QUERYITEMTEXT,
294 MPFROM2SHORT(sSelect, 81), MPFROMP(szBuffer));
295 if (*szBuffer)
296 fprintf(fp, "%s\n", szBuffer);
297 }
298 fclose(fp);
299 }
300 }
301 else if (!sMax) {
302 BldFullPathName(szBuffer, pFM2SaveDirectory, "PATTERNS.DAT");
303 unlinkf("%s", szBuffer);
304 }
305 }
306 return 0;
307
308 case WM_CONTROL:
309 if (SHORT1FROMMP(mp1) == SAV_LISTBOX) {
310
311 SHORT sSelect;
312 CHAR szBuffer[81];
313
314 switch (SHORT2FROMMP(mp1)) {
315 case LN_SELECT:
316 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
317 LM_QUERYSELECTION,
318 MPFROMSHORT(LIT_FIRST), MPVOID);
319 if (sSelect >= 0) {
320 *szBuffer = 0;
321 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_QUERYITEMTEXT,
322 MPFROM2SHORT(sSelect, 81), MPFROMP(szBuffer));
323 if (*szBuffer)
324 WinSetDlgItemText(hwnd, SAV_PATTERN, szBuffer);
325 }
326 break;
327
328 case LN_ENTER:
329 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
330 break;
331 }
332 }
333 return 0;
334
335 case WM_COMMAND:
336 hwndCnr = *(HWND *) INSTDATA(hwnd);
337 switch (SHORT1FROMMP(mp1)) {
338 case DID_CANCEL:
339 WinDismissDlg(hwnd, 0);
340 break;
341
342 case IDM_HELP:
343 if (hwndHelp)
344 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
345 MPFROM2SHORT(HELP_SAVETOLIST, 0),
346 MPFROMSHORT(HM_RESOURCEID));
347 break;
348
349 case SAV_FIND:
350 {
351 *savename = 0;
352 WinQueryDlgItemText(hwnd, SAV_FILENAME, CCHMAXPATH, savename);
353 if (!*savename)
354 strcpy(savename, "*.LST");
355 if (export_filename(hwnd, savename, 1) && *savename) {
356 if (!strchr(savename, '.'))
357 strcat(savename, ".LST");
358 WinSetDlgItemText(hwnd, SAV_FILENAME, savename);
359 }
360 }
361 break;
362
363 case SAV_ADD:
364 case SAV_DEL:
365 case DID_OK:
366 WinEnableWindow(hwnd, FALSE);
367 {
368 PCNRITEM pci;
369 FILE *fp;
370 CHAR *p, *pp, temp;
371 CHAR szCmmaFmtFileSize[81];
372 INT attribute = CRA_CURSORED;
373 SHORT sSelect;
374
375 *pattern = 0;
376 WinQueryDlgItemText(hwnd, SAV_PATTERN, 80, pattern);
377 if (!*pattern) {
378 WinEnableWindow(hwnd, TRUE);
379 DosBeep(150, 100);
380 break;
381 }
382 {
383 switch (SHORT1FROMMP(mp1)) {
384 case SAV_ADD:
385 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
386 LM_SEARCHSTRING,
387 MPFROM2SHORT(0, LIT_FIRST),
388 MPFROMP(pattern));
389 if (sSelect < 0) {
390 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_INSERTITEM,
391 MPFROM2SHORT(LIT_SORTASCENDING, 0),
392 MPFROMP(pattern));
393 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
394 }
395 WinEnableWindow(hwnd, TRUE);
396 return 0;
397
398 case SAV_DEL:
399 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
400 LM_QUERYSELECTION,
401 MPFROM2SHORT(LIT_FIRST, 0),
402 MPVOID);
403 if (sSelect >= 0) {
404 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_DELETEITEM,
405 MPFROM2SHORT(sSelect, 0), MPVOID);
406 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
407 }
408 WinEnableWindow(hwnd, TRUE);
409 return 0;
410 }
411 }
412 literal(pattern);
413 if (!*pattern) {
414 WinEnableWindow(hwnd, TRUE);
415 DosBeep(250, 100);
416 break;
417 }
418 PrfWriteProfileString(fmprof, appname, "SaveToListPattern", pattern);
419 *savename = 0;
420 WinQueryDlgItemText(hwnd, SAV_FILENAME, CCHMAXPATH, savename);
421 bstrip(savename);
422 if (!*savename) {
423 WinEnableWindow(hwnd, TRUE);
424 DosBeep(100, 100);
425 break;
426 }
427 if (stricmp(savename, "PRN") &&
428 strnicmp(savename, "\\DEV\\LPT", 8) && !strchr(savename, '.'))
429 strcat(savename, ".LST");
430 PrfWriteProfileString(fmprof, appname, "SaveToListName", savename);
431 pci = (PCNRITEM) WinSendMsg(hwndCnr,
432 CM_QUERYRECORDEMPHASIS,
433 MPFROMLONG(CMA_FIRST),
434 MPFROMSHORT(attribute));
435 if (pci && (INT) pci != -1) {
436 if (pci->rc.flRecordAttr & CRA_SELECTED) {
437 attribute = CRA_SELECTED;
438 pci = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS,
439 MPFROMLONG(CMA_FIRST), MPFROMSHORT(attribute));
440 }
441 }
442 if (!pci || (INT) pci == -1)
443 Runtime_Error(pszSrcFile, __LINE__, "no data");
444 else {
445 fp = _fsopen(savename, "w+", SH_DENYWR);
446 if (!fp)
447 Runtime_Error(pszSrcFile, __LINE__, "_fsopen");
448 else {
449 fseek(fp, 0, SEEK_SET);
450 if (WinQueryButtonCheckstate(hwnd, SAV_APPEND) == 0)
451 DosSetFileSize((HFILE) fileno(fp), 0);
452 else
453 fseek(fp, 0, SEEK_END);
454 while (pci && (INT) pci != -1) {
455 if (!(pci->rc.flRecordAttr & CRA_FILTERED)) {
456 p = pattern;
457 while (*p) {
458 if (*p == '%') {
459 p++;
460 switch (*p) {
461 case 's':
462 fputs(pci->pszSubject, fp);
463 break;
464 case 'S':
465 fprintf(fp, "%-40s", pci->pszSubject);
466 break;
467 case 'Z':
468 CommaFmtULL(szCmmaFmtFileSize,
469 sizeof(szCmmaFmtFileSize), pci->cbFile, ' ');
470 fprintf(fp, "%-13s", szCmmaFmtFileSize);
471 break;
472 case 'z':
473 CommaFmtULL(szCmmaFmtFileSize,
474 sizeof(szCmmaFmtFileSize), pci->cbFile, ' ');
475 fprintf(fp, "%s", szCmmaFmtFileSize);
476 break;
477 case 'E':
478 fprintf(fp, "%-5u", pci->easize);
479 break;
480 case 'e':
481 fprintf(fp, "%u", pci->easize);
482 break;
483 case 'd':
484 case 'D':
485 fprintf(fp,
486 "%04u/%02u/%02u",
487 pci->date.year, pci->date.month, pci->date.day);
488 break;
489 case 't':
490 case 'T':
491 fprintf(fp,
492 "%02u:%02u:%02u",
493 pci->time.hours,
494 pci->time.minutes, pci->time.seconds);
495 break;
496 case 'l':
497 fputs(pci->pszLongName, fp);
498 break;
499 case 'L':
500 fprintf(fp, "%-40s", pci->pszLongName);
501 break;
502 case 'F':
503 case 'f':
504 if (IsRoot(pci->pszFileName))
505 pp = pci->pszFileName;
506 else {
507 pp = strrchr(pci->pszFileName, '\\');
508 if (pp)
509 pp++;
510 else
511 pp = pci->pszFileName;
512 }
513 if (*p == 'F')
514 fprintf(fp, "%-13s", pp);
515 else
516 fputs(pp, fp);
517 break;
518 case 'p':
519 fputs(pci->pszFileName, fp);
520 break;
521 case 'P':
522 temp = 0;
523 if (!IsRoot(pci->pszFileName)) {
524 pp = strrchr(pci->pszFileName, '\\');
525 if (pp) {
526 temp = *pp;
527 *pp = 0;
528 }
529 }
530 fputs(pci->pszFileName, fp);
531 if (temp)
532 *pp = temp;
533 break;
534 case '$':
535 fputc(*pci->pszFileName, fp);
536 break;
537 case '%':
538 fputc('%', fp);
539 break;
540 }
541 }
542 else
543 fputc(*p, fp);
544 p++;
545 }
546 fputs("\n", fp);
547 }
548 pci = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, MPFROMP(pci),
549 MPFROMSHORT(attribute));
550 }
551 fclose(fp);
552 }
553 }
554 }
555 WinEnableWindow(hwnd, TRUE);
556 WinDismissDlg(hwnd, 1);
557 break;
558 }
559 return 0;
560 }
561 return WinDefDlgProc(hwnd, msg, mp1, mp2);
562}
563
564MRESULT EXPENTRY SaveAllListDlgProc(HWND hwnd, ULONG msg, MPARAM mp1,
565 MPARAM mp2)
566{
567
568 CHAR **list;
569 CHAR savename[CCHMAXPATH] = "", pattern[81];
570
571 switch (msg) {
572 case WM_INITDLG:
573 if (!mp2) {
574 Runtime_Error(pszSrcFile, __LINE__, "no data");
575 WinDismissDlg(hwnd, 0);
576 }
577 else {
578 WinSetWindowPtr(hwnd, QWL_USER, mp2);
579 list = (CHAR **) mp2;
580 WinSendDlgItemMsg(hwnd,
581 SAV_FILENAME,
582 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
583 WinSendDlgItemMsg(hwnd,
584 SAV_PATTERN,
585 EM_SETTEXTLIMIT, MPFROM2SHORT(80, 0), MPVOID);
586 *savename = *pattern = 0;
587 {
588 ULONG size;
589
590 size = CCHMAXPATH;
591 PrfQueryProfileData(fmprof,
592 appname, "SaveToListName", savename, &size);
593 size = MAX_PATTERN_BYTES + 1;
594 PrfQueryProfileData(fmprof,
595 appname, "SaveToListPattern", pattern, &size);
596 }
597 WinSetDlgItemText(hwnd, SAV_FILENAME, savename);
598 if (!*pattern)
599 strcpy(pattern, "%F %s");
600 {
601 CHAR temp[MAX_PATTERN_BYTES * 4 + 1];
602
603 fixup(pattern, temp, sizeof(temp), strlen(pattern));
604 WinSetDlgItemText(hwnd, SAV_PATTERN, temp);
605 }
606 {
607 FILE *fp;
608 CHAR s[CCHMAXPATH + 14];
609
610 BldFullPathName(s, pFM2SaveDirectory, "PATTERNS.DAT");
611 fp = _fsopen(s, "r", SH_DENYWR);
612 if (fp) {
613 while (xfgets(s, 81, fp, pszSrcFile, __LINE__)) {
614 stripcr(s);
615 if (*s && *s != ';')
616 WinSendMsg(WinWindowFromID(hwnd, SAV_LISTBOX), LM_INSERTITEM,
617 MPFROM2SHORT(LIT_SORTASCENDING, 0), MPFROMP(s));
618 }
619 fclose(fp);
620 }
621 if (!WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_QUERYITEMCOUNT,
622 MPVOID, MPVOID))
623 WinEnableWindow(WinWindowFromID(hwnd, SAV_LISTBOX), FALSE);
624 }
625 }
626 break;
627
628 case UM_SETDIR:
629 {
630 SHORT sSelect, sMax;
631 CHAR szBuffer[CCHMAXPATH + 14];
632 FILE *fp;
633
634 sMax = (SHORT) WinSendDlgItemMsg(hwnd,
635 SAV_LISTBOX,
636 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
637 if (sMax > 0) {
638 BldFullPathName(szBuffer, pFM2SaveDirectory, "PATTERNS.DAT");
639 if (CheckDriveSpaceAvail(szBuffer, ullDATFileSpaceNeeded, 1) == 2)
640 break; //already gave error msg
641 fp = xfopen(szBuffer, "w", pszSrcFile, __LINE__);
642 if (fp) {
643 fputs(GetPString(IDS_LISTPATTERNTEXT), fp);
644 for (sSelect = 0; sSelect < sMax; sSelect++) {
645 *szBuffer = 0;
646 WinSendDlgItemMsg(hwnd,
647 SAV_LISTBOX,
648 LM_QUERYITEMTEXT,
649 MPFROM2SHORT(sSelect, 81), MPFROMP(szBuffer));
650 if (*szBuffer)
651 fprintf(fp, "%s\n", szBuffer);
652 }
653 fclose(fp);
654 }
655 }
656 else if (!sMax) {
657 BldFullPathName(szBuffer, pFM2SaveDirectory, "PATTERNS.DAT");
658 unlinkf("%s", szBuffer);
659 }
660 }
661 return 0;
662
663 case WM_CONTROL:
664 if (SHORT1FROMMP(mp1) == SAV_LISTBOX) {
665
666 SHORT sSelect;
667 CHAR szBuffer[81];
668
669 switch (SHORT2FROMMP(mp1)) {
670 case LN_SELECT:
671 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
672 LM_QUERYSELECTION,
673 MPFROMSHORT(LIT_FIRST), MPVOID);
674 if (sSelect >= 0) {
675 *szBuffer = 0;
676 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_QUERYITEMTEXT,
677 MPFROM2SHORT(sSelect, 81), MPFROMP(szBuffer));
678 if (*szBuffer)
679 WinSetDlgItemText(hwnd, SAV_PATTERN, szBuffer);
680 }
681 break;
682
683 case LN_ENTER:
684 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
685 break;
686 }
687 }
688 return 0;
689
690 case WM_COMMAND:
691 list = (CHAR **) INSTDATA(hwnd);
692 switch (SHORT1FROMMP(mp1)) {
693 case DID_CANCEL:
694 WinDismissDlg(hwnd, 0);
695 break;
696
697 case IDM_HELP:
698 if (hwndHelp)
699 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
700 MPFROM2SHORT(HELP_SAVETOLIST, 0),
701 MPFROMSHORT(HM_RESOURCEID));
702 break;
703
704 case SAV_FIND:
705 {
706 *savename = 0;
707 WinQueryDlgItemText(hwnd, SAV_FILENAME, CCHMAXPATH, savename);
708 if (!*savename)
709 strcpy(savename, "*.LST");
710 if (export_filename(hwnd, savename, 1) && *savename) {
711 if (!strchr(savename, '.'))
712 strcat(savename, ".LST");
713 WinSetDlgItemText(hwnd, SAV_FILENAME, savename);
714 }
715 }
716 break;
717
718 case SAV_ADD:
719 case SAV_DEL:
720 case DID_OK:
721 WinEnableWindow(hwnd, FALSE);
722 {
723 FILE *fp;
724 CHAR *p, *pp, temp;
725 INT x = 0;
726 SHORT sSelect;
727 FILEFINDBUF4L ffb4;
728 ULONG nm;
729 HDIR hdir;
730 CHAR longname[CCHMAXPATH], subject[1024];
731
732 *pattern = 0;
733 WinQueryDlgItemText(hwnd, SAV_PATTERN, 80, pattern);
734 if (!*pattern) {
735 WinEnableWindow(hwnd, TRUE);
736 DosBeep(150, 100);
737 break;
738 }
739 {
740 switch (SHORT1FROMMP(mp1)) {
741 case SAV_ADD:
742 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
743 LM_SEARCHSTRING,
744 MPFROM2SHORT(0, LIT_FIRST),
745 MPFROMP(pattern));
746 if (sSelect < 0) {
747 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_INSERTITEM,
748 MPFROM2SHORT(LIT_SORTASCENDING, 0),
749 MPFROMP(pattern));
750 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
751 }
752 WinEnableWindow(hwnd, TRUE);
753 return 0;
754
755 case SAV_DEL:
756 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
757 LM_QUERYSELECTION,
758 MPFROM2SHORT(LIT_FIRST, 0),
759 MPVOID);
760 if (sSelect >= 0) {
761 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_DELETEITEM,
762 MPFROM2SHORT(sSelect, 0), MPVOID);
763 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
764 }
765 WinEnableWindow(hwnd, TRUE);
766 return 0;
767 }
768 }
769 literal(pattern);
770 if (!*pattern) {
771 WinEnableWindow(hwnd, TRUE);
772 DosBeep(250, 100);
773 break;
774 }
775 PrfWriteProfileString(fmprof, appname, "SaveToListPattern", pattern);
776 *savename = 0;
777 WinQueryDlgItemText(hwnd, SAV_FILENAME, CCHMAXPATH, savename);
778 bstrip(savename);
779 if (!*savename) {
780 WinEnableWindow(hwnd, TRUE);
781 DosBeep(100, 100);
782 break;
783 }
784 if (stricmp(savename, "PRN") &&
785 strnicmp(savename, "\\DEV\\LPT", 8) && !strchr(savename, '.'))
786 strcat(savename, ".LST");
787 PrfWriteProfileString(fmprof, appname, "SaveToListName", savename);
788 if (!list || !list[0])
789 Runtime_Error(pszSrcFile, __LINE__, "no data");
790 else {
791 fp = _fsopen(savename, "r+", SH_DENYWR);
792 if (!fp)
793 Runtime_Error(pszSrcFile, __LINE__, "_fsopen");
794 else {
795 fseek(fp, 0, SEEK_SET);
796 if (WinQueryButtonCheckstate(hwnd, SAV_APPEND) == 0)
797 DosSetFileSize((HFILE) fileno(fp), 0);
798 else
799 fseek(fp, 0, SEEK_END);
800 while (list[x]) {
801 hdir = HDIR_CREATE;
802 nm = 1;
803 *subject = *longname = 0;
804 if (!xDosFindFirst(list[x], &hdir,
805 FILE_NORMAL | FILE_DIRECTORY |
806 FILE_READONLY | FILE_ARCHIVED |
807 FILE_HIDDEN | FILE_SYSTEM,
808 &ffb4, sizeof(ffb4), &nm, FIL_QUERYEASIZEL)) {
809 /* load the object's Subject, if required */
810 if (ffb4.cbList > 4) {
811 APIRET rc;
812 EAOP2 eaop;
813 PGEA2LIST pgealist;
814 PFEA2LIST pfealist;
815 PGEA2 pgea;
816 PFEA2 pfea;
817 CHAR *value;
818
819 pgealist =
820 xmallocz(sizeof(GEA2LIST) + 64, pszSrcFile, __LINE__);
821 if (pgealist) {
822 pgea = &pgealist->list[0];
823 strcpy(pgea->szName, SUBJECT);
824 pgea->cbName = strlen(pgea->szName);
825 pgea->oNextEntryOffset = 0;
826 pgealist->cbList = sizeof(GEA2LIST) + pgea->cbName;
827 pfealist = xmallocz(1024, pszSrcFile, __LINE__);
828 if (pfealist) {
829 pfealist->cbList = 1024;
830 eaop.fpGEA2List = pgealist;
831 eaop.fpFEA2List = pfealist;
832 eaop.oError = 0;
833 rc = DosQueryPathInfo(list[x],
834 FIL_QUERYEASFROMLIST,
835 (PVOID) & eaop,
836 (ULONG) sizeof(EAOP2));
837 if (!rc) {
838 pfea = &eaop.fpFEA2List->list[0];
839 value = pfea->szName + pfea->cbName + 1;
840 value[pfea->cbValue] = 0;
841 if (*(USHORT *) value == EAT_ASCII)
842 strncpy(subject, value + (sizeof(USHORT) * 2), 1023);
843 subject[1023] = 0;
844 }
845 free(pfealist);
846 }
847 free(pgealist);
848 }
849 }
850 /* load the object's longname */
851 if (ffb4.cbList > 4) {
852 APIRET rc;
853 EAOP2 eaop;
854 PGEA2LIST pgealist;
855 PFEA2LIST pfealist;
856 PGEA2 pgea;
857 PFEA2 pfea;
858 CHAR *value;
859
860
861 pgealist =
862 xmallocz(sizeof(GEA2LIST) + 64, pszSrcFile, __LINE__);
863 if (pgealist) {
864 pgea = &pgealist->list[0];
865 strcpy(pgea->szName, LONGNAME);
866 pgea->cbName = strlen(pgea->szName);
867 pgea->oNextEntryOffset = 0;
868 pgealist->cbList = sizeof(GEA2LIST) + pgea->cbName;
869 pfealist = xmallocz(1024, pszSrcFile, __LINE__);
870 if (pfealist) {
871 pfealist->cbList = 1024;
872 eaop.fpGEA2List = pgealist;
873 eaop.fpFEA2List = pfealist;
874 eaop.oError = 0L;
875 rc = DosQueryPathInfo(list[x],
876 FIL_QUERYEASFROMLIST,
877 (PVOID) & eaop,
878 (ULONG) sizeof(EAOP2));
879 if (!rc) {
880 pfea = &eaop.fpFEA2List->list[0];
881 value = pfea->szName + pfea->cbName + 1;
882 value[pfea->cbValue] = 0;
883 if (*(USHORT *) value == EAT_ASCII)
884 strncpy(longname, value +
885 (sizeof(USHORT) * 2), CCHMAXPATHCOMP);
886 longname[CCHMAXPATHCOMP - 1] = 0;
887 }
888 free(pfealist);
889 }
890 free(pgealist);
891 }
892 }
893
894 p = pattern;
895 while (*p) {
896 if (*p == '%') {
897 p++;
898 switch (*p) {
899 CHAR szCmmaFmtFileSize[81];
900 case 's':
901 fputs(subject, fp);
902 break;
903 case 'S':
904 fprintf(fp, "%-40s", subject);
905 break;
906 case 'Z':
907 CommaFmtULL(szCmmaFmtFileSize,
908 sizeof(szCmmaFmtFileSize), ffb4.cbFile, ' ');
909 fprintf(fp, "%-13s", szCmmaFmtFileSize);
910 break;
911 case 'z':
912 CommaFmtULL(szCmmaFmtFileSize,
913 sizeof(szCmmaFmtFileSize), ffb4.cbFile, ' ');
914 fprintf(fp, "%s", szCmmaFmtFileSize);
915 break;
916 case 'E':
917 fprintf(fp, "%-5u", CBLIST_TO_EASIZE(ffb4.cbList));
918 break;
919 case 'e':
920 fprintf(fp, "%u", CBLIST_TO_EASIZE(ffb4.cbList));
921 break;
922 case 'd':
923 case 'D':
924 fprintf(fp,
925 "%04u/%02u/%02u",
926 ffb4.fdateLastWrite.year + 1980,
927 ffb4.fdateLastWrite.month,
928 ffb4.fdateLastWrite.day);
929 break;
930 case 't':
931 case 'T':
932 fprintf(fp,
933 "%02u:%02u:%02u",
934 ffb4.ftimeLastWrite.hours,
935 ffb4.ftimeLastWrite.minutes,
936 ffb4.ftimeLastWrite.twosecs * 2);
937 break;
938 case 'l':
939 fputs(longname, fp);
940 break;
941 case 'L':
942 fprintf(fp, "%-40s", longname);
943 break;
944 case 'F':
945 case 'f':
946 if (IsRoot(list[x]))
947 pp = list[x];
948 else {
949 pp = strrchr(list[x], '\\');
950 if (pp)
951 pp++;
952 else
953 pp = list[x];
954 }
955 if (*p == 'F')
956 fprintf(fp, "%-13s", pp);
957 else
958 fputs(pp, fp);
959 break;
960 case 'p':
961 fputs(list[x], fp);
962 break;
963 case 'P':
964 temp = 0;
965 if (!IsRoot(list[x])) {
966 pp = strrchr(list[x], '\\');
967 if (pp) {
968 temp = *pp;
969 *pp = 0;
970 }
971 }
972 fputs(list[x], fp);
973 if (temp)
974 *pp = temp;
975 break;
976 case '$':
977 fputc(*list[x], fp);
978 break;
979 case '%':
980 fputc('%', fp);
981 break;
982 }
983 }
984 else
985 fputc(*p, fp);
986 p++;
987 }
988 fputs("\n", fp);
989 DosFindClose(hdir);
990 }
991 x++;
992 }
993 fclose(fp);
994 }
995 }
996 }
997 WinEnableWindow(hwnd, TRUE);
998 WinDismissDlg(hwnd, 1);
999 break;
1000 }
1001 return 0;
1002 }
1003 return WinDefDlgProc(hwnd, msg, mp1, mp2);
1004}
1005
1006#pragma alloc_text(FMCLIPBOARDIN,SaveToClip,SaveToClipHab)
1007#pragma alloc_text(FMCLIPBOARDOUT,ListToClipboard,ListToClipboardHab)
1008#pragma alloc_text(FMCLIPBOARDOUT,ListFromClipboard,ListFromClipboardHab)
1009#pragma alloc_text(SAVELIST,SaveListDlgProc,SaveAllListDlgProc)
Note: See TracBrowser for help on using the repository browser.