source: trunk/dll/saveclip.c@ 1627

Last change on this file since 1627 was 1627, checked in by Gregg Young, 14 years ago

Add a low mem version of xDosAlloc* wrappers; move error checking into all the xDosAlloc* wrappers. Ticket 471

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