source: trunk/dll/saveclip.c@ 1402

Last change on this file since 1402 was 1402, checked in by Gregg Young, 16 years ago

Remove variable aurgs from docopy & unlinkf (not used); Move more strings to PCSZs and string table; Move PCSZs to compile time initialization; Fix hang on startup caused by a drive scan and a dircnr scan trying to update a drive in the tree at the same time (related to the "treeswitch options); Code cleanup mainly removal of old printfs, SayMsgs, DbgMsg and unneeded %s.

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