source: trunk/dll/saveclip.c @ 762

Last change on this file since 762 was 762, checked in by Steven Levine, 13 years ago

Use two pass logic to free CNRITEMs and ARCITEMs
Rename pszLongname to pszLongName
More compare directories rework
Make directory sizes item draw placement deterministic - how did it ever work?

  • 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 762 2007-08-04 23:19:21Z stevenhl $
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) + 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, (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 = 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, (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, 0L, SEEK_SET);
437            if (WinQueryButtonCheckstate(hwnd, SAV_APPEND) == 0)
438              DosSetFileSize((HFILE) fileno(fp), 0L);
439            else
440              fseek(fp, 0L, 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, 0L, SEEK_SET);
786            if (WinQueryButtonCheckstate(hwnd, SAV_APPEND) == 0)
787              DosSetFileSize((HFILE) fileno(fp), 0L);
788            else
789              fseek(fp, 0L, 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 > 4L) {
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 = 0L;
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 = 0L;
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 > 4L) {
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 = 0L;
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.