source: trunk/dll/saveclip.c@ 1180

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

Ticket 187: Draft 2: Move remaining function declarations

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