⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtcdatacli.pas

📁 Delphi快速开发Web Server
💻 PAS
📖 第 1 页 / 共 5 页
字号:
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 + -