home *** CD-ROM | disk | FTP | other *** search
/ Piper's Pit BBS/FTP: ibm 0040 - 0049 / ibm0040-0049 / ibm0040.tar / ibm0040 / BTF521-3.ZIP / NETWARE.LZH / NETQUE.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-02-08  |  26.1 KB  |  941 lines

  1. {
  2.   Turbo Pascal Unit of Queue Services for NetWare
  3.  
  4.   by Richard S. Sadowsky
  5.  
  6.   Please address questions and comments about this unit to ALL in section 6 of
  7.   the PCVENB forum on Compuserve.
  8. }
  9. {$A-,V-,F-}
  10.  
  11. Unit NetQue;
  12.  
  13. interface
  14. uses
  15.   Dos,
  16.   NetWare,
  17.   NetBind;
  18.  
  19. const
  20.   MaxQueueJobs         = 250;
  21.   QueueMaxConnections  = 25;
  22.  
  23.   jcfAutoStart         = $08;
  24.   jcfRestart           = $10;
  25.   jfcEntryOpen         = $20;
  26.   jfcUserHold          = $40;
  27.   jcfOperatorHold      = $80;
  28.  
  29. type
  30.   JobFileNameStr       = String[13];
  31.   QueuePathType        = String[118];
  32.   QMSDateTime          = record
  33.                            Y,M,D,H,Min,S : Byte;
  34.                          end;
  35.   QueueJobList         = record
  36.                            NumJobs : Word;
  37.                            JobList : Array[1..MaxQueueJobs] of Word;
  38.                          end;
  39.   JobFileHandleType    = Array[1..6] of Byte;
  40.   QueueTimeType        = Array[1..6] of Byte;
  41.   TextJobField         = Array[1..50] of Char;
  42.   TextJobStr           = String[49];
  43.   ClientRecordArea     = Array[1..152] of Byte;
  44.   QueueServerIDList    = Array[1..QueueMaxConnections] of LongInt;
  45.   QueueStationList     = Array[1..QueueMaxConnections] of Byte;
  46.   JobEntryType         = record
  47.                            ClientStation    : Byte;
  48.                            ClientTaskNum    : Byte;
  49.                            ClientID         : LongInt;      {hi-lo}
  50.                            TargetServerID   : LongInt;      {hi-lo}
  51.                            TargetExecTime   : QMSDateTime;
  52.                            JobEntryTime     : QMSDateTime;
  53.                            JobNumber        : Word;         {hi-lo}
  54.                            JobType          : Word;         {hi-lo}
  55.                            JobPosition      : Byte;
  56.                            JobControlFlags  : Byte;
  57.                            JobFileName      : JobFileNameStr;
  58.                            JobFileHandle    : JobFileHandleType;
  59.                            ServerStation    : Byte;
  60.                            ServerTaskNum    : Byte;
  61.                            ServerID         : LongInt;      {hi-lo}
  62.                            TextJobDesc      : TextJobField;
  63.                            ClientRecord     : ClientRecordArea;
  64.                          end;
  65.   ServerStatusRecord   = Array[1..64] of Byte;
  66.  
  67. const
  68.   SubFAbortServicingJob= $73;
  69.   SubFAttachQueServ    = $6F;
  70.   SubFChangeJobPos     = $6E;
  71.   SubFChangeJobEntry   = $6D;
  72.   SubFChangeToClient   = $74;
  73.   SubFCloseAndStart    = $69;
  74.   SubFCreateQue        = $64;
  75.   SubFCreateJobAndFile = $68;
  76.   SubFDestroyQue       = $65;
  77.   SubFDetachFromQue    = $70;
  78.   SubFFinishServicing  = $72;
  79.   SubFGetJobFileSize   = $78;
  80.  
  81.   SubFGetJobList       = $6B;
  82.   SubFReadCurStatus    = $66;
  83.   SubFReadJobEntry     = $6C;
  84.   SubFReadQueServStatus= $76;
  85.   SubFRemJobFromQue    = $6A;
  86.   SubFChangeToServer   = $75;
  87.   SubFServiceJob       = $71;
  88.   SubFReadQueStatus    = $67;
  89.   SubFSetStatusRec     = $77;
  90.  
  91. var
  92.   FirstOpportunity     : QMSDateTime;
  93.  
  94. function AbortServicingQueueJob(QueueID : LongInt; JobNum : Word) : Byte;
  95.   {-Abort servicing a job, close the associated file, amd remove job entry
  96.     from Queue}
  97.  
  98. function AttachQueueServerToQueue(QueueID : LongInt) : Byte;
  99.   {-Attaches a station to a queue as a queue (job) server}
  100.  
  101. function ChangeQueueJobEntry(QueueID : LongInt;
  102.                              var JobEntry : JobEntryType) : Byte;
  103.   {-Change's information in the job's record entry}
  104.  
  105. function ChangeQueueJobPosition(QueueID : LongInt; JobNumber : Word;
  106.                                 NewPosition : Byte) : Byte;
  107.   {-Changes a job's position in the queue}
  108.  
  109. function ChangeToClientRights(QueueID : LongInt; JobNumber : Word) : Byte;
  110.   {-Allows a queue (job) server to assume the login identity of the client
  111.     that placed the job in the queue}
  112.  
  113. function CloseFileAndStartJob(QueueID : LongInt; JobNumber : Word) : Byte;
  114.   {-Closes an associated file and releases the job for servicing}
  115.  
  116. function CreateQueue(QueType : Word; QueName : ObjNameStr;
  117.                      DirectoryHandle : Byte; PathName : QueuePathType;
  118.                      var QueueID : LongInt) : Byte;
  119.   {-Creates a new queue on a file server}
  120.  
  121. function CreateQueueJobAndFile(QueueID : LongInt;
  122.                                JobEntry : JobEntryType;
  123.                                var ReplyEntry : JobEntryType) : Byte;
  124.   {-Places a new job in the queue}
  125.  
  126. function DestroyQueue(QueueID : LongInt) : Byte;
  127.   {-Removes a queue from the bindery and file system of a file server}
  128.  
  129. function DetachQueueServerFromQueue(QueueID : LongInt) : Byte;
  130.   {-Removes the requesting station from the queue's list of active queue (job_
  131.     servers}
  132.  
  133. function FinishServicingQueueJob(QueueID : LongInt; JobNumber : Word;
  134.                                  Charge : LongInt) : Byte;
  135.   {-Allows a queue (job) server to signal QMS when it has completed a job}
  136.  
  137. function GetQueueJobList(QueueID : LongInt; var Jobs : QueueJobList) : Byte;
  138.   {-Provides a list of all jobs contained in a queue}
  139.  
  140. function GetQueueJobFileSize(QueueID : LongInt;
  141.                              JobNumber : Word;
  142.                              var SizeOfFile : LongInt) : Byte;
  143.   {-Finds the size of the associated file for a job queue}
  144.  
  145. function ReadQueueCurrentStatus(QueueID : LongInt;
  146.                                 var QueueStatus : Byte;
  147.                                 var NumberOfJobs : Byte;
  148.                                 var NumberOfServers : Byte;
  149.                                 var ServerIDList : QueueServerIDList;
  150.                                 var StationList  : QueueStationList) : Byte;
  151.   {-Reads the current status of the queue}
  152.  
  153. function ReadJobEntry(QueueID : LongInt; JobNumber : Word;
  154.                       var JobEntry : JobEntryType) : Byte;
  155.   {-Retrieves information about jobs in a queue}
  156.  
  157. function ReadQueueServerStatus(QueueID : LongInt; ServerID : LongInt;
  158.                                ServerStation : Byte) : Byte;
  159.   {-Reads the current status record of an attached queue (job) server}
  160.  
  161. function RemoveJobFromQueue(QueueID : LongInt; JobNumber : Word) : Byte;
  162.   {-Removes a job from the queue}
  163.  
  164. function RestoreQueueServerRights : Byte;
  165.   {-Restores a server's own identity after assuming the client's rights}
  166.  
  167. function ServiceQueueJobAndOpenFile(QueueID : LongInt;
  168.                                     TargetJobType : Word;
  169.                                     var JobEntry : JobEntryType) : Byte;
  170.   {-Allows a queue server to request a new job for servicing}
  171.  
  172. function SetQueueCurrentStatus(QueueID : LongInt;
  173.                                QueueStatus : Byte) : Byte;
  174.   {-Controls the addition of jobs and job servers to a queue by setting and
  175.     clearing bits in the queue status byte}
  176.  
  177. function SetQueueServerStatusRecord(QueueID : LongInt;
  178.                                     var StatusRec : ServerStatusRecord) : Byte;
  179.   {-Updates QMS' copy of a queue (job) servers's status record}
  180.  
  181. {high level routines}
  182. function JobSize(QueueID : LongInt; JobNumber : Word;
  183.                  var Size : LongInt) : Byte;
  184.   {-Returns the size of the print data associate with queue QueueID and job
  185.     JobNumber}
  186.  
  187. implementation
  188.  
  189. function NetWareLongSwap(L : LongInt) : LongInt;
  190. type
  191.   DoubleWord       = record
  192.                        LoWord  : Word;
  193.                        HiWord  : Word;
  194.                      end;
  195.  
  196. var
  197.   DW : DoubleWord absolute L;
  198.  
  199. begin
  200.   NetWareLongSwap := (LongInt(Swap(DW.LoWord)) shl 16) or (Swap(DW.HiWord));
  201. end;
  202.  
  203. function AbortServicingQueueJob(QueueID : LongInt; JobNum : Word) : Byte;
  204. var
  205.   Request    : record
  206.                  Len    : Word;
  207.                  SubF   : Byte;
  208.                  QID    : LongInt;
  209.                  JobN   : Word;
  210.                end;
  211.   Reply      : Word;
  212.   NovRegs    : Registers;
  213.  
  214. begin
  215.   with Request do begin
  216.     Len    := SizeOf(Request) - 2;
  217.     SubF   := SubFAbortServicingJob;
  218.     QID    := NetWareSwapLong(QueueID);
  219.     JobN   := Swap(JobNum);
  220.   end;
  221.   Reply    := 0;
  222.   with NovRegs do begin
  223.     AH := BinderyFunc;
  224.     DS := Seg(Request);
  225.     SI := Ofs(Request);
  226.     ES := Seg(Reply);
  227.     DI := Ofs(Reply);
  228.     MsDos(NovRegs);
  229.     AbortServicingQueueJob := AL;
  230.   end;
  231. end;
  232.  
  233. function AttachQueueServerToQueue(QueueID : LongInt) : Byte;
  234.  
  235. var
  236.   Request    : record
  237.                  Len    : Word;
  238.                  SubF   : Byte;
  239.                  QID    : LongInt;
  240.                end;
  241.   Reply      : Word;
  242.   NovRegs    : Registers;
  243.  
  244. begin
  245.   with Request do begin
  246.     Len    := SizeOf(Request) - 2;
  247.     SubF   := SubFAttachQueServ;
  248.     QID    := NetWareSwapLong(QueueID);
  249.   end;
  250.   Reply    := 0;
  251.   with NovRegs do begin
  252.     AH := BinderyFunc;
  253.     DS := Seg(Request);
  254.     SI := Ofs(Request);
  255.     ES := Seg(Reply);
  256.     DI := Ofs(Reply);
  257.     MsDos(NovRegs);
  258.     AttachQueueServerToQueue := AL;
  259.   end;
  260. end;
  261.  
  262.  
  263. function ChangeQueueJobEntry(QueueID : LongInt;
  264.                              var JobEntry : JobEntryType) : Byte;
  265.  
  266.  
  267. var
  268.   Request    : record
  269.                  Len    : Word;
  270.                  SubF   : Byte;
  271.                  QID    : LongInt;
  272.                  Job    : JobEntryType;
  273.                end;
  274.   Reply      : Word;
  275.   NovRegs    : Registers;
  276.  
  277. begin
  278.   with Request do begin
  279.     Len    := SizeOf(Request) - 2;
  280.     SubF   := SubFChangeJobEntry;
  281.     QID    := NetWareSwapLong(QueueID);
  282.     Job    := JobEntry;
  283.   end;
  284.   Reply    := 0;
  285.   with NovRegs do begin
  286.     AH := BinderyFunc;
  287.     DS := Seg(Request);
  288.     SI := Ofs(Request);
  289.     ES := Seg(Reply);
  290.     DI := Ofs(Reply);
  291.     MsDos(NovRegs);
  292.     ChangeQueueJobEntry := AL;
  293.   end;
  294. end;
  295.  
  296.  
  297. function ChangeQueueJobPosition(QueueID : LongInt; JobNumber : Word;
  298.                                 NewPosition : Byte) : Byte;
  299.  
  300.  
  301. var
  302.   Request    : record
  303.                  Len    : Word;
  304.                  SubF   : Byte;
  305.                  QID    : LongInt;
  306.                  JobN   : Word;
  307.                  NewPos : Byte;
  308.                end;
  309.   Reply      : Word;
  310.   NovRegs    : Registers;
  311.  
  312. begin
  313.   with Request do begin
  314.     Len    := SizeOf(Request) - 2;
  315.     SubF   := SubFChangeJobPos;
  316.     QID    := NetWareSwapLong(QueueID);
  317.     JobN   := Swap(JobNumber);
  318.     NewPos := NewPosition;
  319.   end;
  320.   Reply    := 0;
  321.   with NovRegs do begin
  322.     AH := BinderyFunc;
  323.     DS := Seg(Request);
  324.     SI := Ofs(Request);
  325.     ES := Seg(Reply);
  326.     DI := Ofs(Reply);
  327.     MsDos(NovRegs);
  328.     ChangeQueueJobPosition := AL;
  329.   end;
  330. end;
  331.  
  332. function ChangeToClientRights(QueueID : LongInt; JobNumber : Word) : Byte;
  333. var
  334.   Request    : record
  335.                  Len    : Word;
  336.                  SubF   : Byte;
  337.                  QID    : LongInt;
  338.                  JobN   : Word;
  339.                end;
  340.   Reply      : Word;
  341.   NovRegs    : Registers;
  342.  
  343. begin
  344.   with Request do begin
  345.     Len    := SizeOf(Request) - SizeOf(Word);
  346.     SubF   := SubFChangeToClient;
  347.     QID    := NetWareSwapLong(QueueID);
  348.     JobN   := Swap(JobNumber);
  349.   end;
  350.   Reply    := 0;
  351.   with NovRegs do begin
  352.     AH := BinderyFunc;
  353.     DS := Seg(Request);
  354.     SI := Ofs(Request);
  355.     ES := Seg(Reply);
  356.     DI := Ofs(Reply);
  357.     MsDos(NovRegs);
  358.     ChangeToClientRights := AL;
  359.   end;
  360. end;
  361.  
  362. function CloseFileAndStartJob(QueueID : LongInt; JobNumber : Word) : Byte;
  363. var
  364.   Request    : record
  365.                  Len    : Word;
  366.                  SubF   : Byte;
  367.                  QID    : LongInt;
  368.                  JobN   : Word;
  369.                end;
  370.   Reply      : Word;
  371.   NovRegs    : Registers;
  372.  
  373. begin
  374.   with Request do begin
  375.     Len    := SizeOf(Request) - SizeOf(Word);
  376.     SubF   := SubFCloseAndStart;
  377.     QID    := NetWareSwapLong(QueueID);
  378.     JobN   := Swap(JobNumber);
  379.   end;
  380.   Reply    := 0;
  381.   with NovRegs do begin
  382.     AH := BinderyFunc;
  383.     DS := Seg(Request);
  384.     SI := Ofs(Request);
  385.     ES := Seg(Reply);
  386.     DI := Ofs(Reply);
  387.     MsDos(NovRegs);
  388.     CloseFileAndStartJob := AL;
  389.   end;
  390. end;
  391.  
  392. function CreateQueue(QueType : Word; QueName : ObjNameStr;
  393.                      DirectoryHandle : Byte; PathName : QueuePathType;
  394.                      var QueueID : LongInt) : Byte;
  395. var
  396.   Request : record
  397.               Len        : Word;
  398.               SubF       : Byte;
  399.               ObjT       : Word;
  400.               Buf        : Array[1..170] of Byte;
  401.             end;
  402.   Reply   : record
  403.               Len        : Word;
  404.               QID        : LongInt;
  405.             end;
  406.   NovRegs       : Registers;
  407.   Incr          : Word;
  408.   Index         : Byte;
  409. begin
  410.   with Request do begin
  411.     SubF   := SubFCreateQue;
  412.     ObjT   := Swap(QueType);
  413.     Index  := 1;
  414.     Incr   := Succ(Length(QueName));
  415.     Move(QueName,Buf[Index],Incr);
  416.     Inc(Index,Incr);
  417.     Buf[Index] := DirectoryHandle;
  418.     Inc(Index);
  419.     Incr := Succ(Length(PathName));
  420.     Move(PathName,Buf[Index],Incr);
  421.     Inc(Index,Incr);
  422.     Len := Index + 2;
  423.   end;
  424.   Reply.Len := SizeOf(LongInt);
  425.   with NovRegs do begin
  426.     AH := BinderyFunc;
  427.     DS := Seg(Request);
  428.     SI := Ofs(Request);
  429.     ES := Seg(Reply);
  430.     DI := Ofs(Reply);
  431.     MsDos(NovRegs);
  432.     CreateQueue := AL;
  433.   end;
  434.   QueueID := NetWareSwapLong(Reply.QID);
  435. end;
  436.  
  437. function CreateQueueJobAndFile(QueueID : LongInt;
  438.                                JobEntry : JobEntryType;
  439.                                var ReplyEntry : JobEntryType) : Byte;
  440.  
  441. {page 12-23}
  442. var
  443.   Request : record
  444.               Len      : Word;
  445.               SubF     : Byte;
  446.               QID      : LongInt;
  447.               Entry    : JobEntryType;
  448.             end;
  449.   Reply   : record
  450.               Len      : Word;
  451.               REntry   : JobEntryType;
  452.             end;
  453.   NovRegs       : Registers;
  454. begin
  455.   with Request do begin
  456.     Len     := SizeOf(Request) - SizeOf(Word);
  457.     SubF    := SubFCreateJobAndFile;
  458.     QID     := NetWareSwapLong(QueueID);
  459.     Entry   := JobEntry;
  460.   end;
  461.   Reply.Len := Ofs(Reply.Rentry.TextJobDesc) - Ofs(Reply.Rentry);
  462.   with NovRegs do begin
  463.     AH := BinderyFunc;
  464.     DS := Seg(Request);
  465.     SI := Ofs(Request);
  466.     ES := Seg(Reply);
  467.     DI := Ofs(Reply);
  468.     MsDos(NovRegs);
  469.     CreateQueueJobAndFile := AL;
  470.   end;
  471. end;
  472.  
  473. function DestroyQueue(QueueID : LongInt) : Byte;
  474.  
  475. var
  476.   Request    : record
  477.                  Len    : Word;
  478.                  SubF   : Byte;
  479.                  QID    : LongInt;
  480.                end;
  481.   Reply      : Word;
  482.   NovRegs    : Registers;
  483.  
  484. begin
  485.   with Request do begin
  486.     Len    := SizeOf(Request) - SizeOf(Word);
  487.     SubF   := SubFDestroyQue;
  488.     QID    := NetWareSwapLong(QueueID);
  489.   end;
  490.   Reply    := 0;
  491.   with NovRegs do begin
  492.     AH := BinderyFunc;
  493.     DS := Seg(Request);
  494.     SI := Ofs(Request);
  495.     ES := Seg(Reply);
  496.     DI := Ofs(Reply);
  497.     MsDos(NovRegs);
  498.     DestroyQueue := AL;
  499.   end;
  500. end;
  501.  
  502. function DetachQueueServerFromQueue(QueueID : LongInt) : Byte;
  503. var
  504.   Request    : record
  505.                  Len    : Word;
  506.                  SubF   : Byte;
  507.                  QID    : LongInt;
  508.                end;
  509.   Reply      : Word;
  510.   NovRegs    : Registers;
  511.  
  512. begin
  513.   with Request do begin
  514.     Len    := SizeOf(Request) - SizeOf(Word);
  515.     SubF   := SubFDetachFromQue;
  516.     QID    := NetWareSwapLong(QueueID);
  517.   end;
  518.   Reply    := 0;
  519.   with NovRegs do begin
  520.     AH := BinderyFunc;
  521.     DS := Seg(Request);
  522.     SI := Ofs(Request);
  523.     ES := Seg(Reply);
  524.     DI := Ofs(Reply);
  525.     MsDos(NovRegs);
  526.     DetachQueueServerFromQueue := AL;
  527.   end;
  528. end;
  529.  
  530. function FinishServicingQueueJob(QueueID : LongInt; JobNumber : Word;
  531.                                  Charge : LongInt) : Byte;
  532. var
  533.   Request    : record
  534.                  Len    : Word;
  535.                  SubF   : Byte;
  536.                  QID    : LongInt;
  537.                  JobN   : Word;
  538.                  Chrg   : LongInt;
  539.                end;
  540.   Reply      : Word;
  541.   NovRegs    : Registers;
  542.  
  543. begin
  544.   with Request do begin
  545.     Len    := SizeOf(Request) - SizeOf(Word);
  546.     SubF   := SubFFinishServicing;
  547.     QID    := NetWareSwapLong(QueueID);
  548.     JobN   := Swap(JobNumber);
  549.     Chrg   := Charge;
  550.   end;
  551.   Reply    := 0;
  552.   with NovRegs do begin
  553.     AH := BinderyFunc;
  554.     DS := Seg(Request);
  555.     SI := Ofs(Request);
  556.     ES := Seg(Reply);
  557.     DI := Ofs(Reply);
  558.     MsDos(NovRegs);
  559.     FinishServicingQueueJob := AL;
  560.   end;
  561. end;
  562.  
  563. function GetQueueJobList(QueueID : LongInt; var Jobs : QueueJobList) : Byte;
  564.  
  565. var
  566.   Request     : record
  567.                   Len    : Word;
  568.                   SubF   : Byte;
  569.                   ID     : LongInt;
  570.                 end;
  571.   Reply       : record
  572.                   Len    : Word;
  573.                   JobL   : QueueJobList;
  574.                   MaxJ   : Word;
  575.                 end;
  576.   NovRegs     : Registers;
  577.   I           : Word;
  578. begin
  579.   FillChar(Reply,SizeOf(Reply),Char(250));
  580.   Reply.Len := SizeOf(Reply) - 2;
  581.   with Request do begin
  582.     Len     := SizeOf(Request) - 2;
  583.     SubF    := SubFGetJobList;
  584.     ID      := NetWareSwapLong(QueueID);
  585.   end;
  586.   with NovRegs do begin
  587.     AH := BinderyFunc;
  588.     DS := Seg(Request);
  589.     SI := Ofs(Request);
  590.     ES := Seg(Reply);
  591.     DI := Ofs(Reply);
  592.     MsDos(NovRegs);
  593.     GetQueueJobList := AL;
  594.     if AL = 0 then
  595.       with Reply do begin
  596.         Jobs.NumJobs := Swap(JobL.NumJobs);
  597.         if Jobs.NumJobs > MaxQueueJobs then
  598.           Jobs.NumJobs := MaxQueueJobs;
  599.         for I := 1 to Jobs.NumJobs do
  600.           Jobs.JobList[I] := Swap(JobL.JobList[I]);
  601.       end;
  602.   end;
  603. end;
  604. function GetQueueJobFileSize(QueueID : LongInt;
  605.                              JobNumber : Word;
  606.                              var SizeOfFile : LongInt) : Byte;
  607.  
  608. var
  609.   Request     : record
  610.                   Len    : Word;
  611.                   SubF   : Byte;
  612.                   ID     : LongInt;
  613.                   JobN   : Word;
  614.                 end;
  615.   Reply       : record
  616.                   Len      : Word;
  617.                   QID      : QueueJobList;
  618.                   JN       : Word;
  619.                   FSize    : LongInt; {h-l}
  620.                 end;
  621.  
  622.   NovRegs     : Registers;
  623.   I           : Word;
  624.  
  625. begin
  626.   FillChar(Reply,SizeOf(Reply),0);
  627.   Reply.Len := SizeOf(Reply) - 2;
  628.   with Request do begin
  629.     Len     := SizeOf(Request) - 2;
  630.     SubF    := SubFGetJobFileSize;
  631.     ID      :=  NetWareSwapLong(QueueID);
  632.     JobN    := JobNumber;
  633.   end;
  634.   with NovRegs do begin
  635.     AH := BinderyFunc;
  636.     DS := Seg(Request);
  637.     SI := Ofs(Request);
  638.     ES := Seg(Reply);
  639.     DI := Ofs(Reply);
  640.     MsDos(NovRegs);
  641.     GetQueueJobFileSize := AL;
  642.   end;
  643.   SizeOfFile := NetWareLongSwap(Reply.FSize);
  644. end;
  645.  
  646. function ReadQueueCurrentStatus(QueueID : LongInt;
  647.                                 var QueueStatus : Byte;
  648.                                 var NumberOfJobs : Byte;
  649.                                 var NumberOfServers : Byte;
  650.                                 var ServerIDList : QueueServerIDList;
  651.                                 var StationList  : QueueStationList) : Byte;
  652.  
  653. var
  654.   Request     : record
  655.                   Len    : Word;
  656.                   SubF   : Byte;
  657.                   ID     : LongInt;
  658.                 end;
  659.   Reply       : record
  660.                   Len       : Word;
  661.                   ID        : LongInt;
  662.                   Status    : Byte;
  663.                   NumJobs   : Byte;
  664.                   NumServ   : Byte;
  665.                   ServerIDs : QueueServerIDList;
  666.                   Stations  : QueueStationList;
  667.                   MaxServs  : Byte;
  668.                 end;
  669.   NovRegs     : Registers;
  670.   I           : Word;
  671. begin
  672.   FillChar(Reply,SizeOf(Reply),Char(25));
  673.   Reply.Len := SizeOf(Reply) - 2;
  674.   with Request do begin
  675.     Len     := SizeOf(Request) - 2;
  676.     SubF    := SubFReadCurStatus;
  677.   end;
  678.   with NovRegs do begin
  679.     AH := BinderyFunc;
  680.     DS := Seg(Request);
  681.     SI := Ofs(Request);
  682.     ES := Seg(Reply);
  683.     DI := Ofs(Reply);
  684.     MsDos(NovRegs);
  685.     ReadQueueCurrentStatus := AL;
  686.     if AL = 0 then
  687.       with Reply do begin
  688.         QueueStatus      := Status;
  689.         NumberOfJobs     := NumJobs;
  690.         NumberOfServers  := NumServ;
  691.         ServerIDList     := ServerIDs;
  692.         StationList      := Stations;
  693.       end;
  694.   end;
  695. end;
  696.  
  697. function ReadJobEntry(QueueID : LongInt; JobNumber : Word;
  698.                       var JobEntry : JobEntryType) : Byte;
  699. var
  700.   Request     : record
  701.                   Len    : Word;
  702.                   SubF   : Byte;
  703.                   ID     : LongInt;
  704.                   Num    : Word;
  705.                 end;
  706.   Reply       : record
  707.                   Len       : Word;
  708.                   Entry     : JobEntryType;
  709.                 end;
  710.   NovRegs     : Registers;
  711.  
  712. begin
  713.   with Request do begin
  714.     Len    := SizeOf(Request) - 2;
  715.     SubF   := SubFReadJobEntry;
  716.     ID     := NetWareSwapLong(QueueID);
  717.     Num    := Swap(JobNumber);
  718.   end;
  719.   Reply.Len := SizeOf(Reply) - 2;
  720.   with NovRegs do begin
  721.     AH := BinderyFunc;
  722.     DS := Seg(Request);
  723.     SI := Ofs(Request);
  724.     ES := Seg(Reply);
  725.     DI := Ofs(Reply);
  726.     MsDos(NovRegs);
  727.     ReadJobEntry := AL;
  728.     if AL = 0 then begin
  729.       Reply.Entry.JobNumber := Swap(Reply.Entry.JobNumber);
  730.       Reply.Entry.JobType   := Swap(Reply.Entry.JobType);
  731.       JobEntry := Reply.Entry;
  732.     end;
  733.   end;
  734. end;
  735.  
  736. function ReadQueueServerStatus(QueueID : LongInt; ServerID : LongInt;
  737.                                ServerStation : Byte) : Byte;
  738.  
  739. var
  740.   Request     : record
  741.                   Len    : Word;
  742.                   SubF   : Byte;
  743.                   ID     : LongInt; {h-l}
  744.                   ServID : LongInt; {h-l}
  745.                   ServSt : Byte;
  746.                 end;
  747.   Reply       : record
  748.                   Len : Word;
  749.                   ServStatusRec : ServerStatusRecord;
  750.                 end;
  751.   NovRegs     : Registers;
  752.  
  753. begin
  754.   Reply.Len := SizeOf(Reply) - 2;
  755.   with Request do begin
  756.     Len    := SizeOf(Request) - 2;
  757.     SubF   := SubFReadQueServStatus;
  758.     ID     := NetWareSwapLong(QueueID);
  759.     ServID := ServerID;
  760.     ServSt := ServerStation;
  761.   end;
  762.   with NovRegs do begin
  763.     AH := BinderyFunc;
  764.     DS := Seg(Request);
  765.     SI := Ofs(Request);
  766.     ES := Seg(Reply);
  767.     DI := Ofs(Reply);
  768.     MsDos(NovRegs);
  769.     ReadQueueServerStatus := AL;
  770.   end;
  771. end;
  772.  
  773. function RemoveJobFromQueue(QueueID : LongInt; JobNumber : Word) : Byte;
  774. var
  775.   Request     : record
  776.                   Len    : Word;
  777.                   SubF   : Byte;
  778.                   ID     : LongInt;
  779.                   Num    : Word;
  780.                 end;
  781.   Reply       : Word;
  782.   NovRegs     : Registers;
  783.  
  784. begin
  785.   Reply := 0;
  786.   with Request do begin
  787.     Len    := SizeOf(Request) - 2;
  788.     SubF   := SubFRemJobFromQue;
  789.     ID     := NetWareSwapLong(QueueID);
  790.     Num    := Swap(JobNumber);
  791.   end;
  792.   with NovRegs do begin
  793.     AH := BinderyFunc;
  794.     DS := Seg(Request);
  795.     SI := Ofs(Request);
  796.     ES := Seg(Reply);
  797.     DI := Ofs(Reply);
  798.     MsDos(NovRegs);
  799.     RemoveJobFromQueue := AL;
  800.   end;
  801. end;
  802.  
  803. function RestoreQueueServerRights : Byte;
  804. var
  805.   Request : record
  806.               Len  : Word;
  807.               SubF : Byte;
  808.             end;
  809.   Reply   : Word;
  810.   NovRegs     : Registers;
  811.  
  812. begin
  813.   Reply := 0;
  814.   with Request do begin
  815.     Len    := SizeOf(Request) - 2;
  816.     SubF   := SubFChangeToServer;
  817.   end;
  818.   with NovRegs do begin
  819.     AH := BinderyFunc;
  820.     DS := Seg(Request);
  821.     SI := Ofs(Request);
  822.     ES := Seg(Reply);
  823.     DI := Ofs(Reply);
  824.     MsDos(NovRegs);
  825.     RestoreQueueServerRights := AL;
  826.   end;
  827. end;
  828.  
  829. function ServiceQueueJobAndOpenFile(QueueID : LongInt;
  830.                                     TargetJobType : Word;
  831.                                     var JobEntry : JobEntryType) : Byte;
  832. var
  833.   Request : record
  834.               Len    : Word;
  835.               SubF   : Byte;
  836.               QID    : LongInt;
  837.               JobT   : Word;
  838.             end;
  839.   Reply   : record
  840.               Len    : Word;
  841.               Entry  : JobEntryType;
  842.             end;
  843.   NovRegs : Registers;
  844.  
  845. begin
  846.   FillChar(Reply,SizeOf(Reply),0);
  847.   Reply.Len := SizeOf(Reply) - 2;
  848.   with Request do begin
  849.     Len    := SizeOf(Request) - 2;
  850.     SubF   := SubFServiceJob;
  851.     QID    := NetWareSwapLong(QueueID);
  852.     JobT   := TargetJobType;
  853.   end;
  854.   with NovRegs do begin
  855.     AH := BinderyFunc;
  856.     DS := Seg(Request);
  857.     SI := Ofs(Request);
  858.     ES := Seg(Reply);
  859.     DI := Ofs(Reply);
  860.     MsDos(NovRegs);
  861.     JobEntry := Reply.Entry;
  862.     ServiceQueueJobAndOpenFile := AL;
  863.   end;
  864. end;
  865.  
  866. function SetQueueCurrentStatus(QueueID : LongInt;
  867.                                QueueStatus : Byte) : Byte;
  868.  
  869. var
  870.   Request : record
  871.               Len    : Word;
  872.               SubF   : Byte;
  873.               QID    : LongInt;
  874.               QStat  : Byte;
  875.             end;
  876.   Reply   : Word;
  877.   NovRegs : Registers;
  878.  
  879. begin
  880.   Reply := 0;
  881.   with Request do begin
  882.     Len    := SizeOf(Request) - 2;
  883.     SubF   := SubFReadQueStatus;
  884.     QID    := NetWareSwapLong(QueueID);
  885.     QStat  := QueueStatus;
  886.   end;
  887.   with NovRegs do begin
  888.     AH := BinderyFunc;
  889.     DS := Seg(Request);
  890.     SI := Ofs(Request);
  891.     ES := Seg(Reply);
  892.     DI := Ofs(Reply);
  893.     MsDos(NovRegs);
  894.     SetQueueCurrentStatus := AL;
  895.   end;
  896. end;
  897. function SetQueueServerStatusRecord(QueueID : LongInt;
  898.                                     var StatusRec : ServerStatusRecord) : Byte;
  899.  
  900. var
  901.   Request : record
  902.               Len    : Word;
  903.               SubF   : Byte;
  904.               QID    : LongInt;
  905.               SRec   : ServerStatusRecord;
  906.             end;
  907.   Reply   : Word;
  908.   NovRegs : Registers;
  909.  
  910. begin
  911.   Reply := 0;
  912.   with Request do begin
  913.     Len    := SizeOf(Request) - 2;
  914.     SubF   := SubFSetStatusRec;
  915.     QID    := NetWareSwapLong(QueueID);
  916.     SRec   := StatusRec;
  917.   end;
  918.   with NovRegs do begin
  919.     AH := BinderyFunc;
  920.     DS := Seg(Request);
  921.     SI := Ofs(Request);
  922.     ES := Seg(Reply);
  923.     DI := Ofs(Reply);
  924.     MsDos(NovRegs);
  925.     SetQueueServerStatusRecord := AL;
  926.   end;
  927. end;
  928.  
  929. function JobSize(QueueID : LongInt; JobNumber : Word;
  930.                       var Size : LongInt) : Byte;
  931.   {-Returns the size of the data associate with queue QueueID and job
  932.     JobNumber}
  933. begin
  934.   JobSize := GetQueueJobFileSize(QueueID,JobNumber,Size);
  935.   Size := Size - SizeOf(JobEntryType);
  936. end;
  937.  
  938. begin
  939.   FillChar(FirstOpportunity, SizeOf(FirstOpportunity), $FF);
  940. end.
  941.