You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by ma...@apache.org on 2009/03/11 05:10:51 UTC

svn commit: r752363 - in /webservices/axis2/trunk/c/axiom: include/axiom_children_qname_iterator.h include/axiom_soap_builder.h include/axiom_util.h src/om/om_children_qname_iterator.c src/soap/soap_body.c src/soap/soap_builder.c src/util/om_util.c

Author: manjula
Date: Wed Mar 11 04:10:50 2009
New Revision: 752363

URL: http://svn.apache.org/viewvc?rev=752363&view=rev
Log:
Fixies for mtom service callback.

Modified:
    webservices/axis2/trunk/c/axiom/include/axiom_children_qname_iterator.h
    webservices/axis2/trunk/c/axiom/include/axiom_soap_builder.h
    webservices/axis2/trunk/c/axiom/include/axiom_util.h
    webservices/axis2/trunk/c/axiom/src/om/om_children_qname_iterator.c
    webservices/axis2/trunk/c/axiom/src/soap/soap_body.c
    webservices/axis2/trunk/c/axiom/src/soap/soap_builder.c
    webservices/axis2/trunk/c/axiom/src/util/om_util.c

Modified: webservices/axis2/trunk/c/axiom/include/axiom_children_qname_iterator.h
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/axiom/include/axiom_children_qname_iterator.h?rev=752363&r1=752362&r2=752363&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/include/axiom_children_qname_iterator.h (original)
+++ webservices/axis2/trunk/c/axiom/include/axiom_children_qname_iterator.h Wed Mar 11 04:10:50 2009
@@ -97,6 +97,7 @@
         axiom_children_qname_iterator_t * iterator,
         const axutil_env_t * env);
 
+
     /** @} */
 
 #ifdef __cplusplus

Modified: webservices/axis2/trunk/c/axiom/include/axiom_soap_builder.h
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/axiom/include/axiom_soap_builder.h?rev=752363&r1=752362&r2=752363&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/include/axiom_soap_builder.h (original)
+++ webservices/axis2/trunk/c/axiom/include/axiom_soap_builder.h Wed Mar 11 04:10:50 2009
@@ -247,7 +247,13 @@
         void *user_param,
         axis2_char_t *callback_name);
 
-
+    AXIS2_EXTERN axis2_bool_t AXIS2_CALL
+    axiom_soap_builder_replace_xop(
+        axiom_soap_builder_t * builder,
+        const axutil_env_t * env,
+        axiom_node_t *om_element_node,
+        axiom_element_t *om_element);
+        
 
 
 

Modified: webservices/axis2/trunk/c/axiom/include/axiom_util.h
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/axiom/include/axiom_util.h?rev=752363&r1=752362&r2=752363&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/include/axiom_util.h (original)
+++ webservices/axis2/trunk/c/axiom/include/axiom_util.h Wed Mar 11 04:10:50 2009
@@ -373,6 +373,13 @@
         const axutil_env_t * env,
         const axutil_uri_t * uri);
 
+    AXIS2_EXTERN axiom_node_t* AXIS2_CALL
+    axiom_util_get_node_by_local_name(
+        const axutil_env_t *env,
+        axiom_node_t *node,
+        axis2_char_t *local_name);
+
+
 #ifdef __cplusplus
  }
 #endif

Modified: webservices/axis2/trunk/c/axiom/src/om/om_children_qname_iterator.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/axiom/src/om/om_children_qname_iterator.c?rev=752363&r1=752362&r2=752363&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/src/om/om_children_qname_iterator.c (original)
+++ webservices/axis2/trunk/c/axiom/src/om/om_children_qname_iterator.c Wed Mar 11 04:10:50 2009
@@ -197,3 +197,4 @@
     }
     return iterator->last_child;
 }
+

Modified: webservices/axis2/trunk/c/axiom/src/soap/soap_body.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/axiom/src/soap/soap_body.c?rev=752363&r1=752362&r2=752363&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/src/soap/soap_body.c (original)
+++ webservices/axis2/trunk/c/axiom/src/soap/soap_body.c Wed Mar 11 04:10:50 2009
@@ -27,6 +27,7 @@
 #include <axiom_soap_fault_role.h>
 #include "_axiom_soap_fault_value.h"
 #include "_axiom_soap_fault_text.h"
