source: trunk/dll/saveclip.c@ 1397

Last change on this file since 1397 was 1397, checked in by Gregg Young, 17 years ago

Some clean up of the date formatting code

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