From 812edb945c8e01956db925fe1e61c86edc16baad Mon Sep 17 00:00:00 2001 From: inoussa Date: Sat, 13 Sep 2008 15:18:03 +0000 Subject: [PATCH] Part 1 FPC UnicodeString support (+ test cases) WideString support (+ test cases) git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@555 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- wst/trunk/base_binary_formatter.pas | 257 ++++++++++++++++++++++++---- wst/trunk/base_json_formatter.pas | 132 ++++++++++++++ wst/trunk/base_service_intf.pas | 81 +++++++++ wst/trunk/base_soap_formatter.pas | 130 +++++++++++++- wst/trunk/base_xmlrpc_formatter.pas | 130 +++++++++++++- wst/trunk/binary_streamer.pas | 129 +++++++++++++- wst/trunk/ics_http_protocol.pas | 2 +- wst/trunk/ics_tcp_protocol.pas | 14 +- wst/trunk/indy_tcp_protocol.pas | 8 +- wst/trunk/indy_tcp_server.pas | 17 +- 10 files changed, 829 insertions(+), 71 deletions(-) diff --git a/wst/trunk/base_binary_formatter.pas b/wst/trunk/base_binary_formatter.pas index 91eb6bd3a..f6d50baa4 100644 --- a/wst/trunk/base_binary_formatter.pas +++ b/wst/trunk/base_binary_formatter.pas @@ -44,11 +44,18 @@ type dtInt64U, dtInt64S, dtBool, dtEnum, dtSingle, dtDouble, dtExtended, dtCurrency, - dtString, + dtAnsiString, dtWideString, +{$IFDEF WST_UNICODESTRING} + dtUnicodeString, +{$ENDIF WST_UNICODESTRING} dtObject, dtArray ); - PStringBuffer = ^TStringBuffer; + PAnsiStringBuffer = ^TAnsiStringBuffer; + PWideStringBuffer = ^TWideStringBuffer; +{$IFDEF WST_UNICODESTRING} + PUnicodeStringBuffer = ^TUnicodeStringBuffer; +{$ENDIF WST_UNICODESTRING} PObjectBuffer = ^TObjectBuffer; PArrayBuffer = ^TArrayBuffer; PDataBuffer = ^TDataBuffer; @@ -71,14 +78,30 @@ type dtExtended : ( ExtendedData : TFloat_Extended_10 ); dtCurrency : ( CurrencyData : TFloat_Currency_8 ); - dtString : ( StrData : PStringBuffer ); + dtAnsiString : ( AnsiStrData : PAnsiStringBuffer ); + dtWideString : ( WideStrData : PWideStringBuffer ); +{$IFDEF WST_UNICODESTRING} + dtUnicodeString : ( UnicodeStrData : PUnicodeStringBuffer ); +{$ENDIF WST_UNICODESTRING} dtObject : ( ObjectData : PObjectBuffer ); dtArray : ( ArrayData : PArrayBuffer ); End; - TStringBuffer = Record - Data : String; - End; + TAnsiStringBuffer = record + Data : TAnsiStringData; + end; + + TWideStringBuffer = record + Data : TWideStringData; + end; + +{$IFDEF WST_UNICODESTRING} + TUnicodeStringBuffer = record + Data : TUnicodeStringData; + end; +{$ENDIF WST_UNICODESTRING} + + PObjectBufferItem = ^TObjectBufferItem; TObjectBufferItem = Record @@ -203,11 +226,23 @@ type Const ATypeInfo : PTypeInfo; Const AData : TInt64S );{$IFDEF USE_INLINE}inline;{$ENDIF} - procedure PutStr( + procedure PutAnsiStr( Const AName : String; Const ATypeInfo : PTypeInfo; - Const AData : String + Const AData : AnsiString );{$IFDEF USE_INLINE}inline;{$ENDIF} + procedure PutWideStr( + Const AName : String; + Const ATypeInfo : PTypeInfo; + Const AData : WideString + );{$IFDEF USE_INLINE}inline;{$ENDIF} +{$IFDEF WST_UNICODESTRING} + procedure PutUnicodeStr( + Const AName : String; + Const ATypeInfo : PTypeInfo; + Const AData : UnicodeString + );{$IFDEF USE_INLINE}inline;{$ENDIF} +{$ENDIF WST_UNICODESTRING} procedure PutEnum( Const AName : String; Const ATypeInfo : PTypeInfo; @@ -260,11 +295,23 @@ type Var AName : String; Var AData : Int64 );{$IFDEF USE_INLINE}inline;{$ENDIF} - procedure GetStr( + procedure GetAnsiStr( Const ATypeInfo : PTypeInfo; Var AName : String; - Var AData : String + Var AData : AnsiString );{$IFDEF USE_INLINE}inline;{$ENDIF} + procedure GetWideStr( + const ATypeInfo : PTypeInfo; + var AName : String; + var AData : WideString + );{$IFDEF USE_INLINE}inline;{$ENDIF} +{$IFDEF WST_UNICODESTRING} + procedure GetUnicodeStr( + const ATypeInfo : PTypeInfo; + var AName : String; + var AData : UnicodeString + );{$IFDEF USE_INLINE}inline;{$ENDIF} +{$ENDIF WST_UNICODESTRING} procedure GetObj( Const ATypeInfo : PTypeInfo; Var AName : String; @@ -402,7 +449,11 @@ Begin dtExtended : APrinterProc( s + ARoot^.Name + ' = ' + FloatToStr(ARoot^.ExtendedData) ); dtCurrency : APrinterProc( s + ARoot^.Name + ' = ' + FloatToStr(ARoot^.CurrencyData) ); - dtString : APrinterProc( s + ARoot^.Name + ' = ' + ARoot^.StrData^.Data ); + dtAnsiString : APrinterProc( s + ARoot^.Name + ' = ' + ARoot^.AnsiStrData^.Data ); + dtWideString : APrinterProc( s + ARoot^.Name + ' = ' + ARoot^.WideStrData^.Data ); +{$IFDEF WST_UNICODESTRING} + dtUnicodeString : APrinterProc( s + ARoot^.Name + ' = ' + ARoot^.UnicodeStrData^.Data ); +{$ENDIF WST_UNICODESTRING} dtObject : Begin APrinterProc( s + ARoot^.Name + ' = '); @@ -494,13 +545,29 @@ begin Result^.Name := AName; Result^.DataType := ADataType; Case Result^.DataType Of - dtString : + dtAnsiString : Begin - i := SizeOf(TStringBuffer); - Result^.StrData := wst_GetMem(i); - FillChar(Result^.StrData^,i,#0); - Result^.StrData^.Data := ''; + i := SizeOf(TAnsiStringBuffer); + Result^.AnsiStrData := wst_GetMem(i); + FillChar(Result^.AnsiStrData^,i,#0); + Result^.AnsiStrData^.Data := ''; End; + dtWideString : + begin + i := SizeOf(TWideStringBuffer); + Result^.WideStrData := wst_GetMem(i); + FillChar(Result^.WideStrData^,i,#0); + Result^.WideStrData^.Data := ''; + end; +{$IFDEF WST_UNICODESTRING} + dtUnicodeString : + begin + i := SizeOf(TUnicodeStringBuffer); + Result^.UnicodeStrData := wst_GetMem(i); + FillChar(Result^.UnicodeStrData^,i,#0); + Result^.UnicodeStrData^.Data := ''; + end; +{$ENDIF WST_UNICODESTRING} dtObject : Begin Result^.ObjectData := wst_GetMem(SizeOf(TObjectBuffer)); @@ -559,7 +626,7 @@ Begin Exit; i := Ord(ARoot^.DataType); ADest.WriteInt32S(i); - ADest.WriteStr(ARoot^.Name); + ADest.WriteAnsiStr(ARoot^.Name); Case ARoot^.DataType Of dtInt8S : ADest.WriteInt8S(ARoot^.Int8S); dtInt8U : ADest.WriteInt8U(ARoot^.Int8U); @@ -575,7 +642,11 @@ Begin dtExtended : ADest.WriteExtended(ARoot^.ExtendedData); dtCurrency : ADest.WriteCurrency(ARoot^.CurrencyData); - dtString : ADest.WriteStr(ARoot^.StrData^.Data); + dtAnsiString : ADest.WriteAnsiStr(ARoot^.AnsiStrData^.Data); + dtWideString : ADest.WriteWideStr(ARoot^.WideStrData^.Data); +{$IFDEF WST_UNICODESTRING} + dtUnicodeString : ADest.WriteUnicodeStr(ARoot^.UnicodeStrData^.Data); +{$ENDIF WST_UNICODESTRING} dtBool : ADest.WriteBool(ARoot^.BoolData); dtEnum : ADest.WriteEnum(ARoot^.EnumData); dtObject : @@ -620,7 +691,7 @@ Begin If AStoreRdr.IsAtEof() Then Exit; i := AStoreRdr.ReadInt32S(); - s := AStoreRdr.ReadStr(); + s := AStoreRdr.ReadAnsiStr(); If ( TDataType(i) < dtArray ) Then Result := CreateObjBuffer(TDataType(i),s); Case TDataType(i) Of @@ -638,7 +709,11 @@ Begin dtExtended : Result^.ExtendedData := AStoreRdr.ReadExtended(); dtCurrency : Result^.CurrencyData := AStoreRdr.ReadCurrency(); - dtString : Result^.StrData^.Data := AStoreRdr.ReadStr(); + dtAnsiString : Result^.AnsiStrData^.Data := AStoreRdr.ReadAnsiStr(); + dtWideString : Result^.WideStrData^.Data := AStoreRdr.ReadWideStr(); +{$IFDEF WST_UNICODESTRING} + dtUnicodeString : Result^.UnicodeStrData^.Data := AStoreRdr.ReadUnicodeStr(); +{$ENDIF WST_UNICODESTRING} dtBool : Result^.BoolData := AStoreRdr.ReadBool(); dtEnum : Result^.EnumData := AStoreRdr.ReadEnum(); dtObject : @@ -698,12 +773,26 @@ Var Begin AOwner^.Name := ''; Case AOwner^.DataType Of - dtString : + dtAnsiString : Begin - AOwner^.StrData^.Data := ''; - Freemem(AOwner^.StrData); - AOwner^.StrData := Nil; + AOwner^.AnsiStrData^.Data := ''; + Freemem(AOwner^.AnsiStrData); + AOwner^.AnsiStrData := Nil; End; + dtWideString : + begin + AOwner^.WideStrData^.Data := ''; + Freemem(AOwner^.WideStrData); + AOwner^.WideStrData := Nil; + end; +{$IFDEF WST_UNICODESTRING} + dtUnicodeString : + begin + AOwner^.UnicodeStrData^.Data := ''; + Freemem(AOwner^.UnicodeStrData); + AOwner^.UnicodeStrData := Nil; + end; +{$ENDIF WST_UNICODESTRING} dtObject : Begin ClearObjectBuffer(AOwner^.ObjectData); @@ -915,15 +1004,35 @@ begin End; end; -procedure TBaseBinaryFormatter.PutStr( +procedure TBaseBinaryFormatter.PutAnsiStr( const AName : String; const ATypeInfo : PTypeInfo; - const AData : String + const AData : AnsiString ); begin - StackTop().CreateBuffer(AName,dtString)^.StrData^.Data := AData; + StackTop().CreateBuffer(AName,dtAnsiString)^.AnsiStrData^.Data := AData; end; +procedure TBaseBinaryFormatter.PutWideStr( + const AName: String; + const ATypeInfo: PTypeInfo; + const AData: WideString +); +begin + StackTop().CreateBuffer(AName,dtWideString)^.WideStrData^.Data := AData; +end; + +{$IFDEF WST_UNICODESTRING} +procedure TBaseBinaryFormatter.PutUnicodeStr( + const AName: String; + const ATypeInfo: PTypeInfo; + const AData: UnicodeString +); +begin + StackTop().CreateBuffer(AName,dtUnicodeString)^.UnicodeStrData^.Data := AData; +end; +{$ENDIF WST_UNICODESTRING} + procedure TBaseBinaryFormatter.PutEnum( const AName: String; const ATypeInfo: PTypeInfo; @@ -1043,15 +1152,35 @@ begin AData := GetDataBuffer(AName)^.Int64S; end; -procedure TBaseBinaryFormatter.GetStr( +procedure TBaseBinaryFormatter.GetAnsiStr( const ATypeInfo: PTypeInfo; var AName: String; - var AData: String + var AData: AnsiString ); begin - AData := GetDataBuffer(AName)^.StrData^.Data; + AData := GetDataBuffer(AName)^.AnsiStrData^.Data; end; +procedure TBaseBinaryFormatter.GetWideStr( + const ATypeInfo: PTypeInfo; + var AName: String; + var AData: WideString +); +begin + AData := GetDataBuffer(AName)^.WideStrData^.Data; +end; + +{$IFDEF WST_UNICODESTRING} +procedure TBaseBinaryFormatter.GetUnicodeStr( + const ATypeInfo: PTypeInfo; + var AName: String; + var AData: UnicodeString +); +begin + AData := GetDataBuffer(AName)^.UnicodeStrData^.Data; +end; +{$ENDIF WST_UNICODESTRING} + procedure TBaseBinaryFormatter.GetObj( const ATypeInfo: PTypeInfo; var AName: String; @@ -1194,18 +1323,34 @@ end; procedure TBaseBinaryFormatter.Put(const AName: String; const ATypeInfo: PTypeInfo;const AData); Var int64Data : Int64; - strData : string; + ansiStrData : AnsiString; objData : TObject; boolData : Boolean; enumData : TEnumData; floatDt : TFloat_Extended_10; + wideStrData : WideString; +{$IFDEF WST_UNICODESTRING} + unicodeStrData : UnicodeString; +{$ENDIF WST_UNICODESTRING} begin Case ATypeInfo^.Kind Of tkLString{$IFDEF FPC},tkAString{$ENDIF} : Begin - strData := String(AData); - PutStr(AName,ATypeInfo,strData); + ansiStrData := String(AData); + PutAnsiStr(AName,ATypeInfo,ansiStrData); End; + tkWString : + begin + wideStrData := WideString(AData); + PutWideStr(AName,ATypeInfo,wideStrData); + end; +{$IFDEF WST_UNICODESTRING} + tkUString : + begin + unicodeStrData := UnicodeString(AData); + PutUnicodeStr(AName,ATypeInfo,unicodeStrData); + end; +{$ENDIF WST_UNICODESTRING} tkInt64{$IFDEF FPC},tkQWord{$ENDIF} : Begin int64Data := Int64(AData); @@ -1290,14 +1435,30 @@ var boolData : Boolean; enumData : TEnumData; floatDt : TFloat_Extended_10; + wideStrData : WideString; +{$IFDEF WST_UNICODESTRING} + unicodeStrData : UnicodeString; +{$ENDIF WST_UNICODESTRING} begin CheckScope(); case ATypeInfo^.Kind of tkLString{$IFDEF FPC},tkAString{$ENDIF} : begin strData := string(AData); - StackTop().CreateInnerBuffer(dtString)^.StrData^.Data := strData; + StackTop().CreateInnerBuffer(dtAnsiString)^.AnsiStrData^.Data := strData; end; + tkWString : + begin + wideStrData := WideString(AData); + StackTop().CreateInnerBuffer(dtWideString)^.WideStrData^.Data := wideStrData; + end; +{$IFDEF WST_UNICODESTRING} + tkUString : + begin + unicodeStrData := UnicodeString(AData); + StackTop().CreateInnerBuffer(dtUnicodeString)^.UnicodeStrData^.Data := unicodeStrData; + end; +{$ENDIF WST_UNICODESTRING} tkInt64 : begin int64SData := Int64(AData); @@ -1403,7 +1564,7 @@ begin ftCurr : begin floatDt := Currency(AData); - StackTop().CreateInnerBuffer(dtExtended)^.ExtendedData := floatDt; + StackTop().CreateInnerBuffer(dtExtended)^.CurrencyData := floatDt; end; ftComp : begin @@ -1430,6 +1591,10 @@ Var enumData : TEnumData; floatDt : TFloat_Extended_10; recObject : Pointer; + wideStrData : WideString; +{$IFDEF WST_UNICODESTRING} + unicodeStrData : UnicodeString; +{$ENDIF WST_UNICODESTRING} begin Case ATypeInfo^.Kind Of tkInt64{$IFDEF FPC},tkQWord{$ENDIF} : @@ -1441,9 +1606,23 @@ begin tkLString{$IFDEF FPC},tkAString{$ENDIF} : Begin strData := ''; - GetStr(ATypeInfo,AName,strData); + GetAnsiStr(ATypeInfo,AName,strData); String(AData) := strData; End; + tkWString : + begin + wideStrData := ''; + GetWideStr(ATypeInfo,AName,wideStrData); + WideString(AData) := wideStrData; + end; +{$IFDEF WST_UNICODESTRING} + tkUString : + begin + unicodeStrData := ''; + GetUnicodeStr(ATypeInfo,AName,unicodeStrData); + UnicodeString(AData) := unicodeStrData; + end; +{$ENDIF WST_UNICODESTRING} tkClass : Begin objData := TObject(AData); @@ -1536,7 +1715,11 @@ begin tkLString {$IFDEF FPC}, tkAString - {$ENDIF} : string(AData) := dataBuffer^.StrData^.Data; + {$ENDIF} : string(AData) := dataBuffer^.AnsiStrData^.Data; + tkWString : WideString(AData) := dataBuffer^.WideStrData^.Data; +{$IFDEF WST_UNICODESTRING} + tkUString : UnicodeString(AData) := dataBuffer^.UnicodeStrData^.Data; +{$ENDIF WST_UNICODESTRING} tkClass, tkRecord : raise EBinaryFormatterException.Create('Inner Scope value must be a "simple type" value.'); {$IFDEF FPC} diff --git a/wst/trunk/base_json_formatter.pas b/wst/trunk/base_json_formatter.pas index 0a63f9a77..9d98aa478 100644 --- a/wst/trunk/base_json_formatter.pas +++ b/wst/trunk/base_json_formatter.pas @@ -214,6 +214,18 @@ type Const ATypeInfo : PTypeInfo; Const AData : String );{$IFDEF USE_INLINE}inline;{$ENDIF} +{$IFDEF WST_UNICODESTRING} + procedure PutUnicodeStr( + Const AName : String; + Const ATypeInfo : PTypeInfo; + Const AData : UnicodeString + );{$IFDEF USE_INLINE}inline;{$ENDIF} +{$ENDIF WST_UNICODESTRING} + procedure PutWideStr( + Const AName : String; + Const ATypeInfo : PTypeInfo; + Const AData : WideString + );{$IFDEF USE_INLINE}inline;{$ENDIF} procedure PutFloat( Const AName : String; Const ATypeInfo : PTypeInfo; @@ -263,6 +275,18 @@ type Var AName : String; Var AData : String );{$IFDEF USE_INLINE}inline;{$ENDIF} +{$IFDEF WST_UNICODESTRING} + procedure GetUnicodeStr( + Const ATypeInfo : PTypeInfo; + Var AName : String; + Var AData : UnicodeString + );{$IFDEF USE_INLINE}inline;{$ENDIF} +{$ENDIF WST_UNICODESTRING} + procedure GetWideStr( + Const ATypeInfo : PTypeInfo; + Var AName : String; + Var AData : WideString + );{$IFDEF USE_INLINE}inline;{$ENDIF} procedure GetObj( Const ATypeInfo : PTypeInfo; Var AName : String; @@ -449,6 +473,26 @@ begin StackTop().CreateStringBuffer(AName,AData); end; +{$IFDEF WST_UNICODESTRING} +procedure TJsonRpcBaseFormatter.PutUnicodeStr( + const AName: String; + const ATypeInfo: PTypeInfo; + const AData: UnicodeString +); +begin + StackTop().CreateStringBuffer(AName,AData); +end; +{$ENDIF WST_UNICODESTRING} + +procedure TJsonRpcBaseFormatter.PutWideStr( + const AName: String; + const ATypeInfo: PTypeInfo; + const AData: WideString +); +begin + StackTop().CreateStringBuffer(AName,AData); +end; + procedure TJsonRpcBaseFormatter.PutFloat( const AName : String; const ATypeInfo : PTypeInfo; @@ -537,6 +581,26 @@ begin AData := GetDataBuffer(AName).AsString; end; +{$IFDEF WST_UNICODESTRING} +procedure TJsonRpcBaseFormatter.GetUnicodeStr( + const ATypeInfo: PTypeInfo; + var AName: String; + var AData: UnicodeString +); +begin + AData := GetDataBuffer(AName).AsString; +end; +{$ENDIF WST_UNICODESTRING} + +procedure TJsonRpcBaseFormatter.GetWideStr( + const ATypeInfo: PTypeInfo; + var AName: String; + var AData: WideString +); +begin + AData := GetDataBuffer(AName).AsString; +end; + procedure TJsonRpcBaseFormatter.GetObj( const ATypeInfo : PTypeInfo; var AName : String; @@ -736,6 +800,10 @@ Var boolData : Boolean; enumData : TEnumIntType; floatDt : Extended; +{$IFDEF WST_UNICODESTRING} + unicodeStrData : UnicodeString; +{$ENDIF WST_UNICODESTRING} + wideStrData : WideString; begin Case ATypeInfo^.Kind Of tkLString{$IFDEF FPC},tkAString{$ENDIF} : @@ -743,6 +811,18 @@ begin strData := String(AData); PutStr(AName,ATypeInfo,strData); End; +{$IFDEF WST_UNICODESTRING} + tkUString : + begin + unicodeStrData := UnicodeString(AData); + PutUnicodeStr(AName,ATypeInfo,unicodeStrData); + end; +{$ENDIF WST_UNICODESTRING} + tkWString : + begin + wideStrData := WideString(AData); + PutWideStr(AName,ATypeInfo,wideStrData); + end; tkInt64{$IFDEF FPC},tkQWord{$ENDIF} : Begin int64Data := Int64(AData); @@ -825,6 +905,10 @@ var boolData : Boolean; enumData : TEnumIntType; floatDt : Extended; + wideStrData : WideString; +{$IFDEF WST_UNICODESTRING} + unicodeStrData : UnicodeString; +{$ENDIF WST_UNICODESTRING} begin locName := s_inner_value; Case ATypeInfo^.Kind Of @@ -833,6 +917,18 @@ begin strData := String(AData); PutStr(locName,ATypeInfo,strData); End; + tkWString : + begin + wideStrData := WideString(AData); + PutWideStr(locName,ATypeInfo,wideStrData); + end; +{$IFDEF WST_UNICODESTRING} + tkUString : + begin + unicodeStrData := UnicodeString(AData); + PutUnicodeStr(locName,ATypeInfo,unicodeStrData); + end; +{$ENDIF WST_UNICODESTRING} tkInt64{$IFDEF FPC},tkQWord{$ENDIF} : Begin int64Data := Int64(AData); @@ -904,6 +1000,10 @@ Var enumData : TEnumIntType; floatDt : Extended; recObject : Pointer; +{$IFDEF WST_UNICODESTRING} + unicodeStrData : UnicodeString; +{$ENDIF WST_UNICODESTRING} + WideStrData : WideString; begin Case ATypeInfo^.Kind Of tkInt64{$IFDEF FPC},tkQWord{$ENDIF} : @@ -918,6 +1018,20 @@ begin GetStr(ATypeInfo,AName,strData); String(AData) := strData; End; +{$IFDEF WST_UNICODESTRING} + tkUString : + Begin + unicodeStrData := ''; + GetUnicodeStr(ATypeInfo,AName,unicodeStrData); + UnicodeString(AData) := unicodeStrData; + End; +{$ENDIF WST_UNICODESTRING} + tkWString : + Begin + WideStrData := ''; + GetWideStr(ATypeInfo,AName,WideStrData); + WideString(AData) := WideStrData; + End; tkClass : Begin objData := TObject(AData); @@ -1002,6 +1116,10 @@ var enumData : TEnumIntType; floatDt : Extended; recObject : Pointer; + wideStrData : WideString; +{$IFDEF WST_UNICODESTRING} + unicodeStrData : UnicodeString; +{$ENDIF WST_UNICODESTRING} begin locName := s_inner_value; Case ATypeInfo^.Kind Of @@ -1017,6 +1135,20 @@ begin GetStr(ATypeInfo,locName,strData); String(AData) := strData; End; + tkWString : + begin + wideStrData := ''; + GetWideStr(ATypeInfo,locName,wideStrData); + WideString(AData) := wideStrData; + end; +{$IFDEF WST_UNICODESTRING} + tkUString : + begin + unicodeStrData := ''; + GetUnicodeStr(ATypeInfo,locName,unicodeStrData); + UnicodeString(AData) := unicodeStrData; + end; +{$ENDIF WST_UNICODESTRING} tkClass, tkRecord : Begin raise EJsonRpcException.Create('Inner Scope value must be a "simple type" value.'); diff --git a/wst/trunk/base_service_intf.pas b/wst/trunk/base_service_intf.pas index f107159e5..18a5bc406 100644 --- a/wst/trunk/base_service_intf.pas +++ b/wst/trunk/base_service_intf.pas @@ -633,6 +633,32 @@ type property Value : string read FValue write FValue; end; + { TComplexWideStringContentRemotable } + + TComplexWideStringContentRemotable = class(TBaseComplexSimpleContentRemotable) + private + FValue: Widestring; + protected + class procedure SaveValue(AObject : TBaseRemotable; AStore : IFormatterBase);override; + class procedure LoadValue(var AObject : TObject; AStore : IFormatterBase);override; + public + property Value : Widestring read FValue write FValue; + end; + +{$IFDEF WST_UNICODESTRING} + { TComplexUnicodeStringContentRemotable } + + TComplexUnicodeStringContentRemotable = class(TBaseComplexSimpleContentRemotable) + private + FValue: UnicodeString; + protected + class procedure SaveValue(AObject : TBaseRemotable; AStore : IFormatterBase);override; + class procedure LoadValue(var AObject : TObject; AStore : IFormatterBase);override; + public + property Value : UnicodeString read FValue write FValue; + end; +{$ENDIF WST_UNICODESTRING} + { TBase64StringExtRemotable } TBase64StringExtRemotable = class(TBaseComplexSimpleContentRemotable) @@ -1509,6 +1535,10 @@ begin r.Register(sXSD_NS,TypeInfo(string),'string').AddPascalSynonym('string'); r.Register(sXSD_NS,TypeInfo(AnsiString),'ansistring').AddPascalSynonym('ansistring'); + r.Register(sXSD_NS,TypeInfo(WideString),'widestring').AddPascalSynonym('widestring'); +{$IFDEF WST_UNICODESTRING} + r.Register(sXSD_NS,TypeInfo(UnicodeString),'UnicodeString').AddPascalSynonym('unicodestring'); +{$ENDIF WST_UNICODESTRING} r.Register(sXSD_NS,TypeInfo(anyURI),'anyURI').AddPascalSynonym('anyURI'); r.Register(sXSD_NS,TypeInfo(boolean),'boolean').AddPascalSynonym('boolean'); @@ -1577,6 +1607,10 @@ begin r.Register(sXSD_NS,TypeInfo(TComplexFloatSingleContentRemotable),'Single').AddPascalSynonym('TComplexFloatSingleContentRemotable'); r.Register(sXSD_NS,TypeInfo(TComplexStringContentRemotable),'string').AddPascalSynonym('TComplexStringContentRemotable'); + r.Register(sXSD_NS,TypeInfo(TComplexWideStringContentRemotable),'widestring').AddPascalSynonym('TComplexWideStringContentRemotable'); +{$IFDEF WST_UNICODESTRING} + r.Register(sXSD_NS,TypeInfo(TComplexUnicodeStringContentRemotable),'unicodestring').AddPascalSynonym('TComplexUnicodeStringContentRemotable'); +{$ENDIF WST_UNICODESTRING} r.Register(sXSD_NS,TypeInfo(TComplexBooleanContentRemotable),'boolean').AddPascalSynonym('TComplexBooleanContentRemotable'); end; @@ -5119,6 +5153,52 @@ begin (AObject as TComplexStringContentRemotable).Value := i; end; +{ TComplexWideStringContentRemotable } + +class procedure TComplexWideStringContentRemotable.SaveValue( + AObject: TBaseRemotable; + AStore: IFormatterBase +); +begin + AStore.PutScopeInnerValue(TypeInfo(WideString),(AObject as TComplexWideStringContentRemotable).Value); +end; + +class procedure TComplexWideStringContentRemotable.LoadValue( + var AObject: TObject; + AStore: IFormatterBase +); +var + i : WideString; +begin + i := ''; + AStore.GetScopeInnerValue(TypeInfo(WideString),i); + (AObject as TComplexWideStringContentRemotable).Value := i; +end; + +{$IFDEF WST_UNICODESTRING} +{ TComplexUnicodeStringContentRemotable } + +class procedure TComplexUnicodeStringContentRemotable.SaveValue( + AObject: TBaseRemotable; + AStore: IFormatterBase +); +begin + AStore.PutScopeInnerValue(TypeInfo(UnicodeString),(AObject as TComplexUnicodeStringContentRemotable).Value); +end; + +class procedure TComplexUnicodeStringContentRemotable.LoadValue( + var AObject: TObject; + AStore: IFormatterBase +); +var + i : UnicodeString; +begin + i := ''; + AStore.GetScopeInnerValue(TypeInfo(UnicodeString),i); + (AObject as TComplexUnicodeStringContentRemotable).Value := i; +end; +{$ENDIF WST_UNICODESTRING} + { TDateRemotable } procedure TDateRemotable.SetDate(const AValue: TDateTime); @@ -6271,6 +6351,7 @@ begin end; + initialization initialize_base_service_intf(); diff --git a/wst/trunk/base_soap_formatter.pas b/wst/trunk/base_soap_formatter.pas index d61015108..005b3cfff 100644 --- a/wst/trunk/base_soap_formatter.pas +++ b/wst/trunk/base_soap_formatter.pas @@ -152,7 +152,7 @@ type const ANameSpace : string; Const AName : String; Const ATypeInfo : PTypeInfo; - Const AData : string + Const AData : DOMString ):TDOMNode; function PutEnum( const ANameSpace : string; @@ -178,6 +178,20 @@ type Const ATypeInfo : PTypeInfo; Const AData : String ):TDOMNode;{$IFDEF USE_INLINE}inline;{$ENDIF} +{$IFDEF WST_UNICODESTRING} + function PutUnicodeStr( + const ANameSpace : string; + Const AName : String; + Const ATypeInfo : PTypeInfo; + Const AData : UnicodeString + ):TDOMNode;{$IFDEF USE_INLINE}inline;{$ENDIF} +{$ENDIF WST_UNICODESTRING} + function PutWideStr( + const ANameSpace : string; + Const AName : String; + Const ATypeInfo : PTypeInfo; + Const AData : WideString + ):TDOMNode;{$IFDEF USE_INLINE}inline;{$ENDIF} function PutFloat( const ANameSpace : string; Const AName : String; @@ -234,6 +248,20 @@ type Var AName : String; Var AData : String );{$IFDEF USE_INLINE}inline;{$ENDIF} +{$IFDEF WST_UNICODESTRING} + procedure GetUnicodeStr( + Const ATypeInfo : PTypeInfo; + const ANameSpace : string; + Var AName : String; + Var AData : UnicodeString + );{$IFDEF USE_INLINE}inline;{$ENDIF} +{$ENDIF WST_UNICODESTRING} + procedure GetWideStr( + Const ATypeInfo : PTypeInfo; + const ANameSpace : string; + Var AName : String; + Var AData : WideString + );{$IFDEF USE_INLINE}inline;{$ENDIF} procedure GetObj( Const ATypeInfo : PTypeInfo; Var AName : String; @@ -715,7 +743,7 @@ function TSOAPBaseFormatter.InternalPutData( const ANameSpace : string; const AName : String; const ATypeInfo : PTypeInfo; - const AData : string + const AData : DOMString ): TDOMNode; Var namespaceLongName, namespaceShortName, strName, strNodeName, s : string; @@ -813,6 +841,28 @@ begin Result := InternalPutData(ANameSpace,AName,ATypeInfo,AData); end; +{$IFDEF WST_UNICODESTRING} +function TSOAPBaseFormatter.PutUnicodeStr( + const ANameSpace: string; + const AName: String; + const ATypeInfo: PTypeInfo; + const AData: UnicodeString +): TDOMNode; +begin + Result := InternalPutData(ANameSpace,AName,ATypeInfo,AData); +end; +{$ENDIF WST_UNICODESTRING} + +function TSOAPBaseFormatter.PutWideStr( + const ANameSpace: string; + const AName: String; + const ATypeInfo: PTypeInfo; + const AData: WideString +) : TDOMNode; +begin + Result := InternalPutData(ANameSpace,AName,ATypeInfo,AData); +end; + procedure TSOAPBaseFormatter.PutObj( const AName : String; const ATypeInfo : PTypeInfo; @@ -976,6 +1026,28 @@ begin AData := GetNodeValue(ANameSpace,AName); end; +{$IFDEF WST_UNICODESTRING} +procedure TSOAPBaseFormatter.GetUnicodeStr( + const ATypeInfo: PTypeInfo; + const ANameSpace: string; + var AName: String; + var AData: UnicodeString +); +begin + AData := GetNodeValue(ANameSpace,AName); +end; +{$ENDIF WST_UNICODESTRING} + +procedure TSOAPBaseFormatter.GetWideStr( + const ATypeInfo: PTypeInfo; + const ANameSpace: string; + var AName: String; + var AData: WideString +); +begin + AData := GetNodeValue(ANameSpace,AName); +end; + procedure TSOAPBaseFormatter.GetObj( const ATypeInfo : PTypeInfo; var AName : String; @@ -1466,6 +1538,10 @@ Var boolData : Boolean; enumData : TEnumIntType; floatDt : Extended; +{$IFDEF WST_UNICODESTRING} + unicodeStrData : UnicodeString; +{$ENDIF WST_UNICODESTRING} + wideStrData : WideString; begin Case ATypeInfo^.Kind Of tkInt64{$IFDEF FPC},tkQWord{$ENDIF} : @@ -1478,6 +1554,18 @@ begin strData := String(AData); PutStr(ANameSpace,AName,ATypeInfo,strData); End; +{$IFDEF WST_UNICODESTRING} + tkUString : + Begin + unicodeStrData := UnicodeString(AData); + PutUnicodeStr(ANameSpace,AName,ATypeInfo,unicodeStrData); + End; +{$ENDIF WST_UNICODESTRING} + tkWString : + Begin + wideStrData := WideString(AData); + PutWideStr(ANameSpace,AName,ATypeInfo,wideStrData); + End; tkClass : Begin objData := TObject(AData); @@ -1561,6 +1649,10 @@ Var dataBuffer : string; frmt : string; prcsn,i : Integer; + wideStrData : WideString; +{$IFDEF WST_UNICODESTRING} + unicodeStrData : UnicodeString; +{$ENDIF WST_UNICODESTRING} {strm : TStringStream; locDoc : TwstXMLDocument; locNode : TDOMNode;} @@ -1584,6 +1676,18 @@ begin strData := string(AData); dataBuffer := strData; end; + tkWString : + begin + wideStrData := WideString(AData); + dataBuffer := wideStrData; + end; +{$IFDEF WST_UNICODESTRING} + tkUString : + begin + unicodeStrData := UnicodeString(AData); + dataBuffer := unicodeStrData; + end; +{$ENDIF WST_UNICODESTRING} tkClass : begin raise ESOAPException.Create('Inner Scope value must be a "simple type" value.'); @@ -1684,6 +1788,10 @@ Var enumData : TEnumIntType; floatDt : Extended; recObject : Pointer; +{$IFDEF WST_UNICODESTRING} + unicodeStrData : UnicodeString; +{$ENDIF WST_UNICODESTRING} + wideStrData : WideString; begin Case ATypeInfo^.Kind Of tkInt64{$IFDEF FPC},tkQWord{$ENDIF} : @@ -1698,6 +1806,20 @@ begin GetStr(ATypeInfo,ANameSpace,AName,strData); String(AData) := strData; End; +{$IFDEF WST_UNICODESTRING} + tkUString : + begin + unicodeStrData := ''; + GetUnicodeStr(ATypeInfo,ANameSpace,AName,unicodeStrData); + UnicodeString(AData) := unicodeStrData; + end; +{$ENDIF WST_UNICODESTRING} + tkWString : + begin + wideStrData := ''; + GetWideStr(ATypeInfo,ANameSpace,AName,wideStrData); + WideString(AData) := wideStrData; + end; tkClass : Begin objData := TObject(AData); @@ -1793,6 +1915,10 @@ begin tkQWord : QWord(AData) := StrToInt64Def(Trim(dataBuffer),0); {$ENDIF} tkLString{$IFDEF FPC},tkAString{$ENDIF} : string(AData) := dataBuffer; + tkWString : WideString(AData) := dataBuffer; +{$IFDEF WST_UNICODESTRING} + tkUString : UnicodeString(AData) := dataBuffer; +{$ENDIF WST_UNICODESTRING} tkClass : begin raise ESOAPException.Create('Inner Scope value must be a "simple type" value.'); diff --git a/wst/trunk/base_xmlrpc_formatter.pas b/wst/trunk/base_xmlrpc_formatter.pas index a2dc1b0b8..953f70d38 100644 --- a/wst/trunk/base_xmlrpc_formatter.pas +++ b/wst/trunk/base_xmlrpc_formatter.pas @@ -172,7 +172,7 @@ type function InternalPutData( const AName : string; const AType : TXmlRpcDataType; - const AData : string + const AData : DOMString ):TDOMNode;{$IFDEF USE_INLINE}inline;{$ENDIF} function PutEnum( Const AName : String; @@ -196,6 +196,18 @@ type Const ATypeInfo : PTypeInfo; Const AData : String ):TDOMNode;{$IFDEF USE_INLINE}inline;{$ENDIF} +{$IFDEF WST_UNICODESTRING} + function PutUnicodeStr( + Const AName : String; + Const ATypeInfo : PTypeInfo; + Const AData : UnicodeString + ):TDOMNode;{$IFDEF USE_INLINE}inline;{$ENDIF} +{$ENDIF WST_UNICODESTRING} + function PutWideStr( + Const AName : String; + Const ATypeInfo : PTypeInfo; + Const AData : WideString + ):TDOMNode;{$IFDEF USE_INLINE}inline;{$ENDIF} function PutFloat( Const AName : String; Const ATypeInfo : PTypeInfo; @@ -245,6 +257,18 @@ type Var AName : String; Var AData : String );{$IFDEF USE_INLINE}inline;{$ENDIF} +{$IFDEF WST_UNICODESTRING} + procedure GetUnicodeStr( + Const ATypeInfo : PTypeInfo; + Var AName : String; + Var AData : UnicodeString + );{$IFDEF USE_INLINE}inline;{$ENDIF} +{$ENDIF WST_UNICODESTRING} + procedure GetWideStr( + Const ATypeInfo : PTypeInfo; + Var AName : String; + Var AData : WideString + );{$IFDEF USE_INLINE}inline;{$ENDIF} procedure GetObj( Const ATypeInfo : PTypeInfo; Var AName : String; @@ -751,7 +775,7 @@ end; function TXmlRpcBaseFormatter.InternalPutData( const AName : string; const AType : TXmlRpcDataType; - const AData : string + const AData : DOMString ): TDOMNode; begin Result := StackTop().CreateBuffer(AName,AType).AppendChild(FDoc.CreateTextNode(AData)); @@ -809,6 +833,34 @@ begin ); end; +{$IFDEF WST_UNICODESTRING} +function TXmlRpcBaseFormatter.PutUnicodeStr( + const AName: String; + const ATypeInfo: PTypeInfo; + const AData: UnicodeString +) : TDOMNode; +begin + Result := InternalPutData( + AName, + xdtString, + AData//StringReplace(StringReplace(AData,'<','<',[rfReplaceAll]),'&','&',[rfReplaceAll]) + ); +end; +{$ENDIF WST_UNICODESTRING} + +function TXmlRpcBaseFormatter.PutWideStr( + const AName: String; + const ATypeInfo: PTypeInfo; + const AData: WideString +) : TDOMNode; +begin + Result := InternalPutData( + AName, + xdtString, + AData//StringReplace(StringReplace(AData,'<','<',[rfReplaceAll]),'&','&',[rfReplaceAll]) + ); +end; + procedure TXmlRpcBaseFormatter.PutObj( const AName : String; const ATypeInfo : PTypeInfo; @@ -945,6 +997,26 @@ begin AData := GetNodeValue(AName); end; +{$IFDEF WST_UNICODESTRING} +procedure TXmlRpcBaseFormatter.GetUnicodeStr( + const ATypeInfo: PTypeInfo; + var AName: String; + var AData: UnicodeString +); +begin + AData := GetNodeValue(AName); +end; +{$ENDIF WST_UNICODESTRING} + +procedure TXmlRpcBaseFormatter.GetWideStr( + const ATypeInfo: PTypeInfo; + var AName: String; + var AData: WideString +); +begin + AData := GetNodeValue(AName); +end; + procedure TXmlRpcBaseFormatter.GetObj( const ATypeInfo : PTypeInfo; var AName : String; @@ -1138,6 +1210,10 @@ Var {$IFDEF FPC}boolData : Boolean;{$ENDIF} enumData : TEnumIntType; floatDt : Extended; +{$IFDEF WST_UNICODESTRING} + unicodeStrData : UnicodeString; +{$ENDIF WST_UNICODESTRING} + wideStrData : WideString; begin Case ATypeInfo^.Kind Of tkInt64{$IFDEF FPC},tkQWord{$ENDIF} : @@ -1150,6 +1226,18 @@ begin strData := String(AData); PutStr(AName,ATypeInfo,strData); End; + tkWString : + Begin + wideStrData := WideString(AData); + PutWideStr(AName,ATypeInfo,wideStrData); + End; +{$IFDEF WST_UNICODESTRING} + tkUString : + Begin + unicodeStrData := UnicodeString(AData); + PutUnicodeStr(AName,ATypeInfo,unicodeStrData); + End; +{$ENDIF WST_UNICODESTRING} tkClass : Begin objData := TObject(AData); @@ -1222,6 +1310,10 @@ Var dataBuffer : string; frmt : string; prcsn,i : Integer; + wideStrData : WideString; +{$IFDEF WST_UNICODESTRING} + unicodeStrData : UnicodeString; +{$ENDIF WST_UNICODESTRING} begin CheckScope(); Case ATypeInfo^.Kind Of @@ -1242,6 +1334,18 @@ begin strData := string(AData); dataBuffer := strData; end; + tkWString : + begin + wideStrData := WideString(AData); + dataBuffer := wideStrData; + end; +{$IFDEF WST_UNICODESTRING} + tkUString : + begin + unicodeStrData := UnicodeString(AData); + dataBuffer := unicodeStrData; + end; +{$ENDIF WST_UNICODESTRING} tkClass : begin raise EXmlRpcException.Create('Inner Scope value must be a "simple type" value.'); @@ -1331,6 +1435,10 @@ Var enumData : TEnumIntType; floatDt : Extended; recObject : Pointer; +{$IFDEF WST_UNICODESTRING} + unicodeStrData : UnicodeString; +{$ENDIF WST_UNICODESTRING} + wideStrData : WideString; begin Case ATypeInfo^.Kind Of tkInt64{$IFDEF FPC},tkQWord{$ENDIF} : @@ -1345,6 +1453,20 @@ begin GetStr(ATypeInfo,AName,strData); String(AData) := strData; End; +{$IFDEF WST_UNICODESTRING} + tkUString : + begin + unicodeStrData := ''; + GetUnicodeStr(ATypeInfo,AName,unicodeStrData); + UnicodeString(AData) := unicodeStrData; + end; +{$ENDIF WST_UNICODESTRING} + tkWString : + begin + wideStrData := ''; + GetWideStr(ATypeInfo,AName,wideStrData); + WideString(AData) := wideStrData; + end; tkClass : Begin objData := TObject(AData); @@ -1429,6 +1551,10 @@ begin tkQWord : QWord(AData) := StrToInt64Def(Trim(dataBuffer),0); {$ENDIF} tkLString{$IFDEF FPC},tkAString{$ENDIF} : string(AData) := dataBuffer; + tkWString : WideString(AData) := dataBuffer; +{$IFDEF WST_UNICODESTRING} + tkUString : UnicodeString(AData) := dataBuffer; +{$ENDIF WST_UNICODESTRING} tkClass : begin raise EXmlRpcException.Create('Inner Scope value must be a "simple type" value.'); diff --git a/wst/trunk/binary_streamer.pas b/wst/trunk/binary_streamer.pas index 8af1fa95b..d9bb912d0 100644 --- a/wst/trunk/binary_streamer.pas +++ b/wst/trunk/binary_streamer.pas @@ -30,7 +30,11 @@ Type TInt64S = Int64; TInt64U = QWord; TBoolData = Boolean; TEnumData = Int64; - TStringData = AnsiString; + TAnsiStringData = AnsiString; + TWideStringData = WideString; +{$IFDEF WST_UNICODESTRING} + TUnicodeStringData = UnicodeString; +{$ENDIF WST_UNICODESTRING} TFloat_Single_4 = Single; TFloat_Double_8 = Double; @@ -53,7 +57,11 @@ Type procedure WriteBool(Const AData : TBoolData); procedure WriteEnum(Const AData : TEnumData); - procedure WriteStr(Const AData : TStringData); + procedure WriteAnsiStr(Const AData : TAnsiStringData); + procedure WriteWideStr(Const AData : TWideStringData); +{$IFDEF WST_UNICODESTRING} + procedure WriteUnicodeStr(Const AData : TUnicodeStringData); +{$ENDIF WST_UNICODESTRING} procedure WriteSingle(Const AData : TFloat_Single_4); procedure WriteDouble(Const AData : TFloat_Double_8); @@ -78,7 +86,11 @@ Type function ReadBool():TBoolData; function ReadEnum():TEnumData; - function ReadStr():TStringData; + function ReadAnsiStr():TAnsiStringData; + function ReadWideStr():TWideStringData; +{$IFDEF WST_UNICODESTRING} + function ReadUnicodeStr():TUnicodeStringData; +{$ENDIF WST_UNICODESTRING} function ReadSingle():TFloat_Single_4; function ReadDouble():TFloat_Double_8; @@ -89,6 +101,7 @@ Type function CreateBinaryReader(AStream : TStream):IDataStoreReader;{$IFDEF USE_INLINE}inline;{$ENDIF} function CreateBinaryWriter(AStream : TStream):IDataStore;{$IFDEF USE_INLINE}inline;{$ENDIF} +{These routines transform their argument to "Big Endian" alignment} procedure ReverseBytes(var AData; const ALength : Integer);{$IFDEF USE_INLINE}{$IFDEF ENDIAN_BIG}inline;{$ENDIF}{$ENDIF} function Reverse_16(const AValue:Word):Word;{$IFDEF USE_INLINE}inline;{$ENDIF} function Reverse_32(const AValue:DWord):DWord;{$IFDEF USE_INLINE}inline;{$ENDIF} @@ -164,6 +177,26 @@ begin ReverseBytes(Result,8); end; +{$IFDEF ENDIAN_BIG} +procedure Reverse_Array(var AValue; const AArrayLength, AItemSize : PtrInt);{$IFDEF USE_INLINE}inline;{$ENDIF} +begin +end; +{$ELSE ENDIAN_BIG} +procedure Reverse_Array(var AValue; const AArrayLength, AItemSize : PtrInt); +var + p : PByte; + i : PtrInt; +begin + if ( AArrayLength > 0 ) and ( AItemSize > 1 ) then begin + p := @AValue; + for i := 0 to Pred(AArrayLength) do begin + ReverseBytes(p^,AItemSize); + Inc(p,AItemSize); + end; + end; +end; +{$ENDIF ENDIAN_BIG} + Type { TDataStore } @@ -185,7 +218,11 @@ Type procedure WriteBool(Const AData : TBoolData); procedure WriteEnum(Const AData : TEnumData); - procedure WriteStr(Const AData : TStringData); + procedure WriteAnsiStr(Const AData : TAnsiStringData); + procedure WriteWideStr(Const AData : TWideStringData); +{$IFDEF WST_UNICODESTRING} + procedure WriteUnicodeStr(Const AData : TUnicodeStringData); +{$ENDIF WST_UNICODESTRING} procedure WriteSingle(Const AData : TFloat_Single_4); procedure WriteDouble(Const AData : TFloat_Double_8); @@ -216,8 +253,12 @@ Type function ReadBool():TBoolData; function ReadEnum():TEnumData; - function ReadStr():TStringData; - + function ReadAnsiStr():TAnsiStringData; + function ReadWideStr():TWideStringData; +{$IFDEF WST_UNICODESTRING} + function ReadUnicodeStr():TUnicodeStringData; +{$ENDIF WST_UNICODESTRING} + function ReadSingle():TFloat_Single_4; function ReadDouble():TFloat_Double_8; function ReadExtended():TFloat_Extended_10; @@ -344,7 +385,7 @@ begin WriteInt64S(AData); end; -procedure TDataStore.WriteStr(const AData: TStringData); +procedure TDataStore.WriteAnsiStr(const AData: TAnsiStringData); Var i : TInt32S; begin @@ -354,6 +395,52 @@ begin FStream.Write(AData[1],i); end; +procedure TDataStore.WriteWideStr(const AData: TWideStringData); + + procedure LocalWrite(); + var + locData : TWideStringData; + begin + locData := AData; + UniqueString(locData); + Reverse_Array(Pointer(locData)^,Length(locData),SizeOf(WideChar)); + FStream.Write(Pointer(locData)^, ( Length(locData) * SizeOf(WideChar) ) ); + end; + +var + i : TInt32S; +begin + i := Length(AData); + WriteInt32S(i); + if ( i > 0 ) then begin + LocalWrite(); + end; +end; + +{$IFDEF WST_UNICODESTRING} +procedure TDataStore.WriteUnicodeStr(const AData: TUnicodeStringData); + + procedure LocalWrite(); + var + locData : TUnicodeStringData; + begin + locData := AData; + UniqueString(locData); + Reverse_Array(Pointer(locData)^,Length(locData),SizeOf(UnicodeChar)); + FStream.Write(Pointer(locData)^, ( Length(locData) * SizeOf(UnicodeChar) ) ); + end; + +var + i : TInt32S; +begin + i := Length(AData); + WriteInt32S(i); + if ( i > 0 ) then begin + LocalWrite(); + end; +end; +{$ENDIF WST_UNICODESTRING} + { procedure TDataStore.WriteSingle(const AData: TFloat_Single_4); begin @@ -476,7 +563,7 @@ begin Result := ReadInt64S(); end; -function TDataStoreReader.ReadStr(): TStringData; +function TDataStoreReader.ReadAnsiStr(): TAnsiStringData; Var i : TInt32S; begin @@ -486,6 +573,32 @@ begin FStream.ReadBuffer(Result[1],i); end; +function TDataStoreReader.ReadWideStr(): TWideStringData; +var + i : TInt32S; +begin + i := ReadInt32S(); + SetLength(Result,i); + if ( i > 0 ) then begin + FStream.ReadBuffer(Pointer(Result)^, ( i * SizeOf(WideChar) ) ); + Reverse_Array(Pointer(Result)^,i,SizeOf(WideChar)); + end; +end; + +{$IFDEF WST_UNICODESTRING} +function TDataStoreReader.ReadUnicodeStr(): TUnicodeStringData; +var + i : TInt32S; +begin + i := ReadInt32S(); + SetLength(Result,i); + if ( i > 0 ) then begin + FStream.ReadBuffer(Pointer(Result)^, ( i * SizeOf(UnicodeChar) ) ); + Reverse_Array(Pointer(Result)^,i,SizeOf(UnicodeChar)); + end; +end; +{$ENDIF WST_UNICODESTRING} + function TDataStoreReader.ReadSingle(): TFloat_Single_4; begin FStream.Read(Result,SizeOf(Result)); diff --git a/wst/trunk/ics_http_protocol.pas b/wst/trunk/ics_http_protocol.pas index 0f19242a5..6e0151e83 100644 --- a/wst/trunk/ics_http_protocol.pas +++ b/wst/trunk/ics_http_protocol.pas @@ -166,7 +166,7 @@ end; procedure THTTPTransport.SendAndReceive(ARequest, AResponse: TStream); {$IFDEF WST_DBG} Var - s : string; + s : TBinaryString; i : Int64; {$ENDIF WST_DBG} begin diff --git a/wst/trunk/ics_tcp_protocol.pas b/wst/trunk/ics_tcp_protocol.pas index 2cfa35c56..e151807f7 100644 --- a/wst/trunk/ics_tcp_protocol.pas +++ b/wst/trunk/ics_tcp_protocol.pas @@ -17,7 +17,7 @@ interface uses Classes, SysUtils, - service_intf, imp_utils, base_service_intf, + service_intf, imp_utils, base_service_intf, wst_types, WSocket; @@ -161,9 +161,9 @@ procedure TTCPTransport.SendAndReceive(ARequest, AResponse: TStream); Var wrtr : IDataStore; buffStream : TMemoryStream; - strBuff : string; + strBuff : TBinaryString; {$IFDEF WST_DBG} - s : string; + s : TBinaryString; i : Int64; {$ENDIF WST_DBG} begin @@ -171,13 +171,13 @@ begin Try wrtr := CreateBinaryWriter(buffStream); wrtr.WriteInt32S(0); - wrtr.WriteStr(Target); - wrtr.WriteStr(ContentType); - wrtr.WriteStr(Self.Format); + wrtr.WriteAnsiStr(Target); + wrtr.WriteAnsiStr(ContentType); + wrtr.WriteAnsiStr(Self.Format); SetLength(strBuff,ARequest.Size); ARequest.Position := 0; ARequest.Read(strBuff[1],Length(strBuff)); - wrtr.WriteStr(strBuff); + wrtr.WriteAnsiStr(strBuff); buffStream.Position := 0; wrtr.WriteInt32S(buffStream.Size-4); diff --git a/wst/trunk/indy_tcp_protocol.pas b/wst/trunk/indy_tcp_protocol.pas index 9f1cc73ac..8a558b88f 100644 --- a/wst/trunk/indy_tcp_protocol.pas +++ b/wst/trunk/indy_tcp_protocol.pas @@ -120,13 +120,13 @@ begin try wrtr := CreateBinaryWriter(buffStream); wrtr.WriteInt32S(0); - wrtr.WriteStr(Target); - wrtr.WriteStr(ContentType); - wrtr.WriteStr(Self.Format); + wrtr.WriteAnsiStr(Target); + wrtr.WriteAnsiStr(ContentType); + wrtr.WriteAnsiStr(Self.Format); SetLength(strBuff,ARequest.Size); ARequest.Position := 0; ARequest.Read(strBuff[1],Length(strBuff)); - wrtr.WriteStr(strBuff); + wrtr.WriteAnsiStr(strBuff); buffStream.Position := 0; wrtr.WriteInt32S(buffStream.Size-4); buffStream.Position := 0; diff --git a/wst/trunk/indy_tcp_server.pas b/wst/trunk/indy_tcp_server.pas index 0b7f22749..ff5f4c65f 100644 --- a/wst/trunk/indy_tcp_server.pas +++ b/wst/trunk/indy_tcp_server.pas @@ -26,10 +26,7 @@ uses //IdTCPServer, {$ENDIF} IdSocketHandle, - server_listener; - -{$INCLUDE wst.inc} -{$INCLUDE wst_delphi.inc} + server_listener, wst_types; const sSERVER_PORT = 1234; @@ -139,7 +136,7 @@ var locInStream, locOutStream : TMemoryStream; wrtr : IDataStore; rdr : IDataStoreReader; - buff, trgt,ctntyp, frmt : string; + buff, trgt,ctntyp, frmt : TBinaryString; rqst : IRequestBuffer; i : PtrUInt; begin @@ -157,10 +154,10 @@ begin {$ENDIF} if ( ReadInputBuffer(locInStream) >= SizeOf(LongInt) ) then begin rdr := CreateBinaryReader(locInStream); - trgt := rdr.ReadStr(); - ctntyp := rdr.ReadStr(); - frmt := rdr.ReadStr(); - buff := rdr.ReadStr(); + trgt := rdr.ReadAnsiStr(); + ctntyp := rdr.ReadAnsiStr(); + frmt := rdr.ReadAnsiStr(); + buff := rdr.ReadAnsiStr(); {$IFDEF WST_DBG} WriteLn(buff); @@ -178,7 +175,7 @@ begin locOutStream.Read(buff[1],i); locOutStream.Size := 0; wrtr := CreateBinaryWriter(locOutStream); - wrtr.WriteStr(buff); + wrtr.WriteAnsiStr(buff); locOutStream.Position := 0; {$IFDEF INDY_10} AContext.Connection.IOHandler.Write(locOutStream,locOutStream.Size,False);