You are viewing a plain text version of this content. The canonical link for it is here.
Posted to c-dev@axis.apache.org by Franz Fehringer <fe...@isogmbh.de> on 2006/11/15 15:06:58 UTC

getChardataAs() strikes again

Hello Nadir,

I found out, that your fix for the getChardataAs() problem does not 
cover all possible cases.
More to the point it only works if the C/C++ Variable where the 
character data is to be read in is of pointer type (which in this 
situation means mostly xsd_string or xsd__nmtoken i.e. char*).
If the character data is to be read into a double say, then

    * the levels of (de)referencing are wrong.
    * (on my computer at least) a double (8 byte) does not fit into a
      void* (4 byte).

The XSD snippet exposing this problem is

    <xsd:simpleType name="t_AmountOfMoney">
        <xsd:restriction base="xsd:double">
            <xsd:maxExclusive value="100000000000000000000"/>
            <!--<xsd:fractionDigits value="10"/>-->
            <xsd:minInclusive value="0"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:complexType name="t_BuyRate">
        <xsd:simpleContent>
            <xsd:extension base="t_AmountOfMoney">
                <xsd:attribute name="currencyCode" type="t_CurrencyCode" 
use="required"/>
                <xsd:attribute name="inclusiveOfTax" type="xsd:boolean" 
use="required"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>

I resolved the problem by the changing SoapDeSerializer.cpp and 
BeanParamWriter.java.
The change in SoapDeSerializer.cpp is the same as proposed by Michael 
Xiong but his BeanParamWriter.java change suffers from the same problem 
as yours.
Below you find the relevant diffs.
Any chances for getting this into SVN?

Best regards

Franz


Index: SoapDeSerializer.cpp
===================================================================
--- SoapDeSerializer.cpp        (Revision 475161)
+++ SoapDeSerializer.cpp        (Arbeitskopie)
@@ -2522,7 +2522,7 @@
 }

 void
