source: trunk/dll/printer.c@ 1189

Last change on this file since 1189 was 1189, checked in by John Small, 17 years ago

Ticket 187: Draft 2: Move remaining function declarations

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