macintosh@felix.UUCP (02/24/87)
[PSPrinter.src] Below, you will find the Rascal source to PSPrinter. The Desk Accessory has also been posted (to mod.mac.binaries, I think). PSPrinter is a desk accessory that sends PostScript files directly to your AppleTalked LaserWriter. Files sent to a LaserWriter via PSPrinter must be of type TEXT, and they must be complete PostScript files: PSPrinter does not send any information to the printer except to lengthen the default timeout, and to initialize the LaserWriter's coordinate system ("initmatrix"). Scott Gillespie Reed College --- program PSPrinter; Uses __ToolTraps __DeskLib (*$U+*) uMacPrint ; Link __NoSyscall, __ToolLink __SFNames __MacPrint __DeskLib :; Const WhichPrinter = $947; (* Low-mem address of type of installed printer *) lPrDocClose = $00050000L; prCommand = 1L; cNumItem = 4; cStringlist = 1; cInfLog = 1; (* info dialog *) cAlrt = 2; cMenu = 1; cAbout = 3; realIOAbort = -27; realMemFull = -108; realPrintNotfound = -4101; realLostCont = -4100; realUserAbort = 128; errIOAbort = 1; errMemFull = 2; errPrintNotfound = 3; errLostCont = 4; errNoLaser = 5; errGeneric = 6; Var InfLog: DialogPtr; Name: Ptrb; Vref,Menu: Integer; MenuHand: MenuHandle; Function Error(i: Integer): Boolean; Var S: Str255; { If !i Then Return(False); Error := True; Case i of realUserAbort: Return; errNoLaser: i:= errNoLaser; realIOAbort: i:= errIOAbort; realMemFull: i:= errMemFull; realPrintNotfound: i:= errPrintNotfound; realLostCont: i:= errLostCont; Otherwise i:=errGeneric; End; GetIndString(@S,MapResID(cStringList),i); ParamText(Name,S,"",""); If StopAlert(MapResId(cAlrt),Nil) Then; }; (* ------- Generic Routines for Manipulating DBoxes -------- *) procedure mygetitem(thelog: DialogPtr; item:integer; hand: ^Handle); var box: Rect; kind: integer; { getditem(thelog,item,@kind,hand,box); }; procedure setnotext(thelog:DialogPtr; item: integer; str:str255); var itemhand: Handle; { mygetitem(thelog,item,@itemhand); setitext(itemhand,str); }; procedure setdnum(thelog: DialogPtr; itemno:Integer; val: Longint); var str: block[30]; { numtostring(val,str); setnotext(thelog,itemno,str); }; (* --------------- *) Procedure InfoCount(L: Longint); { SetDNum(InfLog,cNumItem,L); }; Procedure SetInfoDialog(N: Ptrb); { ParamText(N,"","",""); InfLog := GetNewDialog(MapResId(cInfLog),Nil,-1L); DrawDialog(InfLog); }; Procedure DumpInfoDialog(); DisposDialog(InfLog); procedure OpenPrinter(); { prctlcall(iPrDevCtl, lprReset, 0L, Nil); (* The LaserWriter's default coordinate system has 0,0 at lower left; if the next call is not made, everything printed will be upside down and mirror-imaged *) prctlcall(iPrIOCtl, " initmatrix\n "+2, 12L, prCommand); prctlcall(iPrIOCtl, " statusdict /waittimeout 600 put\n "+2, 33L, prCommand); }; procedure ClosePrinter(); { prctlcall(iPrDevCtl, lPrDocClose, Nil, Nil); }; Proc SendToLaser(); Const BufSize = 1024; Var Buf: Byte[BufSize]; f,eof: Integer; Amt,Left: Longint; { OpenPrinter(); If !Error(PrError()) Then { fopen(@f,Name,0,Vref); fLength(f,@Left); SetInfoDialog(Name); Loop(,,feof(f,@eof),eof) { InfoCount(Left); amt := BufSize; Fread(f,Buf,@amt); prctlcall(iPrIOCtl,Buf,amt, prCommand); Left -= amt; If Error(PrError()) Then Break; }; DumpInfoDialog(); fclose(f); }; ClosePrinter(); }; Proc TalkAbout(); Var MyLog: DialogPtr; Item: Integer; { MyLog := GetNewDialog(MapResID(cAbout),Nil,-1L); ModalDialog(Nil,@Item); DisPosdialog(MyLog); }; Proc _Menu(id,item: Integer); Var Good : Integer; { If ID<>Menu Then return; Case item of 3: TalkAbout(); 4: Reqhalt(); 1: { PrDrvrOpen(); If (-(ptrb(WhichPrinter)^) <> bDevLaser) then { If Error(errNoLaser) Then; Return; }; GetFile(@Name,@Vref,@good); If Good Then SendToLaser(); }; End; }; Proc _Init(); { Name := ""; Menu := MapResID(cMenu); If IsDARun() Then SetDAMenuID(Menu); MenuHand := GetMenu(Menu); InsertMenu(MenuHand,0); DrawMenuBar(); }; Proc _Halt(); { DeleteMenu(Menu); DisposeMenu(MenuHand); DrawMenuBar(); }; Proc _Main(); { If IsDARun() Then SetDAMenuID(Menu); }; ---