You've already forked lazarus-ccr
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:
@ -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;
|
||||
@ -950,25 +954,30 @@ begin
|
||||
end;
|
||||
|
||||
function TXmlRpcBaseFormatter.GetNodeValue(
|
||||
var AName: string;
|
||||
out AResBuffer : DOMString
|
||||
var AName: string;
|
||||
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 := ''
|
||||
else
|
||||
if ( stkTop.FoundState = fsFoundNil ) then begin
|
||||
if AHandleDefaultType then
|
||||
AResBuffer := locElt.NodeValue
|
||||
else
|
||||
AResBuffer := '';
|
||||
end else begin
|
||||
AResBuffer := locElt.NodeValue;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
@ -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;
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user