source: trunk/dll/saveclip.c@ 159

Last change on this file since 159 was 159, checked in by root, 20 years ago

Rework for CNRITEM.szSubject

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