source: trunk/dll/saveclip.c@ 847

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

Removed large file APIs from code where hey are not needed.

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