source: trunk/dll/saveclip.c@ 1082

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

Changes so FM2 will use TMP/TEMP directory for all temp files; Replaced save_dir2 with global variable so BldFullPathName could easily replace code that performed the same function; Added #ifdef FORTIFY to free_ function that are only used when fortified.

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