source: trunk/dll/saveclip.c@ 404

Last change on this file since 404 was 404, checked in by root, 19 years ago

Use xfgets

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