source: trunk/dll/saveclip.c@ 51

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

Standardize EA match

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