Use TByteDynArray instead of string for raw buffer

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@771 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
inoussa 2009-04-07 16:24:41 +00:00
parent d673332bf8
commit 8650ae4029
7 changed files with 92 additions and 168 deletions

View File

@ -30,13 +30,14 @@ Type
TInt64S = Int64; TInt64U = QWord;
TBoolData = Boolean;
TEnumData = Int64;
TAnsiStringData = AnsiString;
TAnsiStringData = TBinaryString;
TWideStringData = WideString;
{$IFDEF WST_UNICODESTRING}
TUnicodeStringData = UnicodeString;
{$ENDIF WST_UNICODESTRING}
TAnsiCharacter = AnsiChar;
TWideCharacter = WideChar;
TByteDynArray = wst_types.TByteDynArray;
TFloat_Single_4 = Single;
TFloat_Double_8 = Double;
@ -66,6 +67,7 @@ Type
{$IFDEF WST_UNICODESTRING}
procedure WriteUnicodeStr(Const AData : TUnicodeStringData);
{$ENDIF WST_UNICODESTRING}
procedure WriteBinary(const AData : TByteDynArray);
procedure WriteSingle(Const AData : TFloat_Single_4);
procedure WriteDouble(Const AData : TFloat_Double_8);
@ -97,6 +99,7 @@ Type
{$IFDEF WST_UNICODESTRING}
function ReadUnicodeStr():TUnicodeStringData;
{$ENDIF WST_UNICODESTRING}
function ReadBinary() : TByteDynArray;
function ReadSingle():TFloat_Single_4;
function ReadDouble():TFloat_Double_8;
@ -231,6 +234,7 @@ Type
{$IFDEF WST_UNICODESTRING}
procedure WriteUnicodeStr(Const AData : TUnicodeStringData);
{$ENDIF WST_UNICODESTRING}
procedure WriteBinary(const AData : TByteDynArray);
procedure WriteSingle(Const AData : TFloat_Single_4);
procedure WriteDouble(Const AData : TFloat_Double_8);
@ -268,6 +272,7 @@ Type
{$IFDEF WST_UNICODESTRING}
function ReadUnicodeStr():TUnicodeStringData;
{$ENDIF WST_UNICODESTRING}
function ReadBinary() : TByteDynArray;
function ReadSingle():TFloat_Single_4;
function ReadDouble():TFloat_Double_8;
@ -437,6 +442,16 @@ begin
end;
end;
procedure TDataStore.WriteBinary(const AData : TByteDynArray);
var
i : TInt32S;
begin
i := Length(AData);
WriteInt32S(i);
if ( i > 0 ) then
FStream.Write(AData[1],i);
end;
{$IFDEF WST_UNICODESTRING}
procedure TDataStore.WriteUnicodeStr(const AData: TUnicodeStringData);
@ -615,6 +630,16 @@ begin
end;
end;
function TDataStoreReader.ReadBinary() : TByteDynArray;
var
i : TInt32S;
begin
i := ReadInt32S();
SetLength(Result,i);
if ( i > 0 ) then
FStream.ReadBuffer(Result[1],i);
end;
{$IFDEF WST_UNICODESTRING}
function TDataStoreReader.ReadUnicodeStr(): TUnicodeStringData;
var

View File

@ -113,7 +113,7 @@ procedure TTCPTransport.SendAndReceive(ARequest, AResponse: TStream);
var
wrtr : IDataStore;
buffStream : TMemoryStream;
strBuff : TBinaryString;
binBuff : TByteDynArray;
bufferLen : LongInt;
begin
buffStream := TMemoryStream.Create();
@ -123,10 +123,10 @@ begin
wrtr.WriteAnsiStr(Target);
wrtr.WriteAnsiStr(ContentType);
wrtr.WriteAnsiStr(Self.Format);
SetLength(strBuff,ARequest.Size);
SetLength(binBuff,ARequest.Size);
ARequest.Position := 0;
ARequest.Read(strBuff[1],Length(strBuff));
wrtr.WriteAnsiStr(strBuff);
ARequest.Read(binBuff[1],Length(binBuff));
wrtr.WriteBinary(binBuff);
buffStream.Position := 0;
wrtr.WriteInt32S(buffStream.Size-4);
buffStream.Position := 0;

