source: trunk/dll/saveclip.c@ 1119

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

Comments for CS 1118 (Tickets 154 (not 152), 270)

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