1150 lines
33 KiB
ObjectPascal
1150 lines
33 KiB
ObjectPascal
{$X+,B-,V-} {essential compiler directives}
|
|
|
|
UNIT nwQMS;
|
|
|
|
{ nwQMS unit as of 950301 / NwTP 0.6 API. (c) 1993,1995, R. Spronk }
|
|
{ Based in part on a unit containing queue services routines, written by
|
|
Erik van Heyningen in April 1994. }
|
|
|
|
INTERFACE
|
|
|
|
Uses nwMisc;
|
|
|
|
{ Function: Interrupt: Comments:
|
|
|
|
Queue Server Functions:
|
|
|
|
. AbortServicingQueueJob (F217/73) (S)
|
|
. AttachQueueServerToQueue (F217/6F) (S)
|
|
. ChangeToClientRights (F217/74) (S)
|
|
. DetachQueueServerFromQueue (F217/70) (S)
|
|
. FinishServicingQueueJob (F217/72) (S)
|
|
. RestoreQueueServerRights (F217/75) (S)
|
|
. ServiceQueueJob (F217/71) (S)
|
|
. SetQueueServerStatus (F217/77) (S)
|
|
|
|
Queue Operator Functions:
|
|
|
|
. ChangeQueueJobPosition (F217/6E) (O)
|
|
* CreateQueue (F217/64) (SUP)
|
|
* DestroyQueue (F217/65) (SUP)
|
|
. SetQueueStatus (F217/67) (O)
|
|
|
|
Queue User Functions:
|
|
|
|
. CreateQueueJob (F217/68) (C)
|
|
. StartQueueJob (F217/69) (C) (1)
|
|
|
|
Miscellaneous Queue Functions:
|
|
|
|
. ChangeQueueJobEntry (F217/6D) (C-O)
|
|
* GetQueueJobList (F217/6B) (C-O)
|
|
* GetQueueJobsFileSize (F217/78) (C-O-S)
|
|
* ReadQueueStatus (F217/66) (C-O)
|
|
* ReadQueueJobEntry (F217/6C) (C-O-S)
|
|
. ReadQueueServerStatus (F217/76) (C-O)
|
|
* RemoveJobFromQueue (F217/6A) (C-O)
|
|
|
|
|
|
Notes: C : Function available to Clients (Queue Users);
|
|
S : Function available to Servers (Queue Servers);
|
|
O : Functions availaible to Operators (Queue Operators);
|
|
SUP: Functions available to Supervisors/Workgroup managers.
|
|
|
|
(1): StartQueueJob is a.k.a. CloseFileAndStartQueueJob
|
|
}
|
|
|
|
CONST { Queue status flag }
|
|
QS_ALL_OK = $00;
|
|
QS_CANT_ADD_JOBS = $01; { possibility to add jobs disabled by operator }
|
|
QS_SERVERS_CANT_ATTACH = $02; { attachment of servers to queue disabled by operator }
|
|
QS_CANT_SERVICE_JOBS = $04; { queue halted by operator }
|
|
{ QS_XXXX constants can be ORed to form a QstatusFlag }
|
|
|
|
QF_NONE = $00;
|
|
QF_AUTO_START = $08;
|
|
QF_SERVICE_RESTART = $10;
|
|
QF_ENTRY_OPEN = $20;
|
|
QF_USER_HOLD = $40;
|
|
QF_OPERATOR_HOLD = $80;
|
|
|
|
CONST MaxQueueJobs = 250;
|
|
|
|
Type TQueueStatus= RECORD
|
|
ObjectId : Longint; { Object id of queue }
|
|
Status : Byte; { status of queue QS_XXX }
|
|
NbrOfJobs : Byte; { Number of jobs in queue }
|
|
NbrOfServers : Byte; { Number of servers attached to queue }
|
|
ServerObjectIds : array[1..25] of Longint;
|
|
{ List of Objects-ids of attached servers }
|
|
ServerConnNbrs : array[1..25] of Byte;
|
|
{ List of attached server stations }
|
|
MaxNbrOfServers : Byte; { ??? }
|
|
end;
|
|
|
|
TQueueServerStatus= Array[1..64] of Byte;
|
|
{ undefined structure -as far as QMS is concerned-}
|
|
|
|
Type TJobNumberList = Array[1..MaxQueueJobs] OF Word;
|
|
TQueueJobList = record
|
|
JobCount : Word;
|
|
JobNbrs : TJobNumberList; { List of jobs numbers by position in queue }
|
|
MaxJobs : Word; {????} { Maximum job numbers }
|
|
end;
|
|
|
|
TJobFileHandle=Array[1..6] of Byte;
|
|
TQueueJobEntry =Record { Unit external Type }
|
|
ClientConnNbr : Byte;
|
|
ClientTaskNbr : Byte;
|
|
ClientObjectID : Longint;
|
|
JobEntryTime : TnovTime;
|
|
JobNumber : Word;
|
|
JobFileName : String[14];
|
|
JobFileHandle : TjobFileHandle;
|
|
|
|
TargetServerIDnumber : Longint; {2}
|
|
TargetExecutionTime : TnovTime; {2}
|
|
JobType : Word; {2}
|
|
JobControlFlags : Byte; {2}
|
|
JobDescription : String[50]; {2}
|
|
ClientRecordArea : Array[1..152] OF Byte; {2}
|
|
|
|
JobPosition : Byte; {2/operators only}
|
|
|
|
ServerConnNbr, {1}
|
|
ServerTaskNbr : Byte; {1}
|
|
ServerObjectID : Longint; {1}
|
|
End;
|
|
{ 1: Filled by Queue server. As long as ServerTaskNbr=0,
|
|
queue entry is not being serviced.
|
|
2: Can be changed by queue operators and/or the 'owner' of
|
|
the job after job has been placed in queue
|
|
}
|
|
|
|
Var result:Word;
|
|
|
|
{F217/64 {2.1x+}
|
|
Function CreateQueue(Qname :string; QobjectType:Word;
|
|
dirHandle :Byte; pathName :string;
|
|
VAR QobjID:Longint ):Boolean;
|
|
{ Creates an object of an object_queue_type in the bindery, checks that
|
|
all settings are valid before creating. Returns the object_id of the
|
|
created queue if creation was successfull. }
|
|
|
|
{F217/65 [2.1x+]}
|
|
Function DestroyQueue(QobjID:Longint):Boolean;
|
|
{ Destroys the specified Queue; aborts all jobs in the queue;
|
|
associated files/directories are deleted;
|
|
queue object is removed from the bindery. }
|
|
|
|
|
|
{F217/76 [2.1x/3.x]}
|
|
Function ReadQueueStatus(QobjID:Longint;
|
|
Var Qstatus:TQueueStatus):Boolean;
|
|
{ Read the status of a queue. This information is changed by queueservers.}
|
|
|
|
{F217/67 [2.1x+]}
|
|
Function SetQueueStatus(QobjId:Longint; NewQstatusFlag:Byte):Boolean;
|
|
{ Change the queue status flag. Use the QS_XXXX constants }
|
|
|
|
{F217/6B}
|
|
FUNCTION GetQueueJobList( QueueObjId: Longint;
|
|
Var QJobList:TQueueJobList): Boolean;
|
|
{ You need to be either a Q_USER or a Q_OPERATOR }
|
|
|
|
{F217/6C}
|
|
FUNCTION ReadQueueJobEntry( QObjId: Longint;JobNbr: Word;
|
|
VAR QJob: TQueueJobEntry): Boolean;
|
|
{ You need to be either a Q_USER, Q_OPERATOR or a Q_SERVER }
|
|
|
|
{F217/6A}
|
|
FUNCTION RemoveJobFromQueue( QObjId: Longint; JobNbr: Word): Boolean;
|
|
{ You need to be Q_OPERATOR or the Q_USER who queued the job }
|
|
|
|
{F217/69 [2.1x+]}
|
|
Function StartQueueJob(QobjId:Longint;JobNbr:Word):Boolean;
|
|
|
|
|
|
{F217/6E [2.1x+]}
|
|
Function ChangeQueueJobPosition(QobjId:Longint; JobNbr:Word;
|
|
NewJobPos:Byte ):Boolean;
|
|
{ Q_OPERATOR only }
|
|
|
|
|
|
{F217/6F [2.1x+]}
|
|
Function AttachQueueServerToQueue(QobjId:Longint):Boolean;
|
|
{ Q_SERVERs only }
|
|
|
|
|
|
{F217/70 [2.1x+]}
|
|
Function DetachQueueServerFromQueue(QobjId:Longint):Boolean;
|
|
{ Q_SERVERs only }
|
|
|
|
|
|
{F217/71 [2.1x+]}
|
|
Function ServiceQueueJob(QobjID:Longint; JobType:Word;
|
|
Var QjobEntry:TQueueJobEntry):Boolean;
|
|
{ Q_SERVERs only }
|
|
|
|
{F217/72 [2.1x+]}
|
|
Function FinishServicingQueueJob(QobjId:Longint;JobNbr:Word;
|
|
Charge:Longint ):Boolean;
|
|
{ Q_SERVERs only }
|
|
|
|
{F217/73 [2.1x+]}
|
|
Function AbortServicingQueueJob(QobjId:Longint; JobNbr:Word):Boolean;
|
|
|
|
{F217/74 [2.1x+]}
|
|
Function ChangeToClientRights(QobjId:Longint;JobNbr:Word):Boolean;
|
|
{ Q_SERVERs servicing job only }
|
|
|
|
{F217/75 [2.1x+]}
|
|
Function RestoreQueueServerRights:Boolean;
|
|
{ Q_SERVERs, servicing job and having previously called
|
|
ChangeToClientRights only }
|
|
|
|
{F217/76 [2.1x+]}
|
|
Function ReadQueueServerStatus(QobjId :Longint;
|
|
QserverObjId :Longint;
|
|
QserverConnNbr:Byte;
|
|
Var Qstatus:TQueueServerStatus):Boolean;
|
|
|
|
|
|
{F217/77 [2.1x+]}
|
|
Function SetQueueServerStatus(QobjId:Longint; Qstatus:TqueueServerStatus):Boolean;
|
|
|
|
{F217/78 [2.1x+]}
|
|
Function GetQueueJobsFileSize(QobjId:Longint; JobNbr:Word;
|
|
Var JobSize:Longint ):Boolean;
|
|
|
|
{F217/68 [2.1x+]}
|
|
Function CreateQueueJob(QobjId:Longint;
|
|
{i/o} Var Qjob:TqueueJobEntry):Boolean;
|
|
|
|
{F217/6D [2.1x+]}
|
|
Function ChangeQueueJobEntry(QobjId:Longint;Qjob:TQueueJobEntry):Boolean;
|
|
|
|
IMPLEMENTATION {============================================================}
|
|
|
|
Uses nwIntr;
|
|
|
|
Type TIntJobStruct =Record { Unit internal Type }
|
|
_ClientConnNbr,
|
|
_ClientTaskNbr : Byte;
|
|
_ClientObjectID, {hi-lo}
|
|
_TargetServerIDnumber : Longint; {hi-lo}
|
|
_TargetExecutionTime,
|
|
_JobEntryTime : Array[1..6] OF Byte; { YMDHMS }
|
|
_JobNumber, {hi-lo}
|
|
_JobType : Word; {hi-lo}
|
|
_JobPosition,
|
|
_JobControlFlags : Byte;
|
|
_JobFileName : Array[1..14] OF CHAR; { ASCIIZ }
|
|
_JobFileHandle : TJobFileHandle;
|
|
_ServerConnNbr,
|
|
_ServerTaskNbr : Byte;
|
|
_ServerObjectID : Longint; {hi-lo}
|
|
_JobDescription : Array[1..50] OF CHAR; { ASCIIZ }
|
|
_ClientRecordArea : Array[1..152] OF Byte
|
|
End;
|
|
|
|
Procedure ConvertQJE2ext(qje:TintJobStruct;VAR ext:TQueueJobEntry;
|
|
Unrestricted:Boolean);
|
|
{convert the internal QueueJobEntry type into the equivalent
|
|
unit external type }
|
|
begin
|
|
With qje,ext
|
|
do begin
|
|
ClientConnNbr:=_ClientConnNbr;
|
|
ClientTaskNbr:=_ClientTaskNbr;
|
|
ClientObjectId:=Lswap(_ClientObjectId);
|
|
Move(_JobEntryTime,JobEntryTime,6); JobEntryTime.DayOfWeek:=0;
|
|
{ # fix year for year 2000+ ? }
|
|
JobNumber:=swap(_JobNumber);
|
|
ZstrCopy(JobFileName,_JobFileName,14);
|
|
JobFileHandle:=_JobFileHandle;
|
|
TargetServerIdNumber:=Lswap(_TargetServerIdNumber);
|
|
Move(_TargetExecutionTime,TargetExecutionTime,6); TargetExecutionTime.DayOfWeek:=0;
|
|
{ # fix year for year 2000+ ? }
|
|
JobType:=swap(_JobType);
|
|
JobControlFlags:=_JobControlFlags;
|
|
IF UnRestricted
|
|
then begin
|
|
ZstrCopy(JobDescription,_JobDescription,50);
|
|
Move(_ClientRecordArea,ClientRecordArea,152);
|
|
end;
|
|
JobPosition:=_JobPosition;
|
|
ServerConnNbr:=_ServerConnNbr;
|
|
ServerTaskNbr:=_ServerTaskNbr;
|
|
ServerObjectId:=Lswap(_ServerObjectId);
|
|
end;
|
|
end;
|
|
|
|
Procedure ConvertQJE2int(qje:TQueueJobEntry;VAR int:TintJobStruct);
|
|
{convert the external QueueJobEntry type into the equivalent
|
|
unit internal type }
|
|
Var s:string[50];
|
|
begin
|
|
With qje,int
|
|
do begin
|
|
_ClientConnNbr:=ClientConnNbr;
|
|
_ClientTaskNbr:=ClientTaskNbr;
|
|
_ClientObjectId:=Lswap(ClientObjectId);
|
|
_TargetServerIdNumber:=Lswap(TargetServerIdNumber);
|
|
Move(TargetExecutionTime,_TargetExecutionTime,6);
|
|
{ # fix year for year 2000+ ? }
|
|
Move(JobEntryTime,_JobEntryTime,6);
|
|
{ # fix year for year 2000+ ? }
|
|
_JobNumber:=swap(JobNumber);
|
|
_JobType:=swap(JobType);
|
|
_JobPosition:=JobPosition;
|
|
_JobControlFlags:=JobControlFlags;
|
|
PStrCopy(s,JobFilename,14);Move(s[1],_JobFileName,14);
|
|
_JobFileHandle:=JobFileHandle;
|
|
_ServerConnNbr:=ServerConnNbr;
|
|
_ServerTaskNbr:=ServerTaskNbr;
|
|
_ServerObjectId:=Lswap(ServerObjectId);
|
|
PstrCopy(s,JobDescription,50);Move(s[1],_JobDescription,50);
|
|
Move(ClientRecordArea,_ClientRecordArea,152);
|
|
end;
|
|
end;
|
|
|
|
|
|
{--- Initial Functions, create and destroy Job Queue --------------------}
|
|
|
|
{F217/64 {2.1x+}
|
|
Function CreateQueue(Qname :string; QobjectType:Word;
|
|
dirHandle :Byte; pathName :string;
|
|
VAR QobjID:Longint ):Boolean;
|
|
{ Creates an object of an object_queue_type in the bindery, checks that
|
|
all settings are valid before creating. Returns the object_id of the
|
|
created queue if creation was successfull. }
|
|
{ QobjectType= OT_PRINT_QUEUE, OT_JOB_QUEUE,
|
|
OT_ARCHIVE_QUEUE, own obj.type >$8000 }
|
|
{ You need supervisor-equivalent or workgroup-manager rights to perform
|
|
this action. }
|
|
{ To add (remove) Queue operators or
|
|
(dis-)allow Queue servers to attach to a queue or
|
|
(dis-)allow objects (users/groups) to use a queue,
|
|
use the AddBinderyObjectToSet and DeleteBinderyObjectFromSet functions
|
|
in the nwBindry unit with the property names Q_OPERATORS, Q_SERVERS
|
|
and Q_USERS respectively. }
|
|
Type Treq=record
|
|
len :Word;
|
|
subFunc :Byte;
|
|
_Qtype :Word; { hi-lo}
|
|
_QdivData :array[1..168] of Byte;
|
|
end;
|
|
Trep=record
|
|
_Qid:Longint; {hi-lo}
|
|
end;
|
|
TPreq=^Treq;
|
|
TPrep=^Trep;
|
|
Var i:Byte;
|
|
Begin
|
|
WITH TPreq(GlobalReqBuf)^
|
|
do begin
|
|
subFunc:=$64;
|
|
_Qtype:=swap(QobjectType); { force hi-lo }
|
|
i:=ord(Qname[0])+1;
|
|
UpString(Qname);Move(Qname[0],_QdivData[1],i);
|
|
|
|
inc(i);
|
|
_QdivData[i]:=DirHandle;
|
|
|
|
inc(i);
|
|
UpString(PathName);
|
|
Move(PathName[0],_QDivData[i],ord(PathName[0])+1);
|
|
|
|
len:=3+i+ord(PathName[0]);
|
|
F2SystemCall($17,len+2,SizeOf(Trep),result);
|
|
end;
|
|
With TPrep(GlobalReplyBuf)^
|
|
do begin
|
|
QobjID:=Lswap(_Qid); { force lo-hi }
|
|
end;
|
|
CreateQueue:=(result=0)
|
|
{ resultcodes: $00 Success ; $96 Server Out Of Memory; $99 Drectory Full;
|
|
$9B Bad Directory Handle; $9C Invalid Path; $ED Property Already Exists;
|
|
$EE Object Already Exists; $EF Invalid Name; $F0 Wildcard Not Allowed;
|
|
$F1 Invalid Bindery Security; $F5 No Object Create Privilege;
|
|
$F7 No Property Create Privilege; $FC No Such Object;
|
|
$FE Server Bindery Locked; $FF Bindery Failure. }
|
|
end;
|
|
|
|
{F217/65 [2.1x+]}
|
|
Function DestroyQueue(QobjID:Longint):Boolean;
|
|
{ Destroys the specified Queue; aborts all jobs in the queue;
|
|
associated files/directories are deleted;
|
|
queue object is removed from the bindery. }
|
|
Type Treq=record
|
|
len:Word;
|
|
subFunc:Byte;
|
|
_QobjID:Longint; {hi-lo}
|
|
end;
|
|
TPreq=^Treq;
|
|
Begin
|
|
WITH TPreq(GlobalReqBuf)^
|
|
do begin
|
|
len:=SizeOf(Treq)-2;
|
|
subFunc:=$65;
|
|
_QobjID:=Lswap(QobjID); { force hi-lo }
|
|
end;
|
|
F2SystemCall($17,Sizeof(Treq),0,result);
|
|
DestroyQueue:=(result=0);
|
|
{ resultcodes: $00 Success ; $96 Server Out Of Memory; $9C Invalid Path;
|
|
$D0 Queue Error; $D1 No Queue; $FF Hardware Failure. }
|
|
end;
|
|
|
|
{----------------Client or Diagnostic Functions-----------------------------}
|
|
|
|
{F217/76 [2.1x/3.x]}
|
|
Function ReadQueueStatus(QobjID:Longint;
|
|
Var Qstatus:TQueueStatus):Boolean;
|
|
{ Read the status of a queue. This information is changed by queueservers.}
|
|
Type Treq=record
|
|
len :Word;
|
|
subFunc:Byte;
|
|
_QobjID:Longint; {hi-lo}
|
|
end;
|
|
Trep=record
|
|
_QobjID:Longint; {hi-lo}
|
|
_Qstatus:Byte;
|
|
_NbrOfJobs:Byte;
|
|
_NbrOfServers:Byte; {max.25}
|
|
_serverIDlist:array[1..25] of Longint; {hi-lo}
|
|
_ServerConnNbrs:array[1..25] of Byte;
|
|
_MaxNumberOfServers:Byte;
|
|
end;
|
|
TPreq=^Treq;
|
|
TPrep=^Trep;
|
|
Var t:Byte;
|
|
Begin
|
|
WITH TPreq(GlobalReqBuf)^
|
|
do begin
|
|
len:=SizeOf(Treq)-2;
|
|
subFunc:=$66;
|
|
_QobjID:=Lswap(QobjID); {force hi-lo}
|
|
end;
|
|
F2SystemCall($17,Sizeof(Treq),SizeOf(Trep),result);
|
|
With Qstatus, TPrep(GlobalReplyBuf)^
|
|
do begin
|
|
ObjectId:=Lswap(_QobjId);
|
|
status:=_Qstatus;
|
|
NbrOfJobs:=_NbrOfJobs;
|
|
NbrOfServers:=_NbrOfServers;
|
|
|
|
for t:=1 to NbrOfServers
|
|
do ServerObjectIDs[t]:=Lswap(_ServerIDlist[t]);
|
|
Move(_ServerConnNbrs,ServerConnNbrs,25);
|
|
MaxNbrOfServers:=_MaxNumberOfServers;
|
|
end;
|
|
ReadQueueStatus:=(result=0)
|
|
end;
|
|
|
|
{F217/67 [2.1x+]}
|
|
Function SetQueueStatus(QobjId:Longint; NewQstatusFlag:Byte):Boolean;
|
|
{ Change the queue status flag. Use the QS_XXXX constants }
|
|
Type Treq=record
|
|
len:Word;
|
|
subFunc:Byte;
|
|
_QobjId:Longint; {hi-lo}
|
|
_Qstatus:Byte;
|
|
end;
|
|
TPreq=^Treq;
|
|
Begin
|
|
WITH TPreq(GlobalReqBuf)^
|
|
do begin
|
|
subFunc:=$67;
|
|
_QobjId:=Lswap(QobjId);
|
|
_Qstatus:=NewQStatusFlag;
|
|
len:=SizeOf(Treq)-2;
|
|
end;
|
|
F2SystemCall($17,SizeOf(Treq),0,result);
|
|
SetQueueStatus:=(result=0)
|
|
{ Valid completion codes:
|
|
$00 Success
|
|
$96 Server Out Of Memory;
|
|
$9C Invalid Path;
|
|
$D0 Queue Error;
|
|
$D1 No Queue;
|
|
$D3 No Queue Rights;
|
|
$FE Server Bindery Locked;
|
|
$FF Bindery Failure.
|
|
}
|
|
end;
|
|
|
|
|
|
|
|
{F217/6B}
|
|
FUNCTION GetQueueJobList( QueueObjId: Longint;
|
|
Var QJobList:TQueueJobList): Boolean;
|
|
{ You need to be either a Q_USER or a Q_OPERATOR }
|
|
Type TReq=Record
|
|
BufLen : Word;
|
|
func : Byte;
|
|
_QueueObjId: Longint; {hi-lo}
|
|
end;
|
|
TRep=Record
|
|
_JobCount:Word; {max 250, hi-lo}
|
|
_JobBuf :TJobNumberList; {array, entries hi-lo}
|
|
_MaxJobs :Word; {hi-lo}
|
|
End;
|
|
TPrep=^Trep;
|
|
TPreq=^Treq;
|
|
Var i:Word;
|
|
Begin
|
|
With TPReq(GlobalReqBuf)^
|
|
do Begin
|
|
func:= $6B;
|
|
_QueueObjId:= LSwap(QueueObjId);
|
|
BufLen:=5;
|
|
End;
|
|
F2SystemCall($17,Sizeof(Treq),SizeOf(Trep),result);
|
|
IF result = 0
|
|
Then with QJobList, TPrep(GlobalReplyBuf)^
|
|
do Begin
|
|
JobCount:= Swap(_JobCount);
|
|
IF (JobCount > MaxQueueJobs)
|
|
Then JobCount:= MaxQueueJobs;
|
|
FOR i:= 1 TO JobCount
|
|
DO JobNbrs[i]:= Swap(_JobBuf[i]);
|
|
MaxJobs:=swap(_MaxJobs);
|
|
End;
|
|
GetQueueJobList:= (result = 0);
|
|
{ Valid completion codes:
|
|
$00 Success
|
|
$96 Server Out Of Memory;
|
|
$9C Invalid Path;
|
|
$D0 Queue Error;
|
|
$D1 No Queue;
|
|
$D2 No Queue Server;
|
|
$D3 No Queue Rights;
|
|
$FC No Such Object;
|
|
$FE Server Bindery Locked;
|
|
$FF Bindery Failure. }
|
|
End;
|
|
|
|
{F217/6C}
|
|
FUNCTION ReadQueueJobEntry( QObjId: Longint;JobNbr: Word;
|
|
VAR QJob: TQueueJobEntry): Boolean;
|
|
{ You need to be either a Q_USER, Q_OPERATOR or a Q_SERVER }
|
|
Type TReq=Record
|
|
BufLen : Word;
|
|
func : Byte;
|
|
_QueueObjId: Longint; {hi-lo}
|
|
_JobNumber : Word {hi-lo}
|
|
End;
|
|
TRep=Record
|
|
buf : TintJobStruct; { Unit INTERNAL type. To be converted }
|
|
End;
|
|
TPreq=^Treq;
|
|
TPrep=^Trep;
|
|
Begin
|
|
With TPReq(GlobalReqBuf)^
|
|
do Begin
|
|
Buflen:= 7;
|
|
func:= $6C;
|
|
_QueueObjId:= LSwap(QObjId);
|
|
_JobNumber:= Swap(JobNbr);
|
|
End;
|
|
F2SystemCall($17,SizeOf(Treq),SizeOf(Trep),result);
|
|
IF result= 0
|
|
Then with TPrep(GlobalReplyBuf)^
|
|
do Begin
|
|
ConvertQJE2ext(buf,QJob,True);
|
|
End;
|
|
ReadQueueJobEntry:= result = 0;
|
|
{ Valid completion codes:
|
|
$00 Success
|
|
$96 Server Out Of Memory;
|
|
$D0 Queue Error;
|
|
$D1 No Queue;
|
|
$D2 No Queue Server;
|
|
$D3 No Queue Rights;
|
|
$D5 No Queue Job;
|
|
$FC No Such Object;
|
|
$FE Server Bindery Locked;
|
|
$FF Bindery Failure. }
|
|
End;
|
|
|
|
{F217/6A}
|
|
FUNCTION RemoveJobFromQueue( QObjId: Longint; JobNbr: Word): Boolean;
|
|
{ You need to be Q_OPERATOR or the Q_USER who queued the job }
|
|
Type TReq=Record
|
|
BufLen: Word;
|
|
func: Byte;
|
|
_QueueObjId: Longint; {hi-lo}
|
|
_JobNumber:Word {hi-lo}
|
|
End;
|
|
TPreq=^Treq;
|
|
Begin
|
|
With TPReq(GlobalReqBuf)^
|
|
do Begin
|
|
Buflen:= 7;
|
|
func:= $6A;
|
|
_QueueObjId:= LSwap(QObjId);
|
|
_JobNumber:= Swap(JobNbr);
|
|
End;
|
|
F2SystemCall($17,SizeOf(Treq),0,result);
|
|
RemoveJobFromQueue:= result = 0;
|
|
{ Valid completion codes:
|
|
$00 Success
|
|
$96 Server Out Of Memory;
|
|
$D0 Queue Error;
|
|
$D1 No Queue;
|
|
$D3 No Queue Rights;
|
|
$D5 No Queue Job;
|
|
$D6 No Job Rights;
|
|
$FE Server Bindery Locked;
|
|
$FF Bindery Failure. }
|
|
End;
|
|
|
|
|
|
{F217/69 [2.1x+]}
|
|
Function StartQueueJob(QobjId:Longint;JobNbr:Word):Boolean;
|
|
Type Treq=record
|
|
len :Word;
|
|
subFunc:Byte;
|
|
_QobjId:Longint; {hi-lo}
|
|
_JobNbr:Word; {hi-lo}
|
|
end;
|
|
TPreq=^Treq;
|
|
Begin
|
|
WITH TPreq(GlobalReqBuf)^
|
|
do begin
|
|
subFunc:=$69;
|
|
_QobjId:=Lswap(QobjID);
|
|
_JobNbr:=swap(JobNbr);
|
|
len:=SizeOf(Treq)-2;
|
|
end;
|
|
F2SystemCall($17,SizeOf(Treq),0,result);
|
|
StartQueueJob:=(result=0)
|
|
{ Valid completion codes:
|
|
$00 Success
|
|
$96 Server Out Of Memory;
|
|
$D0 Queue Error;
|
|
$D1 No Queue;
|
|
$D3 No Queue Rights;
|
|
$D5 No Queue Job;
|
|
$D6 No Job Rights;
|
|
$FE Server Bindery Locked;
|
|
$FF Bindery Failure. }
|
|
end;
|
|
|
|
|
|
{F217/6E [2.1x+]}
|
|
Function ChangeQueueJobPosition(QobjId:Longint; JobNbr:Word;
|
|
NewJobPos:Byte ):Boolean;
|
|
{ Q_OPERATOR only }
|
|
Type Treq=record
|
|
len :Word;
|
|
subFunc :Byte;
|
|
_QobjId :Longint; {hi-lo}
|
|
_JobNbr :Word; {hi-lo}
|
|
_NewJobPos:Byte;
|
|
end;
|
|
TPreq=^Treq;
|
|
Begin
|
|
WITH TPreq(GlobalReqBuf)^
|
|
do begin
|
|
subFunc:=$6E;
|
|
_QobjId:=Lswap(QobjId);
|
|
_JobNbr:=swap(JobNbr);
|
|
_NewJobPos:=NewJobPos;
|
|
len:=SizeOf(Treq)-2;
|
|
end;
|
|
F2SystemCall($17,SizeOf(Treq),0,result);
|
|
ChangeQueueJobPosition:=(result=0)
|
|
{ Valid completion codes:
|
|
$00 Success
|
|
$96 Server Out Of Memory;
|
|
$D0 Queue Error;
|
|
$D1 No Queue;
|
|
$D5 No Queue Job;
|
|
$D6 No Job Rights;
|
|
$FE Server Bindery Locked;
|
|
$FF Bindery Failure. }
|
|
end;
|
|
|
|
{F217/6F [2.1x+]}
|
|
Function AttachQueueServerToQueue(QobjId:Longint):Boolean;
|
|
{ Q_SERVERs only }
|
|
Type Treq=record
|
|
len :Word;
|
|
subFunc:Byte;
|
|
_QobjId:Longint; {hi-lo}
|
|
end;
|
|
TPreq=^Treq;
|
|
Begin
|
|
WITH TPreq(GlobalReqBuf)^
|
|
do begin
|
|
subFunc:=$6F;
|
|
_QobjId:=Lswap(QobjId);
|
|
len:=SizeOf(Treq)-2;
|
|
end;
|
|
F2SystemCall($17,SizeOf(Treq),0,result);
|
|
AttachQueueServerToQueue:=(result=0)
|
|
{ Valid completion codes:
|
|
$00 Success
|
|
$96 Server Out Of Memory;
|
|
$9C Invalid Path;
|
|
$D0 Queue Error;
|
|
$D1 No Queue;
|
|
$D2 No Queue Server;
|
|
$FE Server Bindery Locked;
|
|
$FF Bindery Failure. }
|
|
end;
|
|
|
|
|
|
{F217/70 [2.1x+]}
|
|
Function DetachQueueServerFromQueue(QobjId:Longint):Boolean;
|
|
{ Q_SERVERs only }
|
|
Type Treq=record
|
|
len :Word;
|
|
subFunc:Byte;
|
|
_QobjId:Longint; {hi-lo}
|
|
end;
|
|
TPreq=^Treq;
|
|
Begin
|
|
WITH TPreq(GlobalReqBuf)^
|
|
do begin
|
|
subFunc:=$70;
|
|
_QobjId:=Lswap(QobjId);
|
|
len:=SizeOf(Treq)-2;
|
|
end;
|
|
F2SystemCall($17,SizeOf(Treq),0,result);
|
|
DetachQueueServerFromQueue:=(result=0)
|
|
{ Valid completion codes:
|
|
$00 Success
|
|
$96 Server Out Of Memory;
|
|
$9C Invalid Path;
|
|
$D0 Queue Error;
|
|
$D1 No Queue;
|
|
$D2 No Queue Server;
|
|
$FE Server Bindery Locked;
|
|
$FF Bindery Failure. }
|
|
end;
|
|
|
|
|
|
{F217/71 [2.1x+]}
|
|
Function ServiceQueueJob(QobjID:Longint; JobType:Word;
|
|
Var QjobEntry:TQueueJobEntry):Boolean;
|
|
{ Q_SERVERs only }
|
|
Type Treq=record
|
|
len :Word;
|
|
subFunc :Byte;
|
|
_QobjId :Longint; {hi-lo}
|
|
_JobType:Word; {hi-lo}
|
|
end;
|
|
Trep=Record
|
|
_qje:TintJobStruct; { EXCEPT last two fields }
|
|
end;
|
|
TPreq=^Treq;
|
|
TPrep=^Trep;
|
|
Begin
|
|
WITH TPreq(GlobalReqBuf)^
|
|
do begin
|
|
subFunc:=$71;
|
|
_QobjId:=Lswap(QobjId);
|
|
_JobType:=swap(JobType);
|
|
len:=SizeOf(Treq)-2;
|
|
end;
|
|
F2SystemCall($17,SizeOf(Treq),SizeOf(Trep)-50-152,result);
|
|
With TPrep(GlobalReplyBuf)^
|
|
do begin
|
|
ConvertQJE2Ext(_qje,QjobEntry,false);
|
|
FillChar(QjobEntry.JobDescription,50,#$0);
|
|
FillChar(QjobEntry.ClientRecordArea,152,#$0);
|
|
{ Use the ReadQueueJobEntry function to get job's
|
|
descriptionstring and clientRecordArea. }
|
|
end;
|
|
ServiceQueueJob:=(result=0)
|
|
{ Valid completion codes:
|
|
$00 Success
|
|
$96 Server Out Of Memory;
|
|
$9C Invalid Path;
|
|
$D0 Queue Error;
|
|
$D1 No Queue;
|
|
$D3 No Queue Rights;
|
|
$D5 No Queue Job;
|
|
$D9 Connection not Queue Server;
|
|
$DA Queue Halted;
|
|
$FE Server Bindery Locked;
|
|
$FF Bindery Failure. }
|
|
end;
|
|
|
|
{F217/72 [2.1x+]}
|
|
Function FinishServicingQueueJob(QobjId:Longint;JobNbr:Word;
|
|
Charge:Longint ):Boolean;
|
|
{ Q_SERVERs only }
|
|
Type Treq=record
|
|
len :Word;
|
|
subFunc:Byte;
|
|
_QobjId:Longint; {hi-lo}
|
|
_JobNbr:Word; {hi-lo}
|
|
_Charge:Longint; {hi-lo}
|
|
end;
|
|
TPreq=^Treq;
|
|
Begin
|
|
WITH TPreq(GlobalReqBuf)^
|
|
do begin
|
|
subFunc:=$72;
|
|
_QobjId:=Lswap(QobjId);
|
|
_JobNbr:=swap(JobNbr);
|
|
_Charge:=Lswap(Charge);
|
|
len:=SizeOf(Treq)-2;
|
|
end;
|
|
F2SystemCall($17,SizeOf(Treq),0,result);
|
|
FinishServicingQueueJob:=(result=0)
|
|
{ Valid completion codes:
|
|
$00 Success
|
|
$96 Server Out Of Memory;
|
|
$D0 Queue Error;
|
|
$D1 No Queue;
|
|
$D6 No Job Rights; }
|
|
end;
|
|
|
|
{F217/73 [2.1x+]}
|
|
Function AbortServicingQueueJob(QobjId:Longint; JobNbr:Word):Boolean;
|
|
Type Treq=record
|
|
len :Word;
|
|
subFunc:Byte;
|
|
_QobjId:Longint; {hi-lo}
|
|
_JobNbr:Word; {hi-lo}
|
|
end;
|
|
TPreq=^Treq;
|
|
Begin
|
|
WITH TPreq(GlobalReqBuf)^
|
|
do begin
|
|
subFunc:=$73;
|
|
_QobjId:=Lswap(QobjId);
|
|
_JobNbr:=swap(JobNbr);
|
|
len:=SizeOf(Treq)-2;
|
|
end;
|
|
F2SystemCall($17,SizeOf(Treq),0,result);
|
|
AbortServicingQueueJob:=(result=0)
|
|
{ Valid completion codes:
|
|
$00 Success
|
|
$96 Server Out Of Memory;
|
|
$D0 Queue Error;
|
|
$D1 No Queue;
|
|
$D6 No Job Rights;
|
|
$D9 Connection not Queue Server; }
|
|
end;
|
|
|
|
{F217/74 [2.1x+]}
|
|
Function ChangeToClientRights(QobjId:Longint;JobNbr:Word):Boolean;
|
|
{ Q_SERVERs servicing job only }
|
|
Type Treq=record
|
|
len :Word;
|
|
subFunc:Byte;
|
|
_QobjId:Longint; {hi-lo}
|
|
_JobNbr:Word; {hi-lo}
|
|
end;
|
|
TPreq=^Treq;
|
|
Begin
|
|
WITH TPreq(GlobalReqBuf)^
|
|
do begin
|
|
subFunc:=$74;
|
|
_QobjId:=Lswap(QobjId);
|
|
_JobNbr:=swap(JobNbr);
|
|
len:=SizeOf(Treq)-2;
|
|
end;
|
|
F2SystemCall($17,SizeOf(Treq),0,result);
|
|
ChangeToClientRights:=(result=0)
|
|
{ Valid completion codes:
|
|
$00 Success
|
|
$96 Server Out Of Memory;
|
|
$D0 Queue Error;
|
|
$D1 No Queue;
|
|
$D6 No Job Rights;
|
|
$D9 Connection not Queue Server; }
|
|
end;
|
|
|
|
{F217/75 [2.1x+]}
|
|
Function RestoreQueueServerRights:Boolean;
|
|
{ Q_SERVERs, servicing job and having previously called
|
|
ChangeToClientRights only }
|
|
Type Treq=record
|
|
len :Word;
|
|
subFunc:Byte;
|
|
end;
|
|
TPreq=^Treq;
|
|
Begin
|
|
WITH TPreq(GlobalReqBuf)^
|
|
do begin
|
|
subFunc:=$75;
|
|
len:=SizeOf(Treq)-2;
|
|
end;
|
|
F2SystemCall($17,SizeOf(Treq),0,result);
|
|
RestoreQueueServerRights:=(result=0)
|
|
{ Valid completion codes:
|
|
$00 Success
|
|
$96 Server Out Of Memory;
|
|
$9C Invalid Path;
|
|
$D0 Queue Error;
|
|
$D1 No Queue;
|
|
$D3 No Queue Rights;
|
|
$D5 No Queue Job;
|
|
$D9 Connection not Queue Server;
|
|
$DA Queue Halted;
|
|
$FE Server Bindery Locked;
|
|
$FF Bindery Failure. }
|
|
end;
|
|
|
|
{F217/76 [2.1x+]}
|
|
Function ReadQueueServerStatus(QobjId :Longint;
|
|
QserverObjId :Longint;
|
|
QserverConnNbr:Byte;
|
|
Var Qstatus:TQueueServerStatus):Boolean;
|
|
Type Treq=record
|
|
len :Word;
|
|
subFunc :Byte;
|
|
_QobjId :Longint; {hi-lo}
|
|
_QSobjId :Longint; {hi-lo}
|
|
_QSconnNbr:Byte;
|
|
end;
|
|
Trep=record
|
|
_Qstatus:TqueueServerStatus;
|
|
end;
|
|
TPreq=^Treq;
|
|
TPrep=^Trep;
|
|
Begin
|
|
WITH TPreq(GlobalReqBuf)^
|
|
do begin
|
|
subFunc:=$76;
|
|
_QobjId:=Lswap(QobjId);
|
|
_QSobjId:=Lswap(QserverObjId);
|
|
_QSconnNbr:=QserverConnNbr;
|
|
len:=SizeOf(Treq)-2;
|
|
end;
|
|
F2SystemCall($17,SizeOf(Treq),SizeOf(Trep),result);
|
|
With TPrep(GlobalReplyBuf)^
|
|
do begin
|
|
Move(_Qstatus,Qstatus,SizeOf(TQueueServerStatus));
|
|
end;
|
|
ReadQueueServerStatus:=(result=0)
|
|
{ Valid completion codes:
|
|
$00 Success
|
|
$96 Server Out Of Memory;
|
|
$9C Invalid Path;
|
|
$D1 No Queue;
|
|
$D2 No Queue Server;
|
|
$D3 No Queue Rights;
|
|
$F1 Invalid Bindery Security;
|
|
$FC No Such Object;
|
|
$FE Server Bindery Locked;
|
|
$FF Bindery Failure. }
|
|
end;
|
|
|
|
{F217/77 [2.1x+]}
|
|
Function SetQueueServerStatus(QobjId:Longint; Qstatus:TqueueServerStatus):Boolean;
|
|
Type Treq=record
|
|
len :Word;
|
|
subFunc :Byte;
|
|
_QobjId :Longint; {hi-lo}
|
|
_Qstatus:TQueueServerStatus;
|
|
end;
|
|
TPreq=^Treq;
|
|
Begin
|
|
WITH TPreq(GlobalReqBuf)^
|
|
do begin
|
|
subFunc:=$77;
|
|
_QobjId:=Lswap(QobjId);
|
|
Move(Qstatus,_Qstatus,Sizeof(TQueueServerStatus));
|
|
len:=SizeOf(Treq)-2;
|
|
end;
|
|
F2SystemCall($17,SizeOf(Treq),0,result);
|
|
SetQueueServerStatus:=(result=0)
|
|
{ Valid completion codes:
|
|
$00 Success
|
|
$96 Server Out Of Memory;
|
|
$9C Invalid Path;
|
|
$D0 Queue Error;
|
|
$D1 No Queue;
|
|
$FE Server Bindery Locked;
|
|
$FF Bindery Failure. }
|
|
end;
|
|
|
|
{F217/78 [2.1x+]}
|
|
Function GetQueueJobsFileSize(QobjId:Longint; JobNbr:Word;
|
|
Var JobSize:Longint ):Boolean;
|
|
Type Treq=record
|
|
len :Word;
|
|
subFunc:Byte;
|
|
_QobjId:Longint; {hi-lo}
|
|
_JobNbr:Word; {hi-lo}
|
|
end;
|
|
Trep=record
|
|
_QobjId :Longint; {hi-lo}
|
|
_JobNbr :Word; {hi-lo}
|
|
_JobSize:Longint; {hi-lo}
|
|
end;
|
|
TPreq=^Treq;
|
|
TPrep=^Trep;
|
|
Begin
|
|
WITH TPreq(GlobalReqBuf)^
|
|
do begin
|
|
subFunc:=$78;
|
|
_QobjId:=Lswap(QobjId);
|
|
_JobNbr:=swap(JobNbr);
|
|
len:=SizeOf(Treq)-2;
|
|
end;
|
|
F2SystemCall($17,SizeOf(Treq),SizeOf(Trep),result);
|
|
With TPrep(GlobalReplyBuf)^
|
|
do begin
|
|
JobSize:=Lswap(_JobSize);
|
|
end;
|
|
GetQueueJobsFileSize:=(result=0)
|
|
{ Valid completion codes:
|
|
$00 Success
|
|
$96 Server Out Of Memory;
|
|
$9C Invalid Path;
|
|
$FE Server Bindery Locked;
|
|
$FF Bindery Failure. }
|
|
end;
|
|
|
|
|
|
{F217/68 [2.1x+]}
|
|
Function CreateQueueJob(QobjId:Longint;
|
|
{i/o} Var Qjob:TqueueJobEntry):Boolean;
|
|
Type Treq=record
|
|
len :Word;
|
|
subFunc:Byte;
|
|
_QobjId:Longint; {hi-lo}
|
|
_Qjob :TintJobStruct;
|
|
end;
|
|
Trep=record
|
|
_QjobR:TintJobStruct; { Except the last two fields ! }
|
|
end;
|
|
TPreq=^Treq;
|
|
TPrep=^Trep;
|
|
Begin
|
|
WITH TPreq(GlobalReqBuf)^
|
|
do begin
|
|
subFunc:=$68;
|
|
_QobjId:=Lswap(QobjId);
|
|
ConvertQJE2Int(Qjob,_Qjob);
|
|
len:=SizeOf(Treq)-2;
|
|
end;
|
|
F2SystemCall($17,SizeOf(Treq),SizeOf(Trep)-152-50,result);
|
|
With TPrep(GlobalReplyBuf)^
|
|
do begin
|
|
ConvertQJE2Ext(_QjobR,Qjob,False);
|
|
{ False => Last 2 fields remain unchanged }
|
|
end;
|
|
CreateQueueJob:=(result=0)
|
|
{ Valid completion codes:
|
|
$00 Success
|
|
$96 Server Out Of Memory;
|
|
$99 Directory Full;
|
|
$9C Invalid Path;
|
|
$D0 Queue Error;
|
|
$D1 No Queue;
|
|
$D2 No Queue Server;
|
|
$D3 No Queue Rights;
|
|
$D4 Queue Full;
|
|
$DA Queue Halted;
|
|
$ED Property Already Exists;
|
|
$EF Invalid Name;
|
|
$F0 Wildcard Not Allowed;
|
|
$F1 Invalid Bindery Security;
|
|
$F7 No Property Create Privilege;
|
|
$FC No Such Object;
|
|
$FE Server Bindery Locked;
|
|
$FF Bindery Failure. }
|
|
end;
|
|
|
|
{F217/6D [2.1x+]}
|
|
Function ChangeQueueJobEntry(QobjId:Longint;Qjob:TQueueJobEntry):Boolean;
|
|
Type Treq=record
|
|
len :Word;
|
|
subFunc:Byte;
|
|
_QobjId:Longint; {hi-lo}
|
|
_Qjob :TintJobStruct;
|
|
end;
|
|
TPreq=^Treq;
|
|
Begin
|
|
WITH TPreq(GlobalReqBuf)^
|
|
do begin
|
|
subFunc:=$6D;
|
|
_QobjId:=Lswap(QobjId);
|
|
ConvertQJE2Int(Qjob,_Qjob);
|
|
len:=SizeOf(Treq)-2;
|
|
end;
|
|
F2SystemCall($17,SizeOf(Treq),0,result);
|
|
ChangeQueueJobEntry:=(result=0)
|
|
{ Valid completion codes:
|
|
$00 Success
|
|
$96 Server Out Of Memory;
|
|
$D0 Queue Error;
|
|
$D1 No Queue;
|
|
$D5 No Queue Job;
|
|
$D7 Queue Servicing;
|
|
$FE Server Bindery Locked;
|
|
$FF Bindery Failure. }
|
|
end;
|
|
|
|
|
|
{$IFDEF Template} {--------------- Q unit function template ---------------}
|
|
|
|
{F217/ [2.1x+]}
|
|
Function ( ):Boolean;
|
|
Type Treq=record
|
|
len:Word;
|
|
subFunc:Byte;
|
|
|
|
end;
|
|
Trep=record
|
|
|
|
end;
|
|
TPreq=^Treq;
|
|
TPrep=^Trep;
|
|
Begin
|
|
WITH TPreq(GlobalReqBuf)^
|
|
do begin
|
|
subFunc:=$
|
|
|
|
len:=SizeOf(Treq)-2;
|
|
end;
|
|
F2SystemCall($17,SizeOf(Treq),SizeOf(Trep),result);
|
|
With TPrep(GlobalReplyBuf)^
|
|
do begin
|
|
|
|
end;
|
|
:=(result=0)
|
|
{ Valid completion codes:
|
|
$00 Success
|
|
$96 Server Out Of Memory;
|
|
$99 Drectory Full;
|
|
$9B Bad Directory Handle;
|
|
$9C Invalid Path;
|
|
$D0 Queue Error;
|
|
$D1 No Queue;
|
|
$D2 No Queue Server;
|
|
$D3 No Queue Rights;
|
|
$D4 Queue Full;
|
|
$D5 No Queue Job;
|
|
$D6 No Job Rights;
|
|
$D7 Queue Servicing;
|
|
$D9 Connection not Queue Server;
|
|
$DA Queue Halted;
|
|
$DB Max Queue Servers;
|
|
$ED Property Already Exists;
|
|
$EE Object Already Exists;
|
|
$EF Invalid Name;
|
|
$F0 Wildcard Not Allowed;
|
|
$F1 Invalid Bindery Security;
|
|
$F5 No Object Create Privilege;
|
|
$F7 No Property Create Privilege;
|
|
$FC No Such Object;
|
|
$FE Server Bindery Locked;
|
|
$FF Bindery Failure.
|
|
}
|
|
end;
|
|
|
|
{$ENDIF}
|
|
|
|
end.
|