lazarus-ccr/wst/trunk/base_service_intf.pas
2025-02-13 10:30:43 +00:00

7365 lines
216 KiB
ObjectPascal

{
This file is part of the Web Service Toolkit
Copyright (c) 2006 by Inoussa OUEDRAOGO
This file is provide under modified LGPL licence
( the files COPYING.modifiedLGPL and COPYING.LGPL).
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
}
{$INCLUDE wst_global.inc}
{$RANGECHECKS OFF}
unit base_service_intf;
interface
uses
Classes, SysUtils, TypInfo, Contnrs, syncobjs, semaphore, wst_types
{$IFDEF WST_DELPHI}
,Windows
{$ENDIF}
, date_utils;
const
stBase = 0;
stObject = stBase + 1;
stArray = stBase + 2;
sARRAY_ITEM = 'item';
sARRAY_STYLE = 'style';
// array style string
sScoped = 'scoped';
sEmbedded = 'embedded';
type
{ standart data types defines }
anyURI = type string;
token = type string;
language = type string;
NCName = type string;
nonNegativeInteger = type LongWord;
positiveInteger = type nonNegativeInteger;
float = Single;
{$IFNDEF WST_HAS_TDURATIONREMOTABLE}
duration = type string;
{$ENDIF WST_HAS_TDURATIONREMOTABLE}
{$IFNDEF WST_HAS_TTIMEREMOTABLE}
time = type string;
{$ENDIF WST_HAS_TTIMEREMOTABLE}
TScopeType = Integer;
TArrayStyle = ( asScoped, asEmbeded, asNone );
TInstanceOption = ( ioAlwaysSerialize );
TInstanceOptions = set of TInstanceOption;
THeaderDirection = ( hdOut, hdIn );
THeaderDirections = set of THeaderDirection;
const
AllHeaderDirection = [Low(THeaderDirection)..High(THeaderDirection)];
type
EServiceException = class(Exception) end;
EServiceExtensionException = class(Exception) end;
ETransportExecption = class(EServiceException)
private
FExtendedErrorInfo : string;
public
property ExtendedErrorInfo : string
read FExtendedErrorInfo write FExtendedErrorInfo;
end;
EBaseRemoteException = class(EServiceException)
private
FFaultCode: string;
FFaultString: string;
Published
property FaultCode : string Read FFaultCode Write FFaultCode;
property FaultString : string Read FFaultString Write FFaultString;
End;
EServiceConfigException = class(EServiceException)
end;
ETypeRegistryException = class(EServiceConfigException)
end;
IItemFactory = Interface;
IFormatterBase = Interface;
IFormatterRegistry = Interface;
TBaseRemotable = class;
THeaderBlock = class;
TSimpleContentHeaderBlock = class;
//Utility interface used to configure its parent.
IPropertyManager = Interface
['{A3A6B8F4-E50D-4956-B416-C642C72E4672}']
procedure SetProperty(Const AName,AValue:string);
procedure SetProperties(Const APropsStr:string);
function GetProperty(Const AName:String):string;
function GetPropertyNames(ADest : TStrings):Integer;
procedure Clear();
procedure Copy(ASource:IPropertyManager; Const AClearBefore : Boolean);
End;
IItemFactory = interface
['{38258BC0-CBE6-437B-B104-9A62475E53AC}']
function CreateInstance():IInterface;
end;
IItemFactoryEx = interface(IItemFactory)
['{66B77926-7E45-4780-8FFB-FB78625EDC1D}']
procedure ReleaseInstance(const AInstance : IInterface);
procedure DiscardInstance(const AInstance : IInterface);
function GetPropertyManager(
const APropertyGroup : string;
const ACreateIfNotExists : Boolean
):IPropertyManager;
end;
IFormatterRegistry = Interface
['{E4D69D2A-F0A5-43E1-8C56-B47E7AB5D1AF}']
function Find(const AFormatterName : string):IFormatterBase;
procedure Register(
const AFormatterName,
AContentType : string;
AFactory : IItemFactory
);
End;
ICallContext = Interface
['{855EB8E2-0700-45B1-B852-2101023200E0}']
procedure AddObjectToFree(const AObject : TObject);
procedure Clear();
function AddHeader(
const AHeader : THeaderBlock;
const AKeepOwnership : Boolean
):Integer;overload;
function AddHeader(
const AHeader : TBaseRemotable;
const AKeepOwnership : Boolean;
const AName : string = ''
):Integer;overload;
function GetHeaderCount(const ADirections : THeaderDirections):Integer;
function GetHeader(const AIndex : Integer) : THeaderBlock;
procedure ClearHeaders(const ADirection : THeaderDirection);
function GetPropertyManager():IPropertyManager;
End;
TSerializationStyle = ( ssNodeSerialization, ssAttibuteSerialization );
IFormatterBase = Interface
['{2AB3BF54-B7D6-4C46-8245-133C8775E9C1}']
function GetPropertyManager():IPropertyManager;
function GetFormatName() : string;
procedure SetSerializationStyle(const ASerializationStyle : TSerializationStyle);
function GetSerializationStyle():TSerializationStyle;
function GetCurrentScope():string;
procedure Clear();
procedure BeginObject(
Const AName : string;
Const ATypeInfo : PTypeInfo
);
procedure BeginArray(
const AName : string;
const ATypeInfo : PTypeInfo;
const AItemTypeInfo : PTypeInfo;
const ABounds : Array Of Integer;
const AStyle : TArrayStyle
);
procedure NilCurrentScope();
function IsCurrentScopeNil():Boolean;
procedure EndScope();
procedure AddScopeAttribute(Const AName,AValue : string);
function BeginObjectRead(
var AScopeName : string;
const ATypeInfo : PTypeInfo
) : Integer;
function BeginArrayRead(
var AScopeName : string;
const ATypeInfo : PTypeInfo;
const AStyle : TArrayStyle;
const AItemName : string
):Integer;
function GetScopeItemNames(const AReturnList : TStrings) : Integer;
procedure EndScopeRead();
property CurrentScope : String Read GetCurrentScope;
procedure BeginHeader();
procedure EndHeader();
procedure Put(
Const AName : String;
Const ATypeInfo : PTypeInfo;
Const AData
);overload;
procedure Put(
const ANameSpace : string;
Const AName : String;
Const ATypeInfo : PTypeInfo;
Const AData
);overload;
procedure PutScopeInnerValue(
const ATypeInfo : PTypeInfo;
const AData
);
function Get(
const ATypeInfo : PTypeInfo;
var AName : string;
var AData
) : Boolean; overload;
function Get(
const ATypeInfo : PTypeInfo;
const ANameSpace : string;
var AName : string;
var AData
) : Boolean; overload;
procedure GetScopeInnerValue(
const ATypeInfo : PTypeInfo;
var AData
);
function ReadBuffer(const AName : string; out AResBuffer : string) : Boolean;
//Please use this method if and _only_ if you do not have another way achieve your aim!
procedure WriteBuffer(const AValue : string);
procedure SaveToStream(AStream : TStream);
procedure LoadFromStream(AStream : TStream);
// This procedures will raise exceptions!!!
procedure Error(Const AMsg:string);overload;
procedure Error(Const AMsg:string; Const AArgs : array of const);overload;
End;
{ TSimpleCallContext }
TSimpleCallContext = class(TInterfacedObject,ICallContext)
private
FHeaderList : TObjectList;
FFreeObjectList : TObjectList;
FPropertyManager : IPropertyManager;
protected
procedure AddObjectToFree(const AObject : TObject);
procedure Clear();
function AddHeader(
const AHeader : THeaderBlock;
const AKeepOwnership : Boolean
):Integer;overload;
function AddHeader(
const AHeader : TBaseRemotable;
const AKeepOwnership : Boolean;
const AName : string = ''
):Integer;overload;
function GetHeaderCount(const ADirections : THeaderDirections):Integer;
function GetHeader(const AIndex : Integer) : THeaderBlock;
procedure ClearHeaders(const ADirection : THeaderDirection);
procedure FreeHeader(AHeader : THeaderBlock);
function GetPropertyManager():IPropertyManager;
public
constructor Create();
destructor Destroy();override;
end;
{ TBaseRemotable }
TBaseRemotableClass = class of TBaseRemotable;
TBaseRemotable = class(TPersistent)
Public
constructor Create();virtual;
destructor Destroy();override;
// This will free objects and arrays properties and set them to nil.
procedure FreeObjectProperties();virtual;
class procedure Save(
AObject : TBaseRemotable;
AStore : IFormatterBase;
Const AName : String;
Const ATypeInfo : PTypeInfo
);virtual;abstract;
class procedure Load(
Var AObject : TObject;
AStore : IFormatterBase;
var AName : String;
const ATypeInfo : PTypeInfo
);virtual;abstract;
function Equal(const ACompareTo : TBaseRemotable) : Boolean;virtual;
function wstHasValue() : Boolean;virtual;
End;
TAbstractSimpleRemotableClass = class of TAbstractSimpleRemotable;
{ TAbstractSimpleRemotable }
TAbstractSimpleRemotable = class(TBaseRemotable) end;
{ TStringBufferRemotable }
TStringBufferRemotable = class(TAbstractSimpleRemotable)
private
FData : string;
public
class procedure Save(
AObject : TBaseRemotable;
AStore : IFormatterBase;
const AName : string;
const ATypeInfo : PTypeInfo
);override;
class procedure Load(
var AObject : TObject;
AStore : IFormatterBase;
var AName : string;
const ATypeInfo : PTypeInfo
);override;
procedure Assign(Source: TPersistent); override;
function Equal(const ACompareTo : TBaseRemotable) : Boolean;override;
function wstHasValue() : Boolean;override;
property Data : string read FData write FData;
end;
schema_Type = class(TStringBufferRemotable) end;
anyType_Type = class(TStringBufferRemotable) end;
{ TAbstractEncodedStringRemotable }
TAbstractEncodedStringRemotable = class(TAbstractSimpleRemotable)
private
FBinaryData : TByteDynArray;
private
function GetEncodedString : string; virtual; abstract;
procedure SetEncodedString(const AValue : string); virtual; abstract;
public
class procedure Save(
AObject : TBaseRemotable;
AStore : IFormatterBase;
const AName : string;
const ATypeInfo : PTypeInfo
);override;
class procedure Load(
var AObject : TObject;
AStore : IFormatterBase;
var AName : string;
const ATypeInfo : PTypeInfo
);override;
procedure Assign(Source: TPersistent); override;
function Equal(const ACompareTo : TBaseRemotable) : Boolean;override;
function wstHasValue() : Boolean;override;
procedure LoadFromStream(AStream : TStream);
procedure LoadFromFile(const AFileName : string);
procedure LoadFromBuffer(const ABuffer; const ABufferLen : Integer);
procedure SaveToStream(AStream : TStream);
procedure SaveToFile(const AFileName : string);
function SaveToBuffer(var ABuffer; const ABufferLen : Integer) : Integer;
property BinaryData : TByteDynArray read FBinaryData write FBinaryData;
property EncodedString : string read GetEncodedString write SetEncodedString;
end;
{ TBase64StringRemotable }
TBase64StringRemotable = class(TAbstractEncodedStringRemotable)
private
function GetEncodedString : string; override;
procedure SetEncodedString(const AValue : string); override;
end;
{ TBase16StringRemotable }
TBase16StringRemotable = class(TAbstractEncodedStringRemotable)
private
function GetEncodedString : string; override;
procedure SetEncodedString(const AValue : string); override;
end;
{ TBaseDateRemotable }
TBaseDateRemotable = class(TAbstractSimpleRemotable)
private
FDate : TDateTimeRec;
private
function GetAsString: string;
function GetOffset(const Index: Integer): Shortint;
procedure SetAsString(const AValue: string);
procedure SetOffset(const Index: Integer; const Value: Shortint);
function GetDate(const AIndex : Integer) : TDateTime;
protected
function GetDatepart(const AIndex : Integer) : Integer;virtual;
procedure SetDate(const AIndex : Integer; const AValue: TDateTime);virtual;
public
class procedure Save(
AObject : TBaseRemotable;
AStore : IFormatterBase;
const AName : string;
const ATypeInfo : PTypeInfo
);override;
class procedure Load(
var AObject : TObject;
AStore : IFormatterBase;
var AName : string;
const ATypeInfo : PTypeInfo
);override;
class function ToStr(const ADate : TDateTime):string;overload;
class function ToStr(const ADate : TDateTimeRec):string;overload;virtual;abstract;
class function Parse(const ABuffer : string):TDateTimeRec;virtual;abstract;
class function ParseToUTC(const ABuffer : string):TDateTime;
procedure Assign(Source: TPersistent); override;
function Equal(const ACompareTo : TBaseRemotable) : Boolean;override;
function wstHasValue() : Boolean;override;
property AsDate : TDateTime index 0 read GetDate write SetDate;
property AsUTCDate : TDateTime index 1 read GetDate write SetDate;
property Year : Integer index 0 read GetDatepart;
property Month : Integer index 1 read GetDatepart;
property Day : Integer index 2 read GetDatepart;
property HourOffset : Shortint index 0 read GetOffset write SetOffset;
property MinuteOffset : Shortint index 1 read GetOffset write SetOffset;
property AsString : string read GetAsString write SetAsString;
end;
{ TDateRemotable }
TDateRemotable = class(TBaseDateRemotable)
public
class function ToStr(const ADate : TDateTimeRec):string;override;
class function Parse(const ABuffer : string):TDateTimeRec;override;
end;
{ TDateTimeRemotable }
TDateTimeRemotable = class(TBaseDateRemotable)
protected
function GetDatepart(const AIndex : Integer) : Integer;override;
public
class function ToStr(const ADate : TDateTimeRec):string;override;
class function Parse(const ABuffer : string):TDateTimeRec;override;
property Hour : Integer index 3 read GetDatepart;
property Minute : Integer index 4 read GetDatepart;
property Second : Integer index 5 read GetDatepart;
end;
{ TDurationRemotable }
TDurationRemotable = class(TAbstractSimpleRemotable)
private
FData : TDurationRec;
private
function GetAsString: string;
function GetNegative: Boolean;
function GetPart(AIndex: integer): PtrUInt;
procedure SetAsString(const AValue: string);
procedure SetNegative(const AValue: Boolean);
procedure SetPart(AIndex: integer; const AValue: PtrUInt);
public
class procedure Save(
AObject : TBaseRemotable;
AStore : IFormatterBase;
const AName : string;
const ATypeInfo : PTypeInfo
);override;
class procedure Load(
var AObject : TObject;
AStore : IFormatterBase;
var AName : string;
const ATypeInfo : PTypeInfo
);override;
procedure Assign(Source: TPersistent); override;
function Equal(const ACompareTo : TBaseRemotable) : Boolean;override;
function wstHasValue() : Boolean;override;
procedure Clear();
class function Parse(const ABuffer : string) : TDurationRec;
class function ToStr(const AValue : TDurationRec):string;
property Negative : Boolean read GetNegative write SetNegative;
property Year : PtrUInt index 0 read GetPart write SetPart;
property Month : PtrUInt index 1 read GetPart write SetPart;
property Day : PtrUInt index 2 read GetPart write SetPart;
property Hour : PtrUInt index 3 read GetPart write SetPart;
property Minute : PtrUInt index 4 read GetPart write SetPart;
property Second : PtrUInt index 5 read GetPart write SetPart;
property FractionalSecond : PtrUInt index 6 read GetPart write SetPart;
property AsString : string read GetAsString write SetAsString;
end;
{ TTimeRemotable }
TTimeRemotable = class(TAbstractSimpleRemotable)
private
FData : TTimeRec;
private
function GetOffset(AIndex: integer): Shortint;
function GetPart(AIndex: integer): Byte;
procedure SetMilliSecond(const AValue: Word);
procedure SetOffset(AIndex: integer; const AValue: Shortint);
procedure SetPart(AIndex: integer; const AValue: Byte);
function GetAsString: string;
function GetMilliSecond: Word;
procedure SetAsString(const AValue: string);
public
class procedure Save(
AObject : TBaseRemotable;
AStore : IFormatterBase;
const AName : string;
const ATypeInfo : PTypeInfo
);override;
class procedure Load(
var AObject : TObject;
AStore : IFormatterBase;
var AName : string;
const ATypeInfo : PTypeInfo
);override;
procedure Assign(Source: TPersistent); override;
function Equal(const ACompareTo : TBaseRemotable) : Boolean;override;
function wstHasValue() : Boolean;override;
procedure Clear();
class function Parse(const ABuffer : string) : TTimeRec;
class function ToStr(const AValue : TTimeRec) : string;
property Hour : Byte index 0 read GetPart write SetPart;
property Minute : Byte index 1 read GetPart write SetPart;
property Second : Byte index 2 read GetPart write SetPart;
property MilliSecond : Word read GetMilliSecond write SetMilliSecond;
property HourOffset : Shortint index 0 read GetOffset write SetOffset;
property MinuteOffset : Shortint index 1 read GetOffset write SetOffset;
property Data : TTimeRec read FData write FData;
property AsString : string read GetAsString write SetAsString;
end;
TAbstractComplexRemotableClass = class of TAbstractComplexRemotable;
{ TAbstractComplexRemotable }
TAbstractComplexRemotable = class(TBaseRemotable)
public
class procedure RegisterAttributeProperty(const AProperty : shortstring);virtual;
class procedure RegisterAttributeProperties(const APropertList : array of shortstring);virtual;
class function IsAttributeProperty(const AProperty : shortstring):Boolean;
procedure Assign(Source: TPersistent); override;
function Equal(const ACompareTo : TBaseRemotable) : Boolean;override;
end;
TBaseComplexRemotableClass = class of TBaseComplexRemotable;
{ TBaseComplexRemotable }
TBaseComplexRemotable = class(TAbstractComplexRemotable)
public
class procedure Save(
AObject : TBaseRemotable;
AStore : IFormatterBase;
const AName : string;
const ATypeInfo : PTypeInfo
);override;
class procedure Load(
var AObject : TObject;
AStore : IFormatterBase;
var AName : string;
const ATypeInfo : PTypeInfo
);override;
end;
TRemotableRecordEncoderClass = class of TRemotableRecordEncoder;
{ TRemotableRecordEncoder }
TRemotableRecordEncoder = class(TPersistent)
public
class procedure Save(
ARecord : Pointer;
AStore : IFormatterBase;
const AName : string;
const ATypeInfo : PTypeInfo
);virtual;
class procedure Load(
var ARecord : Pointer;
AStore : IFormatterBase;
var AName : string;
const ATypeInfo : PTypeInfo
);virtual;
end;
{ TBaseComplexSimpleContentRemotable }
TBaseComplexSimpleContentRemotable = class(TAbstractComplexRemotable)
protected
class procedure SaveValue(AObject : TBaseRemotable; AStore : IFormatterBase);virtual;abstract;
class procedure LoadValue(var AObject : TObject; AStore : IFormatterBase);virtual;abstract;
public
class procedure Save(
AObject : TBaseRemotable;
AStore : IFormatterBase;
const AName : string;
const ATypeInfo : PTypeInfo
);override;
class procedure Load(
var AObject : TObject;
AStore : IFormatterBase;
var AName : string;
const ATypeInfo : PTypeInfo
);override;
end;
TBaseComplexSimpleContentRemotableClass = class of TBaseComplexSimpleContentRemotable;
{ TComplexEnumContentRemotable }
TComplexEnumContentRemotable = class(TBaseComplexSimpleContentRemotable)
protected
class procedure SaveValue(AObject : TBaseRemotable; AStore : IFormatterBase);override;
class procedure LoadValue(var AObject : TObject; AStore : IFormatterBase);override;
class function GetEnumTypeInfo() : PTypeInfo;virtual;abstract;
function GetValueAddress() : Pointer;virtual;abstract;
end;
{ TComplexInt8UContentRemotable }
TComplexInt8UContentRemotable = class(TBaseComplexSimpleContentRemotable)
private
FValue: Byte;
protected
class procedure SaveValue(AObject : TBaseRemotable; AStore : IFormatterBase);override;
class procedure LoadValue(var AObject : TObject; AStore : IFormatterBase);override;
public
function wstHasValue() : Boolean;override;
property Value : Byte read FValue write FValue;
end;
{ TComplexInt8SContentRemotable }
TComplexInt8SContentRemotable = class(TBaseComplexSimpleContentRemotable)
private
FValue: ShortInt;
protected
class procedure SaveValue(AObject : TBaseRemotable; AStore : IFormatterBase);override;
class procedure LoadValue(var AObject : TObject; AStore : IFormatterBase);override;
public
function wstHasValue() : Boolean;override;
property Value : ShortInt read FValue write FValue;
end;
{ TComplexInt16SContentRemotable }
TComplexInt16SContentRemotable = class(TBaseComplexSimpleContentRemotable)
private
FValue: SmallInt;
protected
class procedure SaveValue(AObject : TBaseRemotable; AStore : IFormatterBase);override;
class procedure LoadValue(var AObject : TObject; AStore : IFormatterBase);override;
public
function wstHasValue() : Boolean;override;
property Value : SmallInt read FValue write FValue;
end;
{ TComplexInt16UContentRemotable }
TComplexInt16UContentRemotable = class(TBaseComplexSimpleContentRemotable)
private
FValue: Word;
protected
class procedure SaveValue(AObject : TBaseRemotable; AStore : IFormatterBase);override;
class procedure LoadValue(var AObject : TObject; AStore : IFormatterBase);override;
public
function wstHasValue() : Boolean;override;
property Value : Word read FValue write FValue;
end;
{ TComplexInt32SContentRemotable }
TComplexInt32SContentRemotable = class(TBaseComplexSimpleContentRemotable)
private
FValue: LongInt;
protected
class procedure SaveValue(AObject : TBaseRemotable; AStore : IFormatterBase);override;
class procedure LoadValue(var AObject : TObject; AStore : IFormatterBase);override;
public
function wstHasValue() : Boolean;override;
property Value : LongInt read FValue write FValue;
end;
{ TComplexInt32UContentRemotable }
TComplexInt32UContentRemotable = class(TBaseComplexSimpleContentRemotable)
private
FValue: LongWord;
protected
class procedure SaveValue(AObject : TBaseRemotable; AStore : IFormatterBase);override;
class procedure LoadValue(var AObject : TObject; AStore : IFormatterBase);override;
public
function wstHasValue() : Boolean;override;
property Value : LongWord read FValue write FValue;
end;
{ TComplexInt64SContentRemotable }
TComplexInt64SContentRemotable = class(TBaseComplexSimpleContentRemotable)
private
FValue: Int64;
protected
class procedure SaveValue(AObject : TBaseRemotable; AStore : IFormatterBase);override;
class procedure LoadValue(var AObject : TObject; AStore : IFormatterBase);override;
public
function wstHasValue() : Boolean;override;
property Value : Int64 read FValue write FValue;
end;
{ TComplexInt64UContentRemotable }
TComplexInt64UContentRemotable = class(TBaseComplexSimpleContentRemotable)
private
FValue: QWord;
protected
class procedure SaveValue(AObject : TBaseRemotable; AStore : IFormatterBase);override;
class procedure LoadValue(var AObject : TObject; AStore : IFormatterBase);override;
public
function wstHasValue() : Boolean;override;
property Value : QWord read FValue write FValue;
end;
{ TComplexFloatExtendedContentRemotable }
TComplexFloatExtendedContentRemotable = class(TBaseComplexSimpleContentRemotable)
private
FValue: Extended;
protected
class procedure SaveValue(AObject : TBaseRemotable; AStore : IFormatterBase);override;
class procedure LoadValue(var AObject : TObject; AStore : IFormatterBase);override;
public
function wstHasValue() : Boolean;override;
property Value : Extended read FValue write FValue;
end;
{ TComplexFloatDoubleContentRemotable }
TComplexFloatDoubleContentRemotable = class(TBaseComplexSimpleContentRemotable)
private
FValue: Double;
protected
class procedure SaveValue(AObject : TBaseRemotable; AStore : IFormatterBase);override;
class procedure LoadValue(var AObject : TObject; AStore : IFormatterBase);override;
public
function wstHasValue() : Boolean;override;
property Value : Double read FValue write FValue;
end;
{ TComplexFloatSingleContentRemotable }
TComplexFloatSingleContentRemotable = class(TBaseComplexSimpleContentRemotable)
private
FValue: Single;
protected
class procedure SaveValue(AObject : TBaseRemotable; AStore : IFormatterBase);override;
class procedure LoadValue(var AObject : TObject; AStore : IFormatterBase);override;
public
function wstHasValue() : Boolean;override;
property Value : Single read FValue write FValue;
end;
{ TComplexCurrencyContentRemotable }
TComplexCurrencyContentRemotable = class(TBaseComplexSimpleContentRemotable)
private
FValue: Currency;
protected
class procedure SaveValue(AObject : TBaseRemotable; AStore : IFormatterBase);override;
class procedure LoadValue(var AObject : TObject; AStore : IFormatterBase);override;
public
function wstHasValue() : Boolean;override;
property Value : Currency read FValue write FValue;
end;
TComplexAnsiCharContentRemotable = class(TBaseComplexSimpleContentRemotable)
private
FValue: AnsiChar;
protected
class procedure SaveValue(AObject : TBaseRemotable; AStore : IFormatterBase);override;
class procedure LoadValue(var AObject : TObject; AStore : IFormatterBase);override;
public
property Value : AnsiChar read FValue write FValue;
end;
TComplexWideCharContentRemotable = class(TBaseComplexSimpleContentRemotable)
private
FValue: WideChar;
protected
class procedure SaveValue(AObject : TBaseRemotable; AStore : IFormatterBase);override;
class procedure LoadValue(var AObject : TObject; AStore : IFormatterBase);override;
public
property Value : WideChar read FValue write FValue;
end;
{ TComplexStringContentRemotable }
TComplexStringContentRemotable = class(TBaseComplexSimpleContentRemotable)
private
FValue: string;
protected
class procedure SaveValue(AObject : TBaseRemotable; AStore : IFormatterBase);override;
class procedure LoadValue(var AObject : TObject; AStore : IFormatterBase);override;
public
function wstHasValue() : Boolean;override;
property Value : string read FValue write FValue;
end;
{ TComplexWideStringContentRemotable }
TComplexWideStringContentRemotable = class(TBaseComplexSimpleContentRemotable)
private
FValue: Widestring;
protected
class procedure SaveValue(AObject : TBaseRemotable; AStore : IFormatterBase);override;
class procedure LoadValue(var AObject : TObject; AStore : IFormatterBase);override;
public
function wstHasValue() : Boolean;override;
property Value : Widestring read FValue write FValue;
end;
{$IFDEF WST_UNICODESTRING}
{ TComplexUnicodeStringContentRemotable }
TComplexUnicodeStringContentRemotable = class(TBaseComplexSimpleContentRemotable)
private
FValue: UnicodeString;
protected
class procedure SaveValue(AObject : TBaseRemotable; AStore : IFormatterBase);override;
class procedure LoadValue(var AObject : TObject; AStore : IFormatterBase);override;
public
function wstHasValue() : Boolean;override;
property Value : UnicodeString read FValue write FValue;
end;
{$ENDIF WST_UNICODESTRING}
{ TAbstractEncodedStringExtRemotable }
TAbstractEncodedStringExtRemotable = class(TBaseComplexSimpleContentRemotable)
private
FBinaryData : TByteDynArray;
private
function GetEncodedString : string; virtual; abstract;
procedure SetEncodedString(const AValue : string); virtual; abstract;
protected
class procedure SaveValue(AObject : TBaseRemotable; AStore : IFormatterBase);override;
class procedure LoadValue(var AObject : TObject; AStore : IFormatterBase);override;
public
procedure Assign(Source: TPersistent); override;
function Equal(const ACompareTo : TBaseRemotable) : Boolean;override;
function wstHasValue() : Boolean;override;
procedure LoadFromStream(AStream : TStream);
procedure LoadFromFile(const AFileName : string);
procedure LoadFromBuffer(const ABuffer; const ABufferLen : Integer);
procedure SaveToStream(AStream : TStream);
procedure SaveToFile(const AFileName : string);
function SaveToBuffer(var ABuffer; const ABufferLen : Integer) : Integer;
property BinaryData : TByteDynArray read FBinaryData write FBinaryData;
property EncodedString : string read GetEncodedString write SetEncodedString;
end;
{ TBase64StringExtRemotable }
TBase64StringExtRemotable = class(TAbstractEncodedStringExtRemotable)
private
function GetEncodedString : string; override;
procedure SetEncodedString(const AValue : string); override;
end;
{ TBase16StringExtRemotable }
TBase16StringExtRemotable = class(TAbstractEncodedStringExtRemotable)
private
function GetEncodedString : string; override;
procedure SetEncodedString(const AValue : string); override;
end;
{ TComplexBooleanContentRemotable }
TComplexBooleanContentRemotable = class(TBaseComplexSimpleContentRemotable)
private
FValue: Boolean;
protected
class procedure SaveValue(AObject : TBaseRemotable; AStore : IFormatterBase);override;
class procedure LoadValue(var AObject : TObject; AStore : IFormatterBase);override;
public
property Value : Boolean read FValue write FValue;
end;
THeaderBlockClass = class of THeaderBlock;
{ THeaderBlock }
THeaderBlock = class(TBaseComplexRemotable)
private
FDirection: THeaderDirection;
FmustUnderstand: Integer;
FName: string;
FUnderstood: Boolean;
private
function HasmustUnderstand: boolean;
procedure SetmustUnderstand(const AValue: Integer);
protected
function GetName: string; virtual;
procedure SetName(const AValue: string); virtual;
public
property Direction : THeaderDirection read FDirection write FDirection;
property Understood : Boolean read FUnderstood write FUnderstood;
property Name : string read GetName write SetName;
published
property mustUnderstand : Integer read FmustUnderstand write SetmustUnderstand stored HasmustUnderstand;
end;
{ TSimpleContentHeaderBlock
Make a derived class of TSimpleContentHeaderBlock to handle a simple content
header block.
}
TSimpleContentHeaderBlock = class(THeaderBlock)
private
FValue : string;
public
class procedure Save(
AObject : TBaseRemotable;
AStore : IFormatterBase;
const AName : string;
const ATypeInfo : PTypeInfo
);override;
class procedure Load(
var AObject : TObject;
AStore : IFormatterBase;
var AName : string;
const ATypeInfo : PTypeInfo
);override;
property Value : string read FValue write FValue;
end;
{ THeaderBlockProxy
This class is used as a wrapper to allow a TBaseRemotable instance to be
sent and received as a header block.
}
THeaderBlockProxy = class(THeaderBlock)
private
FActualObject: TBaseRemotable;
FOwnObject: Boolean;
FNameSet : Boolean;
private
procedure SetActualObject(const AValue: TBaseRemotable);
protected
function GetName : string; override;
procedure SetName(const AValue: string); override;
public
procedure FreeObjectProperties();override;
class procedure Save(
AObject : TBaseRemotable;
AStore : IFormatterBase;
const AName : string;
const ATypeInfo : PTypeInfo
);override;
class procedure Load(
var AObject : TObject;
AStore : IFormatterBase;
var AName : string;
const ATypeInfo : PTypeInfo
);override;
property ActualObject : TBaseRemotable read FActualObject write SetActualObject;
property OwnObject : Boolean read FOwnObject write FOwnObject;
end;
{ TBaseArrayRemotable }
TBaseArrayRemotable = class(TAbstractComplexRemotable)
private
FOptions : TInstanceOptions;
protected
class function GetItemName():string;virtual;
class function GetStyle():TArrayStyle;virtual;
procedure CheckIndex(const AIndex : Integer);
function GetLength():Integer;virtual;abstract;
public
class function GetItemTypeInfo():PTypeInfo;virtual;abstract;
destructor Destroy();override;
procedure SetLength(const ANewSize : Integer);virtual;abstract;
property Length : Integer Read GetLength;
property Options : TInstanceOptions read FOptions write FOptions;
end;
TBaseArrayRemotableClass = class of TBaseArrayRemotable;
{ TBaseObjectArrayRemotable
An implementation for array handling. The array items are "owned" by
this class instance, so one has not to free them.
}
TBaseObjectArrayRemotable = class(TBaseArrayRemotable)
Private
FArray : Array Of TBaseRemotable;
Protected
function GetItem(AIndex: Integer): TBaseRemotable;
function GetLength():Integer;override;
Public
class procedure Save(
AObject : TBaseRemotable;
AStore : IFormatterBase;
Const AName : String;
Const ATypeInfo : PTypeInfo
);override;
class procedure Load(
Var AObject : TObject;
AStore : IFormatterBase;
var AName : String;
const ATypeInfo : PTypeInfo
);override;
class function GetItemClass():TBaseRemotableClass;virtual;abstract;
class function GetItemTypeInfo():PTypeInfo;override;
constructor Create();override;
procedure Assign(Source: TPersistent); override;
function Equal(const ACompareTo : TBaseRemotable) : Boolean;override;
procedure Exchange(const Index1,Index2 : Integer);
procedure SetLength(Const ANewSize : Integer);override;
Property Item[AIndex:Integer] : TBaseRemotable Read GetItem;Default;
End;
TBaseObjectArrayRemotableClass = class of TBaseObjectArrayRemotable;
{ TObjectCollectionRemotable
An implementation for array handling. The array items are "owned" by
this class instance, so one has not to free them.
}
TObjectCollectionRemotable = class(TBaseArrayRemotable)
private
FList : TObjectList;
protected
function GetItem(AIndex : Integer) : TBaseRemotable;{$IFDEF USE_INLINE}inline;{$ENDIF}
function GetLength() : Integer; override;
public
class procedure Save(
AObject : TBaseRemotable;
AStore : IFormatterBase;
const AName : string;
const ATypeInfo : PTypeInfo
);override;
class procedure Load(
var AObject : TObject;
AStore : IFormatterBase;
var AName : string;
const ATypeInfo : PTypeInfo
);override;
class function GetItemClass():TBaseRemotableClass;virtual;abstract;
class function GetItemTypeInfo():PTypeInfo;override;
constructor Create();override;
destructor Destroy();override;
procedure Assign(Source: TPersistent); override;
function Equal(const ACompareTo : TBaseRemotable) : Boolean;override;
function Add(): TBaseRemotable;{$IFDEF USE_INLINE}inline;{$ENDIF}
function AddAt(const APosition : Integer): TBaseRemotable;{$IFDEF USE_INLINE}inline;{$ENDIF}
function Extract(const AIndex : Integer): TBaseRemotable;{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure Delete(const AIndex : Integer);{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure Exchange(const Index1,Index2 : Integer);{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure Clear();{$IFDEF USE_INLINE}inline;{$ENDIF}
function IndexOf(AObject : TBaseRemotable) : Integer;{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure SetLength(Const ANewSize : Integer);override;
property Item[AIndex:Integer] : TBaseRemotable read GetItem;default;
end;
{ TBaseSimpleTypeArrayRemotable }
TBaseSimpleTypeArrayRemotable = class(TBaseArrayRemotable)
protected
procedure SaveItem(
AStore : IFormatterBase;
const AName : String;
const AIndex : Integer
);virtual;abstract;
procedure LoadItem(
AStore : IFormatterBase;
const AIndex : Integer
);virtual;abstract;
public
class procedure Save(
AObject : TBaseRemotable;
AStore : IFormatterBase;
const AName : string;
const ATypeInfo : PTypeInfo
);override;
class procedure Load(
var AObject : TObject;
AStore : IFormatterBase;
var AName : string;
const ATypeInfo : PTypeInfo
);override;
end;
{ TArrayOfStringRemotable }
// --------- Compiler Native String type !!!! ----------
TArrayOfStringRemotable = class(TBaseSimpleTypeArrayRemotable)
private
FData : array of String;
function GetItem(AIndex: Integer): String;
procedure SetItem(AIndex: Integer; const AValue: String);
protected
function GetLength():Integer;override;
procedure SaveItem(
AStore : IFormatterBase;
const AName : String;
const AIndex : Integer
);override;
procedure LoadItem(
AStore : IFormatterBase;
const AIndex : Integer
);override;
public
class function GetItemTypeInfo():PTypeInfo;override;
procedure SetLength(const ANewSize : Integer);override;
procedure Assign(Source: TPersistent); override;
function Equal(const ACompareTo : TBaseRemotable) : Boolean;override;
property Item[AIndex:Integer] : String read GetItem write SetItem; default;
end;
{ TArrayOfBooleanRemotable }
TArrayOfBooleanRemotable = class(TBaseSimpleTypeArrayRemotable)
private
FData : array of Boolean;
function GetItem(AIndex: Integer): Boolean;
procedure SetItem(AIndex: Integer; const AValue: Boolean);
protected
function GetLength():Integer;override;
procedure SaveItem(
AStore : IFormatterBase;
const AName : String;
const AIndex : Integer
);override;
procedure LoadItem(
AStore : IFormatterBase;
const AIndex : Integer
);override;
public
class function GetItemTypeInfo():PTypeInfo;override;
procedure SetLength(const ANewSize : Integer);override;
procedure Assign(Source: TPersistent); override;
property Item[AIndex:Integer] : Boolean read GetItem write SetItem; default;
end;
{ TArrayOfInt8URemotable }
TArrayOfInt8URemotable = class(TBaseSimpleTypeArrayRemotable)
private
FData : array of Byte;
function GetItem(AIndex: Integer): Byte;
procedure SetItem(AIndex: Integer; const AValue: Byte);
protected
function GetLength():Integer;override;
procedure SaveItem(
AStore : IFormatterBase;
const AName : String;
const AIndex : Integer
);override;
procedure LoadItem(
AStore : IFormatterBase;
const AIndex : Integer
);override;
public
class function GetItemTypeInfo():PTypeInfo;override;
procedure SetLength(const ANewSize : Integer);override;
procedure Assign(Source: TPersistent); override;
property Item[AIndex:Integer] : Byte read GetItem write SetItem; default;
end;
{ TArrayOfInt8SRemotable }
TArrayOfInt8SRemotable = class(TBaseSimpleTypeArrayRemotable)
private
FData : array of ShortInt;
function GetItem(AIndex: Integer): ShortInt;
procedure SetItem(AIndex: Integer; const AValue: ShortInt);
protected
function GetLength():Integer;override;
procedure SaveItem(
AStore : IFormatterBase;
const AName : String;
const AIndex : Integer
);override;
procedure LoadItem(
AStore : IFormatterBase;
const AIndex : Integer
);override;
public
class function GetItemTypeInfo():PTypeInfo;override;
procedure SetLength(const ANewSize : Integer);override;
procedure Assign(Source: TPersistent); override;
property Item[AIndex:Integer] : ShortInt read GetItem write SetItem; default;
end;
{ TArrayOfInt16SRemotable }
TArrayOfInt16SRemotable = class(TBaseSimpleTypeArrayRemotable)
private
FData : array of SmallInt;
function GetItem(AIndex: Integer): SmallInt;
procedure SetItem(AIndex: Integer; const AValue: SmallInt);
protected
function GetLength():Integer;override;
procedure SaveItem(
AStore : IFormatterBase;
const AName : String;
const AIndex : Integer
);override;
procedure LoadItem(
AStore : IFormatterBase;
const AIndex : Integer
);override;
public
class function GetItemTypeInfo():PTypeInfo;override;
procedure SetLength(const ANewSize : Integer);override;
procedure Assign(Source: TPersistent); override;
property Item[AIndex:Integer] : SmallInt read GetItem write SetItem; default;
end;
{ TArrayOfInt16URemotable }
TArrayOfInt16URemotable = class(TBaseSimpleTypeArrayRemotable)
private
FData : array of Word;
function GetItem(AIndex: Integer): Word;
procedure SetItem(AIndex: Integer; const AValue: Word);
protected
function GetLength():Integer;override;
procedure SaveItem(
AStore : IFormatterBase;
const AName : String;
const AIndex : Integer
);override;
procedure LoadItem(
AStore : IFormatterBase;
const AIndex : Integer
);override;
public
class function GetItemTypeInfo():PTypeInfo;override;
procedure SetLength(const ANewSize : Integer);override;
procedure Assign(Source: TPersistent); override;
property Item[AIndex:Integer] : Word read GetItem write SetItem; default;
end;
{ TArrayOfInt32URemotable }
TArrayOfInt32URemotable = class(TBaseSimpleTypeArrayRemotable)
private
FData : array of LongWord;
function GetItem(AIndex: Integer): LongWord;
procedure SetItem(AIndex: Integer; const AValue: LongWord);
protected
function GetLength():Integer;override;
procedure SaveItem(
AStore : IFormatterBase;
const AName : String;
const AIndex : Integer
);override;
procedure LoadItem(
AStore : IFormatterBase;
const AIndex : Integer
);override;
public
class function GetItemTypeInfo():PTypeInfo;override;
procedure SetLength(const ANewSize : Integer);override;
procedure Assign(Source: TPersistent); override;
property Item[AIndex:Integer] : LongWord read GetItem write SetItem; default;
end;
{ TArrayOfInt32SRemotable }
TArrayOfInt32SRemotable = class(TBaseSimpleTypeArrayRemotable)
private
FData : array of LongInt;
function GetItem(AIndex: Integer): LongInt;
procedure SetItem(AIndex: Integer; const AValue: LongInt);
protected
function GetLength():Integer;override;
procedure SaveItem(
AStore : IFormatterBase;
const AName : String;
const AIndex : Integer
);override;
procedure LoadItem(
AStore : IFormatterBase;
const AIndex : Integer
);override;
public
class function GetItemTypeInfo():PTypeInfo;override;
procedure SetLength(const ANewSize : Integer);override;
procedure Assign(Source: TPersistent); override;
property Item[AIndex:Integer] : LongInt read GetItem write SetItem; default;
end;
{ TArrayOfInt64SRemotable }
TArrayOfInt64SRemotable = class(TBaseSimpleTypeArrayRemotable)
private
FData : array of Int64;
function GetItem(AIndex: Integer): Int64;
procedure SetItem(AIndex: Integer; const AValue: Int64);
protected
function GetLength():Integer;override;
procedure SaveItem(
AStore : IFormatterBase;
const AName : String;
const AIndex : Integer
);override;
procedure LoadItem(
AStore : IFormatterBase;
const AIndex : Integer
);override;
public
class function GetItemTypeInfo():PTypeInfo;override;
procedure SetLength(const ANewSize : Integer);override;
procedure Assign(Source: TPersistent); override;
property Item[AIndex:Integer] : Int64 read GetItem write SetItem; default;
end;
{ TArrayOfInt64URemotable }
TArrayOfInt64URemotable = class(TBaseSimpleTypeArrayRemotable)
private
FData : array of QWord;
function GetItem(AIndex: Integer): QWord;
procedure SetItem(AIndex: Integer; const AValue: QWord);
protected
function GetLength():Integer;override;
procedure SaveItem(
AStore : IFormatterBase;
const AName : String;
const AIndex : Integer
);override;
procedure LoadItem(
AStore : IFormatterBase;
const AIndex : Integer);override;
public
class function GetItemTypeInfo():PTypeInfo;override;
procedure SetLength(const ANewSize : Integer);override;
procedure Assign(Source: TPersistent); override;
property Item[AIndex:Integer] : QWord read GetItem write SetItem; default;
end;
{ TArrayOfFloatSingleRemotable }
TArrayOfFloatSingleRemotable = class(TBaseSimpleTypeArrayRemotable)
private
FData : array of Single;
function GetItem(AIndex: Integer): Single;
procedure SetItem(AIndex: Integer; const AValue: Single);
protected
function GetLength():Integer;override;
procedure SaveItem(
AStore : IFormatterBase;
const AName : String;
const AIndex : Integer
);override;
procedure LoadItem(
AStore : IFormatterBase;
const AIndex : Integer
);override;
public
class function GetItemTypeInfo():PTypeInfo;override;
procedure SetLength(const ANewSize : Integer);override;
procedure Assign(Source: TPersistent); override;
property Item[AIndex:Integer] : Single read GetItem write SetItem; default;
end;
{ TArrayOfFloatDoubleRemotable }
TArrayOfFloatDoubleRemotable = class(TBaseSimpleTypeArrayRemotable)
private
FData : array of Double;
function GetItem(AIndex: Integer): Double;
procedure SetItem(AIndex: Integer; const AValue: Double);
protected
function GetLength():Integer;override;
procedure SaveItem(
AStore : IFormatterBase;
const AName : String;
const AIndex : Integer
);override;
procedure LoadItem(
AStore : IFormatterBase;
const AIndex : Integer
);override;
public
class function GetItemTypeInfo():PTypeInfo;override;
procedure SetLength(const ANewSize : Integer);override;
procedure Assign(Source: TPersistent); override;
property Item[AIndex:Integer] : Double read GetItem write SetItem; default;
end;
{ TArrayOfFloatExtendedRemotable }
TArrayOfFloatExtendedRemotable = class(TBaseSimpleTypeArrayRemotable)
private
FData : array of Extended;
function GetItem(AIndex: Integer): Extended;
procedure SetItem(AIndex: Integer; const AValue: Extended);
protected
function GetLength():Integer;override;
procedure SaveItem(
AStore : IFormatterBase;
const AName : String;
const AIndex : Integer
);override;
procedure LoadItem(
AStore : IFormatterBase;
const AIndex : Integer
);override;
public
class function GetItemTypeInfo():PTypeInfo;override;
procedure SetLength(const ANewSize : Integer);override;
procedure Assign(Source: TPersistent); override;
property Item[AIndex:Integer] : Extended read GetItem write SetItem; default;
end;
{ TArrayOfFloatCurrencyRemotable }
TArrayOfFloatCurrencyRemotable = class(TBaseSimpleTypeArrayRemotable)
private
FData : array of Currency;
function GetItem(AIndex: Integer): Currency;
procedure SetItem(AIndex: Integer; const AValue: Currency);
protected
function GetLength():Integer;override;
procedure SaveItem(
AStore : IFormatterBase;
const AName : String;
const AIndex : Integer
);override;
procedure LoadItem(
AStore : IFormatterBase;
const AIndex : Integer
);override;
public
class function GetItemTypeInfo():PTypeInfo;override;
procedure SetLength(const ANewSize : Integer);override;
procedure Assign(Source: TPersistent); override;
property Item[AIndex:Integer] : Currency read GetItem write SetItem; default;
end;
{ TBaseFactoryRegistryItem }
// Implementation helpers
TBaseFactoryRegistryItem = class
private
FFactory: IItemFactory;
FName: string;
public
constructor Create(
const AName : string;
const AFactory : IItemFactory
);
destructor Destroy();override;
property Name : string Read FName;
property Factory : IItemFactory Read FFactory;
End;
{ TBaseFactoryRegistry }
TBaseFactoryRegistry = class(TInterfacedObject,IInterface)
private
FList : TObjectList;
function GetCount: Integer;
function GetItem(Index: Integer): TBaseFactoryRegistryItem;
protected
function FindFactory(const AName: string): IItemFactory;
procedure Register(
const AName : string;
AFactory : IItemFactory
);
protected
property Count : Integer read GetCount;
property Item[Index:Integer] : TBaseFactoryRegistryItem read GetItem;
public
constructor Create();
destructor Destroy();override;
End;
{ TSimpleFactoryItem }
TSimpleFactoryItem = class(TInterfacedObject)
public
constructor Create();virtual;
End;
TSimpleFactoryItemClass = class of TSimpleFactoryItem;
{ TSimpleItemFactory }
{$TYPEINFO ON}
TSimpleItemFactory = class(TInterfacedObject,IItemFactory)
private
FItemClass : TSimpleFactoryItemClass;
protected
function CreateInstance():IInterface;virtual;
function GetItemClass() : TSimpleFactoryItemClass;
public
constructor Create(AItemClass : TSimpleFactoryItemClass);
End;
{$TYPEINFO OFF}
{ TIntfPoolItem }
TIntfPoolItem = class
private
FIntf: IInterface;
FUsed: Boolean;
public
constructor Create(AIntf : IInterface; const AUsed : Boolean);
destructor Destroy();override;
property Intf : IInterface read FIntf;
property Used : Boolean read FUsed write FUsed;
end;
TIntfPool = class
private
FList : TObjectList;
FCS : TCriticalSection;
FLock : TSemaphoreObject;
FFactory : IItemFactory;
FMin : Integer;
FMax : Integer;
private
function CreateNew(const AUsed : Boolean) : TIntfPoolItem;
function TryGet(const AIndex: Integer): Boolean;
public
constructor Create(
const AMin, AMax : Integer;
AFactory : IItemFactory
);
destructor Destroy();override;
function Get(const ATimeOut : Cardinal) : IInterface;
procedure Release(const AItem : IInterface);
procedure Discard(const AItem : IInterface);
function GetInstancesCount: Integer;
property Min : Integer read FMin;
property Max : Integer read FMax;
end;
{ TSimpleItemFactoryEx }
TSimpleItemFactoryEx = class(TSimpleItemFactory,IItemFactory,IItemFactoryEx)
private
FPooled: Boolean;
FPoolMax: Integer;
FPoolMin: Integer;
FPropertyNames : TStringList;
FProperties : IInterfaceList;
FPool : TIntfPool;
FTimeOut: PtrUInt;
private
procedure PreparePool();{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure SetPooled(const AValue: Boolean);
procedure SetPoolMax(const AValue: Integer);
procedure SetPoolMin(const AValue: Integer);
protected
function CreateInstance():IInterface;override;
procedure ReleaseInstance(const AInstance : IInterface);virtual;
procedure DiscardInstance(const AInstance : IInterface);virtual;
function GetPropertyManager(
const APropertyGroup : string;
const ACreateIfNotExists : Boolean
):IPropertyManager;
public
constructor Create(
AItemClass : TSimpleFactoryItemClass;
const APropsString : string
);overload;
constructor Create(AItemClass : TSimpleFactoryItemClass);overload;
destructor Destroy();override;
published
property PoolMax : Integer read FPoolMax write SetPoolMax;
property PoolMin : Integer read FPoolMin write SetPoolMin;
property Pooled : Boolean read FPooled write SetPooled;
property TimeOut : PtrUInt read FTimeOut write FTimeOut;
end;
TTypeRegistryItemOption = (
trioNonVisibleToMetadataService,
trioUnqualifiedElement, trioQualifiedElement,
trioUnqualifiedAttribute, trioQualifiedAttribute
);
TTypeRegistryItemOptions = set of TTypeRegistryItemOption;
TTypeRegistry = class;
TTypeRegistryItem = class;
TTypeRegistryItemClass = class of TTypeRegistryItem;
TRemotableTypeInitializerClass = class of TRemotableTypeInitializer;
{ TRemotableTypeInitializer }
TRemotableTypeInitializer = class
public
class function CanHandle(ATypeInfo : PTypeInfo) : Boolean;virtual;
class function GetItemClass(const ATypeInfo : PTypeInfo) : TTypeRegistryItemClass;virtual;
{$IFDEF TRemotableTypeInitializer_Initialize}
class function Initialize(
ATypeInfo : PTypeInfo;
ARegistryItem : TTypeRegistryItem
) : Boolean;virtual;abstract;
{$ENDIF TRemotableTypeInitializer_Initialize}
end;
TPropertyNameType = ( pntInternalName, pntExternalName );
{ TPropertyItem }
TPropertyItem = class
private
FExternalName: string;
FExtObject: TObject;
FInternalName: string;
FOptions: TTypeRegistryItemOptions;
public
property InternalName : string read FInternalName {write FInternalName};
property ExternalName : string read FExternalName {write FExternalName};
property ExtObject : TObject read FExtObject {write FExtObject};
property Options : TTypeRegistryItemOptions read FOptions {write FOptions};
end;
{ TTypeRegistryItem }
TTypeRegistryItem = class
private
//FDefaultPropertyOptions: TTypeRegistryItemOptions;
FOwner : TTypeRegistry;
FDataType: PTypeInfo;
FNameSpace: string;
FDeclaredName : string;
FOptions: TTypeRegistryItemOptions;
FPascalSynonyms : TStrings;
FExternalSynonyms : TStrings;
FProperties : TObjectList;
procedure SetOptions(AValue: TTypeRegistryItemOptions);
protected
procedure Init(); virtual;
protected
function IndexOfProp(
const AName : string;
const ANameType : TPropertyNameType
) : Integer;
public
constructor Create(
AOwner : TTypeRegistry;
ANameSpace : string;
ADataType : PTypeInfo;
Const ADeclaredName : string = ''
);virtual;
destructor Destroy();override;
function AddPascalSynonym(const ASynonym : string):TTypeRegistryItem;
function AddExternalSynonym(const ASynonym : string):TTypeRegistryItem;
function IsSynonym(const APascalTypeName : string):Boolean;{$IFDEF USE_INLINE}inline;{$ENDIF}
function IsExternalSynonym(const AExternalName : string):Boolean;{$IFDEF USE_INLINE}inline;{$ENDIF}
function FindProperty(
const AName : string;
const ANameType : TPropertyNameType
) : TPropertyItem;
procedure RegisterExternalPropertyName(const APropName, AExtPropName : string); virtual;
function GetExternalPropertyName(const APropName : string) : string;{$IFDEF USE_INLINE}inline;{$ENDIF}
function GetInternalPropertyName(const AExtPropName : string) : string;{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure SetPropertyOptions(
const APropName : string;
const AOptions : TTypeRegistryItemOptions
); virtual;
procedure AddOptions(const AOptions : TTypeRegistryItemOptions);
procedure RegisterObject(const APropName : string; const AObject : TObject);
function GetObject(const APropName : string) : TObject;
property Owner : TTypeRegistry read FOwner;
property DataType : PTypeInfo read FDataType;
property NameSpace : string read FNameSpace;
property DeclaredName : string read FDeclaredName;
property Options : TTypeRegistryItemOptions read FOptions write SetOptions;
//property DefaultPropertyOptions : TTypeRegistryItemOptions
//read FDefaultPropertyOptions write FDefaultPropertyOptions;
end;
TTypeRegistrySearchOption = ( trsoIncludeExternalSynonyms );
TTypeRegistrySearchOptions = set of TTypeRegistrySearchOption;
{ TTypeRegistry }
TTypeRegistry = class
private
FList : TObjectList;
FInitializerList : TClassList;
private
function GetItemClassFor(const ATypeInfo : PTypeInfo) : TTypeRegistryItemClass;
{$IFDEF TRemotableTypeInitializer_Initialize}
procedure InitializeItem(AItem : TTypeRegistryItem);
{$ENDIF TRemotableTypeInitializer_Initialize}
function GetCount: Integer;{$IFDEF USE_INLINE}inline;{$ENDIF}
function GetItemByIndex(Index: Integer): TTypeRegistryItem;{$IFDEF USE_INLINE}inline;{$ENDIF}
function GetItemByTypeInfo(Index: PTypeInfo): TTypeRegistryItem;
public
constructor Create();
destructor Destroy();override;
procedure RegisterInitializer(AInitializer : TRemotableTypeInitializerClass);
function IndexOf(Const ATypeInfo : PTypeInfo):Integer;
function Add(AItem:TTypeRegistryItem):Integer;
function Register(
const ANameSpace : string;
const ADataType : PTypeInfo;
const ADeclaredName : string;
const AOptions : TTypeRegistryItemOptions
):TTypeRegistryItem;overload;
function Register(
Const ANameSpace : String;
Const ADataType : PTypeInfo;
Const ADeclaredName : String = ''
):TTypeRegistryItem;overload;
function Find(ATypeInfo : PTypeInfo; Const AExact : Boolean):TTypeRegistryItem;overload;
function Find(const APascalTypeName : string):TTypeRegistryItem;overload;
function FindByDeclaredName(
const ATypeName,
ANameSpace : string;
const AOptions : TTypeRegistrySearchOptions = []
) : TTypeRegistryItem;
Property Count : Integer Read GetCount;
Property Item[Index:Integer] : TTypeRegistryItem Read GetItemByIndex;default;
Property ItemByTypeInfo[Index:PTypeInfo] : TTypeRegistryItem Read GetItemByTypeInfo;
end;
TPropStoreType = ( pstNever, pstOptional, pstAlways );
EPropertyException = class(Exception)
end;
{ TStoredPropertyManager }
TStoredPropertyManager = class(TInterfacedObject,IPropertyManager)
private
FData : TStringList;
procedure Error(Const AMsg:string);overload;
procedure Error(Const AMsg:string; Const AArgs : array of const);overload;
protected
procedure SetProperty(Const AName,AValue:string);
procedure SetProperties(Const APropsStr:string);
function GetProperty(Const AName:String):string;
function GetPropertyNames(ADest : TStrings):Integer;
procedure Clear();
procedure Copy(ASource:IPropertyManager; Const AClearBefore : Boolean);
public
constructor Create();
destructor Destroy();override;
end;
const
sXSD_NS = 'http://www.w3.org/2001/XMLSchema';
sXSD = 'xsd';
sSOAP_ENV = 'http://schemas.xmlsoap.org/soap/envelope/';
sSOAP_ENV_ABR = 'SOAP-ENV';
sWST_BASE_NS_ABR = 'wst';
sWST_BASE_NS = 'urn:wst_base';
PROP_LIST_DELIMITER = ';';
FIELDS_STRING = '__FIELDS__';
function GetTypeRegistry():TTypeRegistry;
procedure RegisterStdTypes();overload;{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure RegisterStdTypes(ARegistry : TTypeRegistry);overload;
procedure RegisterAttributeProperty(
const ATypeInfo : PTypeInfo; // must be tkClass or tkRecord
const AProperty : shortstring
);
procedure SetFieldSerializationVisibility(
const ATypeInfo : PTypeInfo; // must be tkRecord
const AField : shortstring;
const AVisibility : Boolean
);
function GetExternalName(
const ATypeInfo : PTypeInfo;
const ARegistry : TTypeRegistry = nil
) : string;
function IsStoredPropClass(AClass : TClass;PropInfo : PPropInfo) : TPropStoreType;
procedure initialize_base_service_intf();
procedure finalize_base_service_intf();
{$IFDEF HAS_FORMAT_SETTINGS}
var
wst_FormatSettings : TFormatSettings;
{$ENDIF HAS_FORMAT_SETTINGS}
implementation
uses
wst_consts, imp_utils, record_rtti, basex_encode, object_serializer, DateUtils;
type
PObject = ^TObject;
TEnumBuffer = Record
Case TOrdType Of
otSByte : (ShortIntData : ShortInt);
otUByte : (ByteData : Byte);
otSWord : (SmallIntData : SmallInt);
otUWord : (WordData : Word);
otSLong : (SLongIntData : LongInt);
otULong : (ULongIntData : LongWord);
End;
TFloatBuffer = Record
Case TFloatType Of
ftSingle : (SingleData : Single);
ftDouble : (DoubleData : Double);
ftExtended : (ExtendedData : Extended);
ftCurr : (CurrencyData : Currency);
ftComp : (CompData : Comp);
End;
var
TypeRegistryInstance : TTypeRegistry = Nil;
function GetTypeRegistry():TTypeRegistry;
begin
If Not Assigned(TypeRegistryInstance) Then
TypeRegistryInstance := TTypeRegistry.Create();
Result := TypeRegistryInstance;
end;
procedure RegisterStdTypes();
begin
RegisterStdTypes(GetTypeRegistry());
end;
procedure RegisterStdTypes(ARegistry : TTypeRegistry);
Var
r : TTypeRegistry;
ri : TTypeRegistryItem;
begin
r := ARegistry;
r.Register(sXSD_NS,TypeInfo(Integer),'int').AddPascalSynonym('Integer');
r.Register(sXSD_NS,TypeInfo(LongWord),'unsignedInt');
r.Register(sXSD_NS,TypeInfo(positiveInteger),'positiveInteger');
r.Register(sXSD_NS,TypeInfo(nonNegativeInteger),'nonNegativeInteger');
r.Register(sXSD_NS,TypeInfo(string),'string').AddPascalSynonym('string');
r.Register(sXSD_NS,TypeInfo(AnsiString),'ansistring').AddPascalSynonym('ansistring');
r.Register(sXSD_NS,TypeInfo(WideString),'widestring').AddPascalSynonym('widestring');
{$IFDEF WST_UNICODESTRING}
r.Register(sXSD_NS,TypeInfo(UnicodeString),'UnicodeString').AddPascalSynonym('unicodestring');
{$ENDIF WST_UNICODESTRING}
r.Register(sXSD_NS,TypeInfo(anyURI),'anyURI').AddPascalSynonym('anyURI');
r.Register(sXSD_NS,TypeInfo(anyType_Type),'anyType').AddPascalSynonym('anyType_Type');
r.Register(sXSD_NS,TypeInfo(schema_Type),'schema').AddPascalSynonym('schema_Type');
r.Register(sXSD_NS,TypeInfo(token),'token').AddPascalSynonym('token');
r.Register(sXSD_NS,TypeInfo(language),'language').AddPascalSynonym('language');
r.Register(sXSD_NS,TypeInfo(boolean),'boolean').AddPascalSynonym('boolean');
r.Register(sXSD_NS,TypeInfo(Byte),'unsignedByte').AddPascalSynonym('Byte');
r.Register(sXSD_NS,TypeInfo(ShortInt),'byte').AddPascalSynonym('ShortInt');
r.Register(sXSD_NS,TypeInfo(Word),'unsignedShort').AddPascalSynonym('Word');
r.Register(sXSD_NS,TypeInfo(SmallInt),'short').AddPascalSynonym('SmallInt');
r.Register(sXSD_NS,TypeInfo(Int64),'long').AddPascalSynonym('Int64');
r.Register(sXSD_NS,TypeInfo(QWord),'unsignedLong').AddPascalSynonym('QWord');
r.Register(sXSD_NS,TypeInfo(Single),'float').AddPascalSynonym('Single');
r.Register(sXSD_NS,TypeInfo(Currency),'float').AddPascalSynonym('Currency');
r.Register(sXSD_NS,TypeInfo(Comp),'float').AddPascalSynonym('Comp');
r.Register(sXSD_NS,TypeInfo(Double),'double').AddPascalSynonym('Double');
r.Register(sXSD_NS,TypeInfo(Extended),'decimal').AddPascalSynonym('Extended');
r.Register(sXSD_NS,TypeInfo(TDateTimeRemotable),'dateTime').AddPascalSynonym('TDateTimeRemotable');
r.Register(sXSD_NS,TypeInfo(TDateRemotable),'date').AddPascalSynonym('TDateRemotable');
{$IFDEF WST_HAS_TDURATIONREMOTABLE}
r.Register(sXSD_NS,TypeInfo(TDurationRemotable),'duration').AddPascalSynonym('TDurationRemotable');
{$ELSE WST_HAS_TDURATIONREMOTABLE}
r.Register(sXSD_NS,TypeInfo(duration),'duration').AddPascalSynonym('duration');
{$ENDIF WST_HAS_TDURATIONREMOTABLE}
{$IFDEF WST_HAS_TTIMEREMOTABLE}
r.Register(sXSD_NS,TypeInfo(TTimeRemotable),'time').AddPascalSynonym('TTimeRemotable');
{$ELSE WST_HAS_TTIMEREMOTABLE}
r.Register(sXSD_NS,TypeInfo(time),'time').AddPascalSynonym('time');
{$ENDIF WST_HAS_TTIMEREMOTABLE}
ri := r.Register(sWST_BASE_NS,TypeInfo(TBaseArrayRemotable),'TBaseArrayRemotable');
ri.Options := ri.Options + [trioNonVisibleToMetadataService];
THeaderBlock.RegisterAttributeProperty('mustUnderstand');
ri := r.Register(sSOAP_ENV,TypeInfo(THeaderBlock),'THeaderBlock');
ri.Options := ri.Options + [trioNonVisibleToMetadataService,trioQualifiedAttribute];
ri.SetPropertyOptions('mustUnderstand',[]);
ri := r.Register(sSOAP_ENV,TypeInfo(TSimpleContentHeaderBlock));
ri.Options := ri.Options + [trioNonVisibleToMetadataService,trioQualifiedAttribute];
ri := r.Register(sSOAP_ENV,TypeInfo(THeaderBlockProxy));
ri.Options := ri.Options + [trioNonVisibleToMetadataService,trioQualifiedAttribute];
r.Register(sWST_BASE_NS,TypeInfo(TArrayOfStringRemotable),'TArrayOfStringRemotable').AddPascalSynonym('TArrayOfStringRemotable');
r.Register(sWST_BASE_NS,TypeInfo(TArrayOfBooleanRemotable),'TArrayOfBooleanRemotable').AddPascalSynonym('TArrayOfBooleanRemotable');
r.Register(sWST_BASE_NS,TypeInfo(TArrayOfInt8URemotable),'TArrayOfInt8URemotable').AddPascalSynonym('TArrayOfInt8URemotable');
r.Register(sWST_BASE_NS,TypeInfo(TArrayOfInt8SRemotable),'TArrayOfInt8SRemotable').AddPascalSynonym('TArrayOfInt8SRemotable');
r.Register(sWST_BASE_NS,TypeInfo(TArrayOfInt16URemotable),'TArrayOfInt16URemotable').AddPascalSynonym('TArrayOfInt16URemotable');
r.Register(sWST_BASE_NS,TypeInfo(TArrayOfInt16SRemotable),'TArrayOfInt16SRemotable').AddPascalSynonym('TArrayOfInt16SRemotable');
r.Register(sWST_BASE_NS,TypeInfo(TArrayOfInt32URemotable),'TArrayOfInt32URemotable').AddPascalSynonym('TArrayOfInt32URemotable');
r.Register(sWST_BASE_NS,TypeInfo(TArrayOfInt32SRemotable),'TArrayOfInt32SRemotable').AddPascalSynonym('TArrayOfInt32SRemotable');
r.Register(sWST_BASE_NS,TypeInfo(TArrayOfInt64URemotable),'TArrayOfInt64URemotable').AddPascalSynonym('TArrayOfInt64URemotable');
r.Register(sWST_BASE_NS,TypeInfo(TArrayOfInt64SRemotable),'TArrayOfInt64SRemotable').AddPascalSynonym('TArrayOfInt64SRemotable');
r.Register(sWST_BASE_NS,TypeInfo(TArrayOfFloatSingleRemotable),'TArrayOfFloatSingleRemotable').AddPascalSynonym('TArrayOfFloatSingleRemotable');
r.Register(sWST_BASE_NS,TypeInfo(TArrayOfFloatDoubleRemotable),'TArrayOfFloatDoubleRemotable').AddPascalSynonym('TArrayOfFloatDoubleRemotable');
r.Register(sWST_BASE_NS,TypeInfo(TArrayOfFloatExtendedRemotable),'TArrayOfFloatExtendedRemotable').AddPascalSynonym('TArrayOfFloatExtendedRemotable');
r.Register(sWST_BASE_NS,TypeInfo(TArrayOfFloatCurrencyRemotable),'TArrayOfFloatCurrencyRemotable').AddPascalSynonym('TArrayOfFloatCurrencyRemotable');
r.Register(sXSD_NS,TypeInfo(TComplexInt64SContentRemotable),'long').AddPascalSynonym('TComplexInt64SContentRemotable');
r.Register(sXSD_NS,TypeInfo(TComplexInt64UContentRemotable),'unsignedLong').AddPascalSynonym('TComplexInt64UContentRemotable');
r.Register(sXSD_NS,TypeInfo(TComplexInt32SContentRemotable),'int').AddPascalSynonym('TComplexInt32SContentRemotable');
r.Register(sXSD_NS,TypeInfo(TComplexInt32UContentRemotable),'unsignedInt').AddPascalSynonym('TComplexInt32UContentRemotable');
r.Register(sXSD_NS,TypeInfo(TComplexInt16SContentRemotable),'short').AddPascalSynonym('TComplexInt16SContentRemotable');
r.Register(sXSD_NS,TypeInfo(TComplexInt16UContentRemotable),'unsignedShort').AddPascalSynonym('TComplexInt16UContentRemotable');
r.Register(sXSD_NS,TypeInfo(TComplexInt8SContentRemotable),'byte').AddPascalSynonym('TComplexInt8SContentRemotable');
r.Register(sXSD_NS,TypeInfo(TComplexInt8UContentRemotable),'unsignedByte').AddPascalSynonym('TComplexInt8UContentRemotable');
r.Register(sXSD_NS,TypeInfo(TComplexFloatExtendedContentRemotable),'decimal').AddPascalSynonym('TComplexFloatExtendedContentRemotable');
r.Register(sXSD_NS,TypeInfo(TComplexFloatDoubleContentRemotable),'double').AddPascalSynonym('TComplexFloatDoubleContentRemotable');
r.Register(sXSD_NS,TypeInfo(TComplexFloatSingleContentRemotable),'Single').AddPascalSynonym('TComplexFloatSingleContentRemotable');
r.Register(sXSD_NS,TypeInfo(TComplexStringContentRemotable),'string').AddPascalSynonym('TComplexStringContentRemotable');
r.Register(sXSD_NS,TypeInfo(TComplexWideStringContentRemotable),'widestring').AddPascalSynonym('TComplexWideStringContentRemotable');
{$IFDEF WST_UNICODESTRING}
r.Register(sXSD_NS,TypeInfo(TComplexUnicodeStringContentRemotable),'unicodestring').AddPascalSynonym('TComplexUnicodeStringContentRemotable');
{$ENDIF WST_UNICODESTRING}
r.Register(sXSD_NS,TypeInfo(TComplexBooleanContentRemotable),'boolean').AddPascalSynonym('TComplexBooleanContentRemotable');
r.Register(sXSD_NS,TypeInfo(TComplexAnsiCharContentRemotable),'AnsiChar').AddPascalSynonym('TComplexAnsiCharContentRemotable');
r.Register(sXSD_NS,TypeInfo(TComplexWideCharContentRemotable),'WideChar').AddPascalSynonym('TComplexWideCharContentRemotable');
r.Register(sXSD_NS,TypeInfo(TBase64StringRemotable),'base64Binary').AddPascalSynonym('TBase64StringRemotable');
r.Register(sXSD_NS,TypeInfo(TBase64StringExtRemotable),'base64Binary').AddPascalSynonym('TBase64StringExtRemotable');
r.Register(sXSD_NS,TypeInfo(TBase16StringRemotable),'hexBinary').AddPascalSynonym('TBase16StringRemotable');
r.Register(sXSD_NS,TypeInfo(TBase16StringExtRemotable),'hexBinary').AddPascalSynonym('TBase16StringExtRemotable');
end;
function GetExternalName(
const ATypeInfo : PTypeInfo;
const ARegistry : TTypeRegistry
) : string;
var
locReg : TTypeRegistry;
locRegItem : TTypeRegistryItem;
begin
if ( ARegistry = nil ) then
locReg := GetTypeRegistry()
else
locReg := ARegistry;
locRegItem := locReg.Find(ATypeInfo,False);
if ( locRegItem <> nil ) then
Result := locRegItem.DeclaredName
else
Result := ATypeInfo^.Name;
end;
procedure SetFieldSerializationVisibility(
const ATypeInfo : PTypeInfo; // must be tkRecord
const AField : shortstring;
const AVisibility : Boolean
);
var
recordData : TRecordRttiDataObject;
begin
if Assigned(ATypeInfo) and ( ATypeInfo^.Kind = tkRecord ) and
( not IsStrEmpty(AField) )
then begin
recordData := GetTypeRegistry().ItemByTypeInfo[ATypeInfo].GetObject(FIELDS_STRING) as TRecordRttiDataObject;
if Assigned(recordData) then begin
recordData.GetField(AField)^.Visible := AVisibility;
end else begin
raise EServiceConfigException.CreateFmt(SERR_RecordExtendedRttiNotFound,[ATypeInfo^.Name]);
end;
end else begin
raise EServiceConfigException.Create(SERR_InvalidParameters);
end;
end;
procedure RegisterAttributeProperty(
const ATypeInfo : PTypeInfo;
const AProperty : shortstring
);
var
ok : Boolean;
recordData : TRecordRttiDataObject;
begin
ok := False;
if Assigned(ATypeInfo) and
( not IsStrEmpty(AProperty) )
then begin
case ATypeInfo^.Kind of
tkClass :
begin
if GetTypeData(ATypeInfo)^.ClassType.InheritsFrom(TAbstractComplexRemotable) then begin
TAbstractComplexRemotableClass(GetTypeData(ATypeInfo)^.ClassType).RegisterAttributeProperty(AProperty);
ok := True;
end;
end;
tkRecord :
begin
recordData := GetTypeRegistry().ItemByTypeInfo[ATypeInfo].GetObject(FIELDS_STRING) as TRecordRttiDataObject;
if Assigned(recordData) then begin
recordData.GetField(AProperty)^.IsAttribute := True;
ok := True;
end;
end;
end;
end;
if not ok then
raise EServiceConfigException.Create(SERR_InvalidParameters);
end;
{$IFDEF FPC}
function IsStoredPropClass(AClass : TClass;PropInfo : PPropInfo) : TPropStoreType;
begin
case (PropInfo^.PropProcs shr 4) and 3 of
ptfield:
Result := pstOptional;
ptconst:
begin
if LongBool(PropInfo^.StoredProc) then
Result := pstAlways
else
Result := pstNever;
end;
ptstatic,
ptvirtual:
Result := pstOptional;
end;
end;
{$ELSE}
function IsStoredPropClass(AClass : TClass;PropInfo : PPropInfo) : TPropStoreType;
{var
b : PByte;
begin
if ( ( PropInfo^.StoredProc and $0FFFFFF00 ) = 0 ) then begin
if LongBool(PropInfo^.StoredProc) then // constante
Result := pstAlways
else
Result := pstNever;
end else begin
b := PByte(PropInfo^.StoredProc);
Inc(b,3);
if ( b^ < $FE ) then begin //StaticMethod
Result := pstOptional;
end else ( b^ > $FE ) begin Field
end else begin // virtual method
end;
end;
end;}
begin
if ( ( Cardinal(PropInfo^.StoredProc) and $0FFFFFF00 ) = 0 ) then begin
if LongBool(PropInfo^.StoredProc) then begin
Result := pstAlways
end else begin
Result := pstNever;
end;
end else begin
Result := pstOptional;
end;
end;
{$ENDIF}
{ TBaseRemotable }
constructor TBaseRemotable.Create();
begin
end;
destructor TBaseRemotable.Destroy();
begin
FreeObjectProperties();
inherited Destroy();
end;
procedure TBaseRemotable.FreeObjectProperties();
begin
//Derived classes should override this method to free their object(s) and array(s).
end;
function TBaseRemotable.Equal(const ACompareTo : TBaseRemotable) : Boolean;
begin
Result := ( Self = ACompareTo );
end;
function TBaseRemotable.wstHasValue() : Boolean;
begin
Result := True;
end;
{ TBaseComplexRemotable }
Type
{ TSerializeOptions }
TSerializeOptions = class
private
FAttributeFieldList : TStringList;
private
FElementClass: TAbstractComplexRemotableClass;
procedure AddAttributeField(const AAttributeField : string);
function GetAttributeCount: Integer;
function GetAttributeField(AIndex : Integer): string;
public
constructor Create(const AElementClass : TAbstractComplexRemotableClass);
destructor Destroy();override;
function IsAttributeField(const AField : string):Boolean;
property ElementClass : TAbstractComplexRemotableClass read FElementClass;
property AttributeFieldCount : Integer read GetAttributeCount;
property AttributeField[AIndex : Integer] : string read GetAttributeField;
end;
{ TSerializeOptionsRegistry }
TSerializeOptionsRegistry = class
private
FList : TObjectList;
private
function GetCount: Integer;
function GetItem(AIndex : Integer): TSerializeOptions;
function IndexOf(const AElementClass : TAbstractComplexRemotableClass):Integer;
public
constructor Create();
destructor Destroy();override;
function RegisterClass(const AElementClass : TAbstractComplexRemotableClass):TSerializeOptions;
function Find(const AElementClass : TAbstractComplexRemotableClass):TSerializeOptions;
property Count : Integer read GetCount;
property Item[AIndex : Integer] : TSerializeOptions read GetItem;
end;
var
SerializeOptionsRegistryInstance : TSerializeOptionsRegistry = nil;
function GetSerializeOptionsRegistry():TSerializeOptionsRegistry;
begin
if not Assigned(SerializeOptionsRegistryInstance) then
SerializeOptionsRegistryInstance := TSerializeOptionsRegistry.Create();
Result := SerializeOptionsRegistryInstance;
end;
{ TSerializeOptionsRegistry }
function TSerializeOptionsRegistry.GetCount: Integer;
begin
Result := FList.Count;
end;
function TSerializeOptionsRegistry.GetItem(AIndex : Integer): TSerializeOptions;
begin
Result := FList[AIndex] as TSerializeOptions;
end;
function TSerializeOptionsRegistry.IndexOf(
const AElementClass: TAbstractComplexRemotableClass
): Integer;
begin
for Result := 0 to Pred(Count) do begin
if ( Item[Result].ElementClass = AElementClass ) then
Exit;
end;
Result := -1;
end;
constructor TSerializeOptionsRegistry.Create();
begin
FList := TObjectList.Create(True);
end;
destructor TSerializeOptionsRegistry.Destroy();
begin
FreeAndNil(FList);
inherited Destroy();
end;
function TSerializeOptionsRegistry.RegisterClass(
const AElementClass: TAbstractComplexRemotableClass
): TSerializeOptions;
var
i, j, k, c : Integer;
ri : TSerializeOptions;
begin
i := IndexOf(AElementClass);
if ( i < 0 ) then begin
c := FList.Count;
i := FList.Add(TSerializeOptions.Create(AElementClass));
Result := FList[i] as TSerializeOptions;
for j := 0 to Pred(c) do begin
ri := FList[j] as TSerializeOptions;
if AElementClass.InheritsFrom(ri.ElementClass) then begin
for k := 0 to Pred(ri.AttributeFieldCount) do begin
Result.FAttributeFieldList.Add(ri.FAttributeFieldList[k]);
end;
end;
end;
end;
Result := FList[i] as TSerializeOptions;
end;
function TSerializeOptionsRegistry.Find(const AElementClass: TAbstractComplexRemotableClass): TSerializeOptions;
var
i : Integer;
begin
i := IndexOf(AElementClass);
if ( i >= 0 ) then
Result := FList[i] as TSerializeOptions
else
Result := nil;
end;
{ TSerializeOptions }
procedure TSerializeOptions.AddAttributeField(const AAttributeField: string);
begin
if ( FAttributeFieldList.IndexOf(AAttributeField) < 0 ) then
FAttributeFieldList.Add(AAttributeField);
end;
function TSerializeOptions.GetAttributeCount: Integer;
begin
Result := FAttributeFieldList.Count;
end;
function TSerializeOptions.GetAttributeField(AIndex : Integer): string;
begin
Result := FAttributeFieldList[AIndex];
end;
constructor TSerializeOptions.Create(const AElementClass: TAbstractComplexRemotableClass);
begin
FElementClass := AElementClass;
FAttributeFieldList := TStringList.Create();
FAttributeFieldList.Duplicates := dupIgnore;
FAttributeFieldList.Sorted := True;
end;
destructor TSerializeOptions.Destroy();
begin
FreeAndNil(FAttributeFieldList);
inherited Destroy();
end;
function TSerializeOptions.IsAttributeField(const AField: string): Boolean;
begin
Result := ( FAttributeFieldList.IndexOf(AField) >= 0 );
end;
class procedure TBaseComplexRemotable.Save(
AObject : TBaseRemotable;
AStore : IFormatterBase;
const AName : String;
const ATypeInfo : PTypeInfo
);
{$IFDEF USE_SERIALIZE}
var
locSerializer : TObjectSerializer;
begin
locSerializer := TBaseComplexTypeRegistryItem(GetTypeRegistry().ItemByTypeInfo[ATypeInfo]).GetSerializer();
if ( locSerializer <> nil ) then
locSerializer.Save(AObject,AStore,AName,ATypeInfo)
else
raise ETypeRegistryException.CreateFmt(SERR_NoSerializerFoThisType,[ATypeInfo^.Name])
end;
{$ELSE USE_SERIALIZE}
Var
propList : PPropList;
i, propCount, propListLen : Integer;
pt : PTypeInfo;
int64Data : Int64;
strData : String;
objData : TObject;
boolData : Boolean;
enumData : TEnumBuffer;
floatDt : TFloatBuffer;
p : PPropInfo;
oldSS,ss : TSerializationStyle;
typRegItem : TTypeRegistryItem;
prpName : string;
begin
oldSS := AStore.GetSerializationStyle();
AStore.BeginObject(AName,ATypeInfo);
try
if not Assigned(AObject) then begin
AStore.NilCurrentScope();
Exit;
end;
propCount := GetTypeData(ATypeInfo)^.PropCount;
if ( propCount > 0 ) then begin
propListLen := GetPropList(ATypeInfo,propList);
try
ss := AStore.GetSerializationStyle();
typRegItem := GetTypeRegistry().ItemByTypeInfo[ATypeInfo];
for i := 0 to Pred(propCount) do begin
p := propList^[i];
pt := p^.PropType{$IFDEF WST_DELPHI}^{$ENDIF};
if IsStoredProp(AObject,p) then begin
if IsAttributeProperty(p^.Name) then begin
if ( ss <> ssAttibuteSerialization ) then
ss := ssAttibuteSerialization;
end else begin
if ( ss <> ssNodeSerialization ) then
ss := ssNodeSerialization;
end;
if ( ss <> AStore.GetSerializationStyle() ) then
AStore.SetSerializationStyle(ss);
prpName := typRegItem.GetExternalPropertyName(p^.Name);
case pt^.Kind of
tkInt64{$IFDEF HAS_QWORD},tkQWord{$ENDIF} :
begin
int64Data := GetInt64Prop(AObject,p^.Name);
AStore.Put(prpName,pt,int64Data);
end;
tkLString{$IFDEF FPC},tkAString{$ENDIF} :
begin
strData := GetStrProp(AObject,p^.Name);
AStore.Put(prpName,pt,strData);
end;
tkClass :
begin
objData := GetObjectProp(AObject,p^.Name);
AStore.Put(prpName,pt,objData);
end;
{$IFDEF HAS_TKBOOL}
tkBool :
begin
boolData := Boolean(GetOrdProp(AObject,p^.Name));
AStore.Put(prpName,pt,boolData);
end;
{$ENDIF}
tkEnumeration,tkInteger :
begin
{$IFDEF WST_DELPHI}
if ( pt^.Kind = tkEnumeration ) and
( GetTypeData(pt)^.BaseType^ = TypeInfo(Boolean) )
then begin
boolData := Boolean(GetOrdProp(AObject,p^.Name));
AStore.Put(prpName,pt,boolData);
end else begin
{$ENDIF}
FillChar(enumData,SizeOf(enumData),#0);
case GetTypeData(pt)^.OrdType of
otSByte :
begin
enumData.ShortIntData := ShortInt(GetOrdProp(AObject,p^.Name));
AStore.Put(prpName,pt,enumData.ShortIntData);
end;
otUByte :
begin
enumData.ByteData := Byte(GetOrdProp(AObject,p^.Name));
AStore.Put(prpName,pt,enumData.ByteData);
end;
otSWord :
begin
enumData.SmallIntData := SmallInt(GetOrdProp(AObject,p^.Name));
AStore.Put(prpName,pt,enumData.SmallIntData);
end;
otUWord :
begin
enumData.WordData := Word(GetOrdProp(AObject,p^.Name));
AStore.Put(prpName,pt,enumData.WordData);
end;
otSLong :
begin
enumData.SLongIntData := LongInt(GetOrdProp(AObject,p^.Name));
AStore.Put(prpName,pt,enumData.SLongIntData);
end;
otULong :
begin
enumData.ULongIntData := LongWord(GetOrdProp(AObject,p^.Name));
AStore.Put(prpName,pt,enumData.ULongIntData);
end;
end;
{$IFDEF WST_DELPHI}
end;
{$ENDIF}
end;
tkFloat :
begin
FillChar(floatDt,SizeOf(floatDt),#0);
case GetTypeData(pt)^.FloatType of
ftSingle :
begin
floatDt.SingleData := GetFloatProp(AObject,p^.Name);
AStore.Put(prpName,pt,floatDt.SingleData);
end;
ftDouble :
begin
floatDt.DoubleData := GetFloatProp(AObject,p^.Name);
AStore.Put(prpName,pt,floatDt.DoubleData);
end;
ftExtended :
begin
floatDt.ExtendedData := Extended(GetFloatProp(AObject,p^.Name));
AStore.Put(prpName,pt,floatDt.ExtendedData);
end;
ftCurr :
begin
floatDt.CurrencyData := GetFloatProp(AObject,p^.Name);
AStore.Put(prpName,pt,floatDt.CurrencyData);
end;
{$IFDEF HAS_COMP}
ftComp :
begin
floatDt.CompData := GetFloatProp(AObject,p^.Name);
AStore.Put(prpName,pt,floatDt.CompData);
end;
{$ENDIF}
end;
end;
end;
end;
end;
finally
Freemem(propList,propListLen*SizeOf(Pointer));
end;
end;
finally
AStore.EndScope();
AStore.SetSerializationStyle(oldSS);
end;
end;
{$ENDIF USE_SERIALIZE}
Type
TFloatExtendedType = Extended;
class procedure TBaseComplexRemotable.Load(
Var AObject : TObject;
AStore : IFormatterBase;
var AName : String;
const ATypeInfo : PTypeInfo
);
{$IFDEF USE_SERIALIZE}
var
locSerializer : TObjectSerializer;
begin
locSerializer := TBaseComplexTypeRegistryItem(GetTypeRegistry().ItemByTypeInfo[ATypeInfo]).GetSerializer();
if ( locSerializer <> nil ) then
locSerializer.Read(AObject,AStore,AName,ATypeInfo)
else
raise ETypeRegistryException.CreateFmt(SERR_NoSerializerFoThisType,[ATypeInfo^.Name])
end;
{$ELSE USE_SERIALIZE}
Var
propList : PPropList;
i, propCount, propListLen : Integer;
pt : PTypeInfo;
propName : String;
int64Data : Int64;
strData : String;
objData : TObject;
objDataCreateHere : Boolean;
boolData : Boolean;
p : PPropInfo;
enumData : TEnumBuffer;
floatDt : TFloatExtendedType;
floatBuffer : TFloatBuffer;
persistType : TPropStoreType;
objTypeData : PTypeData;
oldSS,ss : TSerializationStyle;
typRegItem : TTypeRegistryItem;
begin
oldSS := AStore.GetSerializationStyle();
if ( AStore.BeginObjectRead(AName,ATypeInfo) >= 0 ) then begin
try
if AStore.IsCurrentScopeNil() then
Exit; // ???? FreeAndNil(AObject);
If Not Assigned(AObject) Then
AObject := Create();
objTypeData := GetTypeData(ATypeInfo);
propCount := objTypeData^.PropCount;
If ( propCount > 0 ) Then Begin
propListLen := GetPropList(ATypeInfo,propList);
Try
typRegItem := GetTypeRegistry().ItemByTypeInfo[ATypeInfo];
For i := 0 To Pred(propCount) Do Begin
p := propList^[i];
persistType := IsStoredPropClass(objTypeData^.ClassType,p);
If ( persistType in [pstOptional,pstAlways] ) Then Begin
pt := p^.PropType{$IFDEF WST_DELPHI}^{$ENDIF};
propName := typRegItem.GetExternalPropertyName(p^.Name);
if IsAttributeProperty(p^.Name) then begin
ss := ssAttibuteSerialization;
end else begin
ss := ssNodeSerialization;
end;
if ( ss <> AStore.GetSerializationStyle() ) then
AStore.SetSerializationStyle(ss);
try
Case pt^.Kind Of
tkInt64{$IFDEF HAS_QWORD},tkQWord{$ENDIF} :
begin
AStore.Get(pt,propName,int64Data);
SetInt64Prop(AObject,p^.Name,int64Data);
end;
tkLString{$IFDEF FPC}, tkAString{$ENDIF} :
Begin
AStore.Get(pt,propName,strData);
SetStrProp(AObject,p^.Name,strData);
End;
{$IFDEF HAS_TKBOOL}
tkBool :
Begin
AStore.Get(pt,propName,boolData);
SetOrdProp(AObject,p^.Name,Ord(boolData));
End;
{$ENDIF}
tkClass :
Begin
objData := GetObjectProp(AObject,p^.Name);
objDataCreateHere := not Assigned(objData);
try
AStore.Get(pt,propName,objData);
if objDataCreateHere then
SetObjectProp(AObject,p^.Name,objData);
finally
if objDataCreateHere and ( objData <> GetObjectProp(AObject,p^.Name) ) then
FreeAndNil(objData);
end;
End;
tkEnumeration,tkInteger :
Begin
{$IFDEF WST_DELPHI}
if ( pt^.Kind = tkEnumeration ) and
( GetTypeData(pt)^.BaseType^ = TypeInfo(Boolean) )
then begin
AStore.Get(pt,propName,boolData);
SetPropValue(AObject,p^.Name,boolData);
end else begin
{$ENDIF}
FillChar(enumData,SizeOf(enumData),#0);
Case GetTypeData(pt)^.OrdType Of
otSByte :
Begin
AStore.Get(pt,propName,enumData.ShortIntData);
int64Data := enumData.ShortIntData;
End;
otUByte :
Begin
AStore.Get(pt,propName,enumData.ByteData);
int64Data := enumData.ByteData;
End;
otSWord :
Begin
AStore.Get(pt,propName,enumData.SmallIntData);
int64Data := enumData.SmallIntData;
End;
otUWord :
Begin
AStore.Get(pt,propName,enumData.WordData);
int64Data := enumData.WordData;
End;
otSLong:
Begin
AStore.Get(pt,propName,enumData.SLongIntData);
int64Data := enumData.SLongIntData;
End;
otULong :
Begin
AStore.Get(pt,propName,enumData.ULongIntData);
int64Data := enumData.ULongIntData;
End;
End;
SetOrdProp(AObject,p^.Name,int64Data);
{$IFDEF WST_DELPHI}
end;
{$ENDIF}
End;
tkFloat :
Begin
FillChar(floatDt,SizeOf(floatBuffer),#0);
Case GetTypeData(pt)^.FloatType Of
ftSingle :
Begin
AStore.Get(pt,propName,floatBuffer.SingleData);
floatDt := floatBuffer.SingleData;
End;
ftDouble :
Begin
AStore.Get(pt,propName,floatBuffer.DoubleData);
floatDt := floatBuffer.DoubleData;
End;
ftExtended :
Begin
AStore.Get(pt,propName,floatBuffer.ExtendedData);
floatDt := floatBuffer.ExtendedData;
End;
ftCurr :
Begin
AStore.Get(pt,propName,floatBuffer.CurrencyData);
floatDt := floatBuffer.CurrencyData;
End;
ftComp :
Begin
AStore.Get(pt,propName,floatBuffer.CompData);
floatDt := floatBuffer.CompData;
End;
End;
SetFloatProp(AObject,p^.Name,floatDt);
End;
End;
except
on E : EServiceException do begin
if ( persistType = pstAlways ) then
raise;
end;
end;
End;
End;
Finally
Freemem(propList,propListLen*SizeOf(Pointer));
End;
End;
finally
AStore.EndScopeRead();
AStore.SetSerializationStyle(oldSS);
end;
end;
end;
{$ENDIF USE_SERIALIZE}
{ TBaseObjectArrayRemotable }
function TBaseObjectArrayRemotable.GetItem(AIndex: Integer): TBaseRemotable;
begin
CheckIndex(AIndex);
Result := FArray[AIndex];
end;
function TBaseObjectArrayRemotable.GetLength(): Integer;
begin
Result := System.Length(FArray);
end;
class procedure TBaseObjectArrayRemotable.Save(
AObject : TBaseRemotable;
AStore : IFormatterBase;
const AName : String;
const ATypeInfo : PTypeInfo
);
Var
itmTypInfo : PTypeInfo;
i, arrayLen : Integer;
nativObj : TBaseObjectArrayRemotable;
itm : TObject;
itmName : string;
styl : TArrayStyle;
begin
if ( AObject <> nil ) then begin
Assert(AObject.InheritsFrom(TBaseObjectArrayRemotable));
nativObj := AObject as TBaseObjectArrayRemotable;
arrayLen := nativObj.Length;
styl := GetStyle();
if ( arrayLen > 0 ) then begin
itmTypInfo := PTypeInfo(GetItemClass().ClassInfo);
AStore.BeginArray(AName,PTypeInfo(Self.ClassInfo),itmTypInfo,[0,Pred(arrayLen)],styl);
try
if ( styl = asScoped ) then begin
itmName := GetItemName();
end else begin
itmName := AName;
end;
for i := 0 to Pred(arrayLen) do begin
itm := nativObj.Item[i];
AStore.Put(itmName,itmTypInfo,itm);
end;
finally
AStore.EndScope();
end;
end else if ( styl = asScoped ) and ( ioAlwaysSerialize in nativObj.Options ) then begin
AStore.BeginArray(
AName, PTypeInfo(Self.ClassInfo),
PTypeInfo(GetItemClass().ClassInfo),[0,-1],styl
);
try
AStore.NilCurrentScope();
finally
AStore.EndScope();
end;
end;
end;
end;
class procedure TBaseObjectArrayRemotable.Load(
var AObject : TObject;
AStore : IFormatterBase;
var AName : String;
const ATypeInfo : PTypeInfo
);
Var
i, len : Integer;
nativObj : TBaseObjectArrayRemotable;
s : string;
itmTypInfo : PTypeInfo;
itm : TBaseRemotable;
itmName : string;
styl : TArrayStyle;
begin
styl := GetStyle();
if ( styl = asScoped ) then begin
itmName := GetItemName();
end else begin
itmName := AName;
end;
if (AObject = nil) then
AObject := Create();
len := AStore.BeginArrayRead(AName,ATypeInfo,styl,itmName);
if ( len >= 0 ) then begin
Try
itmTypInfo := PTypeInfo(GetItemClass().ClassInfo);
nativObj := AObject as TBaseObjectArrayRemotable;
If ( len > 0 ) Then Begin
s := '';
nativObj.SetLength(len);
For i := 0 To Pred(len) Do Begin
itm := nativObj[i];
AStore.Get(itmTypInfo,s,itm);
End;
End;
Finally
AStore.EndScopeRead();
End;
end else begin
if ( AObject <> nil ) then
(AObject as TBaseObjectArrayRemotable).SetLength(0);
end;
end;
class function TBaseObjectArrayRemotable.GetItemTypeInfo(): PTypeInfo;
begin
Result:= GetItemClass().ClassInfo;
end;
constructor TBaseObjectArrayRemotable.Create();
begin
FArray := Nil;
end;
procedure TBaseObjectArrayRemotable.Assign(Source: TPersistent);
var
src : TBaseObjectArrayRemotable;
i, c : Integer;
begin
if Assigned(Source) then begin
if Source.InheritsFrom(TBaseObjectArrayRemotable) then begin
src := TBaseObjectArrayRemotable(Source);
c := src.Length;
SetLength(c);
for i := 0 to Pred(c) do begin
Item[i].Assign(src.Item[i]);
end;
end else begin
inherited Assign(Source);
end;
end else begin
SetLength(0);
end;
end;
function TBaseObjectArrayRemotable.Equal(const ACompareTo : TBaseRemotable) : Boolean;
var
i, c : Integer;
dst : TBaseObjectArrayRemotable;
begin
if ( Self = ACompareTo ) then begin
Result := True;
end else begin
Result := ( Assigned(ACompareTo) and
ACompareTo.InheritsFrom(TBaseObjectArrayRemotable) and
( Self.Length = TBaseObjectArrayRemotable(ACompareTo).Length ) and
( TBaseObjectArrayRemotable(ACompareTo).GetItemClass().InheritsFrom(Self.GetItemClass()) )
) ;
if Result and ( Self.Length > 0 ) then begin
dst := TBaseObjectArrayRemotable(ACompareTo);
c := Self.Length;
for i := 0 to Pred(c) do begin
if not Self.Item[i].Equal(dst.Item[i]) then begin
Result := False;
Break;
end;
end;
end;
end;
end;
procedure TBaseObjectArrayRemotable.SetLength(const ANewSize: Integer);
var
i,oldLen : Integer;
itmClss : TBaseRemotableClass;
begin
oldLen := GetLength;
if ( oldLen = ANewSize ) then
Exit;
if ( ANewSize < 0 ) then
raise EBaseRemoteException.CreateFmt(SERR_InvalidArrayLength,[ANewSize]);
if ( oldLen > ANewSize ) then begin
for i := ANewSize to Pred(oldLen) do
FreeAndNil(FArray[i]);
System.SetLength(FArray,ANewSize);
end else begin
System.SetLength(FArray,ANewSize);
itmClss := GetItemClass();
for i := oldLen to Pred(ANewSize) do
FArray[i] := itmClss.Create();
end;
end;
procedure TBaseObjectArrayRemotable.Exchange(const Index1, Index2: Integer);
var
tmp : TBaseRemotable;
begin
if ( Index1 <> Index2 ) then begin
CheckIndex(Index1);
CheckIndex(Index2);
tmp := FArray[Index1];
FArray[Index1] := FArray[Index2];
FArray[Index2] := tmp;
end;
end;
{ TBaseFactoryRegistryItem }
constructor TBaseFactoryRegistryItem.Create(
const AName : string;
const AFactory : IItemFactory
);
begin
Assert(Assigned(AFactory));
FName := AName;
FFactory := AFactory;
end;
destructor TBaseFactoryRegistryItem.Destroy();
begin
FName := '';
FFactory := nil;
inherited Destroy();
end;
function TBaseFactoryRegistry.GetCount: Integer;
begin
Result := FList.Count;
end;
function TBaseFactoryRegistry.GetItem(Index: Integer): TBaseFactoryRegistryItem;
begin
Result := FList[Index] as TBaseFactoryRegistryItem;
end;
{ TBaseFactoryRegistry }
function TBaseFactoryRegistry.FindFactory(const AName: string): IItemFactory;
Var
i , c : Integer;
s : string;
begin
s := LowerCase(Trim(AName));
c := Pred(FList.Count);
For i := 0 To c Do Begin
If AnsiSameText(TBaseFactoryRegistryItem(FList[i]).Name,s) Then Begin
Result := TBaseFactoryRegistryItem(FList[i]).Factory;
Exit;
End;
End;
Result := Nil;
end;
procedure TBaseFactoryRegistry.Register(
const AName : string;
AFactory : IItemFactory
);
begin
Assert(Assigned(AFactory));
If Not Assigned(FindFactory(AName)) Then
FList.Add(TBaseFactoryRegistryItem.Create(AName,AFactory));
end;
constructor TBaseFactoryRegistry.Create();
begin
inherited Create();
FList := TObjectList.Create(True);
end;
destructor TBaseFactoryRegistry.Destroy();
begin
FList.Free();
inherited Destroy();
end;
{ TSimpleItemFactory }
function TSimpleItemFactory.CreateInstance(): IInterface;
begin
Result := FItemClass.Create() as IInterface;
end;
function TSimpleItemFactory.GetItemClass(): TSimpleFactoryItemClass;
begin
Result := FItemClass;
end;
constructor TSimpleItemFactory.Create(AItemClass: TSimpleFactoryItemClass);
begin
if not Assigned(AItemClass) then
raise EServiceConfigException.CreateFmt(SERR_InvalidParameterProc,['AItemClass','TSimpleItemFactory.Create()']);
FItemClass := AItemClass;
end;
{ TSimpleItemFactoryEx }
procedure TSimpleItemFactoryEx.PreparePool();
begin
if ( FPool = nil ) then begin
FPool := TIntfPool.Create(PoolMin,PoolMax,TSimpleItemFactory.Create(FItemClass));
end;
end;
procedure TSimpleItemFactoryEx.SetPooled(const AValue: Boolean);
begin
if ( FPooled = AValue ) then
Exit;
FreeAndNil(FPool);
if AValue then begin
if ( PoolMin < 0 ) or ( PoolMin > PoolMax ) or ( PoolMax < 1 ) then
raise EServiceException.CreateFmt(SERR_InvalidPoolParametersArgs,[PoolMin,PoolMax]);
PreparePool();
end;
FPooled := AValue;
end;
procedure TSimpleItemFactoryEx.SetPoolMax(const AValue: Integer);
begin
if ( FPoolMax = AValue ) then
Exit;
if Pooled then
raise EServiceException.Create(SERR_OperationNotAllowedOnActivePool);
FPoolMax := AValue;
end;
procedure TSimpleItemFactoryEx.SetPoolMin(const AValue: Integer);
begin
if ( FPoolMin = AValue ) then
Exit;
if Pooled then
raise EServiceException.Create(SERR_OperationNotAllowedOnActivePool);
FPoolMin := AValue;
end;
function TSimpleItemFactoryEx.CreateInstance(): IInterface;
begin
if Pooled then begin
Result := FPool.Get(TimeOut);
end else begin
Result := inherited CreateInstance();
end;
end;
procedure TSimpleItemFactoryEx.ReleaseInstance(const AInstance : IInterface);
begin
if Pooled then begin
FPool.Release(AInstance);
end;
end;
procedure TSimpleItemFactoryEx.DiscardInstance(const AInstance : IInterface);
begin
if Pooled then
FPool.Discard(AInstance);
end;
function TSimpleItemFactoryEx.GetPropertyManager(
const APropertyGroup : string;
const ACreateIfNotExists : Boolean
):IPropertyManager;
var
i : Integer;
s : string;
begin
Result := nil;
s := Trim(APropertyGroup);
i := FPropertyNames.IndexOf(s);
if ( i < 0 ) then begin
if not ACreateIfNotExists then
Exit;
i := FPropertyNames.Add(s);
if ( s = '' ) then
FProperties.Add(TPublishedPropertyManager.Create(Self))
else
FProperties.Add(TStoredPropertyManager.Create());
end;
Result := FProperties.Get(i) as IPropertyManager;
end;
constructor TSimpleItemFactoryEx.Create(
AItemClass : TSimpleFactoryItemClass;
const APropsString : string
);
begin
inherited Create(AItemClass);
FPropertyNames := TStringList.Create();
FProperties := TInterfaceList.Create();
if ( Length(APropsString) > 0 ) then begin
GetPropertyManager('',True).SetProperties(APropsString);
end;
end;
constructor TSimpleItemFactoryEx.Create(AItemClass: TSimpleFactoryItemClass);
begin
Create(AItemClass,'');
end;
destructor TSimpleItemFactoryEx.Destroy();
begin
FreeAndNil(FPropertyNames);
FProperties := nil;
FreeAndNil(FPool);
inherited Destroy();
end;
{ TSimpleFactoryItem }
constructor TSimpleFactoryItem.Create();
begin
end;
{ TSimpleCallContext }
procedure TSimpleCallContext.Clear();
begin
FHeaderList.Clear();
FFreeObjectList.Clear();;
end;
procedure TSimpleCallContext.AddObjectToFree(const AObject: TObject);
begin
if ( FFreeObjectList.IndexOf(AObject) < 0 ) then
FFreeObjectList.Add(AObject);
end;
function TSimpleCallContext.AddHeader(
const AHeader: THeaderBlock;
const AKeepOwnership: Boolean
): Integer;
begin
Result := FHeaderList.IndexOf(AHeader);
if ( Result = -1 ) then
Result := FHeaderList.Add(AHeader);
if AKeepOwnership then
AddObjectToFree(AHeader);
end;
function TSimpleCallContext.AddHeader(
const AHeader : TBaseRemotable;
const AKeepOwnership : Boolean;
const AName : string = ''
) : Integer;
var
locProxy : THeaderBlockProxy;
begin
if ( AHeader <> nil ) then begin
if AHeader.InheritsFrom(THeaderBlock) then begin
if not IsStrEmpty(AName) then
THeaderBlock(AHeader).Name := AName;
Result := AddHeader(THeaderBlock(AHeader),AKeepOwnership);
end else begin
locProxy := THeaderBlockProxy.Create();
locProxy.ActualObject := AHeader;
locProxy.OwnObject := AKeepOwnership;
if not IsStrEmpty(AName) then
locProxy.Name := AName;
Result := AddHeader(locProxy,True);
end;
end else begin
locProxy := THeaderBlockProxy.Create();
if not IsStrEmpty(AName) then
locProxy.Name := AName;
Result := AddHeader(locProxy,True);
end;
end;
function TSimpleCallContext.GetHeaderCount(const ADirections : THeaderDirections):Integer;
var
i : Integer;
begin
if ( ADirections = [Low(THeaderDirection)..High(THeaderDirection)] ) then
Result := FHeaderList.Count
else begin
Result := 0;
for i := 0 to Pred(FHeaderList.Count) do begin
if ( THeaderBlock(FHeaderList[i]).Direction in ADirections ) then
Inc(Result);
end;
end;
end;
function TSimpleCallContext.GetHeader(const AIndex: Integer): THeaderBlock;
begin
Result := FHeaderList[AIndex] as THeaderBlock;
end;
procedure TSimpleCallContext.ClearHeaders(const ADirection: THeaderDirection);
var
i, c : Integer;
h : THeaderBlock;
fl : TObjectList;
begin
c := FHeaderList.Count;
if ( c > 0 ) then begin
fl := TObjectList.Create(False);
try
for i := 0 to Pred(c) do begin
h := FHeaderList[i] as THeaderBlock;
if ( h.Direction = ADirection ) then
fl.Add(h);
end;
for i := 0 to Pred(fl.Count) do
FreeHeader(fl[i] as THeaderBlock);
finally
fl.Free();
end;
end;
end;
procedure TSimpleCallContext.FreeHeader(AHeader: THeaderBlock);
begin
if Assigned(AHeader) then begin
if ( FHeaderList.IndexOf(AHeader) >= 0 ) then
FHeaderList.Remove(AHeader);
if ( FFreeObjectList.IndexOf(AHeader) >= 0 ) then
FHeaderList.Remove(AHeader)
else
AHeader.Free();
end;
end;
function TSimpleCallContext.GetPropertyManager(): IPropertyManager;
begin
Result := FPropertyManager;
end;
constructor TSimpleCallContext.Create();
begin
FHeaderList := TObjectList.Create(False);
FFreeObjectList := TObjectList.Create(True);
FPropertyManager := TStoredPropertyManager.Create();
end;
destructor TSimpleCallContext.Destroy();
begin
FreeAndNil(FHeaderList);
FreeAndNil(FFreeObjectList);
inherited Destroy();
end;
{ TTypeRegistryItem }
procedure TTypeRegistryItem.SetOptions(AValue: TTypeRegistryItemOptions);
begin
if (FOptions = AValue) then
Exit;
FOptions := AValue;
Init();
end;
procedure TTypeRegistryItem.Init();
begin
end;
function TTypeRegistryItem.IndexOfProp(
const AName: string;
const ANameType : TPropertyNameType
) : Integer;
var
i : Integer;
locName : string;
begin
Result := -1;
if ( FProperties <> nil ) and ( FProperties.Count > 0 ) then begin
locName := LowerCase(AName);
if ( ANameType = pntInternalName ) then begin
for i := 0 to Pred(FProperties.Count) do begin
if ( locName = LowerCase(TPropertyItem(FProperties[i]).InternalName) ) then begin
Result := i;
Break;
end;
end;
end else begin
for i := 0 to Pred(FProperties.Count) do begin
if ( locName = LowerCase(TPropertyItem(FProperties[i]).ExternalName) ) then begin
Result := i;
Break;
end;
end;
end;
end;
end;
function TTypeRegistryItem.FindProperty(
const AName: string;
const ANameType : TPropertyNameType
) : TPropertyItem;
var
i : Integer;
begin
i := IndexOfProp(AName,ANameType);
if ( i = -1 ) then
Result := nil
else
Result := TPropertyItem(FProperties[i]);
end;
constructor TTypeRegistryItem.Create(AOwner: TTypeRegistry; ANameSpace: string;
ADataType: PTypeInfo; const ADeclaredName: string);
begin
FOwner := AOwner;
FNameSpace := ANameSpace;
FDataType := ADataType;
FDeclaredName := Trim(ADeclaredName);
If ( Length(FDeclaredName) = 0 ) Then
FDeclaredName := FDataType^.Name;
end;
destructor TTypeRegistryItem.Destroy();
begin
FreeAndNil(FProperties);
FPascalSynonyms.Free();
FExternalSynonyms.Free();
inherited Destroy();
end;
function TTypeRegistryItem.AddPascalSynonym(const ASynonym: string):TTypeRegistryItem;
begin
Result := Self;
if AnsiSameText(ASynonym,DataType^.Name) then
Exit;
if not Assigned(FPascalSynonyms) then begin
FPascalSynonyms := TStringList.Create();
FPascalSynonyms.Add(FDataType^.Name);
end;
if ( FPascalSynonyms.IndexOf(ASynonym) = -1 ) then
FPascalSynonyms.Add(AnsiLowerCase(ASynonym));
end;
function TTypeRegistryItem.AddExternalSynonym(const ASynonym: string): TTypeRegistryItem;
begin
Result := Self;
if AnsiSameText(ASynonym,DataType^.Name) then
Exit;
if not Assigned(FExternalSynonyms) then begin
FExternalSynonyms := TStringList.Create();
FExternalSynonyms.Add(Self.DeclaredName);
end;
if ( FExternalSynonyms.IndexOf(ASynonym) = -1 ) then
FExternalSynonyms.Add(AnsiLowerCase(ASynonym));
end;
function TTypeRegistryItem.IsSynonym(const APascalTypeName: string): Boolean;
begin
Result := AnsiSameText(APascalTypeName,DataType^.Name);
if ( not Result ) and Assigned(FPascalSynonyms) then
Result := ( FPascalSynonyms.IndexOf(APascalTypeName) >= 0 ) ;
end;
function TTypeRegistryItem.IsExternalSynonym(const AExternalName: string): Boolean;
begin
Result := AnsiSameText(AExternalName,Self.DeclaredName);
if ( not Result ) and Assigned(FExternalSynonyms) then
Result := ( FExternalSynonyms.IndexOf(AExternalName) >= 0 ) ;
end;
procedure TTypeRegistryItem.RegisterExternalPropertyName(const APropName,AExtPropName: string);
var
i : Integer;
po : TPropertyItem;
begin
i := IndexOfProp(APropName,pntInternalName);
if ( i = -1 ) then begin
if ( FProperties = nil ) then
FProperties := TObjectList.Create(True);
po := TPropertyItem.Create();
FProperties.Add(po);
po.FInternalName := APropName;
//po.FOptions := Self.DefaultPropertyOptions;
end else begin
po := TPropertyItem(FProperties[i]);
end;
po.FExternalName := AExtPropName;
end;
procedure TTypeRegistryItem.RegisterObject(const APropName : string; const AObject : TObject);
var
i : Integer;
begin
i := IndexOfProp(APropName,pntInternalName);
if ( i = -1 ) then begin
RegisterExternalPropertyName(APropName,APropName);
i := IndexOfProp(APropName,pntInternalName);
end;
TPropertyItem(FProperties[i]).FExtObject := AObject;
end;
function TTypeRegistryItem.GetObject(const APropName : string) : TObject;
var
p : TPropertyItem;
begin
p := FindProperty(APropName,pntInternalName);
if ( p = nil ) then
Result := nil
else
Result := p.ExtObject;
end;
function TTypeRegistryItem.GetExternalPropertyName(const APropName: string): string;
var
p : TPropertyItem;
begin
p := FindProperty(APropName,pntInternalName);
if ( p = nil ) then
Result := APropName
else
Result := p.ExternalName;
end;
function TTypeRegistryItem.GetInternalPropertyName(const AExtPropName: string): string;
var
p : TPropertyItem;
begin
p := FindProperty(AExtPropName,pntExternalName);
if ( p = nil ) then
Result := AExtPropName
else
Result := p.InternalName;
end;
procedure TTypeRegistryItem.SetPropertyOptions(
const APropName: string;
const AOptions: TTypeRegistryItemOptions
);
var
po : TPropertyItem;
begin
po := FindProperty(APropName,pntInternalName);
if ( po = nil ) then begin
RegisterExternalPropertyName(APropName,APropName);
po := FindProperty(APropName,pntInternalName);
end;
po.FOptions := AOptions;
end;
procedure TTypeRegistryItem.AddOptions(
const AOptions: TTypeRegistryItemOptions
);
begin
Options := Options + AOptions;
end;
{ TTypeRegistry }
function TTypeRegistry.GetItemClassFor(const ATypeInfo : PTypeInfo) : TTypeRegistryItemClass;
var
i, c : Integer;
locInitializer : TRemotableTypeInitializerClass;
begin
Result := TTypeRegistryItem;
c := FInitializerList.Count;
if ( c > 0 ) then begin
for i := Pred(c) downto 0 do begin
locInitializer := TRemotableTypeInitializerClass(FInitializerList[i]);
if locInitializer.CanHandle(ATypeInfo) then begin
Result := locInitializer.GetItemClass(ATypeInfo);
Break;
end;
end;
end;
end;
{$IFDEF TRemotableTypeInitializer_Initialize}
procedure TTypeRegistry.InitializeItem(AItem : TTypeRegistryItem);
var
i, c : Integer;
locInitializer : TRemotableTypeInitializerClass;
begin
c := FInitializerList.Count;
if ( c > 0 ) then begin
for i := Pred(c) downto 0 do begin
locInitializer := TRemotableTypeInitializerClass(FInitializerList[i]);
if locInitializer.CanHandle(AItem.DataType) and locInitializer.Initialize(AItem.DataType,AItem) then
Break;
end;
end;
end;
{$ENDIF TRemotableTypeInitializer_Initialize}
function TTypeRegistry.GetCount: Integer;
begin
Result := FList.Count;
end;
function TTypeRegistry.GetItemByIndex(Index: Integer): TTypeRegistryItem;
begin
Result := FList[Index] as TTypeRegistryItem;
end;
function TTypeRegistry.GetItemByTypeInfo(Index: PTypeInfo): TTypeRegistryItem;
Var
i : Integer;
begin
Assert(Assigned(Index));
i := IndexOf(Index);
If ( i > -1 ) Then
Result := FList[i] as TTypeRegistryItem
Else
Raise ETypeRegistryException.CreateFmt(SERR_TypeNotRegistered,[Index^.Name])
end;
constructor TTypeRegistry.Create();
begin
Inherited Create();
FList := TObjectList.Create(True);
FInitializerList := TClassList.Create();
end;
destructor TTypeRegistry.Destroy();
begin
FInitializerList.Free();
FList.Free();
inherited Destroy();
end;
procedure TTypeRegistry.RegisterInitializer(AInitializer : TRemotableTypeInitializerClass);
begin
if ( FInitializerList.IndexOf(AInitializer) = -1 ) then
FInitializerList.Add(AInitializer);
end;
function TTypeRegistry.IndexOf(const ATypeInfo: PTypeInfo): Integer;
var
i : Integer;
begin
for i := 0 to Pred(Count) do begin
if ( ATypeInfo = Item[i].DataType ) then begin
Result := i;
Exit;
end;
{If ( ATypeInfo^.Kind = Item[Result].DataType^.Kind ) And
AnsiSameText(ATypeInfo^.Name,Item[Result].DataType^.Name)
Then
Exit;}
end;
Result := -1;
end;
function TTypeRegistry.Add(AItem: TTypeRegistryItem): Integer;
begin
Result := IndexOf(AItem.DataType);
If ( Result = -1 ) Then
Result := FList.Add(AItem)
Else
Raise ETypeRegistryException.CreateFmt(SERR_TypeNotRegistered,[AItem.DataType^.Name]);
end;
function TTypeRegistry.Register(
const ANameSpace : string;
const ADataType : PTypeInfo;
const ADeclaredName : string;
const AOptions : TTypeRegistryItemOptions
): TTypeRegistryItem;
var
i : Integer;
begin
i := IndexOf(ADataType);
if ( i = -1 ) then begin
Result := GetItemClassFor(ADataType).Create(Self,ANameSpace,ADataType,ADeclaredName);
Add(Result);
Result.FOptions := Result.FOptions + AOptions;
Result.Init();
{$IFDEF TRemotableTypeInitializer_Initialize}
InitializeItem(Result);
{$ENDIF TRemotableTypeInitializer_Initialize}
end else begin
Result := Item[i];
end;
end;
function TTypeRegistry.Register(
const ANameSpace : string;
const ADataType : PTypeInfo;
const ADeclaredName : string
) : TTypeRegistryItem;
begin
Result := Register(ANameSpace,ADataType,ADeclaredName,[]);
end;
function TTypeRegistry.Find(ATypeInfo: PTypeInfo; const AExact: Boolean
): TTypeRegistryItem;
Var
i : Integer;
searchClass : TClass;
begin
Result := Nil;
i := IndexOf(ATypeInfo);
if ( i > -1 ) then begin
Result := Item[i]
end else if ( not AExact ) and Assigned(ATypeInfo) and ( ATypeInfo^.Kind = tkClass ) then begin
searchClass := GetTypeData(ATypeInfo)^.ClassType;
for i := Pred(Count) downto 0 do begin
Result := Item[i];
if ( Result.DataType^.Kind = tkClass ) and
searchClass.InheritsFrom(GetTypeData(Result.DataType)^.ClassType)
then begin
Exit;
end;
end;
Result := Nil;
end;
end;
function TTypeRegistry.Find(const APascalTypeName: string): TTypeRegistryItem;
var
i,c : Integer;
begin
c := Count;
for i := 0 to Pred(c) do begin
Result := Item[i];
if Result.IsSynonym(APascalTypeName) then
Exit;
end;
Result := nil;
end;
function TTypeRegistry.FindByDeclaredName(
const ATypeName,
ANameSpace : string;
const AOptions : TTypeRegistrySearchOptions
): TTypeRegistryItem;
var
i, c : Integer;
begin
{ The external synonym is not tested in the first loop so that the declared
names are _first_ search for.
}
c := Count;
if ( c > 0 ) then begin
for i := 0 to Pred(c) do begin
Result := Item[i];
if AnsiSameText(ANameSpace,Result.NameSpace) and
AnsiSameText(ATypeName,Result.DeclaredName)
then
Exit;
end;
if ( trsoIncludeExternalSynonyms in AOptions ) then begin
for i := 0 to Pred(c) do begin
Result := Item[i];
if AnsiSameText(ANameSpace,Result.NameSpace) and
Result.IsExternalSynonym(ATypeName)
then
Exit;
end;
end;
end;
Result := nil;
end;
{ TBaseSimpleTypeArrayRemotable }
class procedure TBaseSimpleTypeArrayRemotable.Save(
AObject : TBaseRemotable;
AStore : IFormatterBase;
const AName : string;
const ATypeInfo : PTypeInfo
);
var
i, arrayLen : Integer;
nativObj : TBaseSimpleTypeArrayRemotable;
itmName : string;
styl : TArrayStyle;
begin
if Assigned(AObject) then begin
Assert(AObject.InheritsFrom(TBaseSimpleTypeArrayRemotable));
nativObj := AObject as TBaseSimpleTypeArrayRemotable;
arrayLen := nativObj.Length;
styl := GetStyle();
if ( arrayLen > 0 ) then begin
AStore.BeginArray(AName,PTypeInfo(Self.ClassInfo),GetItemTypeInfo(),[0,Pred(arrayLen)],styl);
try
if ( styl = asScoped ) then begin
itmName := GetItemName();
end else begin
itmName := AName;
end;
for i := 0 to Pred(arrayLen) do begin
nativObj.SaveItem(AStore,itmName,i);
end;
finally
AStore.EndScope();
end;
end else if ( styl = asScoped ) and ( ioAlwaysSerialize in nativObj.Options ) then begin
AStore.BeginArray(AName,PTypeInfo(Self.ClassInfo),GetItemTypeInfo(),[0,-1],styl);
try
AStore.NilCurrentScope();
finally
AStore.EndScope();
end;
end;
end;
end;
class procedure TBaseSimpleTypeArrayRemotable.Load(
var AObject : TObject;
AStore : IFormatterBase;
var AName : String;
const ATypeInfo : PTypeInfo
);
Var
i, len : Integer;
nativObj : TBaseSimpleTypeArrayRemotable;
itmName : string;
styl : TArrayStyle;
begin
styl := GetStyle();
if ( styl = asScoped ) then begin
itmName := GetItemName();
end else begin
itmName := AName;
end;
if (AObject = nil) and Self.InheritsFrom(TBaseArrayRemotable) then
AObject := Create();
len := AStore.BeginArrayRead(AName,ATypeInfo, GetStyle(),itmName);
if ( len > 0 ) then begin
try
if not Assigned(AObject) then
AObject := Create();
nativObj := AObject as TBaseSimpleTypeArrayRemotable;
if ( len >= 0 ) then begin
nativObj.SetLength(len);
for i := 0 to Pred(len) do begin
nativObj.LoadItem(AStore,i);
end;
end;
finally
AStore.EndScopeRead();
end;
end else begin
if ( AObject <> nil ) then
TBaseSimpleTypeArrayRemotable(AObject).SetLength(0);
end;
end;
{ TArrayOfStringRemotable }
function TArrayOfStringRemotable.GetItem(AIndex: Integer): String;
begin
CheckIndex(AIndex);
Result := FData[AIndex];
end;
procedure TArrayOfStringRemotable.SetItem(AIndex: Integer;const AValue: String);
begin
CheckIndex(AIndex);
FData[AIndex] := AValue;
end;
function TArrayOfStringRemotable.GetLength(): Integer;
begin
Result := System.Length(FData)
end;
procedure TArrayOfStringRemotable.SaveItem(
AStore : IFormatterBase;
const AName : String;
const AIndex : Integer
);
begin
AStore.Put(AName,TypeInfo(String),FData[AIndex]);
end;
procedure TArrayOfStringRemotable.LoadItem(
AStore : IFormatterBase;
const AIndex : Integer
);
var
sName : string;
begin
sName := GetItemName();
AStore.Get(TypeInfo(String),sName,FData[AIndex]);
end;
class function TArrayOfStringRemotable.GetItemTypeInfo(): PTypeInfo;
begin
Result := TypeInfo(String);
end;
procedure TArrayOfStringRemotable.SetLength(const ANewSize: Integer);
begin
if ( ANewSize < 0 ) then
raise EBaseRemoteException.CreateFmt(SERR_InvalidArrayLength,[ANewSize]);
System.SetLength(FData,ANewSize);
end;
procedure TArrayOfStringRemotable.Assign(Source: TPersistent);
var
src : TArrayOfStringRemotable;
i, c : Integer;
begin
if Assigned(Source) and Source.InheritsFrom(TArrayOfStringRemotable) then begin
src := TArrayOfStringRemotable(Source);
c := src.Length;
Self.SetLength(c);
if ( c > 0 ) then begin
for i := 0 to Pred(c) do begin
Self[i] := src[i];
end;
end;
end else begin
inherited Assign(Source);
end;
end;
function TArrayOfStringRemotable.Equal(const ACompareTo : TBaseRemotable) : Boolean;
var
i, c : Integer;
dst : TArrayOfStringRemotable;
begin
if ( Self = ACompareTo ) then begin
Result := True;
end else begin
Result := Assigned(ACompareTo) and
ACompareTo.InheritsFrom(TArrayOfStringRemotable) and
( Self.Length = TArrayOfStringRemotable(ACompareTo).Length );
if Result then begin
c := Self.Length;
dst := TArrayOfStringRemotable(ACompareTo);
for i := 0 to Pred(c) do begin
if ( Self.Item[i] <> dst.Item[i] ) then begin
Result := False;
Break;
end;
end;
end;
end;
end;
{ TObjectCollectionRemotable }
function TObjectCollectionRemotable.GetItem(AIndex : Integer) : TBaseRemotable;
begin
Result := TBaseRemotable(FList[AIndex]);
end;
function TObjectCollectionRemotable.GetLength() : Integer;
begin
Result := FList.Count;
end;
class procedure TObjectCollectionRemotable.Save(
AObject : TBaseRemotable;
AStore : IFormatterBase;
const AName : string;
const ATypeInfo : PTypeInfo
);
Var
itmTypInfo : PTypeInfo;
i, arrayLen : Integer;
nativObj : TObjectCollectionRemotable;
itm : TObject;
itmName : string;
styl : TArrayStyle;
begin
if Assigned(AObject) then begin
Assert(AObject.InheritsFrom(TObjectCollectionRemotable));
nativObj := AObject as TObjectCollectionRemotable;
styl := GetStyle();
itmTypInfo := PTypeInfo(GetItemClass().ClassInfo);
arrayLen := nativObj.Length;
if ( arrayLen > 0 ) then begin
AStore.BeginArray(AName,PTypeInfo(Self.ClassInfo),itmTypInfo,[0,Pred(arrayLen)],styl);
try
if ( styl = asScoped ) then begin
itmName := GetItemName();
end else begin
itmName := AName;
end;
for i := 0 to Pred(arrayLen) do begin
itm := nativObj.Item[i];
AStore.Put(itmName,itmTypInfo,itm);
end;
finally
AStore.EndScope();
end;
end else if ( styl = asScoped ) and ( ioAlwaysSerialize in nativObj.Options ) then begin
AStore.BeginArray(AName,PTypeInfo(Self.ClassInfo),itmTypInfo,[0,-1],styl);
try
AStore.NilCurrentScope();
finally
AStore.EndScope();
end;
end;
end;
end;
class procedure TObjectCollectionRemotable.Load(
var AObject : TObject;
AStore : IFormatterBase;
var AName : String;
const ATypeInfo : PTypeInfo
);
Var
i, len : Integer;
nativObj : TObjectCollectionRemotable;
s : string;
itmTypInfo : PTypeInfo;
itm : TBaseRemotable;
itmName : string;
styl : TArrayStyle;
begin
styl := GetStyle();
if ( styl = asScoped ) then begin
itmName := GetItemName();
end else begin
itmName := AName;
end;
len := AStore.BeginArrayRead(AName,ATypeInfo,styl,itmName);
if ( len >= 0 ) then begin
Try
If Not Assigned(AObject) Then
AObject := Create();
itmTypInfo := PTypeInfo(GetItemClass().ClassInfo);
nativObj := AObject as TObjectCollectionRemotable;
If ( len > 0 ) Then Begin
s := '';
nativObj.Clear();
For i := 0 To Pred(len) Do Begin
itm := nativObj.Add();
AStore.Get(itmTypInfo,s,itm);
End;
End;
Finally
AStore.EndScopeRead();
End;
end else begin
if ( AObject <> nil ) then
TObjectCollectionRemotable(AObject).Clear();
end;
end;
class function TObjectCollectionRemotable.GetItemTypeInfo() : PTypeInfo;
begin
Result := PTypeInfo(GetItemClass().ClassInfo);
end;
constructor TObjectCollectionRemotable.Create();
begin
inherited Create();
FList := TObjectList.Create(True);
end;
destructor TObjectCollectionRemotable.Destroy();
begin
FreeAndNil(FList);
inherited Destroy();
end;
procedure TObjectCollectionRemotable.Assign(Source : TPersistent);
var
srcCol : TObjectCollectionRemotable;
src : TBaseObjectArrayRemotable;
i, c : Integer;
begin
if Assigned(Source) then begin
if Source.InheritsFrom(TObjectCollectionRemotable) then begin
srcCol := TObjectCollectionRemotable(Source);
c := srcCol.Length;
FList.Clear();
FList.Capacity := c;
for i := 0 to Pred(c) do begin
Add().Assign(srcCol.Item[i]);
end;
end else if Source.InheritsFrom(TBaseObjectArrayRemotable) then begin
src := TBaseObjectArrayRemotable(Source);
c := src.Length;
FList.Clear();
FList.Capacity := c;
for i := 0 to Pred(c) do begin
Add().Assign(src.Item[i]);
end;
end else begin
inherited Assign(Source);
end;
end else begin
FList.Clear();
end;
end;
function TObjectCollectionRemotable.Equal(const ACompareTo : TBaseRemotable) : Boolean;
var
i : Integer;
nativeCol : TObjectCollectionRemotable;
nativeArray : TBaseObjectArrayRemotable;
res : Boolean;
begin
res := False;
if ( ACompareTo <> nil ) then begin
if ACompareTo.InheritsFrom(TObjectCollectionRemotable) then begin
nativeCol := TObjectCollectionRemotable(ACompareTo);
if ( nativeCol.Length = Length ) then begin
res := True;
for i := 0 to Pred(Length) do begin
if not Item[i].Equal(nativeCol[i]) then begin
res := False;
Break;
end;
end;
end;
end else if ACompareTo.InheritsFrom(TBaseObjectArrayRemotable) then begin
nativeArray := TBaseObjectArrayRemotable(ACompareTo);
if ( nativeArray.Length = Length ) then begin
res := True;
for i := 0 to Pred(Length) do begin
if not Item[i].Equal(nativeArray[i]) then begin
res := False;
Break;
end;
end;
end;
end;
end;
Result := res;
end;
procedure TObjectCollectionRemotable.SetLength(const ANewSize: Integer);
var
i,oldLen : Integer;
begin
if ( FList = nil ) then
Exit;
oldLen := FList.Count;
if ( oldLen = ANewSize ) then
Exit;
if ( ANewSize < 0 ) then
raise EBaseRemoteException.CreateFmt(SERR_InvalidCollectionLength,[ANewSize]);
if ( oldLen > ANewSize ) then begin
for i := ANewSize to Pred(oldLen) do
FList.Delete(FList.Count - 1);
end else begin
if ( FList.Capacity < ANewSize ) then
FList.Capacity := ANewSize;
for i := oldLen to Pred(ANewSize) do
Add();
end;
end;
function TObjectCollectionRemotable.Add() : TBaseRemotable;
begin
Result := GetItemClass().Create();
try
FList.Add(Result);
except
Result.Free();
raise;
end;
end;
function TObjectCollectionRemotable.AddAt(const APosition : Integer) : TBaseRemotable;
begin
FList.Insert(APosition,nil);
try
Result := GetItemClass().Create();
except
FList.Delete(APosition);
raise;
end;
FList[APosition] := Result;
end;
function TObjectCollectionRemotable.Extract(const AIndex : Integer) : TBaseRemotable;
begin
Result := TBaseRemotable(FList.Extract(FList[AIndex]));
end;
procedure TObjectCollectionRemotable.Delete(const AIndex : Integer);
begin
FList.Delete(AIndex);
end;
procedure TObjectCollectionRemotable.Exchange(const Index1, Index2 : Integer);
begin
FList.Exchange(Index1,Index2);
end;
procedure TObjectCollectionRemotable.Clear();
begin
FList.Clear();
end;
function TObjectCollectionRemotable.IndexOf(AObject : TBaseRemotable) : Integer;
begin
Result := FList.IndexOf(AObject);
end;
{ TBaseArrayRemotable }
class function TBaseArrayRemotable.GetItemName(): string;
var
tri : TTypeRegistryItem;
begin
tri := GetTypeRegistry().Find(PTypeInfo(Self.ClassInfo),False);
if Assigned(tri) then
Result := Trim(tri.GetExternalPropertyName(sARRAY_ITEM));
if ( System.Length(Result) = 0 ) then
Result := sARRAY_ITEM;
end;
class function TBaseArrayRemotable.GetStyle(): TArrayStyle;
var
tri : TTypeRegistryItem;
begin
tri := GetTypeRegistry().Find(PTypeInfo(Self.ClassInfo),False);
if Assigned(tri) and AnsiSameText(sEmbedded,Trim(tri.GetExternalPropertyName(sARRAY_STYLE))) then begin
Result := asEmbeded;
end else begin
Result := asScoped;
end;
end;
procedure TBaseArrayRemotable.CheckIndex(const AIndex : Integer);
begin
if ( AIndex < 0 ) or ( AIndex >= Length ) then
raise EServiceException.CreateFmt(SERR_IndexOutOfBound,[AIndex]);
end;
destructor TBaseArrayRemotable.Destroy();
begin
SetLength(0);
inherited Destroy();
end;
{ TArrayOfBooleanRemotable }
function TArrayOfBooleanRemotable.GetItem(AIndex: Integer): Boolean;
begin
CheckIndex(AIndex);
Result := FData[AIndex];
end;
procedure TArrayOfBooleanRemotable.SetItem(AIndex: Integer;const AValue: Boolean);
begin
CheckIndex(AIndex);
FData[AIndex] := AValue;
end;
function TArrayOfBooleanRemotable.GetLength(): Integer;
begin
Result := System.Length(FData);
end;
procedure TArrayOfBooleanRemotable.SaveItem(AStore: IFormatterBase;
const AName: String; const AIndex: Integer);
begin
AStore.Put(AName,TypeInfo(Boolean),FData[AIndex]);
end;
procedure TArrayOfBooleanRemotable.LoadItem(AStore: IFormatterBase;const AIndex: Integer);
var
sName : string;
begin
sName := GetItemName();
AStore.Get(TypeInfo(Boolean),sName,FData[AIndex]);
end;
class function TArrayOfBooleanRemotable.GetItemTypeInfo(): PTypeInfo;
begin
Result := TypeInfo(Boolean);
end;
procedure TArrayOfBooleanRemotable.SetLength(const ANewSize: Integer);
begin
if ( ANewSize < 0 ) then
raise EBaseRemoteException.CreateFmt(SERR_InvalidArrayLength,[ANewSize]);
System.SetLength(FData,ANewSize);
end;
procedure TArrayOfBooleanRemotable.Assign(Source: TPersistent);
var
src : TArrayOfBooleanRemotable;
i, c : Integer;
begin
if Assigned(Source) and Source.InheritsFrom(TArrayOfBooleanRemotable) then begin
src := TArrayOfBooleanRemotable(Source);
c := src.Length;
Self.SetLength(c);
if ( c > 0 ) then begin
for i := 0 to Pred(c) do begin
Self[i] := src[i];
end;
end;
end else begin
inherited Assign(Source);
end;
end;
{ TArrayOfInt8URemotable }
function TArrayOfInt8URemotable.GetItem(AIndex: Integer): Byte;
begin
CheckIndex(AIndex);
Result := FData[AIndex];
end;
procedure TArrayOfInt8URemotable.SetItem(AIndex: Integer; const AValue: Byte);
begin
CheckIndex(AIndex);
FData[AIndex] := AValue;
end;
function TArrayOfInt8URemotable.GetLength(): Integer;
begin
Result := System.Length(FData);
end;
procedure TArrayOfInt8URemotable.SaveItem(AStore: IFormatterBase;
const AName: String; const AIndex: Integer);
begin
AStore.Put(AName,TypeInfo(Byte),FData[AIndex]);
end;
procedure TArrayOfInt8URemotable.LoadItem(AStore: IFormatterBase; const AIndex: Integer);
var
sName : string;
begin
sName := GetItemName();
AStore.Get(TypeInfo(Byte),sName,FData[AIndex]);
end;
class function TArrayOfInt8URemotable.GetItemTypeInfo(): PTypeInfo;
begin
Result := TypeInfo(Byte);
end;
procedure TArrayOfInt8URemotable.SetLength(const ANewSize: Integer);
begin
if ( ANewSize < 0 ) then
raise EBaseRemoteException.CreateFmt(SERR_InvalidArrayLength,[ANewSize]);
System.SetLength(FData,ANewSize);
end;
procedure TArrayOfInt8URemotable.Assign(Source: TPersistent);
var
src : TArrayOfInt8URemotable;
i, c : Integer;
begin
if Assigned(Source) and Source.InheritsFrom(TArrayOfInt8URemotable) then begin
src := TArrayOfInt8URemotable(Source);
c := src.Length;
Self.SetLength(c);
if ( c > 0 ) then begin
for i := 0 to Pred(c) do begin
Self[i] := src[i];
end;
end;
end else begin
inherited Assign(Source);
end;
end;
{ TArrayOfInt8SRemotable }
function TArrayOfInt8SRemotable.GetItem(AIndex: Integer): ShortInt;
begin
CheckIndex(AIndex);
Result := FData[AIndex];
end;
procedure TArrayOfInt8SRemotable.SetItem(AIndex: Integer; const AValue: ShortInt);
begin
CheckIndex(AIndex);
FData[AIndex] := AValue;
end;
function TArrayOfInt8SRemotable.GetLength(): Integer;
begin
Result := System.Length(FData);
end;
procedure TArrayOfInt8SRemotable.SaveItem(AStore: IFormatterBase;
const AName: String; const AIndex: Integer);
begin
AStore.Put(AName,TypeInfo(ShortInt),FData[AIndex]);
end;
procedure TArrayOfInt8SRemotable.LoadItem(AStore: IFormatterBase;const AIndex: Integer);
var
sName : string;
begin
sName := GetItemName();
AStore.Get(TypeInfo(ShortInt),sName,FData[AIndex]);
end;
class function TArrayOfInt8SRemotable.GetItemTypeInfo(): PTypeInfo;
begin
Result := TypeInfo(ShortInt);
end;
procedure TArrayOfInt8SRemotable.SetLength(const ANewSize: Integer);
begin
if ( ANewSize < 0 ) then
raise EBaseRemoteException.CreateFmt(SERR_InvalidArrayLength,[ANewSize]);
System.SetLength(FData,ANewSize);
end;
procedure TArrayOfInt8SRemotable.Assign(Source: TPersistent);
var
src : TArrayOfInt8SRemotable;
i, c : Integer;
begin
if Assigned(Source) and Source.InheritsFrom(TArrayOfInt8SRemotable) then begin
src := TArrayOfInt8SRemotable(Source);
c := src.Length;
Self.SetLength(c);
if ( c > 0 ) then begin
for i := 0 to Pred(c) do begin
Self[i] := src[i];
end;
end;
end else begin
inherited Assign(Source);
end;
end;
{ TArrayOfInt16SRemotable }
function TArrayOfInt16SRemotable.GetItem(AIndex: Integer): SmallInt;
begin
CheckIndex(AIndex);
Result := FData[AIndex];
end;
procedure TArrayOfInt16SRemotable.SetItem(AIndex: Integer;const AValue: SmallInt);
begin
CheckIndex(AIndex);
FData[AIndex] := AValue;
end;
function TArrayOfInt16SRemotable.GetLength(): Integer;
begin
Result := System.Length(FData);
end;
procedure TArrayOfInt16SRemotable.SaveItem(AStore: IFormatterBase;
const AName: String; const AIndex: Integer);
begin
AStore.Put(AName,TypeInfo(SmallInt),FData[AIndex]);
end;
procedure TArrayOfInt16SRemotable.LoadItem(AStore: IFormatterBase;const AIndex: Integer);
var
sName : string;
begin
sName := GetItemName();
AStore.Get(TypeInfo(SmallInt),sName,FData[AIndex]);
end;
class function TArrayOfInt16SRemotable.GetItemTypeInfo(): PTypeInfo;
begin
Result := TypeInfo(SmallInt);
end;
procedure TArrayOfInt16SRemotable.SetLength(const ANewSize: Integer);
begin
if ( ANewSize < 0 ) then
raise EBaseRemoteException.CreateFmt(SERR_InvalidArrayLength,[ANewSize]);
System.SetLength(FData,ANewSize);
end;
procedure TArrayOfInt16SRemotable.Assign(Source: TPersistent);
var
src : TArrayOfInt16SRemotable;
i, c : Integer;
begin
if Assigned(Source) and Source.InheritsFrom(TArrayOfInt16SRemotable) then begin
src := TArrayOfInt16SRemotable(Source);
c := src.Length;
Self.SetLength(c);
if ( c > 0 ) then begin
for i := 0 to Pred(c) do begin
Self[i] := src[i];
end;
end;
end else begin
inherited Assign(Source);
end;
end;
{ TArrayOfInt16URemotable }
function TArrayOfInt16URemotable.GetItem(AIndex: Integer): Word;
begin
CheckIndex(AIndex);
Result := FData[AIndex];
end;
procedure TArrayOfInt16URemotable.SetItem(AIndex: Integer; const AValue: Word);
begin
CheckIndex(AIndex);
FData[AIndex] := AValue;
end;
function TArrayOfInt16URemotable.GetLength(): Integer;
begin
Result := System.Length(FData);
end;
procedure TArrayOfInt16URemotable.SaveItem(AStore: IFormatterBase;
const AName: String; const AIndex: Integer);
begin
AStore.Put(AName,TypeInfo(Word),FData[AIndex]);
end;
procedure TArrayOfInt16URemotable.LoadItem(AStore: IFormatterBase;const AIndex: Integer);
var
sName : string;
begin
sName := GetItemName();
AStore.Get(TypeInfo(Word),sName,FData[AIndex]);
end;
class function TArrayOfInt16URemotable.GetItemTypeInfo(): PTypeInfo;
begin
Result := TypeInfo(Word);
end;
procedure TArrayOfInt16URemotable.SetLength(const ANewSize: Integer);
begin
if ( ANewSize < 0 ) then
raise EBaseRemoteException.CreateFmt(SERR_InvalidArrayLength,[ANewSize]);
System.SetLength(FData,ANewSize);
end;
procedure TArrayOfInt16URemotable.Assign(Source: TPersistent);
var
src : TArrayOfInt16URemotable;
i, c : Integer;
begin
if Assigned(Source) and Source.InheritsFrom(TArrayOfInt16URemotable) then begin
src := TArrayOfInt16URemotable(Source);
c := src.Length;
Self.SetLength(c);
if ( c > 0 ) then begin
for i := 0 to Pred(c) do begin
Self[i] := src[i];
end;
end;
end else begin
inherited Assign(Source);
end;
end;
{ TArrayOfInt32URemotable }
function TArrayOfInt32URemotable.GetItem(AIndex: Integer): LongWord;
begin
CheckIndex(AIndex);
Result := FData[AIndex];
end;
procedure TArrayOfInt32URemotable.SetItem(AIndex: Integer;const AValue: LongWord);
begin
CheckIndex(AIndex);
FData[AIndex] := AValue;
end;
function TArrayOfInt32URemotable.GetLength(): Integer;
begin
Result := System.Length(FData);
end;
procedure TArrayOfInt32URemotable.SaveItem(AStore: IFormatterBase;
const AName: String; const AIndex: Integer);
begin
AStore.Put(AName,TypeInfo(LongWord),FData[AIndex]);
end;
procedure TArrayOfInt32URemotable.LoadItem(AStore: IFormatterBase;const AIndex: Integer);
var
sName : string;
begin
sName := GetItemName();
AStore.Get(TypeInfo(LongWord),sName,FData[AIndex]);
end;
class function TArrayOfInt32URemotable.GetItemTypeInfo(): PTypeInfo;
begin
Result := TypeInfo(LongWord);
end;
procedure TArrayOfInt32URemotable.SetLength(const ANewSize: Integer);
begin
if ( ANewSize < 0 ) then
raise EBaseRemoteException.CreateFmt(SERR_InvalidArrayLength,[ANewSize]);
System.SetLength(FData,ANewSize);
end;
procedure TArrayOfInt32URemotable.Assign(Source: TPersistent);
var
src : TArrayOfInt32URemotable;
i, c : Integer;
begin
if Assigned(Source) and Source.InheritsFrom(TArrayOfInt32URemotable) then begin
src := TArrayOfInt32URemotable(Source);
c := src.Length;
Self.SetLength(c);
if ( c > 0 ) then begin
for i := 0 to Pred(c) do begin
Self[i] := src[i];
end;
end;
end else begin
inherited Assign(Source);
end;
end;
{ TArrayOfInt32SRemotable }
function TArrayOfInt32SRemotable.GetItem(AIndex: Integer): LongInt;
begin
CheckIndex(AIndex);
Result := FData[AIndex];
end;
procedure TArrayOfInt32SRemotable.SetItem(AIndex: Integer; const AValue: LongInt);
begin
CheckIndex(AIndex);
FData[AIndex] := AValue;
end;
function TArrayOfInt32SRemotable.GetLength(): Integer;
begin
Result := System.Length(FData);
end;
procedure TArrayOfInt32SRemotable.SaveItem(AStore: IFormatterBase;
const AName: String; const AIndex: Integer);
begin
AStore.Put(AName,TypeInfo(LongInt),FData[AIndex]);
end;
procedure TArrayOfInt32SRemotable.LoadItem(AStore: IFormatterBase;const AIndex: Integer);
var
sName : string;
begin
sName := GetItemName();
AStore.Get(TypeInfo(LongInt),sName,FData[AIndex]);
end;
class function TArrayOfInt32SRemotable.GetItemTypeInfo(): PTypeInfo;
begin
Result := TypeInfo(LongInt);
end;
procedure TArrayOfInt32SRemotable.SetLength(const ANewSize: Integer);
begin
if ( ANewSize < 0 ) then
raise EBaseRemoteException.CreateFmt(SERR_InvalidArrayLength,[ANewSize]);
System.SetLength(FData,ANewSize);
end;
procedure TArrayOfInt32SRemotable.Assign(Source: TPersistent);
var
src : TArrayOfInt32SRemotable;
i, c : Integer;
begin
if Assigned(Source) and Source.InheritsFrom(TArrayOfInt32SRemotable) then begin
src := TArrayOfInt32SRemotable(Source);
c := src.Length;
Self.SetLength(c);
if ( c > 0 ) then begin
for i := 0 to Pred(c) do begin
Self[i] := src[i];
end;
end;
end else begin
inherited Assign(Source);
end;
end;
{ TArrayOfInt64SRemotable }
function TArrayOfInt64SRemotable.GetItem(AIndex: Integer): Int64;
begin
CheckIndex(AIndex);
Result := FData[AIndex];
end;
procedure TArrayOfInt64SRemotable.SetItem(AIndex: Integer; const AValue: Int64);
begin
CheckIndex(AIndex);
FData[AIndex] := AValue;
end;
function TArrayOfInt64SRemotable.GetLength(): Integer;
begin
Result := System.Length(FData);
end;
procedure TArrayOfInt64SRemotable.SaveItem(AStore: IFormatterBase;
const AName: String; const AIndex: Integer);
begin
AStore.Put(AName,TypeInfo(Int64),FData[AIndex]);
end;
procedure TArrayOfInt64SRemotable.LoadItem(AStore: IFormatterBase;const AIndex: Integer);
var
sName : string;
begin
sName := GetItemName();
AStore.Get(TypeInfo(Int64),sName,FData[AIndex]);
end;
class function TArrayOfInt64SRemotable.GetItemTypeInfo(): PTypeInfo;
begin
Result := TypeInfo(Int64);
end;
procedure TArrayOfInt64SRemotable.SetLength(const ANewSize: Integer);
begin
if ( ANewSize < 0 ) then
raise EBaseRemoteException.CreateFmt(SERR_InvalidArrayLength,[ANewSize]);
System.SetLength(FData,ANewSize);
end;
procedure TArrayOfInt64SRemotable.Assign(Source: TPersistent);
var
src : TArrayOfInt64SRemotable;
i, c : Integer;
begin
if Assigned(Source) and Source.InheritsFrom(TArrayOfInt64SRemotable) then begin
src := TArrayOfInt64SRemotable(Source);
c := src.Length;
Self.SetLength(c);
if ( c > 0 ) then begin
for i := 0 to Pred(c) do begin
Self[i] := src[i];
end;
end;
end else begin
inherited Assign(Source);
end;
end;
{ TArrayOfInt64URemotable }
function TArrayOfInt64URemotable.GetItem(AIndex: Integer): QWord;
begin
CheckIndex(AIndex);
Result := FData[AIndex];
end;
procedure TArrayOfInt64URemotable.SetItem(AIndex: Integer; const AValue: QWord);
begin
CheckIndex(AIndex);
FData[AIndex] := AValue;
end;
function TArrayOfInt64URemotable.GetLength(): Integer;
begin
Result := System.Length(FData);
end;
procedure TArrayOfInt64URemotable.SaveItem(AStore: IFormatterBase;
const AName: String; const AIndex: Integer);
begin
AStore.Put(AName,TypeInfo(QWord),FData[AIndex]);
end;
procedure TArrayOfInt64URemotable.LoadItem(AStore: IFormatterBase;const AIndex: Integer);
var
sName : string;
begin
sName := GetItemName();
AStore.Get(TypeInfo(QWord),sName,FData[AIndex]);
end;
class function TArrayOfInt64URemotable.GetItemTypeInfo(): PTypeInfo;
begin
Result := TypeInfo(QWord);
end;
procedure TArrayOfInt64URemotable.SetLength(const ANewSize: Integer);
begin
if ( ANewSize < 0 ) then
raise EBaseRemoteException.CreateFmt(SERR_InvalidArrayLength,[ANewSize]);
System.SetLength(FData,ANewSize);
end;
procedure TArrayOfInt64URemotable.Assign(Source: TPersistent);
var
src : TArrayOfInt64URemotable;
i, c : Integer;
begin
if Assigned(Source) and Source.InheritsFrom(TArrayOfInt64URemotable) then begin
src := TArrayOfInt64URemotable(Source);
c := src.Length;
Self.SetLength(c);
if ( c > 0 ) then begin
for i := 0 to Pred(c) do begin
Self[i] := src[i];
end;
end;
end else begin
inherited Assign(Source);
end;
end;
{ TArrayOfFloatSingleRemotable }
function TArrayOfFloatSingleRemotable.GetItem(AIndex: Integer): Single;
begin
CheckIndex(AIndex);
Result := FData[AIndex];
end;
procedure TArrayOfFloatSingleRemotable.SetItem(AIndex: Integer;const AValue: Single);
begin
CheckIndex(AIndex);
FData[AIndex] := AValue;
end;
function TArrayOfFloatSingleRemotable.GetLength(): Integer;
begin
Result := System.Length(FData);
end;
procedure TArrayOfFloatSingleRemotable.SaveItem(AStore: IFormatterBase;
const AName: String; const AIndex: Integer);
begin
AStore.Put(AName,TypeInfo(Single),FData[AIndex]);
end;
procedure TArrayOfFloatSingleRemotable.LoadItem(AStore: IFormatterBase;const AIndex: Integer);
var
sName : string;
begin
sName := GetItemName();
AStore.Get(TypeInfo(Single),sName,FData[AIndex]);
end;
class function TArrayOfFloatSingleRemotable.GetItemTypeInfo(): PTypeInfo;
begin
Result := TypeInfo(Single);
end;
procedure TArrayOfFloatSingleRemotable.SetLength(const ANewSize: Integer);
begin
if ( ANewSize < 0 ) then
raise EBaseRemoteException.CreateFmt(SERR_InvalidArrayLength,[ANewSize]);
System.SetLength(FData,ANewSize);
end;
procedure TArrayOfFloatSingleRemotable.Assign(Source: TPersistent);
var
src : TArrayOfFloatSingleRemotable;
i, c : Integer;
begin
if Assigned(Source) and Source.InheritsFrom(TArrayOfFloatSingleRemotable) then begin
src := TArrayOfFloatSingleRemotable(Source);
c := src.Length;
Self.SetLength(c);
if ( c > 0 ) then begin
for i := 0 to Pred(c) do begin
Self[i] := src[i];
end;
end;
end else begin
inherited Assign(Source);
end;
end;
{ TArrayOfFloatDoubleRemotable }
function TArrayOfFloatDoubleRemotable.GetItem(AIndex: Integer): Double;
begin
CheckIndex(AIndex);
Result := FData[AIndex];
end;
procedure TArrayOfFloatDoubleRemotable.SetItem(AIndex: Integer;const AValue: Double);
begin
CheckIndex(AIndex);
FData[AIndex] := AValue;
end;
function TArrayOfFloatDoubleRemotable.GetLength(): Integer;
begin
Result := System.Length(FData);
end;
procedure TArrayOfFloatDoubleRemotable.SaveItem(AStore: IFormatterBase;
const AName: String; const AIndex: Integer);
begin
AStore.Put(AName,TypeInfo(Double),FData[AIndex]);
end;
procedure TArrayOfFloatDoubleRemotable.LoadItem(AStore: IFormatterBase;const AIndex: Integer);
var
sName : string;
begin
sName := GetItemName();
AStore.Get(TypeInfo(Double),sName,FData[AIndex]);
end;
class function TArrayOfFloatDoubleRemotable.GetItemTypeInfo(): PTypeInfo;
begin
Result := TypeInfo(Double);
end;
procedure TArrayOfFloatDoubleRemotable.SetLength(const ANewSize: Integer);
begin
if ( ANewSize < 0 ) then
raise EBaseRemoteException.CreateFmt(SERR_InvalidArrayLength,[ANewSize]);
System.SetLength(FData,ANewSize);
end;
procedure TArrayOfFloatDoubleRemotable.Assign(Source: TPersistent);
var
src : TArrayOfFloatDoubleRemotable;
i, c : Integer;
begin
if Assigned(Source) and Source.InheritsFrom(TArrayOfFloatDoubleRemotable) then begin
src := TArrayOfFloatDoubleRemotable(Source);
c := src.Length;
Self.SetLength(c);
if ( c > 0 ) then begin
for i := 0 to Pred(c) do begin
Self[i] := src[i];
end;
end;
end else begin
inherited Assign(Source);
end;
end;
{ TArrayOfFloatExtendedRemotable }
function TArrayOfFloatExtendedRemotable.GetItem(AIndex: Integer): Extended;
begin
CheckIndex(AIndex);
Result := FData[AIndex];
end;
procedure TArrayOfFloatExtendedRemotable.SetItem(AIndex: Integer;const AValue: Extended);
begin
CheckIndex(AIndex);
FData[AIndex] := AValue;
end;
function TArrayOfFloatExtendedRemotable.GetLength(): Integer;
begin
Result := System.Length(FData);
end;
procedure TArrayOfFloatExtendedRemotable.SaveItem(AStore: IFormatterBase;
const AName: String; const AIndex: Integer);
begin
AStore.Put(AName,TypeInfo(Extended),FData[AIndex]);
end;
procedure TArrayOfFloatExtendedRemotable.LoadItem(AStore: IFormatterBase;const AIndex: Integer);
var
sName : string;
begin
sName := GetItemName();
AStore.Get(TypeInfo(Extended),sName,FData[AIndex]);
end;
class function TArrayOfFloatExtendedRemotable.GetItemTypeInfo(): PTypeInfo;
begin
Result := TypeInfo(Extended);
end;
procedure TArrayOfFloatExtendedRemotable.SetLength(const ANewSize: Integer);
begin
if ( ANewSize < 0 ) then
raise EBaseRemoteException.CreateFmt(SERR_InvalidArrayLength,[ANewSize]);
System.SetLength(FData,ANewSize);
end;
procedure TArrayOfFloatExtendedRemotable.Assign(Source: TPersistent);
var
src : TArrayOfFloatExtendedRemotable;
i, c : Integer;
begin
if Assigned(Source) and Source.InheritsFrom(TArrayOfFloatExtendedRemotable) then begin
src := TArrayOfFloatExtendedRemotable(Source);
c := src.Length;
Self.SetLength(c);
if ( c > 0 ) then begin
for i := 0 to Pred(c) do begin
Self[i] := src[i];
end;
end;
end else begin
inherited Assign(Source);
end;
end;
{ TArrayOfFloatCurrencyRemotable }
function TArrayOfFloatCurrencyRemotable.GetItem(AIndex: Integer): Currency;
begin
CheckIndex(AIndex);
Result := FData[AIndex];
end;
procedure TArrayOfFloatCurrencyRemotable.SetItem(AIndex: Integer;const AValue: Currency);
begin
CheckIndex(AIndex);
FData[AIndex] := AValue;
end;
function TArrayOfFloatCurrencyRemotable.GetLength(): Integer;
begin
Result := System.Length(FData);
end;
procedure TArrayOfFloatCurrencyRemotable.SaveItem(AStore: IFormatterBase;
const AName: String; const AIndex: Integer);
begin
AStore.Put(AName,TypeInfo(Currency),FData[AIndex]);
end;
procedure TArrayOfFloatCurrencyRemotable.LoadItem(AStore: IFormatterBase;const AIndex: Integer);
var
sName : string;
begin
sName := GetItemName();
AStore.Get(TypeInfo(Currency),sName,FData[AIndex]);
end;
class function TArrayOfFloatCurrencyRemotable.GetItemTypeInfo(): PTypeInfo;
begin
Result := TypeInfo(Currency);
end;
procedure TArrayOfFloatCurrencyRemotable.SetLength(const ANewSize: Integer);
begin
if ( ANewSize < 0 ) then
raise EBaseRemoteException.CreateFmt(SERR_InvalidArrayLength,[ANewSize]);
System.SetLength(FData,ANewSize);
end;
procedure TArrayOfFloatCurrencyRemotable.Assign(Source: TPersistent);
var
src : TArrayOfFloatCurrencyRemotable;
i, c : Integer;
begin
if Assigned(Source) and Source.InheritsFrom(TArrayOfFloatCurrencyRemotable) then begin
src := TArrayOfFloatCurrencyRemotable(Source);
c := src.Length;
Self.SetLength(c);
if ( c > 0 ) then begin
for i := 0 to Pred(c) do begin
Self[i] := src[i];
end;
end;
end else begin
inherited Assign(Source);
end;
end;
{ THeaderBlock }
function THeaderBlock.HasmustUnderstand: boolean;
begin
Result := ( FmustUnderstand <> 0 );
end;
function THeaderBlock.GetName : string;
begin
if IsStrEmpty(FName) then
FName := GetExternalName(PTypeInfo(Self.ClassInfo));
Result := FName;
end;
procedure THeaderBlock.SetmustUnderstand(const AValue: Integer);
begin
if ( AValue <> 0 ) then
FmustUnderstand := 1
else
FmustUnderstand := 0;
end;
procedure THeaderBlock.SetName(const AValue: string);
begin
FName := AValue;
end;
{ TSimpleContentHeaderBlock }
class procedure TSimpleContentHeaderBlock.Save(
AObject : TBaseRemotable;
AStore : IFormatterBase;
const AName : String;
const ATypeInfo : PTypeInfo
);
var
locSerializer : TObjectSerializer;
locOptionChanged : Boolean;
begin
locSerializer := TBaseComplexTypeRegistryItem(GetTypeRegistry().ItemByTypeInfo[ATypeInfo]).GetSerializer();
if ( locSerializer <> nil ) then begin
locOptionChanged := not ( osoDontDoBeginWrite in locSerializer.Options );
if locOptionChanged then
locSerializer.Options := locSerializer.Options + [osoDontDoBeginWrite];
AStore.BeginObject(AName,ATypeInfo);
try
if ( AObject <> nil ) then
AStore.PutScopeInnerValue(TypeInfo(string),TSimpleContentHeaderBlock(AObject).Value);
locSerializer.Save(AObject,AStore,AName,ATypeInfo);
finally
AStore.EndScope();
if locOptionChanged then
locSerializer.Options := locSerializer.Options - [osoDontDoBeginWrite];
end;
end else begin
raise ETypeRegistryException.CreateFmt(SERR_NoSerializerFoThisType,[ATypeInfo^.Name])
end;
end;
class procedure TSimpleContentHeaderBlock.Load(
Var AObject : TObject;
AStore : IFormatterBase;
var AName : String;
const ATypeInfo : PTypeInfo
);
var
locSerializer : TObjectSerializer;
locStrBuffer : string;
begin
locSerializer := TBaseComplexTypeRegistryItem(GetTypeRegistry().ItemByTypeInfo[ATypeInfo]).GetSerializer();
if ( locSerializer <> nil ) then begin
if not ( osoDontDoBeginRead in locSerializer.Options ) then
locSerializer.Options := locSerializer.Options + [osoDontDoBeginRead];
if ( AStore.BeginObjectRead(AName,ATypeInfo) >= 0 ) then begin
try
if AStore.IsCurrentScopeNil() then
Exit; // ???? FreeAndNil(AObject);
if not Assigned(AObject) then
AObject := locSerializer.Target.Create();
locStrBuffer := '';
AStore.GetScopeInnerValue(TypeInfo(string),locStrBuffer);
TSimpleContentHeaderBlock(AObject).Value := locStrBuffer;
locSerializer.Read(AObject,AStore,AName,ATypeInfo);
finally
AStore.EndScopeRead();
end;
end;
end else begin
raise ETypeRegistryException.CreateFmt(SERR_NoSerializerFoThisType,[ATypeInfo^.Name])
end;
end;
{ THeaderBlockProxy }
procedure THeaderBlockProxy.SetActualObject(const AValue: TBaseRemotable);
var
locObj : TObject;
begin
if ( FActualObject <> AValue ) then begin
if OwnObject and ( FActualObject <> nil ) then begin
locObj := FActualObject;
FActualObject := nil;
locObj.Free();
end;
FActualObject := AValue;
end;
end;
function THeaderBlockProxy.GetName : string;
begin
if FNameSet then
Result := inherited GetName()
else if ( ActualObject <> nil ) then
Result := GetExternalName(PTypeInfo(ActualObject.ClassInfo))
else
Result := Self.ClassName();
end;
procedure THeaderBlockProxy.SetName(const AValue: string);
begin
inherited SetName(AValue);
FNameSet := not IsStrEmpty(AValue);
end;
procedure THeaderBlockProxy.FreeObjectProperties();
begin
if OwnObject then
FreeAndNil(FActualObject);
inherited FreeObjectProperties();
end;
class procedure THeaderBlockProxy.Save(
AObject : TBaseRemotable;
AStore : IFormatterBase;
const AName : string;
const ATypeInfo : PTypeInfo
);
var
locObj : THeaderBlockProxy;
begin
if ( AObject <> nil ) and AObject.InheritsFrom(THeaderBlockProxy) then begin
locObj := THeaderBlockProxy(AObject);
if ( locObj.ActualObject <> nil ) then
locObj.ActualObject.Save(
locObj.ActualObject,
AStore,
AName,
PTypeInfo(locObj.ActualObject.ClassInfo)
);
end;
end;
class procedure THeaderBlockProxy.Load(
var AObject : TObject;
AStore : IFormatterBase;
var AName : string;
const ATypeInfo : PTypeInfo
);
var
locObj : THeaderBlockProxy;
locActualObj : TObject;
begin
if ( AObject <> nil ) and AObject.InheritsFrom(THeaderBlockProxy) then begin
locObj := THeaderBlockProxy(AObject);
if ( locObj.ActualObject <> nil ) then
locActualObj := locObj.ActualObject;
locObj.ActualObject.Load(
locActualObj,
AStore,
AName,
PTypeInfo(locObj.ActualObject.ClassInfo)
);
if ( locObj.ActualObject <> locActualObj ) then
locObj.ActualObject := TBaseRemotable(locActualObj);
end;
end;
{ TStoredPropertyManager }
procedure TStoredPropertyManager.Error(Const AMsg: string);
begin
raise EPropertyException.Create(AMsg);
end;
procedure TStoredPropertyManager.Error(
Const AMsg: string;
Const AArgs: array of const
);
begin
raise EPropertyException.CreateFmt(AMsg,AArgs);
end;
procedure TStoredPropertyManager.SetProperty(Const AName, AValue: string);
begin
FData.Values[AName] := AValue;
end;
procedure TStoredPropertyManager.SetProperties(Const APropsStr: string);
var
lst : TStringList;
i : Integer;
begin
if ( Length(Trim(APropsStr)) = 0 ) then
Exit;
lst := TStringList.Create();
try
lst.QuoteChar := #0;
lst.Delimiter := PROP_LIST_DELIMITER;
lst.DelimitedText := APropsStr;
for i := 0 to Pred(lst.Count) do
SetProperty(lst.Names[i],lst.Values[lst.Names[i]]);
finally
lst.Free();
end;
end;
function TStoredPropertyManager.GetProperty(Const AName: String): string;
begin
Result := FData.Values[AName];
end;
function TStoredPropertyManager.GetPropertyNames(ADest: TStrings): Integer;
var
i : Integer;
begin
ADest.Clear();
Result := FData.Count;
for i := 0 to Pred(Result) do
ADest.Add(FData.Names[i]);
end;
procedure TStoredPropertyManager.Clear();
begin
FData.Clear();
end;
procedure TStoredPropertyManager.Copy(
ASource : IPropertyManager;
Const AClearBefore : Boolean
);
var
lst : TStringList;
i : Integer;
s : string;
begin
if AClearBefore then
Clear();
if Assigned(ASource) then begin
lst := TStringList.Create();
try
ASource.GetPropertyNames(lst);
for i := 0 to Pred(lst.Count) do begin
s := lst[i];
SetProperty(s,ASource.GetProperty(s));
end;
finally
lst.Free();
end;
end;
end;
constructor TStoredPropertyManager.Create();
begin
FData := TStringList.Create();
end;
destructor TStoredPropertyManager.Destroy();
begin
FreeAndNil(FData);
inherited Destroy();
end;
{ TAbstractComplexRemotable }
class procedure TAbstractComplexRemotable.RegisterAttributeProperty(const AProperty: shortstring);
var
ri : TSerializeOptions;
begin
ri := GetSerializeOptionsRegistry().Find(Self);
if not Assigned(ri) then
ri := GetSerializeOptionsRegistry().RegisterClass(Self);
ri.AddAttributeField(AProperty);
end;
class procedure TAbstractComplexRemotable.RegisterAttributeProperties(const APropertList: array of shortstring);
var
i : Integer;
begin
for i := Low(APropertList) to High(APropertList) do
RegisterAttributeProperty(APropertList[i]);
end;
class function TAbstractComplexRemotable.IsAttributeProperty(const AProperty: shortstring): Boolean;
var
ri : TSerializeOptions;
pc : TClass;
sor : TSerializeOptionsRegistry;
begin
Result := False;
if ( Self = TBaseComplexRemotable ) then
Exit;
sor := GetSerializeOptionsRegistry();
pc := Self;
while Assigned(pc) and pc.InheritsFrom(TBaseComplexRemotable) do begin
ri := sor.Find(TBaseComplexRemotableClass(pc));
if Assigned(ri) then begin
Result := ri.IsAttributeField(AProperty);
Exit;
end;
pc := pc.ClassParent;
end;
end;
procedure TAbstractComplexRemotable.Assign(Source: TPersistent);
var
propList : PPropList;
i, propCount, propListLen : Integer;
p, sp : PPropInfo;
selfTypeInfo : PTypeInfo;
srcObj, dstObj : TObject;
begin
if not Assigned(Source) then
Exit;
selfTypeInfo := Self.ClassInfo;
propCount := GetTypeData(selfTypeInfo)^.PropCount;
if ( propCount > 0 ) then begin
propListLen := GetPropList(selfTypeInfo,propList);
try
for i := 0 to Pred(propCount) do begin
p := propList^[i];
sp := GetPropInfo(Source,p^.Name);
if Assigned(sp) and Assigned(sp^.GetProc) and
((p^.PropType^.Kind = tkClass) or Assigned(p^.SetProc))
then begin
case p^.PropType^.Kind of
tkInt64{$IFDEF HAS_QWORD} ,tkQWord{$ENDIF} :
SetInt64Prop(Self,p,GetInt64Prop(Source,p^.Name));
{$IFDEF HAS_TKBOOL}tkBool,{$ENDIF} tkEnumeration, tkInteger :
SetOrdProp(Self,p,GetOrdProp(Source,p^.Name));
tkLString{$IFDEF FPC}, tkAString{$ENDIF} :
SetStrProp(Self,p,GetStrProp(Source,p^.Name));
{$IFDEF WST_UNICODESTRING}
tkUString :
SetUnicodeStrProp(Self,p,GetUnicodeStrProp(Source,p^.Name));
{$ENDIF WST_UNICODESTRING}
tkClass :
begin
srcObj := GetObjectProp(Source,p^.Name);
dstObj := GetObjectProp(Self,p^.Name);
if (dstObj <> nil) then begin
if ( not Assigned(dstObj) ) and
( Assigned(srcObj) and srcObj.InheritsFrom(TAbstractComplexRemotable) )
then begin
dstObj := TAbstractComplexRemotableClass(srcObj.ClassType).Create();
SetObjectProp(Self,p,dstObj);
end;
if Assigned(dstObj) then begin
if ( srcObj = nil ) then begin
FreeAndNil(dstObj);
SetObjectProp(Self,p,dstObj);
end else begin
if dstObj.InheritsFrom(TPersistent) and srcObj.InheritsFrom(TPersistent) then
TPersistent(dstObj).Assign(TPersistent(srcObj));
end;
end;
end;
end;
tkFloat :
SetFloatProp(Self,p,GetFloatProp(Source,p^.Name));
end;
end;
end;
finally
Freemem(propList,propListLen*SizeOf(Pointer));
end;
end;
end;
function TAbstractComplexRemotable.Equal(const ACompareTo : TBaseRemotable) : Boolean;
var
propList : PPropList;
i, propCount, propListLen : Integer;
p, sp : PPropInfo;
selfTypeInfo : PTypeInfo;
srcObj, dstObj : TObject;
ok : Boolean;
currencyA, currencyB : record
case Integer of
0 : (CurrencyValue : Currency;);
1 : (Int64Value : Int64;);
end;
begin
Result := False;
if not Assigned(ACompareTo) then
Exit;
if not ACompareTo.InheritsFrom(Self.ClassType) then
Exit;
ok := True;
selfTypeInfo := Self.ClassInfo;
propCount := GetTypeData(selfTypeInfo)^.PropCount;
if ( propCount > 0 ) then begin
propListLen := GetPropList(selfTypeInfo,propList);
try
for i := 0 to Pred(propCount) do begin
p := propList^[i];
sp := GetPropInfo(Self,p^.Name);
if Assigned(sp) and Assigned(sp^.GetProc) then begin
case p^.PropType^.Kind of
tkInt64{$IFDEF HAS_QWORD} ,tkQWord{$ENDIF} :
ok := ( GetInt64Prop(Self,p^.Name) = GetInt64Prop(ACompareTo,p^.Name) );
{$IFDEF HAS_TKBOOL}tkBool,{$ENDIF} tkEnumeration, tkInteger :
ok := ( GetOrdProp(Self,p^.Name) = GetOrdProp(ACompareTo,p^.Name) );
{$IFDEF FPC}
tkAString,
{$ENDIF FPC}
{$IFDEF WST_UNICODESTRING}
tkUString,
{$ENDIF WST_UNICODESTRING}
tkLString :
ok := ( GetStrProp(Self,p^.Name) = GetStrProp(ACompareTo,p^.Name) );
tkClass :
begin
if GetTypeData(p^.PropType{$IFDEF WST_DELPHI}^{$ENDIF})^.ClassType.InheritsFrom(TBaseRemotable) then begin
srcObj := GetObjectProp(Self,p^.Name);
dstObj := GetObjectProp(ACompareTo,p^.Name);
ok := ( Assigned(srcObj) and TBaseRemotable(srcObj).Equal(TBaseRemotable(dstObj)) ) or
( ( srcObj = nil ) and ( dstObj = nil ) ) ;
end;
end;
tkFloat :
begin
case GetTypeData(p^.PropType{$IFDEF WST_DELPHI}^{$ENDIF})^.FloatType of
ftSingle, ftDouble, ftExtended :
ok := (GetFloatProp(Self,p^.Name) = GetFloatProp(ACompareTo,p^.Name));
ftCurr :
begin
currencyA.CurrencyValue := GetFloatProp(Self,p^.Name);
currencyB.CurrencyValue := GetFloatProp(ACompareTo,p^.Name);
ok := (currencyA.Int64Value = currencyB.Int64Value);
end;
else
ok := (GetFloatProp(Self,p^.Name) = GetFloatProp(ACompareTo,p^.Name));
end;
end;
end;
if not ok then
Break;
end;
end;
finally
Freemem(propList,propListLen*SizeOf(Pointer));
end;
end;
Result := ok;
end;
{ TBaseComplexSimpleContentRemotable }
class procedure TBaseComplexSimpleContentRemotable.Save(
AObject: TBaseRemotable;
AStore: IFormatterBase;
const AName: string;
const ATypeInfo: PTypeInfo
);
{$IFDEF USE_SERIALIZE}
var
locSerializer : TSimpleContentObjectSerializer;
begin
locSerializer := TSimpleContentObjectRegistryItem(GetTypeRegistry().ItemByTypeInfo[ATypeInfo]).GetSerializer();
if ( locSerializer <> nil ) then
locSerializer.Save(AObject,AStore,AName,ATypeInfo)
else
raise ETypeRegistryException.CreateFmt(SERR_NoSerializerFoThisType,[ATypeInfo^.Name])
end;
{$ELSE USE_SERIALIZE}
Var
propList : PPropList;
i, propCount, propListLen : Integer;
pt : PTypeInfo;
int64Data : Int64;
strData : String;
objData : TObject;
boolData : Boolean;
enumData : TEnumBuffer;
floatDt : TFloatBuffer;
p : PPropInfo;
oldSS : TSerializationStyle;
tr : TTypeRegistry;
regItem : TTypeRegistryItem;
propName : string;
begin
oldSS := AStore.GetSerializationStyle();
AStore.BeginObject(AName,ATypeInfo);
try
if not Assigned(AObject) then begin
AStore.NilCurrentScope();
Exit;
end;
SaveValue(AObject,AStore);
propCount := GetTypeData(ATypeInfo)^.PropCount;
if ( propCount > 0 ) then begin
propListLen := GetPropList(ATypeInfo,propList);
try
tr := GetTypeRegistry();
regItem := tr.ItemByTypeInfo[ATypeInfo];
AStore.SetSerializationStyle(ssAttibuteSerialization);
for i := 0 to Pred(propCount) do begin
p := propList^[i];
pt := p^.PropType{$IFDEF WST_DELPHI}^{$ENDIF};
propName := regItem.GetExternalPropertyName(p^.Name);
if IsStoredProp(AObject,p) then begin
case pt^.Kind of
tkInt64{$IFDEF HAS_QWORD},tkQWord{$ENDIF} :
begin
int64Data := GetOrdProp(AObject,p^.Name);
AStore.Put(propName,pt,int64Data);
end;
tkLString
{$IFDEF FPC},tkAString{$ENDIF}
{$IFDEF WST_UNICODESTRING}, tkUString{$ENDIF}:
begin
strData := GetStrProp(AObject,p^.Name);
AStore.Put(propName,pt,strData);
end;
tkClass :
begin
objData := GetObjectProp(AObject,p^.Name);
AStore.Put(propName,pt,objData);
end;
{$IFDEF HAS_TKBOOL}
tkBool :
begin
boolData := Boolean(GetOrdProp(AObject,p^.Name));
AStore.Put(propName,pt,boolData);
end;
{$ENDIF}
tkEnumeration,tkInteger :
begin
{$IFDEF WST_DELPHI}
if ( pt^.Kind = tkEnumeration ) and
( GetTypeData(pt)^.BaseType^ = TypeInfo(Boolean) )
then begin
boolData := Boolean(GetOrdProp(AObject,p^.Name));
AStore.Put(propName,pt,boolData);
end else begin
{$ENDIF}
FillChar(enumData,SizeOf(enumData),#0);
case GetTypeData(pt)^.OrdType of
otSByte :
begin
enumData.ShortIntData := ShortInt(GetOrdProp(AObject,p^.Name));
AStore.Put(propName,pt,enumData.ShortIntData);
end;
otUByte :
begin
enumData.ByteData := Byte(GetOrdProp(AObject,p^.Name));
AStore.Put(propName,pt,enumData.ByteData);
end;
otSWord :
begin
enumData.SmallIntData := SmallInt(GetOrdProp(AObject,p^.Name));
AStore.Put(propName,pt,enumData.SmallIntData);
end;
otUWord :
begin
enumData.WordData := Word(GetOrdProp(AObject,p^.Name));
AStore.Put(propName,pt,enumData.WordData);
end;
otSLong :
begin
enumData.SLongIntData := LongInt(GetOrdProp(AObject,p^.Name));
AStore.Put(propName,pt,enumData.SLongIntData);
end;
otULong :
begin
enumData.ULongIntData := LongWord(GetOrdProp(AObject,p^.Name));
AStore.Put(propName,pt,enumData.ULongIntData);
end;
end;
{$IFDEF WST_DELPHI}
end;
{$ENDIF}
end;
tkFloat :
begin
FillChar(floatDt,SizeOf(floatDt),#0);
case GetTypeData(pt)^.FloatType of
ftSingle :
begin
floatDt.SingleData := GetFloatProp(AObject,p^.Name);
AStore.Put(propName,pt,floatDt.SingleData);
end;
ftDouble :
begin
floatDt.DoubleData := GetFloatProp(AObject,p^.Name);
AStore.Put(propName,pt,floatDt.DoubleData);
end;
ftExtended :
begin
floatDt.ExtendedData := Extended(GetFloatProp(AObject,p^.Name));
AStore.Put(propName,pt,floatDt.ExtendedData);
end;
ftCurr :
begin
floatDt.CurrencyData := GetFloatProp(AObject,p^.Name);
AStore.Put(propName,pt,floatDt.CurrencyData);
end;
{$IFDEF HAS_COMP}
ftComp :
begin
floatDt.CompData := GetFloatProp(AObject,p^.Name);
AStore.Put(propName,pt,floatDt.CompData);
end;
{$ENDIF}
end;
end;
end;
end;
end;
finally
Freemem(propList,propListLen*SizeOf(Pointer));
end;
end;
finally
AStore.EndScope();
AStore.SetSerializationStyle(oldSS);
end;
end;
{$ENDIF USE_SERIALIZE}
class procedure TBaseComplexSimpleContentRemotable.Load(
var AObject: TObject;
AStore: IFormatterBase;
var AName: string;
const ATypeInfo: PTypeInfo
);
{$IFDEF USE_SERIALIZE}
var
locSerializer : TSimpleContentObjectSerializer;
begin
locSerializer := TSimpleContentObjectRegistryItem(GetTypeRegistry().ItemByTypeInfo[ATypeInfo]).GetSerializer();
if ( locSerializer <> nil ) then
locSerializer.Read(AObject,AStore,AName,ATypeInfo)
else
raise ETypeRegistryException.CreateFmt(SERR_NoSerializerFoThisType,[ATypeInfo^.Name])
end;
{$ELSE USE_SERIALIZE}
Var
propList : PPropList;
i, propCount, propListLen : Integer;
pt : PTypeInfo;
propName : String;
int64Data : Int64;
strData : String;
objData : TObject;
objDataCreateHere : Boolean;
{$IFDEF HAS_TKBOOL}boolData : Boolean;{$ENDIF}
p : PPropInfo;
enumData : TEnumBuffer;
floatDt : TFloatExtendedType;
floatBuffer : TFloatBuffer;
persistType : TPropStoreType;
objTypeData : PTypeData;
oldSS : TSerializationStyle;
tr : TTypeRegistry;
regItem : TTypeRegistryItem;
begin
oldSS := AStore.GetSerializationStyle();
if ( AStore.BeginObjectRead(AName,ATypeInfo) >= 0 ) then begin
try
if AStore.IsCurrentScopeNil() then
Exit; // ???? FreeAndNil(AObject);
If Not Assigned(AObject) Then
AObject := Create();
LoadValue(AObject,AStore);
objTypeData := GetTypeData(ATypeInfo);
propCount := objTypeData^.PropCount;
If ( propCount > 0 ) Then Begin
propListLen := GetPropList(ATypeInfo,propList);
Try
tr := GetTypeRegistry();
regItem := tr.ItemByTypeInfo[ATypeInfo];
AStore.SetSerializationStyle(ssAttibuteSerialization);
For i := 0 To Pred(propCount) Do Begin
p := propList^[i];
persistType := IsStoredPropClass(objTypeData^.ClassType,p);
If ( persistType in [pstOptional,pstAlways] ) Then Begin
pt := p^.PropType{$IFDEF WST_DELPHI}^{$ENDIF};
propName := regItem.GetExternalPropertyName(p^.Name);
try
Case pt^.Kind Of
tkInt64{$IFDEF HAS_QWORD},tkQWord{$ENDIF} :
Begin
AStore.Get(pt,propName,int64Data);
SetOrdProp(AObject,p^.Name,int64Data);
End;
tkLString
{$IFDEF FPC},tkAString{$ENDIF}
{$IFDEF WST_UNICODESTRING}, tkUString{$ENDIF}:
Begin
AStore.Get(pt,propName,strData);
SetStrProp(AObject,p^.Name,strData);
End;
{$IFDEF HAS_TKBOOL}
tkBool :
Begin
AStore.Get(pt,propName,boolData);
SetOrdProp(AObject,p^.Name,Ord(boolData));
End;
{$ENDIF}
tkClass :
Begin
objData := GetObjectProp(AObject,p^.Name);
objDataCreateHere := not Assigned(objData);
try
AStore.Get(pt,propName,objData);
if objDataCreateHere then
SetObjectProp(AObject,p^.Name,objData);
finally
if objDataCreateHere then
FreeAndNil(objData);
end;
End;
tkEnumeration,tkInteger :
Begin
FillChar(enumData,SizeOf(enumData),#0);
Case GetTypeData(pt)^.OrdType Of
otSByte :
Begin
AStore.Get(pt,propName,enumData.ShortIntData);
int64Data := enumData.ShortIntData;
End;
otUByte :
Begin
AStore.Get(pt,propName,enumData.ByteData);
int64Data := enumData.ByteData;
End;
otSWord :
Begin
AStore.Get(pt,propName,enumData.SmallIntData);
int64Data := enumData.SmallIntData;
End;
otUWord :
Begin
AStore.Get(pt,propName,enumData.WordData);
int64Data := enumData.WordData;
End;
otSLong:
Begin
AStore.Get(pt,propName,enumData.SLongIntData);
int64Data := enumData.SLongIntData;
End;
otULong :
Begin
AStore.Get(pt,propName,enumData.ULongIntData);
int64Data := enumData.ULongIntData;
End;
End;
SetOrdProp(AObject,p^.Name,int64Data);
End;
tkFloat :
Begin
FillChar(floatDt,SizeOf(floatBuffer),#0);
Case GetTypeData(pt)^.FloatType Of
ftSingle :
Begin
AStore.Get(pt,propName,floatBuffer.SingleData);
floatDt := floatBuffer.SingleData;
End;
ftDouble :
Begin
AStore.Get(pt,propName,floatBuffer.DoubleData);
floatDt := floatBuffer.DoubleData;
End;
ftExtended :
Begin
AStore.Get(pt,propName,floatBuffer.ExtendedData);
floatDt := floatBuffer.ExtendedData;
End;
ftCurr :
Begin
AStore.Get(pt,propName,floatBuffer.CurrencyData);
floatDt := floatBuffer.CurrencyData;
End;
ftComp :
Begin
AStore.Get(pt,propName,floatBuffer.CompData);
floatDt := floatBuffer.CompData;
End;
End;
SetFloatProp(AObject,p^.Name,floatDt);
End;
End;
except
on E : EServiceException do begin
if ( persistType = pstAlways ) then
raise;
end;
end;
End;
End;
Finally
Freemem(propList,propListLen*SizeOf(Pointer));
End;
End;
finally
AStore.EndScopeRead();
AStore.SetSerializationStyle(oldSS);
end;
end;
end;
{$ENDIF USE_SERIALIZE}
{ TComplexEnumContentRemotable }
class procedure TComplexEnumContentRemotable.SaveValue(
AObject : TBaseRemotable;
AStore : IFormatterBase
);
begin
AStore.PutScopeInnerValue(GetEnumTypeInfo(),(AObject as TComplexEnumContentRemotable).GetValueAddress()^);
end;
class procedure TComplexEnumContentRemotable.LoadValue(
var AObject : TObject;
AStore : IFormatterBase
);
var
locObject : TComplexEnumContentRemotable;
locBuffer : Pointer;
begin
locObject := AObject as TComplexEnumContentRemotable;
locBuffer := locObject.GetValueAddress();
AStore.GetScopeInnerValue(GetEnumTypeInfo(),locBuffer^);
end;
{ TComplexInt32SContentRemotable }
class procedure TComplexInt32SContentRemotable.SaveValue(
AObject : TBaseRemotable;
AStore : IFormatterBase
);
begin
AStore.PutScopeInnerValue(TypeInfo(LongInt),(AObject as TComplexInt32SContentRemotable).Value);
end;
class procedure TComplexInt32SContentRemotable.LoadValue(
var AObject : TObject;
AStore : IFormatterBase
);
var
i : LongInt;
begin
i := 0;
AStore.GetScopeInnerValue(TypeInfo(LongInt),i);
(AObject as TComplexInt32SContentRemotable).Value := i;
end;
function TComplexInt32SContentRemotable.wstHasValue: Boolean;
begin
Result := (FValue <> 0);
end;
{ TComplexInt32UContentRemotable }
class procedure TComplexInt32UContentRemotable.SaveValue(
AObject : TBaseRemotable;
AStore : IFormatterBase
);
begin
AStore.PutScopeInnerValue(TypeInfo(LongWord),(AObject as TComplexInt32UContentRemotable).Value);
end;
class procedure TComplexInt32UContentRemotable.LoadValue(
var AObject : TObject;
AStore : IFormatterBase
);
var
i : LongWord;
begin
i := 0;
AStore.GetScopeInnerValue(TypeInfo(LongWord),i);
(AObject as TComplexInt32UContentRemotable).Value := i;
end;
function TComplexInt32UContentRemotable.wstHasValue() : Boolean;
begin
Result := (FValue <> 0);
end;
{ TComplexInt16SContentRemotable }
class procedure TComplexInt16SContentRemotable.SaveValue(
AObject : TBaseRemotable;
AStore : IFormatterBase
);
begin
AStore.PutScopeInnerValue(TypeInfo(SmallInt),(AObject as TComplexInt16SContentRemotable).Value);
end;
class procedure TComplexInt16SContentRemotable.LoadValue(
var AObject : TObject;
AStore : IFormatterBase
);
var
i : SmallInt;
begin
i := 0;
AStore.GetScopeInnerValue(TypeInfo(SmallInt),i);
(AObject as TComplexInt16SContentRemotable).Value := i;
end;
function TComplexInt16SContentRemotable.wstHasValue() : Boolean;
begin
Result := (FValue <> 0);
end;
{ TComplexInt16UContentRemotable }
class procedure TComplexInt16UContentRemotable.SaveValue(
AObject : TBaseRemotable;
AStore : IFormatterBase
);
begin
AStore.PutScopeInnerValue(TypeInfo(Word),(AObject as TComplexInt16UContentRemotable).Value);
end;
class procedure TComplexInt16UContentRemotable.LoadValue(
var AObject : TObject;
AStore : IFormatterBase
);
var
i : Word;
begin
i := 0;
AStore.GetScopeInnerValue(TypeInfo(Word),i);
(AObject as TComplexInt16UContentRemotable).Value := i;
end;
function TComplexInt16UContentRemotable.wstHasValue: Boolean;
begin
Result := (FValue <> 0);
end;
{ TComplexFloatExtendedContentRemotable }
class procedure TComplexFloatExtendedContentRemotable.SaveValue(
AObject : TBaseRemotable;
AStore : IFormatterBase
);
begin
AStore.PutScopeInnerValue(TypeInfo(Extended),(AObject as TComplexFloatExtendedContentRemotable).Value);
end;
class procedure TComplexFloatExtendedContentRemotable.LoadValue(
var AObject : TObject;
AStore : IFormatterBase
);
var
i : Extended;
begin
i := 0;
AStore.GetScopeInnerValue(TypeInfo(Extended),i);
(AObject as TComplexFloatExtendedContentRemotable).Value := i;
end;
function TComplexFloatExtendedContentRemotable.wstHasValue: Boolean;
begin
Result := (FValue <> 0);
end;
{ TComplexFloatDoubleContentRemotable }
class procedure TComplexFloatDoubleContentRemotable.SaveValue(
AObject : TBaseRemotable;
AStore : IFormatterBase
);
begin
AStore.PutScopeInnerValue(TypeInfo(Double),(AObject as TComplexFloatDoubleContentRemotable).Value);
end;
class procedure TComplexFloatDoubleContentRemotable.LoadValue(
var AObject : TObject;
AStore : IFormatterBase
);
var
i : Double;
begin
i := 0;
AStore.GetScopeInnerValue(TypeInfo(Double),i);
(AObject as TComplexFloatDoubleContentRemotable).Value := i;
end;
function TComplexFloatDoubleContentRemotable.wstHasValue: Boolean;
begin
Result := (FValue <> 0);
end;
{ TComplexStringContentRemotable }
class procedure TComplexStringContentRemotable.SaveValue(
AObject : TBaseRemotable;
AStore : IFormatterBase
);
begin
AStore.PutScopeInnerValue(TypeInfo(string),(AObject as TComplexStringContentRemotable).Value);
end;
class procedure TComplexStringContentRemotable.LoadValue(
var AObject : TObject;
AStore : IFormatterBase
);
var
i : string;
begin
i := '';
AStore.GetScopeInnerValue(TypeInfo(string),i);
(AObject as TComplexStringContentRemotable).Value := i;
end;
function TComplexStringContentRemotable.wstHasValue: Boolean;
begin
Result := (FValue <> '');
end;
{ TComplexWideStringContentRemotable }
class procedure TComplexWideStringContentRemotable.SaveValue(
AObject: TBaseRemotable;
AStore: IFormatterBase
);
begin
AStore.PutScopeInnerValue(TypeInfo(WideString),(AObject as TComplexWideStringContentRemotable).Value);
end;
class procedure TComplexWideStringContentRemotable.LoadValue(
var AObject: TObject;
AStore: IFormatterBase
);
var
i : WideString;
begin
i := '';
AStore.GetScopeInnerValue(TypeInfo(WideString),i);
(AObject as TComplexWideStringContentRemotable).Value := i;
end;
function TComplexWideStringContentRemotable.wstHasValue() : Boolean;
begin
Result := (FValue <> '');
end;
{$IFDEF WST_UNICODESTRING}
{ TComplexUnicodeStringContentRemotable }
class procedure TComplexUnicodeStringContentRemotable.SaveValue(
AObject: TBaseRemotable;
AStore: IFormatterBase
);
begin
AStore.PutScopeInnerValue(TypeInfo(UnicodeString),(AObject as TComplexUnicodeStringContentRemotable).Value);
end;
class procedure TComplexUnicodeStringContentRemotable.LoadValue(
var AObject: TObject;
AStore: IFormatterBase
);
var
i : UnicodeString;
begin
i := '';
AStore.GetScopeInnerValue(TypeInfo(UnicodeString),i);
(AObject as TComplexUnicodeStringContentRemotable).Value := i;
end;
function TComplexUnicodeStringContentRemotable.wstHasValue() : Boolean;
begin
Result := (FValue <> '');
end;
{$ENDIF WST_UNICODESTRING}
{ TDateRemotable }
class function TDateRemotable.ToStr(const ADate : TDateTimeRec) : string;
begin
Result := xsd_DateTimeToStr(ADate,xdkDate);
end;
class function TDateRemotable.Parse(const ABuffer : string) : TDateTimeRec;
begin
Result := xsd_StrToDate(ABuffer,xdkDate);
end;
{ TDateTimeRemotable }
class function TDateTimeRemotable.ToStr(const ADate: TDateTimeRec): string;
begin
Result := xsd_DateTimeToStr(ADate,xdkDateTime);
end;
class function TDateTimeRemotable.Parse(const ABuffer: string): TDateTimeRec;
begin
Result := xsd_StrToDate(ABuffer,xdkDateTime);
end;
function TDateTimeRemotable.GetDatepart(const AIndex: Integer): Integer;
begin
case AIndex of
3 : Result := HourOf(AsDate);
4 : Result := MinuteOf(AsDate);
5 : Result := SecondOf(AsDate);
else
Result := inherited GetDatepart(AIndex);
end;
end;
{ TBaseDateRemotable }
procedure TBaseDateRemotable.SetDate(const AIndex : Integer; const AValue: TDateTime);
begin
FDate.Date := AValue;
if ( AIndex = 1 ) then begin
if ( FDate.HourOffset <> 0 ) then
FDate.Date := date_utils.IncHour(FDate.Date,FDate.HourOffset);
if ( FDate.MinuteOffset <> 0 ) then
FDate.Date := IncMinute(FDate.Date,FDate.MinuteOffset);
end;
end;
class procedure TBaseDateRemotable.Save(
AObject : TBaseRemotable;
AStore : IFormatterBase;
const AName : string;
const ATypeInfo : PTypeInfo
);
var
buffer : string;
begin
buffer := TBaseDateRemotable(AObject).AsString;
AStore.Put(AName,TypeInfo(string),buffer);
end;
class procedure TBaseDateRemotable.Load(
var AObject : TObject;
AStore : IFormatterBase;
var AName : string;
const ATypeInfo : PTypeInfo
);
var
buffer : string;
begin
buffer := '';
AStore.Get(TypeInfo(string),AName,buffer);
if ( AObject = nil ) then
AObject := Create();
TBaseDateRemotable(AObject).AsString := buffer;
end;
procedure TBaseDateRemotable.Assign(Source: TPersistent);
begin
if Source.InheritsFrom(TBaseDateRemotable) then begin
FDate := TBaseDateRemotable(Source).FDate;
end else begin
inherited Assign(Source);
end;
end;
function TBaseDateRemotable.Equal(const ACompareTo : TBaseRemotable) : Boolean;
begin
Result := ( Self = ACompareTo ) or
( Assigned(ACompareTo) and
ACompareTo.InheritsFrom(TBaseDateRemotable) and
( Self.AsDate = TBaseDateRemotable(ACompareTo).AsDate )
);
end;
function TBaseDateRemotable.wstHasValue() : Boolean;
begin
Result := (FDate.Date <> 0);
end;
function TBaseDateRemotable.GetDate(const AIndex : Integer) : TDateTime;
begin
Result := FDate.Date;
if ( AIndex = 1 ) then begin
if ( FDate.HourOffset <> 0 ) then
Result := date_utils.IncHour(Result,-FDate.HourOffset);
if ( FDate.MinuteOffset <> 0 ) then
Result := date_utils.IncMinute(Result,-FDate.MinuteOffset);
end;
end;
function TBaseDateRemotable.GetDatepart(const AIndex: Integer): Integer;
begin
case AIndex of
0 : Result := YearOf(AsDate);
1 : Result := MonthOf(AsDate);
2 : Result := DayOf(AsDate);
else
Result := 0;
end;
end;
function TBaseDateRemotable.GetAsString: string;
begin
Result := ToStr(FDate);
end;
function TBaseDateRemotable.GetOffset(const Index: Integer): Shortint;
begin
if ( Index = 0 ) then
Result := FDate.HourOffset
else
Result := FDate.MinuteOffset;
end;
procedure TBaseDateRemotable.SetAsString(const AValue: string);
begin
if (AValue<>'') then
FDate := Parse(AValue)
else
FillChar(FDate,SizeOf(TDateTimeRec),0);
end;
procedure TBaseDateRemotable.SetOffset(const Index: Integer; const Value: Shortint);
begin
if ( Index = 0 ) then begin
if ( Value >= -14 ) and ( Value <= 14 ) then
FDate.HourOffset := Value
else
raise Exception.CreateFmt(SERR_InvalidHourOffetValue,[Value]);
end else begin
if ( Value >= -59 ) and ( Value <= 59 ) then
FDate.MinuteOffset := Value
else
raise Exception.CreateFmt(SERR_InvalidMinuteOffetValue,[Value]);
end;
end;
class function TBaseDateRemotable.ToStr(const ADate: TDateTime): string;
var
locTemp : TDateTimeRec;
begin
locTemp.Date := ADate;
locTemp.HourOffset := 0;
locTemp.MinuteOffset := 0;
Result := ToStr(locTemp);
end;
class function TBaseDateRemotable.ParseToUTC(const ABuffer : string) : TDateTime;
begin
Result := NormalizeToUTC(Parse(ABuffer));
end;
{ TComplexInt8SContentRemotable }
class procedure TComplexInt8SContentRemotable.SaveValue(
AObject : TBaseRemotable;
AStore : IFormatterBase
);
begin
AStore.PutScopeInnerValue(TypeInfo(ShortInt),(AObject as TComplexInt8SContentRemotable).Value);
end;
class procedure TComplexInt8SContentRemotable.LoadValue(
var AObject : TObject;
AStore : IFormatterBase
);
var
i : ShortInt;
begin
i := 0;
AStore.GetScopeInnerValue(TypeInfo(ShortInt),i);
(AObject as TComplexInt8SContentRemotable).Value := i;
end;
function TComplexInt8SContentRemotable.wstHasValue() : Boolean;
begin
Result := (FValue <> 0);
end;
{ TComplexInt8UContentRemotable }
class procedure TComplexInt8UContentRemotable.SaveValue(
AObject : TBaseRemotable;
AStore : IFormatterBase
);
begin
AStore.PutScopeInnerValue(TypeInfo(Byte),(AObject as TComplexInt8UContentRemotable).Value);
end;
class procedure TComplexInt8UContentRemotable.LoadValue(
var AObject : TObject;
AStore : IFormatterBase
);
var
i : Byte;
begin
i := 0;
AStore.GetScopeInnerValue(TypeInfo(Byte),i);
(AObject as TComplexInt8UContentRemotable).Value := i;
end;
function TComplexInt8UContentRemotable.wstHasValue() : Boolean;
begin
Result := (FValue <> 0);
end;
{ TComplexFloatSingleContentRemotable }
class procedure TComplexFloatSingleContentRemotable.SaveValue(
AObject : TBaseRemotable;
AStore : IFormatterBase
);
begin
AStore.PutScopeInnerValue(TypeInfo(Single),(AObject as TComplexFloatSingleContentRemotable).Value);
end;
class procedure TComplexFloatSingleContentRemotable.LoadValue(
var AObject : TObject;
AStore : IFormatterBase
);
var
i : Single;
begin
i := 0;
AStore.GetScopeInnerValue(TypeInfo(Single),i);
(AObject as TComplexFloatSingleContentRemotable).Value := i;
end;
function TComplexFloatSingleContentRemotable.wstHasValue() : Boolean;
begin
Result := (FValue <> 0);
end;
{ TComplexCurrencyContentRemotable }
class procedure TComplexCurrencyContentRemotable.SaveValue(
AObject : TBaseRemotable;
AStore : IFormatterBase
);
begin
AStore.PutScopeInnerValue(TypeInfo(Currency),(AObject as TComplexCurrencyContentRemotable).Value);
end;
class procedure TComplexCurrencyContentRemotable.LoadValue(
var AObject : TObject;
AStore : IFormatterBase
);
var
i : Currency;
begin
i := 0;
AStore.GetScopeInnerValue(TypeInfo(Currency),i);
(AObject as TComplexCurrencyContentRemotable).Value := i;
end;
function TComplexCurrencyContentRemotable.wstHasValue() : Boolean;
begin
Result := (FValue <> 0);
end;
{ TComplexInt64SContentRemotable }
class procedure TComplexInt64SContentRemotable.SaveValue(
AObject : TBaseRemotable;
AStore : IFormatterBase
);
begin
AStore.PutScopeInnerValue(TypeInfo(Int64),(AObject as TComplexInt64SContentRemotable).Value);
end;
class procedure TComplexInt64SContentRemotable.LoadValue(
var AObject : TObject;
AStore : IFormatterBase
);
var
i : Int64;
begin
i := 0;
AStore.GetScopeInnerValue(TypeInfo(Int64),i);
(AObject as TComplexInt64SContentRemotable).Value := i;
end;
function TComplexInt64SContentRemotable.wstHasValue() : Boolean;
begin
Result := (FValue <> 0);
end;
{ TComplexInt64UContentRemotable }
class procedure TComplexInt64UContentRemotable.SaveValue(
AObject : TBaseRemotable;
AStore : IFormatterBase
);
begin
AStore.PutScopeInnerValue(TypeInfo(QWord),(AObject as TComplexInt64UContentRemotable).Value);
end;
class procedure TComplexInt64UContentRemotable.LoadValue(
var AObject : TObject;
AStore : IFormatterBase
);
var
i : QWord;
begin
i := 0;
AStore.GetScopeInnerValue(TypeInfo(QWord),i);
(AObject as TComplexInt64UContentRemotable).Value := i;
end;
function TComplexInt64UContentRemotable.wstHasValue() : Boolean;
begin
Result := (FValue <> 0);
end;
{ TComplexBooleanContentRemotable }
class procedure TComplexBooleanContentRemotable.SaveValue(
AObject : TBaseRemotable;
AStore : IFormatterBase
);
begin
AStore.PutScopeInnerValue(TypeInfo(Boolean),(AObject as TComplexBooleanContentRemotable).Value);
end;
class procedure TComplexBooleanContentRemotable.LoadValue(
var AObject : TObject;
AStore : IFormatterBase
);
var
i : Boolean;
begin
i := False;
AStore.GetScopeInnerValue(TypeInfo(Boolean),i);
(AObject as TComplexBooleanContentRemotable).Value := i;
end;
{ TIntfPoolItem }
constructor TIntfPoolItem.Create(AIntf: IInterface; const AUsed: Boolean);
begin
FIntf := AIntf as IInterface;
FUsed := AUsed;
end;
destructor TIntfPoolItem.Destroy();
begin
FIntf := nil;
inherited Destroy();
end;
{ TIntfPool }
function TIntfPool.CreateNew(const AUsed : Boolean): TIntfPoolItem;
begin
FCS.Acquire();
try
Result := TIntfPoolItem.Create(FFactory.CreateInstance(),AUsed);
FList.Add(Result);
finally
FCS.Release();
end;
end;
function TIntfPool.TryGet(const AIndex: Integer): Boolean;
var
itm : TIntfPoolItem;
begin
FCS.Acquire();
try
itm := TIntfPoolItem(FList[AIndex]);
Result := not itm.Used;
if Result then begin
itm.Used := True;
end;
finally
FCS.Release();
end;
end;
constructor TIntfPool.Create(const AMin, AMax: Integer; AFactory: IItemFactory);
var
i : Integer;
begin
if not ( ( AMin >= 0 ) and ( AMax >= AMin ) and ( AFactory <> nil ) ) then
raise Exception.CreateFmt(SERR_InvalidPoolParametersArgs,[AMin,AMax]);
FMax := AMax;
FMin := AMin;
FFactory := AFactory;
FLock := TSemaphoreObject.Create(FMax);
FList := TObjectList.Create(True);
FCS := TCriticalSection.Create();
for i := 0 to Pred(AMin) do begin
CreateNew(False);
end;
end;
destructor TIntfPool.Destroy();
begin
FFactory := nil;
FreeAndNil(FCS);
FreeAndNil(FLock);
FreeAndNil(FList);
inherited Destroy();
end;
function TIntfPool.Get(const ATimeOut : Cardinal): IInterface;
var
i : Integer;
begin
Result := nil;
if ( FLock.WaitFor(ATimeOut) = wrSignaled ) then begin
for i := 0 to Pred(FList.Count) do begin
if TryGet(i) then begin
Result := TIntfPoolItem(FList[i]).Intf;
Break;
end;
end;
if ( Result = nil ) then begin
Result := CreateNew(True).Intf;
end;
end else begin
raise EServiceException.Create(SERRE_ObjectCreationTimeOut);
end;
end;
procedure TIntfPool.Release(const AItem: IInterface);
var
i : Integer;
a : IInterface;
begin
a := AItem as IInterface;
for i := 0 to Pred(FList.Count) do begin
if ( TIntfPoolItem(FList[i]).Intf = a ) then begin
TIntfPoolItem(FList[i]).Used := False;
FLock.Release();
Break;
end;
end;
end;
procedure TIntfPool.Discard(const AItem : IInterface);
var
i : Integer;
a : IInterface;
itm : TIntfPoolItem;
begin
a := AItem as IInterface;
for i := 0 to Pred(FList.Count) do begin
if ( TIntfPoolItem(FList[i]).Intf = a ) then begin
itm := TIntfPoolItem(FList[i]);
itm.FIntf := FFactory.CreateInstance() as IInterface;
itm.Used := False;
FLock.Release();
Break;
end;
end;
end;
function TIntfPool.GetInstancesCount() : Integer;
begin
FCS.Acquire();
try
Result := FList.Count;
finally
FCS.Release();
end;
end;
{ TStringBufferRemotable }
class procedure TStringBufferRemotable.Save (
AObject : TBaseRemotable;
AStore : IFormatterBase;
const AName : string;
const ATypeInfo : PTypeInfo
);
var
buffer : string;
begin
if ( AObject <> nil ) then
buffer := TStringBufferRemotable(AObject).Data
else
buffer := '';
AStore.Put(AName,TypeInfo(string),buffer);
end;
class procedure TStringBufferRemotable.Load (
var AObject : TObject;
AStore : IFormatterBase;
var AName : string;
const ATypeInfo : PTypeInfo
);
var
buffer : string;
locObj : TStringBufferRemotable;
begin
AStore.ReadBuffer(AName,buffer);
if ( AObject = nil ) then
AObject := Create();
locObj := AObject as TStringBufferRemotable;;
locObj.Data := buffer;
end;
procedure TStringBufferRemotable.Assign (Source : TPersistent );
begin
if ( Source = nil ) then begin
FData := '';
end else begin
if Source.InheritsFrom(TStringBufferRemotable) then
Self.Data := TStringBufferRemotable(Source).Data
else
inherited Assign(Source);
end;
end;
function TStringBufferRemotable.Equal(const ACompareTo : TBaseRemotable) : Boolean;
begin
Result := ( Self = ACompareTo ) or
( Assigned(ACompareTo) and
ACompareTo.InheritsFrom(TStringBufferRemotable) and
( Self.Data = TStringBufferRemotable(ACompareTo).Data )
);
end;
function TStringBufferRemotable.wstHasValue() : Boolean;
begin
Result := (Data <> '');
end;
{ TRemotableRecordEncoder }
class procedure TRemotableRecordEncoder.Save(
ARecord : Pointer;
AStore : IFormatterBase;
const AName : string;
const ATypeInfo : PTypeInfo
);
var
recStart, recFieldAddress : PByte;
typData : PRecordTypeData;
i : PtrUInt;
pt : PTypeInfo;
p : PRecordFieldInfo;
oldSS,ss : TSerializationStyle;
typRegItem : TTypeRegistryItem;
prpName : string;
typDataObj : TObject;
begin
oldSS := AStore.GetSerializationStyle();
AStore.BeginObject(AName,ATypeInfo);
try
if not Assigned(ARecord) then begin
AStore.NilCurrentScope();
Exit;
end;
typRegItem := GetTypeRegistry().ItemByTypeInfo[ATypeInfo];
typDataObj := typRegItem.GetObject(FIELDS_STRING);
Assert(Assigned(typDataObj),Format(SERR_IncompleteParamTypeRegistration,[AName]));
typData := PRecordTypeData((typDataObj as TDataObject).Data);
Assert(Assigned(typData));
if ( typData^.FieldCount > 0 ) then begin
recStart := PByte(ARecord);
ss := AStore.GetSerializationStyle();
for i := 0 to Pred(typData^.FieldCount) do begin
p := @(typData^.Fields[i]);
if p^.Visible then begin
pt := p^.TypeInfo^;
if p^.IsAttribute then begin
if ( ss <> ssAttibuteSerialization ) then
ss := ssAttibuteSerialization;
end else begin
if ( ss <> ssNodeSerialization ) then
ss := ssNodeSerialization;
end;
if ( ss <> AStore.GetSerializationStyle() ) then
AStore.SetSerializationStyle(ss);
prpName := typRegItem.GetExternalPropertyName(p^.Name);
recFieldAddress := recStart;
Inc(recFieldAddress,p^.Offset);
case pt^.Kind of
tkInt64 : AStore.Put(prpName,pt,PInt64(recFieldAddress)^);
{$IFDEF HAS_QWORD}
tkQWord : AStore.Put(prpName,pt,PQWord(recFieldAddress)^);
{$ENDIF}
tkLString
{$IFDEF FPC},tkAString{$ENDIF}
{$IFDEF WST_UNICODESTRING},tkUString{$ENDIF} : AStore.Put(prpName,pt,Pointer(recFieldAddress)^);
tkClass : AStore.Put(prpName,pt,PObject(recFieldAddress)^);
tkRecord : AStore.Put(prpName,pt,Pointer(recFieldAddress)^);
{$IFDEF HAS_TKBOOL}
tkBool : AStore.Put(prpName,pt,PBoolean(recFieldAddress)^);
{$ENDIF}
tkEnumeration,tkInteger :
begin
{$IFDEF WST_DELPHI}
if ( pt^.Kind = tkEnumeration ) and
( GetTypeData(pt)^.BaseType^ = TypeInfo(Boolean) )
then begin
AStore.Put(prpName,pt,PBoolean(recFieldAddress)^);
end else begin
{$ENDIF}
case GetTypeData(pt)^.OrdType of
otSByte : AStore.Put(prpName,pt,PShortInt(recFieldAddress)^);
otUByte : AStore.Put(prpName,pt,PByte(recFieldAddress)^);
otSWord : AStore.Put(prpName,pt,PSmallInt(recFieldAddress)^);
otUWord : AStore.Put(prpName,pt,PWord(recFieldAddress)^);
otSLong : AStore.Put(prpName,pt,PLongint(recFieldAddress)^);
otULong : AStore.Put(prpName,pt,PLongWord(recFieldAddress)^);
end;
{$IFDEF WST_DELPHI}
end;
{$ENDIF}
end;
tkFloat :
begin
case GetTypeData(pt)^.FloatType of
ftSingle : AStore.Put(prpName,pt,PSingle(recFieldAddress)^);
ftDouble : AStore.Put(prpName,pt,PDouble(recFieldAddress)^);
ftExtended : AStore.Put(prpName,pt,PExtended(recFieldAddress)^);
ftCurr : AStore.Put(prpName,pt,PCurrency(recFieldAddress)^);
{$IFDEF HAS_COMP}
ftComp : AStore.Put(prpName,pt,PComp(recFieldAddress)^);
{$ENDIF}
end;
end;
end;
end;
end;
end;
finally
AStore.EndScope();
AStore.SetSerializationStyle(oldSS);
end;
end;
class procedure TRemotableRecordEncoder.Load(
var ARecord : Pointer;
AStore : IFormatterBase;
var AName : string;
const ATypeInfo : PTypeInfo
);
var
recStart, recFieldAddress : PByte;
typData : PRecordTypeData;
i : PtrUInt;
pt : PTypeInfo;
propName : String;
p : PRecordFieldInfo;
oldSS,ss : TSerializationStyle;
typRegItem : TTypeRegistryItem;
typDataObj : TObject;
begin
oldSS := AStore.GetSerializationStyle();
if ( AStore.BeginObjectRead(AName,ATypeInfo) >= 0 ) then begin
try
if AStore.IsCurrentScopeNil() then
Exit;
typRegItem := GetTypeRegistry().ItemByTypeInfo[ATypeInfo];
typDataObj := typRegItem.GetObject(FIELDS_STRING);
Assert(Assigned(typDataObj),Format(SERR_IncompleteParamTypeRegistration,[AName]));
typData := PRecordTypeData((typDataObj as TDataObject).Data);
Assert(Assigned(typData));
if ( not Assigned(ARecord) ) then begin
GetMem(ARecord,typData^.RecordSize);
FillChar(ARecord^,typData^.RecordSize,#0);
end;
if ( typData^.FieldCount > 0 ) then begin
recStart := PByte(ARecord);
for i := 0 to Pred(typData^.FieldCount) do begin
p := @(typData^.Fields[i]);
if p^.Visible then begin
pt := p^.TypeInfo^;
propName := typRegItem.GetExternalPropertyName(p^.Name);
if p^.IsAttribute then begin
ss := ssAttibuteSerialization;
end else begin
ss := ssNodeSerialization;
end;
if ( ss <> AStore.GetSerializationStyle() ) then
AStore.SetSerializationStyle(ss);
recFieldAddress := recStart;
Inc(recFieldAddress,p^.Offset);
//try
Case pt^.Kind Of
tkInt64 : AStore.Get(pt,propName,PInt64(recFieldAddress)^);
{$IFDEF HAS_QWORD}
tkQWord : AStore.Get(pt,propName,PQWord(recFieldAddress)^);
{$ENDIF}
tkLString
{$IFDEF FPC},tkAString{$ENDIF}
{$IFDEF WST_UNICODESTRING},tkUString{$ENDIF} : AStore.Get(pt,propName,PPointer(recFieldAddress)^);
{$IFDEF HAS_TKBOOL}
tkBool : AStore.Get(pt,propName,PBoolean(recFieldAddress)^);
{$ENDIF}
tkClass : AStore.Get(pt,propName,PObject(recFieldAddress)^);
tkRecord : AStore.Get(pt,propName,Pointer(recFieldAddress)^);
tkEnumeration,tkInteger :
Begin
{$IFDEF WST_DELPHI}
if ( pt^.Kind = tkEnumeration ) and
( GetTypeData(pt)^.BaseType^ = TypeInfo(Boolean) )
then begin
AStore.Get(pt,propName,PBoolean(recFieldAddress)^);
end else begin
{$ENDIF}
case GetTypeData(pt)^.OrdType Of
otSByte : AStore.Get(pt,propName,PShortInt(recFieldAddress)^);
otUByte : AStore.Get(pt,propName,PByte(recFieldAddress)^);
otSWord : AStore.Get(pt,propName,PSmallInt(recFieldAddress)^);
otUWord : AStore.Get(pt,propName,PWord(recFieldAddress)^);
otSLong : AStore.Get(pt,propName,PLongint(recFieldAddress)^);
otULong : AStore.Get(pt,propName,PLongWord(recFieldAddress)^);
end;
{$IFDEF WST_DELPHI}
end;
{$ENDIF}
End;
tkFloat :
begin
case GetTypeData(pt)^.FloatType of
ftSingle : AStore.Get(pt,propName,PSingle(recFieldAddress)^);
ftDouble : AStore.Get(pt,propName,PDouble(recFieldAddress)^);
ftExtended : AStore.Get(pt,propName,PExtended(recFieldAddress)^);
ftCurr : AStore.Get(pt,propName,PCurrency(recFieldAddress)^);
{$IFDEF HAS_COMP}
ftComp : AStore.Get(pt,propName,PComp(recFieldAddress)^);
{$ENDIF}
end;
end;
End;
{except
on E : EServiceException do begin
if ( persistType = pstAlways ) then
raise;
end;
end;}
end;
end;
end;
finally
AStore.EndScopeRead();
AStore.SetSerializationStyle(oldSS);
end;
end;
end;
{ TBase64StringRemotable }
function TBase64StringRemotable.GetEncodedString : string;
begin
Result := Base64Encode(Length(BinaryData),BinaryData[0]);
end;
procedure TBase64StringRemotable.SetEncodedString(const AValue : string);
begin
BinaryData := Base64Decode(AValue,[xoDecodeIgnoreIllegalChar]);
end;
{ TBase64StringExtRemotable }
function TBase64StringExtRemotable.GetEncodedString : string;
begin
Result := Base64Encode(Length(BinaryData),BinaryData[0]);
end;
procedure TBase64StringExtRemotable.SetEncodedString(const AValue : string);
begin
BinaryData := Base64Decode(AValue,[xoDecodeIgnoreIllegalChar]);
end;
procedure initialize_base_service_intf();
begin
{$IFDEF HAS_FORMAT_SETTINGS}
{$IFDEF FPC}
wst_FormatSettings := DefaultFormatSettings;
{$ELSE}
GetLocaleFormatSettings(GetThreadLocale(),wst_FormatSettings);
{$ENDIF}
wst_FormatSettings.DecimalSeparator := '.';
wst_FormatSettings.ThousandSeparator := #0;
{$ENDIF HAS_FORMAT_SETTINGS}
if ( TypeRegistryInstance = nil ) then begin
TypeRegistryInstance := TTypeRegistry.Create();
TypeRegistryInstance.RegisterInitializer(TBaseComplexRemotableInitializer);
TypeRegistryInstance.RegisterInitializer(TSimpleContentObjectRemotableInitializer);
end;
if ( SerializeOptionsRegistryInstance = nil ) then
SerializeOptionsRegistryInstance := TSerializeOptionsRegistry.Create();
RegisterStdTypes();
end;
procedure finalize_base_service_intf();
begin
FreeAndNil(SerializeOptionsRegistryInstance);
FreeAndNil(TypeRegistryInstance);
end;
{ TDurationRemotable }
function TDurationRemotable.GetAsString: string;
begin
Result := ToStr(FData);
end;
function TDurationRemotable.GetNegative: Boolean;
begin
Result := FData.Negative;
end;
function TDurationRemotable.GetPart(AIndex: integer): PtrUInt;
begin
case AIndex of
0 : Result := FData.Year;
1 : Result := FData.Month;
2 : Result := FData.Day;
3 : Result := FData.Hour;
4 : Result := FData.Minute;
5 : Result := FData.Second;
6 : Result := FData.FractionalSecond;
else
Result := 0;
end;
end;
procedure TDurationRemotable.SetAsString(const AValue: string);
begin
if (AValue<>'') then
FData := Parse(AValue)
else
FillChar(FData,SizeOf(TDurationRec),0);
end;
procedure TDurationRemotable.SetNegative(const AValue: Boolean);
begin
FData.Negative := AValue;
end;
procedure TDurationRemotable.SetPart(AIndex: integer; const AValue: PtrUInt);
begin
case AIndex of
0 : FData.Year := AValue;
1 : FData.Month := AValue;
2 : FData.Day := AValue;
3 : FData.Hour := AValue;
4 : FData.Minute := AValue;
5 : FData.Second := AValue;
6 : FData.FractionalSecond := AValue;
end;
end;
class procedure TDurationRemotable.Save(
AObject : TBaseRemotable;
AStore : IFormatterBase;
const AName : string;
const ATypeInfo : PTypeInfo
);
var
buffer : string;
begin
buffer := TDurationRemotable(AObject).AsString;
AStore.Put(AName,TypeInfo(string),buffer);
end;
class procedure TDurationRemotable.Load(
var AObject : TObject;
AStore : IFormatterBase;
var AName : string;
const ATypeInfo : PTypeInfo
);
var
buffer : string;
begin
buffer := '';
AStore.Get(TypeInfo(string),AName,buffer);
if ( AObject = nil ) then
AObject := Create();
TDurationRemotable(AObject).AsString := buffer;
end;
procedure TDurationRemotable.Assign(Source : TPersistent);
begin
if ( Source <> nil ) and Source.InheritsFrom(TDurationRemotable) then
Self.FData := TDurationRemotable(Source).FData
else
inherited Assign(Source);
end;
function TDurationRemotable.Equal(const ACompareTo : TBaseRemotable) : Boolean;
begin
if ( Self = ACompareTo ) then begin
Result := True;
end else begin
if ( ACompareTo <> nil ) and ACompareTo.InheritsFrom(TDurationRemotable) then
Result := ValueEquals(Self.FData,TDurationRemotable(ACompareTo).FData)
else
Result := inherited Equal(ACompareTo);
end;
end;
function TDurationRemotable.wstHasValue() : Boolean;
begin
Result := (FData.Year <> 0) or (FData.Month <> 0) or (FData.Day <> 0) or
(FData.Hour <> 0) or (FData.Minute <> 0) or (FData.Second <> 0) or
(FData.FractionalSecond <> 0);
end;
procedure TDurationRemotable.Clear();
begin
FData := ZERO_DURATION;
end;
class function TDurationRemotable.Parse(const ABuffer : string) : TDurationRec;
begin
Result := xsd_StrToDuration(ABuffer);
end;
class function TDurationRemotable.ToStr(const AValue: TDurationRec): string;
begin
Result := xsd_DurationToStr(AValue);
end;
{ TRemotableTypeInitializer }
class function TRemotableTypeInitializer.CanHandle(ATypeInfo : PTypeInfo) : Boolean;
begin
Result := False;
end;
class function TRemotableTypeInitializer.GetItemClass(const ATypeInfo : PTypeInfo) : TTypeRegistryItemClass;
begin
Result := TTypeRegistryItem;
end;
{ TComplexAnsiCharContentRemotable }
class procedure TComplexAnsiCharContentRemotable.LoadValue(
var AObject: TObject;
AStore: IFormatterBase
);
var
i : AnsiChar;
begin
i := #0;
AStore.GetScopeInnerValue(TypeInfo(AnsiChar),i);
(AObject as TComplexAnsiCharContentRemotable).Value := i;
end;
class procedure TComplexAnsiCharContentRemotable.SaveValue(
AObject: TBaseRemotable;
AStore: IFormatterBase
);
begin
AStore.PutScopeInnerValue(TypeInfo(AnsiChar),(AObject as TComplexAnsiCharContentRemotable).Value);
end;
{ TComplexWideCharContentRemotable }
class procedure TComplexWideCharContentRemotable.LoadValue(
var AObject: TObject;
AStore: IFormatterBase
);
var
i : WideChar;
begin
i := #0;
AStore.GetScopeInnerValue(TypeInfo(WideChar),i);
(AObject as TComplexWideCharContentRemotable).Value := i;
end;
class procedure TComplexWideCharContentRemotable.SaveValue(
AObject: TBaseRemotable;
AStore: IFormatterBase
);
begin
AStore.PutScopeInnerValue(TypeInfo(WideChar),(AObject as TComplexWideCharContentRemotable).Value);
end;
{ TAbstractEncodedStringRemotable }
class procedure TAbstractEncodedStringRemotable.Save(
AObject : TBaseRemotable;
AStore : IFormatterBase;
const AName : string;
const ATypeInfo : PTypeInfo
);
var
buffer : string;
begin
if ( AObject <> nil ) then
buffer := TAbstractEncodedStringRemotable(AObject).EncodedString
else
buffer := '';
AStore.Put(AName,TypeInfo(string),buffer);
end;
class procedure TAbstractEncodedStringRemotable.Load(
var AObject : TObject;
AStore : IFormatterBase;
var AName : string;
const ATypeInfo : PTypeInfo
);
var
buffer : string;
begin
buffer := '';
AStore.Get(TypeInfo(string),AName,buffer);
if ( AObject = nil ) then
AObject := Create();
TAbstractEncodedStringRemotable(AObject).EncodedString := buffer;
end;
procedure TAbstractEncodedStringRemotable.Assign(Source: TPersistent);
begin
if Assigned(Source) then begin
if Source.InheritsFrom(TAbstractEncodedStringRemotable) then
Self.BinaryData := Copy(TAbstractEncodedStringRemotable(Source).BinaryData)
else
inherited Assign(Source);
end else begin
BinaryData := nil;
end;
end;
function TAbstractEncodedStringRemotable.Equal(const ACompareTo: TBaseRemotable): Boolean;
begin
Result := Assigned(ACompareTo) and
ACompareTo.InheritsFrom(TAbstractEncodedStringRemotable) and
( Length(Self.BinaryData) = Length(TAbstractEncodedStringRemotable(ACompareTo).BinaryData) ) and
CompareMem(Pointer(Self.BinaryData),Pointer(TAbstractEncodedStringRemotable(ACompareTo).BinaryData),Length(Self.BinaryData));
end;
function TAbstractEncodedStringRemotable.wstHasValue() : Boolean;
begin
Result := (Length(FBinaryData) > 0);
end;
procedure TAbstractEncodedStringRemotable.LoadFromStream(AStream: TStream);
begin
BinaryData := LoadBufferFromStream(AStream);
end;
procedure TAbstractEncodedStringRemotable.LoadFromBuffer(
const ABuffer;
const ABufferLen: Integer
);
begin
SetLength(FBinaryData,ABufferLen);
if (ABufferLen > 0) then
Move(ABuffer,FBinaryData[0],ABufferLen);
end;
procedure TAbstractEncodedStringRemotable.LoadFromFile(const AFileName: string);
begin
BinaryData := LoadBufferFromFile(AFileName);
end;
procedure TAbstractEncodedStringRemotable.SaveToStream(AStream: TStream);
begin
if ( Length(FBinaryData) > 0 ) then
AStream.Write(FBinaryData[0],Length(FBinaryData));
end;
function TAbstractEncodedStringRemotable.SaveToBuffer(
var ABuffer;
const ABufferLen: Integer
) : Integer;
var
c : Integer;
begin
c := Length(FBinaryData);
if (c > ABufferLen) then
c := ABufferLen;
if (c > 0) then
Move(FBinaryData[0],ABuffer,c);
Result := c;
end;
procedure TAbstractEncodedStringRemotable.SaveToFile(const AFileName: string);
var
locStream : TFileStream;
begin
locStream := TFileStream.Create(AFileName,fmCreate);
try
SaveToStream(locStream);
finally
locStream.Free();
end;
end;
{ TAbstractEncodedStringExtRemotable }
class procedure TAbstractEncodedStringExtRemotable.SaveValue(
AObject: TBaseRemotable;
AStore: IFormatterBase
);
var
s : string;
begin
s := (AObject as TAbstractEncodedStringExtRemotable).EncodedString;
AStore.PutScopeInnerValue(TypeInfo(string),s);
end;
class procedure TAbstractEncodedStringExtRemotable.LoadValue(
var AObject: TObject;
AStore: IFormatterBase
);
var
s : string;
begin
s := '';
AStore.GetScopeInnerValue(TypeInfo(string),s);
(AObject as TAbstractEncodedStringExtRemotable).EncodedString := s;
end;
procedure TAbstractEncodedStringExtRemotable.Assign(Source: TPersistent);
begin
if Assigned(Source) and Source.InheritsFrom(TAbstractEncodedStringExtRemotable) then begin
Self.BinaryData := Copy(TAbstractEncodedStringExtRemotable(Source).BinaryData);
end;
inherited;
end;
function TAbstractEncodedStringExtRemotable.Equal(const ACompareTo: TBaseRemotable): Boolean;
begin
Result := Assigned(ACompareTo) and
ACompareTo.InheritsFrom(TAbstractEncodedStringExtRemotable) and
( Length(Self.BinaryData) = Length(TAbstractEncodedStringExtRemotable(ACompareTo).BinaryData) ) and
CompareMem(Pointer(Self.BinaryData),Pointer(TAbstractEncodedStringExtRemotable(ACompareTo).BinaryData),Length(Self.BinaryData));
end;
function TAbstractEncodedStringExtRemotable.wstHasValue: Boolean;
begin
Result := (Length(FBinaryData) > 0);
end;
procedure TAbstractEncodedStringExtRemotable.LoadFromStream(AStream: TStream);
begin
BinaryData := LoadBufferFromStream(AStream);
end;
procedure TAbstractEncodedStringExtRemotable.LoadFromBuffer(
const ABuffer;
const ABufferLen: Integer
);
begin
SetLength(FBinaryData,ABufferLen);
if (ABufferLen > 0) then
Move(ABuffer,FBinaryData[0],ABufferLen);
end;
procedure TAbstractEncodedStringExtRemotable.LoadFromFile(const AFileName: string);
begin
BinaryData := LoadBufferFromFile(AFileName);
end;
procedure TAbstractEncodedStringExtRemotable.SaveToStream(AStream: TStream);
begin
if ( Length(FBinaryData) > 0 ) then
AStream.Write(FBinaryData[0],Length(FBinaryData));
end;
function TAbstractEncodedStringExtRemotable.SaveToBuffer(
var ABuffer;
const ABufferLen: Integer
) : Integer;
var
c : Integer;
begin
c := Length(FBinaryData);
if (c > ABufferLen) then
c := ABufferLen;
if (c > 0) then
Move(FBinaryData[0],ABuffer,c);
Result := c;
end;
procedure TAbstractEncodedStringExtRemotable.SaveToFile(const AFileName: string);
var
locStream : TFileStream;
begin
locStream := TFileStream.Create(AFileName,fmCreate);
try
SaveToStream(locStream);
finally
locStream.Free();
end;
end;
{ TBase16StringExtRemotable }
function TBase16StringExtRemotable.GetEncodedString: string;
begin
Result := Base16Encode(BinaryData[0],Length(BinaryData));
end;
procedure TBase16StringExtRemotable.SetEncodedString(const AValue: string);
begin
BinaryData := Base16Decode(AValue,[xoDecodeIgnoreIllegalChar]);
end;
{ TBase16StringRemotable }
function TBase16StringRemotable.GetEncodedString: string;
begin
Result := Base16Encode(BinaryData[0],Length(BinaryData));
end;
procedure TBase16StringRemotable.SetEncodedString(const AValue: string);
begin
BinaryData := Base16Decode(AValue,[xoDecodeIgnoreIllegalChar]);
end;
{ TTimeRemotable }
function TTimeRemotable.GetAsString : string;
begin
Result := ToStr(Data);
end;
function TTimeRemotable.GetMilliSecond: Word;
begin
Result := Data.MilliSecond;
end;
function TTimeRemotable.GetOffset(AIndex: integer): Shortint;
begin
case AIndex of
0 : Result := Data.HourOffset;
1 : Result := Data.MinuteOffset;
else
Result := 0;
end;
end;
function TTimeRemotable.GetPart(AIndex: integer): Byte;
begin
case AIndex of
0 : Result := Data.Hour;
1 : Result := Data.Minute;
2 : Result := Data.Second;
else
Result := 0;
end;
end;
procedure TTimeRemotable.SetAsString(const AValue: string);
begin
if (AValue<>'') then
Data := Parse(AValue)
else
FillChar(FData,SizeOf(TTimeRec),0);
end;
procedure TTimeRemotable.SetMilliSecond(const AValue: Word);
begin
FData.MilliSecond := AValue;
end;
procedure TTimeRemotable.SetOffset(AIndex: integer; const AValue: Shortint);
begin
case AIndex of
0 : FData.HourOffset := AValue;
1 : FData.MinuteOffset := AValue;
end;
end;
procedure TTimeRemotable.SetPart(AIndex: integer; const AValue: Byte);
begin
case AIndex of
0 : FData.Hour := AValue;
1 : FData.Minute := AValue;
2 : FData.Second := AValue;
end;
end;
class procedure TTimeRemotable.Save(
AObject : TBaseRemotable;
AStore : IFormatterBase;
const AName : string;
const ATypeInfo : PTypeInfo
);
var
buffer : string;
begin
buffer := TTimeRemotable(AObject).AsString;
AStore.Put(AName,TypeInfo(string),buffer);
end;
class procedure TTimeRemotable.Load(
var AObject : TObject;
AStore : IFormatterBase;
var AName : string;
const ATypeInfo : PTypeInfo
);
var
buffer : string;
begin
buffer := '';
AStore.Get(TypeInfo(string),AName,buffer);
if ( AObject = nil ) then
AObject := Create();
TTimeRemotable(AObject).AsString := buffer;
end;
procedure TTimeRemotable.Assign(Source: TPersistent);
begin
if ( Source = nil ) then begin
Clear();
end else begin
if Source.InheritsFrom(TTimeRemotable) then
Self.Data := TTimeRemotable(Source).Data
else if Source.InheritsFrom(TDateTimeRemotable) then
Self.Data := DateTimeToTimeRec(TDateTimeRemotable(Source).AsUTCDate)
else
inherited Assign(Source);
end;
end;
function TTimeRemotable.Equal(const ACompareTo: TBaseRemotable): Boolean;
begin
if ( ACompareTo = nil ) then begin
Result := ValueEquals(Data,ZERO_TIME );
end else begin
if ACompareTo.InheritsFrom(TTimeRemotable) then
Result := ValueEquals(Self.Data,TTimeRemotable(ACompareTo).Data)
else
Result := inherited Equal(ACompareTo);
end;
end;
function TTimeRemotable.wstHasValue: Boolean;
begin
Result := (Data.Hour <> 0) or (Data.Minute <> 0) or (Data.Second <> 0) or
(Data.HourOffset <> 0) or (Data.MinuteOffset <> 0);
end;
procedure TTimeRemotable.Clear();
begin
Data := ZERO_TIME;
end;
class function TTimeRemotable.Parse(const ABuffer: string): TTimeRec;
begin
Result := xsd_StrToTime(ABuffer);
end;
class function TTimeRemotable.ToStr(const AValue: TTimeRec): string;
begin
Result := xsd_TimeToStr(AValue);
end;
initialization
initialize_base_service_intf();
finalization
finalize_base_service_intf();
end.