source: trunk/dll/printer.c@ 1846

Last change on this file since 1846 was 1846, checked in by John Small, 10 years ago

Ticket #524: Ensure no "highmem-unsafe" functions are called directly
Calls to unsafe Dos... functions have been changed to call the wrapped xDos... functions.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 18.2 KB
Line 
1/***********************************************************************
2
3 $Id: printer.c 1846 2015-08-12 20:31:54Z jbs $
4
5 Print file list
6
7 Copyright (c) 1993-98 M. Kimes
8 Copyright (c) 2004, 2010 Steven H.Levine
9
10 01 Aug 04 SHL Rework lstrip/rstrip usage
11 17 Jul 06 SHL Use Runtime_Error
12 03 Nov 06 SHL Renames
13 03 Nov 06 SHL Count thread usage
14 22 Mar 07 GKY Use QWL_USER
15 20 Aug 07 GKY Move #pragma alloc_text to end for OpenWatcom compat
16 07 Feb 09 GKY Allow user to turn off alert and/or error beeps in settings notebook.
17 17 JAN 10 GKY Changes to get working with Watcom 1.9 Beta (1/16/10). Mostly cast CHAR CONSTANT * as CHAR *.
18 12 Aug 15 JBS Ticket #524: Ensure no "highmem-unsafe" functions are called directly
19 Calls to unsafe Dos... functions have been changed to call the wrapped xDos... functions
20
21***********************************************************************/
22
23#include <stdlib.h>
24#include <string.h>
25#include <ctype.h>
26#include <share.h>
27
28#define INCL_DOS
29#define INCL_WIN
30#define INCL_LONGLONG // dircnrs.h
31
32#include "fm3dll.h"
33#include "fm3dll2.h" // #define's for UM_*, control id's, etc.
34#include "notebook.h" // Data declaration(s)
35#include "mainwnd.h" // Data declaration(s)
36#include "init.h" // Data declaration(s)
37#include "fm3dlg.h"
38#include "fm3str.h"
39#include "makelist.h" // AddToList
40#include "errutil.h" // Dos_Error...
41#include "strutil.h" // GetPString
42#include "notify.h" // AddNote
43#include "defview.h" // QuickView
44#include "printer.h"
45#include "common.h" // DecrThreadUsage, IncrThreadUsage
46#include "chklist.h" // PosOverOkay
47#include "strips.h" // bstrip
48#include "valid.h" // IsFile
49#include "wrappers.h" // xfopen
50#include "misc.h" // PostMsg
51#include "fortify.h"
52
53// Data definitions
54#pragma data_seg(DATA1)
55
56static PSZ pszSrcFile = __FILE__;
57
58static HMTX PrintSem = 0;
59
60static BOOL PrinterReady(CHAR * printdevname);
61static BOOL SayPrinterReady(HWND hwnd);
62
63#pragma data_seg(GLOBAL2)
64CHAR StopPrinting;
65CHAR printer[CCHMAXPATH];
66BOOL prnalt;
67long prnbmargin;
68BOOL prnformat;
69BOOL prnformfeedafter;
70BOOL prnformfeedbefore;
71long prnlength;
72long prnlmargin;
73BOOL prnpagenums;
74long prnrmargin;
75long prnspacing;
76long prntabspaces;
77long prntmargin;
78long prnwidth;
79
80BOOL PrinterReady(CHAR * printdevname)
81{
82 FILE *printhandle;
83 CHAR param = 0, data = 0;
84 ULONG datalen = 1, parmlen = 1, htype, flagword;
85 CHAR *modea = "a+";
86
87 if (!fWorkPlace) // assume spooler is active
88 return TRUE;
89 DosError(FERR_DISABLEHARDERR);
90 printhandle = xfopen(printdevname, modea, pszSrcFile, __LINE__, FALSE);
91 if (printhandle) {
92 if (!strnicmp(printdevname, "COM", 3) && isdigit(printdevname[3])) {
93 fclose(printhandle);
94 return TRUE;
95 }
96 if (!xDosQueryHType(fileno(printhandle), &htype, &flagword) &&
97 !(htype & 7)) {
98 fclose(printhandle);
99 return TRUE;
100 }
101 if (DosDevIOCtl(fileno(printhandle), 5, 0x00000066, (PVOID) & param,
102 1, &parmlen, (PVOID) & data, 1,
103 &datalen) != 0x00000100) {
104 fclose(printhandle);
105 return FALSE;
106 }
107 fclose(printhandle);
108 if (data & 32) // bit 5 is out of paper
109 return FALSE;
110 return TRUE;
111 }
112 return FALSE;
113}
114
115BOOL SayPrinterReady(HWND hwnd)
116{
117 if (!hwnd)
118 hwnd = HWND_DESKTOP;
119 if (!PrinterReady(printer)) {
120 saymsg(MB_ENTER | MB_ICONEXCLAMATION,
121 hwnd,
122 GetPString(IDS_NOTETEXT), GetPString(IDS_PRINTERNOTREADYTEXT));
123 return FALSE;
124 }
125 return TRUE;
126}
127
128//=== PrintListThread - background-print a list of files ===
129
130VOID PrintListThread(VOID * arg)
131{
132 HAB hab2;
133 HMQ hmq2;
134 LISTINFO *li = (LISTINFO *) arg;
135 register INT x;
136 FILE *fpi, *fpo;
137 CHAR s[CCHMAXPATH + 80];
138 FILESTATUS3 fs3;
139 LONG cols, lines, pages, z, lmargin, rmargin;
140 BOOL endline, endpage, startpage, skipping, firstpass;
141 int c;
142 APIRET rc = MBID_YES;
143 CHAR *mode;
144
145 if (StopPrinting)
146 goto Abort;
147 if (!PrintSem) {
148 if (DosCreateMutexSem(NULL, &PrintSem, 0, FALSE)) {
149 Dos_Error(MB_CANCEL, rc, HWND_DESKTOP, pszSrcFile, __LINE__,
150 PCSZ_DOSCREATEMUTEXSEM);
151 goto Abort;
152 }
153 }
154# ifdef FORTIFY
155 Fortify_EnterScope();
156# endif
157 priority_normal();
158 hab2 = WinInitialize(0);
159 if (hab2) {
160 hmq2 = WinCreateMsgQueue(hab2, 0);
161 if (hmq2) {
162 WinCancelShutdown(hmq2, TRUE);
163 IncrThreadUsage();
164 if (li && li->list && li->list[0]) {
165 AddNote(GetPString(IDS_PRINTINGLISTTEXT));
166 for (x = 0; li->list[x]; x++) {
167 if (rc == MBID_CANCEL)
168 break;
169 DosError(FERR_DISABLEHARDERR);
170 if (DosQueryPathInfo(li->list[x], FIL_STANDARD, &fs3, sizeof(fs3)) ||
171 fs3.attrFile & FILE_DIRECTORY ||
172 !fs3.cbFile)
173 continue;
174 if (StopPrinting)
175 break;
176 DosRequestMutexSem(PrintSem, 240000);
177 if (StopPrinting)
178 break;
179 if (!PrinterReady(li->targetpath))
180 Runtime_Error(pszSrcFile, __LINE__, "printer %s error",
181 li->targetpath);
182 else {
183 mode = "r";
184 fpi = xfsopen(li->list[x], mode, SH_DENYWR, pszSrcFile, __LINE__, TRUE);
185 if (!fpi)
186 Runtime_Error(pszSrcFile, __LINE__, "cannot open %s",
187 li->list[x]);
188 else {
189 mode = "a+";
190 fpo = xfsopen(li->targetpath, mode, SH_DENYRW, pszSrcFile, __LINE__, TRUE);
191 if (!fpo)
192 Runtime_Error(pszSrcFile, __LINE__, "cannot open %s",
193 li->targetpath);
194 else {
195 sprintf(s, GetPString(IDS_PRINTINGTEXT), li->list[x]);
196 AddNote(s);
197 firstpass = TRUE;
198 skipping = FALSE;
199 lmargin = prnlmargin;
200 rmargin = prnrmargin;
201 if (prnformfeedbefore) {
202 if (!skipping)
203 fputc('\x0c', fpo);
204 }
205 Again:
206 cols = lines = pages = 0;
207 endline = endpage = FALSE;
208 startpage = TRUE;
209 while ((c = fgetc(fpi)) != EOF) {
210 if (StopPrinting || ferror(fpo))
211 break;
212 if (prnformat) {
213 if (startpage) {
214 pages++;
215 if (prnpagenums) {
216 if (!skipping)
217 fprintf(fpo, "%*.*s#%lu",
218 lmargin, lmargin, " ", pages);
219 }
220 for (z = 0; z < prntmargin; z++) {
221 if (!skipping)
222 fputc('\n', fpo);
223 }
224 lines = prntmargin;
225 endline = endpage = FALSE;
226 cols = 0;
227 startpage = FALSE;
228 }
229 if (!cols) {
230 for (z = 0; z < lmargin; z++) {
231 if (!skipping)
232 fputc(' ', fpo);
233 }
234 cols = lmargin;
235 }
236 if (!skipping) {
237 if (c == '\t') {
238 for (z = 0; z < prntabspaces &&
239 cols + z < prnwidth - rmargin; z++)
240 fputc(' ', fpo);
241 }
242 else
243 fputc(c, fpo);
244 }
245 if (c == '\x0c')
246 endpage = TRUE;
247 else if (c == '\n') {
248 lines++;
249 cols = 0;
250 for (z = 1; z < prnspacing; z++) {
251 if (prnlength - lines <= prnbmargin)
252 break;
253 if (!skipping)
254 fputc('\n', fpo);
255 lines++;
256 }
257 if (prnlength - lines <= prnbmargin)
258 endpage = TRUE;
259 }
260 else {
261 cols++;
262 if (c == '\t')
263 c += prntabspaces;
264 if (prnwidth - cols <= rmargin) {
265 endline = TRUE;
266 if (!skipping)
267 fputc('\n', fpo);
268 lines++;
269 }
270 for (z = 1; z < prnspacing; z++) {
271 if (prnlength - lines <= prnbmargin)
272 break;
273 if (!skipping)
274 fputc('\n', fpo);
275 lines++;
276 }
277 }
278 if (endline) {
279 do {
280 c = fgetc(fpi);
281 if (c == '\n')
282 break;
283 } while (isspace(c) && c != EOF);
284 if (c == EOF)
285 break;
286 if (!isspace(c))
287 ungetc(c, fpi);
288 endline = FALSE;
289 cols = 0;
290 if (prnlength - lines <= prnbmargin)
291 endpage = TRUE;
292 }
293 if (endpage) {
294 if (prnbmargin) {
295 if (c != '\x0c') {
296 if (!skipping)
297 fputc('\r\x0c', fpo);
298 }
299 }
300 lines = cols = 0;
301 endpage = FALSE;
302 startpage = TRUE;
303 do {
304 c = fgetc(fpi);
305 } while (c == '\n');
306 if (c == EOF)
307 break;
308 ungetc(c, fpi);
309 if (prnformat && prnalt)
310 skipping = (skipping) ? FALSE : TRUE;
311 DosSleep(1);
312 }
313 }
314 else
315 fputc(c, fpo);
316 }
317 if (prnalt && prnformat && firstpass && pages > 1) {
318 fclose(fpo);
319 mode = "a+";
320 fpo = xfsopen(li->targetpath, mode, SH_DENYRW, pszSrcFile, __LINE__, TRUE);
321 if (fpo) {
322 rewind(fpi);
323 firstpass = FALSE;
324 skipping = TRUE;
325 rc = saymsg(MB_YESNOCANCEL | MB_ICONEXCLAMATION,
326 HWND_DESKTOP,
327 GetPString(IDS_PRINTTITLETEXT),
328 GetPString(IDS_PRINTEVENTEXT), li->list[x]);
329 if (rc == MBID_YES) {
330 lmargin = prnrmargin;
331 rmargin = prnlmargin;
332 fputc('\x0c', fpo);
333 goto Again;
334 }
335 }
336 else
337 saymsg(MB_CANCEL | MB_ICONEXCLAMATION,
338 HWND_DESKTOP,
339 GetPString(IDS_PRINTTITLETEXT),
340 GetPString(IDS_PRINTCANTREOPENTEXT),
341 li->targetpath);
342 }
343 if (prnformfeedafter)
344 fputc('\x0c', fpo);
345 if (!StopPrinting) {
346 sprintf(s, GetPString(IDS_PRINTEDTEXT), li->list[x]);
347 AddNote(s);
348 }
349 fclose(fpo);
350 }
351 fclose(fpi);
352 }
353 }
354 DosReleaseMutexSem(PrintSem);
355 DosSleep(1);
356 }
357 if (!StopPrinting)
358 AddNote(GetPString(IDS_PRINTEDLISTTEXT));
359 }
360 WinDestroyMsgQueue(hmq2);
361 }
362 DecrThreadUsage();
363 WinTerminate(hab2);
364 }
365Abort:
366 if (li)
367 FreeListInfo(li);
368# ifdef FORTIFY
369 Fortify_LeaveScope();
370# endif
371}
372
373MRESULT EXPENTRY PrintDlgProc(HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2)
374{
375 LISTINFO *li;
376
377 switch (msg) {
378 case WM_INITDLG:
379 if (!mp2)
380 WinDismissDlg(hwnd, 0);
381 else {
382 WinSetWindowPtr(hwnd, QWL_USER, mp2);
383 WinSendDlgItemMsg(hwnd, PRN_WIDTH, EM_SETTEXTLIMIT,
384 MPFROM2SHORT(3, 0), MPVOID);
385 WinSendDlgItemMsg(hwnd, PRN_LENGTH, EM_SETTEXTLIMIT,
386 MPFROM2SHORT(3, 0), MPVOID);
387 WinSendDlgItemMsg(hwnd, PRN_LMARGIN, EM_SETTEXTLIMIT,
388 MPFROM2SHORT(2, 0), MPVOID);
389 WinSendDlgItemMsg(hwnd, PRN_RMARGIN, EM_SETTEXTLIMIT,
390 MPFROM2SHORT(2, 0), MPVOID);
391 WinSendDlgItemMsg(hwnd, PRN_TMARGIN, EM_SETTEXTLIMIT,
392 MPFROM2SHORT(2, 0), MPVOID);
393 WinSendDlgItemMsg(hwnd, PRN_BMARGIN, EM_SETTEXTLIMIT,
394 MPFROM2SHORT(2, 0), MPVOID);
395 WinSendDlgItemMsg(hwnd, PRN_SPACING, EM_SETTEXTLIMIT,
396 MPFROM2SHORT(1, 0), MPVOID);
397 WinSendDlgItemMsg(hwnd, PRN_TABSPACES, EM_SETTEXTLIMIT,
398 MPFROM2SHORT(2, 0), MPVOID);
399 WinSendDlgItemMsg(hwnd, PRN_PRINTER, EM_SETTEXTLIMIT,
400 MPFROM2SHORT(CCHMAXPATH, 0), MPVOID);
401 WinSendMsg(hwnd, UM_UNDO, MPVOID, MPVOID);
402 PosOverOkay(hwnd);
403 }
404 break;
405
406 case UM_UNDO:
407 WinCheckButton(hwnd, PRN_FORMAT, prnformat);
408 WinCheckButton(hwnd, PRN_ALT, prnalt);
409 WinCheckButton(hwnd, PRN_PAGENUMS, prnpagenums);
410 WinCheckButton(hwnd, PRN_FORMBEFORE, prnformfeedbefore);
411 WinCheckButton(hwnd, PRN_FORMAFTER, prnformfeedafter);
412 {
413 CHAR s[33];
414
415 sprintf(s, "%lu", prnwidth);
416 WinSetDlgItemText(hwnd, PRN_WIDTH, s);
417 sprintf(s, "%lu", prnlength);
418 WinSetDlgItemText(hwnd, PRN_LENGTH, s);
419 sprintf(s, "%lu", prnlmargin);
420 WinSetDlgItemText(hwnd, PRN_LMARGIN, s);
421 sprintf(s, "%lu", prnrmargin);
422 WinSetDlgItemText(hwnd, PRN_RMARGIN, s);
423 sprintf(s, "%lu", prntmargin);
424 WinSetDlgItemText(hwnd, PRN_TMARGIN, s);
425 sprintf(s, "%lu", prnbmargin);
426 WinSetDlgItemText(hwnd, PRN_BMARGIN, s);
427 sprintf(s, "%lu", prnspacing);
428 WinSetDlgItemText(hwnd, PRN_SPACING, s);
429 sprintf(s, "%lu", prntabspaces);
430 WinSetDlgItemText(hwnd, PRN_TABSPACES, s);
431 }
432 WinSetDlgItemText(hwnd, PRN_PRINTER, printer);
433 WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_DELETEALL, MPVOID, MPVOID);
434 li = WinQueryWindowPtr(hwnd, QWL_USER);
435 if (!li)
436 Runtime_Error(pszSrcFile, __LINE__, NULL);
437 else {
438 INT x;
439
440 for (x = 0; li->list[x]; x++) {
441 if (IsFile(li->list[x]) == 1) {
442 WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_INSERTITEM,
443 MPFROM2SHORT(LIT_END, 0), MPFROMP(li->list[x]));
444 WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_SELECTITEM,
445 MPFROM2SHORT(x, 0), MPFROMSHORT(TRUE));
446 }
447 }
448 if (!(SHORT) WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_QUERYITEMCOUNT,
449 MPVOID, MPVOID)) {
450 saymsg(MB_CANCEL | MB_ICONEXCLAMATION,
451 hwnd,
452 GetPString(IDS_TWIDDLETEXT), GetPString(IDS_NOPRINTABLETEXT));
453 WinDismissDlg(hwnd, 0);
454 }
455 }
456 return 0;
457
458 case WM_CONTROL:
459 switch (SHORT1FROMMP(mp1)) {
460 case PRN_LISTBOX:
461 if (SHORT2FROMMP(mp1) == LN_ENTER) {
462
463 SHORT x;
464 CHAR szBuffer[CCHMAXPATH];
465
466 x = (SHORT) WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_QUERYSELECTION,
467 MPFROMSHORT(LIT_FIRST), MPVOID);
468 if (x >= 0) {
469 *szBuffer = 0;
470 WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_QUERYITEMTEXT,
471 MPFROM2SHORT(x, CCHMAXPATH), MPFROMP(szBuffer));
472 if (*szBuffer)
473 QuickView(hwnd, szBuffer);
474 }
475 }
476 }
477 return 0;
478
479 case WM_COMMAND:
480 switch (SHORT1FROMMP(mp1)) {
481 case DID_OK:
482 li = WinQueryWindowPtr(hwnd, QWL_USER);
483 if (!li)
484 Runtime_Error(pszSrcFile, __LINE__, NULL);
485 else {
486 prnformat = WinQueryButtonCheckstate(hwnd, PRN_FORMAT);
487 PrfWriteProfileData(fmprof, FM3Str, "Prnformat",
488 (PVOID) & prnformat, sizeof(prnformat));
489 prnalt = WinQueryButtonCheckstate(hwnd, PRN_ALT);
490 PrfWriteProfileData(fmprof, FM3Str, "Prnalt",
491 (PVOID) & prnalt, sizeof(prnalt));
492 prnpagenums = WinQueryButtonCheckstate(hwnd, PRN_PAGENUMS);
493 PrfWriteProfileData(fmprof, FM3Str, "Prnpagenums",
494 (PVOID) & prnpagenums, sizeof(prnpagenums));
495 prnformfeedbefore = WinQueryButtonCheckstate(hwnd, PRN_FORMBEFORE);
496 PrfWriteProfileData(fmprof, FM3Str, "Prnformfeedbefore",
497 (PVOID) & prnformfeedbefore,
498 sizeof(prnformfeedbefore));
499 prnformfeedafter = WinQueryButtonCheckstate(hwnd, PRN_FORMAFTER);
500 PrfWriteProfileData(fmprof, FM3Str, "Prnformfeedafter",
501 (PVOID) & prnformfeedafter,
502 sizeof(prnformfeedafter));
503 {
504 CHAR s[33];
505
506 *s = 0;
507 WinQueryDlgItemText(hwnd, PRN_WIDTH, sizeof(s), s);
508 if (atol(s) < 24 || atol(s) > 4096) {
509 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_WIDTH));
510 if (!fAlertBeepOff)
511 DosBeep(50, 100);
512 break;
513 }
514 prnwidth = atol(s);
515 PrfWriteProfileData(fmprof, FM3Str, "Prnwidth",
516 (PVOID) & prnwidth, sizeof(prnwidth));
517 *s = 0;
518 WinQueryDlgItemText(hwnd, PRN_LENGTH, sizeof(s), s);
519 if (atol(s) < 24 || atol(s) > 4096) {
520 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_LENGTH));
521 if (!fAlertBeepOff)
522 DosBeep(50, 100);
523 break;
524 }
525 prnlength = atol(s);
526 PrfWriteProfileData(fmprof, FM3Str, "Prnlength",
527 (PVOID) & prnlength, sizeof(prnlength));
528 *s = 0;
529 WinQueryDlgItemText(hwnd, PRN_LMARGIN, sizeof(s), s);
530 if (atol(s) < 0 || atol(s) > prnwidth - 1) {
531 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_LMARGIN));
532 if (!fAlertBeepOff)
533 DosBeep(50, 100);
534 break;
535 }
536 prnlmargin = atol(s);
537 PrfWriteProfileData(fmprof, FM3Str, "Prnlmargin",
538 (PVOID) & prnlmargin, sizeof(prnlmargin));
539 *s = 0;
540 WinQueryDlgItemText(hwnd, PRN_RMARGIN, sizeof(s), s);
541 if (atol(s) < 0 || atol(s) > (prnwidth - prnlmargin) - 1) {
542 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_RMARGIN));
543 if (!fAlertBeepOff)
544 DosBeep(50, 100);
545 break;
546 }
547 prnrmargin = atol(s);
548 PrfWriteProfileData(fmprof, FM3Str, "Prnrmargin",
549 (PVOID) & prnrmargin, sizeof(prnrmargin));
550 *s = 0;
551 WinQueryDlgItemText(hwnd, PRN_TABSPACES, sizeof(s), s);
552 if (atol(s) < 1 ||
553 atol(s) > prnwidth - ((prnlmargin + prnrmargin) - 1)) {
554 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_TABSPACES));
555 if (!fAlertBeepOff)
556 DosBeep(50, 100);
557 break;
558 }
559 prntabspaces = atol(s);
560 PrfWriteProfileData(fmprof, FM3Str, "Prntabspaces",
561 (PVOID) & prntabspaces, sizeof(prntabspaces));
562 *s = 0;
563 WinQueryDlgItemText(hwnd, PRN_TMARGIN, sizeof(s), s);
564 if (atol(s) < 0 || atol(s) > prnlength - 1) {
565 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_TMARGIN));
566 if (!fAlertBeepOff)
567 DosBeep(50, 100);
568 break;
569 }
570 prntmargin = atol(s);
571 PrfWriteProfileData(fmprof, FM3Str, "Prntmargin",
572 (PVOID) & prntmargin, sizeof(prntmargin));
573 *s = 0;
574 WinQueryDlgItemText(hwnd, PRN_BMARGIN, sizeof(s), s);
575 if (atol(s) < 0 || atol(s) > (prnlength - prntmargin) - 1) {
576 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_BMARGIN));
577 if (!fAlertBeepOff)
578 DosBeep(50, 100);
579 break;
580 }
581 prnbmargin = atol(s);
582 PrfWriteProfileData(fmprof, FM3Str, "Prnbmargin",
583 (PVOID) & prnbmargin, sizeof(prnbmargin));
584 *s = 0;
585 WinQueryDlgItemText(hwnd, PRN_SPACING, sizeof(s), s);
586 if (atol(s) < 1 ||
587 atol(s) > ((prnlength - prntmargin) - prnbmargin) - 1) {
588 WinSetFocus(HWND_DESKTOP, WinWindowFromID(hwnd, PRN_SPACING));
589 if (!fAlertBeepOff)
590 DosBeep(50, 100);
591 break;
592 }
593 prnspacing = atol(s);
594 PrfWriteProfileData(fmprof, FM3Str, "Prnspacing",
595 (PVOID) & prnspacing, sizeof(prnspacing));
596 WinQueryDlgItemText(hwnd, PRN_PRINTER, sizeof(printer), printer);
597 bstrip(printer);
598 if (!*printer)
599 strcpy(printer, "PRN");
600 WinSetDlgItemText(hwnd, PRN_PRINTER, printer);
601 PrfWriteProfileString(fmprof, appname, "Printer", printer);
602 SayPrinterReady(hwnd);
603 }
604 {
605 CHAR szBuffer[CCHMAXPATH + 1];
606 UINT numfiles = 0, numalloc = 0;
607 INT error;
608 SHORT x;
609
610 if (li->list)
611 FreeList(li->list);
612 li->list = NULL;
613 x = (SHORT) WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_QUERYSELECTION,
614 MPFROMSHORT(LIT_FIRST), MPVOID);
615 if (x >= 0) {
616 do {
617 *szBuffer = 0;
618 WinSendDlgItemMsg(hwnd, PRN_LISTBOX, LM_QUERYITEMTEXT,
619 MPFROM2SHORT(x, CCHMAXPATH),
620 MPFROMP(szBuffer));
621 error = AddToList(szBuffer, &li->list, &numfiles, &numalloc);
622 if (error) {
623 Runtime_Error(pszSrcFile, __LINE__, "AddToList");
624 break;
625 }
626 x = (SHORT) WinSendDlgItemMsg(hwnd, PRN_LISTBOX,
627 LM_QUERYSELECTION,
628 MPFROMSHORT(x), MPVOID);
629 } while (x >= 0);
630 }
631 }
632 if (!li->list || !li->list[0])
633 WinDismissDlg(hwnd, 0);
634 else
635 WinDismissDlg(hwnd, 1);
636 }
637 break;
638 case DID_CANCEL:
639 WinDismissDlg(hwnd, 0);
640 break;
641 case IDM_HELP:
642 if (hwndHelp)
643 WinSendMsg(hwndHelp, HM_DISPLAY_HELP,
644 MPFROM2SHORT(HELP_PRINT, 0), MPFROMSHORT(HM_RESOURCEID));
645 break;
646 case IDM_UNDO:
647 PostMsg(hwnd, UM_UNDO, MPVOID, MPVOID);
648 break;
649 }
650 return 0;
651 }
652 return WinDefDlgProc(hwnd, msg, mp1, mp2);
653}
654
655#pragma alloc_text(PRINTER,PrinterReady,SayPrinterReady)
656#pragma alloc_text(PRINTER2,PrintListThread)
657#pragma alloc_text(PRINTER3,PrintDlgProc)
Note: See TracBrowser for help on using the repository browser.