source: trunk/dll/saveclip.c@ 957

Last change on this file since 957 was 957, checked in by Gregg Young, 18 years ago

Changed _fsopen flag so a new list file can be created. (ticket 222)

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