📄 rtcdatacli.pas
字号:
RemoveRequest;
// We will skip all remaining requests
CancelRequests;
end;
// This will remove all skipped requests
PrepareNextRequest;
end
else
inherited;
end;
{ Called from TRtcDataRequest to add a new request,
without interfering with other connection component operations. }
procedure TRtcDataClient.AddRequest(Req: TRtcClientRequestInfo);
begin
FCS.Enter;
try
FRequestList.Add(Req);
FIdle:=False;
finally
FCS.Leave;
end;
end;
{ Called from TRtcDataRequest to add a new request,
without interfering with other connection component operations. }
procedure TRtcDataClient.InsertRequest(Req: TRtcClientRequestInfo);
begin
FCS.Enter;
try
if not FMayInsertRequest then
raise Exception.Create('You are not allowed to insert requests.')
else if FRequestSkipped>0 then
raise Exception.Create('Operation Interrupted by a "RequestSkipped" call.');
FRequestInserted:=True;
if assigned(FActiveRequest) then
FRequestList.Insert(0,FActiveRequest);
FActiveRequest:=Req;
Req.WasInjected:=True;
Request:=FActiveRequest.Get_Request;
finally
FCS.Leave;
end;
end;
procedure TRtcDataClient.PrepareNextRequest;
var
endloop:boolean;
begin
if not assigned(FActiveRequest) then
begin
FCS.Enter;
try
repeat
endloop:=True;
if FRequestList.Count>0 then
begin
FActiveRequest:= TRtcClientRequestInfo(FRequestList.Items[0]);
Request:=FActiveRequest.Get_Request;
FRequestList.Delete(0);
end;
if FRequestSkipped>0 then
begin
FCS.Leave;
try
EnterEvent;
try
if assigned(FActiveRequest) then
FActiveRequest.Call_ResponseAbort(self)
else
CallResponseAbort;
finally
LeaveEvent;
end;
finally
FCS.Enter;
end;
RemoveRequest;
endloop:=False;
end;
until endloop;
finally
FCS.Leave;
end;
end;
end;
{ Start Request if no request active }
procedure TRtcDataClient.StartRequest;
var
endmainloop:boolean;
begin
if not isConnected then
begin
if AutoConnect then
Connect;
Exit;
end;
// if assigned(FActiveRequest) then Exit;
repeat
endmainloop:=True;
PrepareNextRequest;
EnterEvent;
try
if isConnected and assigned(FActiveRequest) and not Request.Active then
begin
if (Session.ID<>'') and
(Session.PeerAddr<>PeerAddr) then
begin
Session.Init;
end;
CheckRequestSkipped;
if not Request.Skipped then
begin
FMayInsertRequest:=True;
try
// use a loop to simplify repeating the BeginRequest calls if a new request has been inserted
repeat
FRequestInserted:=False;
if assigned(Request.OnBegin) then
Request.OnBegin(self);
if RequestInserted then
Continue;
FActiveRequest.Call_BeginRequest(self);
until not RequestInserted;
finally
FMayInsertRequest:=False;
end;
Flush;
end;
if not isConnected then
Exit
else if not Request.Active then
begin
if Response.Rejected then
begin
EnterEvent;
try
if assigned(FActiveRequest) then
FActiveRequest.Call_ResponseReject(self);
if assigned(Request.OnReject) then
Request.OnReject(self);
finally
LeaveEvent;
end;
end;
RemoveRequest;
endmainloop:=False;
end
else if not Response.Done then
begin
{ Request has started sending something out }
CheckRequestSkipped;
if Request.Skipped then
begin
RemoveRequest;
// Need to Reset the connection
if isConnected then
begin
Disconnect;
Reconnect;
end;
end
else if Response.Rejected then
begin
EnterEvent;
try
if assigned(FActiveRequest) then
FActiveRequest.Call_ResponseReject(self);
if assigned(Request.OnReject) then
Request.OnReject(self);
finally
LeaveEvent;
end;
RemoveRequest;
// Need to Reset the connection
if isConnected then
begin
Disconnect;
Reconnect;
end;
end
else if Request.Reposting then
begin
Request.Reposting:=False;
Response.Clear;
// Reset connection
if isConnected then
begin
Disconnect;
Reconnect;
end;
end;
end
else
begin
if Request.Skipped then
RemoveRequest
else if Response.Rejected then
begin
FActiveRequest.Call_ResponseReject(self);
if assigned(Request.OnReject) then
Request.OnReject(self);
RemoveRequest;
end
else if Request.Reposting then
begin
Request.Reposting:=False;
Response.Clear;
end
else
endmainloop:=False;
end;
end;
finally
LeaveEvent;
end;
until endmainloop;
end;
{ Remove all requests from Memory }
procedure TRtcDataClient.RemoveAllRequests;
var
_MyRequest:TRtcClientRequestInfo;
begin
FCS.Enter;
try
FRequestSkipped:=0;
while FRequestList.Count>0 do
begin
_MyRequest := TRtcClientRequestInfo(FRequestList.Items[0]);
_MyRequest.Free;
FRequestList.Delete(0);
end;
if assigned(FActiveRequest) then
FRequestSkipped:=1
else
FIdle:=True;
finally
FCS.Leave;
end;
end;
{ Remove the active Request from Memory }
procedure TRtcDataClient.RemoveRequest;
var
Remove_Next:boolean;
begin
if assigned(FActiveRequest) then
begin
FCS.Enter;
try
if FRequestSkipped>0 then
Dec(FRequestSkipped);
Remove_Next:=FActiveRequest.WasInjected and FActiveRequest.WasAborted;
FActiveRequest.Free;
FActiveRequest:=nil;
if FRequestList.Count=0 then
FIdle:=True;
finally
FCS.Leave;
end;
Request:=nil;
Request.Clear;
Response.Clear;
if Remove_Next then
begin
PrepareNextRequest;
if assigned(FActiveRequest) then
begin
FActiveRequest.Call_ResponseAbort(self);
RemoveRequest;
end;
end;
end;
end;
{ Check the Request after any standard working event. }
function TRtcDataClient.CheckRequestWork:boolean;
begin
CheckRequestSkipped;
if Request.Skipped or Response.Rejected then
begin
Result:=True;
if Response.Rejected then
begin
EnterEvent;
try
if assigned(FActiveRequest) then
FActiveRequest.Call_ResponseReject(self);
if assigned(Request.OnReject) then
Request.OnReject(self);
finally
LeaveEvent;
end;
end;
if Request.Active then
begin
{ Request has started sending something out }
RemoveRequest;
// Need to Reconnect, to reset the connection
if isConnected then
begin
Disconnect;
Reconnect;
end;
end
else
begin
RemoveRequest;
// Check if there are more requests waiting
if MultiThreaded then
PostStartRequest
else
StartRequest;
end;
end
else if Request.Reposting then
begin
Request.Reposting:=False;
Result:=True;
if not Response.Done then
begin
Response.Clear;
if isConnected then
begin
Disconnect;
Reconnect;
end;
end
else
begin
Response.Clear;
if MultiThreaded then
PostStartRequest
else
StartRequest;
end;
end
else
Result:=False;
end;
// Skip all requests (do not fire more RequestAborted events)
procedure TRtcDataClient.SkipRequests;
begin
RemoveAllRequests;
end;
// Cancel all requests (fire all RequestAborted events)
procedure TRtcDataClient.CancelRequests;
begin
FCS.Enter;
try
FRequestSkipped:=FRequestList.Count;
if assigned(FActiveRequest) then
Inc(FRequestSkipped)
else
FIdle:=True;
finally
FCS.Leave;
end;
end;
// Post a StartRequest job
procedure TRtcDataClient.PostStartRequest;
var
ReqJob:TRtcStartRequestJob;
begin
ReqJob:=TRtcStartRequestJob.Create;
ReqJob.Client:=self;
if not PostJob(ReqJob) then
begin
if AutoConnect then
Connect;
if not PostJob(ReqJob) then
begin
ReqJob.Client:=nil;
ReqJob.Free;
end;
end;
end;
// Post a new request
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -