source: trunk/dll/saveclip.c@ 1036

Last change on this file since 1036 was 1009, checked in by Steven Levine, 17 years ago

Add xfree xstrdup Fortify support
Add MT capable Fortify scope logic

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