You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by ma...@apache.org on 2008/12/02 11:49:09 UTC

svn commit: r722422 - /webservices/axis2/trunk/c/axiom/src/attachments/mime_parser.c

Author: manjula
Date: Tue Dec  2 02:49:08 2008
New Revision: 722422

URL: http://svn.apache.org/viewvc?rev=722422&view=rev
Log:
Fixes for Axis2C-1301

Modified:
    webservices/axis2/trunk/c/axiom/src/attachments/mime_parser.c

Modified: webservices/axis2/trunk/c/axiom/src/attachments/mime_parser.c
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/c/axiom/src/attachments/mime_parser.c?rev=722422&r1=722421&r2=722422&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/src/attachments/mime_parser.c (original)
+++ webservices/axis2/trunk/c/axiom/src/attachments/mime_parser.c Tue Dec  2 02:49:08 2008
@@ -22,6 +22,8 @@
 #include <stdio.h>
 #include <ctype.h>    
 #include <axutil_http_chunked_stream.h>
+#include <axiom_mtom_caching_callback.h>
+#include <axutil_class_loader.h>
 
 struct axiom_mime_parser
 {
@@ -43,6 +45,13 @@
 
     /* The attachment dir name, in the case of caching */
     axis2_char_t *attachment_dir;
+
+    /*A pointer to the caching callback */
+    axiom_mtom_caching_callback_t *mtom_caching_callback;
+
+    /* The caching callback name specified */
+    axis2_char_t *callback_name;
+
 };
 
 struct axiom_search_info
@@ -186,6 +195,12 @@
     int buf_len,
     void *handler);
 