View File

@ -139,7 +139,8 @@ var
locInStream, locOutStream : TMemoryStream;
wrtr : IDataStore;
rdr : IDataStoreReader;
buff, trgt,ctntyp, frmt : TBinaryString;
trgt,ctntyp, frmt : TBinaryString;
buff : TByteDynArray;
rqst : IRequestBuffer;
i : PtrUInt;
begin
@ -160,7 +161,7 @@ begin
trgt := rdr.ReadAnsiStr();
ctntyp := rdr.ReadAnsiStr();
frmt := rdr.ReadAnsiStr();
buff := rdr.ReadAnsiStr();
buff := rdr.ReadBinary();
{$IFDEF WST_DBG}
WriteLn(buff);
@ -169,6 +170,7 @@ begin
rdr := nil;
locInStream.Size := 0;
locInStream.Write(buff[1],Length(buff));
SetLength(buff,0);
locInStream.Position := 0;
rqst := TRequestBuffer.Create(trgt,ctntyp,locInStream,locOutStream,frmt);
rqst.GetPropertyManager().SetProperty(sREMOTE_IP,AContext.Binding.PeerIP);
@ -180,7 +182,7 @@ begin
locOutStream.Read(buff[1],i);
locOutStream.Size := 0;
wrtr := CreateBinaryWriter(locOutStream);
wrtr.WriteAnsiStr(buff);
wrtr.WriteBinary(buff);
locOutStream.Position := 0;
{$IFDEF INDY_10}
AContext.Connection.IOHandler.Write(locOutStream,locOutStream.Size,False);

View File

