AnsiChar and WideChar support in WST runtime

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@560 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
inoussa
2008-09-15 02:30:43 +00:00
parent 1e95624282
commit 2cb02c46ec
6 changed files with 696 additions and 19 deletions

View File

@ -42,7 +42,7 @@ type
dtInt16U, dtInt16S, dtInt16U, dtInt16S,
dtInt32U, dtInt32S, dtInt32U, dtInt32S,
dtInt64U, dtInt64S, dtInt64U, dtInt64S,
dtBool, dtEnum, dtBool, dtAnsiChar, dtWideChar, dtEnum,
dtSingle, dtDouble, dtExtended, dtCurrency, dtSingle, dtDouble, dtExtended, dtCurrency,
dtAnsiString, dtWideString, dtAnsiString, dtWideString,
{$IFDEF WST_UNICODESTRING} {$IFDEF WST_UNICODESTRING}
@ -72,6 +72,8 @@ type
dtInt64U : ( Int64U : TInt64U ); dtInt64U : ( Int64U : TInt64U );
dtInt64S : ( Int64S : TInt64S ); dtInt64S : ( Int64S : TInt64S );
dtBool : ( BoolData : TBoolData ); dtBool : ( BoolData : TBoolData );
dtAnsiChar : ( AnsiCharData : TAnsiCharacter; );
dtWideChar : ( WideCharData : TWideCharacter; );
dtEnum : ( EnumData : TEnumData ); dtEnum : ( EnumData : TEnumData );
dtSingle : ( SingleData : TFloat_Single_4 ); dtSingle : ( SingleData : TFloat_Single_4 );
dtDouble : ( DoubleData : TFloat_Double_8 ); dtDouble : ( DoubleData : TFloat_Double_8 );
@ -253,6 +255,16 @@ type
Const ATypeInfo : PTypeInfo; Const ATypeInfo : PTypeInfo;
Const AData : Boolean Const AData : Boolean
);{$IFDEF USE_INLINE}inline;{$ENDIF} );{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure PutAnsiChar(
Const AName : String;
Const ATypeInfo : PTypeInfo;
Const AData : AnsiChar
);{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure PutWideChar(
Const AName : String;
Const ATypeInfo : PTypeInfo;
Const AData : WideChar
);{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure PutInt64( procedure PutInt64(
Const AName : String; Const AName : String;
Const ATypeInfo : PTypeInfo; Const ATypeInfo : PTypeInfo;
@ -280,6 +292,16 @@ type
Var AName : String; Var AName : String;
Var AData : Boolean Var AData : Boolean
);{$IFDEF USE_INLINE}inline;{$ENDIF} );{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure GetAnsiChar(
Const ATypeInfo : PTypeInfo;
Var AName : String;
Var AData : AnsiChar
);{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure GetWideChar(
Const ATypeInfo : PTypeInfo;
Var AName : String;
Var AData : WideChar
);{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure GetFloat( procedure GetFloat(
Const ATypeInfo : PTypeInfo; Const ATypeInfo : PTypeInfo;
Var AName : String; Var AName : String;
@ -648,6 +670,8 @@ Begin
dtUnicodeString : ADest.WriteUnicodeStr(ARoot^.UnicodeStrData^.Data); dtUnicodeString : ADest.WriteUnicodeStr(ARoot^.UnicodeStrData^.Data);
{$ENDIF WST_UNICODESTRING} {$ENDIF WST_UNICODESTRING}
dtBool : ADest.WriteBool(ARoot^.BoolData); dtBool : ADest.WriteBool(ARoot^.BoolData);
dtAnsiChar : ADest.WriteAnsiChar(ARoot^.AnsiCharData);
dtWideChar : ADest.WriteWideChar(ARoot^.WideCharData);
dtEnum : ADest.WriteEnum(ARoot^.EnumData); dtEnum : ADest.WriteEnum(ARoot^.EnumData);
dtObject : dtObject :
Begin Begin
@ -715,6 +739,8 @@ Begin
dtUnicodeString : Result^.UnicodeStrData^.Data := AStoreRdr.ReadUnicodeStr(); dtUnicodeString : Result^.UnicodeStrData^.Data := AStoreRdr.ReadUnicodeStr();
{$ENDIF WST_UNICODESTRING} {$ENDIF WST_UNICODESTRING}
dtBool : Result^.BoolData := AStoreRdr.ReadBool(); dtBool : Result^.BoolData := AStoreRdr.ReadBool();
dtAnsiChar : Result^.AnsiCharData := AStoreRdr.ReadAnsiChar();
dtWideChar : Result^.WideCharData := AStoreRdr.ReadWideChar();
dtEnum : Result^.EnumData := AStoreRdr.ReadEnum(); dtEnum : Result^.EnumData := AStoreRdr.ReadEnum();
dtObject : dtObject :
Begin Begin
@ -1051,6 +1077,24 @@ begin
StackTop().CreateBuffer(AName,dtBool)^.BoolData := AData; StackTop().CreateBuffer(AName,dtBool)^.BoolData := AData;
end; end;
procedure TBaseBinaryFormatter.PutAnsiChar(
const AName: String;
const ATypeInfo: PTypeInfo;
const AData: AnsiChar
);
begin
StackTop().CreateBuffer(AName,dtAnsiChar)^.AnsiCharData := AData;
end;
procedure TBaseBinaryFormatter.PutWideChar(
const AName: String;
const ATypeInfo: PTypeInfo;
const AData: WideChar
);
begin
StackTop().CreateBuffer(AName,dtWideChar)^.WideCharData := AData;
end;
procedure TBaseBinaryFormatter.PutInt64( procedure TBaseBinaryFormatter.PutInt64(
const AName: String; const AName: String;
const ATypeInfo: PTypeInfo; const ATypeInfo: PTypeInfo;
@ -1103,6 +1147,24 @@ begin
AData := GetDataBuffer(AName)^.BoolData; AData := GetDataBuffer(AName)^.BoolData;
end; end;
procedure TBaseBinaryFormatter.GetAnsiChar(
const ATypeInfo: PTypeInfo;
var AName: String;
var AData: AnsiChar
);
begin
AData := GetDataBuffer(AName)^.AnsiCharData;
end;
procedure TBaseBinaryFormatter.GetWideChar(
const ATypeInfo: PTypeInfo;
var AName: String;
var AData: WideChar
);
begin
AData := GetDataBuffer(AName)^.WideCharData;
end;
procedure TBaseBinaryFormatter.GetFloat( procedure TBaseBinaryFormatter.GetFloat(
const ATypeInfo : PTypeInfo; const ATypeInfo : PTypeInfo;
var AName : String; var AName : String;
@ -1239,7 +1301,10 @@ begin
Result := StackTop().IsCurrentScopeNil(); Result := StackTop().IsCurrentScopeNil();
end; end;
procedure TBaseBinaryFormatter.BeginObject(const AName: TDataName;const ATypeInfo: PTypeInfo); procedure TBaseBinaryFormatter.BeginObject(
const AName: string;
const ATypeInfo: PTypeInfo
);
begin begin
PushStack(StackTop().CreateBuffer(AName,dtObject)); PushStack(StackTop().CreateBuffer(AName,dtObject));
end; end;
@ -1332,8 +1397,20 @@ Var
{$IFDEF WST_UNICODESTRING} {$IFDEF WST_UNICODESTRING}
unicodeStrData : UnicodeString; unicodeStrData : UnicodeString;
{$ENDIF WST_UNICODESTRING} {$ENDIF WST_UNICODESTRING}
ansiCharData : AnsiChar;
wideCharData : WideChar;
begin begin
Case ATypeInfo^.Kind Of Case ATypeInfo^.Kind Of
tkChar :
begin
ansiCharData := AnsiChar(AData);
PutAnsiChar(AName,ATypeInfo,ansiCharData);
end;
tkWChar :
begin
wideCharData := WideChar(AData);
PutWideChar(AName,ATypeInfo,wideCharData);
end;
tkLString{$IFDEF FPC},tkAString{$ENDIF} : tkLString{$IFDEF FPC},tkAString{$ENDIF} :
Begin Begin
ansiStrData := String(AData); ansiStrData := String(AData);
@ -1439,9 +1516,21 @@ var
{$IFDEF WST_UNICODESTRING} {$IFDEF WST_UNICODESTRING}
unicodeStrData : UnicodeString; unicodeStrData : UnicodeString;
{$ENDIF WST_UNICODESTRING} {$ENDIF WST_UNICODESTRING}
ansiCharData : AnsiChar;
wideCharData : WideChar;
begin begin
CheckScope(); CheckScope();
case ATypeInfo^.Kind of case ATypeInfo^.Kind of
tkChar :
begin
ansiCharData := AnsiChar(AData);
StackTop().CreateInnerBuffer(dtAnsiChar)^.AnsiCharData:= ansiCharData;
end;
tkWChar :
begin
wideCharData := WideChar(AData);
StackTop().CreateInnerBuffer(dtWideChar)^.WideCharData:= wideCharData;
end;
tkLString{$IFDEF FPC},tkAString{$ENDIF} : tkLString{$IFDEF FPC},tkAString{$ENDIF} :
begin begin
strData := string(AData); strData := string(AData);
@ -1595,6 +1684,8 @@ Var
{$IFDEF WST_UNICODESTRING} {$IFDEF WST_UNICODESTRING}
unicodeStrData : UnicodeString; unicodeStrData : UnicodeString;
{$ENDIF WST_UNICODESTRING} {$ENDIF WST_UNICODESTRING}
ansiCharData : AnsiChar;
wideCharData : WideChar;
begin begin
Case ATypeInfo^.Kind Of Case ATypeInfo^.Kind Of
tkInt64{$IFDEF FPC},tkQWord{$ENDIF} : tkInt64{$IFDEF FPC},tkQWord{$ENDIF} :
@ -1642,6 +1733,18 @@ begin
Boolean(AData) := boolData; Boolean(AData) := boolData;
End; End;
{$ENDIF} {$ENDIF}
tkChar :
begin
ansiCharData := #0;
GetAnsiChar(ATypeInfo,AName,ansiCharData);
AnsiChar(AData) := ansiCharData;
end;
tkWChar :
begin
wideCharData := #0;
GetWideChar(ATypeInfo,AName,wideCharData);
WideChar(AData) := wideCharData;
end;
tkInteger, tkEnumeration : tkInteger, tkEnumeration :
Begin Begin
{$IFNDEF FPC} {$IFNDEF FPC}
@ -1707,6 +1810,8 @@ begin
CheckScope(); CheckScope();
dataBuffer := StackTop().GetInnerBuffer(); dataBuffer := StackTop().GetInnerBuffer();
Case ATypeInfo^.Kind Of Case ATypeInfo^.Kind Of
tkChar : AnsiChar(AData) := dataBuffer^.AnsiCharData ;
tkWChar : WideChar(AData) := dataBuffer^.WideCharData ;
tkInt64 : Int64(AData) := dataBuffer^.Int64S; tkInt64 : Int64(AData) := dataBuffer^.Int64S;
{$IFDEF FPC} {$IFDEF FPC}
tkQWord : QWord(AData) := dataBuffer^.Int64U; tkQWord : QWord(AData) := dataBuffer^.Int64U;

View File

@ -204,6 +204,16 @@ type
Const ATypeInfo : PTypeInfo; Const ATypeInfo : PTypeInfo;
Const AData : Boolean Const AData : Boolean
);{$IFDEF USE_INLINE}inline;{$ENDIF} );{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure PutAnsiChar(
Const AName : String;
Const ATypeInfo : PTypeInfo;
Const AData : AnsiChar
);{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure PutWideChar(
Const AName : String;
Const ATypeInfo : PTypeInfo;
Const AData : WideChar
);{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure PutInt64( procedure PutInt64(
Const AName : String; Const AName : String;
Const ATypeInfo : PTypeInfo; Const ATypeInfo : PTypeInfo;
@ -254,6 +264,16 @@ type
Var AData : Boolean Var AData : Boolean
);{$IFDEF USE_INLINE}inline;{$ENDIF} );{$IFDEF USE_INLINE}inline;{$ENDIF}
{$IFDEF FPC} {$IFDEF FPC}
procedure GetAnsiChar(
Const ATypeInfo : PTypeInfo;
Var AName : String;
Var AData : AnsiChar
);{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure GetWideChar(
Const ATypeInfo : PTypeInfo;
Var AName : String;
Var AData : WideChar
);{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure GetInt( procedure GetInt(
Const ATypeInfo : PTypeInfo; Const ATypeInfo : PTypeInfo;
Var AName : String; Var AName : String;
@ -455,6 +475,24 @@ begin
StackTop().CreateBoolBuffer(AName,AData); StackTop().CreateBoolBuffer(AName,AData);
end; end;
procedure TJsonRpcBaseFormatter.PutAnsiChar(
const AName: String;
const ATypeInfo: PTypeInfo;
const AData: AnsiChar
);
begin
StackTop().CreateStringBuffer(AName,AData);
end;
procedure TJsonRpcBaseFormatter.PutWideChar(
const AName: String;
const ATypeInfo: PTypeInfo;
const AData: WideChar
);
begin
StackTop().CreateStringBuffer(AName,AData);
end;
procedure TJsonRpcBaseFormatter.PutInt64( procedure TJsonRpcBaseFormatter.PutInt64(
const AName : String; const AName : String;
const ATypeInfo : PTypeInfo; const ATypeInfo : PTypeInfo;
@ -545,6 +583,36 @@ begin
AData := GetDataBuffer(AName).AsBoolean; AData := GetDataBuffer(AName).AsBoolean;
end; end;
procedure TJsonRpcBaseFormatter.GetAnsiChar(
const ATypeInfo: PTypeInfo;
var AName: String;
var AData: AnsiChar
);
var
tmpString : TJSONStringType;
begin
tmpString := GetDataBuffer(AName).AsString;
if ( Length(tmpString) > 0 ) then
AData := tmpString[1]
else
AData := #0;
end;
procedure TJsonRpcBaseFormatter.GetWideChar(
const ATypeInfo: PTypeInfo;
var AName: String;
var AData: WideChar
);
var
tmpString : TJSONStringType;
begin
tmpString := GetDataBuffer(AName).AsString;
if ( Length(tmpString) > 0 ) then
AData := tmpString[1]
else
AData := #0;
end;
procedure TJsonRpcBaseFormatter.GetInt( procedure TJsonRpcBaseFormatter.GetInt(
const ATypeInfo : PTypeInfo; const ATypeInfo : PTypeInfo;
var AName : String; var AName : String;
@ -804,8 +872,20 @@ Var
unicodeStrData : UnicodeString; unicodeStrData : UnicodeString;
{$ENDIF WST_UNICODESTRING} {$ENDIF WST_UNICODESTRING}
wideStrData : WideString; wideStrData : WideString;
ansiCharData : AnsiChar;
wideCharData : WideChar;
begin begin
Case ATypeInfo^.Kind Of Case ATypeInfo^.Kind Of
tkChar :
begin
ansiCharData := AnsiChar(AData);
PutAnsiChar(AName,ATypeInfo,ansiCharData);
end;
tkWChar :
begin
wideCharData := WideChar(AData);
PutWideChar(AName,ATypeInfo,wideCharData);
end;
tkLString{$IFDEF FPC},tkAString{$ENDIF} : tkLString{$IFDEF FPC},tkAString{$ENDIF} :
Begin Begin
strData := String(AData); strData := String(AData);
@ -909,9 +989,21 @@ var
{$IFDEF WST_UNICODESTRING} {$IFDEF WST_UNICODESTRING}
unicodeStrData : UnicodeString; unicodeStrData : UnicodeString;
{$ENDIF WST_UNICODESTRING} {$ENDIF WST_UNICODESTRING}
ansiCharData : AnsiChar;
wideCharData : WideChar;
begin begin
locName := s_inner_value; locName := s_inner_value;
Case ATypeInfo^.Kind Of Case ATypeInfo^.Kind Of
tkChar :
begin
ansiCharData := AnsiChar(AData);
PutAnsiChar(locName,ATypeInfo,ansiCharData);
end;
tkWChar :
begin
wideCharData := WideChar(AData);
PutWideChar(locName,ATypeInfo,wideCharData);
end;
tkLString{$IFDEF FPC},tkAString{$ENDIF} : tkLString{$IFDEF FPC},tkAString{$ENDIF} :
Begin Begin
strData := String(AData); strData := String(AData);
@ -1004,8 +1096,22 @@ Var
unicodeStrData : UnicodeString; unicodeStrData : UnicodeString;
{$ENDIF WST_UNICODESTRING} {$ENDIF WST_UNICODESTRING}
WideStrData : WideString; WideStrData : WideString;
ansiCharData : AnsiChar;
wideCharData : WideChar;
begin begin
Case ATypeInfo^.Kind Of Case ATypeInfo^.Kind Of
tkChar :
begin
ansiCharData := #0;
GetAnsiChar(ATypeInfo,AName,ansiCharData);
AnsiChar(AData) := ansiCharData;
end;
tkWChar :
begin
wideCharData := #0;
GetWideChar(ATypeInfo,AName,wideCharData);
WideChar(AData) := wideCharData;
end;
tkInt64{$IFDEF FPC},tkQWord{$ENDIF} : tkInt64{$IFDEF FPC},tkQWord{$ENDIF} :
Begin Begin
int64Data := 0; int64Data := 0;
@ -1120,9 +1226,23 @@ var
{$IFDEF WST_UNICODESTRING} {$IFDEF WST_UNICODESTRING}
unicodeStrData : UnicodeString; unicodeStrData : UnicodeString;
{$ENDIF WST_UNICODESTRING} {$ENDIF WST_UNICODESTRING}
ansiCharData : AnsiChar;
wideCharData : WideChar;
begin begin
locName := s_inner_value; locName := s_inner_value;
Case ATypeInfo^.Kind Of Case ATypeInfo^.Kind Of
tkChar :
begin
ansiCharData := #0;
GetAnsiChar(ATypeInfo,locName,ansiCharData);
AnsiChar(AData) := ansiCharData;
end;
tkWChar :
begin
wideCharData := #0;
GetWideChar(ATypeInfo,locName,wideCharData);
WideChar(AData) := wideCharData;
end;
tkInt64{$IFDEF FPC},tkQWord{$ENDIF} : tkInt64{$IFDEF FPC},tkQWord{$ENDIF} :
Begin Begin
int64Data := 0; int64Data := 0;

View File

@ -166,6 +166,18 @@ type
Const ATypeInfo : PTypeInfo; Const ATypeInfo : PTypeInfo;
Const AData : Boolean Const AData : Boolean
):TDOMNode;{$IFDEF USE_INLINE}inline;{$ENDIF} ):TDOMNode;{$IFDEF USE_INLINE}inline;{$ENDIF}
function PutAnsiChar(
const ANameSpace : string;
Const AName : String;
Const ATypeInfo : PTypeInfo;
Const AData : AnsiChar
):TDOMNode;{$IFDEF USE_INLINE}inline;{$ENDIF}
function PutWideChar(
const ANameSpace : string;
Const AName : String;
Const ATypeInfo : PTypeInfo;
Const AData : WideChar
):TDOMNode;{$IFDEF USE_INLINE}inline;{$ENDIF}
function PutInt64( function PutInt64(
const ANameSpace : string; const ANameSpace : string;
Const AName : String; Const AName : String;
@ -222,6 +234,18 @@ type
Var AName : String; Var AName : String;
Var AData : Boolean Var AData : Boolean
);{$IFDEF USE_INLINE}inline;{$ENDIF} );{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure GetAnsiChar(
Const ATypeInfo : PTypeInfo;
const ANameSpace : string;
Var AName : String;
Var AData : AnsiChar
);{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure GetWideChar(
Const ATypeInfo : PTypeInfo;
const ANameSpace : string;
Var AName : String;
Var AData : WideChar
);{$IFDEF USE_INLINE}inline;{$ENDIF}
{$IFDEF FPC} {$IFDEF FPC}
procedure GetInt( procedure GetInt(
Const ATypeInfo : PTypeInfo; Const ATypeInfo : PTypeInfo;
@ -821,6 +845,26 @@ begin
Result := InternalPutData(ANameSpace,AName,ATypeInfo,BoolToSoapBool(AData)); Result := InternalPutData(ANameSpace,AName,ATypeInfo,BoolToSoapBool(AData));
end; end;
function TSOAPBaseFormatter.PutAnsiChar(
const ANameSpace: string;
const AName: String;
const ATypeInfo: PTypeInfo;
const AData: AnsiChar
) : TDOMNode;
begin
Result := InternalPutData(ANameSpace,AName,ATypeInfo,AData);
end;
function TSOAPBaseFormatter.PutWideChar(
const ANameSpace: string;
const AName: String;
const ATypeInfo: PTypeInfo;
const AData: WideChar
): TDOMNode;
begin
Result := InternalPutData(ANameSpace,AName,ATypeInfo,AData);
end;
function TSOAPBaseFormatter.PutInt64( function TSOAPBaseFormatter.PutInt64(
const ANameSpace : string; const ANameSpace : string;
const AName : String; const AName : String;
@ -980,6 +1024,38 @@ begin
AData := StrToBool(locBuffer); AData := StrToBool(locBuffer);
end; end;
procedure TSOAPBaseFormatter.GetAnsiChar(
const ATypeInfo: PTypeInfo;
const ANameSpace: string;
var AName: String;
var AData: AnsiChar
);
var
tmpString : DOMString;
begin
tmpString := GetNodeValue(ANameSpace,AName);
if ( Length(tmpString) > 0 ) then
AData := AnsiChar(tmpString[1])
else
AData := #0;
end;
procedure TSOAPBaseFormatter.GetWideChar(
const ATypeInfo: PTypeInfo;
const ANameSpace: string;
var AName: String;
var AData: WideChar
);
var
tmpString : DOMString;
begin
tmpString := GetNodeValue(ANameSpace,AName);
if ( Length(tmpString) > 0 ) then
AData := tmpString[1]
else
AData := #0;
end;
{$IFDEF FPC} {$IFDEF FPC}
procedure TSOAPBaseFormatter.GetInt( procedure TSOAPBaseFormatter.GetInt(
const ATypeInfo: PTypeInfo; const ATypeInfo: PTypeInfo;
@ -1542,8 +1618,20 @@ Var
unicodeStrData : UnicodeString; unicodeStrData : UnicodeString;
{$ENDIF WST_UNICODESTRING} {$ENDIF WST_UNICODESTRING}
wideStrData : WideString; wideStrData : WideString;
ansiCharData : AnsiChar;
wideCharData : WideChar;
begin begin
Case ATypeInfo^.Kind Of Case ATypeInfo^.Kind Of
tkChar :
begin
ansiCharData := AnsiChar(AData);
PutAnsiChar(ANameSpace,AName,ATypeInfo,ansiCharData);
end;
tkWChar :
begin
wideCharData := WideChar(AData);
PutWideChar(ANameSpace,AName,ATypeInfo,wideCharData);
end;
tkInt64{$IFDEF FPC},tkQWord{$ENDIF} : tkInt64{$IFDEF FPC},tkQWord{$ENDIF} :
Begin Begin
int64Data := Int64(AData); int64Data := Int64(AData);
@ -1646,19 +1734,28 @@ Var
strData : string; strData : string;
enumData : TEnumIntType; enumData : TEnumIntType;
floatDt : Extended; floatDt : Extended;
dataBuffer : string; dataBuffer : DOMString;
frmt : string; frmt : string;
prcsn,i : Integer; prcsn,i : Integer;
wideStrData : WideString; wideStrData : WideString;
{$IFDEF WST_UNICODESTRING} {$IFDEF WST_UNICODESTRING}
unicodeStrData : UnicodeString; unicodeStrData : UnicodeString;
{$ENDIF WST_UNICODESTRING} {$ENDIF WST_UNICODESTRING}
{strm : TStringStream; ansiCharData : AnsiChar;
locDoc : TwstXMLDocument; wideCharData : WideChar;
locNode : TDOMNode;}
begin begin
CheckScope(); CheckScope();
Case ATypeInfo^.Kind Of Case ATypeInfo^.Kind Of
tkChar :
begin
ansiCharData := AnsiChar(AData);
dataBuffer := ansiCharData;
end;
tkWChar :
begin
wideCharData := WideChar(AData);
dataBuffer := wideCharData;
end;
tkInt64 : tkInt64 :
begin begin
int64SData := Int64(AData); int64SData := Int64(AData);
@ -1761,16 +1858,6 @@ begin
dataBuffer[i] := '.'; dataBuffer[i] := '.';
end; end;
end; end;
(*locDoc := nil;
strm := TStringStream.Create(dataBuffer);
try
ReadXMLFile(locDoc,strm);
locNode := locDoc.DocumentElement.CloneNode(True {$IFDEF FPC}, StackTop().ScopeObject.OwnerDocument{$ENDIF});
StackTop().ScopeObject.AppendChild(locNode);
finally
ReleaseDomNode(locDoc);
strm.Free();
end;*)
StackTop().ScopeObject.AppendChild(FDoc.CreateTextNode(dataBuffer)); StackTop().ScopeObject.AppendChild(FDoc.CreateTextNode(dataBuffer));
end; end;
@ -1792,8 +1879,22 @@ Var
unicodeStrData : UnicodeString; unicodeStrData : UnicodeString;
{$ENDIF WST_UNICODESTRING} {$ENDIF WST_UNICODESTRING}
wideStrData : WideString; wideStrData : WideString;
ansiCharData : AnsiChar;
wideCharData : WideChar;
begin begin
Case ATypeInfo^.Kind Of Case ATypeInfo^.Kind Of
tkChar :
begin
ansiCharData := #0;
GetAnsiChar(ATypeInfo,ANameSpace,AName,ansiCharData);
AnsiChar(AData) := ansiCharData;
end;
tkWChar :
begin
wideCharData := #0;
GetWideChar(ATypeInfo,ANameSpace,AName,wideCharData);
WideChar(AData) := wideCharData;
end;
tkInt64{$IFDEF FPC},tkQWord{$ENDIF} : tkInt64{$IFDEF FPC},tkQWord{$ENDIF} :
Begin Begin
int64Data := 0; int64Data := 0;
@ -1900,7 +2001,7 @@ procedure TSOAPBaseFormatter.GetScopeInnerValue(
Var Var
enumData : TEnumIntType; enumData : TEnumIntType;
floatDt : Extended; floatDt : Extended;
dataBuffer : string; dataBuffer : DOMString;
nd : TDOMNode; nd : TDOMNode;
begin begin
CheckScope(); CheckScope();
@ -1910,6 +2011,20 @@ begin
else else
dataBuffer := StackTop().ScopeObject.NodeValue; dataBuffer := StackTop().ScopeObject.NodeValue;
Case ATypeInfo^.Kind Of Case ATypeInfo^.Kind Of
tkChar :
begin
if ( Length(dataBuffer) > 0 ) then
AnsiChar(AData) := AnsiChar(dataBuffer[1])
else
AnsiChar(AData) := #0;
end;
tkWChar :
begin
if ( Length(dataBuffer) > 0 ) then
WideChar(AData) := dataBuffer[1]
else
WideChar(AData) := #0;
end;
tkInt64 : Int64(AData) := StrToInt64Def(Trim(dataBuffer),0); tkInt64 : Int64(AData) := StrToInt64Def(Trim(dataBuffer),0);
{$IFDEF FPC} {$IFDEF FPC}
tkQWord : QWord(AData) := StrToInt64Def(Trim(dataBuffer),0); tkQWord : QWord(AData) := StrToInt64Def(Trim(dataBuffer),0);

View File

@ -186,6 +186,16 @@ type
Const AData : Boolean Const AData : Boolean
):TDOMNode;{$IFDEF USE_INLINE}inline;{$ENDIF} ):TDOMNode;{$IFDEF USE_INLINE}inline;{$ENDIF}
{$ENDIF} {$ENDIF}
function PutAnsiChar(
Const AName : String;
Const ATypeInfo : PTypeInfo;
Const AData : AnsiChar
):TDOMNode;{$IFDEF USE_INLINE}inline;{$ENDIF}
function PutWideChar(
Const AName : String;
Const ATypeInfo : PTypeInfo;
Const AData : WideChar
):TDOMNode;{$IFDEF USE_INLINE}inline;{$ENDIF}
function PutInt64( function PutInt64(
Const AName : String; Const AName : String;
Const ATypeInfo : PTypeInfo; Const ATypeInfo : PTypeInfo;
@ -230,6 +240,16 @@ type
Var AName : String; Var AName : String;
Var AData : TEnumIntType Var AData : TEnumIntType
);{$IFDEF USE_INLINE}inline;{$ENDIF} );{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure GetAnsiChar(
Const ATypeInfo : PTypeInfo;
Var AName : String;
Var AData : AnsiChar
);{$IFDEF USE_INLINE}inline;{$ENDIF}
procedure GetWideChar(
Const ATypeInfo : PTypeInfo;
Var AName : String;
Var AData : WideChar
);{$IFDEF USE_INLINE}inline;{$ENDIF}
{$IFDEF FPC} {$IFDEF FPC}
procedure GetBool( procedure GetBool(
Const ATypeInfo : PTypeInfo; Const ATypeInfo : PTypeInfo;
@ -811,6 +831,24 @@ begin
end; end;
{$ENDIF} {$ENDIF}
function TXmlRpcBaseFormatter.PutAnsiChar(
const AName: String;
const ATypeInfo: PTypeInfo;
const AData: AnsiChar
) : TDOMNode;
begin
Result := InternalPutData(AName,xdtString,AData);
end;
function TXmlRpcBaseFormatter.PutWideChar(
const AName: String;
const ATypeInfo: PTypeInfo;
const AData: WideChar
) : TDOMNode;
begin
Result := InternalPutData(AName,xdtString,AData);
end;
function TXmlRpcBaseFormatter.PutInt64( function TXmlRpcBaseFormatter.PutInt64(
const AName : String; const AName : String;
const ATypeInfo : PTypeInfo; const ATypeInfo : PTypeInfo;
@ -966,6 +1004,36 @@ begin
end; end;
{$ENDIF} {$ENDIF}
procedure TXmlRpcBaseFormatter.GetAnsiChar(
const ATypeInfo: PTypeInfo;
var AName: String;
var AData: AnsiChar
);
var
locBuffer : DOMString;
begin
locBuffer := GetNodeValue(AName);
if ( Length(locBuffer) = 0 ) then
AData := #0
else
AData := AnsiChar(locBuffer[1]);
end;
procedure TXmlRpcBaseFormatter.GetWideChar(
const ATypeInfo: PTypeInfo;
var AName: String;
var AData: WideChar
);
var
locBuffer : DOMString;
begin
locBuffer := GetNodeValue(AName);
if ( Length(locBuffer) = 0 ) then
AData := #0
else
AData := locBuffer[1];
end;
procedure TXmlRpcBaseFormatter.GetInt64( procedure TXmlRpcBaseFormatter.GetInt64(
const ATypeInfo : PTypeInfo; const ATypeInfo : PTypeInfo;
var AName : String; var AName : String;
@ -1214,8 +1282,20 @@ Var
unicodeStrData : UnicodeString; unicodeStrData : UnicodeString;
{$ENDIF WST_UNICODESTRING} {$ENDIF WST_UNICODESTRING}
wideStrData : WideString; wideStrData : WideString;
ansiCharData : AnsiChar;
wideCharData : WideChar;
begin begin
Case ATypeInfo^.Kind Of Case ATypeInfo^.Kind Of
tkChar :
begin
ansiCharData := AnsiChar(AData);
PutAnsiChar(AName,ATypeInfo,ansiCharData);
end;
tkWChar :
begin
wideCharData := WideChar(AData);
PutWideChar(AName,ATypeInfo,wideCharData);
end;
tkInt64{$IFDEF FPC},tkQWord{$ENDIF} : tkInt64{$IFDEF FPC},tkQWord{$ENDIF} :
Begin Begin
int64Data := Int64(AData); int64Data := Int64(AData);
@ -1307,16 +1387,28 @@ Var
strData : string; strData : string;
enumData : TEnumIntType; enumData : TEnumIntType;
floatDt : Extended; floatDt : Extended;
dataBuffer : string; dataBuffer : DOMString;
frmt : string; frmt : string;
prcsn,i : Integer; prcsn,i : Integer;
wideStrData : WideString; wideStrData : WideString;
{$IFDEF WST_UNICODESTRING} {$IFDEF WST_UNICODESTRING}
unicodeStrData : UnicodeString; unicodeStrData : UnicodeString;
{$ENDIF WST_UNICODESTRING} {$ENDIF WST_UNICODESTRING}
ansiCharData : AnsiChar;
wideCharData : WideChar;
begin begin
CheckScope(); CheckScope();
Case ATypeInfo^.Kind Of Case ATypeInfo^.Kind Of
tkChar :
begin
ansiCharData := AnsiChar(AData);
dataBuffer := ansiCharData;
end;
tkWChar :
begin
wideCharData := WideChar(AData);
dataBuffer := wideCharData;
end;
tkInt64 : tkInt64 :
begin begin
int64SData := Int64(AData); int64SData := Int64(AData);
@ -1439,8 +1531,22 @@ Var
unicodeStrData : UnicodeString; unicodeStrData : UnicodeString;
{$ENDIF WST_UNICODESTRING} {$ENDIF WST_UNICODESTRING}
wideStrData : WideString; wideStrData : WideString;
ansiCharData : AnsiChar;
wideCharData : WideChar;
begin begin
Case ATypeInfo^.Kind Of Case ATypeInfo^.Kind Of
tkChar :
begin
ansiCharData := #0;
GetAnsiChar(ATypeInfo,AName,ansiCharData);
AnsiChar(AData) := ansiCharData;
end;
tkWChar :
begin
wideCharData := #0;
GetWideChar(ATypeInfo,AName,wideCharData);
WideChar(AData) := wideCharData;
end;
tkInt64{$IFDEF FPC},tkQWord{$ENDIF} : tkInt64{$IFDEF FPC},tkQWord{$ENDIF} :
Begin Begin
int64Data := 0; int64Data := 0;
@ -1536,7 +1642,7 @@ procedure TXmlRpcBaseFormatter.GetScopeInnerValue(
Var Var
enumData : TEnumIntType; enumData : TEnumIntType;
floatDt : Extended; floatDt : Extended;
dataBuffer : string; dataBuffer : DOMString;
nd : TDOMNode; nd : TDOMNode;
begin begin
CheckScope(); CheckScope();
@ -1546,6 +1652,20 @@ begin
else else
dataBuffer := StackTop().ScopeObject.NodeValue; dataBuffer := StackTop().ScopeObject.NodeValue;
Case ATypeInfo^.Kind Of Case ATypeInfo^.Kind Of
tkChar :
begin
if ( Length(dataBuffer) > 0 ) then
AnsiChar(AData) := AnsiChar(dataBuffer[1])
else
AnsiChar(AData) := #0;
end;
tkWChar :
begin
if ( Length(dataBuffer) > 0 ) then
WideChar(AData) :=dataBuffer[1]
else
WideChar(AData) := #0;
end;
tkInt64 : Int64(AData) := StrToInt64Def(Trim(dataBuffer),0); tkInt64 : Int64(AData) := StrToInt64Def(Trim(dataBuffer),0);
{$IFDEF FPC} {$IFDEF FPC}
tkQWord : QWord(AData) := StrToInt64Def(Trim(dataBuffer),0); tkQWord : QWord(AData) := StrToInt64Def(Trim(dataBuffer),0);

View File

@ -35,6 +35,8 @@ Type
{$IFDEF WST_UNICODESTRING} {$IFDEF WST_UNICODESTRING}
TUnicodeStringData = UnicodeString; TUnicodeStringData = UnicodeString;
{$ENDIF WST_UNICODESTRING} {$ENDIF WST_UNICODESTRING}
TAnsiCharacter = AnsiChar;
TWideCharacter = WideChar;
TFloat_Single_4 = Single; TFloat_Single_4 = Single;
TFloat_Double_8 = Double; TFloat_Double_8 = Double;
@ -56,6 +58,8 @@ Type
procedure WriteInt64S(Const AData : TInt64S); procedure WriteInt64S(Const AData : TInt64S);
procedure WriteBool(Const AData : TBoolData); procedure WriteBool(Const AData : TBoolData);
procedure WriteAnsiChar(const AData : TAnsiCharacter);
procedure WriteWideChar(const AData : TWideCharacter);
procedure WriteEnum(Const AData : TEnumData); procedure WriteEnum(Const AData : TEnumData);
procedure WriteAnsiStr(Const AData : TAnsiStringData); procedure WriteAnsiStr(Const AData : TAnsiStringData);
procedure WriteWideStr(Const AData : TWideStringData); procedure WriteWideStr(Const AData : TWideStringData);
@ -85,6 +89,8 @@ Type
function ReadInt64S():TInt64S; function ReadInt64S():TInt64S;
function ReadBool():TBoolData; function ReadBool():TBoolData;
function ReadAnsiChar() : TAnsiCharacter;
function ReadWideChar() : TWideCharacter;
function ReadEnum():TEnumData; function ReadEnum():TEnumData;
function ReadAnsiStr():TAnsiStringData; function ReadAnsiStr():TAnsiStringData;
function ReadWideStr():TWideStringData; function ReadWideStr():TWideStringData;
@ -217,6 +223,8 @@ Type
procedure WriteInt64S(Const AData : TInt64S); procedure WriteInt64S(Const AData : TInt64S);
procedure WriteBool(Const AData : TBoolData); procedure WriteBool(Const AData : TBoolData);
procedure WriteAnsiChar(const AData : TAnsiCharacter);
procedure WriteWideChar(const AData : TWideCharacter);
procedure WriteEnum(Const AData : TEnumData); procedure WriteEnum(Const AData : TEnumData);
procedure WriteAnsiStr(Const AData : TAnsiStringData); procedure WriteAnsiStr(Const AData : TAnsiStringData);
procedure WriteWideStr(Const AData : TWideStringData); procedure WriteWideStr(Const AData : TWideStringData);
@ -252,6 +260,8 @@ Type
function ReadInt64S():TInt64S; function ReadInt64S():TInt64S;
function ReadBool():TBoolData; function ReadBool():TBoolData;
function ReadAnsiChar() : TAnsiCharacter;
function ReadWideChar() : TWideCharacter;
function ReadEnum():TEnumData; function ReadEnum():TEnumData;
function ReadAnsiStr():TAnsiStringData; function ReadAnsiStr():TAnsiStringData;
function ReadWideStr():TWideStringData; function ReadWideStr():TWideStringData;
@ -380,6 +390,16 @@ begin
WriteInt8U(i); WriteInt8U(i);
end; end;
procedure TDataStore.WriteAnsiChar(const AData: TAnsiCharacter);
begin
WriteInt8U(Ord(AData));
end;
procedure TDataStore.WriteWideChar(const AData: TWideCharacter);
begin
WriteInt16U(Ord(AData));
end;
procedure TDataStore.WriteEnum(const AData: TEnumData); procedure TDataStore.WriteEnum(const AData: TEnumData);
begin begin
WriteInt64S(AData); WriteInt64S(AData);
@ -558,6 +578,16 @@ begin
Result := ( ReadInt8U() > 0 ); Result := ( ReadInt8U() > 0 );
end; end;
function TDataStoreReader.ReadAnsiChar(): TAnsiCharacter;
begin
Result := TAnsiCharacter(ReadInt8U());
end;
function TDataStoreReader.ReadWideChar(): TWideCharacter;
begin
Result := TWideCharacter(ReadInt16U());
end;
function TDataStoreReader.ReadEnum(): TEnumData; function TDataStoreReader.ReadEnum(): TEnumData;
begin begin
Result := ReadInt64S(); Result := ReadInt64S();

View File

@ -368,6 +368,10 @@ type
function Support_ComplextType_with_SimpleContent():Boolean;virtual; function Support_ComplextType_with_SimpleContent():Boolean;virtual;
function Support_nil():Boolean;virtual; function Support_nil():Boolean;virtual;
published published
procedure Test_AnsiChar;
procedure Test_AnsiChar_ScopeData;
procedure Test_WideChar;
procedure Test_WideChar_ScopeData;
procedure Test_Int_8; procedure Test_Int_8;
procedure Test_Int_8_ScopeData; procedure Test_Int_8_ScopeData;
procedure Test_Int_16; procedure Test_Int_16;
@ -720,6 +724,189 @@ begin
Result := True; Result := True;
end; end;
procedure TTestFormatterSimpleType.Test_AnsiChar;
const VAL_1 : AnsiChar = 'O'; VAL_2 : AnsiChar = 'i';
Var
f : IFormatterBase;
s : TMemoryStream;
x : string;
xVal_1, xVal_2 : AnsiChar;
begin
s := Nil;
Try
xVal_1 := VAL_1;
xVal_2 := VAL_2;
f := CreateFormatter(TypeInfo(TClass_Int));
f.BeginObject('Root',TypeInfo(TClass_Int));
f.Put('xVal_1',TypeInfo(AnsiChar),xVal_1);
f.Put('xVal_2',TypeInfo(AnsiChar),xVal_2);
f.EndScope();
s := TMemoryStream.Create();
f.SaveToStream(s); s.SaveToFile(ClassName + '.Test_AnsiChar.xml');
xVal_1 := #0;
xVal_2 := #0;
f := CreateFormatter(TypeInfo(TClass_Int));
s.Position := 0;
f.LoadFromStream(s);
x := 'Root';
f.BeginObjectRead(x,TypeInfo(TClass_Int));
x := 'xVal_1';
f.Get(TypeInfo(AnsiChar),x,xVal_1);
x := 'xVal_2';
f.Get(TypeInfo(AnsiChar),x,xVal_2);
f.EndScopeRead();
CheckEquals(VAL_1,xVal_1);
CheckEquals(VAL_2,xVal_2);
Finally
s.Free();
End;
end;
procedure TTestFormatterSimpleType.Test_AnsiChar_ScopeData;
const VAL_1 : AnsiChar = 'O'; VAL_2 : AnsiChar = 'i';
var
f : IFormatterBase;
s : TMemoryStream;
x : string;
xVal_1 : AnsiChar;
begin
s := Nil;
try
xVal_1 := VAL_1;
f := CreateFormatter(TypeInfo(TClass_Int));
f.BeginObject('Root',TypeInfo(TClass_Int));
f.PutScopeInnerValue(TypeInfo(AnsiChar),xVal_1);
f.EndScope();
s := TMemoryStream.Create();
f.SaveToStream(s);
xVal_1 := #0;
f := CreateFormatter(TypeInfo(TClass_Int));
s.Position := 0;
f.LoadFromStream(s);
x := 'Root';
f.BeginObjectRead(x,TypeInfo(TClass_Int));
f.GetScopeInnerValue(TypeInfo(AnsiChar),xVal_1);
f.EndScopeRead();
CheckEquals(VAL_1,xVal_1);
xVal_1 := VAL_2;
f := CreateFormatter(TypeInfo(TClass_Int));
f.BeginObject('Root',TypeInfo(TClass_Int));
f.PutScopeInnerValue(TypeInfo(AnsiChar),xVal_1);
f.EndScope();
s := TMemoryStream.Create();
f.SaveToStream(s);
xVal_1 := #0;
f := CreateFormatter(TypeInfo(TClass_Int));
s.Position := 0;
f.LoadFromStream(s);
x := 'Root';
f.BeginObjectRead(x,TypeInfo(TClass_Int));
f.GetScopeInnerValue(TypeInfo(AnsiChar),xVal_1);
f.EndScopeRead();
CheckEquals(VAL_2,xVal_1);
finally
s.Free();
end;
end;
procedure TTestFormatterSimpleType.Test_WideChar;
const VAL_1 : WideChar = WideChar(300); VAL_2 : WideChar = WideChar(400);
Var
f : IFormatterBase;
s : TMemoryStream;
x : string;
xVal_1, xVal_2 : WideChar;
begin
s := Nil;
Try
xVal_1 := VAL_1;
xVal_2 := VAL_2;
f := CreateFormatter(TypeInfo(TClass_Int));
f.BeginObject('Root',TypeInfo(TClass_Int));
f.Put('xVal_1',TypeInfo(WideChar),xVal_1);
f.Put('xVal_2',TypeInfo(WideChar),xVal_2);
f.EndScope();
s := TMemoryStream.Create();
f.SaveToStream(s); s.SaveToFile(ClassName + '.Test_WideChar.xml');
xVal_1 := #0;
xVal_2 := #0;
f := CreateFormatter(TypeInfo(TClass_Int));
s.Position := 0;
f.LoadFromStream(s);
x := 'Root';
f.BeginObjectRead(x,TypeInfo(TClass_Int));
x := 'xVal_1';
f.Get(TypeInfo(WideChar),x,xVal_1);
x := 'xVal_2';
f.Get(TypeInfo(WideChar),x,xVal_2);
f.EndScopeRead();
CheckEquals(VAL_1,xVal_1);
CheckEquals(VAL_2,xVal_2);
Finally
s.Free();
End;
end;
procedure TTestFormatterSimpleType.Test_WideChar_ScopeData;
const VAL_1 : WideChar = WideChar(300); VAL_2 : WideChar = WideChar(400);
var
f : IFormatterBase;
s : TMemoryStream;
x : string;
xVal_1 : WideChar;
begin
s := Nil;
try
xVal_1 := VAL_1;
f := CreateFormatter(TypeInfo(TClass_Int));
f.BeginObject('Root',TypeInfo(TClass_Int));
f.PutScopeInnerValue(TypeInfo(WideChar),xVal_1);
f.EndScope();
s := TMemoryStream.Create();
f.SaveToStream(s);
xVal_1 := #0;
f := CreateFormatter(TypeInfo(TClass_Int));
s.Position := 0;
f.LoadFromStream(s);
x := 'Root';
f.BeginObjectRead(x,TypeInfo(TClass_Int));
f.GetScopeInnerValue(TypeInfo(WideChar),xVal_1);
f.EndScopeRead();
CheckEquals(VAL_1,xVal_1);
xVal_1 := VAL_2;
f := CreateFormatter(TypeInfo(TClass_Int));
f.BeginObject('Root',TypeInfo(TClass_Int));
f.PutScopeInnerValue(TypeInfo(WideChar),xVal_1);
f.EndScope();
s := TMemoryStream.Create();
f.SaveToStream(s);
xVal_1 := #0;
f := CreateFormatter(TypeInfo(TClass_Int));
s.Position := 0;
f.LoadFromStream(s);
x := 'Root';
f.BeginObjectRead(x,TypeInfo(TClass_Int));
f.GetScopeInnerValue(TypeInfo(WideChar),xVal_1);
f.EndScopeRead();
CheckEquals(VAL_2,xVal_1);
finally
s.Free();
end; end;
procedure TTestFormatterSimpleType.Test_Int_8; procedure TTestFormatterSimpleType.Test_Int_8;
const VAL_1 = 12; VAL_2 = -10; const VAL_1 = 12; VAL_2 = -10;
Var Var