source: trunk/dll/saveclip.c

Last change on this file was 1673, checked in by Gregg Young, 8 years ago

Update to Doxygen comment style Ticket 55. Also some minor code cleanup.

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