source: trunk/dll/saveclip.c @ 766

Last change on this file since 766 was 766, checked in by Gregg Young, 13 years ago

format cleanup

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