source: trunk/dll/saveclip.c@ 766

Last change on this file since 766 was 766, checked in by Gregg Young, 18 years ago

format cleanup

  • 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 766 2007-08-05 20:21:20Z gyoung $
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) + 1;
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 = 0;
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, 0, SEEK_SET);
437 if (WinQueryButtonCheckstate(hwnd, SAV_APPEND) == 0)
438 DosSetFileSize((HFILE) fileno(fp), 0);
439 else
440 fseek(fp, 0, 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, 0, SEEK_SET);
786 if (WinQueryButtonCheckstate(hwnd, SAV_APPEND) == 0)
787 DosSetFileSize((HFILE) fileno(fp), 0);
788 else
789 fseek(fp, 0, 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 > 4) {
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 = 0;
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 = 0;
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 > 4) {
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 = 0;
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.