source: trunk/dll/saveclip.c@ 1489

Last change on this file since 1489 was 1489, checked in by Gregg Young, 16 years ago

Moved clipboard shared memory back to low memory to fix pasting problem in cmd.exe and other vio windows. Ticket 416

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