XMLRPC Serializer : type free data defaults to string

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@880 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
inoussa
2009-06-29 13:39:17 +00:00
parent f9ae9d0348
commit ae486ffc8b
2 changed files with 73 additions and 8 deletions

View File

@ -242,7 +242,11 @@ type
const AData : Pointer
);{$IFDEF USE_INLINE}inline;{$ENDIF}
function GetNodeValue(var AName : string; out AResBuffer : DOMString) : Boolean;
function GetNodeValue(
var AName : string;
out AResBuffer : DOMString;
const AHandleDefaultType : Boolean = False
) : Boolean;
function GetEnum(
Const ATypeInfo : PTypeInfo;
Var AName : String;
@ -951,27 +955,32 @@ end;
function TXmlRpcBaseFormatter.GetNodeValue(
var AName: string;
out AResBuffer : DOMString
out AResBuffer : DOMString;
const AHandleDefaultType : Boolean
) : Boolean;
var
locElt : TDOMNode;
stkTop : TStackItem;
begin
stkTop := StackTop();
locElt := stkTop.FindNode(AName) as TDOMElement;
locElt := stkTop.FindNode(AName);
Result := ( locElt <> nil );
if Result then begin
if locElt.HasChildNodes then begin
AResBuffer := locElt.FirstChild.NodeValue
end else begin
if ( stkTop.FoundState = fsFoundNil ) then
AResBuffer := ''
if ( stkTop.FoundState = fsFoundNil ) then begin
if AHandleDefaultType then
AResBuffer := locElt.NodeValue
else
AResBuffer := '';
end else begin
AResBuffer := locElt.NodeValue;
end;
end;
end;
end;
function TXmlRpcBaseFormatter.GetEnum(
const ATypeInfo: PTypeInfo;
@ -1106,7 +1115,7 @@ function TXmlRpcBaseFormatter.GetStr(
var
locBuffer : DOMString;
begin
Result := GetNodeValue(AName,locBuffer);
Result := GetNodeValue(AName,locBuffer,True);
if Result then
AData := locBuffer;
end;

View File

@ -594,6 +594,7 @@ type
function Support_nil():Boolean;override;
published
procedure test_WriteBuffer();
procedure test_default_data_type();
end;
{ TTestArray }
@ -5563,6 +5564,61 @@ begin
end;
end;
procedure TTestXmlRpcFormatter.test_default_data_type();
const
s_XML_BUFFER : ansistring =
//'<?xml version="1.0"?>' + sLineBreak +
'<struct>' + sLineBreak +
' <member>' + sLineBreak +
' <name>o1</name>' + sLineBreak +
' <value>' + sLineBreak +
' <struct>' + sLineBreak +
' <member>' + sLineBreak +
' <name>fieldSmallint</name>' + sLineBreak +
' <value><int>123</int></value>' + sLineBreak +
' </member>' + sLineBreak +
' <member>' + sLineBreak +
' <name>fieldWord</name>' + sLineBreak +
' <value><int>456</int></value>' + sLineBreak +
' </member>' + sLineBreak +
' <member>' + sLineBreak +
' <name>fieldString</name>' + sLineBreak +
' <value>fpc-wst</value>' + sLineBreak +
' </member>' + sLineBreak +
' </struct>' + sLineBreak +
' </value>' + sLineBreak +
' </member>' + sLineBreak +
'</struct>';
var
f : IFormatterBase;
s : TMemoryStream;
a : TTestSmallClass;
x : string;
begin
s := Nil;
a := TTestSmallClass.Create();
try
f := CreateFormatter(TypeInfo(TClass_B));
s := TMemoryStream.Create();
s.Write(s_XML_BUFFER[1],Length(s_XML_BUFFER));
s.Position := 0;
f.LoadFromStream(s);
x := 'Root';
f.BeginObjectRead(x,TypeInfo(TClass_B));
x := 'o1';
f.Get(TypeInfo(TTestSmallClass),x,a);
f.EndScopeRead();
CheckEquals(123,a.fieldSmallint);
CheckEquals(456,a.fieldWord);
CheckEquals('fpc-wst',a.fieldString);
finally
a.Free();
s.Free();
end;
end;
{ TTest_SoapFormatterExceptionBlock }
function TTest_SoapFormatterExceptionBlock.CreateFormatter() : IFormatterResponse;