@ -13,7 +13,6 @@
<TargetFileExt Value=".exe"/>
<Icon Value="0"/>
<UseXPManifest Value="True"/>
<ActiveEditorIndexAtStart Value="0"/>
</General>
<VersionInfo>
<ProjectVersion Value=""/>
@ -38,16 +37,14 @@
<PackageName Value="wst_core"/>
</Item2>
</RequiredPackages>
<Units Count="10">
<Units Count="14">
<Unit0>
<Filename Value="ws_client.pas"/>
<IsPartOfProject Value="True"/>
<UnitName Value="ws_client"/>
<CursorPos X="13" Y="8"/>
<TopLine Value="1"/>
<EditorIndex Value="0"/>
<UsageCount Value="29"/>
<Loaded Value="True"/>
<CursorPos X="3" Y="26"/>
<TopLine Value="16"/>
<UsageCount Value="30"/>
</Unit0>
<Unit1>
<Filename Value="echo_service_proxy.pas"/>
@ -55,9 +52,7 @@
<UnitName Value="echo_service_proxy"/>
<CursorPos X="3" Y="35"/>
<TopLine Value="31"/>
<EditorIndex Value="4"/>
<UsageCount Value="29"/>
<Loaded Value="True"/>
<UsageCount Value="30"/>
</Unit1>
<Unit2>
<Filename Value="echo_service.pas"/>
@ -65,36 +60,28 @@
<UnitName Value="echo_service"/>
<CursorPos X="3" Y="25"/>
<TopLine Value="14"/>
<EditorIndex Value="6"/>
<UsageCount Value="29"/>
<Loaded Value="True"/>
<UsageCount Value="30"/>
</Unit2>
<Unit3>
<Filename Value="..\..\..\synapse_tcp_protocol.pas"/>
<UnitName Value="synapse_tcp_protocol"/>
<CursorPos X="1" Y="74"/>
<TopLine Value="69"/>
<EditorIndex Value="3"/>
<CursorPos X="41" Y="151"/>
<TopLine Value="148"/>
<UsageCount Value="15"/>
<Loaded Value="True"/>
</Unit3>
<Unit4>
<Filename Value="..\..\..\soap_formatter.pas"/>
<UnitName Value="soap_formatter"/>
<CursorPos X="1" Y="235"/>
<TopLine Value="224"/>
<EditorIndex Value="2"/>
<UsageCount Value="15"/>
<Loaded Value="True"/>
</Unit4>
<Unit5>
<Filename Value="..\..\..\service_intf.pas"/>
<UnitName Value="service_intf"/>
<CursorPos X="1" Y="221"/>
<TopLine Value="210"/>
<EditorIndex Value="5"/>
<UsageCount Value="14"/>
<Loaded Value="True"/>
</Unit5>
<Unit6>
<Filename Value="E:\lazarus26r2.2.2.2\fpc\2.2.2\source\rtl\objpas\sysutils\sysutilh.inc"/>
@ -113,9 +100,7 @@
<Filename Value="E:\lazarus26r2.2.2.2\fpc\2.2.2\source\rtl\inc\wstringh.inc"/>
<CursorPos X="20" Y="87"/>
<TopLine Value="74"/>
<EditorIndex Value="1"/>
<UsageCount Value="14"/>
<Loaded Value="True"/>
</Unit8>
<Unit9>
<Filename Value="E:\lazarus26r2.2.2.2\fpc\2.2.2\source\rtl\inc\systemh.inc"/>
@ -123,129 +108,36 @@
<TopLine Value="223"/>
<UsageCount Value="9"/>
</Unit9>
<Unit10>
<Filename Value="..\..\..\wst_types.pas"/>
<UnitName Value="wst_types"/>
<CursorPos X="16" Y="30"/>
<TopLine Value="16"/>
<UsageCount Value="10"/>
</Unit10>
<Unit11>
<Filename Value="..\..\..\indy_tcp_protocol.pas"/>
<UnitName Value="indy_tcp_protocol"/>
<CursorPos X="69" Y="148"/>
<TopLine Value="137"/>
<UsageCount Value="10"/>
</Unit11>
<Unit12>
<Filename Value="..\..\..\synapse_http_protocol.pas"/>
<UnitName Value="synapse_http_protocol"/>
<CursorPos X="15" Y="56"/>
<TopLine Value="45"/>
<UsageCount Value="10"/>
</Unit12>
<Unit13>
<Filename Value="..\..\..\indy_http_protocol.pas"/>
<UnitName Value="indy_http_protocol"/>
<CursorPos X="3" Y="147"/>
<TopLine Value="143"/>
<UsageCount Value="10"/>
</Unit13>
</Units>
<JumpHistory Count="30" HistoryIndex="29">
<Position1>
<Filename Value="..\..\..\service_intf.pas"/>
<Caret Line="220" Column="1" TopLine="209"/>
</Position1>
<Position2>
<Filename Value="..\..\..\service_intf.pas"/>
<Caret Line="436" Column="1" TopLine="425"/>
</Position2>
<Position3>
<Filename Value="..\..\..\service_intf.pas"/>
<Caret Line="437" Column="1" TopLine="426"/>
</Position3>
<Position4>
<Filename Value="..\..\..\service_intf.pas"/>
<Caret Line="438" Column="1" TopLine="427"/>
</Position4>
<Position5>
<Filename Value="..\..\..\service_intf.pas"/>
<Caret Line="221" Column="1" TopLine="210"/>
</Position5>
<Position6>
<Filename Value="..\..\..\soap_formatter.pas"/>
<Caret Line="225" Column="13" TopLine="206"/>
</Position6>
<Position7>
<Filename Value="..\..\..\soap_formatter.pas"/>
<Caret Line="220" Column="1" TopLine="209"/>
</Position7>
<Position8>
<Filename Value="..\..\..\synapse_tcp_protocol.pas"/>
<Caret Line="106" Column="1" TopLine="95"/>
</Position8>
<Position9>
<Filename Value="..\..\..\synapse_tcp_protocol.pas"/>
<Caret Line="107" Column="1" TopLine="96"/>
</Position9>
<Position10>
<Filename Value="..\..\..\synapse_tcp_protocol.pas"/>
<Caret Line="108" Column="1" TopLine="97"/>
</Position10>
<Position11>
<Filename Value="..\..\..\soap_formatter.pas"/>
<Caret Line="235" Column="1" TopLine="224"/>
</Position11>
<Position12>
<Filename Value="..\..\..\synapse_tcp_protocol.pas"/>
<Caret Line="134" Column="1" TopLine="123"/>
</Position12>
<Position13>
<Filename Value="..\..\..\synapse_tcp_protocol.pas"/>
<Caret Line="74" Column="1" TopLine="63"/>
</Position13>
<Position14>
<Filename Value="ws_client.pas"/>
<Caret Line="18" Column="72" TopLine="6"/>
</Position14>
<Position15>
<Filename Value="ws_client.pas"/>
<Caret Line="27" Column="44" TopLine="8"/>
</Position15>
<Position16>
<Filename Value="ws_client.pas"/>
<Caret Line="30" Column="26" TopLine="15"/>
</Position16>
<Position17>
<Filename Value="E:\lazarus26r2.2.2.2\fpc\2.2.2\source\rtl\inc\wstringh.inc"/>
<Caret Line="85" Column="52" TopLine="74"/>
</Position17>
<Position18>
<Filename Value="ws_client.pas"/>
<Caret Line="27" Column="19" TopLine="6"/>
</Position18>
<Position19>
<Filename Value="ws_client.pas"/>
<Caret Line="24" Column="25" TopLine="14"/>
</Position19>
<Position20>
<Filename Value="ws_client.pas"/>
<Caret Line="23" Column="5" TopLine="15"/>
</Position20>
<Position21>
<Filename Value="ws_client.pas"/>
<Caret Line="32" Column="41" TopLine="22"/>
</Position21>
<Position22>
<Filename Value="ws_client.pas"/>
<Caret Line="33" Column="1" TopLine="22"/>
</Position22>
<Position23>
<Filename Value="ws_client.pas"/>
<Caret Line="16" Column="1" TopLine="11"/>
</Position23>
<Position24>
<Filename Value="ws_client.pas"/>
<Caret Line="32" Column="1" TopLine="21"/>
</Position24>
<Position25>
<Filename Value="ws_client.pas"/>
<Caret Line="33" Column="39" TopLine="22"/>
</Position25>
<Position26>
<Filename Value="ws_client.pas"/>
<Caret Line="37" Column="9" TopLine="22"/>
</Position26>
<Position27>
<Filename Value="ws_client.pas"/>
<Caret Line="33" Column="1" TopLine="22"/>
</Position27>
<Position28>
<Filename Value="ws_client.pas"/>
<Caret Line="13" Column="30" TopLine="2"/>
</Position28>
<Position29>
<Filename Value="ws_client.pas"/>
<Caret Line="15" Column="3" TopLine="1"/>
</Position29>
<Position30>
<Filename Value="ws_client.pas"/>
<Caret Line="11" Column="4" TopLine="11"/>
</Position30>
</JumpHistory>
<JumpHistory Count="0" HistoryIndex="-1"/>
</ProjectOptions>
<CompilerOptions>
<Version Value="8"/>

