874 lines
25 KiB
ObjectPascal
874 lines
25 KiB
ObjectPascal
{******************************************************************************}
|
|
{ UNIFIED INTERBASE (UIB) }
|
|
{ }
|
|
{ Project JEDI Code Library (JCL) }
|
|
{ }
|
|
{ The contents of this file are subject to the Mozilla Public License Version }
|
|
{ 1.0 (the "License"); you may not use this file except in compliance with the }
|
|
{ License. You may obtain a copy of the License at http://www.mozilla.org/MPL/ }
|
|
{ }
|
|
{ Software distributed under the License is distributed on an "AS IS" basis, }
|
|
{ WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
|
|
{ the specific language governing rights and limitations under the License. }
|
|
{ }
|
|
{ The Original Code is JvUIBLib.pas. }
|
|
{ }
|
|
{ The Initial Developer of the Original Code is documented in the accompanying }
|
|
{ help file JCL.chm. Portions created by these individuals are Copyright (C) }
|
|
{ 2000 of these individuals. }
|
|
{ }
|
|
{ ORB Skeletons }
|
|
{ }
|
|
{ Unit owner: Henri Gourvest }
|
|
{ Last modified: Mar 16, 2003 }
|
|
{ }
|
|
{******************************************************************************}
|
|
|
|
{$I jvcl.inc}
|
|
{$I jvuib.inc}
|
|
|
|
unit JvUIBObj;
|
|
|
|
interface
|
|
|
|
uses
|
|
{$IFDEF USEJVCL}
|
|
{$IFDEF UNITVERSIONING}
|
|
JclUnitVersioning,
|
|
{$ENDIF UNITVERSIONING}
|
|
{$ENDIF USEJVCL}
|
|
IdTCPClient, IdTCPServer, IdTCPConnection, IdException, SysUtils,
|
|
JvUIBConst, JvUIBLib, Classes;
|
|
|
|
type
|
|
{$IFNDEF COMPILER7_UP}
|
|
TDate = TDateTime;
|
|
{$ENDIF !COMPILER7_UP}
|
|
{$IFDEF VisualCLX}
|
|
TDate = TDateTime;
|
|
{$ENDIF VisualCLX}
|
|
EJvUIBException = class(Exception);
|
|
|
|
TJvUIBConnection = class(TInterfacedObject)
|
|
protected
|
|
function GetConnection: TIdTCPConnection; virtual; abstract;
|
|
procedure BeginWrite;
|
|
procedure EndWrite;
|
|
public
|
|
{Write Simple Types}
|
|
procedure WriteInteger(Value: Integer);
|
|
procedure WriteByte(Value: Byte);
|
|
procedure WriteWord(Value: Word);
|
|
procedure WriteGUID(Value: TGUID);
|
|
procedure WriteCardinal(Value: Cardinal);
|
|
procedure WriteShortint(Value: Shortint);
|
|
procedure WriteSmallint(Value: Smallint);
|
|
procedure WriteLongint(Value: Longint);
|
|
procedure WriteInt64(Value: Int64);
|
|
procedure WriteLongword(Value: Longword);
|
|
procedure WriteDouble(Value: Double);
|
|
procedure WriteReal48(Value: Real48);
|
|
procedure WriteSingle(Value: Single);
|
|
procedure WriteExtended(Value: Extended);
|
|
procedure WriteComp(Value: Comp);
|
|
procedure WriteCurrency(Value: Currency);
|
|
procedure WriteBoolean(Value: Boolean);
|
|
procedure WriteByteBool(Value: ByteBool);
|
|
procedure WriteWordBool(Value: WordBool);
|
|
procedure WriteLongBool(Value: LongBool);
|
|
|
|
{Write String}
|
|
procedure WriteString(Value: string);
|
|
procedure WriteWideString(Value: WideString);
|
|
procedure WritePChar(Value: PChar);
|
|
procedure WritePWideChar(Value: PWideChar);
|
|
|
|
{Write Variants}
|
|
procedure WriteVariant(var Value: Variant; Compress: Boolean = False);
|
|
procedure WriteOleVariant(var Value: OleVariant; Compress: Boolean = False);
|
|
procedure WritePVarArray(Value: PVarArray; Compress: Boolean = False);
|
|
|
|
{Write Other}
|
|
procedure WriteStream(Stream: TStream; Compress: Boolean = False);
|
|
|
|
{Read Simple Types}
|
|
function ReadInteger: Integer;
|
|
function ReadByte: Byte;
|
|
function ReadWord: Word;
|
|
function ReadGUID: TGUID;
|
|
function ReadCardinal: Cardinal;
|
|
function ReadShortint: Shortint;
|
|
function ReadSmallint: Smallint;
|
|
function ReadLongint: Longint;
|
|
function ReadInt64: Int64;
|
|
function ReadLongword: Longword;
|
|
function ReadDouble: Double;
|
|
function ReadReal48: Real48;
|
|
function ReadSingle: Single;
|
|
function ReadExtended: Extended;
|
|
function ReadComp: Comp;
|
|
function ReadCurrency: Currency;
|
|
function ReadBoolean: Boolean;
|
|
function ReadByteBool: ByteBool;
|
|
function ReadWordBool: WordBool;
|
|
function ReadLongBool: LongBool;
|
|
|
|
{Read String}
|
|
function ReadString: string;
|
|
function ReadWideString: WideString;
|
|
function ReadPChar: PChar;
|
|
function ReadPWideChar: PWideChar;
|
|
|
|
{Read Variants}
|
|
function ReadVariant(DeCompress: Boolean = False): Variant;
|
|
function ReadOleVariant(DeCompress: Boolean = False): OleVariant;
|
|
function ReadPVarArray(DeCompress: Boolean = False): PVarArray;
|
|
|
|
{Read Other}
|
|
procedure ReadStream(Stream: TStream; DeCompress: Boolean = False);
|
|
|
|
property Connection: TIdTCPConnection read GetConnection;
|
|
end;
|
|
|
|
TJvUIBProxy = class(TJvUIBConnection)
|
|
private
|
|
FTCPClient: TIdTCPClient;
|
|
FClassID: TGUID;
|
|
procedure SetHost(const Value: string);
|
|
function GetHost: string;
|
|
procedure SetPort(const Value: Integer);
|
|
function GetPort: Integer;
|
|
function GetActive: Boolean;
|
|
procedure SetClassID(const Value: TGUID);
|
|
procedure SetActive(const Value: Boolean);
|
|
procedure WriteCommand(Command: TServerCommand);
|
|
protected
|
|
function GetConnection: TIdTCPConnection; override;
|
|
procedure InitCallMethod(Value: Integer);
|
|
public
|
|
constructor Create; virtual;
|
|
destructor Destroy; override;
|
|
property Host: string read GetHost write SetHost;
|
|
property Port: Integer read GetPort write SetPort;
|
|
property Active: Boolean read GetActive write SetActive;
|
|
property ClassID: TGUID read FClassID write SetClassID;
|
|
end;
|
|
|
|
TJvUIBStub = class(TJvUIBConnection)
|
|
private
|
|
FConnection: TIdTCPServerConnection;
|
|
protected
|
|
function GetConnection: TIdTCPConnection; override;
|
|
public
|
|
procedure Invoke(MethodID: Integer); virtual;
|
|
constructor Create(Connection: TIdTCPServerConnection); virtual;
|
|
end;
|
|
|
|
TJvUIBStubClass = class of TJvUIBStub;
|
|
|
|
{$IFDEF USEJVCL}
|
|
{$IFDEF UNITVERSIONING}
|
|
const
|
|
UnitVersioning: TUnitVersionInfo = (
|
|
RCSfile: '$URL: https://jvcl.svn.sourceforge.net/svnroot/jvcl/tags/JVCL3_32/run/JvUIBObj.pas $';
|
|
Revision: '$Revision: 10612 $';
|
|
Date: '$Date: 2006-05-19 21:04:09 +0200 (ven., 19 mai 2006) $';
|
|
LogPath: 'JVCL\run'
|
|
);
|
|
{$ENDIF UNITVERSIONING}
|
|
{$ENDIF USEJVCL}
|
|
|
|
implementation
|
|
|
|
uses
|
|
{$IFDEF DELPHI6_UP}
|
|
VarUtils, Variants,
|
|
{$ENDIF DELPHI6_UP}
|
|
ZLib;
|
|
|
|
{$IFNDEF DELPHI6_UP}
|
|
const
|
|
OleAutDllName = 'oleaut32.dll';
|
|
|
|
function SafeArrayAllocDescriptor(DimCount: Integer; out VarArray: PVarArray): HRESULT;
|
|
stdcall; external OleAutDllName name 'SafeArrayAllocDescriptor';
|
|
|
|
function SafeArrayAllocData(VarArray: PVarArray): HRESULT; stdcall;
|
|
external OleAutDllName name 'SafeArrayAllocData';
|
|
|
|
function SafeArrayAccessData(VarArray: PVarArray; out Data: Pointer): HRESULT; stdcall;
|
|
external OleAutDllName name 'SafeArrayAccessData';
|
|
|
|
function SafeArrayUnaccessData(VarArray: PVarArray): HRESULT; stdcall;
|
|
external OleAutDllName name 'SafeArrayUnaccessData';
|
|
|
|
{$ENDIF !DELPHI6_UP}
|
|
|
|
function SafeArrayElementTotal(VarArray: PVarArray): Integer;
|
|
var
|
|
LDim: Integer;
|
|
begin
|
|
Result := 1;
|
|
for LDim := 0 to VarArray^.DimCount - 1 do
|
|
Result := Result * VarArray^.Bounds[LDim].ElementCount;
|
|
end;
|
|
|
|
//=== { TJvUIBClient } =======================================================
|
|
|
|
constructor TJvUIBProxy.Create;
|
|
begin
|
|
// (rom) added inherited Create
|
|
inherited Create;
|
|
FTCPClient := TIdTCPClient.Create(nil);
|
|
end;
|
|
|
|
destructor TJvUIBProxy.Destroy;
|
|
begin
|
|
FTCPClient.Free;
|
|
inherited Destroy;
|
|
end;
|
|
|
|
procedure TJvUIBProxy.WriteCommand(Command: TServerCommand);
|
|
begin
|
|
Connection.WriteBuffer(Command, SizeOf(TServerCommand));
|
|
end;
|
|
|
|
function TJvUIBProxy.GetActive: Boolean;
|
|
begin
|
|
Result := FTCPClient.Connected;
|
|
end;
|
|
|
|
function TJvUIBProxy.GetConnection: TIdTCPConnection;
|
|
begin
|
|
Result := FTCPClient;
|
|
end;
|
|
|
|
function TJvUIBProxy.GetHost: string;
|
|
begin
|
|
Result := FTCPClient.Host;
|
|
end;
|
|
|
|
function TJvUIBProxy.GetPort: Integer;
|
|
begin
|
|
Result := FTCPClient.Port;
|
|
end;
|
|
|
|
procedure TJvUIBProxy.InitCallMethod(Value: Integer);
|
|
begin
|
|
WriteCommand(scInvokeMethod);
|
|
WriteInteger(Value);
|
|
end;
|
|
|
|
procedure TJvUIBProxy.SetActive(const Value: Boolean);
|
|
var
|
|
Ret: HRESULT;
|
|
begin
|
|
case Value of
|
|
False:
|
|
if FTCPClient.Connected then
|
|
FTCPClient.Disconnect;
|
|
True:
|
|
with FTCPClient do
|
|
if not Connection.Connected then
|
|
begin
|
|
try
|
|
Connect;
|
|
OpenWriteBuffer;
|
|
WriteCommand(scGetClassObject);
|
|
WriteGUID(FClassID);
|
|
CloseWriteBuffer;
|
|
Ret := ReadInteger;
|
|
if Ret <> S_OK then
|
|
begin
|
|
Disconnect;
|
|
raise EJvUIBException.Create(EJvUIB_ClassNotFound);
|
|
end;
|
|
except
|
|
on E: EidSocketError do
|
|
raise EJvUIBException.Create(EJvUIB_CantConnect);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TJvUIBProxy.SetClassID(const Value: TGUID);
|
|
begin
|
|
FClassID := Value;
|
|
end;
|
|
|
|
procedure TJvUIBProxy.SetHost(const Value: string);
|
|
begin
|
|
FTCPClient.Host := Value;
|
|
end;
|
|
|
|
procedure TJvUIBProxy.SetPort(const Value: Integer);
|
|
begin
|
|
FTCPClient.Port := Value;
|
|
end;
|
|
|
|
//=== { TJvUIBObject } =======================================================
|
|
|
|
constructor TJvUIBStub.Create(Connection: TIdTCPServerConnection);
|
|
begin
|
|
// (rom) added inherited Create
|
|
inherited Create;
|
|
FConnection := Connection;
|
|
end;
|
|
|
|
function TJvUIBStub.GetConnection: TIdTCPConnection;
|
|
begin
|
|
Result := FConnection;
|
|
end;
|
|
|
|
procedure TJvUIBStub.Invoke(MethodID: Integer);
|
|
begin
|
|
end;
|
|
|
|
//=== { TJvUIBConnection } ===================================================
|
|
|
|
procedure TJvUIBConnection.BeginWrite;
|
|
begin
|
|
Connection.OpenWriteBuffer;
|
|
end;
|
|
|
|
procedure TJvUIBConnection.EndWrite;
|
|
begin
|
|
Connection.CloseWriteBuffer;
|
|
end;
|
|
|
|
function TJvUIBConnection.ReadBoolean: Boolean;
|
|
begin
|
|
Connection.ReadBuffer(Result, SizeOf(Boolean));
|
|
end;
|
|
|
|
function TJvUIBConnection.ReadByte: Byte;
|
|
begin
|
|
Connection.ReadBuffer(Result, SizeOf(Byte));
|
|
end;
|
|
|
|
function TJvUIBConnection.ReadByteBool: ByteBool;
|
|
begin
|
|
Connection.ReadBuffer(Result, SizeOf(ByteBool));
|
|
end;
|
|
|
|
function TJvUIBConnection.ReadCardinal: Cardinal;
|
|
begin
|
|
Connection.ReadBuffer(Result, SizeOf(Cardinal));
|
|
end;
|
|
|
|
function TJvUIBConnection.ReadComp: Comp;
|
|
begin
|
|
Connection.ReadBuffer(Result, SizeOf(Comp));
|
|
end;
|
|
|
|
function TJvUIBConnection.ReadCurrency: Currency;
|
|
begin
|
|
Connection.ReadBuffer(Result, SizeOf(Currency));
|
|
end;
|
|
|
|
function TJvUIBConnection.ReadDouble: Double;
|
|
begin
|
|
Connection.ReadBuffer(Result, SizeOf(Double));
|
|
end;
|
|
|
|
function TJvUIBConnection.ReadExtended: Extended;
|
|
begin
|
|
Connection.ReadBuffer(Result, SizeOf(Extended));
|
|
end;
|
|
|
|
function TJvUIBConnection.ReadGUID: TGUID;
|
|
begin
|
|
Connection.ReadBuffer(Result, SizeOf(TGUID));
|
|
end;
|
|
|
|
function TJvUIBConnection.ReadInt64: Int64;
|
|
begin
|
|
Connection.ReadBuffer(Result, SizeOf(Int64));
|
|
end;
|
|
|
|
function TJvUIBConnection.ReadInteger: Integer;
|
|
begin
|
|
Connection.ReadBuffer(Result, SizeOf(Integer));
|
|
end;
|
|
|
|
function TJvUIBConnection.ReadLongBool: LongBool;
|
|
begin
|
|
Connection.ReadBuffer(Result, 4);
|
|
end;
|
|
|
|
function TJvUIBConnection.ReadLongint: Longint;
|
|
begin
|
|
Connection.ReadBuffer(Result, SizeOf(Longint));
|
|
end;
|
|
|
|
function TJvUIBConnection.ReadLongword: Longword;
|
|
begin
|
|
Connection.ReadBuffer(Result, SizeOf(Longword));
|
|
end;
|
|
|
|
function TJvUIBConnection.ReadOleVariant(DeCompress: Boolean): OleVariant;
|
|
begin
|
|
Result := ReadVariant(DeCompress);
|
|
end;
|
|
|
|
function TJvUIBConnection.ReadPChar: PChar;
|
|
var
|
|
StrCount: Integer;
|
|
begin
|
|
Connection.ReadBuffer(StrCount, SizeOf(StrCount));
|
|
if StrCount > 0 then
|
|
begin
|
|
GetMem(Result, StrCount);
|
|
Connection.ReadBuffer(Result^, StrCount);
|
|
end
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
function TJvUIBConnection.ReadPVarArray(DeCompress: Boolean): PVarArray;
|
|
var
|
|
DataPtr: Pointer;
|
|
DimCount, Flags: Word;
|
|
ElementSize: Integer;
|
|
InBytes: Integer;
|
|
InBuf: Pointer;
|
|
begin
|
|
Connection.ReadBuffer(DimCount, SizeOf(DimCount));
|
|
Connection.ReadBuffer(Flags, SizeOf(Flags));
|
|
Connection.ReadBuffer(ElementSize, SizeOf(ElementSize));
|
|
SafeArrayAllocDescriptor(DimCount, Result);
|
|
Result.Flags := Flags;
|
|
Result.ElementSize := ElementSize;
|
|
Connection.ReadBuffer(Result.Bounds, 8 * DimCount);
|
|
SafeArrayAllocData(Result);
|
|
case DeCompress of
|
|
False:
|
|
begin
|
|
SafeArrayAccessData(Result, DataPtr);
|
|
try
|
|
Connection.ReadBuffer(DataPtr^, SafeArrayElementTotal(Result) * ElementSize);
|
|
finally
|
|
SafeArrayUnaccessData(Result);
|
|
end;
|
|
end;
|
|
True:
|
|
begin
|
|
Connection.ReadBuffer(InBytes, SizeOf(InBytes));
|
|
if InBytes > 0 then
|
|
begin
|
|
SafeArrayAccessData(Result, DataPtr);
|
|
GetMem(InBuf, InBytes);
|
|
try
|
|
Connection.ReadBuffer(InBuf^, InBytes);
|
|
DecompressToUserBuf(InBuf, InBytes, DataPtr, SafeArrayElementTotal(Result) * ElementSize);
|
|
finally
|
|
FreeMem(InBuf, InBytes);
|
|
SafeArrayUnaccessData(Result);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
function TJvUIBConnection.ReadPWideChar: PWideChar;
|
|
var
|
|
StrCount: Integer;
|
|
begin
|
|
Connection.ReadBuffer(StrCount, SizeOf(StrCount));
|
|
if StrCount > 0 then
|
|
begin
|
|
GetMem(Result, StrCount);
|
|
Connection.ReadBuffer(Result^, StrCount);
|
|
end
|
|
else
|
|
Result := nil;
|
|
end;
|
|
|
|
function TJvUIBConnection.ReadReal48: Real48;
|
|
begin
|
|
Connection.ReadBuffer(Result, SizeOf(Real48));
|
|
end;
|
|
|
|
function TJvUIBConnection.ReadShortint: Shortint;
|
|
begin
|
|
Connection.ReadBuffer(Result, SizeOf(Shortint));
|
|
end;
|
|
|
|
function TJvUIBConnection.ReadSingle: Single;
|
|
begin
|
|
Connection.ReadBuffer(Result, SizeOf(Single));
|
|
end;
|
|
|
|
function TJvUIBConnection.ReadSmallint: Smallint;
|
|
begin
|
|
Connection.ReadBuffer(Result, SizeOf(Smallint));
|
|
end;
|
|
|
|
procedure TJvUIBConnection.ReadStream(Stream: TStream; DeCompress: Boolean = False);
|
|
var
|
|
InPutBuffer, OutPutBuffer: Pointer;
|
|
InPutSize, OutPutSize: Integer;
|
|
begin
|
|
if DeCompress then
|
|
begin
|
|
InPutSize := ReadInteger;
|
|
OutPutSize := ReadInteger;
|
|
getmem(InPutBuffer, InPutSize);
|
|
GetMem(OutPutBuffer, OutPutSize);
|
|
Connection.ReadBuffer(InPutBuffer^, InPutSize);
|
|
DecompressToUserBuf(InPutBuffer, InPutSize, OutPutBuffer, OutPutSize);
|
|
FreeMem(InPutBuffer, InPutSize);
|
|
Stream.Seek(0, soFromBeginning);
|
|
Stream.Write(OutPutBuffer^, OutPutSize);
|
|
FreeMem(OutPutBuffer, OutPutSize);
|
|
end
|
|
else
|
|
Connection.ReadStream(Stream, ReadInteger);
|
|
end;
|
|
|
|
function TJvUIBConnection.ReadString: string;
|
|
var
|
|
StrCount: Integer;
|
|
begin
|
|
Connection.ReadBuffer(StrCount, SizeOf(StrCount));
|
|
if StrCount > 0 then
|
|
begin
|
|
SetLength(Result, StrCount);
|
|
Connection.ReadBuffer(Result[1], StrCount);
|
|
end;
|
|
end;
|
|
|
|
function TJvUIBConnection.ReadVariant(DeCompress: Boolean): Variant;
|
|
begin
|
|
VarClear(Result);
|
|
Connection.ReadBuffer(TVarData(Result).VType, 2);
|
|
// (rom) why not call the Read* methods?
|
|
case TVarData(Result).VType of
|
|
varEmpty:
|
|
{Nothing to do};
|
|
varNull:
|
|
{Nothing to do};
|
|
varSmallInt:
|
|
Connection.ReadBuffer(TVarData(Result).VSmallInt, SizeOf(Smallint));
|
|
varInteger:
|
|
Connection.ReadBuffer(TVarData(Result).VInteger, SizeOf(Integer));
|
|
varSingle:
|
|
Connection.ReadBuffer(TVarData(Result).VSingle, SizeOf(Single));
|
|
varDouble:
|
|
Connection.ReadBuffer(TVarData(Result).VDouble, SizeOf(Double));
|
|
varCurrency:
|
|
Connection.ReadBuffer(TVarData(Result).VCurrency, SizeOf(Currency));
|
|
varDate:
|
|
Connection.ReadBuffer(TVarData(Result).VDate, SizeOf(TDate));
|
|
varOleStr:
|
|
TVarData(Result).VOleStr := ReadPWideChar;
|
|
varBoolean:
|
|
// (rom) Beware! Size inconsistency!
|
|
Connection.ReadBuffer(TVarData(Result).VBoolean, 2);
|
|
{$IFDEF DELPHI6_UP}
|
|
varShortInt:
|
|
Connection.ReadBuffer(TVarData(Result).VShortInt, SizeOf(Shortint));
|
|
varWord:
|
|
Connection.ReadBuffer(TVarData(Result).VWord, SizeOf(Word));
|
|
varLongWord:
|
|
Connection.ReadBuffer(TVarData(Result).VLongWord, SizeOf(Longword));
|
|
varInt64:
|
|
Connection.ReadBuffer(TVarData(Result).VInt64, SizeOf(Int64));
|
|
{$ENDIF DELPHI6_UP}
|
|
varByte:
|
|
Connection.ReadBuffer(TVarData(Result).VByte, SizeOf(Byte));
|
|
varString:
|
|
TVarData(Result).VString := ReadPChar;
|
|
else
|
|
if TVarData(Result).VType and varArray = varArray then
|
|
TVarData(Result).VArray := ReadPVarArray(DeCompress)
|
|
else
|
|
raise EJvUIBException.Create(EJvUIB_DataType);
|
|
end
|
|
end;
|
|
|
|
function TJvUIBConnection.ReadWideString: WideString;
|
|
var
|
|
StrCount: Integer;
|
|
begin
|
|
Connection.ReadBuffer(StrCount, SizeOf(StrCount));
|
|
if StrCount > 0 then
|
|
begin
|
|
SetLength(Result, StrCount);
|
|
Connection.ReadBuffer(Result[1], StrCount * SizeOf(WideChar));
|
|
end;
|
|
end;
|
|
|
|
function TJvUIBConnection.ReadWord: Word;
|
|
begin
|
|
Connection.ReadBuffer(Result, SizeOf(Word));
|
|
end;
|
|
|
|
function TJvUIBConnection.ReadWordBool: WordBool;
|
|
begin
|
|
Connection.ReadBuffer(Result, SizeOf(WordBool));
|
|
end;
|
|
|
|
procedure TJvUIBConnection.WriteBoolean(Value: Boolean);
|
|
begin
|
|
Connection.WriteBuffer(Value, SizeOf(Boolean));
|
|
end;
|
|
|
|
procedure TJvUIBConnection.WriteByte(Value: Byte);
|
|
begin
|
|
Connection.WriteBuffer(Value, SizeOf(Byte));
|
|
end;
|
|
|
|
procedure TJvUIBConnection.WriteByteBool(Value: ByteBool);
|
|
begin
|
|
Connection.WriteBuffer(Value, SizeOf(ByteBool));
|
|
end;
|
|
|
|
procedure TJvUIBConnection.WriteCardinal(Value: Cardinal);
|
|
begin
|
|
Connection.WriteBuffer(Value, SizeOf(Cardinal));
|
|
end;
|
|
|
|
procedure TJvUIBConnection.WriteComp(Value: Comp);
|
|
begin
|
|
Connection.WriteBuffer(Value, SizeOf(Comp));
|
|
end;
|
|
|
|
procedure TJvUIBConnection.WriteCurrency(Value: Currency);
|
|
begin
|
|
Connection.WriteBuffer(Value, SizeOf(Currency));
|
|
end;
|
|
|
|
procedure TJvUIBConnection.WriteDouble(Value: Double);
|
|
begin
|
|
Connection.WriteBuffer(Value, SizeOf(Double));
|
|
end;
|
|
|
|
procedure TJvUIBConnection.WriteExtended(Value: Extended);
|
|
begin
|
|
Connection.WriteBuffer(Value, SizeOf(Extended));
|
|
end;
|
|
|
|
procedure TJvUIBConnection.WriteGUID(Value: TGUID);
|
|
begin
|
|
Connection.WriteBuffer(Value, SizeOf(TGUID));
|
|
end;
|
|
|
|
procedure TJvUIBConnection.WriteInt64(Value: Int64);
|
|
begin
|
|
Connection.WriteBuffer(Value, SizeOf(Int64));
|
|
end;
|
|
|
|
procedure TJvUIBConnection.WriteInteger(Value: Integer);
|
|
begin
|
|
Connection.WriteBuffer(Value, SizeOf(Integer));
|
|
end;
|
|
|
|
procedure TJvUIBConnection.WriteLongBool(Value: LongBool);
|
|
begin
|
|
Connection.WriteBuffer(Value, SizeOf(LongBool));
|
|
end;
|
|
|
|
procedure TJvUIBConnection.WriteLongint(Value: Longint);
|
|
begin
|
|
Connection.WriteBuffer(Value, SizeOf(Longint));
|
|
end;
|
|
|
|
procedure TJvUIBConnection.WriteLongword(Value: Longword);
|
|
begin
|
|
Connection.WriteBuffer(Value, SizeOf(Longword));
|
|
end;
|
|
|
|
procedure TJvUIBConnection.WriteOleVariant(var Value: OleVariant; Compress: Boolean);
|
|
begin
|
|
WriteVariant(Variant(Value), Compress);
|
|
end;
|
|
|
|
procedure TJvUIBConnection.WritePChar(Value: PChar);
|
|
var
|
|
StrCount: Integer;
|
|
begin
|
|
StrCount := Length(Value);
|
|
Connection.WriteBuffer(StrCount, SizeOf(StrCount));
|
|
if StrCount > 0 then
|
|
Connection.WriteBuffer(Value[1], StrCount);
|
|
end;
|
|
|
|
procedure TJvUIBConnection.WritePVarArray(Value: PVarArray; Compress: Boolean);
|
|
var
|
|
DataPtr: Pointer;
|
|
OutBuf: Pointer;
|
|
OutBytes: Integer;
|
|
begin
|
|
OutBytes := 0;
|
|
OutBuf := nil;
|
|
SafeArrayAccessData(Value, DataPtr);
|
|
try
|
|
Connection.WriteBuffer(Value^, 8); // DimCount + Flags + ElementSize
|
|
Connection.WriteBuffer(Value^.Bounds, 8 * Value.DimCount); // Bounds
|
|
case Compress of
|
|
False:
|
|
Connection.WriteBuffer(DataPtr^, SafeArrayElementTotal(Value) * Value.ElementSize);
|
|
True:
|
|
begin
|
|
CompressBuf(DataPtr, SafeArrayElementTotal(Value) * Value.ElementSize, OutBuf, OutBytes);
|
|
Connection.WriteBuffer(OutBytes, SizeOf(OutBytes));
|
|
if OutBytes > 0 then
|
|
begin
|
|
Connection.WriteBuffer(OutBuf^, OutBytes);
|
|
FreeMem(OutBuf, OutBytes);
|
|
end;
|
|
end;
|
|
end;
|
|
finally
|
|
SafeArrayUnaccessData(Value);
|
|
end;
|
|
end;
|
|
|
|
procedure TJvUIBConnection.WritePWideChar(Value: PWideChar);
|
|
var
|
|
StrCount: Integer;
|
|
begin
|
|
StrCount := Length(Value) * 2 + 2;
|
|
Connection.WriteBuffer(StrCount, SizeOf(StrCount));
|
|
if StrCount > 0 then
|
|
Connection.WriteBuffer(Value[1], StrCount);
|
|
end;
|
|
|
|
procedure TJvUIBConnection.WriteReal48(Value: Real48);
|
|
begin
|
|
Connection.WriteBuffer(Value, SizeOf(Real48));
|
|
end;
|
|
|
|
procedure TJvUIBConnection.WriteShortint(Value: Shortint);
|
|
begin
|
|
Connection.WriteBuffer(Value, SizeOf(Shortint));
|
|
end;
|
|
|
|
procedure TJvUIBConnection.WriteSingle(Value: Single);
|
|
begin
|
|
Connection.WriteBuffer(Value, SizeOf(Single));
|
|
end;
|
|
|
|
procedure TJvUIBConnection.WriteSmallint(Value: Smallint);
|
|
begin
|
|
Connection.WriteBuffer(Value, SizeOf(Smallint));
|
|
end;
|
|
|
|
procedure TJvUIBConnection.WriteStream(Stream: TStream; Compress: Boolean = False);
|
|
var
|
|
InPutBuffer, OutPutBuffer: Pointer;
|
|
InPutSize, OutPutSize: Integer;
|
|
begin
|
|
if Compress then
|
|
begin
|
|
InPutSize := Stream.Size;
|
|
GetMem(InPutBuffer, InPutSize);
|
|
Stream.Seek(0, soFromBeginning);
|
|
Stream.Read(InPutBuffer^, InPutSize);
|
|
CompressBuf(InPutBuffer, InPutSize, OutPutBuffer, OutPutSize);
|
|
FreeMem(InPutBuffer, InPutSize);
|
|
WriteInteger(OutPutSize);
|
|
WriteInteger(InPutSize);
|
|
Connection.WriteBuffer(OutPutBuffer^, OutPutSize);
|
|
freemem(OutPutBuffer, OutPutSize);
|
|
end
|
|
else
|
|
begin
|
|
WriteInteger(Stream.Size);
|
|
Connection.WriteStream(Stream);
|
|
end;
|
|
end;
|
|
|
|
procedure TJvUIBConnection.WriteString(Value: string);
|
|
var
|
|
StrCount: Integer;
|
|
begin
|
|
StrCount := Length(Value);
|
|
Connection.WriteBuffer(StrCount, SizeOf(StrCount));
|
|
if StrCount > 0 then
|
|
Connection.WriteBuffer(Value[1], StrCount);
|
|
end;
|
|
|
|
procedure TJvUIBConnection.WriteVariant(var Value: Variant;
|
|
Compress: Boolean);
|
|
begin
|
|
Connection.WriteBuffer(TVarData(Value).VType, 2);
|
|
// (rom) why not call the Write* methods here?
|
|
case TVarData(Value).VType of
|
|
varEmpty:
|
|
{Nothing to do};
|
|
varNull:
|
|
{Nothing to do};
|
|
varSmallInt:
|
|
Connection.WriteBuffer(TVarData(Value).VSmallInt, SizeOf(Smallint));
|
|
varInteger:
|
|
Connection.WriteBuffer(TVarData(Value).VInteger, SizeOf(Integer));
|
|
varSingle:
|
|
Connection.WriteBuffer(TVarData(Value).VSingle, SizeOf(Single));
|
|
varDouble:
|
|
Connection.WriteBuffer(TVarData(Value).VDouble, SizeOf(Double));
|
|
varCurrency:
|
|
Connection.WriteBuffer(TVarData(Value).VCurrency, SizeOf(Currency));
|
|
varDate:
|
|
Connection.WriteBuffer(TVarData(Value).VDate, SizeOf(TDate));
|
|
varOleStr:
|
|
WritePWideChar(TVarData(Value).VOleStr);
|
|
varBoolean:
|
|
// (rom) Beware! Size inconsistency!
|
|
Connection.WriteBuffer(TVarData(Value).VBoolean, 2);
|
|
{$IFDEF DELPHI6_UP}
|
|
varShortInt:
|
|
Connection.WriteBuffer(TVarData(Value).VShortInt, SizeOf(Shortint));
|
|
varWord:
|
|
Connection.WriteBuffer(TVarData(Value).VWord, SizeOf(Word));
|
|
varLongWord:
|
|
Connection.WriteBuffer(TVarData(Value).VLongWord, SizeOf(Longword));
|
|
varInt64:
|
|
Connection.WriteBuffer(TVarData(Value).VInt64, SizeOf(Int64));
|
|
{$ENDIF DELPHI6_UP}
|
|
varByte:
|
|
Connection.WriteBuffer(TVarData(Value).VByte, SizeOf(Byte));
|
|
varString:
|
|
WritePChar(TVarData(Value).VString);
|
|
else
|
|
if TVarData(Value).VType and varArray = varArray then
|
|
WritePVarArray(TVarData(Value).VArray, Compress)
|
|
else
|
|
raise EJvUIBException.Create(EJvUIB_DataType);
|
|
end;
|
|
end;
|
|
|
|
procedure TJvUIBConnection.WriteWideString(Value: WideString);
|
|
var
|
|
StrCount: Integer;
|
|
begin
|
|
StrCount := Length(Value);
|
|
Connection.WriteBuffer(StrCount, SizeOf(StrCount));
|
|
if StrCount > 0 then
|
|
Connection.WriteBuffer(Value[1], StrCount * SizeOf(WideChar));
|
|
end;
|
|
|
|
procedure TJvUIBConnection.WriteWord(Value: Word);
|
|
begin
|
|
Connection.WriteBuffer(Value, SizeOf(Word));
|
|
end;
|
|
|
|
procedure TJvUIBConnection.WriteWordBool(Value: WordBool);
|
|
begin
|
|
Connection.WriteBuffer(Value, SizeOf(WordBool));
|
|
end;
|
|
|
|
{$IFDEF USEJVCL}
|
|
{$IFDEF UNITVERSIONING}
|
|
initialization
|
|
RegisterUnitVersion(HInstance, UnitVersioning);
|
|
|
|
finalization
|
|
UnregisterUnitVersion(HInstance);
|
|
{$ENDIF UNITVERSIONING}
|
|
{$ENDIF USEJVCL}
|
|
|
|
end.
|
|
|