-SoapDeSerializer::getChardataAs (void **pValue,
+SoapDeSerializer::getChardataAs (void*& pValue,
                                  XSDTYPE type)
 {
     if (!m_pNode)
@@ -2532,7 +2532,7 @@
     {
         IAnySimpleType* pSimpleType = 
AxisUtils::createSimpleTypeObject(type);
         pSimpleType->deserialize(m_pNode->m_pchNameOrValue);
-        *pValue = pSimpleType->getValue();
+        pValue = pSimpleType->getValue();
         delete pSimpleType;
     }
 }

Index: SoapDeSerializer.h
===================================================================
--- SoapDeSerializer.h  (Revision 475161)
+++ SoapDeSerializer.h  (Arbeitskopie)
@@ -320,7 +320,7 @@
     int AXISCALL getStatus(){return m_nStatus;};
        AnyType* AXISCALL getAnyObject();
     void serializeTag(AxisString& xmlStr, const AnyElement* node, 
AxisString& nsDecls);
-    void getChardataAs(void** pValue, XSDTYPE type);
+    void getChardataAs(void*& pValue, XSDTYPE type);

     /**
       *Returns the attachemtn object for the given id.

Index: axis/IWrapperSoapDeSerializer.hpp
===================================================================
--- axis/IWrapperSoapDeSerializer.hpp   (Revision 475161)
+++ axis/IWrapperSoapDeSerializer.hpp   (Arbeitskopie)
@@ -964,7 +964,7 @@
      * @param pValue object into which deserialized value will be placed
      * @param type The xsd simple type of the data.
      */
-    virtual void getChardataAs(void** pValue,
+    virtual void getChardataAs(void*& pValue,
                                XSDTYPE type)=0;

     /**

Index: BeanParamWriter.java
===================================================================
--- BeanParamWriter.java        (Revision 475161)
+++ BeanParamWriter.java        (Arbeitskopie)
@@ -971,9 +971,18 @@
         {
             if (extensionBaseAttrib != null)
             {
-                writer.write("\tpIWSDZ->getChardataAs((void **)&(param->"
-                        + extensionBaseAttrib.getParamNameAsMember() + 
"), "
-                        + 
CUtils.getXSDTypeForBasicType(extensionBaseAttrib.getTypeName()) + ");\n");
+                writer.write("\tvoid* pCharData;\n\n");
+                String typeName = extensionBaseAttrib.getTypeName();
+                String xsdType = CUtils.getXSDTypeForBasicType(typeName);
+                writer.write("\tpIWSDZ->getChardataAs(pCharData, " + 
xsdType + ");\n");
+                if (CUtils.isPointerType(typeName))
+                {
+                    writer.write("\tparam->" + 
extensionBaseAttrib.getParamNameAsMember() + " = (" + typeName + ") pCha
rData;\n");
+                }
+                else
+                {
+                    writer.write("\tparam->" + 
extensionBaseAttrib.getParamNameAsMember() + " = *(" + typeName + "*) pC
harData;\n");
+                }
             }
             else
             {
@@ -1248,9 +1257,18 @@
         if (extensionBaseAttrib != null
                 && extensionBaseAttrib.getTypeName() != null)
         {
-            writer.write("\tpIWSDZ->getChardataAs((void **)&(param->"
-                    + extensionBaseAttrib.getParamNameAsMember() + "), "
-                    + 
CUtils.getXSDTypeForBasicType(extensionBaseAttrib.getTypeName()) + ");\n");
+            writer.write("\tvoid* pCharData;\n\n");
+            String typeName = extensionBaseAttrib.getTypeName();
+            String xsdType = CUtils.getXSDTypeForBasicType(typeName);
+            writer.write("\tpIWSDZ->getChardataAs(pCharData, " + 
xsdType + ");\n");
+            if (CUtils.isPointerType(typeName))
+            {
+                writer.write("\tparam->" + 
extensionBaseAttrib.getParamNameAsMember() + " = (" + typeName + ") pCharDat
a;\n");
+            }
+            else
+            {
+               writer.write("\tparam->" + 
extensionBaseAttrib.getParamNameAsMember() + " = *(" + typeName + "*) 
pCharDa
ta;\n");
+            }
         }

         writer.write("\treturn pIWSDZ->getStatus();\n");



Re: getChardataAs() strikes again

Posted by Nadir Amra <am...@us.ibm.com>.
Yes...I will get them in. Thanks.

Nadir K. Amra


Franz Fehringer <fe...@isogmbh.de> wrote on 11/15/2006 08:06:58 AM:

> Hello Nadir,
> 
> I found out, that your fix for the getChardataAs() problem does not 
> cover all possible cases.
> More to the point it only works if the C/C++ Variable where the 
> character data is to be read in is of pointer type (which in this 
> situation means mostly xsd_string or xsd__nmtoken i.e. char*).
> If the character data is to be read into a double say, then
> the levels of (de)referencing are wrong.
> (on my computer at least) a double (8 byte) does not fit into a 
> void* (4 byte).
> The XSD snippet exposing this problem is
> 
>     <xsd:simpleType name="t_AmountOfMoney">
>         <xsd:restriction base="xsd:double">
>             <xsd:maxExclusive value="100000000000000000000"/>
>             <!--<xsd:fractionDigits value="10"/>-->
>             <xsd:minInclusive value="0"/>
>         </xsd:restriction>
>     </xsd:simpleType>
>     <xsd:complexType name="t_BuyRate">
>         <xsd:simpleContent>
>             <xsd:extension base="t_AmountOfMoney">
>                 <xsd:attribute name="currencyCode" 
> type="t_CurrencyCode" use="required"/>
>                 <xsd:attribute name="inclusiveOfTax" type="xsd:
> boolean" use="required"/>
>             </xsd:extension>
>         </xsd:simpleContent>
>     </xsd:complexType>
> 
> I resolved the problem by the changing SoapDeSerializer.cpp and 
> BeanParamWriter.java.
> The change in SoapDeSerializer.cpp is the same as proposed by 
> Michael Xiong but his BeanParamWriter.java change suffers from the 
> same problem as yours.
> Below you find the relevant diffs.
> Any chances for getting this into SVN?
> 
> Best regards
> 
> Franz
> 
> 
> Index: SoapDeSerializer.cpp
> ===================================================================
> --- SoapDeSerializer.cpp        (Revision 475161)
> +++ SoapDeSerializer.cpp        (Arbeitskopie)
> @@ -2522,7 +2522,7 @@
>  }
> 
>  void
> -SoapDeSerializer::getChardataAs (void **pValue,
> +SoapDeSerializer::getChardataAs (void*& pValue,
>                                   XSDTYPE type)
>  {
>      if (!m_pNode)
> @@ -2532,7 +2532,7 @@
>      {
>          IAnySimpleType* pSimpleType = AxisUtils::
> createSimpleTypeObject(type);
>          pSimpleType->deserialize(m_pNode->m_pchNameOrValue);
> -        *pValue = pSimpleType->getValue();
> +        pValue = pSimpleType->getValue();
>          delete pSimpleType;
>      }
>  }
> 
> Index: SoapDeSerializer.h
> ===================================================================
> --- SoapDeSerializer.h  (Revision 475161)
> +++ SoapDeSerializer.h  (Arbeitskopie)
> @@ -320,7 +320,7 @@
>      int AXISCALL getStatus(){return m_nStatus;};
>         AnyType* AXISCALL getAnyObject();
>      void serializeTag(AxisString& xmlStr, const AnyElement* node, 
> AxisString& nsDecls);
> -    void getChardataAs(void** pValue, XSDTYPE type);
> +    void getChardataAs(void*& pValue, XSDTYPE type);
> 
>      /**
>        *Returns the attachemtn object for the given id.
> 
> Index: axis/IWrapperSoapDeSerializer.hpp
> ===================================================================
> --- axis/IWrapperSoapDeSerializer.hpp   (Revision 475161)
> +++ axis/IWrapperSoapDeSerializer.hpp   (Arbeitskopie)
> @@ -964,7 +964,7 @@
>       * @param pValue object into which deserialized value will be 
placed
>       * @param type The xsd simple type of the data.
>       */
> -    virtual void getChardataAs(void** pValue,
> +    virtual void getChardataAs(void*& pValue,
>                                 XSDTYPE type)=0;
> 
>      /**
> 
> Index: BeanParamWriter.java
> ===================================================================
> --- BeanParamWriter.java        (Revision 475161)
> +++ BeanParamWriter.java        (Arbeitskopie)
> @@ -971,9 +971,18 @@
>          {
>              if (extensionBaseAttrib != null)
>              {
> -                writer.write("\tpIWSDZ->getChardataAs((void 
**)&(param->"
> -                        + extensionBaseAttrib.getParamNameAsMember() + 
"), "
> -                        + CUtils.
> getXSDTypeForBasicType(extensionBaseAttrib.getTypeName()) + ");\n");
> +                writer.write("\tvoid* pCharData;\n\n");
> +                String typeName = extensionBaseAttrib.getTypeName();
> +                String xsdType = 
CUtils.getXSDTypeForBasicType(typeName);
> +                writer.write("\tpIWSDZ->getChardataAs(pCharData, " 
> + xsdType + ");\n");
> +                if (CUtils.isPointerType(typeName))
> +                {
> +                    writer.write("\tparam->" + extensionBaseAttrib.
> getParamNameAsMember() + " = (" + typeName + ") pCha
> rData;\n");
> +                }
> +                else
> +                {
> +                    writer.write("\tparam->" + extensionBaseAttrib.
> getParamNameAsMember() + " = *(" + typeName + "*) pC
> harData;\n");
> +                }
>              }
>              else
>              {
> @@ -1248,9 +1257,18 @@
>          if (extensionBaseAttrib != null
>                  && extensionBaseAttrib.getTypeName() != null)
>          {
> -            writer.write("\tpIWSDZ->getChardataAs((void **)&(param->"
> -                    + extensionBaseAttrib.getParamNameAsMember() + "), 
"
> -                    + CUtils.
> getXSDTypeForBasicType(extensionBaseAttrib.getTypeName()) + ");\n");
> +            writer.write("\tvoid* pCharData;\n\n");
> +            String typeName = extensionBaseAttrib.getTypeName();
> +            String xsdType = CUtils.getXSDTypeForBasicType(typeName);
> +            writer.write("\tpIWSDZ->getChardataAs(pCharData, " + 
> xsdType + ");\n");
> +            if (CUtils.isPointerType(typeName))
> +            {
> +                writer.write("\tparam->" + extensionBaseAttrib.
> getParamNameAsMember() + " = (" + typeName + ") pCharDat
> a;\n");
> +            }
> +            else
> +            {
> +               writer.write("\tparam->" + extensionBaseAttrib.
> getParamNameAsMember() + " = *(" + typeName + "*) pCharDa
> ta;\n");
> +            }
>          }
> 
>          writer.write("\treturn pIWSDZ->getStatus();\n");
> 
> [attachment "feh.vcf" deleted by Nadir Amra/Rochester/IBM] 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: axis-c-dev-unsubscribe@ws.apache.org
> For additional commands, e-mail: axis-c-dev-help@ws.apache.org

---------------------------------------------------------------------
To unsubscribe, e-mail: axis-c-dev-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-c-dev-help@ws.apache.org