dushshantha    2005/07/25 21:36:36

  Modified:    c/src/soap SoapDeSerializer.cpp
  Log:
  There was a problem in the method getCmplxFaultObjectName () of this class so 
deserialization of WSDL faults goes wrong. Fixed the problem.
  
  Revision  Changes    Path
  1.172     +103 -82   ws-axis/c/src/soap/SoapDeSerializer.cpp
  
  Index: SoapDeSerializer.cpp
  ===================================================================
  RCS file: /home/cvs/ws-axis/c/src/soap/SoapDeSerializer.cpp,v
  retrieving revision 1.171
  retrieving revision 1.172
  diff -u -r1.171 -r1.172
  --- SoapDeSerializer.cpp      11 Jul 2005 10:29:09 -0000      1.171
  +++ SoapDeSerializer.cpp      26 Jul 2005 04:36:33 -0000      1.172
  @@ -467,6 +467,7 @@
       char *pcFaultactor;
       if (0 == strcmp ("Fault", pName))
       {
  +             
        if (0 != strcmp (m_pNode->m_pchNameOrValue, pName))
        {
            m_nStatus = AXIS_SUCCESS;
  @@ -488,7 +489,7 @@
        pFault->setFaultcode (pcFaultCode == NULL ? "" : pcFaultCode);
           if ( pcFaultCode )
               delete [] pcFaultCode;
  -
  +     
        pcFaultstring = getElementAsString ("faultstring", 0);
        pFault->setFaultstring (pcFaultstring == NULL ? "" : pcFaultstring);
           if ( pcFaultstring )
  @@ -502,23 +503,22 @@
        // FJP Changed the namespace from null to a single space (an impossible
        //     value) to help method know that it is parsing a fault message.
        pcDetail = getElementAsString ("detail", " ");
  -
  +     
        if (pcDetail)
        {
            pFault->setFaultDetail (pcDetail);
  -            delete [] pcDetail;          
  +                     delete [] pcDetail;          
        }
        else
        {
  -         pcCmplxFaultName = getCmplxFaultObjectName ();
  -         pFault->setCmplxFaultObjectName (pcCmplxFaultName == NULL ? "" : 
pcCmplxFaultName);
  +             pcCmplxFaultName = getCmplxFaultObjectName ();
  +             pFault->setCmplxFaultObjectName (pcCmplxFaultName == NULL ? "" 
: pcCmplxFaultName);
           /*    if ( pcCmplxFaultName )
                   delete [] (reinterpret_cast <char *> (pcCmplxFaultName) );
                */
        }
   
        setStyle (m_nStyle);
  -
        return pFault;
       }
       else
  @@ -1253,34 +1253,51 @@
   const char *
   SoapDeSerializer::getCmplxFaultObjectName ()
   {
  -    /* if there is an unprocessed node that may be one left from
  +    
  +     if (m_pNode)
  +     {
  +             /*
  +              * Just to skip <appSpecific> tag
  +              */
  +             m_pNode = m_pParser->next ();
  +     }
  +
  +     /* if there is an unprocessed node that may be one left from
        * last array deserialization 
        */
  -    if (!m_pNode)            // Skip the faultdetail tag
  -     m_pParser->next ();
  -    m_nStatus = AXIS_SUCCESS;
  +    
  +     else
  +     {
  +             // Skip the faultdetail tag
  +             m_pParser->next ();
  +     }
  +             
  +     m_nStatus = AXIS_SUCCESS;
   
       if (AXIS_SUCCESS != m_nStatus)
  -     return NULL;
  +             return NULL;
       /* if anything has gone wrong earlier just do nothing */
       if (RPC_ENCODED == m_nStyle)
       {
  -
  -     m_pNode = m_pParser->next ();
  -     /* just skip wrapper node with type info
  -      * Ex: <tns:QuoteInfoType xmlns:tns="http://www.getquote.org/test";> */
  -     if (!m_pNode)
  -         return NULL;
  -     return m_pNode->m_pchNameOrValue;
  +     
  +             m_pParser->next ();
  +             
  +             /* just skip wrapper node with type info
  +              * Ex: <tns:QuoteInfoType 
xmlns:tns="http://www.getquote.org/test";> 
  +              */
  +             if (!m_pNode)
  +                     return NULL;
  +             return m_pNode->m_pchNameOrValue;
       }
       else
       {
  -     if (!m_pNode)
  -         /* if there is an unprocessed node that may be one left from 
  -          * last array deserialization */
  -         m_pNode = m_pParser->next ();
  -     /* wrapper node without type info  Ex: <result> */
  -
  +             if (!m_pNode)
  +             {
  +                 /* if there is an unprocessed node that may be one left 
from 
  +                      * last array deserialization */
  +                     m_pNode = m_pParser->next ();
  +                     /* wrapper node without type info  Ex: <result> */
  +     }
        if (!m_pNode)
            return NULL;
        return m_pNode->m_pchNameOrValue;
  @@ -1332,75 +1349,76 @@
       }
       else
       {
  -     if (0 == strcmp (pName, m_pNode->m_pchNameOrValue))
  -     {
  +                     
  +             if (0 == strcmp (pName, m_pNode->m_pchNameOrValue))
  +             {
            /* if this node contain attributes let them be used by the complex
             * type's deserializer
             */
  -         if (0 != m_pNode->m_pchAttributes[0])
  -         {
  -                     m_pCurrNode = m_pNode;
  -                     xsd__boolean * isNill = getAttributeAsBoolean("nil", 0);
  -            if (NULL != isNill)
  -            {
  -                if(true_ == *isNill)
  -                     {
  -                         m_pParser->next ();
  -                         m_pNode = NULL;
  -                    delete isNill;
  -                         return NULL;
  -                     } else {
  -                             delete isNill;
  -                     }
  -            }
  -         }
  -         m_pNode = NULL;     /* node identified and used */
  +                     if (0 != m_pNode->m_pchAttributes[0])
  +                     {
  +                             m_pCurrNode = m_pNode;
  +                             xsd__boolean * isNill = 
getAttributeAsBoolean("nil", 0);
  +                             if (NULL != isNill)
  +                             {
  +                                     if(true_ == *isNill)
  +                             {
  +                                     m_pParser->next ();
  +                                     m_pNode = NULL;
  +                                             delete isNill;
  +                                     return NULL;
  +                             } else {
  +                                     delete isNill;
  +                             }
  +                             }
  +                     }
  +                     m_pNode = NULL; /* node identified and used */
   
  -             TRACE_OBJECT_CREATE_FUNCT_ENTRY(pCreFunct, NULL, false, 0);
  -         void *pObject = ((AXIS_OBJECT_CREATE_FUNCT) pCreFunct)(NULL, false, 
0);
  -             TRACE_OBJECT_CREATE_FUNCT_EXIT(pCreFunct, pObject);
  +                     TRACE_OBJECT_CREATE_FUNCT_ENTRY(pCreFunct, NULL, false, 
0);
  +                     void *pObject = ((AXIS_OBJECT_CREATE_FUNCT) 
pCreFunct)(NULL, false, 0);
  +                     TRACE_OBJECT_CREATE_FUNCT_EXIT(pCreFunct, pObject);
   
  -             if (pObject && pDZFunct)
  -         {
  -             if (C_DOC_PROVIDER == getCurrentProviderType ())
  -             {
  -                 // Disable C support
  -                 //IWrapperSoapDeSerializer_C cWSD;
  -                 //cWSD._object = this;
  -                 //cWSD._functions = &IWrapperSoapDeSerializer::ms_VFtable;
  -                 //m_nStatus = ((AXIS_DESERIALIZE_FUNCT)pDZFunct)
  -                 //    (pObject, &cWSD);
  -             }
  -             else
  -             {
  -                     TRACE_DESERIALIZE_FUNCT_ENTRY(pDZFunct, pObject, this);
  -                 m_nStatus = ((AXIS_DESERIALIZE_FUNCT) pDZFunct) (pObject, 
this);
  -                     TRACE_DESERIALIZE_FUNCT_EXIT(pDZFunct, m_nStatus);
  -             }
  -             if (AXIS_SUCCESS == m_nStatus)
  -             {
  -                 m_pParser->next (); /* skip end node too */
  -                 return pObject;
  +                     if (pObject && pDZFunct)
  +                     {
  +                             if (C_DOC_PROVIDER == getCurrentProviderType ())
  +                             {
  +                             // Disable C support
  +                             //IWrapperSoapDeSerializer_C cWSD;
  +                             //cWSD._object = this;
  +                             //cWSD._functions = 
&IWrapperSoapDeSerializer::ms_VFtable;
  +                             //m_nStatus = ((AXIS_DESERIALIZE_FUNCT)pDZFunct)
  +                             //    (pObject, &cWSD);
  +                             }
  +                             else
  +                             {
  +                                     TRACE_DESERIALIZE_FUNCT_ENTRY(pDZFunct, 
pObject, this);
  +                                     m_nStatus =     
((AXIS_DESERIALIZE_FUNCT) pDZFunct) (pObject, this);
  +                                     TRACE_DESERIALIZE_FUNCT_EXIT(pDZFunct, 
m_nStatus);
  +                             }
  +                             if (AXIS_SUCCESS == m_nStatus)
  +                             {
  +                                     m_pParser->next ();     /* skip end 
node too */
  +                                     return pObject;
  +                             }
  +                             else
  +                             {
  +                                     
TRACE_OBJECT_DELETE_FUNCT_ENTRY(pDelFunct, pObject, false, 0);
  +                                     ((AXIS_OBJECT_DELETE_FUNCT) pDelFunct) 
(pObject, false, 0);
  +                                     
TRACE_OBJECT_DELETE_FUNCT_EXIT(pDelFunct);
  +                             }
  +                     }
                }
                else
                {
  -                     TRACE_OBJECT_DELETE_FUNCT_ENTRY(pDelFunct, pObject, 
false, 0);
  -                 ((AXIS_OBJECT_DELETE_FUNCT) pDelFunct) (pObject, false, 0);
  -                     TRACE_OBJECT_DELETE_FUNCT_EXIT(pDelFunct);
  -             }
  -         }
  -     }
  -     else
  -     {
            /*
             * TODO: Need to verify what WS-I 1.0 say
             * about the mandatory of all the elements in the response in case 
of
             * null value or none filled value. Some Web services servers work
             * like this. This apply for all the rest of the deserializer.
             */
  -         return NULL;
  +                     return NULL;
  +             }
        }
  -    }
       m_nStatus = AXIS_FAIL;   /* unexpected SOAP stream */
       return NULL;
   }
  @@ -1979,9 +1997,10 @@
        if (!m_pNode)
           return;
   
  -     if (0 == strcmp (pName, m_pNode->m_pchNameOrValue))
  +      if (0 == strcmp (pName, m_pNode->m_pchNameOrValue))
        {
  -        bool    bNillFound = false;
  +        
  +             bool    bNillFound = false;
           for (int i = 0; m_pNode->m_pchAttributes[i] && !bNillFound; i += 3)
           {
               string sLocalName = m_pNode->m_pchAttributes[i];
  @@ -1997,8 +2016,10 @@
           m_pNode = m_pParser->next (true);   /* charactor node */
           if (m_pNode && (CHARACTER_ELEMENT == m_pNode->m_type))
           {
  -            const AxisChar* elementValue = m_pNode->m_pchNameOrValue;
  -            // FJP Added this code for fault finding.  If detail is
  +            
  +                     const AxisChar* elementValue = 
m_pNode->m_pchNameOrValue;
  +            
  +                     // FJP Added this code for fault finding.  If detail is
               //     followed by CR/LF or CR/LF then CR/LF then assume that
               //     it is not a simple object.  As added protection against
               //     false findings, the namespace has been set to an invalid
  
  
  

Reply via email to