source: trunk/dll/saveclip.c@ 2

Last change on this file since 2 was 2, checked in by root, 23 years ago

Initial revision

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