system/spooler/1.8.7-std.zusatz/src/printer server

Raw file
Back to index

PACKET multi user printer :                      (* Autor : Rudolf Ruland  *)
                                                 (* Stand : 24.03.86       *)
 
INT VAR c;
put ("gib Druckerkanal : "); get (c);

  server channel (c);
  station only (FALSE) ;
  spool duty ("Ausgabe mit dem Drucker");
  spool control task (myself);
 
LET ack              = 0 ,
 
    fetch code       = 11 ,
    param fetch code = 21 ,
    file type        = 1003 ;

INT VAR reply, old heap size, sender station;
TEXT VAR file name, userid, password, sendername;
FILE VAR file ;

DATASPACE VAR ds, file ds;
 
BOUND STRUCT (TEXT file name, userid, password, sendername, INT station) VAR msg;
BOUND TEXT VAR error msg ;
 
spool manager (PROC printer);
 
PROC printer :

  disable stop ;
  command dialogue (FALSE);
  ds := nilspace; file ds := nilspace; 
  continue (server channel) ;
    check error ("Kanal belegt");
 
  old heap size := heap size ;
  REP
    execute print ;
 
    IF is error
      THEN put error;
           clear error;
    FI ;
 
    IF heap size > old heap size + 4
      THEN collect heap garbage ;
           old heap size := heap size
    FI
  PER 
 
ENDPROC printer ;

 
PROC execute print :

  enable stop ;
  forget (file ds) ; file ds := nilspace ;
  call (father, fetch code, file ds, reply) ;
  IF reply = ack CAND type (file ds) = file type
     THEN get file params;
          print file
  FI ;
 
. get file params :
    forget (ds); ds := nilspace;
    call (father, param fetch code, ds, reply);
    IF reply <> ack
       THEN error msg := ds; errorstop (error msg);
       ELSE msg := ds;
            file name      := msg. file name;
            userid         := msg. userid;
            password       := msg. password;
            sendername     := msg. sender name;
            sender station := msg. station;
    FI;
 
. print file :
    file := sequential file (input, file ds);
    print (file,
           PROC (INT CONST, INT VAR, INT VAR) open,
           PROC (INT CONST, INT CONST) close,
           PROC (INT CONST, TEXT CONST, INT CONST, INT CONST) execute);
 
ENDPROC execute print ;
 
 
PROC check error (TEXT CONST message) :
    IF is error
       THEN clear error;
            rename myself (message);
            IF is error THEN clear error; end (myself) FI;
            pause (18000);
            end (myself);
    FI;
END PROC check error;
 
ENDPACKET multi user printer ;