source: trunk/dll/saveclip.c@ 1039

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

Removed unnecessary xfrees and included fortify.h where needed; moved several misplaced (x)frees;

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