+static void* axiom_mime_parser_initiate_callback(
+    axiom_mime_parser_t *mime_parser,
+    const axutil_env_t *env,
+    axis2_char_t *mime_id);
+
+
 
 AXIS2_EXTERN axiom_mime_parser_t *AXIS2_CALL
 axiom_mime_parser_create(
@@ -210,6 +225,8 @@
     mime_parser->buffer_size = 1;
     mime_parser->max_buffers = AXIOM_MIME_PARSER_MAX_BUFFERS;
     mime_parser->attachment_dir = NULL;
+    mime_parser->mtom_caching_callback = NULL;
+    mime_parser->callback_name = NULL;
 
     mime_parser->mime_parts_map = axutil_hash_make(env);
     if (!(mime_parser->mime_parts_map))
@@ -231,6 +248,23 @@
     /* The map is passed on to SOAP builder, and SOAP builder take over the
        ownership of the map */
 
+    /* We will unload the callback at the end */
+
+    if(mime_parser->mtom_caching_callback)
+    {
+        axutil_param_t *param = NULL;
+        param = mime_parser->mtom_caching_callback->param;
+
+        AXIOM_MTOM_CACHING_CALLBACK_FREE(mime_parser->mtom_caching_callback, env);
+        mime_parser->mtom_caching_callback = NULL;
+
+        if(param)
+        {
+            axutil_param_free(param, env);
+            param = NULL;
+        }
+    }
+
     if (mime_parser)
     {
         AXIS2_FREE(env->allocator, mime_parser);
@@ -916,10 +950,11 @@
          * hash map with the mime_id. Remember at this moment we have already processed the 
          * mime_headers and mime_id is already there */        
 
-        /* In this case user has not specified the attachment dir . So we cached it to a memory
+        /* In the case user has not specified the callback or the attachment dir . So we cached it to a memory
          * buffer. Hence the data_handler type we need to create is different */
 
-        if((search_info->cached) && (!mime_parser->attachment_dir))
+        if((search_info->cached) && (!mime_parser->attachment_dir) && 
+            (!mime_parser->callback_name))
         {
             mime_binary = (axis2_char_t *)search_info->handler;
             mime_binary_len = search_info->binary_size;
@@ -1143,7 +1178,11 @@
   find the mime_boundary in initial two buffers. So the maximum size
   that we are keeping in memory is 2 * size. This size can be configurable from
   the aixs.xml. The caching may starts when the search failed with the
-  second buffer.  */
+  second buffer.  
+  In this logic first we will search for a callback to cache. If it is not 
+  there then we will search for a directory to save the file. If it is also
+  not there then the attachment will be in memory.      
+*/
 
 static axis2_char_t *axiom_mime_parser_search_for_attachment(
     axiom_mime_parser_t *mime_parser,
@@ -1189,7 +1228,34 @@
     {
         if(search_info->cached)
         {
-            if(mime_parser->attachment_dir)
+            if(mime_parser->callback_name)
+            {
+                if(!(search_info->handler))
+                {
+                    /* If the callback is not loaded yet then we load it*/
+                    if(!mime_parser->mtom_caching_callback)
+                    {
+                        search_info->handler = axiom_mime_parser_initiate_callback(mime_parser, env, mime_id);
+                        if(!(search_info->handler))
+                        {
+                            AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
+                                "Caching Callback is not loaded");
+                            return NULL;
+                        }
+                    }
+                }
+                /*So lets cache the previous buffer which has undergone the
+                  full search and the partial search.  */
+
+                if(mime_parser->mtom_caching_callback)
+                {
+                    /* Caching callback is loaded. So we can cache the previous buffer */
+                    status = AXIOM_MTOM_CACHING_CALLBACK_CACHE(mime_parser->mtom_caching_callback,
+                        env, buf_array[*buf_num - 1], len_array[*buf_num - 1], search_info->handler);
+                }
+            }
+
+            else if(mime_parser->attachment_dir)
             {
                 if(!(search_info->handler))
                 {
@@ -1305,7 +1371,18 @@
              * So we need to cache previous buffer and the data up to the starting
              * point of the search string in the current buffer */
 
-            if(mime_parser->attachment_dir)
+            if(mime_parser->mtom_caching_callback)
+            {
+                status = AXIOM_MTOM_CACHING_CALLBACK_CACHE(mime_parser->mtom_caching_callback,
+                    env, buf_array[*buf_num - 1], len_array[*buf_num - 1], search_info->handler);
+                if(status == AXIS2_SUCCESS)
+                {
+                    status = AXIOM_MTOM_CACHING_CALLBACK_CACHE(mime_parser->mtom_caching_callback,
+                        env, buf_array[*buf_num], found - buf_array[*buf_num], search_info->handler);
+                }
+            }
+
+            else if(mime_parser->attachment_dir)
             {
                 status = axiom_mime_parser_cache_to_file(env, buf_array[*buf_num - 1], 
                     len_array[*buf_num - 1], search_info->handler);
@@ -1316,7 +1393,7 @@
                 }
             }
             
-            /* If the callback is not there then the data is appended to the buffer */
+            /* If the callback or a file is not there then the data is appended to the buffer */
 
             else
             {
@@ -1333,7 +1410,14 @@
         {
             /*Here the curent buffer has partial mime boundary. So we need 
             to cache only the previous buffer. */
-            if(mime_parser->attachment_dir)
+
+            if(mime_parser->mtom_caching_callback)
+            {
+                status = AXIOM_MTOM_CACHING_CALLBACK_CACHE(mime_parser->mtom_caching_callback,
+                    env, buf_array[*buf_num - 1], search_info->match_len1, search_info->handler);
+            }
+
+            else if(mime_parser->attachment_dir)
             {
                 status = axiom_mime_parser_cache_to_file(env, buf_array[*buf_num - 1], 
                     search_info->match_len1, search_info->handler);
@@ -1357,23 +1441,36 @@
 
     /* Parsing is done so lets close the relative handlers */
 
-    if(search_info->handler && mime_parser->attachment_dir)
+    if(search_info->handler)
     {
-        if(fclose((FILE *)(search_info->handler)) == 0)
+        if(mime_parser->mtom_caching_callback)
         {
-            status = AXIS2_SUCCESS;
+            status = AXIOM_MTOM_CACHING_CALLBACK_CLOSE_HANDLER(mime_parser->mtom_caching_callback, env,
+                search_info->handler);
+            if(status == AXIS2_FAILURE)
+            {
+                return NULL;
+            }
         }
-        else
+
+        else if(mime_parser->attachment_dir)
         {
-            status = AXIS2_FAILURE;
-        }
+            if(fclose((FILE *)(search_info->handler)) == 0)
+            {
+                status = AXIS2_SUCCESS;
+            }
+            else
+            {
+                status = AXIS2_FAILURE;
+            }
 
-        AXIS2_FREE(env->allocator, file_name);
-        file_name = NULL;        
+            AXIS2_FREE(env->allocator, file_name);
+            file_name = NULL;        
 
-        if(status == AXIS2_FAILURE)
-        {
-            return NULL;
+            if(status == AXIS2_FAILURE)
+            {
+                return NULL;
+            }
         }
     }
     return found;
@@ -1651,9 +1748,23 @@
         {
             axiom_data_handler_t *data_handler = NULL;
 
+            /* Handling the case where attachment is cached using a callback */
+
+            if(mime_parser->callback_name && cached)
+            {
+                data_handler = axiom_data_handler_create(env, 
+                    NULL, mime_type);
+                if(data_handler)
+                {
+                    axiom_data_handler_set_cached(data_handler, env, AXIS2_TRUE);
+                    axiom_data_handler_set_data_handler_type(data_handler, env, 
+                        AXIOM_DATA_HANDLER_TYPE_CALLBACK);
+                }
+            }
+
             /* Handling the case where attachment is cached to a file*/
 
-            if(!mime_binary && cached)
+            else if(mime_parser->attachment_dir && cached)
             {
                 axis2_char_t *attachment_location = NULL;
 
@@ -1666,6 +1777,7 @@
                     if(data_handler)
                     {
                         axiom_data_handler_set_cached(data_handler, env, AXIS2_TRUE);
+                        
                     }
                     AXIS2_FREE(env->allocator, attachment_location);
                     attachment_location = NULL; 
@@ -1685,6 +1797,8 @@
                         env, mime_binary, mime_binary_len - 2);
                 }
             }
+            axiom_data_handler_set_mime_id(data_handler, env, mime_id);            
+
             axutil_hash_set(mime_parser->mime_parts_map,
                     mime_id, AXIS2_HASH_KEY_STRING, data_handler);
             if(mime_type)
@@ -1923,6 +2037,62 @@
     mime_parser->attachment_dir = attachment_dir;
 }
 
+/* Set the path of the caching callnack to be loaded */
+
+AXIS2_EXTERN void AXIS2_CALL
+axiom_mime_parser_set_caching_callback_name(
+    axiom_mime_parser_t *mime_parser,
+    const axutil_env_t *env,
+    axis2_char_t *callback_name)
+{
+    mime_parser->callback_name = callback_name;
+}
+
+/* Load the caching callback dll */
+
+
+static void* axiom_mime_parser_initiate_callback(
+    axiom_mime_parser_t *mime_parser,
+    const axutil_env_t *env,
+    axis2_char_t *mime_id)
+{
+    axutil_dll_desc_t *dll_desc = NULL;
+    axutil_param_t *impl_info_param = NULL;
+    void *ptr = NULL;
+
+    if(mime_parser->callback_name)
+    {
+        AXIS2_LOG_DEBUG(env->log, AXIS2_LOG_SI, "Trying to load module = %s", 
+                mime_parser->callback_name);
+        dll_desc = axutil_dll_desc_create(env);
+        axutil_dll_desc_set_name(dll_desc, env, mime_parser->callback_name);
+        impl_info_param = axutil_param_create(env, NULL, dll_desc);
+        /*Set the free function*/
+        axutil_param_set_value_free(impl_info_param, env, axutil_dll_desc_free_void_arg);
+        axutil_class_loader_init(env);
+        ptr = axutil_class_loader_create_dll(env, impl_info_param);
+
+        if (!ptr)
+        {
+            AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI, 
+                "Unable to load the module %s. ERROR", mime_parser->callback_name);
+            return NULL;
+        }
+
+        mime_parser->mtom_caching_callback =  (axiom_mtom_caching_callback_t *)ptr;
+        mime_parser->mtom_caching_callback->param = impl_info_param;
+
+        return AXIOM_MTOM_CACHING_CALLBACK_INIT_HANDLER(mime_parser->mtom_caching_callback, env, mime_id);
+    }
+
+    else
+    {
+        return NULL;
+    }
+
+}
+
+
 
 /* This method will tell whether there are more data in the 
  * stream */