source: trunk/dll/saveclip.c@ 1119

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

Comments for CS 1118 (Tickets 154 (not 152), 270)

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