source: trunk/dll/printer.c@ 201

Last change on this file since 201 was 123, checked in by root, 21 years ago

Rework lstrip/rstrip usage

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