+#include <axiom_util.h>
 
 struct axiom_soap_body
 {
@@ -246,9 +247,27 @@
     const axutil_env_t * env)
 {
     int status = AXIS2_SUCCESS;
-    
+    axiom_node_t *xop_node = NULL;    
+    axis2_bool_t is_replaced = AXIS2_FALSE;
+    axiom_element_t *xop_element = NULL;
+
+                                                                                                                                    
     if (soap_body->om_ele_node && soap_body->soap_builder)
     {
+        xop_node = axiom_util_get_node_by_local_name(env, 
+            soap_body->om_ele_node, AXIS2_XOP_INCLUDE);
+
+        if(xop_node)
+        {
+            xop_element = (axiom_element_t *)axiom_node_get_data_element(
+                xop_node, env);
+            if(xop_element)
+            {
+                is_replaced = axiom_soap_builder_replace_xop(soap_body->soap_builder, 
+                    env, xop_node, xop_element);
+            }
+        }    
+
         while (axiom_node_is_complete(soap_body->om_ele_node, env) !=
                AXIS2_TRUE)
         {

Modified: webservices/axis2/trunk/c/axiom/src/soap/soap_builder.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/axiom/src/soap/soap_builder.c?rev=752363&r1=752362&r2=752363&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/src/soap/soap_builder.c (original)
+++ webservices/axis2/trunk/c/axiom/src/soap/soap_builder.c Wed Mar 11 04:10:50 2009
@@ -1292,3 +1292,92 @@
     }
 }
 
+AXIS2_EXTERN axis2_bool_t AXIS2_CALL
+axiom_soap_builder_replace_xop(
+    axiom_soap_builder_t * builder,
+    const axutil_env_t * env,
+    axiom_node_t *om_element_node,
+    axiom_element_t *om_element)
+{
+    axiom_namespace_t *ns = NULL;
+    axis2_bool_t is_replaced = AXIS2_FALSE;
+
+    ns = axiom_element_get_namespace(om_element, env, om_element_node);
+    if (ns)
+    {
+        axis2_char_t *uri = axiom_namespace_get_uri(ns, env);
+        if (uri)
+        {
+            if (axutil_strcmp(uri, AXIS2_XOP_NAMESPACE_URI) == 0)
+            {
+                axutil_qname_t *qname = NULL;
+                qname = axutil_qname_create(env, "href", NULL, NULL);
+                if (qname)
+                {
+                    axis2_char_t *id = NULL;
+                    id = axiom_element_get_attribute_value(om_element, env,
+                                                               qname);
+                    if (id)
+                    {
+                        axis2_char_t *pos = NULL;
+                        pos = axutil_strstr(id, "cid:");
+                        if (pos)
+                        {
+                            axiom_data_handler_t *data_handler = NULL;
+                            id += 4;
+
+                            if (builder->mime_body_parts)
+                            {
+
+                                axis2_char_t *id_decoded = NULL;
+                              
+                                id_decoded = axutil_strdup(env, id);
+                                
+                                axutil_url_decode(env, id_decoded, id_decoded);
+                                
+                                data_handler =
+                                    (axiom_data_handler_t *)
+                                    axutil_hash_get(builder->
+                                                    mime_body_parts,
+                                                    (void *) id_decoded,
+                                                    AXIS2_HASH_KEY_STRING);
+                                if (data_handler)
+                                {
+                                    axiom_text_t *data_text = NULL;
+                                    axiom_node_t *data_om_node = NULL;
+                                    axiom_node_t *parent = NULL;
+
+                                    parent = axiom_node_get_parent(om_element_node, 
+                                                                env);
+
+                                    /*remove the <xop:Include> element */
+                                    axiom_node_free_tree(om_element_node,
+                                                         env);
+
+                                    data_text =
+                                        axiom_text_create_with_data_handler
+                                        (env, parent, data_handler,
+                                         &data_om_node);
+
+                                    axiom_text_set_content_id(data_text,
+                                                              env, id_decoded);
+                                    /*axiom_stax_builder_set_lastnode
+                                        (soap_builder->om_builder, env,
+                                         parent);*/
+                                    is_replaced = AXIS2_TRUE;
+                                }
+                                if(id_decoded)
+                                {
+                                    AXIS2_FREE(env->allocator, id_decoded);
+                                }
+                            }
+                        }
+                    }
+                }
+                axutil_qname_free(qname, env);
+            }
+        }
+    }
+
+    return is_replaced;
+} 

Modified: webservices/axis2/trunk/c/axiom/src/util/om_util.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/axiom/src/util/om_util.c?rev=752363&r1=752362&r2=752363&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/src/util/om_util.c (original)
+++ webservices/axis2/trunk/c/axiom/src/util/om_util.c Wed Mar 11 04:10:50 2009
@@ -1153,3 +1153,51 @@
 
     return doc;
 }
+
+
+AXIS2_EXTERN axiom_node_t* AXIS2_CALL
+axiom_util_get_node_by_local_name(
+    const axutil_env_t *env,
+    axiom_node_t *node,
+    axis2_char_t *local_name)
+{
+    axis2_char_t *temp_name = NULL;
+
+    if(!node)
+    {
+        return NULL;
+    }
+
+    if(axiom_node_get_node_type(node, env) != AXIOM_ELEMENT)
+    {
+        return NULL;
+    }
+
+    temp_name = axiom_util_get_localname(node, env);
+    AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, 
+        "[rampart]Checking node %s for %s", temp_name, local_name );
+
+    if(!axutil_strcmp(temp_name, local_name))
+    {
+        /* Gottcha.. return this node */
+        return node;
+    }
+    else
+    {
+        /* Doesn't match? Get the children and search for them */
+        axiom_node_t *temp_node = NULL;
+
+        temp_node = axiom_node_get_first_element(node, env);
+        while(temp_node)
+        {
+            axiom_node_t *res_node = NULL;
+            res_node = axiom_util_get_node_by_local_name(env, temp_node, local_name);
+            if(res_node)
+            {
+                return res_node;
+            }
+            temp_node = axiom_node_get_next_sibling(temp_node, env);
+        }
+    }
+    return NULL;
+}