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

📄 idserveriohandlerchain.pas

📁 photo.163.com 相册下载器 多线程下载
💻 PAS
字号:
{ $HDR$}
{**********************************************************************}
{ Unit archived using Team Coherence                                   }
{ Team Coherence is Copyright 2002 by Quality Software Components      }
{                                                                      }
{ For further information / comments, visit our WEB site at            }
{ http://www.TeamCoherence.com                                         }
{**********************************************************************}
{}
{ $Log:  56078: IdServerIOHandlerChain.pas
{
    Rev 1.2    6/11/2004 8:40:06 AM  DSiders
  Added "Do not Localize" comments.
}
{
{   Rev 1.1    2004.02.09 9:16:50 PM  czhower
{ Updated to compile and match lib changes.
}
{
{   Rev 1.0    2004.02.03 12:39:00 AM  czhower
{ Move
}
{
{   Rev 1.6    2003.10.19 4:38:34 PM  czhower
{ Updates
}
{
{   Rev 1.5    2003.10.19 2:51:10 PM  czhower
{ Fiber cleanup
}
{
{   Rev 1.4    2003.10.14 11:17:10 PM  czhower
{ Updates to match core changes.
}
{
{   Rev 1.3    2003.10.11 5:43:56 PM  czhower
{ Chained servers now functional.
}
{
{   Rev 1.2    2003.09.19 10:09:42 PM  czhower
{ Next stage of fiber support in servers.
}
{
{   Rev 1.1    2003.09.18 5:54:32 PM  czhower
{ TIdYarnFix
}
{
{   Rev 1.0    8/16/2003 11:09:02 AM  JPMugaas
{ Moved from Indy Core dir as part of package reorg
}
{
    Rev 1.6    7/6/2003 8:04:08 PM  BGooijen
  Renamed IdScheduler* to IdSchedulerOf*
}
{
{   Rev 1.5    4/11/2003 01:09:54 PM  JPMugaas
}
{
    Rev 1.4    3/29/2003 5:55:02 PM  BGooijen
  now calls AfterAccept
}
{
    Rev 1.3    3/27/2003 12:51:30 PM  BGooijen
  changed for IdSchedulerFiberBase
}
{
    Rev 1.2    3/25/2003 11:05:30 PM  BGooijen
  The ChainEngine is now a property
}
{
    Rev 1.1    3/23/2003 11:30:26 PM  BGooijen
  Moved a lot of code to IdSchedulerFiber, added MakeClientIOHandler
}
{
    Rev 1.0    3/13/2003 11:51:14 AM  BGooijen
  Initial check in
}
unit IdServerIOHandlerChain;

interface

uses
  IdServerIOHandler, IdIOHandlerChain, IdYarn,
  IdSocketHandle, IdThread, IdIOHandler, IdScheduler, IdFiber,
  Classes;

type
  TIdServerIOHandlerChain = class(TIdServerIOHandler)
  protected
    FChainEngine: TIdChainEngine;
  public
    function Accept(
      ASocket: TIdSocketHandle;
      AListenerThread: TIdThread;
      AYarn: TIdYarn
      ): TIdIOHandler;
      override;
    function MakeClientIOHandler(
      AYarn: TIdYarn
      ): TIdIOHandler;
      override;
    procedure SetScheduler(
      AScheduler: TIdScheduler
      ); override;
  published
    //TODO: Need to add notification for this prop
    property ChainEngine: TIdChainEngine read FChainEngine write FChainEngine;
  end;

implementation

uses
  IdGlobal, IdSchedulerOfFiber, IdException, IdFiberWeaver,
  SysUtils;

procedure TIdServerIOHandlerChain.SetScheduler(
  AScheduler: TIdScheduler
  );
begin
  if AScheduler <> nil then begin
    EIdException.IfFalse(AScheduler is TIdSchedulerOfFiber
     , 'Scheduler not a fiber scheduler'); {do not localize}
  end;
  FScheduler := AScheduler;
end;

function TIdServerIOHandlerChain.Accept(
  ASocket: TIdSocketHandle;
  AListenerThread: TIdThread;
  AYarn: TIdYarn
  ): TIdIOHandler;
var
  LIOHandler: TIdIOHandlerChain;
begin
  EIdException.IfNotAssigned(FChainEngine, 'No ChainEngine defined.'); {do not localize}
  LIOHandler := TIdIOHandlerChain.Create(nil, FChainEngine
   //TODO: Can remove this cast later
   , TIdFiberWeaver(TIdSchedulerOfFiber(FScheduler).FiberWeaver)
   , TIdYarnOfFiber(AYarn).Fiber);
  LIOHandler.Open;
  Result := nil;
  if AListenerThread <> nil then begin
    while not AListenerThread.Stopped do try
      if ASocket.Select(100) then begin  // Wait for 100 ms
        if LIOHandler.Binding.Accept(ASocket.Handle) then begin
          LIOHandler.AfterAccept;
          Result := LIOHandler;
          Exit;
        end else begin
          FreeAndNil(LIOHandler);
          Exit;
        end;
      end;
    finally
      if AListenerThread.Stopped then begin
        FreeAndNil(LIOHandler);
      end;
    end;
  end else begin
    // Old way for compatibility
    if LIOHandler.Binding.Accept(ASocket.Handle) then begin
      Result := LIOHandler;
      Exit;
    end else begin
      FreeAndNil(LIOHandler);
    end;
  end;
end;

function TIdServerIOHandlerChain.MakeClientIOHandler(
  AYarn: TIdYarn
  ): TIdIOHandler;
begin
  Result := TIdIOHandlerChain.Create(nil, FChainEngine
   //TODO: CAn remove this cast later.
   , TIdFiberWeaver(TIdSchedulerOfFiber(FScheduler).FiberWeaver)
   , TIdYarnOfFiber(AYarn).Fiber);
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -