From ae486ffc8b8292d23ac42ad6e2d71693e1fcd1e1 Mon Sep 17 00:00:00 2001 From: inoussa Date: Mon, 29 Jun 2009 13:39:17 +0000 Subject: [PATCH] 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 --- wst/trunk/base_xmlrpc_formatter.pas | 25 ++++++--- .../tests/test_suite/testformatter_unit.pas | 56 +++++++++++++++++++ 2 files changed, 73 insertions(+), 8 deletions(-) diff --git a/wst/trunk/base_xmlrpc_formatter.pas b/wst/trunk/base_xmlrpc_formatter.pas index 007c523ba..effa2bbd0 100644 --- a/wst/trunk/base_xmlrpc_formatter.pas +++ b/wst/trunk/base_xmlrpc_formatter.pas @@ -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; diff --git a/wst/trunk/tests/test_suite/testformatter_unit.pas b/wst/trunk/tests/test_suite/testformatter_unit.pas index 91d799cb3..72709444c 100644 --- a/wst/trunk/tests/test_suite/testformatter_unit.pas +++ b/wst/trunk/tests/test_suite/testformatter_unit.pas @@ -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 = + //'' + sLineBreak + + '' + sLineBreak + + ' ' + sLineBreak + + ' o1' + sLineBreak + + ' ' + sLineBreak + + ' ' + sLineBreak + + ' ' + sLineBreak + + ' fieldSmallint' + sLineBreak + + ' 123' + sLineBreak + + ' ' + sLineBreak + + ' ' + sLineBreak + + ' fieldWord' + sLineBreak + + ' 456' + sLineBreak + + ' ' + sLineBreak + + ' ' + sLineBreak + + ' fieldString' + sLineBreak + + ' fpc-wst' + sLineBreak + + ' ' + sLineBreak + + ' ' + sLineBreak + + ' ' + sLineBreak + + ' ' + sLineBreak + + ''; + +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;