xtool/contrib/CoreCipher/Source/DataFrameEngine.pas

5468 lines
136 KiB
ObjectPascal

{ ****************************************************************************** }
{ * Data Struct Engine * }
{ * written by QQ 600585@qq.com * }
{ * https://zpascal.net * }
{ * https://github.com/PassByYou888/zAI * }
{ * https://github.com/PassByYou888/ZServer4D * }
{ * https://github.com/PassByYou888/PascalString * }
{ * https://github.com/PassByYou888/zRasterization * }
{ * https://github.com/PassByYou888/CoreCipher * }
{ * https://github.com/PassByYou888/zSound * }
{ * https://github.com/PassByYou888/zChinese * }
{ * https://github.com/PassByYou888/zExpression * }
{ * https://github.com/PassByYou888/zGameWare * }
{ * https://github.com/PassByYou888/zAnalysis * }
{ * https://github.com/PassByYou888/FFMPEG-Header * }
{ * https://github.com/PassByYou888/zTranslate * }
{ * https://github.com/PassByYou888/InfiniteIoT * }
{ * https://github.com/PassByYou888/FastMD5 * }
{ ****************************************************************************** }
(*
update history
2017-12-6
added supported pointer
*)
unit DataFrameEngine;
{$INCLUDE zDefine.inc}
interface
uses SysUtils, CoreClasses, Types,
ListEngine, MemoryStream64, CoreCipher,
DoStatusIO, GeometryLib, TextDataEngine, Geometry2DUnit, Geometry3DUnit,
{$IFNDEF FPC} ZS_JsonDataObjects, {$ENDIF}
CoreCompress, UnicodeMixedLib, PascalStrings;
type
TDataFrameBase = class(TCoreClassObject)
protected
FID: Byte; // data frame id
public
constructor Create(ID: Byte);
destructor Destroy; override;
procedure LoadFromStream(stream: TMemoryStream64); virtual; abstract;
procedure SaveToStream(stream: TMemoryStream64); virtual; abstract;
{$IFNDEF FPC}
procedure LoadFromJson(jarry: TJsonArray; index_: Integer); virtual; abstract;
procedure SaveToJson(jarry: TJsonArray; index_: Integer); virtual; abstract;
{$ENDIF}
function ComputeEncodeSize: Int64; virtual; abstract;
end;
TDataFrameString = class sealed(TDataFrameBase)
public
Buffer: TBytes;
constructor Create(ID: Byte);
destructor Destroy; override;
procedure LoadFromStream(stream: TMemoryStream64); override;
procedure SaveToStream(stream: TMemoryStream64); override;
{$IFNDEF FPC}
procedure LoadFromJson(jarry: TJsonArray; index_: Integer); override;
procedure SaveToJson(jarry: TJsonArray; index_: Integer); override;
{$ENDIF}
function ComputeEncodeSize: Int64; override;
end;
TDataFrameInteger = class sealed(TDataFrameBase)
private
protected
FBuffer: Integer;
public
constructor Create(ID: Byte);
destructor Destroy; override;
procedure LoadFromStream(stream: TMemoryStream64); override;
procedure SaveToStream(stream: TMemoryStream64); override;
{$IFNDEF FPC}
procedure LoadFromJson(jarry: TJsonArray; index_: Integer); override;
procedure SaveToJson(jarry: TJsonArray; index_: Integer); override;
{$ENDIF}
function ComputeEncodeSize: Int64; override;
property Buffer: Integer read FBuffer write FBuffer;
end;
TDataFrameCardinal = class sealed(TDataFrameBase)
private
protected
FBuffer: Cardinal;
public
constructor Create(ID: Byte);
destructor Destroy; override;
procedure LoadFromStream(stream: TMemoryStream64); override;
procedure SaveToStream(stream: TMemoryStream64); override;
{$IFNDEF FPC}
procedure LoadFromJson(jarry: TJsonArray; index_: Integer); override;
procedure SaveToJson(jarry: TJsonArray; index_: Integer); override;
{$ENDIF}
function ComputeEncodeSize: Int64; override;
property Buffer: Cardinal read FBuffer write FBuffer;
end;
TDataFrameWord = class sealed(TDataFrameBase)
private
protected
FBuffer: Word;
public
constructor Create(ID: Byte);
destructor Destroy; override;
procedure LoadFromStream(stream: TMemoryStream64); override;
procedure SaveToStream(stream: TMemoryStream64); override;
{$IFNDEF FPC}
procedure LoadFromJson(jarry: TJsonArray; index_: Integer); override;
procedure SaveToJson(jarry: TJsonArray; index_: Integer); override;
{$ENDIF}
function ComputeEncodeSize: Int64; override;
property Buffer: Word read FBuffer write FBuffer;
end;
TDataFrameByte = class sealed(TDataFrameBase)
private
protected
FBuffer: Byte;
public
constructor Create(ID: Byte);
destructor Destroy; override;
procedure LoadFromStream(stream: TMemoryStream64); override;
procedure SaveToStream(stream: TMemoryStream64); override;
{$IFNDEF FPC}
procedure LoadFromJson(jarry: TJsonArray; index_: Integer); override;
procedure SaveToJson(jarry: TJsonArray; index_: Integer); override;
{$ENDIF}
function ComputeEncodeSize: Int64; override;
property Buffer: Byte read FBuffer write FBuffer;
end;
TDataFrameSingle = class sealed(TDataFrameBase)
private
protected
FBuffer: Single;
public
constructor Create(ID: Byte);
destructor Destroy; override;
procedure LoadFromStream(stream: TMemoryStream64); override;
procedure SaveToStream(stream: TMemoryStream64); override;
{$IFNDEF FPC}
procedure LoadFromJson(jarry: TJsonArray; index_: Integer); override;
procedure SaveToJson(jarry: TJsonArray; index_: Integer); override;
{$ENDIF}
function ComputeEncodeSize: Int64; override;
property Buffer: Single read FBuffer write FBuffer;
end;
TDataFrameDouble = class sealed(TDataFrameBase)
private
protected
FBuffer: Double;
public
constructor Create(ID: Byte);
destructor Destroy; override;
procedure LoadFromStream(stream: TMemoryStream64); override;
procedure SaveToStream(stream: TMemoryStream64); override;
{$IFNDEF FPC}
procedure LoadFromJson(jarry: TJsonArray; index_: Integer); override;
procedure SaveToJson(jarry: TJsonArray; index_: Integer); override;
{$ENDIF}
function ComputeEncodeSize: Int64; override;
property Buffer: Double read FBuffer write FBuffer;
end;
TDataFrameArrayInteger = class sealed(TDataFrameBase)
protected
FBuffer: TCoreClassList;
public
constructor Create(ID: Byte);
destructor Destroy; override;
procedure Clear;
procedure Add(v: Integer);
procedure Delete(index_: Integer);
function Count: Integer;
procedure WriteArray(const a: array of Integer);
procedure LoadFromStream(stream: TMemoryStream64); override;
procedure SaveToStream(stream: TMemoryStream64); override;
{$IFNDEF FPC}
procedure LoadFromJson(jarry: TJsonArray; index_: Integer); override;
procedure SaveToJson(jarry: TJsonArray; index_: Integer); override;
{$ENDIF}
function ComputeEncodeSize: Int64; override;
function GetBuffer(index_: Integer): Integer;
procedure SetBuffer(index_: Integer; Value: Integer);
property Buffer[index_: Integer]: Integer read GetBuffer write SetBuffer; default;
end;
TDataFrameArrayShortInt = class sealed(TDataFrameBase)
protected
FBuffer: TCoreClassList;
public
constructor Create(ID: ShortInt);
destructor Destroy; override;
procedure Clear;
procedure Add(v: ShortInt);
procedure Delete(index_: Integer);
function Count: Integer;
procedure WriteArray(const a: array of ShortInt);
procedure LoadFromStream(stream: TMemoryStream64); override;
procedure SaveToStream(stream: TMemoryStream64); override;
{$IFNDEF FPC}
procedure LoadFromJson(jarry: TJsonArray; index_: Integer); override;
procedure SaveToJson(jarry: TJsonArray; index_: Integer); override;
{$ENDIF}
function ComputeEncodeSize: Int64; override;
function GetBuffer(index_: Integer): ShortInt;
procedure SetBuffer(index_: Integer; Value: ShortInt);
property Buffer[index_: Integer]: ShortInt read GetBuffer write SetBuffer; default;
end;
TDataFrameArrayByte = class sealed(TDataFrameBase)
protected
FBuffer: TCoreClassList;
public
constructor Create(ID: Byte);
destructor Destroy; override;
procedure Clear;
procedure Add(v: Byte);
procedure AddPtrBuff(p: PByte; Size: Integer);
procedure AddI64(v: Int64);
procedure AddU64(v: UInt64);
procedure Addi(v: Integer);
procedure AddWord(v: Word);
procedure Delete(index_: Integer);
function Count: Integer;
procedure WriteArray(const a: array of Byte);
procedure SetArray(const a: array of Byte);
procedure SetBuff(p: PByte; Size: Integer);
procedure GetBuff(p: PByte);
procedure LoadFromStream(stream: TMemoryStream64); override;
procedure SaveToStream(stream: TMemoryStream64); override;
{$IFNDEF FPC}
procedure LoadFromJson(jarry: TJsonArray; index_: Integer); override;
procedure SaveToJson(jarry: TJsonArray; index_: Integer); override;
{$ENDIF}
function ComputeEncodeSize: Int64; override;
function GetBuffer(index_: Integer): Byte;
procedure SetBuffer(index_: Integer; Value: Byte);
property Buffer[index_: Integer]: Byte read GetBuffer write SetBuffer; default;
end;
TDataFrameArraySingle = class sealed(TDataFrameBase)
protected
FBuffer: TCoreClassList;
public
constructor Create(ID: Byte);
destructor Destroy; override;
procedure Clear;
procedure Add(v: Single);
procedure Delete(index_: Integer);
function Count: Integer;
procedure WriteArray(const a: array of Single);
procedure LoadFromStream(stream: TMemoryStream64); override;
procedure SaveToStream(stream: TMemoryStream64); override;
{$IFNDEF FPC}
procedure LoadFromJson(jarry: TJsonArray; index_: Integer); override;
procedure SaveToJson(jarry: TJsonArray; index_: Integer); override;
{$ENDIF}
function ComputeEncodeSize: Int64; override;
function GetBuffer(index_: Integer): Single;
procedure SetBuffer(index_: Integer; Value: Single);
property Buffer[index_: Integer]: Single read GetBuffer write SetBuffer; default;
end;
TDataFrameArrayDouble = class sealed(TDataFrameBase)
private
protected
FBuffer: TCoreClassList;
public
constructor Create(ID: Byte);
destructor Destroy; override;
procedure Clear;
procedure Add(v: Double);
procedure Delete(index_: Integer);
function Count: Integer;
procedure WriteArray(const a: array of Double);
procedure LoadFromStream(stream: TMemoryStream64); override;
procedure SaveToStream(stream: TMemoryStream64); override;
{$IFNDEF FPC}
procedure LoadFromJson(jarry: TJsonArray; index_: Integer); override;
procedure SaveToJson(jarry: TJsonArray; index_: Integer); override;
{$ENDIF}
function ComputeEncodeSize: Int64; override;
function GetBuffer(index_: Integer): Double;
procedure SetBuffer(index_: Integer; Value: Double);
property Buffer[index_: Integer]: Double read GetBuffer write SetBuffer; default;
end;
TDataFrameArrayInt64 = class sealed(TDataFrameBase)
private
protected
FBuffer: TCoreClassList;
public
constructor Create(ID: Byte);
destructor Destroy; override;
procedure Clear;
procedure Add(v: Int64);
procedure Delete(index_: Integer);
function Count: Integer;
procedure WriteArray(const a: array of Int64);
procedure LoadFromStream(stream: TMemoryStream64); override;
procedure SaveToStream(stream: TMemoryStream64); override;
{$IFNDEF FPC}
procedure LoadFromJson(jarry: TJsonArray; index_: Integer); override;
procedure SaveToJson(jarry: TJsonArray; index_: Integer); override;
{$ENDIF}
function ComputeEncodeSize: Int64; override;
function GetBuffer(index_: Integer): Int64;
procedure SetBuffer(index_: Integer; Value: Int64);
property Buffer[index_: Integer]: Int64 read GetBuffer write SetBuffer; default;
end;
TDataFrameStream = class sealed(TDataFrameBase)
private
protected
FBuffer: TMemoryStream64;
public
constructor Create(ID: Byte);
destructor Destroy; override;
procedure Clear;
procedure LoadFromStream(stream: TMemoryStream64); override;
procedure SaveToStream(stream: TMemoryStream64); override;
{$IFNDEF FPC}
procedure LoadFromJson(jarry: TJsonArray; index_: Integer); override;
procedure SaveToJson(jarry: TJsonArray; index_: Integer); override;
{$ENDIF}
function ComputeEncodeSize: Int64; override;
function GetBuffer: TCoreClassStream;
procedure SetBuffer(_Buffer: TCoreClassStream);
property Buffer: TCoreClassStream read GetBuffer write SetBuffer;
end;
TDataFrameVariant = class sealed(TDataFrameBase)
private
protected
FBuffer: Variant;
public
constructor Create(ID: Byte);
destructor Destroy; override;
procedure LoadFromStream(stream: TMemoryStream64); override;
procedure SaveToStream(stream: TMemoryStream64); override;
{$IFNDEF FPC}
procedure LoadFromJson(jarry: TJsonArray; index_: Integer); override;
procedure SaveToJson(jarry: TJsonArray; index_: Integer); override;
{$ENDIF}
function ComputeEncodeSize: Int64; override;
property Buffer: Variant read FBuffer write FBuffer;
end;
TDataFrameInt64 = class sealed(TDataFrameBase)
private
protected
FBuffer: Int64;
public
constructor Create(ID: Byte);
destructor Destroy; override;
procedure LoadFromStream(stream: TMemoryStream64); override;
procedure SaveToStream(stream: TMemoryStream64); override;
{$IFNDEF FPC}
procedure LoadFromJson(jarry: TJsonArray; index_: Integer); override;
procedure SaveToJson(jarry: TJsonArray; index_: Integer); override;
{$ENDIF}
function ComputeEncodeSize: Int64; override;
property Buffer: Int64 read FBuffer write FBuffer;
end;
TDataFrameUInt64 = class sealed(TDataFrameBase)
private
protected
FBuffer: UInt64;
public
constructor Create(ID: Byte);
destructor Destroy; override;
procedure LoadFromStream(stream: TMemoryStream64); override;
procedure SaveToStream(stream: TMemoryStream64); override;
{$IFNDEF FPC}
procedure LoadFromJson(jarry: TJsonArray; index_: Integer); override;
procedure SaveToJson(jarry: TJsonArray; index_: Integer); override;
{$ENDIF}
function ComputeEncodeSize: Int64; override;
property Buffer: UInt64 read FBuffer write FBuffer;
end;
TDataFrameEngine = class;
TDataFrameEngineReader = class sealed(TCoreClassObject)
private
FOwner: TDataFrameEngine;
FIndex: Integer;
public
constructor Create(AOwner: TDataFrameEngine);
destructor Destroy; override;
property index: Integer read FIndex write FIndex;
//
function IsEnd: Boolean;
function NotEnd: Boolean;
procedure GoNext;
//
function ReadString: SystemString;
function ReadBytes: TBytes;
function ReadInteger: Integer;
function ReadCardinal: Cardinal;
function ReadWord: Word;
function ReadBool: Boolean;
function ReadBoolean: Boolean;
function ReadByte: Byte;
function ReadSingle: Single;
function ReadDouble: Double;
function ReadArrayInteger: TDataFrameArrayInteger;
function ReadArrayShortInt: TDataFrameArrayShortInt;
function ReadArrayByte: TDataFrameArrayByte;
function ReadMD5: TMD5;
function ReadArraySingle: TDataFrameArraySingle;
function ReadArrayDouble: TDataFrameArrayDouble;
function ReadArrayInt64: TDataFrameArrayInt64;
procedure ReadStream(output: TCoreClassStream);
function ReadVariant: Variant;
function ReadInt64: Int64;
function ReadUInt64: UInt64;
procedure ReadStrings(output: TCoreClassStrings);
procedure ReadListStrings(output: TListString);
procedure ReadPascalStrings(output: TListPascalString);
procedure ReadDataFrame(output: TDataFrameEngine);
procedure ReadHashStringList(output: THashStringList);
procedure ReadVariantList(output: THashVariantList);
procedure ReadSectionText(output: TSectionTextData);
procedure ReadTextSection(output: TSectionTextData);
{$IFNDEF FPC} procedure ReadJson(output: TJsonObject); {$ENDIF}
function ReadRect: TRect;
function ReadRectf: TRectf;
function ReadPoint: TPoint;
function ReadPointf: TPointf;
function ReadVector: TVector;
function ReadAffineVector: TAffineVector;
function ReadVec3: TVec3;
function ReadVec4: TVec4;
function ReadVector3: TVector3;
function ReadVector4: TVector4;
function ReadMat4: TMat4;
function ReadMatrix4: TMatrix4;
function Read2DPoint: T2DPoint;
function ReadVec2: TVec2;
function ReadRectV2: TRectV2;
function ReadPointer: UInt64;
// auto read from stream data
procedure Read(var aBuf; aCount: Int64); overload;
// read as TDataFrameBase
function Read: TDataFrameBase; overload;
end;
TDataFrameEngine = class(TCoreClassObject)
private type
TRunTimeDataType = (rdtString, rdtInteger, rdtLongWord, rdtWORD, rdtByte, rdtSingle, rdtDouble,
rdtArrayInteger, rdtArraySingle, rdtArrayDouble, rdtStream, rdtVariant, rdtInt64, rdtArrayShortInt, rdtCardinal, rdtUInt64, rdtArrayByte,
rdtArrayInt64);
private
FDataList: TCoreClassListForObj;
FReader: TDataFrameEngineReader;
FCompressorDeflate: TCompressorDeflate;
FCompressorBRRC: TCompressorBRRC;
protected
function DataTypeToByte(v: TRunTimeDataType): Byte;
function ByteToDataType(v: Byte): TRunTimeDataType;
public
constructor Create;
destructor Destroy; override;
property Reader: TDataFrameEngineReader read FReader;
procedure Clear;
function AddData(v: TRunTimeDataType): TDataFrameBase;
function GetData(index_: Integer): TDataFrameBase;
function GetDataInfo(Obj_: TDataFrameBase): SystemString;
function Count: Integer;
function Delete(index_: Integer): Boolean;
function DeleteFirst: Boolean;
function DeleteLast: Boolean; overload;
function DeleteLastCount(cnt: Integer): Boolean; overload;
function DeleteCount(index_, _Count: Integer): Boolean;
//
procedure Assign(source: TDataFrameEngine);
function Clone: TDataFrameEngine;
//
procedure WriteString(v: SystemString); overload;
procedure WriteString(v: TPascalString); overload;
procedure WriteBytes(v: TBytes);
procedure WriteInteger(v: Integer);
procedure WriteCardinal(v: Cardinal);
procedure WriteWORD(v: Word);
procedure WriteBool(v: Boolean);
procedure WriteBoolean(v: Boolean);
procedure WriteByte(v: Byte);
procedure WriteSingle(v: Single);
procedure WriteDouble(v: Double);
function WriteArrayInteger: TDataFrameArrayInteger;
function WriteArrayShortInt: TDataFrameArrayShortInt;
function WriteArrayByte: TDataFrameArrayByte;
procedure WriteMD5(md5: TMD5);
function WriteArraySingle: TDataFrameArraySingle;
function WriteArrayDouble: TDataFrameArrayDouble;
function WriteArrayInt64: TDataFrameArrayInt64;
procedure WriteStream(v: TCoreClassStream);
procedure WriteVariant(v: Variant);
procedure WriteInt64(v: Int64);
procedure WriteUInt64(v: UInt64);
procedure WriteStrings(v: TCoreClassStrings);
procedure WriteListStrings(v: TListString);
procedure WritePascalStrings(v: TListPascalString);
procedure WriteDataFrame(v: TDataFrameEngine);
procedure WriteDataFrameCompressed(v: TDataFrameEngine);
procedure WriteHashStringList(v: THashStringList);
procedure WriteVariantList(v: THashVariantList);
procedure WriteSectionText(v: TSectionTextData);
procedure WriteTextSection(v: TSectionTextData);
{$IFNDEF FPC} procedure WriteJson(v: TJsonObject); {$ENDIF}
procedure WriteFile(fn: SystemString);
procedure WriteRect(v: TRect);
procedure WriteRectf(v: TRectf);
procedure WritePoint(v: TPoint);
procedure WritePointf(v: TPointf);
procedure WriteVector(v: TVector);
procedure WriteAffineVector(v: TAffineVector);
procedure WriteVec4(v: TVec4);
procedure WriteVec3(v: TVec3);
procedure WriteVector4(v: TVector4);
procedure WriteVector3(v: TVector3);
procedure WriteMat4(v: TMat4);
procedure WriteMatrix4(v: TMatrix4);
procedure Write2DPoint(v: T2DPoint);
procedure WriteVec2(v: TVec2);
procedure WriteRectV2(v: TRectV2);
procedure WritePointer(v: Pointer); overload;
procedure WritePointer(v: UInt64); overload;
// auto append new stream and write
procedure write(const aBuf; aCount: Int64);
//
function ReadString(index_: Integer): SystemString;
function ReadBytes(index_: Integer): TBytes;
function ReadInteger(index_: Integer): Integer;
function ReadCardinal(index_: Integer): Cardinal;
function ReadWord(index_: Integer): Word;
function ReadBool(index_: Integer): Boolean;
function ReadBoolean(index_: Integer): Boolean;
function ReadByte(index_: Integer): Byte;
function ReadSingle(index_: Integer): Single;
function ReadDouble(index_: Integer): Double;
function ReadArrayInteger(index_: Integer): TDataFrameArrayInteger;
function ReadArrayShortInt(index_: Integer): TDataFrameArrayShortInt;
function ReadArrayByte(index_: Integer): TDataFrameArrayByte;
function ReadMD5(index_: Integer): TMD5;
function ReadArraySingle(index_: Integer): TDataFrameArraySingle;
function ReadArrayDouble(index_: Integer): TDataFrameArrayDouble;
function ReadArrayInt64(index_: Integer): TDataFrameArrayInt64;
procedure ReadStream(index_: Integer; output: TCoreClassStream);
function ReadVariant(index_: Integer): Variant;
function ReadInt64(index_: Integer): Int64;
function ReadUInt64(index_: Integer): UInt64;
procedure ReadStrings(index_: Integer; output: TCoreClassStrings);
procedure ReadListStrings(index_: Integer; output: TListString);
procedure ReadPascalStrings(index_: Integer; output: TListPascalString);
procedure ReadDataFrame(index_: Integer; output: TDataFrameEngine);
procedure ReadHashStringList(index_: Integer; output: THashStringList);
procedure ReadVariantList(index_: Integer; output: THashVariantList);
procedure ReadSectionText(index_: Integer; output: TSectionTextData);
procedure ReadTextSection(index_: Integer; output: TSectionTextData);
{$IFNDEF FPC} procedure ReadJson(index_: Integer; output: TJsonObject); {$ENDIF}
function ReadRect(index_: Integer): TRect;
function ReadRectf(index_: Integer): TRectf;
function ReadPoint(index_: Integer): TPoint;
function ReadPointf(index_: Integer): TPointf;
function ReadVector(index_: Integer): TVector;
function ReadAffineVector(index_: Integer): TAffineVector;
function ReadVec3(index_: Integer): TVec3;
function ReadVec4(index_: Integer): TVec4;
function ReadVector3(index_: Integer): TVector3;
function ReadVector4(index_: Integer): TVector4;
function ReadMat4(index_: Integer): TMat4;
function ReadMatrix4(index_: Integer): TMatrix4;
function Read2DPoint(index_: Integer): T2DPoint;
function ReadVec2(index_: Integer): TVec2;
function ReadRectV2(index_: Integer): TRectV2;
function ReadPointer(index_: Integer): UInt64;
// read from stream data
procedure Read(index_: Integer; var aBuf; aCount: Int64); overload;
// read as TDataFrameBase
function Read(index_: Integer): TDataFrameBase; overload;
//
function ComputeEncodeSize: Int64;
class procedure BuildEmptyStream(output: TCoreClassStream);
function EncodeTo(output: TCoreClassStream; const FastMode: Boolean): Integer; overload;
function EncodeTo(output: TCoreClassStream): Integer; overload;
// data security support
// QuantumCryptographyPassword: used sha-3-512 cryptography as 512 bits password
procedure Encrypt(output: TCoreClassStream; Compressed_: Boolean; SecurityLevel: Integer; Key: TCipherKeyBuffer);
function Decrypt(input: TCoreClassStream; Key: TCipherKeyBuffer): Boolean;
// json support
{$IFNDEF FPC}
procedure EncodeAsPublicJson(var output: TPascalString); overload;
procedure EncodeAsPublicJson(output: TCoreClassStream); overload;
procedure EncodeAsJson(output: TCoreClassStream);
procedure DecodeFromJson(stream: TCoreClassStream); overload;
procedure DecodeFromJson(const s: TPascalString); overload;
{$ENDIF}
//
// Parallel compressor
function EncodeAsSelectCompressor(scm: TSelectCompressionMethod; output: TCoreClassStream; const FastMode: Boolean): Integer; overload;
function EncodeAsSelectCompressor(output: TCoreClassStream; const FastMode: Boolean): Integer; overload;
function EncodeAsSelectCompressor(output: TCoreClassStream): Integer; overload;
// ZLib compressor
function EncodeAsZLib(output: TCoreClassStream; const FastMode: Boolean): Integer; overload;
function EncodeAsZLib(output: TCoreClassStream): Integer; overload;
// Deflate compressor
function EncodeAsDeflate(output: TCoreClassStream; const FastMode: Boolean): Integer; overload;
function EncodeAsDeflate(output: TCoreClassStream): Integer; overload;
// BRRC compressor
function EncodeAsBRRC(output: TCoreClassStream; const FastMode: Boolean): Integer; overload;
function EncodeAsBRRC(output: TCoreClassStream): Integer; overload;
function IsCompressed(source: TCoreClassStream): Boolean;
function DecodeFrom(source: TCoreClassStream; const FastMode: Boolean): Integer; overload;
function DecodeFrom(source: TCoreClassStream): Integer; overload;
procedure EncodeToBytes(const Compressed, FastMode: Boolean; var output: TBytes);
procedure DecodeFromBytes(var buff: TBytes); overload;
procedure DecodeFromBytes(var buff: TBytes; const FastMode: Boolean); overload;
function GetMD5(const FastMode: Boolean): TMD5;
// fast compare
function Compare(source: TDataFrameEngine): Boolean;
procedure LoadFromStream(stream: TCoreClassStream);
procedure SaveToStream(stream: TCoreClassStream);
property Data[index_: Integer]: TDataFrameBase read GetData; default;
property List: TCoreClassListForObj read FDataList;
end;
TDataWriter = class sealed(TCoreClassPersistent)
protected
FEngine: TDataFrameEngine;
FStream: TCoreClassStream;
public
constructor Create(AStream: TCoreClassStream);
destructor Destroy; override;
procedure Clear; { virtual; }
procedure WriteString(v: SystemString); { virtual; }
procedure WriteBytes(v: TBytes); { virtual; }
procedure WriteInteger(v: Integer); { virtual; }
procedure WriteCardinal(v: Cardinal); { virtual; }
procedure WriteWORD(v: Word); { virtual; }
procedure WriteBool(v: Boolean); { virtual; }
procedure WriteBoolean(v: Boolean); { virtual; }
procedure WriteByte(v: Byte); { virtual; }
procedure WriteSingle(v: Single); { virtual; }
procedure WriteDouble(v: Double); { virtual; }
procedure WriteArrayInteger(v: array of Integer); { virtual; }
procedure WriteArrayShortInt(v: array of ShortInt); { virtual; }
procedure WriteArrayByte(v: array of Byte); { virtual; }
procedure WriteArraySingle(v: array of Single); { virtual; }
procedure WriteArrayDouble(v: array of Double); { virtual; }
procedure WriteArrayInt64(v: array of Int64); { virtual; }
procedure WriteStream(v: TCoreClassStream); { virtual; }
procedure WriteVariant(v: Variant); { virtual; }
procedure WriteInt64(v: Int64); { virtual; }
procedure WriteUInt64(v: UInt64); { virtual; }
procedure WriteStrings(v: TCoreClassStrings); { virtual; }
procedure WriteListStrings(v: TListString); { virtual; }
procedure WritePascalStrings(v: TListPascalString); { virtual; }
procedure WriteDataFrame(v: TDataFrameEngine); { virtual; }
procedure WriteDataFrameCompressed(v: TDataFrameEngine); { virtual; }
procedure WriteHashStringList(v: THashStringList); { virtual; }
procedure WriteVariantList(v: THashVariantList); { virtual; }
procedure WriteSectionText(v: TSectionTextData); { virtual; }
{$IFNDEF FPC} procedure WriteJson(v: TJsonObject); { virtual; } {$ENDIF}
procedure WriteRect(v: TRect); { virtual; }
procedure WriteRectf(v: TRectf); { virtual; }
procedure WritePoint(v: TPoint); { virtual; }
procedure WritePointf(v: TPointf); { virtual; }
procedure WriteVector(v: TVector); { virtual; }
procedure WriteAffineVector(v: TAffineVector); { virtual; }
procedure WriteVec4(v: TVec4); { virtual; }
procedure WriteVec3(v: TVec3); { virtual; }
procedure WriteVector4(v: TVector4); { virtual; }
procedure WriteVector3(v: TVector3); { virtual; }
procedure WriteMat4(v: TMat4); { virtual; }
procedure WriteMatrix4(v: TMatrix4); { virtual; }
procedure Write2DPoint(v: T2DPoint); { virtual; }
procedure WriteVec2(v: TVec2); { virtual; }
procedure WriteRectV2(v: TRectV2); { virtual; }
procedure WritePointer(v: Pointer); { virtual; }
procedure write(const aBuf; aCount: Int64); { virtual; }
end;
TDataReader = class sealed(TCoreClassPersistent)
protected
FEngine: TDataFrameEngine;
public
constructor Create(AStream: TCoreClassStream);
destructor Destroy; override;
function ReadString: SystemString; { virtual; }
function ReadBytes: TBytes; { virtual; }
function ReadInteger: Integer; { virtual; }
function ReadCardinal: Cardinal; { virtual; }
function ReadWord: Word; { virtual; }
function ReadBool: Boolean; { virtual; }
function ReadBoolean: Boolean; { virtual; }
function ReadByte: Byte; { virtual; }
function ReadSingle: Single; { virtual; }
function ReadDouble: Double; { virtual; }
procedure ReadArrayInteger(var Data: array of Integer); { virtual; }
procedure ReadArrayShortInt(var Data: array of ShortInt); { virtual; }
procedure ReadArrayByte(var Data: array of Byte); { virtual; }
procedure ReadArraySingle(var Data: array of Single); { virtual; }
procedure ReadArrayDouble(var Data: array of Double); { virtual; }
procedure ReadArrayInt64(var Data: array of Int64); { virtual; }
procedure ReadStream(output: TCoreClassStream); { virtual; }
function ReadVariant: Variant; { virtual; }
function ReadInt64: Int64; { virtual; }
function ReadUInt64: UInt64; { virtual; }
procedure ReadStrings(output: TCoreClassStrings); { virtual; }
procedure ReadListStrings(output: TListString); { virtual; }
procedure ReadPascalStrings(output: TListPascalString); { virtual; }
procedure ReadDataFrame(output: TDataFrameEngine); { virtual; }
procedure ReadHashStringList(output: THashStringList); { virtual; }
procedure ReadVariantList(output: THashVariantList); { virtual; }
procedure ReadSectionText(output: TSectionTextData); { virtual; }
{$IFNDEF FPC} procedure ReadJson(output: TJsonObject); { virtual; } {$ENDIF}
function ReadRect: TRect; { virtual; }
function ReadRectf: TRectf; { virtual; }
function ReadPoint: TPoint; { virtual; }
function ReadPointf: TPointf; { virtual; }
function ReadVector: TVector; { virtual; }
function ReadAffineVector: TAffineVector; { virtual; }
function ReadVec3: TVec3; { virtual; }
function ReadVec4: TVec4; { virtual; }
function ReadVector3: TVector3; { virtual; }
function ReadVector4: TVector4; { virtual; }
function ReadMat4: TMat4; { virtual; }
function ReadMatrix4: TMatrix4; { virtual; }
function Read2DPoint: T2DPoint; { virtual; }
function ReadVec2: TVec2; { virtual; }
function ReadRectV2: TRectV2; { virtual; }
function ReadPointer: UInt64; { virtual; }
procedure Read(var aBuf; aCount: Int64); { virtual; }
end;
implementation
constructor TDataFrameBase.Create(ID: Byte);
begin
inherited Create;
FID := ID;
end;
destructor TDataFrameBase.Destroy;
begin
inherited Destroy;
end;
constructor TDataFrameString.Create(ID: Byte);
begin
inherited Create(ID);
SetLength(Buffer, 0);
end;
destructor TDataFrameString.Destroy;
begin
SetLength(Buffer, 0);
inherited Destroy;
end;
procedure TDataFrameString.LoadFromStream(stream: TMemoryStream64);
var
_Len: Integer;
begin
stream.Read64(_Len, C_Integer_Size);
SetLength(Buffer, _Len);
if (_Len > 0) then
stream.Read64(Buffer[0], _Len);
end;
procedure TDataFrameString.SaveToStream(stream: TMemoryStream64);
var
_Len: Integer;
begin
_Len := length(Buffer);
stream.Write64(_Len, C_Integer_Size);
if _Len > 0 then
stream.Write64(Buffer[0], _Len);
end;
{$IFNDEF FPC}
procedure TDataFrameString.LoadFromJson(jarry: TJsonArray; index_: Integer);
begin
Buffer := umlBytesOf(jarry.s[index_]);
end;
procedure TDataFrameString.SaveToJson(jarry: TJsonArray; index_: Integer);
begin
jarry.Add(umlStringOf(Buffer));
end;
{$ENDIF}
function TDataFrameString.ComputeEncodeSize: Int64;
begin
Result := C_Integer_Size + length(Buffer);
end;
constructor TDataFrameInteger.Create(ID: Byte);
begin
inherited Create(ID);
Buffer := 0;
end;
destructor TDataFrameInteger.Destroy;
begin
inherited Destroy;
end;
procedure TDataFrameInteger.LoadFromStream(stream: TMemoryStream64);
begin
stream.Read64(FBuffer, C_Integer_Size);
end;
procedure TDataFrameInteger.SaveToStream(stream: TMemoryStream64);
begin
stream.Write64(FBuffer, C_Integer_Size);
end;
{$IFNDEF FPC}
procedure TDataFrameInteger.LoadFromJson(jarry: TJsonArray; index_: Integer);
begin
FBuffer := jarry.i[index_];
end;
procedure TDataFrameInteger.SaveToJson(jarry: TJsonArray; index_: Integer);
begin
jarry.Add(FBuffer);
end;
{$ENDIF}
function TDataFrameInteger.ComputeEncodeSize: Int64;
begin
Result := C_Integer_Size;
end;
constructor TDataFrameCardinal.Create(ID: Byte);
begin
inherited Create(ID);
Buffer := 0;
end;
destructor TDataFrameCardinal.Destroy;
begin
inherited Destroy;
end;
procedure TDataFrameCardinal.LoadFromStream(stream: TMemoryStream64);
begin
stream.Read64(FBuffer, C_Cardinal_Size);
end;
procedure TDataFrameCardinal.SaveToStream(stream: TMemoryStream64);
begin
stream.Write64(FBuffer, C_Cardinal_Size);
end;
{$IFNDEF FPC}
procedure TDataFrameCardinal.LoadFromJson(jarry: TJsonArray; index_: Integer);
begin
FBuffer := jarry.i[index_];
end;
procedure TDataFrameCardinal.SaveToJson(jarry: TJsonArray; index_: Integer);
begin
jarry.Add(FBuffer);
end;
{$ENDIF}
function TDataFrameCardinal.ComputeEncodeSize: Int64;
begin
Result := C_Cardinal_Size;
end;
constructor TDataFrameWord.Create(ID: Byte);
begin
inherited Create(ID);
Buffer := 0;
end;
destructor TDataFrameWord.Destroy;
begin
inherited Destroy;
end;
procedure TDataFrameWord.LoadFromStream(stream: TMemoryStream64);
begin
stream.Read64(FBuffer, C_Word_Size);
end;
procedure TDataFrameWord.SaveToStream(stream: TMemoryStream64);
begin
stream.Write64(FBuffer, C_Word_Size);
end;
{$IFNDEF FPC}
procedure TDataFrameWord.LoadFromJson(jarry: TJsonArray; index_: Integer);
begin
FBuffer := jarry.i[index_];
end;
procedure TDataFrameWord.SaveToJson(jarry: TJsonArray; index_: Integer);
begin
jarry.Add(FBuffer);
end;
{$ENDIF}
function TDataFrameWord.ComputeEncodeSize: Int64;
begin
Result := C_Word_Size;
end;
constructor TDataFrameByte.Create(ID: Byte);
begin
inherited Create(ID);
Buffer := 0;
end;
destructor TDataFrameByte.Destroy;
begin
inherited Destroy;
end;
procedure TDataFrameByte.LoadFromStream(stream: TMemoryStream64);
begin
stream.Read64(FBuffer, C_Byte_Size);
end;
procedure TDataFrameByte.SaveToStream(stream: TMemoryStream64);
begin
stream.Write64(FBuffer, C_Byte_Size);
end;
{$IFNDEF FPC}
procedure TDataFrameByte.LoadFromJson(jarry: TJsonArray; index_: Integer);
begin
FBuffer := jarry.i[index_];
end;
procedure TDataFrameByte.SaveToJson(jarry: TJsonArray; index_: Integer);
begin
jarry.Add(FBuffer);
end;
{$ENDIF}
function TDataFrameByte.ComputeEncodeSize: Int64;
begin
Result := C_Byte_Size;
end;
constructor TDataFrameSingle.Create(ID: Byte);
begin
inherited Create(ID);
Buffer := 0;
end;
destructor TDataFrameSingle.Destroy;
begin
inherited Destroy;
end;
procedure TDataFrameSingle.LoadFromStream(stream: TMemoryStream64);
begin
stream.Read64(FBuffer, C_Single_Size);
end;
procedure TDataFrameSingle.SaveToStream(stream: TMemoryStream64);
begin
stream.Write64(FBuffer, C_Single_Size);
end;
{$IFNDEF FPC}
procedure TDataFrameSingle.LoadFromJson(jarry: TJsonArray; index_: Integer);
begin
FBuffer := jarry.f[index_];
end;
procedure TDataFrameSingle.SaveToJson(jarry: TJsonArray; index_: Integer);
begin
jarry.AddF(FBuffer);
end;
{$ENDIF}
function TDataFrameSingle.ComputeEncodeSize: Int64;
begin
Result := C_Single_Size;
end;
constructor TDataFrameDouble.Create(ID: Byte);
begin
inherited Create(ID);
Buffer := 0;
end;
destructor TDataFrameDouble.Destroy;
begin
inherited Destroy;
end;
procedure TDataFrameDouble.LoadFromStream(stream: TMemoryStream64);
begin
stream.Read64(FBuffer, C_Double_Size);
end;
procedure TDataFrameDouble.SaveToStream(stream: TMemoryStream64);
begin
stream.Write64(FBuffer, C_Double_Size);
end;
{$IFNDEF FPC}
procedure TDataFrameDouble.LoadFromJson(jarry: TJsonArray; index_: Integer);
begin
FBuffer := jarry.f[index_];
end;
procedure TDataFrameDouble.SaveToJson(jarry: TJsonArray; index_: Integer);
begin
jarry.AddF(FBuffer);
end;
{$ENDIF}
function TDataFrameDouble.ComputeEncodeSize: Int64;
begin
Result := C_Double_Size;
end;
constructor TDataFrameArrayInteger.Create(ID: Byte);
begin
inherited Create(ID);
FBuffer := TCoreClassList.Create;
end;
destructor TDataFrameArrayInteger.Destroy;
begin
Clear;
DisposeObject(FBuffer);
inherited Destroy;
end;
procedure TDataFrameArrayInteger.Clear;
var
i: Integer;
p: PInteger;
begin
for i := 0 to FBuffer.Count - 1 do
begin
p := FBuffer[i];
Dispose(p);
end;
FBuffer.Clear;
end;
procedure TDataFrameArrayInteger.Add(v: Integer);
var
_PV: PInteger;
begin
new(_PV);
_PV^ := v;
FBuffer.Add(_PV);
end;
procedure TDataFrameArrayInteger.Delete(index_: Integer);
begin
Dispose(PInteger(FBuffer[index_]));
FBuffer.Delete(index_);
end;
function TDataFrameArrayInteger.Count: Integer;
begin
Result := FBuffer.Count;
end;
procedure TDataFrameArrayInteger.WriteArray(const a: array of Integer);
var
i: Integer;
begin
for i := low(a) to high(a) do
Add(a[i]);
end;
procedure TDataFrameArrayInteger.LoadFromStream(stream: TMemoryStream64);
var
i, L: Integer;
d: Integer;
begin
Clear;
stream.Read64(L, C_Integer_Size);
for i := 0 to L - 1 do
begin
stream.Read64(d, C_Integer_Size);
Add(d);
end;
end;
procedure TDataFrameArrayInteger.SaveToStream(stream: TMemoryStream64);
var
i, L: Integer;
d: Integer;
begin
L := Count;
stream.Write64(L, C_Integer_Size);
for i := 0 to L - 1 do
begin
d := Buffer[i];
stream.Write64(d, C_Integer_Size);
end;
end;
{$IFNDEF FPC}
procedure TDataFrameArrayInteger.LoadFromJson(jarry: TJsonArray; index_: Integer);
var
ja: TJsonArray;
i: Integer;
begin
ja := jarry.a[index_];
for i := 0 to ja.Count - 1 do
Add(ja.i[i]);
end;
procedure TDataFrameArrayInteger.SaveToJson(jarry: TJsonArray; index_: Integer);
var
ja: TJsonArray;
i: Integer;
begin
ja := jarry.AddArray;
for i := 0 to Count - 1 do
ja.Add(Buffer[i]);
end;
{$ENDIF}
function TDataFrameArrayInteger.ComputeEncodeSize: Int64;
begin
Result := C_Integer_Size + C_Integer_Size * Count;
end;
function TDataFrameArrayInteger.GetBuffer(index_: Integer): Integer;
begin
Result := PInteger(FBuffer[index_])^;
end;
procedure TDataFrameArrayInteger.SetBuffer(index_: Integer; Value: Integer);
begin
PInteger(FBuffer[index_])^ := Value;
end;
constructor TDataFrameArrayShortInt.Create(ID: ShortInt);
begin
inherited Create(ID);
FBuffer := TCoreClassList.Create;
end;
destructor TDataFrameArrayShortInt.Destroy;
begin
Clear;
DisposeObject(FBuffer);
inherited Destroy;
end;
procedure TDataFrameArrayShortInt.Clear;
var
i: Integer;
p: PShortInt;
begin
for i := 0 to FBuffer.Count - 1 do
begin
p := FBuffer[i];
Dispose(p);
end;
FBuffer.Clear;
end;
procedure TDataFrameArrayShortInt.Add(v: ShortInt);
var
_PV: PShortInt;
begin
new(_PV);
_PV^ := v;
FBuffer.Add(_PV);
end;
procedure TDataFrameArrayShortInt.Delete(index_: Integer);
begin
Dispose(PShortInt(FBuffer[index_]));
FBuffer.Delete(index_);
end;
function TDataFrameArrayShortInt.Count: Integer;
begin
Result := FBuffer.Count;
end;
procedure TDataFrameArrayShortInt.WriteArray(const a: array of ShortInt);
var
i: Integer;
begin
for i := low(a) to high(a) do
Add(a[i]);
end;
procedure TDataFrameArrayShortInt.LoadFromStream(stream: TMemoryStream64);
var
i, L: Integer;
d: ShortInt;
begin
Clear;
stream.Read64(L, C_Integer_Size);
for i := 0 to L - 1 do
begin
stream.Read64(d, C_Short_Int_Size);
Add(d);
end;
end;
procedure TDataFrameArrayShortInt.SaveToStream(stream: TMemoryStream64);
var
i, L: Integer;
d: ShortInt;
begin
L := Count;
stream.Write64(L, C_Integer_Size);
for i := 0 to L - 1 do
begin
d := Buffer[i];
stream.Write64(d, C_Short_Int_Size);
end;
end;
{$IFNDEF FPC}
procedure TDataFrameArrayShortInt.LoadFromJson(jarry: TJsonArray; index_: Integer);
var
ja: TJsonArray;
i: Integer;
begin
ja := jarry.a[index_];
for i := 0 to ja.Count - 1 do
Add(ja.i[i]);
end;
procedure TDataFrameArrayShortInt.SaveToJson(jarry: TJsonArray; index_: Integer);
var
ja: TJsonArray;
i: Integer;
begin
ja := jarry.AddArray;
for i := 0 to Count - 1 do
ja.Add(Buffer[i]);
end;
{$ENDIF}
function TDataFrameArrayShortInt.ComputeEncodeSize: Int64;
begin
Result := C_Integer_Size + C_Short_Int_Size * Count;
end;
function TDataFrameArrayShortInt.GetBuffer(index_: Integer): ShortInt;
begin
Result := PShortInt(FBuffer[index_])^;
end;
procedure TDataFrameArrayShortInt.SetBuffer(index_: Integer; Value: ShortInt);
begin
PShortInt(FBuffer[index_])^ := Value;
end;
constructor TDataFrameArrayByte.Create(ID: Byte);
begin
inherited Create(ID);
FBuffer := TCoreClassList.Create;
end;
destructor TDataFrameArrayByte.Destroy;
begin
Clear;
DisposeObject(FBuffer);
inherited Destroy;
end;
procedure TDataFrameArrayByte.Clear;
var
i: Integer;
p: PByte;
begin
for i := 0 to FBuffer.Count - 1 do
begin
p := FBuffer[i];
Dispose(p);
end;
FBuffer.Clear;
end;
procedure TDataFrameArrayByte.Add(v: Byte);
var
_PV: PByte;
begin
new(_PV);
_PV^ := v;
FBuffer.Add(_PV);
end;
procedure TDataFrameArrayByte.AddPtrBuff(p: PByte; Size: Integer);
var
i: Integer;
begin
for i := 0 to Size - 1 do
begin
Add(p^);
inc(p);
end;
end;
procedure TDataFrameArrayByte.AddI64(v: Int64);
begin
AddPtrBuff(@v, C_Int64_Size);
end;
procedure TDataFrameArrayByte.AddU64(v: UInt64);
begin
AddPtrBuff(@v, C_UInt64_Size);
end;
procedure TDataFrameArrayByte.Addi(v: Integer);
begin
AddPtrBuff(@v, C_Integer_Size);
end;
procedure TDataFrameArrayByte.AddWord(v: Word);
begin
AddPtrBuff(@v, C_Word_Size);
end;
procedure TDataFrameArrayByte.Delete(index_: Integer);
begin
Dispose(PByte(FBuffer[index_]));
FBuffer.Delete(index_);
end;
function TDataFrameArrayByte.Count: Integer;
begin
Result := FBuffer.Count;
end;
procedure TDataFrameArrayByte.WriteArray(const a: array of Byte);
var
i: Integer;
begin
for i := low(a) to high(a) do
Add(a[i]);
end;
procedure TDataFrameArrayByte.SetArray(const a: array of Byte);
var
i: Integer;
begin
Clear;
for i := low(a) to high(a) do
Add(a[i]);
end;
procedure TDataFrameArrayByte.SetBuff(p: PByte; Size: Integer);
begin
Clear;
AddPtrBuff(p, Size);
end;
procedure TDataFrameArrayByte.GetBuff(p: PByte);
var
i: Integer;
begin
for i := 0 to Count - 1 do
begin
p^ := PByte(FBuffer[i])^;
inc(p);
end;
end;
procedure TDataFrameArrayByte.LoadFromStream(stream: TMemoryStream64);
var
i, L: Integer;
d: Byte;
begin
Clear;
stream.Read64(L, C_Integer_Size);
for i := 0 to L - 1 do
begin
stream.Read64(d, C_Byte_Size);
Add(d);
end;
end;
procedure TDataFrameArrayByte.SaveToStream(stream: TMemoryStream64);
var
i, L: Integer;
d: Byte;
begin
L := Count;
stream.Write64(L, C_Integer_Size);
for i := 0 to L - 1 do
begin
d := Buffer[i];
stream.Write64(d, C_Byte_Size);
end;
end;
{$IFNDEF FPC}
procedure TDataFrameArrayByte.LoadFromJson(jarry: TJsonArray; index_: Integer);
var
ja: TJsonArray;
i: Integer;
begin
ja := jarry.a[index_];
for i := 0 to ja.Count - 1 do
Add(ja.i[i]);
end;
procedure TDataFrameArrayByte.SaveToJson(jarry: TJsonArray; index_: Integer);
var
ja: TJsonArray;
i: Integer;
begin
ja := jarry.AddArray;
for i := 0 to Count - 1 do
ja.Add(Buffer[i]);
end;
{$ENDIF}
function TDataFrameArrayByte.ComputeEncodeSize: Int64;
begin
Result := C_Integer_Size + C_Byte_Size * Count;
end;
function TDataFrameArraySingle.GetBuffer(index_: Integer): Single;
begin
Result := PSingle(FBuffer[index_])^;
end;
procedure TDataFrameArraySingle.SetBuffer(index_: Integer; Value: Single);
begin
PSingle(FBuffer[index_])^ := Value;
end;
function TDataFrameArrayByte.GetBuffer(index_: Integer): Byte;
begin
Result := PByte(FBuffer[index_])^;
end;
procedure TDataFrameArrayByte.SetBuffer(index_: Integer; Value: Byte);
begin
PByte(FBuffer[index_])^ := Value;
end;
constructor TDataFrameArraySingle.Create(ID: Byte);
begin
inherited Create(ID);
FBuffer := TCoreClassList.Create;
end;
destructor TDataFrameArraySingle.Destroy;
begin
Clear;
DisposeObject(FBuffer);
inherited Destroy;
end;
procedure TDataFrameArraySingle.Clear;
var
i: Integer;
p: PSingle;
begin
for i := 0 to FBuffer.Count - 1 do
begin
p := FBuffer[i];
Dispose(p);
end;
FBuffer.Clear;
end;
procedure TDataFrameArraySingle.Add(v: Single);
var
_PV: PSingle;
begin
new(_PV);
_PV^ := v;
FBuffer.Add(_PV);
end;
procedure TDataFrameArraySingle.Delete(index_: Integer);
begin
Dispose(PSingle(FBuffer[index_]));
FBuffer.Delete(index_);
end;
function TDataFrameArraySingle.Count: Integer;
begin
Result := FBuffer.Count;
end;
procedure TDataFrameArraySingle.WriteArray(const a: array of Single);
var
i: Integer;
begin
for i := low(a) to high(a) do
Add(a[i]);
end;
procedure TDataFrameArraySingle.LoadFromStream(stream: TMemoryStream64);
var
i, L: Integer;
d: Single;
begin
Clear;
stream.Read64(L, C_Integer_Size);
for i := 0 to L - 1 do
begin
stream.Read64(d, C_Single_Size);
Add(d);
end;
end;
procedure TDataFrameArraySingle.SaveToStream(stream: TMemoryStream64);
var
i, L: Integer;
d: Single;
begin
L := Count;
stream.Write64(L, C_Integer_Size);
for i := 0 to L - 1 do
begin
d := Buffer[i];
stream.Write64(d, C_Single_Size);
end;
end;
{$IFNDEF FPC}
procedure TDataFrameArraySingle.LoadFromJson(jarry: TJsonArray; index_: Integer);
var
ja: TJsonArray;
i: Integer;
begin
ja := jarry.a[index_];
for i := 0 to ja.Count - 1 do
Add(ja.f[i]);
end;
procedure TDataFrameArraySingle.SaveToJson(jarry: TJsonArray; index_: Integer);
var
ja: TJsonArray;
i: Integer;
begin
ja := jarry.AddArray;
for i := 0 to Count - 1 do
ja.AddF(Buffer[i]);
end;
{$ENDIF}
function TDataFrameArraySingle.ComputeEncodeSize: Int64;
begin
Result := C_Integer_Size + C_Single_Size * Count;
end;
constructor TDataFrameArrayDouble.Create(ID: Byte);
begin
inherited Create(ID);
FBuffer := TCoreClassList.Create;
end;
destructor TDataFrameArrayDouble.Destroy;
begin
Clear;
DisposeObject(FBuffer);
inherited Destroy;
end;
procedure TDataFrameArrayDouble.Clear;
var
i: Integer;
p: PDouble;
begin
for i := 0 to FBuffer.Count - 1 do
begin
p := FBuffer[i];
Dispose(p);
end;
FBuffer.Clear;
end;
procedure TDataFrameArrayDouble.Add(v: Double);
var
_PV: PDouble;
begin
new(_PV);
_PV^ := v;
FBuffer.Add(_PV);
end;
procedure TDataFrameArrayDouble.Delete(index_: Integer);
begin
Dispose(PDouble(FBuffer[index_]));
FBuffer.Delete(index_);
end;
function TDataFrameArrayDouble.Count: Integer;
begin
Result := FBuffer.Count;
end;
procedure TDataFrameArrayDouble.WriteArray(const a: array of Double);
var
i: Integer;
begin
for i := low(a) to high(a) do
Add(a[i]);
end;
procedure TDataFrameArrayDouble.LoadFromStream(stream: TMemoryStream64);
var
i, L: Integer;
d: Double;
begin
Clear;
stream.Read64(L, C_Integer_Size);
for i := 0 to L - 1 do
begin
stream.Read64(d, C_Double_Size);
Add(d);
end;
end;
procedure TDataFrameArrayDouble.SaveToStream(stream: TMemoryStream64);
var
i, L: Integer;
d: Double;
begin
L := Count;
stream.Write64(L, C_Integer_Size);
for i := 0 to L - 1 do
begin
d := Buffer[i];
stream.Write64(d, C_Double_Size);
end;
end;
{$IFNDEF FPC}
procedure TDataFrameArrayDouble.LoadFromJson(jarry: TJsonArray; index_: Integer);
var
ja: TJsonArray;
i: Integer;
begin
ja := jarry.a[index_];
for i := 0 to ja.Count - 1 do
Add(ja.f[i]);
end;
procedure TDataFrameArrayDouble.SaveToJson(jarry: TJsonArray; index_: Integer);
var
ja: TJsonArray;
i: Integer;
begin
ja := jarry.AddArray;
for i := 0 to Count - 1 do
ja.AddF(Buffer[i]);
end;
{$ENDIF}
function TDataFrameArrayDouble.ComputeEncodeSize: Int64;
begin
Result := C_Integer_Size + C_Double_Size * Count;
end;
function TDataFrameArrayDouble.GetBuffer(index_: Integer): Double;
begin
Result := PDouble(FBuffer[index_])^;
end;
procedure TDataFrameArrayDouble.SetBuffer(index_: Integer; Value: Double);
begin
PDouble(FBuffer[index_])^ := Value;
end;
constructor TDataFrameArrayInt64.Create(ID: Byte);
begin
inherited Create(ID);
FBuffer := TCoreClassList.Create;
end;
destructor TDataFrameArrayInt64.Destroy;
begin
Clear;
DisposeObject(FBuffer);
inherited Destroy;
end;
procedure TDataFrameArrayInt64.Clear;
var
i: Integer;
p: PInt64;
begin
for i := 0 to FBuffer.Count - 1 do
begin
p := FBuffer[i];
Dispose(p);
end;
FBuffer.Clear;
end;
procedure TDataFrameArrayInt64.Add(v: Int64);
var
_PV: PInt64;
begin
new(_PV);
_PV^ := v;
FBuffer.Add(_PV);
end;
procedure TDataFrameArrayInt64.Delete(index_: Integer);
begin
Dispose(PInt64(FBuffer[index_]));
FBuffer.Delete(index_);
end;
function TDataFrameArrayInt64.Count: Integer;
begin
Result := FBuffer.Count;
end;
procedure TDataFrameArrayInt64.WriteArray(const a: array of Int64);
var
i: Integer;
begin
for i := low(a) to high(a) do
Add(a[i]);
end;
procedure TDataFrameArrayInt64.LoadFromStream(stream: TMemoryStream64);
var
i, L: Integer;
d: Int64;
begin
Clear;
stream.Read64(L, C_Integer_Size);
for i := 0 to L - 1 do
begin
stream.Read64(d, C_Int64_Size);
Add(d);
end;
end;
procedure TDataFrameArrayInt64.SaveToStream(stream: TMemoryStream64);
var
i, L: Integer;
d: Int64;
begin
L := Count;
stream.Write64(L, C_Integer_Size);
for i := 0 to L - 1 do
begin
d := Buffer[i];
stream.Write64(d, C_Int64_Size);
end;
end;
{$IFNDEF FPC}
procedure TDataFrameArrayInt64.LoadFromJson(jarry: TJsonArray; index_: Integer);
var
ja: TJsonArray;
i: Integer;
begin
ja := jarry.a[index_];
for i := 0 to ja.Count - 1 do
Add(ja.L[i]);
end;
procedure TDataFrameArrayInt64.SaveToJson(jarry: TJsonArray; index_: Integer);
var
ja: TJsonArray;
i: Integer;
begin
ja := jarry.AddArray;
for i := 0 to Count - 1 do
ja.Add(Buffer[i]);
end;
{$ENDIF}
function TDataFrameArrayInt64.ComputeEncodeSize: Int64;
begin
Result := C_Integer_Size + C_Int64_Size * Count;
end;
function TDataFrameArrayInt64.GetBuffer(index_: Integer): Int64;
begin
Result := PInt64(FBuffer[index_])^;
end;
procedure TDataFrameArrayInt64.SetBuffer(index_: Integer; Value: Int64);
begin
PInt64(FBuffer[index_])^ := Value;
end;
constructor TDataFrameStream.Create(ID: Byte);
begin
inherited Create(ID);
FBuffer := TMemoryStream64.Create;
end;
destructor TDataFrameStream.Destroy;
begin
DisposeObject(FBuffer);
inherited Destroy;
end;
procedure TDataFrameStream.Clear;
begin
FBuffer.Clear;
end;
procedure TDataFrameStream.LoadFromStream(stream: TMemoryStream64);
var
_Len: Integer;
begin
FBuffer.Clear;
stream.Read64(_Len, C_Integer_Size);
if (_Len > 0) then
FBuffer.CopyFrom(stream, _Len);
end;
procedure TDataFrameStream.SaveToStream(stream: TMemoryStream64);
var
_Len: Integer;
begin
_Len := FBuffer.Size;
stream.Write64(_Len, C_Integer_Size);
if _Len > 0 then
begin
FBuffer.Position := 0;
stream.CopyFrom(FBuffer, _Len);
end;
end;
{$IFNDEF FPC}
procedure TDataFrameStream.LoadFromJson(jarry: TJsonArray; index_: Integer);
var
b64: TPascalString;
begin
FBuffer.Clear;
b64.Text := jarry.s[index_];
umlDecodeStreamBASE64(b64, FBuffer);
end;
procedure TDataFrameStream.SaveToJson(jarry: TJsonArray; index_: Integer);
var
b64: TPascalString;
begin
umlEncodeStreamBASE64(FBuffer, b64);
jarry.Add(b64.Text);
end;
{$ENDIF}
function TDataFrameStream.ComputeEncodeSize: Int64;
begin
Result := C_Integer_Size + FBuffer.Size;
end;
function TDataFrameStream.GetBuffer: TCoreClassStream;
begin
Result := FBuffer;
end;
procedure TDataFrameStream.SetBuffer(_Buffer: TCoreClassStream);
var
_P: Int64;
begin
FBuffer.Clear;
_P := _Buffer.Position;
_Buffer.Position := 0;
if _Buffer.Size > 0 then
FBuffer.CopyFrom(_Buffer, _Buffer.Size);
_Buffer.Position := _P;
end;
constructor TDataFrameVariant.Create(ID: Byte);
begin
inherited Create(ID);
end;
destructor TDataFrameVariant.Destroy;
begin
inherited Destroy;
end;
procedure TDataFrameVariant.LoadFromStream(stream: TMemoryStream64);
var
vt: TVarType;
begin
vt := TVarType(stream.ReadUInt16);
case vt of
varSmallInt: FBuffer := stream.ReadInt16;
varInteger: FBuffer := stream.ReadInt32;
varSingle: FBuffer := stream.ReadSingle;
varDouble: FBuffer := stream.ReadDouble;
varCurrency: FBuffer := stream.ReadCurrency;
varBoolean: FBuffer := stream.ReadBool;
varShortInt: FBuffer := stream.ReadInt8;
varByte: FBuffer := stream.ReadUInt8;
varWord: FBuffer := stream.ReadUInt16;
varLongWord: FBuffer := stream.ReadUInt32;
varInt64: FBuffer := stream.ReadInt64;
varUInt64: FBuffer := stream.ReadUInt64;
varOleStr, varString, varUString: FBuffer := stream.ReadString.Text;
else RaiseInfo('error variant type');
end;
end;
procedure TDataFrameVariant.SaveToStream(stream: TMemoryStream64);
var
vt: TVarType;
begin
vt := TVarData(FBuffer).VType;
stream.WriteUInt16(Word(vt));
case vt of
varSmallInt: stream.WriteInt16(FBuffer);
varInteger: stream.WriteInt32(FBuffer);
varSingle: stream.WriteSingle(FBuffer);
varDouble: stream.WriteDouble(FBuffer);
varCurrency: stream.WriteCurrency(FBuffer);
varBoolean: stream.WriteBool(FBuffer);
varShortInt: stream.WriteInt8(FBuffer);
varByte: stream.WriteUInt8(FBuffer);
varWord: stream.WriteUInt16(FBuffer);
varLongWord: stream.WriteUInt32(FBuffer);
varInt64: stream.WriteInt64(FBuffer);
varUInt64: stream.WriteUInt64(FBuffer);
varOleStr, varString, varUString: stream.WriteString(FBuffer);
else
RaiseInfo('error variant type');
end;
end;
{$IFNDEF FPC}
procedure TDataFrameVariant.LoadFromJson(jarry: TJsonArray; index_: Integer);
begin
FBuffer := umlStrToVar(jarry.s[index_]);
end;
procedure TDataFrameVariant.SaveToJson(jarry: TJsonArray; index_: Integer);
begin
jarry.Add(umlVarToStr(FBuffer, True).Text);
end;
{$ENDIF}
function TDataFrameVariant.ComputeEncodeSize: Int64;
var
tmp: TMemoryStream64;
begin
tmp := TMemoryStream64.CustomCreate(1024);
SaveToStream(tmp);
Result := tmp.Size;
DisposeObject(tmp);
end;
constructor TDataFrameInt64.Create(ID: Byte);
begin
inherited Create(ID);
Buffer := 0;
end;
destructor TDataFrameInt64.Destroy;
begin
inherited Destroy;
end;
procedure TDataFrameInt64.LoadFromStream(stream: TMemoryStream64);
begin
stream.Read64(FBuffer, C_Int64_Size);
end;
procedure TDataFrameInt64.SaveToStream(stream: TMemoryStream64);
begin
stream.Write64(FBuffer, C_Int64_Size);
end;
{$IFNDEF FPC}
procedure TDataFrameInt64.LoadFromJson(jarry: TJsonArray; index_: Integer);
begin
FBuffer := jarry.L[index_];
end;
procedure TDataFrameInt64.SaveToJson(jarry: TJsonArray; index_: Integer);
begin
jarry.Add(FBuffer);
end;
{$ENDIF}
function TDataFrameInt64.ComputeEncodeSize: Int64;
begin
Result := C_Int64_Size;
end;
constructor TDataFrameUInt64.Create(ID: Byte);
begin
inherited Create(ID);
Buffer := 0;
end;
destructor TDataFrameUInt64.Destroy;
begin
inherited Destroy;
end;
procedure TDataFrameUInt64.LoadFromStream(stream: TMemoryStream64);
begin
stream.Read64(FBuffer, C_UInt64_Size);
end;
procedure TDataFrameUInt64.SaveToStream(stream: TMemoryStream64);
begin
stream.Write64(FBuffer, C_UInt64_Size);
end;
{$IFNDEF FPC}
procedure TDataFrameUInt64.LoadFromJson(jarry: TJsonArray; index_: Integer);
begin
FBuffer := jarry.u[index_];
end;
procedure TDataFrameUInt64.SaveToJson(jarry: TJsonArray; index_: Integer);
begin
jarry.Add(FBuffer);
end;
{$ENDIF}
function TDataFrameUInt64.ComputeEncodeSize: Int64;
begin
Result := C_UInt64_Size;
end;
constructor TDataFrameEngineReader.Create(AOwner: TDataFrameEngine);
begin
inherited Create;
FOwner := AOwner;
FIndex := 0;
end;
destructor TDataFrameEngineReader.Destroy;
begin
inherited Destroy;
end;
function TDataFrameEngineReader.IsEnd: Boolean;
begin
Result := FIndex >= FOwner.Count;
end;
function TDataFrameEngineReader.NotEnd: Boolean;
begin
Result := FIndex < FOwner.Count;
end;
procedure TDataFrameEngineReader.GoNext;
begin
inc(FIndex);
end;
function TDataFrameEngineReader.ReadString: SystemString;
begin
Result := FOwner.ReadString(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadBytes: TBytes;
begin
Result := FOwner.ReadBytes(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadInteger: Integer;
begin
Result := FOwner.ReadInteger(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadCardinal: Cardinal;
begin
Result := FOwner.ReadCardinal(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadWord: Word;
begin
Result := FOwner.ReadWord(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadBool: Boolean;
begin
Result := FOwner.ReadBool(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadBoolean: Boolean;
begin
Result := ReadBool;
end;
function TDataFrameEngineReader.ReadByte: Byte;
begin
Result := FOwner.ReadByte(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadSingle: Single;
begin
Result := FOwner.ReadSingle(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadDouble: Double;
begin
Result := FOwner.ReadDouble(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadArrayInteger: TDataFrameArrayInteger;
begin
Result := FOwner.ReadArrayInteger(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadArrayShortInt: TDataFrameArrayShortInt;
begin
Result := FOwner.ReadArrayShortInt(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadArrayByte: TDataFrameArrayByte;
begin
Result := FOwner.ReadArrayByte(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadMD5: TMD5;
begin
Result := FOwner.ReadMD5(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadArraySingle: TDataFrameArraySingle;
begin
Result := FOwner.ReadArraySingle(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadArrayDouble: TDataFrameArrayDouble;
begin
Result := FOwner.ReadArrayDouble(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadArrayInt64: TDataFrameArrayInt64;
begin
Result := FOwner.ReadArrayInt64(FIndex);
inc(FIndex);
end;
procedure TDataFrameEngineReader.ReadStream(output: TCoreClassStream);
begin
FOwner.ReadStream(FIndex, output);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadVariant: Variant;
begin
Result := FOwner.ReadVariant(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadInt64: Int64;
begin
Result := FOwner.ReadInt64(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadUInt64: UInt64;
begin
Result := FOwner.ReadUInt64(FIndex);
inc(FIndex);
end;
procedure TDataFrameEngineReader.ReadStrings(output: TCoreClassStrings);
begin
FOwner.ReadStrings(FIndex, output);
inc(FIndex);
end;
procedure TDataFrameEngineReader.ReadListStrings(output: TListString);
begin
FOwner.ReadListStrings(FIndex, output);
inc(FIndex);
end;
procedure TDataFrameEngineReader.ReadPascalStrings(output: TListPascalString);
begin
FOwner.ReadPascalStrings(FIndex, output);
inc(FIndex);
end;
procedure TDataFrameEngineReader.ReadDataFrame(output: TDataFrameEngine);
begin
FOwner.ReadDataFrame(FIndex, output);
inc(FIndex);
end;
procedure TDataFrameEngineReader.ReadHashStringList(output: THashStringList);
begin
FOwner.ReadHashStringList(FIndex, output);
inc(FIndex);
end;
procedure TDataFrameEngineReader.ReadVariantList(output: THashVariantList);
begin
FOwner.ReadVariantList(FIndex, output);
inc(FIndex);
end;
procedure TDataFrameEngineReader.ReadSectionText(output: TSectionTextData);
begin
FOwner.ReadSectionText(FIndex, output);
inc(FIndex);
end;
procedure TDataFrameEngineReader.ReadTextSection(output: TSectionTextData);
begin
ReadSectionText(output);
end;
{$IFNDEF FPC}
procedure TDataFrameEngineReader.ReadJson(output: TJsonObject);
begin
FOwner.ReadJson(FIndex, output);
inc(FIndex);
end;
{$ENDIF}
function TDataFrameEngineReader.ReadRect: TRect;
begin
Result := FOwner.ReadRect(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadRectf: TRectf;
begin
Result := FOwner.ReadRectf(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadPoint: TPoint;
begin
Result := FOwner.ReadPoint(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadPointf: TPointf;
begin
Result := FOwner.ReadPointf(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadVector: TVector;
begin
Result := FOwner.ReadVector(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadAffineVector: TAffineVector;
begin
Result := FOwner.ReadAffineVector(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadVec3: TVec3;
begin
Result := FOwner.ReadVec3(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadVec4: TVec4;
begin
Result := FOwner.ReadVec4(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadVector3: TVector3;
begin
Result := FOwner.ReadVector3(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadVector4: TVector4;
begin
Result := FOwner.ReadVector4(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadMat4: TMat4;
begin
Result := FOwner.ReadMat4(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadMatrix4: TMatrix4;
begin
Result := FOwner.ReadMatrix4(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.Read2DPoint: T2DPoint;
begin
Result := FOwner.Read2DPoint(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadVec2: TVec2;
begin
Result := FOwner.ReadVec2(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadRectV2: TRectV2;
begin
Result := FOwner.ReadRectV2(FIndex);
inc(FIndex);
end;
function TDataFrameEngineReader.ReadPointer: UInt64;
begin
Result := FOwner.ReadPointer(FIndex);
inc(FIndex);
end;
procedure TDataFrameEngineReader.Read(var aBuf; aCount: Int64);
begin
FOwner.Read(FIndex, aBuf, aCount);
inc(FIndex);
end;
function TDataFrameEngineReader.Read: TDataFrameBase;
begin
Result := FOwner.Read(FIndex);
inc(FIndex);
end;
function TDataFrameEngine.DataTypeToByte(v: TRunTimeDataType): Byte;
begin
Result := Byte(v);
end;
function TDataFrameEngine.ByteToDataType(v: Byte): TRunTimeDataType;
begin
Result := TRunTimeDataType(v);
end;
constructor TDataFrameEngine.Create;
begin
inherited Create;
FDataList := TCoreClassListForObj.Create;
FReader := TDataFrameEngineReader.Create(Self);
FCompressorDeflate := nil;
FCompressorBRRC := nil;
end;
destructor TDataFrameEngine.Destroy;
begin
Clear;
DisposeObject(FDataList);
DisposeObject(FReader);
if FCompressorDeflate <> nil then
DisposeObject(FCompressorDeflate);
if FCompressorBRRC <> nil then
DisposeObject(FCompressorBRRC);
inherited Destroy;
end;
procedure TDataFrameEngine.Clear;
var
i: Integer;
Obj: TDataFrameBase;
begin
for i := 0 to FDataList.Count - 1 do
begin
Obj := TDataFrameBase(FDataList[i]);
try
DisposeObject(Obj);
except
end;
end;
try
FDataList.Clear;
except
end;
FReader.index := 0;
end;
function TDataFrameEngine.AddData(v: TRunTimeDataType): TDataFrameBase;
begin
case v of
rdtString: Result := TDataFrameString.Create(DataTypeToByte(v));
rdtInteger: Result := TDataFrameInteger.Create(DataTypeToByte(v));
rdtCardinal: Result := TDataFrameCardinal.Create(DataTypeToByte(v));
rdtWORD: Result := TDataFrameWord.Create(DataTypeToByte(v));
rdtByte: Result := TDataFrameByte.Create(DataTypeToByte(v));
rdtSingle: Result := TDataFrameSingle.Create(DataTypeToByte(v));
rdtDouble: Result := TDataFrameDouble.Create(DataTypeToByte(v));
rdtArrayInteger: Result := TDataFrameArrayInteger.Create(DataTypeToByte(v));
rdtArrayShortInt: Result := TDataFrameArrayShortInt.Create(DataTypeToByte(v));
rdtArrayByte: Result := TDataFrameArrayByte.Create(DataTypeToByte(v));
rdtArraySingle: Result := TDataFrameArraySingle.Create(DataTypeToByte(v));
rdtArrayDouble: Result := TDataFrameArrayDouble.Create(DataTypeToByte(v));
rdtArrayInt64: Result := TDataFrameArrayInt64.Create(DataTypeToByte(v));
rdtStream: Result := TDataFrameStream.Create(DataTypeToByte(v));
rdtVariant: Result := TDataFrameVariant.Create(DataTypeToByte(v));
rdtInt64: Result := TDataFrameInt64.Create(DataTypeToByte(v));
rdtUInt64: Result := TDataFrameUInt64.Create(DataTypeToByte(v));
else
Result := nil;
end;
if Result <> nil then
FDataList.Add(Result);
end;
function TDataFrameEngine.GetData(index_: Integer): TDataFrameBase;
begin
if (index_ >= 0) and (index_ < FDataList.Count) then
Result := TDataFrameBase(FDataList[index_])
else
Result := nil;
end;
function TDataFrameEngine.GetDataInfo(Obj_: TDataFrameBase): SystemString;
begin
case ByteToDataType(Obj_.FID) of
rdtString:
Result := 'SystemString';
rdtInteger:
Result := 'Integer';
rdtCardinal:
Result := 'Cardinal';
rdtWORD:
Result := 'WORD';
rdtByte:
Result := 'Byte';
rdtSingle:
Result := 'Single';
rdtDouble:
Result := 'Double';
rdtArrayInteger:
Result := 'ArrayInteger';
rdtArrayShortInt:
Result := 'ShortInt';
rdtArrayByte:
Result := 'Byte';
rdtArraySingle:
Result := 'ArraySingle';
rdtArrayDouble:
Result := 'ArrayDouble';
rdtArrayInt64:
Result := 'ArrayInt64';
rdtStream:
Result := 'Stream';
rdtVariant:
Result := 'Variant';
rdtInt64:
Result := 'Int64';
rdtUInt64:
Result := 'UInt64';
else
Result := '';
end;
end;
function TDataFrameEngine.Count: Integer;
begin
Result := FDataList.Count;
end;
function TDataFrameEngine.Delete(index_: Integer): Boolean;
begin
try
DisposeObject(TDataFrameBase(FDataList[index_]));
FDataList.Delete(index_);
Result := True;
except
Result := False;
end;
end;
function TDataFrameEngine.DeleteFirst: Boolean;
begin
Result := Delete(0);
end;
function TDataFrameEngine.DeleteLast: Boolean;
begin
Result := Delete(Count - 1);
end;
function TDataFrameEngine.DeleteLastCount(cnt: Integer): Boolean;
begin
Result := True;
while cnt > 0 do
begin
Result := Result and DeleteLast;
dec(cnt);
end;
end;
function TDataFrameEngine.DeleteCount(index_, _Count: Integer): Boolean;
var
i: Integer;
begin
Result := True;
for i := 0 to _Count - 1 do
Result := Result and Delete(index_);
end;
procedure TDataFrameEngine.Assign(source: TDataFrameEngine);
var
s: TMemoryStream64;
i: Integer;
DataFrame_: TDataFrameBase;
begin
Clear;
s := TMemoryStream64.CustomCreate(8192);
for i := 0 to source.Count - 1 do
begin
DataFrame_ := AddData(ByteToDataType(source[i].FID));
s.Clear;
source[i].SaveToStream(s);
s.Position := 0;
DataFrame_.LoadFromStream(s);
s.Clear;
end;
DisposeObject(s);
end;
function TDataFrameEngine.Clone: TDataFrameEngine;
begin
Result := TDataFrameEngine.Create;
Result.Assign(Self);
end;
procedure TDataFrameEngine.WriteString(v: SystemString);
var
Obj_: TDataFrameString;
begin
Obj_ := TDataFrameString.Create(DataTypeToByte(rdtString));
Obj_.Buffer := umlBytesOf(v);
FDataList.Add(Obj_);
end;
procedure TDataFrameEngine.WriteString(v: TPascalString);
var
Obj_: TDataFrameString;
begin
Obj_ := TDataFrameString.Create(DataTypeToByte(rdtString));
Obj_.Buffer := v.Bytes;
FDataList.Add(Obj_);
end;
procedure TDataFrameEngine.WriteBytes(v: TBytes);
var
Obj_: TDataFrameString;
begin
Obj_ := TDataFrameString.Create(DataTypeToByte(rdtString));
SetLength(Obj_.Buffer, length(v));
if length(v) > 0 then
CopyPtr(@v[0], @Obj_.Buffer[0], length(v));
FDataList.Add(Obj_);
end;
procedure TDataFrameEngine.WriteInteger(v: Integer);
var
Obj_: TDataFrameInteger;
begin
Obj_ := TDataFrameInteger.Create(DataTypeToByte(rdtInteger));
Obj_.Buffer := v;
FDataList.Add(Obj_);
end;
procedure TDataFrameEngine.WriteCardinal(v: Cardinal);
var
Obj_: TDataFrameCardinal;
begin
Obj_ := TDataFrameCardinal.Create(DataTypeToByte(rdtCardinal));
Obj_.Buffer := v;
FDataList.Add(Obj_);
end;
procedure TDataFrameEngine.WriteWORD(v: Word);
var
Obj_: TDataFrameWord;
begin
Obj_ := TDataFrameWord.Create(DataTypeToByte(rdtWORD));
Obj_.Buffer := v;
FDataList.Add(Obj_);
end;
procedure TDataFrameEngine.WriteBool(v: Boolean);
begin
if v then
WriteByte(1)
else
WriteByte(0);
end;
procedure TDataFrameEngine.WriteBoolean(v: Boolean);
begin
WriteBool(v);
end;
procedure TDataFrameEngine.WriteByte(v: Byte);
var
Obj_: TDataFrameByte;
begin
Obj_ := TDataFrameByte.Create(DataTypeToByte(rdtByte));
Obj_.Buffer := v;
FDataList.Add(Obj_);
end;
procedure TDataFrameEngine.WriteSingle(v: Single);
var
Obj_: TDataFrameSingle;
begin
Obj_ := TDataFrameSingle.Create(DataTypeToByte(rdtSingle));
Obj_.Buffer := v;
FDataList.Add(Obj_);
end;
procedure TDataFrameEngine.WriteDouble(v: Double);
var
Obj_: TDataFrameDouble;
begin
Obj_ := TDataFrameDouble.Create(DataTypeToByte(rdtDouble));
Obj_.Buffer := v;
FDataList.Add(Obj_);
end;
function TDataFrameEngine.WriteArrayInteger: TDataFrameArrayInteger;
begin
Result := TDataFrameArrayInteger.Create(DataTypeToByte(rdtArrayInteger));
FDataList.Add(Result);
end;
function TDataFrameEngine.WriteArrayShortInt: TDataFrameArrayShortInt;
begin
Result := TDataFrameArrayShortInt.Create(DataTypeToByte(rdtArrayShortInt));
FDataList.Add(Result);
end;
function TDataFrameEngine.WriteArrayByte: TDataFrameArrayByte;
begin
Result := TDataFrameArrayByte.Create(DataTypeToByte(rdtArrayByte));
FDataList.Add(Result);
end;
procedure TDataFrameEngine.WriteMD5(md5: TMD5);
begin
WriteArrayByte.WriteArray(md5);
end;
function TDataFrameEngine.WriteArraySingle: TDataFrameArraySingle;
begin
Result := TDataFrameArraySingle.Create(DataTypeToByte(rdtArraySingle));
FDataList.Add(Result);
end;
function TDataFrameEngine.WriteArrayDouble: TDataFrameArrayDouble;
begin
Result := TDataFrameArrayDouble.Create(DataTypeToByte(rdtArrayDouble));
FDataList.Add(Result);
end;
function TDataFrameEngine.WriteArrayInt64: TDataFrameArrayInt64;
begin
Result := TDataFrameArrayInt64.Create(DataTypeToByte(rdtArrayInt64));
FDataList.Add(Result);
end;
procedure TDataFrameEngine.WriteStream(v: TCoreClassStream);
var
Obj_: TDataFrameStream;
begin
Obj_ := TDataFrameStream.Create(DataTypeToByte(rdtStream));
Obj_.Buffer := v;
FDataList.Add(Obj_);
end;
procedure TDataFrameEngine.WriteVariant(v: Variant);
var
Obj_: TDataFrameVariant;
begin
Obj_ := TDataFrameVariant.Create(DataTypeToByte(rdtVariant));
Obj_.Buffer := v;
FDataList.Add(Obj_);
end;
procedure TDataFrameEngine.WriteInt64(v: Int64);
var
Obj_: TDataFrameInt64;
begin
Obj_ := TDataFrameInt64.Create(DataTypeToByte(rdtInt64));
Obj_.Buffer := v;
FDataList.Add(Obj_);
end;
procedure TDataFrameEngine.WriteUInt64(v: UInt64);
var
Obj_: TDataFrameUInt64;
begin
Obj_ := TDataFrameUInt64.Create(DataTypeToByte(rdtUInt64));
Obj_.Buffer := v;
FDataList.Add(Obj_);
end;
procedure TDataFrameEngine.WriteStrings(v: TCoreClassStrings);
var
d: TMemoryStream64;
begin
d := TMemoryStream64.Create;
{$IFDEF FPC}
v.SaveToStream(d);
{$ELSE}
v.SaveToStream(d, TEncoding.UTF8);
{$ENDIF}
d.Position := 0;
WriteStream(d);
DisposeObject(d);
end;
procedure TDataFrameEngine.WriteListStrings(v: TListString);
var
d: TMemoryStream64;
begin
d := TMemoryStream64.Create;
v.SaveToStream(d);
d.Position := 0;
WriteStream(d);
DisposeObject(d);
end;
procedure TDataFrameEngine.WritePascalStrings(v: TListPascalString);
var
d: TMemoryStream64;
begin
d := TMemoryStream64.Create;
v.SaveToStream(d);
d.Position := 0;
WriteStream(d);
DisposeObject(d);
end;
procedure TDataFrameEngine.WriteDataFrame(v: TDataFrameEngine);
var
Obj_: TDataFrameStream;
begin
Obj_ := TDataFrameStream.Create(DataTypeToByte(rdtStream));
v.EncodeTo(Obj_.Buffer, True);
FDataList.Add(Obj_);
end;
procedure TDataFrameEngine.WriteDataFrameCompressed(v: TDataFrameEngine);
var
Obj_: TDataFrameStream;
begin
Obj_ := TDataFrameStream.Create(DataTypeToByte(rdtStream));
v.EncodeAsZLib(Obj_.Buffer, True);
FDataList.Add(Obj_);
end;
procedure TDataFrameEngine.WriteHashStringList(v: THashStringList);
var
ms: TMemoryStream64;
h: THashStringTextStream;
begin
ms := TMemoryStream64.Create;
h := THashStringTextStream.Create(v);
h.SaveToStream(ms);
DisposeObject(h);
ms.Position := 0;
WriteStream(ms);
DisposeObject(ms);
end;
procedure TDataFrameEngine.WriteVariantList(v: THashVariantList);
var
ms: TMemoryStream64;
h: THashVariantTextStream;
begin
ms := TMemoryStream64.Create;
h := THashVariantTextStream.Create(v);
h.SaveToStream(ms);
DisposeObject(h);
ms.Position := 0;
WriteStream(ms);
DisposeObject(ms);
end;
procedure TDataFrameEngine.WriteSectionText(v: TSectionTextData);
var
ms: TMemoryStream64;
begin
ms := TMemoryStream64.Create;
v.SaveToStream(ms);
ms.Position := 0;
WriteStream(ms);
DisposeObject(ms);
end;
procedure TDataFrameEngine.WriteTextSection(v: TSectionTextData);
begin
WriteSectionText(v);
end;
{$IFNDEF FPC}
procedure TDataFrameEngine.WriteJson(v: TJsonObject);
var
ms: TMemoryStream64;
begin
ms := TMemoryStream64.Create;
v.SaveToStream(ms, False, TEncoding.UTF8, True);
ms.Position := 0;
WriteStream(ms);
DisposeObject(ms);
end;
{$ENDIF}
procedure TDataFrameEngine.WriteFile(fn: SystemString);
var
fs: TCoreClassFileStream;
begin
if umlFileExists(fn) then
begin
fs := TCoreClassFileStream.Create(fn, fmOpenRead or fmShareDenyNone);
fs.Position := 0;
WriteStream(fs);
DisposeObject(fs);
end;
end;
procedure TDataFrameEngine.WriteRect(v: TRect);
begin
with WriteArrayInteger do
begin
Add(v.Left);
Add(v.Top);
Add(v.Right);
Add(v.Bottom);
end;
end;
procedure TDataFrameEngine.WriteRectf(v: TRectf);
begin
with WriteArraySingle do
begin
Add(v.Left);
Add(v.Top);
Add(v.Right);
Add(v.Bottom);
end;
end;
procedure TDataFrameEngine.WritePoint(v: TPoint);
begin
with WriteArrayInteger do
begin
Add(v.x);
Add(v.y);
end;
end;
procedure TDataFrameEngine.WritePointf(v: TPointf);
begin
with WriteArraySingle do
begin
Add(v.x);
Add(v.y);
end;
end;
procedure TDataFrameEngine.WriteVector(v: TVector);
begin
WriteArraySingle.WriteArray(v);
end;
procedure TDataFrameEngine.WriteAffineVector(v: TAffineVector);
begin
WriteArraySingle.WriteArray(v);
end;
procedure TDataFrameEngine.WriteVec4(v: TVec4);
begin
WriteArraySingle.WriteArray(v);
end;
procedure TDataFrameEngine.WriteVec3(v: TVec3);
begin
WriteArraySingle.WriteArray(v);
end;
procedure TDataFrameEngine.WriteVector4(v: TVector4);
begin
WriteArraySingle.WriteArray(v.buff);
end;
procedure TDataFrameEngine.WriteVector3(v: TVector3);
begin
WriteArraySingle.WriteArray(v.buff);
end;
procedure TDataFrameEngine.WriteMat4(v: TMat4);
begin
with WriteArraySingle do
begin
WriteArray(v[0]);
WriteArray(v[1]);
WriteArray(v[2]);
WriteArray(v[3]);
end;
end;
procedure TDataFrameEngine.WriteMatrix4(v: TMatrix4);
begin
WriteMat4(v.buff);
end;
procedure TDataFrameEngine.Write2DPoint(v: T2DPoint);
begin
with WriteArraySingle do
WriteArray(v);
end;
procedure TDataFrameEngine.WriteVec2(v: TVec2);
begin
Write2DPoint(v);
end;
procedure TDataFrameEngine.WriteRectV2(v: TRectV2);
begin
with WriteArraySingle do
begin
WriteArray(v[0]);
WriteArray(v[1]);
end;
end;
procedure TDataFrameEngine.WritePointer(v: Pointer);
begin
WriteUInt64(UInt64(v));
end;
procedure TDataFrameEngine.WritePointer(v: UInt64);
begin
WriteUInt64(v);
end;
// append new stream and write
procedure TDataFrameEngine.write(const aBuf; aCount: Int64);
var
s: TMemoryStream64;
begin
s := TMemoryStream64.Create;
s.Write64(aBuf, aCount);
WriteStream(s);
DisposeObject(s);
end;
function TDataFrameEngine.ReadString(index_: Integer): SystemString;
var
Obj_: TDataFrameBase;
i: Integer;
begin
Obj_ := Data[index_];
if Obj_ is TDataFrameString then
Result := umlStringOf(TDataFrameString(Obj_).Buffer).Text
else if Obj_ is TDataFrameInteger then
Result := IntToStr(TDataFrameInteger(Obj_).Buffer)
else if Obj_ is TDataFrameCardinal then
Result := IntToStr(TDataFrameCardinal(Obj_).Buffer)
else if Obj_ is TDataFrameWord then
Result := IntToStr(TDataFrameWord(Obj_).Buffer)
else if Obj_ is TDataFrameByte then
Result := IntToStr(TDataFrameByte(Obj_).Buffer)
else if Obj_ is TDataFrameSingle then
Result := FloatToStr(TDataFrameSingle(Obj_).Buffer)
else if Obj_ is TDataFrameDouble then
Result := FloatToStr(TDataFrameDouble(Obj_).Buffer)
else if Obj_ is TDataFrameArrayInteger then
begin
Result := '(';
with TDataFrameArrayInteger(Obj_) do
begin
for i := 0 to Count - 1 do
if Result <> '(' then
Result := Result + ',' + IntToStr(Buffer[i])
else
Result := Result + IntToStr(Buffer[i]);
end;
Result := Result + ')';
end
else if Obj_ is TDataFrameArrayShortInt then
begin
Result := '(';
with TDataFrameArrayShortInt(Obj_) do
begin
for i := 0 to Count - 1 do
if Result <> '(' then
Result := Result + ',' + IntToStr(Buffer[i])
else
Result := Result + IntToStr(Buffer[i]);
end;
Result := Result + ')';
end
else if Obj_ is TDataFrameArrayByte then
begin
Result := '(';
with TDataFrameArrayByte(Obj_) do
begin
for i := 0 to Count - 1 do
if Result <> '(' then
Result := Result + ',' + IntToStr(Buffer[i])
else
Result := Result + IntToStr(Buffer[i]);
end;
Result := Result + ')';
end
else if Obj_ is TDataFrameArraySingle then
begin
Result := '(';
with TDataFrameArraySingle(Obj_) do
begin
for i := 0 to Count - 1 do
if Result <> '(' then
Result := Result + ',' + FloatToStr(Buffer[i])
else
Result := Result + FloatToStr(Buffer[i]);
end;
Result := Result + ')';
end
else if Obj_ is TDataFrameArrayDouble then
begin
Result := '(';
with TDataFrameArrayDouble(Obj_) do
begin
for i := 0 to Count - 1 do
if Result <> '(' then
Result := Result + ',' + FloatToStr(Buffer[i])
else
Result := Result + FloatToStr(Buffer[i]);
end;
Result := Result + ')';
end
else if Obj_ is TDataFrameArrayInt64 then
begin
Result := '(';
with TDataFrameArrayInt64(Obj_) do
begin
for i := 0 to Count - 1 do
if Result <> '(' then
Result := Result + ',' + IntToStr(Buffer[i])
else
Result := Result + IntToStr(Buffer[i]);
end;
Result := Result + ')';
end
else if Obj_ is TDataFrameVariant then
Result := umlVarToStr(TDataFrameVariant(Obj_).Buffer)
else if Obj_ is TDataFrameInt64 then
Result := IntToStr(TDataFrameInt64(Obj_).Buffer)
else if Obj_ is TDataFrameUInt64 then
{$IFDEF FPC}
Result := IntToStr(TDataFrameUInt64(Obj_).Buffer)
{$ELSE}
Result := UIntToStr(TDataFrameUInt64(Obj_).Buffer)
{$ENDIF}
else
Result := '';
end;
function TDataFrameEngine.ReadBytes(index_: Integer): TBytes;
var
Obj_: TDataFrameBase;
i: Integer;
begin
Obj_ := Data[index_];
if Obj_ is TDataFrameString then
begin
SetLength(Result, length(TDataFrameString(Obj_).Buffer));
if length(Result) > 0 then
CopyPtr(@TDataFrameString(Obj_).Buffer[0], @Result[0], length(Result));
end
else if Obj_ is TDataFrameArrayByte then
begin
SetLength(Result, TDataFrameArrayByte(Obj_).Count);
for i := 0 to TDataFrameArrayByte(Obj_).Count - 1 do
Result[i] := TDataFrameArrayByte(Obj_).Buffer[i];
end
else
SetLength(Result, 0);
end;
function TDataFrameEngine.ReadInteger(index_: Integer): Integer;
var
Obj_: TDataFrameBase;
begin
Obj_ := Data[index_];
if Obj_ is TDataFrameInteger then
Result := TDataFrameInteger(Obj_).Buffer
else if Obj_ is TDataFrameString then
Result := umlStrToInt(umlStringOf(TDataFrameString(Obj_).Buffer), 0)
else if Obj_ is TDataFrameCardinal then
Result := TDataFrameCardinal(Obj_).Buffer
else if Obj_ is TDataFrameWord then
Result := TDataFrameWord(Obj_).Buffer
else if Obj_ is TDataFrameByte then
Result := TDataFrameByte(Obj_).Buffer
else if Obj_ is TDataFrameSingle then
Result := Trunc(TDataFrameSingle(Obj_).Buffer)
else if Obj_ is TDataFrameDouble then
Result := Trunc(TDataFrameDouble(Obj_).Buffer)
else if Obj_ is TDataFrameVariant then
Result := (TDataFrameVariant(Obj_).Buffer)
else if Obj_ is TDataFrameInt64 then
Result := (TDataFrameInt64(Obj_).Buffer)
else if Obj_ is TDataFrameUInt64 then
Result := (TDataFrameUInt64(Obj_).Buffer)
else
Result := 0;
end;
function TDataFrameEngine.ReadCardinal(index_: Integer): Cardinal;
var
Obj_: TDataFrameBase;
begin
Obj_ := Data[index_];
if Obj_ is TDataFrameCardinal then
Result := TDataFrameCardinal(Obj_).Buffer
else if Obj_ is TDataFrameString then
Result := umlStrToInt(umlStringOf(TDataFrameString(Obj_).Buffer), 0)
else if Obj_ is TDataFrameInteger then
Result := TDataFrameInteger(Obj_).Buffer
else if Obj_ is TDataFrameWord then
Result := TDataFrameWord(Obj_).Buffer
else if Obj_ is TDataFrameByte then
Result := TDataFrameByte(Obj_).Buffer
else if Obj_ is TDataFrameSingle then
Result := Trunc(TDataFrameSingle(Obj_).Buffer)
else if Obj_ is TDataFrameDouble then
Result := Trunc(TDataFrameDouble(Obj_).Buffer)
else if Obj_ is TDataFrameVariant then
Result := (TDataFrameVariant(Obj_).Buffer)
else if Obj_ is TDataFrameInt64 then
Result := (TDataFrameInt64(Obj_).Buffer)
else if Obj_ is TDataFrameUInt64 then
Result := (TDataFrameUInt64(Obj_).Buffer)
else
Result := 0;
end;
function TDataFrameEngine.ReadWord(index_: Integer): Word;
var
Obj_: TDataFrameBase;
begin
Obj_ := Data[index_];
if Obj_ is TDataFrameWord then
Result := TDataFrameWord(Obj_).Buffer
else if Obj_ is TDataFrameString then
Result := umlStrToInt(umlStringOf(TDataFrameString(Obj_).Buffer), 0)
else if Obj_ is TDataFrameInteger then
Result := TDataFrameInteger(Obj_).Buffer
else if Obj_ is TDataFrameCardinal then
Result := TDataFrameCardinal(Obj_).Buffer
else if Obj_ is TDataFrameByte then
Result := TDataFrameByte(Obj_).Buffer
else if Obj_ is TDataFrameSingle then
Result := Trunc(TDataFrameSingle(Obj_).Buffer)
else if Obj_ is TDataFrameDouble then
Result := Trunc(TDataFrameDouble(Obj_).Buffer)
else if Obj_ is TDataFrameVariant then
Result := (TDataFrameVariant(Obj_).Buffer)
else if Obj_ is TDataFrameInt64 then
Result := (TDataFrameInt64(Obj_).Buffer)
else if Obj_ is TDataFrameUInt64 then
Result := (TDataFrameUInt64(Obj_).Buffer)
else
Result := 0;
end;
function TDataFrameEngine.ReadBool(index_: Integer): Boolean;
begin
Result := ReadByte(index_) = 1;
end;
function TDataFrameEngine.ReadBoolean(index_: Integer): Boolean;
begin
Result := ReadBool(index_);
end;
function TDataFrameEngine.ReadByte(index_: Integer): Byte;
var
Obj_: TDataFrameBase;
begin
Obj_ := Data[index_];
if Obj_ is TDataFrameByte then
Result := TDataFrameByte(Obj_).Buffer
else if Obj_ is TDataFrameString then
Result := umlStrToInt(umlStringOf(TDataFrameString(Obj_).Buffer), 0)
else if Obj_ is TDataFrameInteger then
Result := TDataFrameInteger(Obj_).Buffer
else if Obj_ is TDataFrameCardinal then
Result := TDataFrameCardinal(Obj_).Buffer
else if Obj_ is TDataFrameWord then
Result := TDataFrameWord(Obj_).Buffer
else if Obj_ is TDataFrameSingle then
Result := Trunc(TDataFrameSingle(Obj_).Buffer)
else if Obj_ is TDataFrameDouble then
Result := Trunc(TDataFrameDouble(Obj_).Buffer)
else if Obj_ is TDataFrameVariant then
Result := (TDataFrameVariant(Obj_).Buffer)
else if Obj_ is TDataFrameInt64 then
Result := (TDataFrameInt64(Obj_).Buffer)
else if Obj_ is TDataFrameUInt64 then
Result := (TDataFrameUInt64(Obj_).Buffer)
else
Result := 0;
end;
function TDataFrameEngine.ReadSingle(index_: Integer): Single;
var
Obj_: TDataFrameBase;
begin
Obj_ := Data[index_];
if Obj_ is TDataFrameSingle then
Result := TDataFrameSingle(Obj_).Buffer
else if Obj_ is TDataFrameString then
Result := umlStrToFloat(umlStringOf(TDataFrameString(Obj_).Buffer), 0)
else if Obj_ is TDataFrameInteger then
Result := TDataFrameInteger(Obj_).Buffer
else if Obj_ is TDataFrameCardinal then
Result := TDataFrameCardinal(Obj_).Buffer
else if Obj_ is TDataFrameWord then
Result := TDataFrameWord(Obj_).Buffer
else if Obj_ is TDataFrameByte then
Result := TDataFrameByte(Obj_).Buffer
else if Obj_ is TDataFrameDouble then
Result := TDataFrameDouble(Obj_).Buffer
else if Obj_ is TDataFrameVariant then
Result := (TDataFrameVariant(Obj_).Buffer)
else if Obj_ is TDataFrameInt64 then
Result := (TDataFrameInt64(Obj_).Buffer)
else if Obj_ is TDataFrameUInt64 then
Result := (TDataFrameUInt64(Obj_).Buffer)
else
Result := 0;
end;
function TDataFrameEngine.ReadDouble(index_: Integer): Double;
var
Obj_: TDataFrameBase;
begin
Obj_ := Data[index_];
if Obj_ is TDataFrameDouble then
Result := TDataFrameDouble(Obj_).Buffer
else if Obj_ is TDataFrameString then
Result := umlStrToFloat(umlStringOf(TDataFrameString(Obj_).Buffer), 0)
else if Obj_ is TDataFrameInteger then
Result := TDataFrameInteger(Obj_).Buffer
else if Obj_ is TDataFrameCardinal then
Result := TDataFrameCardinal(Obj_).Buffer
else if Obj_ is TDataFrameWord then
Result := TDataFrameWord(Obj_).Buffer
else if Obj_ is TDataFrameByte then
Result := TDataFrameByte(Obj_).Buffer
else if Obj_ is TDataFrameSingle then
Result := TDataFrameSingle(Obj_).Buffer
else if Obj_ is TDataFrameVariant then
Result := (TDataFrameVariant(Obj_).Buffer)
else if Obj_ is TDataFrameInt64 then
Result := (TDataFrameInt64(Obj_).Buffer)
else if Obj_ is TDataFrameUInt64 then
Result := (TDataFrameUInt64(Obj_).Buffer)
else
Result := 0;
end;
function TDataFrameEngine.ReadArrayInteger(index_: Integer): TDataFrameArrayInteger;
var
Obj_: TDataFrameBase;
begin
Obj_ := Data[index_];
if Obj_ is TDataFrameArrayInteger then
Result := TDataFrameArrayInteger(Obj_)
else
Result := nil;
end;
function TDataFrameEngine.ReadArrayShortInt(index_: Integer): TDataFrameArrayShortInt;
var
Obj_: TDataFrameBase;
begin
Obj_ := Data[index_];
if Obj_ is TDataFrameArrayShortInt then
Result := TDataFrameArrayShortInt(Obj_)
else
Result := nil;
end;
function TDataFrameEngine.ReadArrayByte(index_: Integer): TDataFrameArrayByte;
var
Obj_: TDataFrameBase;
begin
Obj_ := Data[index_];
if Obj_ is TDataFrameArrayByte then
Result := TDataFrameArrayByte(Obj_)
else
Result := nil;
end;
function TDataFrameEngine.ReadMD5(index_: Integer): TMD5;
var
i: Integer;
begin
with ReadArrayByte(index_) do
for i := low(TMD5) to high(TMD5) do
Result[i] := Buffer[i];
end;
function TDataFrameEngine.ReadArraySingle(index_: Integer): TDataFrameArraySingle;
var
Obj_: TDataFrameBase;
begin
Obj_ := Data[index_];
if Obj_ is TDataFrameArraySingle then
Result := TDataFrameArraySingle(Obj_)
else
Result := nil;
end;
function TDataFrameEngine.ReadArrayDouble(index_: Integer): TDataFrameArrayDouble;
var
Obj_: TDataFrameBase;
begin
Obj_ := Data[index_];
if Obj_ is TDataFrameArrayDouble then
Result := TDataFrameArrayDouble(Obj_)
else
Result := nil;
end;
function TDataFrameEngine.ReadArrayInt64(index_: Integer): TDataFrameArrayInt64;
var
Obj_: TDataFrameBase;
begin
Obj_ := Data[index_];
if Obj_ is TDataFrameArrayInt64 then
Result := TDataFrameArrayInt64(Obj_)
else
Result := nil;
end;
procedure TDataFrameEngine.ReadStream(index_: Integer; output: TCoreClassStream);
var
Obj_: TDataFrameBase;
LNeedResetPos: Boolean;
begin
Obj_ := Data[index_];
LNeedResetPos := output.Size = 0;
if Obj_ is TDataFrameStream then
begin
with TDataFrameStream(Obj_) do
begin
Buffer.Position := 0;
output.CopyFrom(Buffer, Buffer.Size);
Buffer.Position := 0;
end;
end
else if output is TMemoryStream64 then
Obj_.SaveToStream(TMemoryStream64(output))
else
RaiseInfo('no support');
if LNeedResetPos then
output.Position := 0;
end;
function TDataFrameEngine.ReadVariant(index_: Integer): Variant;
var
Obj_: TDataFrameBase;
begin
Obj_ := Data[index_];
if Obj_ is TDataFrameVariant then
Result := TDataFrameVariant(Obj_).Buffer
else if Obj_ is TDataFrameString then
Result := TDataFrameString(Obj_).Buffer
else if Obj_ is TDataFrameInteger then
Result := TDataFrameInteger(Obj_).Buffer
else if Obj_ is TDataFrameCardinal then
Result := TDataFrameCardinal(Obj_).Buffer
else if Obj_ is TDataFrameWord then
Result := TDataFrameWord(Obj_).Buffer
else if Obj_ is TDataFrameByte then
Result := TDataFrameByte(Obj_).Buffer
else if Obj_ is TDataFrameSingle then
Result := TDataFrameSingle(Obj_).Buffer
else if Obj_ is TDataFrameDouble then
Result := TDataFrameDouble(Obj_).Buffer
else if Obj_ is TDataFrameInt64 then
Result := (TDataFrameInt64(Obj_).Buffer)
else
Result := 0;
end;
function TDataFrameEngine.ReadInt64(index_: Integer): Int64;
var
Obj_: TDataFrameBase;
begin
Obj_ := Data[index_];
if Obj_ is TDataFrameInt64 then
Result := TDataFrameInt64(Obj_).Buffer
else if Obj_ is TDataFrameUInt64 then
Result := TDataFrameUInt64(Obj_).Buffer
else if Obj_ is TDataFrameInteger then
Result := TDataFrameInteger(Obj_).Buffer
else if Obj_ is TDataFrameCardinal then
Result := TDataFrameCardinal(Obj_).Buffer
else if Obj_ is TDataFrameWord then
Result := TDataFrameWord(Obj_).Buffer
else if Obj_ is TDataFrameByte then
Result := TDataFrameByte(Obj_).Buffer
else if Obj_ is TDataFrameSingle then
Result := Trunc(TDataFrameSingle(Obj_).Buffer)
else if Obj_ is TDataFrameDouble then
Result := Trunc(TDataFrameDouble(Obj_).Buffer)
else if Obj_ is TDataFrameVariant then
Result := TDataFrameVariant(Obj_).Buffer
else
Result := 0;
end;
function TDataFrameEngine.ReadUInt64(index_: Integer): UInt64;
var
Obj_: TDataFrameBase;
begin
Obj_ := Data[index_];
if Obj_ is TDataFrameUInt64 then
Result := TDataFrameUInt64(Obj_).Buffer
else if Obj_ is TDataFrameInt64 then
Result := TDataFrameInt64(Obj_).Buffer
else if Obj_ is TDataFrameInteger then
Result := TDataFrameInteger(Obj_).Buffer
else if Obj_ is TDataFrameCardinal then
Result := TDataFrameCardinal(Obj_).Buffer
else if Obj_ is TDataFrameWord then
Result := TDataFrameWord(Obj_).Buffer
else if Obj_ is TDataFrameByte then
Result := TDataFrameByte(Obj_).Buffer
else if Obj_ is TDataFrameSingle then
Result := Trunc(TDataFrameSingle(Obj_).Buffer)
else if Obj_ is TDataFrameDouble then
Result := Trunc(TDataFrameDouble(Obj_).Buffer)
else if Obj_ is TDataFrameVariant then
Result := TDataFrameVariant(Obj_).Buffer
else
Result := 0;
end;
procedure TDataFrameEngine.ReadStrings(index_: Integer; output: TCoreClassStrings);
var
d: TMemoryStream64;
begin
d := TMemoryStream64.Create;
ReadStream(index_, d);
d.Position := 0;
{$IFDEF FPC}
output.LoadFromStream(d);
{$ELSE}
output.LoadFromStream(d, TEncoding.UTF8);
{$ENDIF}
DisposeObject(d);
end;
procedure TDataFrameEngine.ReadListStrings(index_: Integer; output: TListString);
var
d: TMemoryStream64;
begin
d := TMemoryStream64.Create;
ReadStream(index_, d);
d.Position := 0;
output.LoadFromStream(d);
DisposeObject(d);
end;
procedure TDataFrameEngine.ReadPascalStrings(index_: Integer; output: TListPascalString);
var
d: TMemoryStream64;
begin
d := TMemoryStream64.Create;
ReadStream(index_, d);
d.Position := 0;
output.LoadFromStream(d);
DisposeObject(d);
end;
procedure TDataFrameEngine.ReadDataFrame(index_: Integer; output: TDataFrameEngine);
var
Obj_: TDataFrameBase;
d: TMemoryStream64;
begin
Obj_ := Data[index_];
if Obj_ is TDataFrameStream then
begin
TDataFrameStream(Obj_).Buffer.Position := 0;
output.DecodeFrom(TDataFrameStream(Obj_).Buffer, True);
TDataFrameStream(Obj_).Buffer.Position := 0;
end
else
begin
d := TMemoryStream64.Create;
ReadStream(index_, d);
d.Position := 0;
output.DecodeFrom(d, True);
DisposeObject(d);
end;
end;
procedure TDataFrameEngine.ReadHashStringList(index_: Integer; output: THashStringList);
var
d: TMemoryStream64;
h: THashStringTextStream;
begin
d := TMemoryStream64.Create;
ReadStream(index_, d);
d.Position := 0;
h := THashStringTextStream.Create(output);
h.LoadFromStream(d);
DisposeObject(h);
DisposeObject(d);
end;
procedure TDataFrameEngine.ReadVariantList(index_: Integer; output: THashVariantList);
var
d: TMemoryStream64;
h: THashVariantTextStream;
begin
d := TMemoryStream64.Create;
ReadStream(index_, d);
d.Position := 0;
h := THashVariantTextStream.Create(output);
h.LoadFromStream(d);
DisposeObject(h);
DisposeObject(d);
end;
procedure TDataFrameEngine.ReadSectionText(index_: Integer; output: TSectionTextData);
var
d: TMemoryStream64;
begin
d := TMemoryStream64.Create;
ReadStream(index_, d);
d.Position := 0;
output.LoadFromStream(d);
DisposeObject(d);
end;
procedure TDataFrameEngine.ReadTextSection(index_: Integer; output: TSectionTextData);
begin
ReadSectionText(index_, output);
end;
{$IFNDEF FPC}
procedure TDataFrameEngine.ReadJson(index_: Integer; output: TJsonObject);
var
d: TMemoryStream64;
begin
d := TMemoryStream64.Create;
ReadStream(index_, d);
d.Position := 0;
output.LoadFromStream(d, TEncoding.UTF8, False);
DisposeObject(d);
end;
{$ENDIF}
function TDataFrameEngine.ReadRect(index_: Integer): TRect;
begin
with ReadArrayInteger(index_) do
begin
Result := Rect(Buffer[0], Buffer[1], Buffer[2], Buffer[3]);
end;
end;
function TDataFrameEngine.ReadRectf(index_: Integer): TRectf;
begin
with ReadArraySingle(index_) do
begin
Result := Rectf(Buffer[0], Buffer[1], Buffer[2], Buffer[3]);
end;
end;
function TDataFrameEngine.ReadPoint(index_: Integer): TPoint;
begin
with ReadArrayInteger(index_) do
begin
Result := Point(Buffer[0], Buffer[1]);
end;
end;
function TDataFrameEngine.ReadPointf(index_: Integer): TPointf;
begin
with ReadArraySingle(index_) do
begin
Result := Pointf(Buffer[0], Buffer[1]);
end;
end;
function TDataFrameEngine.ReadVector(index_: Integer): TVector;
begin
with ReadArraySingle(index_) do
begin
Result[0] := Buffer[0];
Result[1] := Buffer[1];
Result[2] := Buffer[2];
Result[3] := Buffer[3];
end;
end;
function TDataFrameEngine.ReadAffineVector(index_: Integer): TAffineVector;
begin
with ReadArraySingle(index_) do
begin
Result[0] := Buffer[0];
Result[1] := Buffer[1];
Result[2] := Buffer[2];
end;
end;
function TDataFrameEngine.ReadVec3(index_: Integer): TVec3;
begin
with ReadArraySingle(index_) do
begin
Result[0] := Buffer[0];
Result[1] := Buffer[1];
Result[2] := Buffer[2];
end;
end;
function TDataFrameEngine.ReadVec4(index_: Integer): TVec4;
begin
with ReadArraySingle(index_) do
begin
Result[0] := Buffer[0];
Result[1] := Buffer[1];
Result[2] := Buffer[2];
Result[3] := Buffer[3];
end;
end;
function TDataFrameEngine.ReadVector3(index_: Integer): TVector3;
begin
with ReadArraySingle(index_) do
begin
Result := Vector3(Buffer[0], Buffer[1], Buffer[2]);
end;
end;
function TDataFrameEngine.ReadVector4(index_: Integer): TVector4;
begin
with ReadArraySingle(index_) do
begin
Result := Vector4(Buffer[0], Buffer[1], Buffer[2], Buffer[3]);
end;
end;
function TDataFrameEngine.ReadMat4(index_: Integer): TMat4;
var
i, j: Integer;
begin
with ReadArraySingle(index_) do
begin
for i := 0 to 3 do
for j := 0 to 3 do
Result[i][j] := Buffer[i * 4 + j];
end;
end;
function TDataFrameEngine.ReadMatrix4(index_: Integer): TMatrix4;
begin
Result.buff := ReadMat4(index_);
end;
function TDataFrameEngine.Read2DPoint(index_: Integer): T2DPoint;
begin
with ReadArraySingle(index_) do
begin
Result[0] := Buffer[0];
Result[1] := Buffer[1];
end;
end;
function TDataFrameEngine.ReadVec2(index_: Integer): TVec2;
begin
Result := Read2DPoint(index_);
end;
function TDataFrameEngine.ReadRectV2(index_: Integer): TRectV2;
begin
with ReadArraySingle(index_) do
begin
Result[0][0] := Buffer[0];
Result[0][1] := Buffer[1];
Result[1][0] := Buffer[2];
Result[1][1] := Buffer[3];
end;
end;
function TDataFrameEngine.ReadPointer(index_: Integer): UInt64;
begin
Result := ReadUInt64(index_);
end;
procedure TDataFrameEngine.Read(index_: Integer; var aBuf; aCount: Int64);
var
s: TMemoryStream64;
begin
s := TMemoryStream64.Create;
ReadStream(index_, s);
s.Read64(aBuf, aCount);
DisposeObject(s);
end;
function TDataFrameEngine.Read(index_: Integer): TDataFrameBase;
begin
Result := Data[index_];
end;
function TDataFrameEngine.ComputeEncodeSize: Int64;
var
i: Integer;
begin
Result := C_Integer_Size;
for i := 0 to Count - 1 do
Result := Result + C_Byte_Size + GetData(i).ComputeEncodeSize;
end;
class procedure TDataFrameEngine.BuildEmptyStream(output: TCoreClassStream);
var
editionToken: Byte;
sizeInfo: Cardinal;
compToken: Byte;
md5: TMD5;
cnt: Integer;
begin
// make header
editionToken := $FF;
sizeInfo := C_Integer_Size;
compToken := 0;
md5 := NullMD5;
cnt := 0;
output.write(editionToken, C_Byte_Size);
output.write(sizeInfo, C_Cardinal_Size);
output.write(compToken, C_Byte_Size);
output.write(md5[0], C_MD5_Size);
output.write(cnt, C_Integer_Size);
end;
function TDataFrameEngine.EncodeTo(output: TCoreClassStream; const FastMode: Boolean): Integer;
var
i: Integer;
DataFrame_: TDataFrameBase;
StoreStream, nStream: TMemoryStream64;
ID: Byte;
editionToken: Byte;
sizeInfo32: Cardinal;
sizeInfo64: Int64;
compToken: Byte;
md5: TMD5;
begin
Result := Count;
if Result = 0 then
begin
BuildEmptyStream(output);
Exit;
end;
// if encode size too large(>1M), we use EncodeAsSelectCompressor
if ComputeEncodeSize > 1024 * 1024 then
begin
Result := EncodeAsSelectCompressor(TSelectCompressionMethod.scmZLIB, output, FastMode);
Exit;
end;
StoreStream := TMemoryStream64.CustomCreate(8192);
// make body
StoreStream.Write64(Result, C_Integer_Size);
nStream := TMemoryStream64.Create;
for i := 0 to Count - 1 do
begin
DataFrame_ := GetData(i);
ID := DataFrame_.FID;
DataFrame_.SaveToStream(nStream);
StoreStream.Write64(ID, C_Byte_Size);
nStream.Position := 0;
StoreStream.CopyFrom(nStream, nStream.Size);
nStream.Clear;
end;
// make header
sizeInfo32 := Cardinal(StoreStream.Size);
sizeInfo64 := StoreStream.Size;
if sizeInfo64 > C_Max_UInt32 then
editionToken := $FA
else
editionToken := $FF;
compToken := 0;
StoreStream.Position := 0;
if FastMode then
md5 := NullMD5
else
md5 := umlMD5(StoreStream.Memory, StoreStream.Size);
// prepare write header
nStream.Clear;
nStream.write(editionToken, C_Byte_Size);
if sizeInfo64 > C_Max_UInt32 then
nStream.write(sizeInfo64, C_Int64_Size)
else
nStream.write(sizeInfo32, C_Cardinal_Size);
nStream.write(compToken, C_Byte_Size);
nStream.write(md5[0], C_MD5_Size);
// write header
nStream.Position := 0;
output.CopyFrom(nStream, nStream.Size);
DisposeObject(nStream);
// write body
StoreStream.Position := 0;
output.CopyFrom(StoreStream, StoreStream.Size);
DisposeObject(StoreStream);
end;
function TDataFrameEngine.EncodeTo(output: TCoreClassStream): Integer;
begin
Result := EncodeTo(output, False);
end;
procedure TDataFrameEngine.Encrypt(output: TCoreClassStream; Compressed_: Boolean; SecurityLevel: Integer; Key: TCipherKeyBuffer);
var
m64: TMemoryStream64;
begin
m64 := TMemoryStream64.Create;
if Compressed_ then
EncodeAsSelectCompressor(m64, True)
else
EncodeTo(m64, True);
QuantumEncrypt(m64, output, SecurityLevel, Key);
DisposeObject(m64);
end;
function TDataFrameEngine.Decrypt(input: TCoreClassStream; Key: TCipherKeyBuffer): Boolean;
var
m64: TMemoryStream64;
begin
m64 := TMemoryStream64.Create;
Result := QuantumDecrypt(input, m64, Key);
if Result then
begin
m64.Position := 0;
DecodeFrom(m64, True);
end;
DisposeObject(m64);
end;
{$IFNDEF FPC}
procedure TDataFrameEngine.EncodeAsPublicJson(var output: TPascalString);
var
m64: TMemoryStream64;
buff: TBytes;
begin
m64 := TMemoryStream64.Create;
EncodeAsPublicJson(m64);
SetLength(buff, m64.Size);
CopyPtr(m64.Memory, @buff[0], m64.Size);
DisposeObject(m64);
output.Bytes := buff;
SetLength(buff, 0);
end;
procedure TDataFrameEngine.EncodeAsPublicJson(output: TCoreClassStream);
var
j: TJsonObject;
i: Integer;
begin
j := TJsonObject.Create;
j.s['help'] := 'This JSON with TDataFrameEngine encode';
for i := 0 to Count - 1 do
begin
j.a['Ref'].Add(TDataFrameBase(FDataList[i]).FID);
TDataFrameBase(FDataList[i]).SaveToJson(j.a['Data'], i);
end;
j.SaveToStream(output, False, TEncoding.UTF8, True);
DisposeObject(j);
end;
procedure TDataFrameEngine.EncodeAsJson(output: TCoreClassStream);
var
j: TJsonObject;
i: Integer;
DataFrame_: TDataFrameBase;
begin
j := TJsonObject.Create;
for i := 0 to Count - 1 do
begin
DataFrame_ := TDataFrameBase(FDataList[i]);
DataFrame_.SaveToJson(j.a['Data'], i);
j.a['Ref'].Add(DataFrame_.FID);
end;
j.SaveToStream(output, True, TEncoding.UTF8, True);
DisposeObject(j);
end;
procedure TDataFrameEngine.DecodeFromJson(stream: TCoreClassStream);
var
j: TJsonObject;
t: Byte;
i: Integer;
DataFrame_: TDataFrameBase;
begin
Clear;
j := TJsonObject.Create;
try
j.LoadFromStream(stream, TEncoding.UTF8, True);
except
DisposeObject(j);
Exit;
end;
try
for i := 0 to j.a['Ref'].Count - 1 do
begin
t := j.a['Ref'].i[i];
DataFrame_ := AddData(ByteToDataType(t));
DataFrame_.LoadFromJson(j.a['Data'], i);
end;
except
DisposeObject(j);
Exit;
end;
DisposeObject(j);
end;
procedure TDataFrameEngine.DecodeFromJson(const s: TPascalString);
var
buff: TBytes;
m64: TMemoryStream64;
begin
buff := s.Bytes;
m64 := TMemoryStream64.Create;
m64.SetPointerWithProtectedMode(@buff[0], length(buff));
m64.Position := 0;
DecodeFromJson(m64);
DisposeObject(m64);
SetLength(buff, 0);
end;
{$ENDIF}
function TDataFrameEngine.EncodeAsSelectCompressor(scm: TSelectCompressionMethod; output: TCoreClassStream; const FastMode: Boolean): Integer;
var
i: Integer;
DataFrame_: TDataFrameBase;
StoreStream, nStream, compStream: TMemoryStream64;
ID: Byte;
editionToken: Byte;
sizeInfo32: Cardinal;
sizeInfo64: Int64;
compToken: Byte;
compsizeInfo32: Cardinal;
compsizeInfo64: Int64;
md5: TMD5;
begin
Result := Count;
if Result = 0 then
begin
BuildEmptyStream(output);
Exit;
end;
StoreStream := TMemoryStream64.CustomCreate(8192);
// make body
StoreStream.Write64(Result, C_Integer_Size);
nStream := TMemoryStream64.Create;
for i := 0 to Count - 1 do
begin
DataFrame_ := GetData(i);
ID := DataFrame_.FID;
DataFrame_.SaveToStream(nStream);
StoreStream.Write64(ID, C_Byte_Size);
nStream.Position := 0;
StoreStream.CopyFrom(nStream, nStream.Size);
nStream.Clear;
end;
// compress body and make header
compsizeInfo32 := Cardinal(StoreStream.Size);
compsizeInfo64 := StoreStream.Size;
StoreStream.Position := 0;
if FastMode then
md5 := NullMD5
else
md5 := umlMD5(StoreStream.Memory, StoreStream.Size);
compStream := TMemoryStream64.CustomCreate($FFFF);
ParallelCompressStream(scm, StoreStream, compStream);
DisposeObject(StoreStream);
// make header
sizeInfo32 := Cardinal(compStream.Size);
sizeInfo64 := compStream.Size;
if sizeInfo64 > C_Max_UInt32 then
editionToken := $FA
else
editionToken := $FF;
if compsizeInfo64 > C_Max_UInt32 then
compToken := 44
else
compToken := 4;
// prepare write header
nStream.Clear;
nStream.write(editionToken, C_Byte_Size);
if sizeInfo64 > C_Max_UInt32 then
nStream.write(sizeInfo64, C_Int64_Size)
else
nStream.write(sizeInfo32, C_Cardinal_Size);
nStream.write(compToken, C_Byte_Size);
if compsizeInfo64 > C_Max_UInt32 then
nStream.write(compsizeInfo64, C_Int64_Size)
else
nStream.write(compsizeInfo32, C_Cardinal_Size);
nStream.write(md5[0], C_MD5_Size);
// write header
nStream.Position := 0;
output.CopyFrom(nStream, nStream.Size);
DisposeObject(nStream);
// write body
compStream.Position := 0;
output.CopyFrom(compStream, compStream.Size);
DisposeObject(compStream);
end;
function TDataFrameEngine.EncodeAsSelectCompressor(output: TCoreClassStream; const FastMode: Boolean): Integer;
var
scm: TSelectCompressionMethod;
begin
if ComputeEncodeSize > 64 * 1024 then
begin
if FastMode then
scm := TSelectCompressionMethod.scmZLIB
else
scm := TSelectCompressionMethod.scmZLIB_Max;
Result := EncodeAsSelectCompressor(scm, output, FastMode);
end
else
Result := EncodeAsZLib(output, FastMode);
end;
function TDataFrameEngine.EncodeAsSelectCompressor(output: TCoreClassStream): Integer;
begin
Result := EncodeAsSelectCompressor(output, False);
end;
function TDataFrameEngine.EncodeAsZLib(output: TCoreClassStream; const FastMode: Boolean): Integer;
var
i: Integer;
DataFrame_: TDataFrameBase;
StoreStream, nStream, compStream: TMemoryStream64;
ZCompStream: TCompressionStream;
ID: Byte;
editionToken: Byte;
sizeInfo32: Cardinal;
sizeInfo64: Int64;
compToken: Byte;
compsizeInfo32: Cardinal;
compsizeInfo64: Int64;
md5: TMD5;
begin
Result := Count;
if Result = 0 then
begin
BuildEmptyStream(output);
Exit;
end;
// if encode size too large(>1M), we use EncodeAsSelectCompressor
if ComputeEncodeSize > 1024 * 1024 then
begin
Result := EncodeAsSelectCompressor(TSelectCompressionMethod.scmZLIB, output, FastMode);
Exit;
end;
StoreStream := TMemoryStream64.CustomCreate(8192);
// make body
StoreStream.Write64(Result, C_Integer_Size);
nStream := TMemoryStream64.Create;
for i := 0 to Count - 1 do
begin
DataFrame_ := GetData(i);
ID := DataFrame_.FID;
DataFrame_.SaveToStream(nStream);
StoreStream.Write64(ID, C_Byte_Size);
nStream.Position := 0;
StoreStream.CopyFrom(nStream, nStream.Size);
nStream.Clear;
end;
// compress body and make header
compsizeInfo32 := Cardinal(StoreStream.Size);
compsizeInfo64 := StoreStream.Size;
StoreStream.Position := 0;
if FastMode then
md5 := NullMD5
else
md5 := umlMD5(StoreStream.Memory, StoreStream.Size);
compStream := TMemoryStream64.CustomCreate($FFFF);
ZCompStream := TCompressionStream.Create(compStream);
StoreStream.Position := 0;
ZCompStream.CopyFrom(StoreStream, StoreStream.Size);
DisposeObject(ZCompStream);
DisposeObject(StoreStream);
// make header
sizeInfo32 := compStream.Size;
sizeInfo64 := compStream.Size;
if sizeInfo64 > C_Max_UInt32 then
editionToken := $FA
else
editionToken := $FF;
if compsizeInfo64 > C_Max_UInt32 then
compToken := 11
else
compToken := 1;
// prepare write header
nStream.Clear;
nStream.write(editionToken, C_Byte_Size);
if sizeInfo64 > C_Max_UInt32 then
nStream.write(sizeInfo64, C_Int64_Size)
else
nStream.write(sizeInfo32, C_Cardinal_Size);
nStream.write(compToken, C_Byte_Size);
if compsizeInfo64 > C_Max_UInt32 then
nStream.write(compsizeInfo64, C_Int64_Size)
else
nStream.write(compsizeInfo32, C_Cardinal_Size);
nStream.write(md5[0], C_MD5_Size);
// write header
nStream.Position := 0;
output.CopyFrom(nStream, nStream.Size);
DisposeObject(nStream);
// write body
compStream.Position := 0;
output.CopyFrom(compStream, compStream.Size);
DisposeObject(compStream);
end;
function TDataFrameEngine.EncodeAsZLib(output: TCoreClassStream): Integer;
begin
Result := EncodeAsZLib(output, False);
end;
function TDataFrameEngine.EncodeAsDeflate(output: TCoreClassStream; const FastMode: Boolean): Integer;
var
i: Integer;
DataFrame_: TDataFrameBase;
StoreStream, nStream, compStream: TMemoryStream64;
ID: Byte;
editionToken: Byte;
sizeInfo32: Cardinal;
sizeInfo64: Int64;
compToken: Byte;
compsizeInfo32: Cardinal;
compsizeInfo64: Int64;
md5: TMD5;
begin
Result := Count;
if Result = 0 then
begin
BuildEmptyStream(output);
Exit;
end;
// if encode size too large(>1M), we use EncodeAsSelectCompressor
if ComputeEncodeSize > 1024 * 1024 then
begin
Result := EncodeAsSelectCompressor(TSelectCompressionMethod.scmZLIB, output, FastMode);
Exit;
end;
StoreStream := TMemoryStream64.CustomCreate(8192);
// make body
StoreStream.Write64(Result, C_Integer_Size);
nStream := TMemoryStream64.Create;
for i := 0 to Count - 1 do
begin
DataFrame_ := GetData(i);
ID := DataFrame_.FID;
DataFrame_.SaveToStream(nStream);
StoreStream.Write64(ID, C_Byte_Size);
nStream.Position := 0;
StoreStream.CopyFrom(nStream, nStream.Size);
nStream.Clear;
end;
// compress body and make header
compsizeInfo32 := Cardinal(StoreStream.Size);
compsizeInfo64 := StoreStream.Size;
StoreStream.Position := 0;
if FastMode then
md5 := NullMD5
else
md5 := umlMD5(StoreStream.Memory, StoreStream.Size);
compStream := TMemoryStream64.Create;
StoreStream.Position := 0;
if FCompressorDeflate = nil then
FCompressorDeflate := TCompressorDeflate.Create;
CoreCompressStream(FCompressorDeflate, StoreStream, compStream);
DisposeObject(StoreStream);
// make header
sizeInfo32 := Cardinal(compStream.Size);
sizeInfo64 := compStream.Size;
if sizeInfo64 > C_Max_UInt32 then
editionToken := $FA
else
editionToken := $FF;
if compsizeInfo64 > C_Max_UInt32 then
compToken := 22
else
compToken := 2;
// prepare write header
nStream.Clear;
nStream.write(editionToken, C_Byte_Size);
if sizeInfo64 > C_Max_UInt32 then
nStream.write(sizeInfo64, C_Int64_Size)
else
nStream.write(sizeInfo32, C_Cardinal_Size);
nStream.write(compToken, C_Byte_Size);
if compsizeInfo64 > C_Max_UInt32 then
nStream.write(compsizeInfo64, C_Int64_Size)
else
nStream.write(compsizeInfo32, C_Cardinal_Size);
nStream.write(md5[0], C_MD5_Size);
// write header
nStream.Position := 0;
output.CopyFrom(nStream, nStream.Size);
DisposeObject(nStream);
// write body
compStream.Position := 0;
output.CopyFrom(compStream, compStream.Size);
DisposeObject(compStream);
end;
function TDataFrameEngine.EncodeAsDeflate(output: TCoreClassStream): Integer;
begin
Result := EncodeAsDeflate(output, False);
end;
function TDataFrameEngine.EncodeAsBRRC(output: TCoreClassStream; const FastMode: Boolean): Integer;
var
i: Integer;
DataFrame_: TDataFrameBase;
StoreStream, nStream, compStream: TMemoryStream64;
ID: Byte;
editionToken: Byte;
sizeInfo32: Cardinal;
sizeInfo64: Int64;
compToken: Byte;
compsizeInfo32: Cardinal;
compsizeInfo64: Int64;
md5: TMD5;
begin
Result := Count;
if Result = 0 then
begin
BuildEmptyStream(output);
Exit;
end;
// if encode size too large(>1M), we use EncodeAsSelectCompressor
if ComputeEncodeSize > 1024 * 1024 then
begin
Result := EncodeAsSelectCompressor(TSelectCompressionMethod.scmZLIB, output, FastMode);
Exit;
end;
StoreStream := TMemoryStream64.CustomCreate(8192);
// make body
StoreStream.Write64(Result, C_Integer_Size);
nStream := TMemoryStream64.Create;
for i := 0 to Count - 1 do
begin
DataFrame_ := GetData(i);
ID := DataFrame_.FID;
DataFrame_.SaveToStream(nStream);
StoreStream.Write64(ID, C_Byte_Size);
nStream.Position := 0;
StoreStream.CopyFrom(nStream, nStream.Size);
nStream.Clear;
end;
// compress body and make header
compsizeInfo32 := Cardinal(StoreStream.Size);
compsizeInfo64 := StoreStream.Size;
StoreStream.Position := 0;
if FastMode then
md5 := NullMD5
else
md5 := umlMD5(StoreStream.Memory, StoreStream.Size);
compStream := TMemoryStream64.Create;
StoreStream.Position := 0;
if FCompressorBRRC = nil then
FCompressorBRRC := TCompressorBRRC.Create;
CoreCompressStream(FCompressorBRRC, StoreStream, compStream);
DisposeObject(StoreStream);
// make header
sizeInfo32 := Cardinal(compStream.Size);
sizeInfo64 := compStream.Size;
if sizeInfo64 > C_Max_UInt32 then
editionToken := $FA
else
editionToken := $FF;
if compsizeInfo64 > C_Max_UInt32 then
compToken := 33
else
compToken := 3;
// prepare write header
nStream.Clear;
nStream.write(editionToken, C_Byte_Size);
if sizeInfo64 > C_Max_UInt32 then
nStream.write(sizeInfo64, C_Int64_Size)
else
nStream.write(sizeInfo32, C_Cardinal_Size);
nStream.write(compToken, C_Byte_Size);
if compsizeInfo64 > C_Max_UInt32 then
nStream.write(compsizeInfo64, C_Int64_Size)
else
nStream.write(compsizeInfo32, C_Cardinal_Size);
nStream.write(md5[0], C_MD5_Size);
// write header
nStream.Position := 0;
output.CopyFrom(nStream, nStream.Size);
DisposeObject(nStream);
// write body
compStream.Position := 0;
output.CopyFrom(compStream, compStream.Size);
DisposeObject(compStream);
end;
function TDataFrameEngine.EncodeAsBRRC(output: TCoreClassStream): Integer;
begin
Result := EncodeAsBRRC(output, False);
end;
function TDataFrameEngine.IsCompressed(source: TCoreClassStream): Boolean;
var
bakPos: Int64;
editionToken: Byte;
sizeInfo32: Cardinal;
sizeInfo64, sizeInfo: Int64;
compToken: Byte;
begin
bakPos := source.Position;
Result := False;
source.Read(editionToken, C_Byte_Size);
if (editionToken in [$FF, $FA]) then
begin
if editionToken = $FF then
begin
source.Read(sizeInfo32, C_Cardinal_Size);
sizeInfo := sizeInfo32;
end
else
begin
source.Read(sizeInfo64, C_Int64_Size);
sizeInfo := sizeInfo64;
end;
source.Read(compToken, C_Byte_Size);
Result := compToken in [1, 11, 2, 22, 3, 33, 4, 44];
end;
source.Position := bakPos;
end;
function TDataFrameEngine.DecodeFrom(source: TCoreClassStream; const FastMode: Boolean): Integer;
var
i, cnt: Integer;
ID: Byte;
StoreStream: TMemoryStream64;
ZDecompStream: TDecompressionStream;
DataFrame_: TDataFrameBase;
editionToken: Byte;
sizeInfo32: Cardinal;
sizeInfo64, sizeInfo: Int64;
compToken: Byte;
compsizeInfo32: Cardinal;
compsizeInfo64, compsizeInfo: Int64;
md5: TMD5;
begin
Clear;
Result := -1;
StoreStream := TMemoryStream64.Create;
source.Read(editionToken, C_Byte_Size);
if (editionToken in [$FF, $FA]) then
begin
if editionToken = $FF then
begin
source.Read(sizeInfo32, C_Cardinal_Size);
sizeInfo := sizeInfo32;
end
else
begin
source.Read(sizeInfo64, C_Int64_Size);
sizeInfo := sizeInfo64;
end;
source.Read(compToken, C_Byte_Size);
if compToken = 0 then
begin
source.Read(md5[0], 16);
if source is TMemoryStream64 then
StoreStream.SetPointerWithProtectedMode(TMemoryStream64(source).PositionAsPtr, sizeInfo)
else
begin
if sizeInfo > 0 then
StoreStream.CopyFrom(source, sizeInfo);
end;
StoreStream.Position := 0;
if (not FastMode) and (not umlIsNullMD5(md5)) then
if not umlMD5Compare(umlMD5(StoreStream.Memory, StoreStream.Size), md5) then
begin
DoStatus('dataframe md5 error!');
DisposeObject(StoreStream);
Exit;
end;
end
else if compToken in [1, 11] then
begin
if compToken = 1 then
begin
source.Read(compsizeInfo32, C_Cardinal_Size);
compsizeInfo := compsizeInfo32;
end
else
begin
source.Read(compsizeInfo64, C_Int64_Size);
compsizeInfo := compsizeInfo64;
end;
source.Read(md5[0], 16);
ZDecompStream := TDecompressionStream.Create(source);
StoreStream.CopyFrom(ZDecompStream, compsizeInfo);
DisposeObject(ZDecompStream);
StoreStream.Position := 0;
if (not FastMode) and (not umlIsNullMD5(md5)) then
if not umlMD5Compare(umlMD5(StoreStream.Memory, StoreStream.Size), md5) then
begin
DoStatus('ZLib md5 error!');
DisposeObject(StoreStream);
Exit;
end;
end
else if compToken in [2, 22] then
begin
if compToken = 2 then
begin
source.Read(compsizeInfo32, C_Cardinal_Size);
compsizeInfo := compsizeInfo32;
end
else
begin
source.Read(compsizeInfo64, C_Int64_Size);
compsizeInfo := compsizeInfo64;
end;
source.Read(md5[0], 16);
if FCompressorDeflate = nil then
FCompressorDeflate := TCompressorDeflate.Create;
CoreDecompressStream(FCompressorDeflate, source, StoreStream);
StoreStream.Position := 0;
if (not FastMode) and (not umlIsNullMD5(md5)) then
if not umlMD5Compare(umlMD5(StoreStream.Memory, StoreStream.Size), md5) then
begin
DoStatus('Deflate md5 error!');
DisposeObject(StoreStream);
Exit;
end;
end
else if compToken in [3, 33] then
begin
if compToken = 3 then
begin
source.Read(compsizeInfo32, C_Cardinal_Size);
compsizeInfo := compsizeInfo32;
end
else
begin
source.Read(compsizeInfo64, C_Int64_Size);
compsizeInfo := compsizeInfo64;
end;
source.Read(md5[0], 16);
if FCompressorBRRC = nil then
FCompressorBRRC := TCompressorBRRC.Create;
CoreDecompressStream(FCompressorBRRC, source, StoreStream);
StoreStream.Position := 0;
if (not FastMode) and (not umlIsNullMD5(md5)) then
if not umlMD5Compare(umlMD5(StoreStream.Memory, StoreStream.Size), md5) then
begin
DoStatus('BRRC md5 error!');
DisposeObject(StoreStream);
Exit;
end;
end
else if compToken in [4, 44] then
begin
if compToken = 4 then
begin
source.Read(compsizeInfo32, C_Cardinal_Size);
compsizeInfo := compsizeInfo32;
end
else
begin
source.Read(compsizeInfo64, C_Int64_Size);
compsizeInfo := compsizeInfo64;
end;
source.Read(md5[0], 16);
ParallelDecompressStream(source, StoreStream);
StoreStream.Position := 0;
if (not FastMode) and (not umlIsNullMD5(md5)) then
if not umlMD5Compare(umlMD5(StoreStream.Memory, StoreStream.Size), md5) then
begin
DoStatus('select compression md5 error!');
DisposeObject(StoreStream);
Exit;
end;
end;
StoreStream.Position := 0;
StoreStream.Read64(cnt, C_Integer_Size);
for i := 0 to cnt - 1 do
begin
StoreStream.Read64(ID, C_Byte_Size);
DataFrame_ := AddData(ByteToDataType(ID));
DataFrame_.LoadFromStream(StoreStream);
end;
DisposeObject(StoreStream);
Result := cnt;
end
else
begin
DoStatus('dataframe decode error!');
DisposeObject(StoreStream);
Exit;
end;
end;
function TDataFrameEngine.DecodeFrom(source: TCoreClassStream): Integer;
begin
Result := DecodeFrom(source, False);
end;
procedure TDataFrameEngine.EncodeToBytes(const Compressed, FastMode: Boolean; var output: TBytes);
var
enStream: TMemoryStream64;
begin
enStream := TMemoryStream64.Create;
if Compressed then
EncodeAsSelectCompressor(enStream, FastMode)
else
EncodeTo(enStream, FastMode);
SetLength(output, enStream.Size);
CopyPtr(enStream.Memory, @output[0], enStream.Size);
DisposeObject(enStream);
end;
procedure TDataFrameEngine.DecodeFromBytes(var buff: TBytes);
begin
DecodeFromBytes(buff, False);
end;
procedure TDataFrameEngine.DecodeFromBytes(var buff: TBytes; const FastMode: Boolean);
var
enStream: TMemoryStream64;
begin
enStream := TMemoryStream64.Create;
enStream.SetPointerWithProtectedMode(@buff[0], length(buff));
DecodeFrom(enStream, FastMode);
DisposeObject(enStream);
end;
function TDataFrameEngine.GetMD5(const FastMode: Boolean): TMD5;
var
enStream: TMemoryStream64;
begin
enStream := TMemoryStream64.Create;
EncodeTo(enStream, FastMode);
Result := umlMD5(enStream.Memory, enStream.Size);
DisposeObject(enStream);
end;
function TDataFrameEngine.Compare(source: TDataFrameEngine): Boolean;
var
i: Integer;
s1, s2: TMemoryStream64;
begin
Result := False;
if Count <> source.Count then
Exit;
s1 := TMemoryStream64.CustomCreate(8192);
s2 := TMemoryStream64.CustomCreate(8192);
try
for i := 0 to Count - 1 do
begin
if FDataList[i].ClassType <> source[i].ClassType then
Exit;
if TDataFrameBase(FDataList[i]).FID <> TDataFrameBase(source[i]).FID then
Exit;
if TDataFrameBase(FDataList[i]).ComputeEncodeSize <> TDataFrameBase(source[i]).ComputeEncodeSize then
Exit;
s1.Clear;
s2.Clear;
TDataFrameBase(FDataList[i]).SaveToStream(s1);
TDataFrameBase(source[i]).SaveToStream(s2);
if s1.Size <> s2.Size then
Exit;
if not CompareMemory(s1.Memory, s2.Memory, s1.Size) then
Exit;
s1.Clear;
s2.Clear;
end;
Result := True;
finally
DisposeObject(s1);
DisposeObject(s2);
end;
end;
procedure TDataFrameEngine.LoadFromStream(stream: TCoreClassStream);
begin
try
DecodeFrom(stream);
except
end;
end;
procedure TDataFrameEngine.SaveToStream(stream: TCoreClassStream);
var
siz: Integer;
begin
try
siz := ComputeEncodeSize;
if siz > 1024 then
EncodeAsSelectCompressor(stream)
else
EncodeTo(stream);
except
end;
end;
constructor TDataWriter.Create(AStream: TCoreClassStream);
begin
inherited Create;
FEngine := TDataFrameEngine.Create;
FStream := AStream;
end;
destructor TDataWriter.Destroy;
var
FlagCompressed: Boolean;
verflag: TBytes;
Len: Int64;
M: TMemoryStream64;
begin
if FStream <> nil then
begin
M := TMemoryStream64.Create;
FEngine.EncodeTo(M);
Len := M.Size;
// write version flag
verflag := umlBytesOf('0001');
FStream.write(verflag, 4);
// write compressed flag
FlagCompressed := False;
FStream.write(FlagCompressed, C_Boolean_Size);
// write length info
FStream.write(Len, C_Int64_Size);
// write buffer
M.Position := 0;
FStream.CopyFrom(M, Len);
DisposeObject(M);
end;
DisposeObject(FEngine);
inherited Destroy;
end;
procedure TDataWriter.Clear;
begin
FEngine.Clear;
end;
procedure TDataWriter.WriteString(v: SystemString);
begin
FEngine.WriteString(v);
end;
procedure TDataWriter.WriteBytes(v: TBytes);
begin
FEngine.WriteBytes(v);
end;
procedure TDataWriter.WriteInteger(v: Integer);
begin
FEngine.WriteInteger(v);
end;
procedure TDataWriter.WriteCardinal(v: Cardinal);
begin
FEngine.WriteCardinal(v);
end;
procedure TDataWriter.WriteWORD(v: Word);
begin
FEngine.WriteWORD(v);
end;
procedure TDataWriter.WriteBool(v: Boolean);
begin
FEngine.WriteBool(v);
end;
procedure TDataWriter.WriteBoolean(v: Boolean);
begin
FEngine.WriteBoolean(v);
end;
procedure TDataWriter.WriteByte(v: Byte);
begin
FEngine.WriteByte(v);
end;
procedure TDataWriter.WriteSingle(v: Single);
begin
FEngine.WriteSingle(v);
end;
procedure TDataWriter.WriteDouble(v: Double);
begin
FEngine.WriteDouble(v);
end;
procedure TDataWriter.WriteArrayInteger(v: array of Integer);
begin
FEngine.WriteArrayInteger.WriteArray(v);
end;
procedure TDataWriter.WriteArrayShortInt(v: array of ShortInt);
begin
FEngine.WriteArrayShortInt.WriteArray(v);
end;
procedure TDataWriter.WriteArrayByte(v: array of Byte);
begin
FEngine.WriteArrayByte.WriteArray(v);
end;
procedure TDataWriter.WriteArraySingle(v: array of Single);
begin
FEngine.WriteArraySingle.WriteArray(v);
end;
procedure TDataWriter.WriteArrayDouble(v: array of Double);
begin
FEngine.WriteArrayDouble.WriteArray(v);
end;
procedure TDataWriter.WriteArrayInt64(v: array of Int64);
begin
FEngine.WriteArrayInt64.WriteArray(v);
end;
procedure TDataWriter.WriteStream(v: TCoreClassStream);
begin
FEngine.WriteStream(v);
end;
procedure TDataWriter.WriteVariant(v: Variant);
begin
FEngine.WriteVariant(v);
end;
procedure TDataWriter.WriteInt64(v: Int64);
begin
FEngine.WriteInt64(v);
end;
procedure TDataWriter.WriteUInt64(v: UInt64);
begin
FEngine.WriteUInt64(v);
end;
procedure TDataWriter.WriteStrings(v: TCoreClassStrings);
begin
FEngine.WriteStrings(v);
end;
procedure TDataWriter.WriteListStrings(v: TListString);
begin
FEngine.WriteListStrings(v);
end;
procedure TDataWriter.WritePascalStrings(v: TListPascalString);
begin
FEngine.WritePascalStrings(v);
end;
procedure TDataWriter.WriteDataFrame(v: TDataFrameEngine);
begin
FEngine.WriteDataFrame(v);
end;
procedure TDataWriter.WriteDataFrameCompressed(v: TDataFrameEngine);
begin
FEngine.WriteDataFrameCompressed(v);
end;
procedure TDataWriter.WriteHashStringList(v: THashStringList);
begin
FEngine.WriteHashStringList(v);
end;
procedure TDataWriter.WriteVariantList(v: THashVariantList);
begin
FEngine.WriteVariantList(v);
end;
procedure TDataWriter.WriteSectionText(v: TSectionTextData);
begin
FEngine.WriteSectionText(v);
end;
{$IFNDEF FPC}
procedure TDataWriter.WriteJson(v: TJsonObject);
begin
FEngine.WriteJson(v);
end;
{$ENDIF}
procedure TDataWriter.WriteRect(v: TRect);
begin
FEngine.WriteRect(v);
end;
procedure TDataWriter.WriteRectf(v: TRectf);
begin
FEngine.WriteRectf(v);
end;
procedure TDataWriter.WritePoint(v: TPoint);
begin
FEngine.WritePoint(v);
end;
procedure TDataWriter.WritePointf(v: TPointf);
begin
FEngine.WritePointf(v);
end;
procedure TDataWriter.WriteVector(v: TVector);
begin
FEngine.WriteVector(v);
end;
procedure TDataWriter.WriteAffineVector(v: TAffineVector);
begin
FEngine.WriteAffineVector(v);
end;
procedure TDataWriter.WriteVec4(v: TVec4);
begin
FEngine.WriteVec4(v);
end;
procedure TDataWriter.WriteVec3(v: TVec3);
begin
FEngine.WriteVec3(v);
end;
procedure TDataWriter.WriteVector4(v: TVector4);
begin
FEngine.WriteVector4(v);
end;
procedure TDataWriter.WriteVector3(v: TVector3);
begin
FEngine.WriteVector3(v);
end;
procedure TDataWriter.WriteMat4(v: TMat4);
begin
FEngine.WriteMat4(v);
end;
procedure TDataWriter.WriteMatrix4(v: TMatrix4);
begin
FEngine.WriteMatrix4(v);
end;
procedure TDataWriter.Write2DPoint(v: T2DPoint);
begin
FEngine.Write2DPoint(v);
end;
procedure TDataWriter.WriteVec2(v: TVec2);
begin
FEngine.WriteVec2(v);
end;
procedure TDataWriter.WriteRectV2(v: TRectV2);
begin
FEngine.WriteRectV2(v);
end;
procedure TDataWriter.WritePointer(v: Pointer);
begin
FEngine.WritePointer(v);
end;
procedure TDataWriter.write(const aBuf; aCount: Int64);
begin
FEngine.write(aBuf, aCount);
end;
constructor TDataReader.Create(AStream: TCoreClassStream);
var
verflag: TBytes;
FlagCompressed: Boolean;
Len: Int64;
M: TMemoryStream64;
begin
inherited Create;
FEngine := TDataFrameEngine.Create;
if AStream <> nil then
begin
// read version flag
SetLength(verflag, 4);
AStream.Read(verflag, 4);
if umlStringOf(verflag) <> '0001' then
raise Exception.Create('Version flag Does not match!');
// read compressed flag
AStream.Read(FlagCompressed, C_Boolean_Size);
// read length info
AStream.Read(Len, C_Int64_Size);
// write buffer
M := TMemoryStream64.Create;
M.CopyFrom(AStream, Len);
M.Position := 0;
FEngine.DecodeFrom(M);
DisposeObject(M);
end;
end;
destructor TDataReader.Destroy;
begin
DisposeObject(FEngine);
inherited Destroy;
end;
function TDataReader.ReadString: SystemString;
begin
Result := FEngine.Reader.ReadString;
end;
function TDataReader.ReadBytes: TBytes;
begin
Result := FEngine.Reader.ReadBytes;
end;
function TDataReader.ReadInteger: Integer;
begin
Result := FEngine.Reader.ReadInteger;
end;
function TDataReader.ReadCardinal: Cardinal;
begin
Result := FEngine.Reader.ReadCardinal;
end;
function TDataReader.ReadWord: Word;
begin
Result := FEngine.Reader.ReadWord;
end;
function TDataReader.ReadBool: Boolean;
begin
Result := FEngine.Reader.ReadBool;
end;
function TDataReader.ReadBoolean: Boolean;
begin
Result := FEngine.Reader.ReadBoolean;
end;
function TDataReader.ReadByte: Byte;
begin
Result := FEngine.Reader.ReadByte;
end;
function TDataReader.ReadSingle: Single;
begin
Result := FEngine.Reader.ReadSingle;
end;
function TDataReader.ReadDouble: Double;
begin
Result := FEngine.Reader.ReadDouble;
end;
procedure TDataReader.ReadArrayInteger(var Data: array of Integer);
var
i: Integer;
rb: TDataFrameArrayInteger;
begin
rb := FEngine.Reader.ReadArrayInteger;
for i := low(Data) to high(Data) do
Data[i] := rb[i];
end;
procedure TDataReader.ReadArrayShortInt(var Data: array of ShortInt);
var
i: Integer;
rb: TDataFrameArrayShortInt;
begin
rb := FEngine.Reader.ReadArrayShortInt;
for i := low(Data) to high(Data) do
Data[i] := rb[i];
end;
procedure TDataReader.ReadArrayByte(var Data: array of Byte);
var
i: Integer;
rb: TDataFrameArrayByte;
begin
rb := FEngine.Reader.ReadArrayByte;
for i := low(Data) to high(Data) do
Data[i] := rb[i];
end;
procedure TDataReader.ReadArraySingle(var Data: array of Single);
var
i: Integer;
rb: TDataFrameArraySingle;
begin
rb := FEngine.Reader.ReadArraySingle;
for i := low(Data) to high(Data) do
Data[i] := rb[i];
end;
procedure TDataReader.ReadArrayDouble(var Data: array of Double);
var
i: Integer;
rb: TDataFrameArrayDouble;
begin
rb := FEngine.Reader.ReadArrayDouble;
for i := low(Data) to high(Data) do
Data[i] := rb[i];
end;
procedure TDataReader.ReadArrayInt64(var Data: array of Int64);
var
i: Integer;
rb: TDataFrameArrayInt64;
begin
rb := FEngine.Reader.ReadArrayInt64;
for i := low(Data) to high(Data) do
Data[i] := rb[i];
end;
procedure TDataReader.ReadStream(output: TCoreClassStream);
begin
FEngine.Reader.ReadStream(output);
end;
function TDataReader.ReadVariant: Variant;
begin
Result := FEngine.Reader.ReadVariant;
end;
function TDataReader.ReadInt64: Int64;
begin
Result := FEngine.Reader.ReadInt64;
end;
function TDataReader.ReadUInt64: UInt64;
begin
Result := FEngine.Reader.ReadUInt64;
end;
procedure TDataReader.ReadStrings(output: TCoreClassStrings);
begin
FEngine.Reader.ReadStrings(output);
end;
procedure TDataReader.ReadListStrings(output: TListString);
begin
FEngine.Reader.ReadListStrings(output);
end;
procedure TDataReader.ReadPascalStrings(output: TListPascalString);
begin
FEngine.Reader.ReadPascalStrings(output);
end;
procedure TDataReader.ReadDataFrame(output: TDataFrameEngine);
begin
FEngine.Reader.ReadDataFrame(output);
end;
procedure TDataReader.ReadHashStringList(output: THashStringList);
begin
FEngine.Reader.ReadHashStringList(output);
end;
procedure TDataReader.ReadVariantList(output: THashVariantList);
begin
FEngine.Reader.ReadVariantList(output);
end;
procedure TDataReader.ReadSectionText(output: TSectionTextData);
begin
FEngine.Reader.ReadSectionText(output);
end;
{$IFNDEF FPC}
procedure TDataReader.ReadJson(output: TJsonObject);
begin
FEngine.Reader.ReadJson(output);
end;
{$ENDIF}
function TDataReader.ReadRect: TRect;
begin
Result := FEngine.Reader.ReadRect;
end;
function TDataReader.ReadRectf: TRectf;
begin
Result := FEngine.Reader.ReadRectf;
end;
function TDataReader.ReadPoint: TPoint;
begin
Result := FEngine.Reader.ReadPoint;
end;
function TDataReader.ReadPointf: TPointf;
begin
Result := FEngine.Reader.ReadPointf;
end;
function TDataReader.ReadVector: TVector;
begin
Result := FEngine.Reader.ReadVector;
end;
function TDataReader.ReadAffineVector: TAffineVector;
begin
Result := FEngine.Reader.ReadAffineVector;
end;
function TDataReader.ReadVec3: TVec3;
begin
Result := FEngine.Reader.ReadVec3;
end;
function TDataReader.ReadVec4: TVec4;
begin
Result := FEngine.Reader.ReadVec4;
end;
function TDataReader.ReadVector3: TVector3;
begin
Result := FEngine.Reader.ReadVector3;
end;
function TDataReader.ReadVector4: TVector4;
begin
Result := FEngine.Reader.ReadVector4;
end;
function TDataReader.ReadMat4: TMat4;
begin
Result := FEngine.Reader.ReadMat4;
end;
function TDataReader.ReadMatrix4: TMatrix4;
begin
Result := FEngine.Reader.ReadMatrix4;
end;
function TDataReader.Read2DPoint: T2DPoint;
begin
Result := FEngine.Reader.Read2DPoint;
end;
function TDataReader.ReadVec2: TVec2;
begin
Result := FEngine.Reader.ReadVec2;
end;
function TDataReader.ReadRectV2: TRectV2;
begin
Result := FEngine.Reader.ReadRectV2;
end;
function TDataReader.ReadPointer: UInt64;
begin
Result := FEngine.Reader.ReadPointer;
end;
procedure TDataReader.Read(var aBuf; aCount: Int64);
begin
FEngine.Reader.Read(aBuf, aCount);
end;
end.