www.pudn.com > indyprelim.zip > IdIPMCastBase.pas


{ 
  $Project$ 
  $Workfile$ 
  $Revision$ 
  $DateUTC$ 
  $Id$ 
 
  This file is part of the Indy (Internet Direct) project, and is offered 
  under the dual-licensing agreement described on the Indy website. 
  (http://www.indyproject.org/) 
 
  Copyright: 
   (c) 1993-2005, Chad Z. Hower and the Indy Pit Crew. All rights reserved. 
} 
{ 
  $Log$ 
} 
{ 
  Rev 1.4    2004.02.03 5:43:52 PM  czhower 
  Name changes 
 
  Rev 1.3    1/21/2004 3:11:06 PM  JPMugaas 
  InitComponent 
 
  Rev 1.2    10/26/2003 09:11:50 AM  JPMugaas 
  Should now work in NET. 
 
  Rev 1.1    2003.10.12 4:03:56 PM  czhower 
  compile todos 
 
  Rev 1.0    11/13/2002 07:55:16 AM  JPMugaas 
} 
 
unit IdIPMCastBase; 
 
interface 
{$I IdCompilerDefines.inc} 
//here to flip FPC into Delphi mode 
uses 
  IdComponent, IdException, IdGlobal, IdSocketHandle, 
  IdStack, IdSys; 
 
const 
  IPMCastLo = 224; 
  IPMCastHi = 239; 
 
type 
  TIdIPMCastBase = class(TIdComponent) 
  protected 
    FDsgnActive: Boolean; 
    FMulticastGroup: String; 
    FPort: Integer; 
    // 
    procedure CloseBinding; virtual; abstract; 
    function GetActive: Boolean; virtual; 
    function GetBinding: TIdSocketHandle; virtual; abstract; 
    procedure Loaded; override; 
    procedure SetActive(const Value: Boolean); virtual; 
    procedure SetMulticastGroup(const Value: string); virtual; 
    procedure SetPort(const Value: integer); virtual; 
    // 
    property Active: Boolean read GetActive write SetActive Default False; 
    property MulticastGroup: string read FMulticastGroup write SetMulticastGroup; 
    property Port: Integer read FPort write SetPort; 
    procedure InitComponent; override; 
  public 
    function IsValidMulticastGroup(Value: string): Boolean; 
  published 
  end; 
 
  EIdMCastException = Class(EIdException); 
  EIdMCastNoBindings = class(EIdMCastException); 
  EIdMCastNotValidAddress = class(EIdMCastException); 
  EIdMCastReceiveErrorZeroBytes = class(EIdMCastException); 
 
implementation 
 
uses 
  IdAssignedNumbers, 
  IdResourceStringsCore, IdStackConsts; 
 
{ TIdIPMCastBase } 
 
procedure TIdIPMCastBase.InitComponent; 
begin 
  inherited InitComponent; 
  FMultiCastGroup := Id_IPMC_All_Systems; 
end; 
 
function TIdIPMCastBase.GetActive: Boolean; 
begin 
  Result := FDsgnActive; 
end; 
 
function TIdIPMCastBase.IsValidMulticastGroup(Value: string): Boolean; 
var 
  ThisIP: string; 
  s1: string; 
  ip1: integer; 
begin 
  Result := false; 
 
  if not GStack.IsIP(Value) then 
  begin 
    Exit; 
  end; 
  ThisIP := Value; 
  s1 := Fetch(ThisIP, '.');    {Do not Localize} 
  ip1 := Sys.StrToInt(s1); 
 
  if ((ip1 < IPMCastLo) or (ip1 > IPMCastHi)) then 
  begin 
    Exit; 
  end; 
  Result := true; 
end; 
 
procedure TIdIPMCastBase.Loaded; 
var 
  b: Boolean; 
begin 
  inherited Loaded; 
  b := FDsgnActive; 
  FDsgnActive := False; 
  Active := b; 
end; 
 
procedure TIdIPMCastBase.SetActive(const Value: Boolean); 
begin 
  if Active <> Value then begin 
    if not (IsDesignTime or IsLoading) then begin 
      if Value then begin 
        GetBinding; 
      end 
      else begin 
        CloseBinding; 
      end; 
    end 
    else begin  // don't activate at designtime (or during loading of properties)    {Do not Localize} 
      FDsgnActive := Value; 
    end; 
  end; 
end; 
 
procedure TIdIPMCastBase.SetMulticastGroup(const Value: string); 
begin 
  if (FMulticastGroup <> Value) then begin 
    if IsValidMulticastGroup(Value) then 
    begin 
      Active := False; 
      FMulticastGroup := Value; 
    end 
    else 
    begin 
      Raise EIdMCastNotValidAddress.Create(RSIPMCastInvalidMulticastAddress); 
    end; 
  end; 
end; 
 
procedure TIdIPMCastBase.SetPort(const Value: integer); 
begin 
  if FPort <> Value then begin 
    Active := False; 
    FPort := Value; 
  end; 
end; 
 
end.