View File

@ -7,7 +7,7 @@ uses
cthreads, cwstring,
{$ENDIF}
Classes, SysUtils,
service_intf, soap_formatter, synapse_http_protocol,
service_intf, soap_formatter, synapse_http_protocol, //synapse_tcp_protocol,
echo_service, echo_service_proxy;
const
@ -21,8 +21,10 @@ var
c : Integer;
begin
SYNAPSE_RegisterHTTP_Transport();
//SYNAPSE_RegisterTCP_Transport();
locService := wst_CreateInstance_IEchoService('SOAP:','HTTP:','http://127.0.0.1:8000/services/IEchoService');
//locService := wst_CreateInstance_IEchoService('SOAP:','TCP:Port=1234;Target=IEchoService;','127.0.0.1');
WriteLn('WST WideString Sample - Client');

View File

@ -111,7 +111,7 @@ procedure TTCPTransport.SendAndReceive(ARequest, AResponse: TStream);
Var
wrtr : IDataStore;
buffStream : TMemoryStream;
strBuff : TBinaryString;
binBuff : TByteDynArray;
bufferLen : LongInt;
i, j, c : PtrInt;
begin
@ -122,10 +122,10 @@ begin
wrtr.WriteAnsiStr(Target);
wrtr.WriteAnsiStr(ContentType);
wrtr.WriteAnsiStr(Self.Format);
SetLength(strBuff,ARequest.Size);
SetLength(binBuff,ARequest.Size);
ARequest.Position := 0;
ARequest.Read(strBuff[1],Length(strBuff));
wrtr.WriteAnsiStr(strBuff);
ARequest.Read(binBuff[1],Length(binBuff));
wrtr.WriteBinary(binBuff);
buffStream.Position := 0;
wrtr.WriteInt32S(buffStream.Size-4);
@ -144,11 +144,11 @@ begin
i := 1024;
if ( i > bufferLen ) then
i := bufferLen;
SetLength(strBuff,i);
SetLength(binBuff,i);
repeat
j := FConnection.RecvBufferEx(@(strBuff[1]),i,DefaultTimeOut);
j := FConnection.RecvBufferEx(@(binBuff[1]),i,DefaultTimeOut);
FConnection.ExceptCheck();
AResponse.Write(strBuff[1],j);
AResponse.Write(binBuff[1],j);
Inc(c,j);
i := Min(1024,(bufferLen-c));
until ( i =0 ) or ( j <= 0 );

