source: trunk/dll/saveclip.c@ 1438

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

Improved drivebar changes; Added AddBackslashToPath() to remove repeatative code. replaced "
" with PCSZ variable; ANY_OBJ added the DosAlloc... (experimental)

  • 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 1438 2009-06-28 20:47:00Z 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;
[1438]102 if (!xDosAllocSharedMem((PPVOID) &hold, (PSZ) NULL, len, PAG_COMMIT |
[551]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)) {
[1438]171 if (!xDosAllocSharedMem((PPVOID) &text, (PSZ) NULL, len, PAG_COMMIT |
172 OBJ_GIVEABLE | PAG_READ | PAG_WRITE)) {
[551]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;
[1438]244 CHAR savename[CCHMAXPATH] = "";
245 CHAR pattern[81];
[2]246
[551]247 switch (msg) {
248 case WM_INITDLG:
249 if (!mp2) {
[1398]250 Runtime_Error(pszSrcFile, __LINE__, NULL);
[551]251 WinDismissDlg(hwnd, 0);
252 }
253 else {
[574]254 WinSetWindowPtr(hwnd, QWL_USER, mp2);
[551]255 hwndCnr = *(HWND *) mp2;
256 WinSendDlgItemMsg(hwnd,
257 SAV_FILENAME,
258 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
259 WinSendDlgItemMsg(hwnd,
260 SAV_PATTERN,
261 EM_SETTEXTLIMIT, MPFROM2SHORT(80, 0), MPVOID);
262 *savename = *pattern = 0;
263 {
264 ULONG size;
265
266 size = CCHMAXPATH;
267 PrfQueryProfileData(fmprof,
268 appname, "SaveToListName", savename, &size);
[871]269 size = MAX_PATTERN_BYTES + 1;
[551]270 PrfQueryProfileData(fmprof,
271 appname, "SaveToListPattern", pattern, &size);
[2]272 }
[551]273 WinSetDlgItemText(hwnd, SAV_FILENAME, savename);
274 if (!*pattern)
275 strcpy(pattern, "%F %s");
276 {
[871]277 CHAR temp[MAX_PATTERN_BYTES * 4 + 1];
[2]278
[551]279 fixup(pattern, temp, sizeof(temp), strlen(pattern));
280 WinSetDlgItemText(hwnd, SAV_PATTERN, temp);
281 }
282 {
283 FILE *fp;
284 CHAR s[CCHMAXPATH + 14];
[2]285
[1398]286 BldFullPathName(s, pFM2SaveDirectory, PCSZ_PATTERNSDAT);
[551]287 fp = _fsopen(s, "r", SH_DENYWR);
288 if (fp) {
289 while (xfgets(s, 81, fp, pszSrcFile, __LINE__)) {
290 stripcr(s);
291 if (*s && *s != ';')
292 WinSendMsg(WinWindowFromID(hwnd, SAV_LISTBOX), LM_INSERTITEM,
293 MPFROM2SHORT(LIT_SORTASCENDING, 0), MPFROMP(s));
294 }
295 fclose(fp);
296 }
297 if (!WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_QUERYITEMCOUNT,
298 MPVOID, MPVOID))
299 WinEnableWindow(WinWindowFromID(hwnd, SAV_LISTBOX), FALSE);
[2]300 }
[551]301 }
302 break;
[2]303
[551]304 case UM_SETDIR:
305 {
306 SHORT sSelect, sMax;
307 CHAR szBuffer[CCHMAXPATH + 14];
308 FILE *fp;
[2]309
[551]310 sMax = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
311 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
312 if (sMax > 0) {
[1398]313 BldFullPathName(szBuffer, pFM2SaveDirectory, PCSZ_PATTERNSDAT);
[1118]314 if (CheckDriveSpaceAvail(szBuffer, ullDATFileSpaceNeeded, 1) == 2)
[1117]315 break; //already gave error msg
[551]316 fp = xfopen(szBuffer, "w", pszSrcFile, __LINE__);
317 if (fp) {
318 fputs(GetPString(IDS_LISTPATTERNTEXT), fp);
319 for (sSelect = 0; sSelect < sMax; sSelect++) {
320 *szBuffer = 0;
321 WinSendDlgItemMsg(hwnd,
322 SAV_LISTBOX,
323 LM_QUERYITEMTEXT,
324 MPFROM2SHORT(sSelect, 81), MPFROMP(szBuffer));
325 if (*szBuffer)
326 fprintf(fp, "%s\n", szBuffer);
327 }
328 fclose(fp);
329 }
[2]330 }
[551]331 else if (!sMax) {
[1398]332 BldFullPathName(szBuffer, pFM2SaveDirectory, PCSZ_PATTERNSDAT);
[1402]333 unlinkf(szBuffer);
[551]334 }
335 }
336 return 0;
[2]337
[551]338 case WM_CONTROL:
339 if (SHORT1FROMMP(mp1) == SAV_LISTBOX) {
[2]340
[551]341 SHORT sSelect;
342 CHAR szBuffer[81];
[2]343
[551]344 switch (SHORT2FROMMP(mp1)) {
345 case LN_SELECT:
346 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
347 LM_QUERYSELECTION,
348 MPFROMSHORT(LIT_FIRST), MPVOID);
349 if (sSelect >= 0) {
350 *szBuffer = 0;
351 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_QUERYITEMTEXT,
352 MPFROM2SHORT(sSelect, 81), MPFROMP(szBuffer));
353 if (*szBuffer)
354 WinSetDlgItemText(hwnd, SAV_PATTERN, szBuffer);
355 }
356 break;
[2]357
[551]358 case LN_ENTER:
359 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
360 break;
[2]361 }
[551]362 }
363 return 0;
[2]364
[551]365 case WM_COMMAND:
366 hwndCnr = *(HWND *) INSTDATA(hwnd);
367 switch (SHORT1FROMMP(mp1)) {
368 case DID_CANCEL:
369 WinDismissDlg(hwnd, 0);
370 break;
[2]371
[551]372 case IDM_HELP:
373 if (hwndHelp)
374 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
375 MPFROM2SHORT(HELP_SAVETOLIST, 0),
376 MPFROMSHORT(HM_RESOURCEID));
377 break;
[2]378
[551]379 case SAV_FIND:
380 {
381 *savename = 0;
382 WinQueryDlgItemText(hwnd, SAV_FILENAME, CCHMAXPATH, savename);
383 if (!*savename)
[1395]384 strcpy(savename, PCSZ_STARDOTLST);
[551]385 if (export_filename(hwnd, savename, 1) && *savename) {
386 if (!strchr(savename, '.'))
[1398]387 strcat(savename, PCSZ_DOTLST);
[551]388 WinSetDlgItemText(hwnd, SAV_FILENAME, savename);
389 }
390 }
391 break;
[2]392
[551]393 case SAV_ADD:
394 case SAV_DEL:
395 case DID_OK:
396 WinEnableWindow(hwnd, FALSE);
397 {
398 PCNRITEM pci;
399 FILE *fp;
[897]400 CHAR *p, *pp, temp;
401 CHAR szCmmaFmtFileSize[81];
[551]402 INT attribute = CRA_CURSORED;
403 SHORT sSelect;
[2]404
[551]405 *pattern = 0;
406 WinQueryDlgItemText(hwnd, SAV_PATTERN, 80, pattern);
407 if (!*pattern) {
408 WinEnableWindow(hwnd, TRUE);
[1395]409 if (!fAlertBeepOff)
410 DosBeep(150, 100);
[551]411 break;
412 }
413 {
414 switch (SHORT1FROMMP(mp1)) {
415 case SAV_ADD:
416 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
417 LM_SEARCHSTRING,
418 MPFROM2SHORT(0, LIT_FIRST),
419 MPFROMP(pattern));
420 if (sSelect < 0) {
421 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_INSERTITEM,
422 MPFROM2SHORT(LIT_SORTASCENDING, 0),
423 MPFROMP(pattern));
424 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
425 }
426 WinEnableWindow(hwnd, TRUE);
427 return 0;
[2]428
[551]429 case SAV_DEL:
430 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
431 LM_QUERYSELECTION,
432 MPFROM2SHORT(LIT_FIRST, 0),
433 MPVOID);
434 if (sSelect >= 0) {
435 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_DELETEITEM,
436 MPFROM2SHORT(sSelect, 0), MPVOID);
437 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
438 }
439 WinEnableWindow(hwnd, TRUE);
440 return 0;
441 }
442 }
443 literal(pattern);
444 if (!*pattern) {
445 WinEnableWindow(hwnd, TRUE);
[1395]446 if (!fAlertBeepOff)
447 DosBeep(250, 100);
[551]448 break;
449 }
450 PrfWriteProfileString(fmprof, appname, "SaveToListPattern", pattern);
451 *savename = 0;
452 WinQueryDlgItemText(hwnd, SAV_FILENAME, CCHMAXPATH, savename);
453 bstrip(savename);
454 if (!*savename) {
455 WinEnableWindow(hwnd, TRUE);
[1395]456 if (!fAlertBeepOff)
457 DosBeep(100, 100);
[551]458 break;
459 }
460 if (stricmp(savename, "PRN") &&
461 strnicmp(savename, "\\DEV\\LPT", 8) && !strchr(savename, '.'))
[1398]462 strcat(savename, PCSZ_DOTLST);
[551]463 PrfWriteProfileString(fmprof, appname, "SaveToListName", savename);
464 pci = (PCNRITEM) WinSendMsg(hwndCnr,
465 CM_QUERYRECORDEMPHASIS,
466 MPFROMLONG(CMA_FIRST),
467 MPFROMSHORT(attribute));
468 if (pci && (INT) pci != -1) {
469 if (pci->rc.flRecordAttr & CRA_SELECTED) {
470 attribute = CRA_SELECTED;
471 pci = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS,
472 MPFROMLONG(CMA_FIRST), MPFROMSHORT(attribute));
473 }
474 }
475 if (!pci || (INT) pci == -1)
[1398]476 Runtime_Error(pszSrcFile, __LINE__, NULL);
[551]477 else {
[957]478 fp = _fsopen(savename, "w+", SH_DENYWR);
[551]479 if (!fp)
480 Runtime_Error(pszSrcFile, __LINE__, "_fsopen");
481 else {
[766]482 fseek(fp, 0, SEEK_SET);
[551]483 if (WinQueryButtonCheckstate(hwnd, SAV_APPEND) == 0)
[847]484 DosSetFileSize((HFILE) fileno(fp), 0);
[551]485 else
[766]486 fseek(fp, 0, SEEK_END);
[551]487 while (pci && (INT) pci != -1) {
488 if (!(pci->rc.flRecordAttr & CRA_FILTERED)) {
489 p = pattern;
490 while (*p) {
491 if (*p == '%') {
492 p++;
493 switch (*p) {
494 case 's':
[730]495 fputs(pci->pszSubject, fp);
[551]496 break;
497 case 'S':
[730]498 fprintf(fp, "%-40s", pci->pszSubject);
[551]499 break;
500 case 'Z':
[897]501 CommaFmtULL(szCmmaFmtFileSize,
502 sizeof(szCmmaFmtFileSize), pci->cbFile, ' ');
503 fprintf(fp, "%-13s", szCmmaFmtFileSize);
[551]504 break;
505 case 'z':
[897]506 CommaFmtULL(szCmmaFmtFileSize,
507 sizeof(szCmmaFmtFileSize), pci->cbFile, ' ');
508 fprintf(fp, "%s", szCmmaFmtFileSize);
[551]509 break;
510 case 'E':
511 fprintf(fp, "%-5u", pci->easize);
512 break;
513 case 'e':
514 fprintf(fp, "%u", pci->easize);
515 break;
516 case 'd':
[1395]517 case 'D':
518 {
[1397]519 CHAR szDate[DATE_BUF_BYTES];
[1395]520
521 DateFormat(szDate, pci->date);
522 fprintf(fp,"%s", szDate);
523 break;
524 }
[551]525 case 't':
526 case 'T':
527 fprintf(fp,
[1395]528 "%02u%s%02u%s%02u",
529 pci->time.hours, TimeSeparator,
530 pci->time.minutes, TimeSeparator, pci->time.seconds);
[551]531 break;
532 case 'l':
[762]533 fputs(pci->pszLongName, fp);
[551]534 break;
535 case 'L':
[762]536 fprintf(fp, "%-40s", pci->pszLongName);
[551]537 break;
538 case 'F':
539 case 'f':
[730]540 if (IsRoot(pci->pszFileName))
541 pp = pci->pszFileName;
[551]542 else {
[730]543 pp = strrchr(pci->pszFileName, '\\');
[551]544 if (pp)
545 pp++;
546 else
[730]547 pp = pci->pszFileName;
[551]548 }
549 if (*p == 'F')
550 fprintf(fp, "%-13s", pp);
551 else
552 fputs(pp, fp);
553 break;
554 case 'p':
[730]555 fputs(pci->pszFileName, fp);
[551]556 break;
557 case 'P':
558 temp = 0;
[730]559 if (!IsRoot(pci->pszFileName)) {
560 pp = strrchr(pci->pszFileName, '\\');
[551]561 if (pp) {
562 temp = *pp;
563 *pp = 0;
564 }
565 }
[730]566 fputs(pci->pszFileName, fp);
[551]567 if (temp)
568 *pp = temp;
569 break;
570 case '$':
[730]571 fputc(*pci->pszFileName, fp);
[551]572 break;
573 case '%':
574 fputc('%', fp);
575 break;
576 }
577 }
578 else
579 fputc(*p, fp);
580 p++;
581 }
582 fputs("\n", fp);
583 }
584 pci = WinSendMsg(hwndCnr, CM_QUERYRECORDEMPHASIS, MPFROMP(pci),
585 MPFROMSHORT(attribute));
586 }
587 fclose(fp);
588 }
589 }
[2]590 }
[551]591 WinEnableWindow(hwnd, TRUE);
592 WinDismissDlg(hwnd, 1);
593 break;
594 }
595 return 0;
[2]596 }
[551]597 return WinDefDlgProc(hwnd, msg, mp1, mp2);
[2]598}
599
[551]600MRESULT EXPENTRY SaveAllListDlgProc(HWND hwnd, ULONG msg, MPARAM mp1,
601 MPARAM mp2)
602{
[2]603
604 CHAR **list;
[1438]605 CHAR savename[CCHMAXPATH] = "";
606 CHAR pattern[81];
[2]607
[551]608 switch (msg) {
609 case WM_INITDLG:
610 if (!mp2) {
[1398]611 Runtime_Error(pszSrcFile, __LINE__, NULL);
[551]612 WinDismissDlg(hwnd, 0);
613 }
614 else {
[574]615 WinSetWindowPtr(hwnd, QWL_USER, mp2);
[551]616 list = (CHAR **) mp2;
617 WinSendDlgItemMsg(hwnd,
618 SAV_FILENAME,
619 EM_SETTEXTLIMIT, MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
620 WinSendDlgItemMsg(hwnd,
621 SAV_PATTERN,
622 EM_SETTEXTLIMIT, MPFROM2SHORT(80, 0), MPVOID);
623 *savename = *pattern = 0;
624 {
625 ULONG size;
626
627 size = CCHMAXPATH;
628 PrfQueryProfileData(fmprof,
629 appname, "SaveToListName", savename, &size);
[871]630 size = MAX_PATTERN_BYTES + 1;
[551]631 PrfQueryProfileData(fmprof,
632 appname, "SaveToListPattern", pattern, &size);
[2]633 }
[551]634 WinSetDlgItemText(hwnd, SAV_FILENAME, savename);
635 if (!*pattern)
636 strcpy(pattern, "%F %s");
637 {
[871]638 CHAR temp[MAX_PATTERN_BYTES * 4 + 1];
[2]639
[551]640 fixup(pattern, temp, sizeof(temp), strlen(pattern));
641 WinSetDlgItemText(hwnd, SAV_PATTERN, temp);
642 }
643 {
644 FILE *fp;
645 CHAR s[CCHMAXPATH + 14];
[2]646
[1398]647 BldFullPathName(s, pFM2SaveDirectory, PCSZ_PATTERNSDAT);
[551]648 fp = _fsopen(s, "r", SH_DENYWR);
649 if (fp) {
650 while (xfgets(s, 81, fp, pszSrcFile, __LINE__)) {
651 stripcr(s);
652 if (*s && *s != ';')
653 WinSendMsg(WinWindowFromID(hwnd, SAV_LISTBOX), LM_INSERTITEM,
654 MPFROM2SHORT(LIT_SORTASCENDING, 0), MPFROMP(s));
655 }
656 fclose(fp);
657 }
658 if (!WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_QUERYITEMCOUNT,
659 MPVOID, MPVOID))
660 WinEnableWindow(WinWindowFromID(hwnd, SAV_LISTBOX), FALSE);
[2]661 }
[551]662 }
663 break;
[2]664
[551]665 case UM_SETDIR:
666 {
667 SHORT sSelect, sMax;
668 CHAR szBuffer[CCHMAXPATH + 14];
669 FILE *fp;
[2]670
[551]671 sMax = (SHORT) WinSendDlgItemMsg(hwnd,
672 SAV_LISTBOX,
673 LM_QUERYITEMCOUNT, MPVOID, MPVOID);
674 if (sMax > 0) {
[1398]675 BldFullPathName(szBuffer, pFM2SaveDirectory, PCSZ_PATTERNSDAT);
[1118]676 if (CheckDriveSpaceAvail(szBuffer, ullDATFileSpaceNeeded, 1) == 2)
[1117]677 break; //already gave error msg
[551]678 fp = xfopen(szBuffer, "w", pszSrcFile, __LINE__);
679 if (fp) {
680 fputs(GetPString(IDS_LISTPATTERNTEXT), fp);
681 for (sSelect = 0; sSelect < sMax; sSelect++) {
682 *szBuffer = 0;
683 WinSendDlgItemMsg(hwnd,
684 SAV_LISTBOX,
685 LM_QUERYITEMTEXT,
686 MPFROM2SHORT(sSelect, 81), MPFROMP(szBuffer));
687 if (*szBuffer)
688 fprintf(fp, "%s\n", szBuffer);
689 }
690 fclose(fp);
691 }
[2]692 }
[551]693 else if (!sMax) {
[1398]694 BldFullPathName(szBuffer, pFM2SaveDirectory, PCSZ_PATTERNSDAT);
[1402]695 unlinkf(szBuffer);
[551]696 }
697 }
698 return 0;
[2]699
[551]700 case WM_CONTROL:
701 if (SHORT1FROMMP(mp1) == SAV_LISTBOX) {
[2]702
[551]703 SHORT sSelect;
704 CHAR szBuffer[81];
[2]705
[551]706 switch (SHORT2FROMMP(mp1)) {
707 case LN_SELECT:
708 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
709 LM_QUERYSELECTION,
710 MPFROMSHORT(LIT_FIRST), MPVOID);
711 if (sSelect >= 0) {
712 *szBuffer = 0;
713 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_QUERYITEMTEXT,
714 MPFROM2SHORT(sSelect, 81), MPFROMP(szBuffer));
715 if (*szBuffer)
716 WinSetDlgItemText(hwnd, SAV_PATTERN, szBuffer);
717 }
718 break;
[2]719
[551]720 case LN_ENTER:
721 PostMsg(hwnd, WM_COMMAND, MPFROM2SHORT(DID_OK, 0), MPVOID);
722 break;
[2]723 }
[551]724 }
725 return 0;
[2]726
[551]727 case WM_COMMAND:
728 list = (CHAR **) INSTDATA(hwnd);
729 switch (SHORT1FROMMP(mp1)) {
730 case DID_CANCEL:
731 WinDismissDlg(hwnd, 0);
732 break;
[2]733
[551]734 case IDM_HELP:
735 if (hwndHelp)
736 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
737 MPFROM2SHORT(HELP_SAVETOLIST, 0),
738 MPFROMSHORT(HM_RESOURCEID));
739 break;
[2]740
[551]741 case SAV_FIND:
742 {
743 *savename = 0;
744 WinQueryDlgItemText(hwnd, SAV_FILENAME, CCHMAXPATH, savename);
745 if (!*savename)
[1395]746 strcpy(savename, PCSZ_STARDOTLST);
[551]747 if (export_filename(hwnd, savename, 1) && *savename) {
748 if (!strchr(savename, '.'))
[1398]749 strcat(savename, PCSZ_DOTLST);
[551]750 WinSetDlgItemText(hwnd, SAV_FILENAME, savename);
751 }
752 }
753 break;
[2]754
[551]755 case SAV_ADD:
756 case SAV_DEL:
757 case DID_OK:
758 WinEnableWindow(hwnd, FALSE);
759 {
760 FILE *fp;
761 CHAR *p, *pp, temp;
762 INT x = 0;
763 SHORT sSelect;
[841]764 FILEFINDBUF4L ffb4;
[551]765 ULONG nm;
766 HDIR hdir;
[771]767 CHAR longname[CCHMAXPATH], subject[1024];
[2]768
[551]769 *pattern = 0;
770 WinQueryDlgItemText(hwnd, SAV_PATTERN, 80, pattern);
771 if (!*pattern) {
772 WinEnableWindow(hwnd, TRUE);
[1395]773 if (!fAlertBeepOff)
774 DosBeep(150, 100);
[551]775 break;
776 }
777 {
778 switch (SHORT1FROMMP(mp1)) {
779 case SAV_ADD:
780 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
781 LM_SEARCHSTRING,
782 MPFROM2SHORT(0, LIT_FIRST),
783 MPFROMP(pattern));
784 if (sSelect < 0) {
785 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_INSERTITEM,
786 MPFROM2SHORT(LIT_SORTASCENDING, 0),
787 MPFROMP(pattern));
788 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
789 }
790 WinEnableWindow(hwnd, TRUE);
791 return 0;
[2]792
[551]793 case SAV_DEL:
794 sSelect = (SHORT) WinSendDlgItemMsg(hwnd, SAV_LISTBOX,
795 LM_QUERYSELECTION,
796 MPFROM2SHORT(LIT_FIRST, 0),
797 MPVOID);
798 if (sSelect >= 0) {
799 WinSendDlgItemMsg(hwnd, SAV_LISTBOX, LM_DELETEITEM,
800 MPFROM2SHORT(sSelect, 0), MPVOID);
801 WinSendMsg(hwnd, UM_SETDIR, MPVOID, MPVOID);
802 }
803 WinEnableWindow(hwnd, TRUE);
804 return 0;
805 }
806 }
807 literal(pattern);
808 if (!*pattern) {
809 WinEnableWindow(hwnd, TRUE);
[1395]810 if (!fAlertBeepOff)
811 DosBeep(250, 100);
[551]812 break;
813 }
814 PrfWriteProfileString(fmprof, appname, "SaveToListPattern", pattern);
815 *savename = 0;
816 WinQueryDlgItemText(hwnd, SAV_FILENAME, CCHMAXPATH, savename);
817 bstrip(savename);
818 if (!*savename) {
819 WinEnableWindow(hwnd, TRUE);
[1395]820 if (!fAlertBeepOff)
821 DosBeep(100, 100);
[551]822 break;
823 }
824 if (stricmp(savename, "PRN") &&
825 strnicmp(savename, "\\DEV\\LPT", 8) && !strchr(savename, '.'))
[1398]826 strcat(savename, PCSZ_DOTLST);
[551]827 PrfWriteProfileString(fmprof, appname, "SaveToListName", savename);
828 if (!list || !list[0])
[1398]829 Runtime_Error(pszSrcFile, __LINE__, NULL);
[551]830 else {
831 fp = _fsopen(savename, "r+", SH_DENYWR);
832 if (!fp)
833 Runtime_Error(pszSrcFile, __LINE__, "_fsopen");
834 else {
[766]835 fseek(fp, 0, SEEK_SET);
[551]836 if (WinQueryButtonCheckstate(hwnd, SAV_APPEND) == 0)
[847]837 DosSetFileSize((HFILE) fileno(fp), 0);
[551]838 else
[766]839 fseek(fp, 0, SEEK_END);
[551]840 while (list[x]) {
841 hdir = HDIR_CREATE;
[761]842 nm = 1;
[551]843 *subject = *longname = 0;
[838]844 if (!xDosFindFirst(list[x], &hdir,
845 FILE_NORMAL | FILE_DIRECTORY |
846 FILE_READONLY | FILE_ARCHIVED |
847 FILE_HIDDEN | FILE_SYSTEM,
[841]848 &ffb4, sizeof(ffb4), &nm, FIL_QUERYEASIZEL)) {
[551]849 /* load the object's Subject, if required */
[766]850 if (ffb4.cbList > 4) {
[551]851 APIRET rc;
852 EAOP2 eaop;
853 PGEA2LIST pgealist;
854 PFEA2LIST pfealist;
855 PGEA2 pgea;
856 PFEA2 pfea;
857 CHAR *value;
[2]858
[551]859 pgealist =
860 xmallocz(sizeof(GEA2LIST) + 64, pszSrcFile, __LINE__);
861 if (pgealist) {
862 pgea = &pgealist->list[0];
863 strcpy(pgea->szName, SUBJECT);
864 pgea->cbName = strlen(pgea->szName);
[766]865 pgea->oNextEntryOffset = 0;
[551]866 pgealist->cbList = sizeof(GEA2LIST) + pgea->cbName;
867 pfealist = xmallocz(1024, pszSrcFile, __LINE__);
868 if (pfealist) {
869 pfealist->cbList = 1024;
870 eaop.fpGEA2List = pgealist;
871 eaop.fpFEA2List = pfealist;
[766]872 eaop.oError = 0;
[551]873 rc = DosQueryPathInfo(list[x],
874 FIL_QUERYEASFROMLIST,
875 (PVOID) & eaop,
876 (ULONG) sizeof(EAOP2));
877 if (!rc) {
878 pfea = &eaop.fpFEA2List->list[0];
879 value = pfea->szName + pfea->cbName + 1;
880 value[pfea->cbValue] = 0;
881 if (*(USHORT *) value == EAT_ASCII)
[771]882 strncpy(subject, value + (sizeof(USHORT) * 2), 1023);
883 subject[1023] = 0;
[551]884 }
[1039]885 free(pfealist);
[551]886 }
[1039]887 free(pgealist);
[551]888 }
889 }
890 /* load the object's longname */
[766]891 if (ffb4.cbList > 4) {
[551]892 APIRET rc;
893 EAOP2 eaop;
894 PGEA2LIST pgealist;
895 PFEA2LIST pfealist;
896 PGEA2 pgea;
897 PFEA2 pfea;
[897]898 CHAR *value;
[2]899
[897]900
[551]901 pgealist =
902 xmallocz(sizeof(GEA2LIST) + 64, pszSrcFile, __LINE__);
903 if (pgealist) {
904 pgea = &pgealist->list[0];
905 strcpy(pgea->szName, LONGNAME);
906 pgea->cbName = strlen(pgea->szName);
[766]907 pgea->oNextEntryOffset = 0;
[551]908 pgealist->cbList = sizeof(GEA2LIST) + pgea->cbName;
909 pfealist = xmallocz(1024, pszSrcFile, __LINE__);
910 if (pfealist) {
911 pfealist->cbList = 1024;
912 eaop.fpGEA2List = pgealist;
913 eaop.fpFEA2List = pfealist;
914 eaop.oError = 0L;
915 rc = DosQueryPathInfo(list[x],
916 FIL_QUERYEASFROMLIST,
917 (PVOID) & eaop,
918 (ULONG) sizeof(EAOP2));
919 if (!rc) {
920 pfea = &eaop.fpFEA2List->list[0];
921 value = pfea->szName + pfea->cbName + 1;
922 value[pfea->cbValue] = 0;
923 if (*(USHORT *) value == EAT_ASCII)
924 strncpy(longname, value +
925 (sizeof(USHORT) * 2), CCHMAXPATHCOMP);
926 longname[CCHMAXPATHCOMP - 1] = 0;
927 }
[1039]928 free(pfealist);
[551]929 }
[1039]930 free(pgealist);
[551]931 }
932 }
[2]933
[551]934 p = pattern;
935 while (*p) {
936 if (*p == '%') {
937 p++;
[897]938 switch (*p) {
939 CHAR szCmmaFmtFileSize[81];
[551]940 case 's':
941 fputs(subject, fp);
942 break;
943 case 'S':
944 fprintf(fp, "%-40s", subject);
945 break;
946 case 'Z':
[897]947 CommaFmtULL(szCmmaFmtFileSize,
948 sizeof(szCmmaFmtFileSize), ffb4.cbFile, ' ');
949 fprintf(fp, "%-13s", szCmmaFmtFileSize);
[551]950 break;
951 case 'z':
[897]952 CommaFmtULL(szCmmaFmtFileSize,
953 sizeof(szCmmaFmtFileSize), ffb4.cbFile, ' ');
954 fprintf(fp, "%s", szCmmaFmtFileSize);
[551]955 break;
956 case 'E':
957 fprintf(fp, "%-5u", CBLIST_TO_EASIZE(ffb4.cbList));
958 break;
959 case 'e':
960 fprintf(fp, "%u", CBLIST_TO_EASIZE(ffb4.cbList));
961 break;
962 case 'd':
[1395]963 case 'D':
964 {
[1397]965 CHAR szDate[DATE_BUF_BYTES];
[1395]966
967 FDateFormat(szDate, ffb4.fdateLastWrite);
968 fprintf(fp,"%s", szDate);
969 break;
970 }
[551]971 case 't':
972 case 'T':
973 fprintf(fp,
[1395]974 "%02u%s%02u%s%02u",
975 ffb4.ftimeLastWrite.hours,
976 TimeSeparator,
977 ffb4.ftimeLastWrite.minutes,
978 TimeSeparator,
[551]979 ffb4.ftimeLastWrite.twosecs * 2);
980 break;
981 case 'l':
982 fputs(longname, fp);
983 break;
984 case 'L':
985 fprintf(fp, "%-40s", longname);
986 break;
987 case 'F':
988 case 'f':
989 if (IsRoot(list[x]))
990 pp = list[x];
991 else {
992 pp = strrchr(list[x], '\\');
993 if (pp)
994 pp++;
995 else
996 pp = list[x];
997 }
998 if (*p == 'F')
999 fprintf(fp, "%-13s", pp);
1000 else
1001 fputs(pp, fp);
1002 break;
1003 case 'p':
1004 fputs(list[x], fp);
1005 break;
1006 case 'P':
1007 temp = 0;
1008 if (!IsRoot(list[x])) {
1009 pp = strrchr(list[x], '\\');
1010 if (pp) {
1011 temp = *pp;
1012 *pp = 0;
1013 }
1014 }
1015 fputs(list[x], fp);
1016 if (temp)
1017 *pp = temp;
1018 break;
1019 case '$':
1020 fputc(*list[x], fp);
1021 break;
1022 case '%':
1023 fputc('%', fp);
1024 break;
1025 }
1026 }
1027 else
1028 fputc(*p, fp);
1029 p++;
1030 }
1031 fputs("\n", fp);
1032 DosFindClose(hdir);
1033 }
1034 x++;
1035 }
1036 fclose(fp);
1037 }
1038 }
[2]1039 }
[551]1040 WinEnableWindow(hwnd, TRUE);
1041 WinDismissDlg(hwnd, 1);
1042 break;
1043 }
1044 return 0;
[2]1045 }
[551]1046 return WinDefDlgProc(hwnd, msg, mp1, mp2);
[2]1047}
[793]1048
1049#pragma alloc_text(FMCLIPBOARDIN,SaveToClip,SaveToClipHab)
[1158]1050#pragma alloc_text(FMCLIPBOARDOUT,ListToClipboardHab)
[793]1051#pragma alloc_text(FMCLIPBOARDOUT,ListFromClipboard,ListFromClipboardHab)
1052#pragma alloc_text(SAVELIST,SaveListDlgProc,SaveAllListDlgProc)
Note: See TracBrowser for help on using the repository browser.