source: trunk/dll/saveclip.c@ 1402

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

Remove variable aurgs from docopy & unlinkf (not used); Move more strings to PCSZs and string table; Move PCSZs to compile time initialization; Fix hang on startup caused by a drive scan and a dircnr scan trying to update a drive in the tree at the same time (related to the "treeswitch options); Code cleanup mainly removal of old printfs, SayMsgs, DbgMsg and unneeded %s.

  • 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 1402 2009-03-14 17:17:59Z 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 (!DosAllocSharedMem((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 (!DosAllocSharedMem((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] = "", pattern[81];
245
246 switch (msg) {
247 case WM_INITDLG:
248 if (!mp2) {
249 Runtime_Error(pszSrcFile, __LINE__, NULL);
250 WinDismissDlg(hwnd, 0);
251 }
252 else {
253 WinSetWindowPtr(hwnd, QWL_USER, mp2);
254 hwndCnr = *(HWND *) mp2;
255 WinSendDlgItemMsg(hwnd,
256 SAV_FILENAME,
257 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
258 WinSendDlgItemMsg(hwnd,
259 SAV_PATTERN,
260 EM_SETTEXTLIMIT, MPFROM2SHORT(80, 0), MPVOID);
261 *savename = *pattern = 0;
262 {
263 ULONG size;
264
265 size = CCHMAXPATH;
266 PrfQueryProfileData(fmprof,
267 appname, "SaveToListName", savename, &size);
268 size = MAX_PATTERN_BYTES + 1;
269 PrfQueryProfileData(fmprof,
270 appname, "SaveToListPattern", pattern, &size);
271 }
272 WinSetDlgItemText(hwnd, SAV_FILENAME, savename);
273 if (!*pattern)
274 strcpy(pattern, "%F %s");
275 {
276 CHAR temp[MAX_PATTERN_BYTES * 4 + 1];
277
278 fixup(pattern, temp, sizeof(temp), strlen(pattern));
279 WinSetDlgItemText(hwnd, SAV_PATTERN, temp);
280 }
281 {
282 FILE *fp;
283 CHAR s[CCHMAXPATH + 14];
284
285 BldFullPathName(s, pFM2SaveDirectory, PCSZ_PATTERNSDAT);
286 fp = _fsopen(s, "r", SH_DENYWR);
287 if (fp) {
288 while (xfgets(s, 81, fp, pszSrcFile, __LINE__)) {
289 stripcr(s);
290 if (*s && *s != ';')
291 WinSendMsg(WinWindowFromID(hwnd, SAV_LISTBOX), LM_INSERTITEM,
292 MPFROM2SHORT(LIT_SORTASCENDING, 0), MPFROMP(s));
293 }
294 fclose(fp);
295 }
296 if (!WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_QUERYITEMCOUNT,
297 MPVOID, MPVOID))
298 WinEnableWindow(WinWindowFromID(hwnd, SAV_LISTBOX), FALSE);
299 }
300 }
301 break;
302
303 case UM_SETDIR:
304 {
305 SHORT sSelect, sMax;
306 CHAR szBuffer[CCHMAXPATH + 14];
307 FILE *fp;
308
309 sMax = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
310 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
311 if (sMax > 0) {
312 BldFullPathName(szBuffer, pFM2SaveDirectory, PCSZ_PATTERNSDAT);
313 if (CheckDriveSpaceAvail(szBuffer, ullDATFileSpaceNeeded, 1) == 2)
314 break; //already gave error msg
315 fp = xfopen(szBuffer, "w", pszSrcFile, __LINE__);
316 if (fp) {
317 fputs(GetPString(IDS_LISTPATTERNTEXT), fp);
318 for (sSelect = 0; sSelect < sMax; sSelect++) {
319 *szBuffer = 0;
320 WinSendDlgItemMsg(hwnd,
321 SAV_LISTBOX,
322 LM_QUERYITEMTEXT,
323 MPFROM2SHORT(sSelect, 81), MPFROMP(szBuffer));
324 if (*szBuffer)
325 fprintf(fp, "%s\n", szBuffer);
326 }
327 fclose(fp);
328 }
329 }
330 else if (!sMax) {
331 BldFullPathName(szBuffer, pFM2SaveDirectory, PCSZ_PATTERNSDAT);
332 unlinkf(szBuffer);
333 }
334 }
335 return 0;
336
337 case WM_CONTROL:
338 if (SHORT1FROMMP(mp1) == SAV_LISTBOX) {
339
340 SHORT sSelect;
341 CHAR szBuffer[81];
342
343 switch (SHORT2FROMMP(mp1)) {
344 case LN_SELECT:
345 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
346 LM_QUERYSELECTION,
347 MPFROMSHORT(LIT_FIRST), MPVOID);
348 if (sSelect >= 0) {
349 *szBuffer = 0;
350 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_QUERYITEMTEXT,
351 MPFROM2SHORT(sSelect, 81), MPFROMP(szBuffer));
352 if (*szBuffer)
353 WinSetDlgItemText(hwnd, SAV_PATTERN, szBuffer);
354 }
355 break;
356
357 case LN_ENTER:
358 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
359 break;
360 }
361 }
362 return 0;
363
364 case WM_COMMAND:
365 hwndCnr = *(HWND *) INSTDATA(hwnd);
366 switch (SHORT1FROMMP(mp1)) {
367 case DID_CANCEL:
368 WinDismissDlg(hwnd, 0);
369 break;
370
371 case IDM_HELP:
372 if (hwndHelp)
373 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
374 MPFROM2SHORT(HELP_SAVETOLIST, 0),
375 MPFROMSHORT(HM_RESOURCEID));
376 break;
377
378 case SAV_FIND:
379 {
380 *savename = 0;
381 WinQueryDlgItemText(hwnd, SAV_FILENAME, CCHMAXPATH, savename);
382 if (!*savename)
383 strcpy(savename, PCSZ_STARDOTLST);
384 if (export_filename(hwnd, savename, 1) && *savename) {
385 if (!strchr(savename, '.'))
386 strcat(savename, PCSZ_DOTLST);
387 WinSetDlgItemText(hwnd, SAV_FILENAME, savename);
388 }
389 }
390 break;
391
392 case SAV_ADD:
393 case SAV_DEL:
394 case DID_OK:
395 WinEnableWindow(hwnd, FALSE);
396 {
397 PCNRITEM pci;
398 FILE *fp;
399 CHAR *p, *pp, temp;
400 CHAR szCmmaFmtFileSize[81];
401 INT attribute = CRA_CURSORED;
402 SHORT sSelect;
403
404 *pattern = 0;
405 WinQueryDlgItemText(hwnd, SAV_PATTERN, 80, pattern);
406 if (!*pattern) {
407 WinEnableWindow(hwnd, TRUE);
408 if (!fAlertBeepOff)
409 DosBeep(150, 100);
410 break;
411 }
412 {
413 switch (SHORT1FROMMP(mp1)) {
414 case SAV_ADD:
415 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
416 LM_SEARCHSTRING,
417 MPFROM2SHORT(0, LIT_FIRST),
418 MPFROMP(pattern));
419 if (sSelect < 0) {
420 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_INSERTITEM,
421 MPFROM2SHORT(LIT_SORTASCENDING, 0),
422 MPFROMP(pattern));
423 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
424 }
425 WinEnableWindow(hwnd, TRUE);
426 return 0;
427
428 case SAV_DEL:
429 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
430 LM_QUERYSELECTION,
431 MPFROM2SHORT(LIT_FIRST, 0),
432 MPVOID);
433 if (sSelect >= 0) {
434 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_DELETEITEM,
435 MPFROM2SHORT(sSelect, 0), MPVOID);
436 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
437 }
438 WinEnableWindow(hwnd, TRUE);
439 return 0;
440 }
441 }
442 literal(pattern);
443 if (!*pattern) {
444 WinEnableWindow(hwnd, TRUE);
445 if (!fAlertBeepOff)
446 DosBeep(250, 100);
447 break;
448 }
449 PrfWriteProfileString(fmprof, appname, "SaveToListPattern", pattern);
450 *savename = 0;
451 WinQueryDlgItemText(hwnd, SAV_FILENAME, CCHMAXPATH, savename);
452 bstrip(savename);
453 if (!*savename) {
454 WinEnableWindow(hwnd, TRUE);
455 if (!fAlertBeepOff)
456 DosBeep(100, 100);
457 break;
458 }
459 if (stricmp(savename, "PRN") &&
460 strnicmp(savename, "\\DEV\\LPT", 8) && !strchr(savename, '.'))
461 strcat(savename, PCSZ_DOTLST);
462 PrfWriteProfileString(fmprof, appname, "SaveToListName", savename);
463 pci = (PCNRITEM) WinSendMsg(hwndCnr,
464 CM_QUERYRECORDEMPHASIS,
465 MPFROMLONG(CMA_FIRST),
466 MPFROMSHORT(attribute));
467 if (pci && (INT) pci != -1) {
468 if (pci->rc.flRecordAttr & CRA_SELECTED) {
469 attribute = CRA_SELECTED;
470 pci = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS,
471 MPFROMLONG(CMA_FIRST), MPFROMSHORT(attribute));
472 }
473 }
474 if (!pci || (INT) pci == -1)
475 Runtime_Error(pszSrcFile, __LINE__, NULL);
476 else {
477 fp = _fsopen(savename, "w+", SH_DENYWR);
478 if (!fp)
479 Runtime_Error(pszSrcFile, __LINE__, "_fsopen");
480 else {
481 fseek(fp, 0, SEEK_SET);
482 if (WinQueryButtonCheckstate(hwnd, SAV_APPEND) == 0)
483 DosSetFileSize((HFILE) fileno(fp), 0);
484 else
485 fseek(fp, 0, SEEK_END);
486 while (pci && (INT) pci != -1) {
487 if (!(pci->rc.flRecordAttr & CRA_FILTERED)) {
488 p = pattern;
489 while (*p) {
490 if (*p == '%') {
491 p++;
492 switch (*p) {
493 case 's':
494 fputs(pci->pszSubject, fp);
495 break;
496 case 'S':
497 fprintf(fp, "%-40s", pci->pszSubject);
498 break;
499 case 'Z':
500 CommaFmtULL(szCmmaFmtFileSize,
501 sizeof(szCmmaFmtFileSize), pci->cbFile, ' ');
502 fprintf(fp, "%-13s", szCmmaFmtFileSize);
503 break;
504 case 'z':
505 CommaFmtULL(szCmmaFmtFileSize,
506 sizeof(szCmmaFmtFileSize), pci->cbFile, ' ');
507 fprintf(fp, "%s", szCmmaFmtFileSize);
508 break;
509 case 'E':
510 fprintf(fp, "%-5u", pci->easize);
511 break;
512 case 'e':
513 fprintf(fp, "%u", pci->easize);
514 break;
515 case 'd':
516 case 'D':
517 {
518 CHAR szDate[DATE_BUF_BYTES];
519
520 DateFormat(szDate, pci->date);
521 fprintf(fp,"%s", szDate);
522 break;
523 }
524 case 't':
525 case 'T':
526 fprintf(fp,
527 "%02u%s%02u%s%02u",
528 pci->time.hours, TimeSeparator,
529 pci->time.minutes, TimeSeparator, pci->time.seconds);
530 break;
531 case 'l':
532 fputs(pci->pszLongName, fp);
533 break;
534 case 'L':
535 fprintf(fp, "%-40s", pci->pszLongName);
536 break;
537 case 'F':
538 case 'f':
539 if (IsRoot(pci->pszFileName))
540 pp = pci->pszFileName;
541 else {
542 pp = strrchr(pci->pszFileName, '\\');
543 if (pp)
544 pp++;
545 else
546 pp = pci->pszFileName;
547 }
548 if (*p == 'F')
549 fprintf(fp, "%-13s", pp);
550 else
551 fputs(pp, fp);
552 break;
553 case 'p':
554 fputs(pci->pszFileName, fp);
555 break;
556 case 'P':
557 temp = 0;
558 if (!IsRoot(pci->pszFileName)) {
559 pp = strrchr(pci->pszFileName, '\\');
560 if (pp) {
561 temp = *pp;
562 *pp = 0;
563 }
564 }
565 fputs(pci->pszFileName, fp);
566 if (temp)
567 *pp = temp;
568 break;
569 case '$':
570 fputc(*pci->pszFileName, fp);
571 break;
572 case '%':
573 fputc('%', fp);
574 break;
575 }
576 }
577 else
578 fputc(*p, fp);
579 p++;
580 }
581 fputs("\n", fp);
582 }
583 pci = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, MPFROMP(pci),
584 MPFROMSHORT(attribute));
585 }
586 fclose(fp);
587 }
588 }
589 }
590 WinEnableWindow(hwnd, TRUE);
591 WinDismissDlg(hwnd, 1);
592 break;
593 }
594 return 0;
595 }
596 return WinDefDlgProc(hwnd, msg, mp1, mp2);
597}
598
599MRESULT EXPENTRY SaveAllListDlgProc(HWND hwnd, ULONG msg, MPARAM mp1,
600 MPARAM mp2)
601{
602
603 CHAR **list;
604 CHAR savename[CCHMAXPATH] = "", pattern[81];
605
606 switch (msg) {
607 case WM_INITDLG:
608 if (!mp2) {
609 Runtime_Error(pszSrcFile, __LINE__, NULL);
610 WinDismissDlg(hwnd, 0);
611 }
612 else {
613 WinSetWindowPtr(hwnd, QWL_USER, mp2);
614 list = (CHAR **) mp2;
615 WinSendDlgItemMsg(hwnd,
616 SAV_FILENAME,
617 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
618 WinSendDlgItemMsg(hwnd,
619 SAV_PATTERN,
620 EM_SETTEXTLIMIT, MPFROM2SHORT(80, 0), MPVOID);
621 *savename = *pattern = 0;
622 {
623 ULONG size;
624
625 size = CCHMAXPATH;
626 PrfQueryProfileData(fmprof,
627 appname, "SaveToListName", savename, &size);
628 size = MAX_PATTERN_BYTES + 1;
629 PrfQueryProfileData(fmprof,
630 appname, "SaveToListPattern", pattern, &size);
631 }
632 WinSetDlgItemText(hwnd, SAV_FILENAME, savename);
633 if (!*pattern)
634 strcpy(pattern, "%F %s");
635 {
636 CHAR temp[MAX_PATTERN_BYTES * 4 + 1];
637
638 fixup(pattern, temp, sizeof(temp), strlen(pattern));
639 WinSetDlgItemText(hwnd, SAV_PATTERN, temp);
640 }
641 {
642 FILE *fp;
643 CHAR s[CCHMAXPATH + 14];
644
645 BldFullPathName(s, pFM2SaveDirectory, PCSZ_PATTERNSDAT);
646 fp = _fsopen(s, "r", SH_DENYWR);
647 if (fp) {
648 while (xfgets(s, 81, fp, pszSrcFile, __LINE__)) {
649 stripcr(s);
650 if (*s && *s != ';')
651 WinSendMsg(WinWindowFromID(hwnd, SAV_LISTBOX), LM_INSERTITEM,
652 MPFROM2SHORT(LIT_SORTASCENDING, 0), MPFROMP(s));
653 }
654 fclose(fp);
655 }
656 if (!WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_QUERYITEMCOUNT,
657 MPVOID, MPVOID))
658 WinEnableWindow(WinWindowFromID(hwnd, SAV_LISTBOX), FALSE);
659 }
660 }
661 break;
662
663 case UM_SETDIR:
664 {
665 SHORT sSelect, sMax;
666 CHAR szBuffer[CCHMAXPATH + 14];
667 FILE *fp;
668
669 sMax = (SHORT) WinSendDlgItemMsg(hwnd,
670 SAV_LISTBOX,
671 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
672 if (sMax > 0) {
673 BldFullPathName(szBuffer, pFM2SaveDirectory, PCSZ_PATTERNSDAT);
674 if (CheckDriveSpaceAvail(szBuffer, ullDATFileSpaceNeeded, 1) == 2)
675 break; //already gave error msg
676 fp = xfopen(szBuffer, "w", pszSrcFile, __LINE__);
677 if (fp) {
678 fputs(GetPString(IDS_LISTPATTERNTEXT), fp);
679 for (sSelect = 0; sSelect < sMax; sSelect++) {
680 *szBuffer = 0;
681 WinSendDlgItemMsg(hwnd,
682 SAV_LISTBOX,
683 LM_QUERYITEMTEXT,
684 MPFROM2SHORT(sSelect, 81), MPFROMP(szBuffer));
685 if (*szBuffer)
686 fprintf(fp, "%s\n", szBuffer);
687 }
688 fclose(fp);
689 }
690 }
691 else if (!sMax) {
692 BldFullPathName(szBuffer, pFM2SaveDirectory, PCSZ_PATTERNSDAT);
693 unlinkf(szBuffer);
694 }
695 }
696 return 0;
697
698 case WM_CONTROL:
699 if (SHORT1FROMMP(mp1) == SAV_LISTBOX) {
700
701 SHORT sSelect;
702 CHAR szBuffer[81];
703
704 switch (SHORT2FROMMP(mp1)) {
705 case LN_SELECT:
706 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
707 LM_QUERYSELECTION,
708 MPFROMSHORT(LIT_FIRST), MPVOID);
709 if (sSelect >= 0) {
710 *szBuffer = 0;
711 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_QUERYITEMTEXT,
712 MPFROM2SHORT(sSelect, 81), MPFROMP(szBuffer));
713 if (*szBuffer)
714 WinSetDlgItemText(hwnd, SAV_PATTERN, szBuffer);
715 }
716 break;
717
718 case LN_ENTER:
719 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
720 break;
721 }
722 }
723 return 0;
724
725 case WM_COMMAND:
726 list = (CHAR **) INSTDATA(hwnd);
727 switch (SHORT1FROMMP(mp1)) {
728 case DID_CANCEL:
729 WinDismissDlg(hwnd, 0);
730 break;
731
732 case IDM_HELP:
733 if (hwndHelp)
734 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
735 MPFROM2SHORT(HELP_SAVETOLIST, 0),
736 MPFROMSHORT(HM_RESOURCEID));
737 break;
738
739 case SAV_FIND:
740 {
741 *savename = 0;
742 WinQueryDlgItemText(hwnd, SAV_FILENAME, CCHMAXPATH, savename);
743 if (!*savename)
744 strcpy(savename, PCSZ_STARDOTLST);
745 if (export_filename(hwnd, savename, 1) && *savename) {
746 if (!strchr(savename, '.'))
747 strcat(savename, PCSZ_DOTLST);
748 WinSetDlgItemText(hwnd, SAV_FILENAME, savename);
749 }
750 }
751 break;
752
753 case SAV_ADD:
754 case SAV_DEL:
755 case DID_OK:
756 WinEnableWindow(hwnd, FALSE);
757 {
758 FILE *fp;
759 CHAR *p, *pp, temp;
760 INT x = 0;
761 SHORT sSelect;
762 FILEFINDBUF4L ffb4;
763 ULONG nm;
764 HDIR hdir;
765 CHAR longname[CCHMAXPATH], subject[1024];
766
767 *pattern = 0;
768 WinQueryDlgItemText(hwnd, SAV_PATTERN, 80, pattern);
769 if (!*pattern) {
770 WinEnableWindow(hwnd, TRUE);
771 if (!fAlertBeepOff)
772 DosBeep(150, 100);
773 break;
774 }
775 {
776 switch (SHORT1FROMMP(mp1)) {
777 case SAV_ADD:
778 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
779 LM_SEARCHSTRING,
780 MPFROM2SHORT(0, LIT_FIRST),
781 MPFROMP(pattern));
782 if (sSelect < 0) {
783 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_INSERTITEM,
784 MPFROM2SHORT(LIT_SORTASCENDING, 0),
785 MPFROMP(pattern));
786 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
787 }
788 WinEnableWindow(hwnd, TRUE);
789 return 0;
790
791 case SAV_DEL:
792 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
793 LM_QUERYSELECTION,
794 MPFROM2SHORT(LIT_FIRST, 0),
795 MPVOID);
796 if (sSelect >= 0) {
797 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_DELETEITEM,
798 MPFROM2SHORT(sSelect, 0), MPVOID);
799 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
800 }
801 WinEnableWindow(hwnd, TRUE);
802 return 0;
803 }
804 }
805 literal(pattern);
806 if (!*pattern) {
807 WinEnableWindow(hwnd, TRUE);
808 if (!fAlertBeepOff)
809 DosBeep(250, 100);
810 break;
811 }
812 PrfWriteProfileString(fmprof, appname, "SaveToListPattern", pattern);
813 *savename = 0;
814 WinQueryDlgItemText(hwnd, SAV_FILENAME, CCHMAXPATH, savename);
815 bstrip(savename);
816 if (!*savename) {
817 WinEnableWindow(hwnd, TRUE);
818 if (!fAlertBeepOff)
819 DosBeep(100, 100);
820 break;
821 }
822 if (stricmp(savename, "PRN") &&
823 strnicmp(savename, "\\DEV\\LPT", 8) && !strchr(savename, '.'))
824 strcat(savename, PCSZ_DOTLST);
825 PrfWriteProfileString(fmprof, appname, "SaveToListName", savename);
826 if (!list || !list[0])
827 Runtime_Error(pszSrcFile, __LINE__, NULL);
828 else {
829 fp = _fsopen(savename, "r+", SH_DENYWR);
830 if (!fp)
831 Runtime_Error(pszSrcFile, __LINE__, "_fsopen");
832 else {
833 fseek(fp, 0, SEEK_SET);
834 if (WinQueryButtonCheckstate(hwnd, SAV_APPEND) == 0)
835 DosSetFileSize((HFILE) fileno(fp), 0);
836 else
837 fseek(fp, 0, SEEK_END);
838 while (list[x]) {
839 hdir = HDIR_CREATE;
840 nm = 1;
841 *subject = *longname = 0;
842 if (!xDosFindFirst(list[x], &hdir,
843 FILE_NORMAL | FILE_DIRECTORY |
844 FILE_READONLY | FILE_ARCHIVED |
845 FILE_HIDDEN | FILE_SYSTEM,
846 &ffb4, sizeof(ffb4), &nm, FIL_QUERYEASIZEL)) {
847 /* load the object's Subject, if required */
848 if (ffb4.cbList > 4) {
849 APIRET rc;
850 EAOP2 eaop;
851 PGEA2LIST pgealist;
852 PFEA2LIST pfealist;
853 PGEA2 pgea;
854 PFEA2 pfea;
855 CHAR *value;
856
857 pgealist =
858 xmallocz(sizeof(GEA2LIST) + 64, pszSrcFile, __LINE__);
859 if (pgealist) {
860 pgea = &pgealist->list[0];
861 strcpy(pgea->szName, SUBJECT);
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 = 0;
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(subject, value + (sizeof(USHORT) * 2), 1023);
881 subject[1023] = 0;
882 }
883 free(pfealist);
884 }
885 free(pgealist);
886 }
887 }
888 /* load the object's longname */
889 if (ffb4.cbList > 4) {
890 APIRET rc;
891 EAOP2 eaop;
892 PGEA2LIST pgealist;
893 PFEA2LIST pfealist;
894 PGEA2 pgea;
895 PFEA2 pfea;
896 CHAR *value;
897
898
899 pgealist =
900 xmallocz(sizeof(GEA2LIST) + 64, pszSrcFile, __LINE__);
901 if (pgealist) {
902 pgea = &pgealist->list[0];
903 strcpy(pgea->szName, LONGNAME);
904 pgea->cbName = strlen(pgea->szName);
905 pgea->oNextEntryOffset = 0;
906 pgealist->cbList = sizeof(GEA2LIST) + pgea->cbName;
907 pfealist = xmallocz(1024, pszSrcFile, __LINE__);
908 if (pfealist) {
909 pfealist->cbList = 1024;
910 eaop.fpGEA2List = pgealist;
911 eaop.fpFEA2List = pfealist;
912 eaop.oError = 0L;
913 rc = DosQueryPathInfo(list[x],
914 FIL_QUERYEASFROMLIST,
915 (PVOID) & eaop,
916 (ULONG) sizeof(EAOP2));
917 if (!rc) {
918 pfea = &eaop.fpFEA2List->list[0];
919 value = pfea->szName + pfea->cbName + 1;
920 value[pfea->cbValue] = 0;
921 if (*(USHORT *) value == EAT_ASCII)
922 strncpy(longname, value +
923 (sizeof(USHORT) * 2), CCHMAXPATHCOMP);
924 longname[CCHMAXPATHCOMP - 1] = 0;
925 }
926 free(pfealist);
927 }
928 free(pgealist);
929 }
930 }
931
932 p = pattern;
933 while (*p) {
934 if (*p == '%') {
935 p++;
936 switch (*p) {
937 CHAR szCmmaFmtFileSize[81];
938 case 's':
939 fputs(subject, fp);
940 break;
941 case 'S':
942 fprintf(fp, "%-40s", subject);
943 break;
944 case 'Z':
945 CommaFmtULL(szCmmaFmtFileSize,
946 sizeof(szCmmaFmtFileSize), ffb4.cbFile, ' ');
947 fprintf(fp, "%-13s", szCmmaFmtFileSize);
948 break;
949 case 'z':
950 CommaFmtULL(szCmmaFmtFileSize,
951 sizeof(szCmmaFmtFileSize), ffb4.cbFile, ' ');
952 fprintf(fp, "%s", szCmmaFmtFileSize);
953 break;
954 case 'E':
955 fprintf(fp, "%-5u", CBLIST_TO_EASIZE(ffb4.cbList));
956 break;
957 case 'e':
958 fprintf(fp, "%u", CBLIST_TO_EASIZE(ffb4.cbList));
959 break;
960 case 'd':
961 case 'D':
962 {
963 CHAR szDate[DATE_BUF_BYTES];
964
965 FDateFormat(szDate, ffb4.fdateLastWrite);
966 fprintf(fp,"%s", szDate);
967 break;
968 }
969 case 't':
970 case 'T':
971 fprintf(fp,
972 "%02u%s%02u%s%02u",
973 ffb4.ftimeLastWrite.hours,
974 TimeSeparator,
975 ffb4.ftimeLastWrite.minutes,
976 TimeSeparator,
977 ffb4.ftimeLastWrite.twosecs * 2);
978 break;
979 case 'l':
980 fputs(longname, fp);
981 break;
982 case 'L':
983 fprintf(fp, "%-40s", longname);
984 break;
985 case 'F':
986 case 'f':
987 if (IsRoot(list[x]))
988 pp = list[x];
989 else {
990 pp = strrchr(list[x], '\\');
991 if (pp)
992 pp++;
993 else
994 pp = list[x];
995 }
996 if (*p == 'F')
997 fprintf(fp, "%-13s", pp);
998 else
999 fputs(pp, fp);
1000 break;
1001 case 'p':
1002 fputs(list[x], fp);
1003 break;
1004 case 'P':
1005 temp = 0;
1006 if (!IsRoot(list[x])) {
1007 pp = strrchr(list[x], '\\');
1008 if (pp) {
1009 temp = *pp;
1010 *pp = 0;
1011 }
1012 }
1013 fputs(list[x], fp);
1014 if (temp)
1015 *pp = temp;
1016 break;
1017 case '$':
1018 fputc(*list[x], fp);
1019 break;
1020 case '%':
1021 fputc('%', fp);
1022 break;
1023 }
1024 }
1025 else
1026 fputc(*p, fp);
1027 p++;
1028 }
1029 fputs("\n", fp);
1030 DosFindClose(hdir);
1031 }
1032 x++;
1033 }
1034 fclose(fp);
1035 }
1036 }
1037 }
1038 WinEnableWindow(hwnd, TRUE);
1039 WinDismissDlg(hwnd, 1);
1040 break;
1041 }
1042 return 0;
1043 }
1044 return WinDefDlgProc(hwnd, msg, mp1, mp2);
1045}
1046
1047#pragma alloc_text(FMCLIPBOARDIN,SaveToClip,SaveToClipHab)
1048#pragma alloc_text(FMCLIPBOARDOUT,ListToClipboardHab)
1049#pragma alloc_text(FMCLIPBOARDOUT,ListFromClipboard,ListFromClipboardHab)
1050#pragma alloc_text(SAVELIST,SaveListDlgProc,SaveAllListDlgProc)
Note: See TracBrowser for help on using the repository browser.