source: trunk/dll/saveclip.c@ 1212

Last change on this file since 1212 was 1212, checked in by John Small, 17 years ago

Ticket 187: Move data declarations/definitions out of fm3dll.h

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