📄 rtcdatacli.pas
字号:
procedure TRtcDataClient.PostRequest(Req: TRtcClientRequestInfo;FromInsideEvent:boolean=False);
begin
AddRequest(Req);
if not FromInsideEvent then
PostStartRequest;
end;
function TRtcDataClient.RequestCount: integer;
begin
FCS.Enter;
try
if assigned(FRequestList) then
Result:=FRequestList.Count
else
Result:=0;
if assigned(FActiveRequest) then
Result:=Result+1;
finally
FCS.Leave;
end;
end;
procedure TRtcDataClient.CallBeginRequest;
begin
if assigned(FOnBeginRequest) then
FOnBeginRequest(self);
end;
procedure TRtcDataClient.CallResponseDone;
begin
if assigned(FOnResponseDone) then
FOnResponseDone(self);
end;
procedure TRtcDataClient.CallRepostCheck;
begin
if assigned(FOnRepostCheck) then
FOnRepostCheck(self);
end;
procedure TRtcDataClient.CallResponseData;
begin
if assigned(FOnResponseData) then
FOnResponseData(self);
end;
procedure TRtcDataClient.CallResponseAbort;
begin
FActiveRequest.WasAborted:=True;
if assigned(FOnResponseAbort) then
FOnResponseAbort(self);
end;
procedure TRtcDataClient.CallResponseReject;
begin
if assigned(FOnResponseReject) then
FOnResponseReject(self);
end;
procedure TRtcDataClient.CallSessionClose;
begin
if assigned(FOnSessionClose) then
FOnSessionClose(self);
end;
procedure TRtcDataClient.CallSessionOpen;
begin
if assigned(FOnSessionOpen) then
FOnSessionOpen(self);
end;
procedure TRtcDataClient.AddDataClientLink(Value: TRtcAbsDataClientLink);
begin
FDataClientLinks.Add(Value);
end;
procedure TRtcDataClient.RemoveAllDataClientLinks;
var
Link:TRtcAbsDataClientLink;
begin
while FDataClientLinks.Count>0 do
begin
Link:=TRtcAbsDataClientLink(FDataClientLinks.Get(0));
Link.Client:=nil;
end;
end;
procedure TRtcDataClient.RemoveDataClientLink(Value: TRtcAbsDataClientLink);
begin
FDataClientLinks.Remove(Value);
end;
procedure TRtcDataClient.CheckRequestSkipped;
begin
FCS.Enter;
try
if FRequestSkipped>0 then
if assigned(FActiveRequest) then
Request.Skip;
finally
FCS.Leave;
end;
end;
procedure TRtcDataClient.SetRequest(const Value: TRtcClientRequest);
begin
FRequest := Value;
if FRequest=nil then
FRequest:=FMyRequest;
end;
procedure TRtcDataClient.SetResponse(const Value: TRtcClientResponse);
begin
FResponse := Value;
if FResponse=nil then
FResponse:=FMyResponse;
end;
function TRtcDataClient.isIdle: boolean;
begin
FCS.Enter;
try
Result:=FIdle;
finally
FCS.Leave;
end;
end;
function TRtcDataClient.WaitForCompletion(UserInteractionAllowed: boolean; _Timeout: cardinal): boolean;
var
Msg:TMsg;
MyTime:cardinal;
function PeekMsg:boolean;
begin
Result:=PeekMessage(Msg,0,WM_USER,$FFFF,PM_REMOVE) or
PeekMessage(Msg,0,0,WM_KEYFIRST-1,PM_REMOVE);
end;
begin
Result := isIdle;
if Result then
begin
Result:=RequestCount=0;
Exit;
end;
if _Timeout>0 then
MyTime:=GetTickCount+_Timeout*1000
else
MyTime:=0;
if not inMainThread then // When used from a Service
begin
{$IFDEF FPC}
while not Result do
{$ELSE}
while not (Result or Application.Terminated) do
{$ENDIF}
begin
while PeekMessage(Msg,0,0,WM_USER-1,PM_REMOVE) or
PeekMessage(Msg,0,WM_USER,$FFFF,PM_NOREMOVE) do
begin
if Msg.message>=WM_USER then
Exit
else if (Msg.message=WM_QUIT) then
begin
{$IFDEF FPC}
{$ELSE}
Application.Terminate;
{$ENDIF}
Exit;
end
else
begin
TranslateMessage( Msg );
DispatchMessage( Msg );
end;
end;
Result:=isIdle;
if not Result then
if (MyTime>0) and (GetTickCount>=MyTime) then
Exit
else
Sleep(10);
end;
if Result then
Result:=RequestCount=0;
end
else if UserInteractionAllowed then
begin
{$IFDEF FPC}
while not Result do
{$ELSE}
while not (Result or Application.Terminated) do
{$ENDIF}
begin
while PeekMessage(Msg,0,0,0,PM_REMOVE) do
begin
if (Msg.message=WM_QUIT) then
begin
{$IFDEF FPC}
{$ELSE}
Application.Terminate;
{$ENDIF}
Exit;
end
else
begin
TranslateMessage( Msg );
DispatchMessage( Msg );
end;
end;
Result:=isIdle;
if not Result then
if (MyTime>0) and (GetTickCount>=MyTime) then
Exit
else
Sleep(10);
end;
if Result then
Result:=RequestCount=0;
end
else
begin
{$IFDEF FPC}
while not Result do
{$ELSE}
while not (Result or Application.Terminated) do
{$ENDIF}
begin
while PeekMsg do
begin
if (Msg.message=WM_QUIT) then
begin
{$IFDEF FPC}
{$ELSE}
Application.Terminate;
{$ENDIF}
Exit;
end
else
begin
TranslateMessage( Msg );
DispatchMessage( Msg );
end;
end;
Result:=isIdle;
if not Result then
if (MyTime>0) and (GetTickCount>=MyTime) then
Exit
else
Sleep(10);
end;
if Result then
Result:=RequestCount=0;
end;
end;
function TRtcDataClient.isConnectionRequired: boolean;
begin
if not FAutoConnect then
Result:=True
else
Result:=RequestCount>0;
end;
function TRtcDataClient.GetAutoConnect: boolean;
begin
Result:=FAutoConnect;
end;
procedure TRtcDataClient.SetAutoConnect(const Value: boolean);
begin
if Value<>FAutoConnect then
begin
FAutoConnect:=Value;
if FAutoConnect and isConnectionRequired then
Connect;
end;
end;
{ TRtcAbsDataClientLink }
constructor TRtcAbsDataClientLink.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FClient:=nil;
FLink:=nil;
end;
destructor TRtcAbsDataClientLink.Destroy;
begin
Client:=nil; // remove from DataClient
Link:=nil; // remove from parent DataClientLink
inherited;
end;
procedure TRtcAbsDataClientLink.SetLink(const Value: TRtcDataClientLink);
var
MyLink:TRtcDataClientLink;
begin
if Value<>FLink then
begin
if assigned(FLink) then
begin
FLink.RemoveChildLink(self);
FLink:=nil;
end;
if assigned(Value) then
begin
Client:=nil; // can not be maped to DataClient and to DataClientLink at the same time.
// Check for circular reference before assigning!
MyLink:=Value;
while (MyLink<>nil) and (MyLink<>self) do
MyLink:=MyLink.Link;
if MyLink=self then
raise Exception.Create('Circular DataClientLink reference!');
FLink:=Value;
FLink.AddChildLink(self);
end;
end;
end;
function TRtcAbsDataClientLink.GetLink: TRtcDataClientLink;
begin
Result:=FLink;
end;
procedure TRtcAbsDataClientLink.SetClient(const Value: TRtcDataClient);
begin
if Value<>FClient then
begin
if assigned(FClient) then
begin
FClient.RemoveDataClientLink(self);
FClient:=nil;
end;
if assigned(Value) then
begin
Link:=nil; // can not be linked to DataClientLink and DataClient at the same time.
FClient:=Value;
FClient.AddDataClientLink(self);
end;
end;
end;
function TRtcAbsDataClientLink.GetClient: TRtcDataClient;
begin
Result:=FClient;
end;
procedure TRtcAbsDataClientLink.PostRequest(Req: TRtcClientRequestInfo; FromInsideEvent:boolean=False);
begin
if assigned(FLink) then
FLink.PostRequest(Req,FromInsideEvent)
else if assigned(FClient) then
FClient.PostRequest(Req,FromInsideEvent)
else
raise Exception.Create('PostRequest: Client connection undefined.');
end;
procedure TRtcAbsDataClientLink.InsertRequest(Req: TRtcClientRequestInfo);
begin
if assigned(FLink) then
FLink.InsertRequest(Req)
else if assigned(FClient) then
FClient.InsertRequest(Req)
else
raise Exception.Create('InsertRequest: Client connection undefined.');
end;
function TRtcAbsDataClientLink.RequestCount: integer;
begin
if assigned(FLink) then
Result:=FLink.RequestCount
else if assigned(FClient) then
Result:=FClient.RequestCount
else
raise Exception.Create('RequestCount: Client connection undefined.');
end;
procedure TRtcAbsDataClientLink.SkipRequests;
begin
if assigned(FLink) then
FLink.SkipRequests
else if assigned(FClient) then
FClient.SkipRequests
else
raise Exception.Create('SkipRequests: Client connection undefined.');
end;
procedure TRtcAbsDataClientLink.CancelRequests;
begin
if assigned(FLink) then
FLink.CancelRequests
else if assigned(FClient) then
FClient.CancelRequests
else
raise Exception.Create('CancelRequests: Client connection undefined.');
end;
function TRtcAbsDataClientLink.WaitForCompletion(UserInteractionAllowed: boolean; Timeout: cardinal): boolean;
begin
if assigned(FLink) then
Result:=FLink.WaitForCompletion(UserInteractionAllowed, Timeout)
else if assigned(FClient) then
Result:=FClient.WaitForCompletion(UserInteractionAllowed, Timeout)
else
raise Exception.Create('WaitForCompletion: Client connection undefined
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -