source: trunk/dll/printer.c@ 1398

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

Move embeded strings to PCSZ variables or string table; Eliminate Error2 functions Runtime_Error with NULL format string returns "No data" error. Change declares from PSZ to PCSZ in functions where the variable isn't changed. Added btm as an executable file type in several additional places. Use fProtectOnly to prevent attempt to execute Dos and Win programs on "Protect only" installs in several additional places.

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