source: trunk/dll/saveclip.c@ 1438

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

Improved drivebar changes; Added AddBackslashToPath() to remove repeatative code. replaced "
" with PCSZ variable; ANY_OBJ added the DosAlloc... (experimental)

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