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);
};
---