source: trunk/dll/saveclip.c@ 907

Last change on this file since 907 was 907, checked in by Steven Levine, 18 years ago

Avoid out of memory traps in Compare Directories
Rework Compare Directories progress display for 2 second update rate
Start refactoring to reduce dependence on fm3dll.h
Add timer services (IsITimerExpired etc.)

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