source: trunk/dll/saveclip.c@ 957

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

Changed _fsopen flag so a new list file can be created. (ticket 222)

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