source: trunk/dll/saveclip.c@ 1082

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

Changes so FM2 will use TMP/TEMP directory for all temp files; Replaced save_dir2 with global variable so BldFullPathName could easily replace code that performed the same function; Added #ifdef FORTIFY to free_ function that are only used when fortified.

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