View File

@ -99,7 +99,7 @@ end;
function TClientHandlerThread.ReadInputBuffer(): Integer;
var
strBuff : TBinaryString;
binBuff : TByteDynArray;
bufferLen : LongInt;
i, j, c, readBufferLen : PtrInt;
begin
@ -119,11 +119,11 @@ begin
i := 1024;
if ( i > bufferLen ) then
i := bufferLen;
SetLength(strBuff,i);
SetLength(binBuff,i);
repeat
j := FSocketObject.RecvBufferEx(@(strBuff[1]),i,DefaultTimeOut);
j := FSocketObject.RecvBufferEx(@(binBuff[1]),i,DefaultTimeOut);
FSocketObject.ExceptCheck();
FInputStream.Write(strBuff[1],j);
FInputStream.Write(binBuff[1],j);
Inc(c,j);
if ( ( bufferLen - c ) > 1024 ) then
i := 1024
@ -173,7 +173,8 @@ procedure TClientHandlerThread.Execute();
var
wrtr : IDataStore;
rdr : IDataStoreReader;
buff, trgt,ctntyp, frmt : TBinaryString;
trgt,ctntyp, frmt : TBinaryString;
buff : TByteDynArray;
rqst : IRequestBuffer;
i : PtrUInt;
begin
@ -196,10 +197,11 @@ begin
trgt := rdr.ReadAnsiStr();
ctntyp := rdr.ReadAnsiStr();
frmt := rdr.ReadAnsiStr();
buff := rdr.ReadAnsiStr();
buff := rdr.ReadBinary();
rdr := nil;
FInputStream.Size := 0;
FInputStream.Write(buff[1],Length(buff));
SetLength(buff,0);
FInputStream.Position := 0;
rqst := TRequestBuffer.Create(trgt,ctntyp,FInputStream,FOutputStream,frmt);
rqst.GetPropertyManager().SetProperty(sREMOTE_IP,FSocketObject.GetRemoteSinIP());
@ -211,7 +213,8 @@ begin
FOutputStream.Read(buff[1],i);
FOutputStream.Size := 0;
wrtr := CreateBinaryWriter(FOutputStream);
wrtr.WriteAnsiStr(buff);
wrtr.WriteBinary(buff);
SetLength(buff,0);
SendOutputBuffer();
ClearBuffers();
end;