source: trunk/dll/saveclip.c@ 762

Last change on this file since 762 was 762, checked in by Steven Levine, 18 years ago

Use two pass logic to free CNRITEMs and ARCITEMs
Rename pszLongname to pszLongName
More compare directories rework
Make directory sizes item draw placement deterministic - how did it ever work?

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