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

📄 rtcdatacli.pas

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