source: trunk/dll/printer.c@ 2

Last change on this file since 2 was 2, checked in by root, 23 years ago

Initial revision

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