source: trunk/dll/saveclip.c@ 115

Last change on this file since 115 was 115, checked in by root, 21 years ago

Rework lstrip/rstrip usage
Rework fixup usage

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 36.1 KB
RevLine 
[51]1
2/***********************************************************************
3
4 $Id: saveclip.c 115 2004-12-05 00:04:50Z 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
[115]12 01 Aug 04 SHL - Rework lstrip/rstrip usage
13 01 Aug 04 SHL - Rework fixup usage
[51]14
15***********************************************************************/
16
[2]17#define INCL_DOS
18#define INCL_WIN
19
20#include <os2.h>
21#include <stdarg.h>
22#include <stdio.h>
23#include <stdlib.h>
24#include <string.h>
25#include <share.h>
26#include "fm3dll.h"
27#include "fm3dlg.h"
28#include "fm3str.h"
29
30#pragma alloc_text(FMCLIPBOARDIN,SaveToClip,SaveToClipHab)
31#pragma alloc_text(FMCLIPBOARDOUT,ListToClipboard,ListToClipboardHab)
32#pragma alloc_text(FMCLIPBOARDOUT,ListFromClipboard,ListFromClipboardHab)
33
34
35BOOL SaveToClip (HWND hwnd,CHAR *text,BOOL append) {
36
37 HAB hab = WinQueryAnchorBlock(hwnd);
38
39 return SaveToClipHab(hab,text,append);
40}
41
42
43BOOL SaveToClipHab (HAB hab,CHAR *text,BOOL append) {
44
45 CHAR *clip = NULL,*hold = NULL,*p;
46 ULONG len;
47 BOOL ret = FALSE;
48
49 if(text) {
50 len = strlen(text);
51 p = text;
52 while(*p) {
53 if(*p == '\n' && (p == text || *(p - 1) != '\r'))
54 len++;
55 p++;
56 }
57 if(len) {
58 if(WinOpenClipbrd(hab)) {
59 if(append)
60 clip = (CHAR *)WinQueryClipbrdData(hab,CF_TEXT);
61 if(clip)
62 len += strlen(clip) + 1L;
63 if(!DosAllocSharedMem((PPVOID)&hold,(PSZ)NULL,len,PAG_COMMIT |
64 OBJ_GIVEABLE | PAG_READ | PAG_WRITE)) {
65 *hold = 0;
66 if(clip)
67 strcpy(hold,clip);
68 p = hold + strlen(hold);
69 strcpy(p,text);
70 while(*p) {
71 if(*p == '\n' && (p == hold || *(p - 1) != '\r')) {
72 memmove(p + 1,p,strlen(p) + 1);
73 *p = '\r';
74 }
75 p++;
76 }
77 WinEmptyClipbrd(hab);
78 if(!WinSetClipbrdData(hab,
79 (ULONG)hold,
80 CF_TEXT,
81 CFI_POINTER))
82 DosFreeMem(hold);
83 else
84 ret = TRUE;
85 }
86 WinCloseClipbrd(hab);
87 }
88 }
89 }
90 return ret;
91}
92
93
94VOID ListToClipboard (HWND hwnd,CHAR **list,BOOL append) {
95
96 HAB hab = WinQueryAnchorBlock(hwnd);
97
98 ListToClipboardHab(hab,list,append);
99}
100
101
102VOID ListToClipboardHab (HAB hab,CHAR **list,BOOL append) {
103
104 CHAR *text = NULL,**clip = NULL;
105 INT x;
106 ULONG len = 0L;
107
108 if(list && list[0]) {
109 for(x = 0;list[x];x++)
110 len += strlen(list[x]) + 2;
111 if(len)
112 len++;
113 if(len) {
114 if(append)
115 clip = ListFromClipboardHab(hab);
116 if(clip && clip[0]) {
117 for(x = 0;clip[x];x++)
118 len += strlen(clip[x]) + 2;
119 len++;
120 }
121 if(WinOpenClipbrd(hab)) {
122 if(!DosAllocSharedMem((PPVOID)&text,(PSZ)NULL,len,PAG_COMMIT |
123 OBJ_GIVEABLE | PAG_READ | PAG_WRITE)) {
124 *text = 0;
125 if(clip && clip[0]) {
126 for(x = 0;clip[x];x++) {
127 strcat(text,clip[x]);
128 strcat(text,"\r\n");
129 }
130 }
131 for(x = 0;list[x];x++) {
132 strcat(text,list[x]);
133 strcat(text,"\r\n");
134 }
135 WinEmptyClipbrd(hab);
136 if(!WinSetClipbrdData(hab,
137 (ULONG)text,
138 CF_TEXT,
139 CFI_POINTER))
140 DosFreeMem(text);
141 }
142 WinCloseClipbrd(hab);
143 }
144 if(clip)
145 FreeList(clip);
146 }
147 }
148}
149
150
151CHAR ** ListFromClipboard (HWND hwnd) {
152
153 HAB hab = WinQueryAnchorBlock(hwnd);
154
155 return ListFromClipboardHab(hab);
156}
157
158
159CHAR **ListFromClipboardHab (HAB hab) {
160
161 CHAR *p,*pp,*text = NULL,**list = NULL;
162 INT numfiles = 0,numalloced = 0;
163
164 if(WinOpenClipbrd(hab)) {
165 p = (CHAR *)WinQueryClipbrdData(hab,CF_TEXT);
166 if(p && *p)
167 text = strdup(p);
168 WinCloseClipbrd(hab);
169 if(text) {
[115]170 bstrip(text);
171 pp = text;
[2]172 p = strchr(pp,'\r');
173 if(!p)
174 p = strchr(pp,'\n');
175 while(p && *p) {
176 *p = 0;
177 p++;
178 while(*p == '\r' || *p == '\n' || *p == ' ' || *p == '\t')
179 p++;
180 rstrip(pp);
181 if(*pp) {
182 if(AddToList(pp,&list,&numfiles,&numalloced))
183 break;
184 }
185 pp = p;
186 p = strchr(pp,'\r');
187 if(!p)
188 p = strchr(pp,'\n');
189 }
190 free(text);
191 }
192 }
193 return list;
194}
195
196
197#pragma alloc_text(SAVELIST,SaveListDlgProc,SaveAllListDlgProc)
198
[51]199MRESULT EXPENTRY SaveListDlgProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
200{
[2]201 HWND hwndCnr;
202 CHAR savename[CCHMAXPATH] = "",pattern[81];
203
204 switch(msg) {
205 case WM_INITDLG:
206 if(!mp2) {
207 DosBeep(250,100);
208 WinDismissDlg(hwnd,0);
209 }
210 else {
211 WinSetWindowPtr(hwnd,0,mp2);
212 hwndCnr = *(HWND *)mp2;
213 WinSendDlgItemMsg(hwnd,
214 SAV_FILENAME,
215 EM_SETTEXTLIMIT,
216 MPFROM2SHORT(CCHMAXPATH,0),
217 MPVOID);
218 WinSendDlgItemMsg(hwnd,
219 SAV_PATTERN,
220 EM_SETTEXTLIMIT,
221 MPFROM2SHORT(80,0),
222 MPVOID);
223 *savename = *pattern = 0;
224 {
225 ULONG size;
226
227 size = CCHMAXPATH;
228 PrfQueryProfileData(fmprof,
229 appname,
230 "SaveToListName",
231 savename,
232 &size);
233 size = 81;
234 PrfQueryProfileData(fmprof,
235 appname,
236 "SaveToListPattern",
237 pattern,
238 &size);
239 }
240 WinSetDlgItemText(hwnd,
241 SAV_FILENAME,
242 savename);
243 if(!*pattern)
244 strcpy(pattern,
245 "%F %s");
246 {
247 CHAR temp[162];
248
249 fixup(pattern,
250 temp,
[115]251 sizeof(temp),
[2]252 strlen(pattern));
253 WinSetDlgItemText(hwnd,
254 SAV_PATTERN,
255 temp);
256 }
257 {
258 FILE *fp;
259 CHAR s[CCHMAXPATH + 14];
260
261 save_dir2(s);
262 if(s[strlen(s) - 1] != '\\')
263 strcat(s,"\\");
264 strcat(s,"PATTERNS.DAT");
265 fp = _fsopen(s,"r",SH_DENYWR);
266 if(fp) {
267 while(fgets(s,81,fp)) {
268 s[80] = 0;
269 stripcr(s);
270 if(*s && *s != ';')
271 WinSendMsg(WinWindowFromID(hwnd,SAV_LISTBOX),LM_INSERTITEM,
272 MPFROM2SHORT(LIT_SORTASCENDING,0),
273 MPFROMP(s));
274 }
275 fclose(fp);
276 }
277 if(!WinSendDlgItemMsg(hwnd,SAV_LISTBOX,LM_QUERYITEMCOUNT,
278 MPVOID,MPVOID))
279 WinEnableWindow(WinWindowFromID(hwnd,SAV_LISTBOX),FALSE);
280 }
281 }
282 break;
283
284 case UM_SETDIR:
285 {
286 SHORT sSelect,sMax;
287 CHAR szBuffer[CCHMAXPATH + 14];
288 FILE *fp;
289
290 sMax = (SHORT)WinSendDlgItemMsg(hwnd,SAV_LISTBOX,
291 LM_QUERYITEMCOUNT,MPVOID,MPVOID);
292 if(sMax > 0) {
293 save_dir2(szBuffer);
294 if(szBuffer[strlen(szBuffer) - 1] != '\\')
295 strcat(szBuffer,"\\");
296 strcat(szBuffer,"PATTERNS.DAT");
297 fp = fopen(szBuffer,"w");
298 if(fp) {
299 fputs(GetPString(IDS_LISTPATTERNTEXT),fp);
300 for(sSelect = 0;sSelect < sMax;sSelect++) {
301 *szBuffer = 0;
302 WinSendDlgItemMsg(hwnd,
303 SAV_LISTBOX,
304 LM_QUERYITEMTEXT,
305 MPFROM2SHORT(sSelect,81),
306 MPFROMP(szBuffer));
307 if(*szBuffer)
308 fprintf(fp,
309 "%s\n",
310 szBuffer);
311 }
312 fclose(fp);
313 }
314 else
315 DosBeep(500,100);
316 }
317 else if(!sMax) {
318 save_dir2(szBuffer);
319 if(szBuffer[strlen(szBuffer) - 1] != '\\')
320 strcat(szBuffer,"\\");
321 strcat(szBuffer,"PATTERNS.DAT");
322 unlinkf("%s",szBuffer);
323 }
324 }
325 return 0;
326
327 case WM_CONTROL:
328 if(SHORT1FROMMP(mp1) == SAV_LISTBOX) {
329
330 SHORT sSelect;
331 CHAR szBuffer[81];
332
333 switch(SHORT2FROMMP(mp1)) {
334 case LN_SELECT:
335 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,SAV_LISTBOX,
336 LM_QUERYSELECTION,
337 MPFROMSHORT(LIT_FIRST),
338 MPVOID);
339 if(sSelect >= 0) {
340 *szBuffer = 0;
341 WinSendDlgItemMsg(hwnd,SAV_LISTBOX,LM_QUERYITEMTEXT,
342 MPFROM2SHORT(sSelect,81),
343 MPFROMP(szBuffer));
344 if(*szBuffer)
345 WinSetDlgItemText(hwnd,SAV_PATTERN,szBuffer);
346 }
347 break;
348
349 case LN_ENTER:
350 PostMsg(hwnd,WM_COMMAND,MPFROM2SHORT(DID_OK,0),MPVOID);
351 break;
352 }
353 }
354 return 0;
355
356 case WM_COMMAND:
357 hwndCnr = *(HWND *)INSTDATA(hwnd);
358 switch(SHORT1FROMMP(mp1)) {
359 case DID_CANCEL:
360 WinDismissDlg(hwnd,0);
361 break;
362
363 case IDM_HELP:
364 if(hwndHelp)
365 WinSendMsg(hwndHelp,HM_DISPLAY_HELP,
366 MPFROM2SHORT(HELP_SAVETOLIST,0),
367 MPFROMSHORT(HM_RESOURCEID));
368 break;
369
370 case SAV_FIND:
371 {
372 *savename = 0;
373 WinQueryDlgItemText(hwnd,SAV_FILENAME,CCHMAXPATH,savename);
374 if(!*savename)
375 strcpy(savename,"*.LST");
376 if(export_filename(hwnd,savename,1) && *savename) {
377 if(!strchr(savename,'.'))
378 strcat(savename,".LST");
379 WinSetDlgItemText(hwnd,SAV_FILENAME,savename); }
380 }
381 break;
382
383 case SAV_ADD:
384 case SAV_DEL:
385 case DID_OK:
386 WinEnableWindow(hwnd,FALSE);
387 {
388 PCNRITEM pci;
389 FILE *fp;
390 CHAR *p,*pp,temp;
391 INT attribute = CRA_CURSORED;
392 SHORT sSelect;
393
394 *pattern = 0;
395 WinQueryDlgItemText(hwnd,SAV_PATTERN,80,pattern);
396 if(!*pattern) {
397 WinEnableWindow(hwnd,TRUE);
398 DosBeep(150,100);
399 break;
400 }
401 {
402 switch(SHORT1FROMMP(mp1)) {
403 case SAV_ADD:
404 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,SAV_LISTBOX,
405 LM_SEARCHSTRING,
406 MPFROM2SHORT(0,LIT_FIRST),
407 MPFROMP(pattern));
408 if(sSelect < 0) {
409 WinSendDlgItemMsg(hwnd,SAV_LISTBOX,LM_INSERTITEM,
410 MPFROM2SHORT(LIT_SORTASCENDING,0),
411 MPFROMP(pattern));
412 WinSendMsg(hwnd,UM_SETDIR,MPVOID,MPVOID);
413 }
414 WinEnableWindow(hwnd,TRUE);
415 return 0;
416
417 case SAV_DEL:
418 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,SAV_LISTBOX,
419 LM_QUERYSELECTION,
420 MPFROM2SHORT(LIT_FIRST,0),
421 MPVOID);
422 if(sSelect >= 0) {
423 WinSendDlgItemMsg(hwnd,SAV_LISTBOX,LM_DELETEITEM,
424 MPFROM2SHORT(sSelect,0),MPVOID);
425 WinSendMsg(hwnd,UM_SETDIR,MPVOID,MPVOID);
426 }
427 WinEnableWindow(hwnd,TRUE);
428 return 0;
429 }
430 }
431 literal(pattern);
432 if(!*pattern) {
433 WinEnableWindow(hwnd,TRUE);
434 DosBeep(250,100);
435 break;
436 }
437 PrfWriteProfileString(fmprof,
438 appname,
439 "SaveToListPattern",
440 pattern);
441 *savename = 0;
442 WinQueryDlgItemText(hwnd,
443 SAV_FILENAME,
444 CCHMAXPATH,
445 savename);
[115]446 bstrip(savename);
[2]447 if(!*savename) {
448 WinEnableWindow(hwnd,TRUE);
449 DosBeep(100,100);
450 break;
451 }
452 if(stricmp(savename,"PRN") &&
453 strnicmp(savename,"\\DEV\\LPT",8) &&
454 !strchr(savename,'.'))
455 strcat(savename,".LST");
456 PrfWriteProfileString(fmprof,
457 appname,
458 "SaveToListName",
459 savename);
460 pci = (PCNRITEM)WinSendMsg(hwndCnr,
461 CM_QUERYRECORDEMPHASIS,
462 MPFROMLONG(CMA_FIRST),
463 MPFROMSHORT(attribute));
464 if(pci && (INT)pci != -1) {
465 if(pci->rc.flRecordAttr & CRA_SELECTED) {
466 attribute = CRA_SELECTED;
467 pci = WinSendMsg(hwndCnr,CM_QUERYRECORDEMPHASIS,
468 MPFROMLONG(CMA_FIRST),
469 MPFROMSHORT(attribute));
470 }
471 }
472 if(pci && (INT)pci != -1) {
473 fp = _fsopen(savename,"r+",SH_DENYWR);
474 if(fp) {
475 fseek(fp,0L,SEEK_SET);
476 if(WinQueryButtonCheckstate(hwnd,SAV_APPEND) == 0)
477 DosSetFileSize((HFILE)fileno(fp),0L);
478 else
479 fseek(fp,0L,SEEK_END);
480 while( pci && (INT)pci != -1) {
481 if(!(pci->rc.flRecordAttr & CRA_FILTERED)) {
482 p = pattern;
483 while(*p) {
484 if(*p == '%') {
485 p++;
486 switch(*p) {
487 case 's':
488 fputs(pci->subject,fp);
489 break;
490 case 'S':
491 fprintf(fp,"%-40s",pci->subject);
492 break;
493 case 'Z':
494 fprintf(fp,"%-13lu",pci->cbFile);
495 break;
496 case 'z':
497 fprintf(fp,"%lu",pci->cbFile);
498 break;
499 case 'E':
500 fprintf(fp,"%-5u",pci->easize);
501 break;
502 case 'e':
503 fprintf(fp,"%u",pci->easize);
504 break;
505 case 'd':
506 case 'D':
507 fprintf(fp,
508 "%04u/%02u/%02u",
509 pci->date.year,
510 pci->date.month,
511 pci->date.day);
512 break;
513 case 't':
514 case 'T':
515 fprintf(fp,
516 "%02u:%02u:%02u",
517 pci->time.hours,
518 pci->time.minutes,
519 pci->time.seconds);
520 break;
521 case 'l':
522 fputs(pci->Longname,fp);
523 break;
524 case 'L':
525 fprintf(fp,
526 "%-40s",
527 pci->Longname);
528 break;
529 case 'F':
530 case 'f':
531 if(IsRoot(pci->szFileName))
532 pp = pci->szFileName;
533 else {
534 pp = strrchr(pci->szFileName,'\\');
535 if(pp)
536 pp++;
537 else
538 pp = pci->szFileName;
539 }
540 if(*p == 'F')
541 fprintf(fp,
542 "%-13s",
543 pp);
544 else
545 fputs(pp,fp);
546 break;
547 case 'p':
548 fputs(pci->szFileName,fp);
549 break;
550 case 'P':
551 temp = 0;
552 if(!IsRoot(pci->szFileName)) {
553 pp = strrchr(pci->szFileName,'\\');
554 if(pp) {
555 temp = *pp;
556 *pp = 0;
557 }
558 }
559 fputs(pci->szFileName,fp);
560 if(temp)
561 *pp = temp;
562 break;
563 case '$':
564 fputc(*pci->szFileName,fp);
565 break;
566 case '%':
567 fputc('%',fp);
568 break;
569 }
570 }
571 else
572 fputc(*p,fp);
573 p++;
574 }
575 fputs("\n",fp);
576 }
577 pci = WinSendMsg(hwndCnr,CM_QUERYRECORDEMPHASIS,MPFROMP(pci),
578 MPFROMSHORT(attribute));
579 }
580 fclose(fp);
581 }
582 else
583 DosBeep(250,100);
584 }
585 else
586 DosBeep(100,100);
587 }
588 WinEnableWindow(hwnd,TRUE);
589 WinDismissDlg(hwnd,1);
590 break;
591 }
592 return 0;
593 }
594 return WinDefDlgProc(hwnd,msg,mp1,mp2);
595}
596
597
598MRESULT EXPENTRY SaveAllListDlgProc (HWND hwnd,ULONG msg,MPARAM mp1,
599 MPARAM mp2) {
600
601 CHAR **list;
602 CHAR savename[CCHMAXPATH] = "",pattern[81];
603
604 switch(msg) {
605 case WM_INITDLG:
606 if(!mp2) {
607 DosBeep(250,100);
608 WinDismissDlg(hwnd,0);
609 }
610 else {
611 WinSetWindowPtr(hwnd,0,mp2);
612 list = (CHAR **)mp2;
613 WinSendDlgItemMsg(hwnd,
614 SAV_FILENAME,
615 EM_SETTEXTLIMIT,
616 MPFROM2SHORT(CCHMAXPATH,0),
617 MPVOID);
618 WinSendDlgItemMsg(hwnd,
619 SAV_PATTERN,
620 EM_SETTEXTLIMIT,
621 MPFROM2SHORT(80,0),
622 MPVOID);
623 *savename = *pattern = 0;
624 {
625 ULONG size;
626
627 size = CCHMAXPATH;
628 PrfQueryProfileData(fmprof,
629 appname,
630 "SaveToListName",
631 savename,
632 &size);
633 size = 81;
634 PrfQueryProfileData(fmprof,
635 appname,
636 "SaveToListPattern",
637 pattern,
638 &size);
639 }
640 WinSetDlgItemText(hwnd,
641 SAV_FILENAME,
642 savename);
643 if(!*pattern)
644 strcpy(pattern,"%F %s");
645 {
646 CHAR temp[162];
647
[115]648 fixup(pattern,temp,sizeof(temp),strlen(pattern));
[2]649 WinSetDlgItemText(hwnd,SAV_PATTERN,temp);
650 }
651 {
652 FILE *fp;
653 CHAR s[CCHMAXPATH + 14];
654
655 save_dir2(s);
656 if(s[strlen(s) - 1] != '\\')
657 strcat(s,"\\");
658 strcat(s,"PATTERNS.DAT");
659 fp = _fsopen(s,"r",SH_DENYWR);
660 if(fp) {
661 while(fgets(s,81,fp)) {
662 s[80] = 0;
663 stripcr(s);
664 if(*s && *s != ';')
665 WinSendMsg(WinWindowFromID(hwnd,SAV_LISTBOX),LM_INSERTITEM,
666 MPFROM2SHORT(LIT_SORTASCENDING,0),
667 MPFROMP(s));
668 }
669 fclose(fp);
670 }
671 if(!WinSendDlgItemMsg(hwnd,SAV_LISTBOX,LM_QUERYITEMCOUNT,
672 MPVOID,MPVOID))
673 WinEnableWindow(WinWindowFromID(hwnd,SAV_LISTBOX),FALSE);
674 }
675 }
676 break;
677
678 case UM_SETDIR:
679 {
680 SHORT sSelect,sMax;
681 CHAR szBuffer[CCHMAXPATH + 14];
682 FILE *fp;
683
684 sMax = (SHORT)WinSendDlgItemMsg(hwnd,
685 SAV_LISTBOX,
686 LM_QUERYITEMCOUNT,
687 MPVOID,
688 MPVOID);
689 if(sMax > 0) {
690 save_dir2(szBuffer);
691 if(szBuffer[strlen(szBuffer) - 1] != '\\')
692 strcat(szBuffer,"\\");
693 strcat(szBuffer,"PATTERNS.DAT");
694 fp = fopen(szBuffer,"w");
695 if(fp) {
696 fputs(GetPString(IDS_LISTPATTERNTEXT),fp);
697 for(sSelect = 0;sSelect < sMax;sSelect++) {
698 *szBuffer = 0;
699 WinSendDlgItemMsg(hwnd,
700 SAV_LISTBOX,
701 LM_QUERYITEMTEXT,
702 MPFROM2SHORT(sSelect,81),
703 MPFROMP(szBuffer));
704 if(*szBuffer)
705 fprintf(fp,"%s\n",szBuffer);
706 }
707 fclose(fp);
708 }
709 else
710 DosBeep(500,100);
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);
[115]844 bstrip(savename);
[2]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 fp = _fsopen(savename,"r+",SH_DENYWR);
860 if(fp) {
861 fseek(fp,0L,SEEK_SET);
862 if(WinQueryButtonCheckstate(hwnd,SAV_APPEND) == 0)
863 DosSetFileSize((HFILE)fileno(fp),0L);
864 else
865 fseek(fp,0L,SEEK_END);
866 while(list[x]) {
867 hdir = HDIR_CREATE;
868 nm = 1L;
869 *subject = *longname = 0;
870 if(!DosFindFirst(list[x],&hdir,
871 FILE_NORMAL | FILE_DIRECTORY |
872 FILE_READONLY | FILE_ARCHIVED |
873 FILE_HIDDEN | FILE_SYSTEM,
874 &ffb4,sizeof(ffb4),&nm,
875 FIL_QUERYEASIZE)) {
876 /* load the object's Subject, if required */
[51]877 if(ffb4.cbList > 4L)
878 {
[2]879 APIRET rc;
880 EAOP2 eaop;
881 PGEA2LIST pgealist;
882 PFEA2LIST pfealist;
883 PGEA2 pgea;
884 PFEA2 pfea;
885 CHAR *value;
886
887 pgealist = malloc(sizeof(GEA2LIST) + 64);
888 if(pgealist) {
889 memset(pgealist,0,sizeof(GEA2LIST) + 64);
890 pgea = &pgealist->list[0];
891 strcpy(pgea->szName,SUBJECT);
892 pgea->cbName = strlen(pgea->szName);
893 pgea->oNextEntryOffset = 0L;
[51]894 pgealist->cbList = sizeof(GEA2LIST) + pgea->cbName;
[2]895 pfealist = malloc(1024);
896 if(pfealist) {
897 memset(pfealist,0,1024);
898 pfealist->cbList = 1024;
899 eaop.fpGEA2List = pgealist;
900 eaop.fpFEA2List = pfealist;
901 eaop.oError = 0L;
902 rc = DosQueryPathInfo(list[x],
903 FIL_QUERYEASFROMLIST,
904 (PVOID)&eaop,
905 (ULONG)sizeof(EAOP2));
906 if(!rc) {
907 pfea = &eaop.fpFEA2List->list[0];
908 value = pfea->szName + pfea->cbName + 1;
909 value[pfea->cbValue] = 0;
910 if(*(USHORT *)value == EAT_ASCII)
911 strncpy(subject,value +
912 (sizeof(USHORT) * 2),40);
913 subject[40] = 0;
914 }
915 free(pfealist);
916 }
917 free(pgealist);
918 }
919 }
920 /* load the object's longname */
[51]921 if(ffb4.cbList > 4L)
922 {
[2]923 APIRET rc;
924 EAOP2 eaop;
925 PGEA2LIST pgealist;
926 PFEA2LIST pfealist;
927 PGEA2 pgea;
928 PFEA2 pfea;
929 CHAR *value;
930
931 pgealist = malloc(sizeof(GEA2LIST) + 64);
932 if(pgealist) {
933 memset(pgealist,0,sizeof(GEA2LIST) + 64);
934 pgea = &pgealist->list[0];
935 strcpy(pgea->szName,LONGNAME);
936 pgea->cbName = strlen(pgea->szName);
937 pgea->oNextEntryOffset = 0L;
[51]938 pgealist->cbList = sizeof(GEA2LIST) + pgea->cbName;
[2]939 pfealist = malloc(1024);
940 if(pfealist) {
941 memset(pfealist,0,1024);
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':
[51]983 fprintf(fp,"%-5u",CBLIST_TO_EASIZE(ffb4.cbList));
[2]984 break;
985 case 'e':
[51]986 fprintf(fp,"%u",CBLIST_TO_EASIZE(ffb4.cbList));
[2]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 else
1066 DosBeep(250,100);
1067 }
1068 else
1069 DosBeep(100,100);
1070 }
1071 WinEnableWindow(hwnd,TRUE);
1072 WinDismissDlg(hwnd,1);
1073 break;
1074 }
1075 return 0;
1076 }
1077 return WinDefDlgProc(hwnd,msg,mp1,mp2);
1078}
Note: See TracBrowser for help on using the repository browser.