source: trunk/dll/saveclip.c@ 352

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

Use Runtime_Error

  • 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 352 2006-07-26 19:35:45Z root $
5
6 Save file list to clipboard
7
8 Copyright (c) 1993-98 M. Kimes
[352]9 Copyright (c) 2005, 2006 Steven H. Levine
[51]10
[159]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
[352]15 17 Jul 06 SHL Use Runtime_Error
[51]16
17***********************************************************************/
18
[2]19#define INCL_DOS
20#define INCL_WIN
[352]21#include <os2.h>
[2]22
23#include <stdarg.h>
24#include <stdio.h>
25#include <stdlib.h>
26#include <string.h>
27#include <share.h>
[352]28
[2]29#include "fm3dll.h"
30#include "fm3dlg.h"
31#include "fm3str.h"
32
[352]33static PSZ pszSrcFile = __FILE__;
34
[2]35#pragma alloc_text(FMCLIPBOARDIN,SaveToClip,SaveToClipHab)
36#pragma alloc_text(FMCLIPBOARDOUT,ListToClipboard,ListToClipboardHab)
37#pragma alloc_text(FMCLIPBOARDOUT,ListFromClipboard,ListFromClipboardHab)
38
39
[352]40BOOL SaveToClip (HWND hwnd,CHAR *text,BOOL append)
41{
[2]42 HAB hab = WinQueryAnchorBlock(hwnd);
43
44 return SaveToClipHab(hab,text,append);
45}
46
47
[352]48BOOL SaveToClipHab (HAB hab,CHAR *text,BOOL append)
49{
[2]50 CHAR *clip = NULL,*hold = NULL,*p;
51 ULONG len;
52 BOOL ret = FALSE;
53
54 if(text) {
55 len = strlen(text);
56 p = text;
57 while(*p) {
58 if(*p == '\n' && (p == text || *(p - 1) != '\r'))
59 len++;
60 p++;
61 }
62 if(len) {
63 if(WinOpenClipbrd(hab)) {
64 if(append)
65 clip = (CHAR *)WinQueryClipbrdData(hab,CF_TEXT);
66 if(clip)
67 len += strlen(clip) + 1L;
68 if(!DosAllocSharedMem((PPVOID)&hold,(PSZ)NULL,len,PAG_COMMIT |
69 OBJ_GIVEABLE | PAG_READ | PAG_WRITE)) {
70 *hold = 0;
71 if(clip)
72 strcpy(hold,clip);
73 p = hold + strlen(hold);
74 strcpy(p,text);
75 while(*p) {
76 if(*p == '\n' && (p == hold || *(p - 1) != '\r')) {
77 memmove(p + 1,p,strlen(p) + 1);
78 *p = '\r';
79 }
80 p++;
81 }
82 WinEmptyClipbrd(hab);
83 if(!WinSetClipbrdData(hab,
84 (ULONG)hold,
85 CF_TEXT,
86 CFI_POINTER))
87 DosFreeMem(hold);
88 else
89 ret = TRUE;
90 }
91 WinCloseClipbrd(hab);
92 }
93 }
94 }
95 return ret;
96}
97
98
[352]99VOID ListToClipboard (HWND hwnd,CHAR **list,BOOL append)
100{
[2]101 HAB hab = WinQueryAnchorBlock(hwnd);
102
103 ListToClipboardHab(hab,list,append);
104}
105
106
[352]107VOID ListToClipboardHab (HAB hab,CHAR **list,BOOL append)
108{
[2]109 CHAR *text = NULL,**clip = NULL;
110 INT x;
111 ULONG len = 0L;
112
113 if(list && list[0]) {
114 for(x = 0;list[x];x++)
115 len += strlen(list[x]) + 2;
116 if(len)
117 len++;
118 if(len) {
119 if(append)
120 clip = ListFromClipboardHab(hab);
121 if(clip && clip[0]) {
122 for(x = 0;clip[x];x++)
123 len += strlen(clip[x]) + 2;
124 len++;
125 }
126 if(WinOpenClipbrd(hab)) {
127 if(!DosAllocSharedMem((PPVOID)&text,(PSZ)NULL,len,PAG_COMMIT |
128 OBJ_GIVEABLE | PAG_READ | PAG_WRITE)) {
129 *text = 0;
130 if(clip && clip[0]) {
131 for(x = 0;clip[x];x++) {
132 strcat(text,clip[x]);
133 strcat(text,"\r\n");
134 }
135 }
136 for(x = 0;list[x];x++) {
137 strcat(text,list[x]);
138 strcat(text,"\r\n");
139 }
140 WinEmptyClipbrd(hab);
141 if(!WinSetClipbrdData(hab,
142 (ULONG)text,
143 CF_TEXT,
144 CFI_POINTER))
145 DosFreeMem(text);
146 }
147 WinCloseClipbrd(hab);
148 }
149 if(clip)
150 FreeList(clip);
151 }
152 }
153}
154
155
[352]156CHAR ** ListFromClipboard (HWND hwnd)
157{
[2]158 HAB hab = WinQueryAnchorBlock(hwnd);
159
160 return ListFromClipboardHab(hab);
161}
162
163
[352]164CHAR **ListFromClipboardHab (HAB hab)
165{
[2]166 CHAR *p,*pp,*text = NULL,**list = NULL;
167 INT numfiles = 0,numalloced = 0;
168
169 if(WinOpenClipbrd(hab)) {
170 p = (CHAR *)WinQueryClipbrdData(hab,CF_TEXT);
171 if(p && *p)
[352]172 text = xstrdup(p,pszSrcFile,__LINE__);
[2]173 WinCloseClipbrd(hab);
[352]174 if (text) {
[115]175 bstrip(text);
176 pp = text;
[2]177 p = strchr(pp,'\r');
178 if(!p)
179 p = strchr(pp,'\n');
180 while(p && *p) {
181 *p = 0;
182 p++;
183 while(*p == '\r' || *p == '\n' || *p == ' ' || *p == '\t')
184 p++;
185 rstrip(pp);
186 if(*pp) {
187 if(AddToList(pp,&list,&numfiles,&numalloced))
188 break;
189 }
190 pp = p;
191 p = strchr(pp,'\r');
192 if(!p)
193 p = strchr(pp,'\n');
194 }
195 free(text);
196 }
197 }
198 return list;
199}
200
201
202#pragma alloc_text(SAVELIST,SaveListDlgProc,SaveAllListDlgProc)
203
[51]204MRESULT EXPENTRY SaveListDlgProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
205{
[2]206 HWND hwndCnr;
207 CHAR savename[CCHMAXPATH] = "",pattern[81];
208
209 switch(msg) {
210 case WM_INITDLG:
211 if(!mp2) {
[352]212 Runtime_Error(pszSrcFile, __LINE__, "no data");
[2]213 WinDismissDlg(hwnd,0);
214 }
215 else {
216 WinSetWindowPtr(hwnd,0,mp2);
217 hwndCnr = *(HWND *)mp2;
218 WinSendDlgItemMsg(hwnd,
219 SAV_FILENAME,
220 EM_SETTEXTLIMIT,
221 MPFROM2SHORT(CCHMAXPATH,0),
222 MPVOID);
223 WinSendDlgItemMsg(hwnd,
224 SAV_PATTERN,
225 EM_SETTEXTLIMIT,
226 MPFROM2SHORT(80,0),
227 MPVOID);
228 *savename = *pattern = 0;
229 {
230 ULONG size;
231
232 size = CCHMAXPATH;
233 PrfQueryProfileData(fmprof,
234 appname,
235 "SaveToListName",
236 savename,
237 &size);
238 size = 81;
239 PrfQueryProfileData(fmprof,
240 appname,
241 "SaveToListPattern",
242 pattern,
243 &size);
244 }
245 WinSetDlgItemText(hwnd,
246 SAV_FILENAME,
247 savename);
248 if(!*pattern)
249 strcpy(pattern,
250 "%F %s");
251 {
252 CHAR temp[162];
253
254 fixup(pattern,
255 temp,
[115]256 sizeof(temp),
[2]257 strlen(pattern));
258 WinSetDlgItemText(hwnd,
259 SAV_PATTERN,
260 temp);
261 }
262 {
263 FILE *fp;
264 CHAR s[CCHMAXPATH + 14];
265
266 save_dir2(s);
267 if(s[strlen(s) - 1] != '\\')
268 strcat(s,"\\");
269 strcat(s,"PATTERNS.DAT");
270 fp = _fsopen(s,"r",SH_DENYWR);
271 if(fp) {
272 while(fgets(s,81,fp)) {
273 s[80] = 0;
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");
[352]302 fp = xfopen(szBuffer,"w",pszSrcFile,__LINE__);
303 if (fp) {
[2]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);
[115]449 bstrip(savename);
[2]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 }
[352]475 if(!pci || (INT)pci == -1)
476 Runtime_Error(pszSrcFile, __LINE__, "no data");
477 else {
[2]478 fp = _fsopen(savename,"r+",SH_DENYWR);
[352]479 if(!fp)
480 Runtime_Error(pszSrcFile, __LINE__, "_fsopen");
481 else {
[2]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':
[159]495 fputs(pci->szSubject,fp);
[2]496 break;
497 case 'S':
[159]498 fprintf(fp,"%-40s",pci->szSubject);
[2]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':
[159]529 fputs(pci->szLongname,fp);
[2]530 break;
531 case 'L':
532 fprintf(fp,
533 "%-40s",
[159]534 pci->szLongname);
[2]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) {
[352]610 Runtime_Error(pszSrcFile, __LINE__, "no data");
[2]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
[115]651 fixup(pattern,temp,sizeof(temp),strlen(pattern));
[2]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(fgets(s,81,fp)) {
665 s[80] = 0;
666 stripcr(s);
667 if(*s && *s != ';')
668 WinSendMsg(WinWindowFromID(hwnd,SAV_LISTBOX),LM_INSERTITEM,
669 MPFROM2SHORT(LIT_SORTASCENDING,0),
670 MPFROMP(s));
671 }
672 fclose(fp);
673 }
674 if(!WinSendDlgItemMsg(hwnd,SAV_LISTBOX,LM_QUERYITEMCOUNT,
675 MPVOID,MPVOID))
676 WinEnableWindow(WinWindowFromID(hwnd,SAV_LISTBOX),FALSE);
677 }
678 }
679 break;
680
681 case UM_SETDIR:
682 {
683 SHORT sSelect,sMax;
684 CHAR szBuffer[CCHMAXPATH + 14];
685 FILE *fp;
686
687 sMax = (SHORT)WinSendDlgItemMsg(hwnd,
688 SAV_LISTBOX,
689 LM_QUERYITEMCOUNT,
690 MPVOID,
691 MPVOID);
692 if(sMax > 0) {
693 save_dir2(szBuffer);
694 if(szBuffer[strlen(szBuffer) - 1] != '\\')
695 strcat(szBuffer,"\\");
696 strcat(szBuffer,"PATTERNS.DAT");
[352]697 fp = xfopen(szBuffer,"w",pszSrcFile,__LINE__);
[2]698 if(fp) {
699 fputs(GetPString(IDS_LISTPATTERNTEXT),fp);
700 for(sSelect = 0;sSelect < sMax;sSelect++) {
701 *szBuffer = 0;
702 WinSendDlgItemMsg(hwnd,
703 SAV_LISTBOX,
704 LM_QUERYITEMTEXT,
705 MPFROM2SHORT(sSelect,81),
706 MPFROMP(szBuffer));
707 if(*szBuffer)
708 fprintf(fp,"%s\n",szBuffer);
709 }
710 fclose(fp);
711 }
712 }
713 else if(!sMax) {
714 save_dir2(szBuffer);
715 if(szBuffer[strlen(szBuffer) - 1] != '\\')
716 strcat(szBuffer,"\\");
717 strcat(szBuffer,"PATTERNS.DAT");
718 unlinkf("%s",szBuffer);
719 }
720 }
721 return 0;
722
723 case WM_CONTROL:
724 if(SHORT1FROMMP(mp1) == SAV_LISTBOX) {
725
726 SHORT sSelect;
727 CHAR szBuffer[81];
728
729 switch(SHORT2FROMMP(mp1)) {
730 case LN_SELECT:
731 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,SAV_LISTBOX,
732 LM_QUERYSELECTION,
733 MPFROMSHORT(LIT_FIRST),
734 MPVOID);
735 if(sSelect >= 0) {
736 *szBuffer = 0;
737 WinSendDlgItemMsg(hwnd,SAV_LISTBOX,LM_QUERYITEMTEXT,
738 MPFROM2SHORT(sSelect,81),
739 MPFROMP(szBuffer));
740 if(*szBuffer)
741 WinSetDlgItemText(hwnd,SAV_PATTERN,szBuffer);
742 }
743 break;
744
745 case LN_ENTER:
746 PostMsg(hwnd,WM_COMMAND,MPFROM2SHORT(DID_OK,0),MPVOID);
747 break;
748 }
749 }
750 return 0;
751
752 case WM_COMMAND:
753 list = (CHAR **)INSTDATA(hwnd);
754 switch(SHORT1FROMMP(mp1)) {
755 case DID_CANCEL:
756 WinDismissDlg(hwnd,0);
757 break;
758
759 case IDM_HELP:
760 if(hwndHelp)
761 WinSendMsg(hwndHelp,HM_DISPLAY_HELP,
762 MPFROM2SHORT(HELP_SAVETOLIST,0),
763 MPFROMSHORT(HM_RESOURCEID));
764 break;
765
766 case SAV_FIND:
767 {
768 *savename = 0;
769 WinQueryDlgItemText(hwnd,SAV_FILENAME,CCHMAXPATH,savename);
770 if(!*savename)
771 strcpy(savename,"*.LST");
772 if(export_filename(hwnd,savename,1) && *savename) {
773 if(!strchr(savename,'.'))
774 strcat(savename,".LST");
775 WinSetDlgItemText(hwnd,SAV_FILENAME,savename); }
776 }
777 break;
778
779 case SAV_ADD:
780 case SAV_DEL:
781 case DID_OK:
782 WinEnableWindow(hwnd,FALSE);
783 {
784 FILE *fp;
785 CHAR *p,*pp,temp;
786 INT x = 0;
787 SHORT sSelect;
788 FILEFINDBUF4 ffb4;
789 ULONG nm;
790 HDIR hdir;
791 CHAR longname[CCHMAXPATH],subject[42];
792
793 *pattern = 0;
794 WinQueryDlgItemText(hwnd,SAV_PATTERN,80,pattern);
795 if(!*pattern) {
796 WinEnableWindow(hwnd,TRUE);
797 DosBeep(150,100);
798 break;
799 }
800 {
801 switch(SHORT1FROMMP(mp1)) {
802 case SAV_ADD:
803 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,SAV_LISTBOX,
804 LM_SEARCHSTRING,
805 MPFROM2SHORT(0,LIT_FIRST),
806 MPFROMP(pattern));
807 if(sSelect < 0) {
808 WinSendDlgItemMsg(hwnd,SAV_LISTBOX,LM_INSERTITEM,
809 MPFROM2SHORT(LIT_SORTASCENDING,0),
810 MPFROMP(pattern));
811 WinSendMsg(hwnd,UM_SETDIR,MPVOID,MPVOID);
812 }
813 WinEnableWindow(hwnd,TRUE);
814 return 0;
815
816 case SAV_DEL:
817 sSelect = (SHORT)WinSendDlgItemMsg(hwnd,SAV_LISTBOX,
818 LM_QUERYSELECTION,
819 MPFROM2SHORT(LIT_FIRST,0),
820 MPVOID);
821 if(sSelect >= 0) {
822 WinSendDlgItemMsg(hwnd,SAV_LISTBOX,LM_DELETEITEM,
823 MPFROM2SHORT(sSelect,0),MPVOID);
824 WinSendMsg(hwnd,UM_SETDIR,MPVOID,MPVOID);
825 }
826 WinEnableWindow(hwnd,TRUE);
827 return 0;
828 }
829 }
830 literal(pattern);
831 if(!*pattern) {
832 WinEnableWindow(hwnd,TRUE);
833 DosBeep(250,100);
834 break;
835 }
836 PrfWriteProfileString(fmprof,
837 appname,
838 "SaveToListPattern",
839 pattern);
840 *savename = 0;
841 WinQueryDlgItemText(hwnd,
842 SAV_FILENAME,
843 CCHMAXPATH,
844 savename);
[115]845 bstrip(savename);
[2]846 if(!*savename) {
847 WinEnableWindow(hwnd,TRUE);
848 DosBeep(100,100);
849 break;
850 }
851 if(stricmp(savename,"PRN") &&
852 strnicmp(savename,"\\DEV\\LPT",8) &&
853 !strchr(savename,'.'))
854 strcat(savename,".LST");
855 PrfWriteProfileString(fmprof,
856 appname,
857 "SaveToListName",
858 savename);
[352]859 if (!list || !list[0])
860 Runtime_Error(pszSrcFile, __LINE__, "no data");
861 else {
[2]862 fp = _fsopen(savename,"r+",SH_DENYWR);
[352]863 if (!fp)
864 Runtime_Error(pszSrcFile, __LINE__, "_fsopen");
865 else {
[2]866 fseek(fp,0L,SEEK_SET);
867 if(WinQueryButtonCheckstate(hwnd,SAV_APPEND) == 0)
868 DosSetFileSize((HFILE)fileno(fp),0L);
869 else
870 fseek(fp,0L,SEEK_END);
871 while(list[x]) {
872 hdir = HDIR_CREATE;
873 nm = 1L;
874 *subject = *longname = 0;
875 if(!DosFindFirst(list[x],&hdir,
876 FILE_NORMAL | FILE_DIRECTORY |
877 FILE_READONLY | FILE_ARCHIVED |
878 FILE_HIDDEN | FILE_SYSTEM,
879 &ffb4,sizeof(ffb4),&nm,
880 FIL_QUERYEASIZE)) {
881 /* load the object's Subject, if required */
[51]882 if(ffb4.cbList > 4L)
883 {
[2]884 APIRET rc;
885 EAOP2 eaop;
886 PGEA2LIST pgealist;
887 PFEA2LIST pfealist;
888 PGEA2 pgea;
889 PFEA2 pfea;
890 CHAR *value;
891
[352]892 pgealist = xmallocz(sizeof(GEA2LIST) + 64,pszSrcFile,__LINE__);
893 if (pgealist) {
[2]894 pgea = &pgealist->list[0];
895 strcpy(pgea->szName,SUBJECT);
896 pgea->cbName = strlen(pgea->szName);
897 pgea->oNextEntryOffset = 0L;
[51]898 pgealist->cbList = sizeof(GEA2LIST) + pgea->cbName;
[352]899 pfealist = xmallocz(1024,pszSrcFile,__LINE__);
[2]900 if(pfealist) {
901 pfealist->cbList = 1024;
902 eaop.fpGEA2List = pgealist;
903 eaop.fpFEA2List = pfealist;
904 eaop.oError = 0L;
905 rc = DosQueryPathInfo(list[x],
906 FIL_QUERYEASFROMLIST,
907 (PVOID)&eaop,
908 (ULONG)sizeof(EAOP2));
909 if(!rc) {
910 pfea = &eaop.fpFEA2List->list[0];
911 value = pfea->szName + pfea->cbName + 1;
912 value[pfea->cbValue] = 0;
913 if(*(USHORT *)value == EAT_ASCII)
914 strncpy(subject,value +
915 (sizeof(USHORT) * 2),40);
916 subject[40] = 0;
917 }
918 free(pfealist);
919 }
920 free(pgealist);
921 }
922 }
923 /* load the object's longname */
[51]924 if(ffb4.cbList > 4L)
925 {
[2]926 APIRET rc;
927 EAOP2 eaop;
928 PGEA2LIST pgealist;
929 PFEA2LIST pfealist;
930 PGEA2 pgea;
931 PFEA2 pfea;
932 CHAR *value;
933
[352]934 pgealist = xmallocz(sizeof(GEA2LIST) + 64,pszSrcFile,__LINE__);
935 if (pgealist) {
[2]936 pgea = &pgealist->list[0];
937 strcpy(pgea->szName,LONGNAME);
938 pgea->cbName = strlen(pgea->szName);
939 pgea->oNextEntryOffset = 0L;
[51]940 pgealist->cbList = sizeof(GEA2LIST) + pgea->cbName;
[352]941 pfealist = xmallocz(1024,pszSrcFile,__LINE__);
942 if (pfealist) {
[2]943 pfealist->cbList = 1024;
944 eaop.fpGEA2List = pgealist;
945 eaop.fpFEA2List = pfealist;
946 eaop.oError = 0L;
947 rc = DosQueryPathInfo(list[x],
948 FIL_QUERYEASFROMLIST,
949 (PVOID)&eaop,
950 (ULONG)sizeof(EAOP2));
[352]951 if (!rc) {
[2]952 pfea = &eaop.fpFEA2List->list[0];
953 value = pfea->szName + pfea->cbName + 1;
954 value[pfea->cbValue] = 0;
955 if(*(USHORT *)value == EAT_ASCII)
956 strncpy(longname,value +
957 (sizeof(USHORT) * 2),CCHMAXPATHCOMP);
958 longname[CCHMAXPATHCOMP - 1] = 0;
959 }
960 free(pfealist);
961 }
962 free(pgealist);
963 }
964 }
965
966 p = pattern;
967 while(*p) {
968 if(*p == '%') {
969 p++;
970 switch(*p) {
971 case 's':
972 fputs(subject,fp);
973 break;
974 case 'S':
975 fprintf(fp,"%-40s",subject);
976 break;
977 case 'Z':
978 fprintf(fp,"%-13lu",ffb4.cbFile);
979 break;
980 case 'z':
981 fprintf(fp,"%lu",ffb4.cbFile);
982 break;
983 case 'E':
[51]984 fprintf(fp,"%-5u",CBLIST_TO_EASIZE(ffb4.cbList));
[2]985 break;
986 case 'e':
[51]987 fprintf(fp,"%u",CBLIST_TO_EASIZE(ffb4.cbList));
[2]988 break;
989 case 'd':
990 case 'D':
991 fprintf(fp,
992 "%04u/%02u/%02u",
993 ffb4.fdateLastWrite.year + 1980,
994 ffb4.fdateLastWrite.month,
995 ffb4.fdateLastWrite.day);
996 break;
997 case 't':
998 case 'T':
999 fprintf(fp,
1000 "%02u:%02u:%02u",
1001 ffb4.ftimeLastWrite.hours,
1002 ffb4.ftimeLastWrite.minutes,
1003 ffb4.ftimeLastWrite.twosecs * 2);
1004 break;
1005 case 'l':
1006 fputs(longname,fp);
1007 break;
1008 case 'L':
1009 fprintf(fp,
1010 "%-40s",
1011 longname);
1012 break;
1013 case 'F':
1014 case 'f':
1015 if(IsRoot(list[x]))
1016 pp = list[x];
1017 else {
1018 pp = strrchr(list[x],'\\');
1019 if(pp)
1020 pp++;
1021 else
1022 pp = list[x];
1023 }
1024 if(*p == 'F')
1025 fprintf(fp,
1026 "%-13s",
1027 pp);
1028 else
1029 fputs(pp,fp);
1030 break;
1031 case 'p':
1032 fputs(list[x],fp);
1033 break;
1034 case 'P':
1035 temp = 0;
1036 if(!IsRoot(list[x])) {
1037 pp = strrchr(list[x],'\\');
1038 if(pp) {
1039 temp = *pp;
1040 *pp = 0;
1041 }
1042 }
1043 fputs(list[x],fp);
1044 if(temp)
1045 *pp = temp;
1046 break;
1047 case '$':
1048 fputc(*list[x],fp);
1049 break;
1050 case '%':
1051 fputc('%',fp);
1052 break;
1053 }
1054 }
1055 else
1056 fputc(*p,fp);
1057 p++;
1058 }
1059 fputs("\n",fp);
1060 DosFindClose(hdir);
1061 }
1062 x++;
1063 }
1064 fclose(fp);
1065 }
1066 }
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.