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/06/02 06:53:00 UTC

svn commit: r662319 - in /webservices/axis2/branches/c/post_1_4_mtom/c/axiom: include/axiom_caching_callback.h include/axiom_data_handler.h include/axiom_mime_parser.h src/attachments/data_handler.c src/attachments/mime_parser.c

Author: manjula
Date: Sun Jun  1 21:53:00 2008
New Revision: 662319

URL: http://svn.apache.org/viewvc?rev=662319&view=rev
Log:
Adding Caching callabck related stuff to axiom.

Added:
    webservices/axis2/branches/c/post_1_4_mtom/c/axiom/include/axiom_caching_callback.h
Modified:
    webservices/axis2/branches/c/post_1_4_mtom/c/axiom/include/axiom_data_handler.h
    webservices/axis2/branches/c/post_1_4_mtom/c/axiom/include/axiom_mime_parser.h
    webservices/axis2/branches/c/post_1_4_mtom/c/axiom/src/attachments/data_handler.c
    webservices/axis2/branches/c/post_1_4_mtom/c/axiom/src/attachments/mime_parser.c

Added: webservices/axis2/branches/c/post_1_4_mtom/c/axiom/include/axiom_caching_callback.h
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/c/post_1_4_mtom/c/axiom/include/axiom_caching_callback.h?rev=662319&view=auto
==============================================================================
--- webservices/axis2/branches/c/post_1_4_mtom/c/axiom/include/axiom_caching_callback.h (added)
+++ webservices/axis2/branches/c/post_1_4_mtom/c/axiom/include/axiom_caching_callback.h Sun Jun  1 21:53:00 2008
@@ -0,0 +1,112 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements.  See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License.  You may obtain a copy of the License at
+*
+*      http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+#ifndef AXIOM_CACHING_CALLBACK_H 
+#define AXIOM_CACHING_CALLBACK_H
+
+/**
+  * @file axiom_caching_callback.h
+  * @brief Caching callback for mime parser 
+  */
+
+/**
+* @defgroup caching_callback 
+* @ingroup axiom
+* @{
+*/
+
+#include <axutil_env.h>
+#include <axutil_param.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+    /**
+     * Type name for struct axiom_caching_callback_ops 
+     */
+    typedef struct axiom_caching_callback_ops axiom_caching_callback_ops_t;
+
+    /**
+     * Type name for struct axiom_caching_callback
+     */
+    typedef struct axiom_caching_callback axiom_caching_callback_t;
+
+
+    /**
+     * init_handler will init the caching storage
+     */
+
+    /**
+     * cache will write the data to the storage
+     */
+
+    /**
+     * close_handler will close the storage
+     */
+
+    struct axiom_caching_callback_ops
+    {
+        void* (AXIS2_CALL*
+            init_handler)(axiom_caching_callback_t *caching_callback,
+            const axutil_env_t* env);
+
+        axis2_status_t (AXIS2_CALL*
+            cache)(axiom_caching_callback_t *caching_callback,
+            const axutil_env_t* env,
+            axis2_char_t *data,
+            int length,
+            void *handler);
+
+        axis2_status_t (AXIS2_CALL*
+            close_handler)(axiom_caching_callback_t *caching_callback,
+            const axutil_env_t* env,
+            void *handler);
+
+        axis2_status_t (AXIS2_CALL*
+            free)(axiom_caching_callback_t *caching_callback,
+            const axutil_env_t* env);
+    };
+
+    struct axiom_caching_callback
+    {
+        axiom_caching_callback_ops_t *ops;
+		axutil_param_t *param;
+    };
+
+    /*************************** Function macros **********************************/
+#define AXIOM_CACHING_CALLBACK_INIT_HANDLER(caching_callback, env) \
+        ((caching_callback)->ops->init_handler(caching_callback, env))
+
+#define AXIOM_CACHING_CALLBACK_CACHE(caching_callback, env, data, length, handler) \
+        ((caching_callback)->ops->cache(caching_callback, env, data, length, handler))
+
+#define AXIOM_CACHING_CALLBACK_CLOSE_HANDLER(caching_callback, env, handler) \
+        ((caching_callback)->ops->close_handler(caching_callback, env, handler))
+
+#define AXIOM_CACHING_CALLBACK_FREE(caching_callback, env) \
+        ((caching_callback)->ops->free(caching_callback, env))
+
+    /** @} */
+#ifdef __cplusplus
+}
+#endif
+
+#endif                          /* AXIOM_CACHING_CALLBACK */
+
+

Modified: webservices/axis2/branches/c/post_1_4_mtom/c/axiom/include/axiom_data_handler.h
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/c/post_1_4_mtom/c/axiom/include/axiom_data_handler.h?rev=662319&r1=662318&r2=662319&view=diff
==============================================================================
--- webservices/axis2/branches/c/post_1_4_mtom/c/axiom/include/axiom_data_handler.h (original)
+++ webservices/axis2/branches/c/post_1_4_mtom/c/axiom/include/axiom_data_handler.h Sun Jun  1 21:53:00 2008
@@ -75,6 +75,29 @@
     /**
      * @param data_handler, a pointer to data handler struct
      * @param env environment, MUST NOT be NULL.
+     * @return bool whether attachment is cached or not
+     */
+    AXIS2_EXTERN axis2_bool_t AXIS2_CALL
+    axiom_data_handler_get_cached(
+        axiom_data_handler_t * data_handler,
+        const axutil_env_t * env);
+	
+    /**
+     * @param data_handler, a pointer to data handler struct
+     * @param env environment, MUST NOT be NULL.
+	 * @param cached, 
+     * @return status code, AXIS2_SUCCESS on success and AXIS2_FAILURE on error.
+     */
+    AXIS2_EXTERN void AXIS2_CALL
+    axiom_data_handler_set_cached(
+        axiom_data_handler_t * data_handler,
+        const axutil_env_t * env,
+		axis2_bool_t cached);
+
+
+    /**
+     * @param data_handler, a pointer to data handler struct
+     * @param env environment, MUST NOT be NULL.
      * @return status code, AXIS2_SUCCESS on success and AXIS2_FAILURE on error.
      */
     AXIS2_EXTERN axis2_byte_t *AXIS2_CALL

Modified: webservices/axis2/branches/c/post_1_4_mtom/c/axiom/include/axiom_mime_parser.h
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/c/post_1_4_mtom/c/axiom/include/axiom_mime_parser.h?rev=662319&r1=662318&r2=662319&view=diff
==============================================================================
--- webservices/axis2/branches/c/post_1_4_mtom/c/axiom/include/axiom_mime_parser.h (original)
+++ webservices/axis2/branches/c/post_1_4_mtom/c/axiom/include/axiom_mime_parser.h Sun Jun  1 21:53:00 2008
@@ -146,6 +146,22 @@
         const axutil_env_t * env,
         int num);
 
+    
+    /**
+      * Set Caching callabck name specified in the axis2.xml
+      * @param mime_parser the pointer for the mime parser struct 
+      * @param env Environment. MUST NOT be NULL.
+      * @param callback_name are string containg the callabck path
+      * @return VOID
+      */
+
+    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);
+
+
 
 
     /** @} */

Modified: webservices/axis2/branches/c/post_1_4_mtom/c/axiom/src/attachments/data_handler.c
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/c/post_1_4_mtom/c/axiom/src/attachments/data_handler.c?rev=662319&r1=662318&r2=662319&view=diff
==============================================================================
--- webservices/axis2/branches/c/post_1_4_mtom/c/axiom/src/attachments/data_handler.c (original)
+++ webservices/axis2/branches/c/post_1_4_mtom/c/axiom/src/attachments/data_handler.c Sun Jun  1 21:53:00 2008
@@ -26,6 +26,7 @@
     axis2_byte_t *buffer;
     int buffer_len;
     axiom_data_handler_type_t data_handler_type;
+    axis2_bool_t cached;
 };
 
 AXIS2_EXTERN axiom_data_handler_t *AXIS2_CALL
@@ -54,6 +55,7 @@
     data_handler->buffer_len = 0;
     /* By default, a Data Handler is of type Buffer */
     data_handler->data_handler_type = AXIOM_DATA_HANDLER_TYPE_BUFFER;
+    data_handler->cached = AXIS2_FALSE;
 
     if (mime_type)
     {
@@ -128,6 +130,25 @@
     return AXIS2_SUCCESS;
 }
 
+
+AXIS2_EXTERN axis2_bool_t AXIS2_CALL
+axiom_data_handler_get_cached(
+    axiom_data_handler_t *data_handler,
+    const axutil_env_t *env)
+{
+    return data_handler->cached;
+}
+
+AXIS2_EXTERN void AXIS2_CALL
+axiom_data_handler_set_cached(
+    axiom_data_handler_t *data_handler,
+    const axutil_env_t *env,
+	axis2_bool_t cached)
+{
+    data_handler->cached = cached;
+}
+
+
 AXIS2_EXTERN axis2_byte_t *AXIS2_CALL
 axiom_data_handler_get_input_stream(
     axiom_data_handler_t *data_handler,

Modified: webservices/axis2/branches/c/post_1_4_mtom/c/axiom/src/attachments/mime_parser.c
URL: http://svn.apache.org/viewvc/webservices/axis2/branches/c/post_1_4_mtom/c/axiom/src/attachments/mime_parser.c?rev=662319&r1=662318&r2=662319&view=diff
==============================================================================
--- webservices/axis2/branches/c/post_1_4_mtom/c/axiom/src/attachments/mime_parser.c (original)
+++ webservices/axis2/branches/c/post_1_4_mtom/c/axiom/src/attachments/mime_parser.c Sun Jun  1 21:53:00 2008
@@ -20,6 +20,8 @@
 #include <axutil_string.h>
 #include <axiom_data_handler.h>
 #include <stdio.h>
+#include <axiom_caching_callback.h>
+#include <axutil_class_loader.h>
 
 struct axiom_mime_parser
 {
@@ -28,6 +30,9 @@
     axis2_char_t *soap_body_str;
     int buffer_size;
     int max_buffers;
+    axiom_caching_callback_t *caching_callback;
+    axis2_char_t *callback_name;
+    int total;
 };
 
 struct axiom_search_info
@@ -56,6 +61,9 @@
 
     /*A pointer to a user provided storage to which we cache the attachment*/
     void *handler;
+
+    /* Size of the binary when writing to the buffer*/
+    int binary_size;
 };
 
 typedef struct axiom_search_info axiom_search_info_t;
@@ -75,7 +83,8 @@
     axis2_char_t **buf_array,
     axiom_search_info_t *search_info,
     int size,
-    axis2_char_t *mime_boundary);
+    axis2_char_t *mime_boundary,
+    axiom_mime_parser_t *mime_parser);
 
 
 static axis2_char_t *axiom_mime_parser_search_for_crlf(
@@ -86,7 +95,8 @@
     int *len_array,
     axis2_char_t **buf_array,
     axiom_search_info_t *search_info,
-    int size);
+    int size,
+    axiom_mime_parser_t *mime_parser);
 
 static int axiom_mime_parser_calculate_part_len(
     const axutil_env_t *env,
@@ -104,19 +114,15 @@
     int *len_list,
     int marker,
     axis2_char_t *pos,
-    axis2_char_t **buf_list);
+    axis2_char_t **buf_list,
+    axiom_mime_parser_t *mime_parser);
 
 static axis2_char_t *axiom_mime_parser_search_string(
     axiom_search_info_t *search_info,
     const axutil_env_t *env);
 
-static axis2_status_t axis2_caching_callback(
-    const axutil_env_t *env,
-    axis2_char_t *buf,
-    int buf_len,
-    void *handler);
-
 static axis2_char_t *axiom_mime_parser_search_for_attachment(
+    axiom_mime_parser_t *mime_parser,
     const axutil_env_t * env,
     AXIS2_READ_INPUT_CALLBACK callback,
     void *callback_ctx,
@@ -133,7 +139,8 @@
     axiom_mime_parser_t *mime_parser,
     axis2_char_t *mime_headers,
     axis2_char_t *mime_binary,
-    int mime_binary_len);
+    int mime_binary_len,
+    axis2_bool_t cached);
 
 static void axiom_mime_parser_clear_buffers(
     const axutil_env_t *env,
@@ -141,10 +148,17 @@
     int free_from,
     int free_to);
 
-void *init_handler();
+static axis2_status_t axiom_mime_parser_cache_to_buffer(
+    const axutil_env_t *env,
+    axis2_char_t *buf,
+    int buf_len,
+    axiom_search_info_t *search_info,
+    axiom_mime_parser_t *mime_parser);
 
-axis2_status_t close_handler(void *handler);
 
+static void* axiom_mime_parser_initiate_callback(
+    axiom_mime_parser_t *mime_parser,
+    const axutil_env_t *env);
 
 
 AXIS2_EXTERN axiom_mime_parser_t *AXIS2_CALL
@@ -169,6 +183,9 @@
     mime_parser->soap_body_str = NULL;  /* shallow copy */
     mime_parser->buffer_size = 1;
     mime_parser->max_buffers = AXIOM_MIME_PARSER_MAX_BUFFERS;
+    mime_parser->caching_callback = NULL;
+    mime_parser->callback_name = NULL;
+    mime_parser->total = 0;
 
     mime_parser->mime_parts_map = axutil_hash_make(env);
     if (!(mime_parser->mime_parts_map))
@@ -235,6 +252,7 @@
     buf_array = AXIS2_MALLOC(env->allocator,
         sizeof(axis2_char_t *) * (mime_parser->max_buffers));
 
+    mime_parser->total = mime_parser->total + sizeof(axis2_char_t *) * (mime_parser->max_buffers);
 
     if (!buf_array)
     {
@@ -248,6 +266,8 @@
     len_array = AXIS2_MALLOC(env->allocator,
         sizeof(int) * (mime_parser->max_buffers));
 
+    mime_parser->total = mime_parser->total + sizeof(int) * (mime_parser->max_buffers);
+
     if (!len_array)
     {
         AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
@@ -262,9 +282,13 @@
     search_info = AXIS2_MALLOC(env->allocator,
         sizeof(axiom_search_info_t));
 
+    mime_parser->total = mime_parser->total + sizeof(axiom_search_info_t);
+
     buf_array[buf_num] = AXIS2_MALLOC(env->allocator, 
             sizeof(axis2_char_t) * (size + 1));
 
+    mime_parser->total = mime_parser->total + sizeof(axis2_char_t) * (size + 1);
+
     if(buf_array[buf_num])
     {
         len = callback(buf_array[buf_num], size, (void *) callback_ctx);
@@ -285,7 +309,7 @@
     is changing inside the method.*/
 
     pos = axiom_mime_parser_search_for_crlf(env, callback, callback_ctx, &buf_num,
-            len_array, buf_array, search_info, size);
+            len_array, buf_array, search_info, size, mime_parser);
 
     if(!pos)
     {
@@ -308,6 +332,9 @@
         {
             buffer = AXIS2_MALLOC(env->allocator, sizeof(axis2_char_t) * (
                 size + 1));
+
+            mime_parser->total = mime_parser->total + sizeof(axis2_char_t) *(size + 1);
+
             if(malloc_len > 0)
             {
                 memcpy(buffer, pos + 4, malloc_len);
@@ -335,6 +362,9 @@
         {
             buffer = AXIS2_MALLOC(env->allocator, sizeof(axis2_char_t) * (
                 size + 1));
+
+            mime_parser->total = mime_parser->total + sizeof(axis2_char_t) *(size + 1);
+
             if(malloc_len > 0)
             {
                 memcpy(buffer, buf_array[buf_num] + search_info->match_len2, malloc_len);        
@@ -367,7 +397,7 @@
       --MIMEBOUNDARY  */
 
     pos = axiom_mime_parser_search_for_soap(env, callback, callback_ctx, &buf_num,
-          len_array, buf_array, search_info, size, temp_mime_boundary);
+          len_array, buf_array, search_info, size, temp_mime_boundary, mime_parser);
 
     if(!pos)
     {
@@ -383,7 +413,7 @@
         if(soap_len > 0)
         {
             soap_str = axiom_mime_parser_create_part(
-            env, soap_len, buf_num, len_array, part_start, pos, buf_array);
+            env, soap_len, buf_num, len_array, part_start, pos, buf_array, mime_parser);
             if(!soap_str)
             {
                 return NULL;
@@ -398,6 +428,9 @@
             {
                 buffer = AXIS2_MALLOC(env->allocator, sizeof(axis2_char_t) * (
                     size + 1));
+
+                mime_parser->total = mime_parser->total + sizeof(axis2_char_t) *(size + 1);
+
                 memset(buffer, 0, size + 1);
                 if(malloc_len > 0)
                 {
@@ -426,7 +459,7 @@
         if(soap_len > 0)
         {
             soap_str = axiom_mime_parser_create_part(
-            env, soap_len, buf_num - 1, len_array, part_start, pos, buf_array);
+            env, soap_len, buf_num - 1, len_array, part_start, pos, buf_array, mime_parser);
             if(!soap_str)
             {
                 return NULL;
@@ -441,6 +474,9 @@
             {
                 buffer = AXIS2_MALLOC(env->allocator, sizeof(axis2_char_t) * (
                     size + 1));
+
+                mime_parser->total = mime_parser->total + sizeof(axis2_char_t) *(size + 1);
+
                 if(malloc_len > 0)
                 {
                     memcpy(buffer, buf_array[buf_num] + search_info->match_len2, malloc_len);
@@ -493,7 +529,7 @@
         printf("before crlf method %d\n", len_array[buf_num]);
  
         pos = axiom_mime_parser_search_for_crlf(env, callback, callback_ctx, &buf_num,
-            len_array, buf_array, search_info, size);
+            len_array, buf_array, search_info, size, mime_parser);
 
         printf("after crlf method %d\n", len_array[buf_num]);
 
@@ -514,7 +550,7 @@
             {
                 printf("before calculate len method %d\n", len_array[buf_num]);
                 mime_headers = axiom_mime_parser_create_part(
-                    env, mime_headers_len, buf_num, len_array, part_start, pos, buf_array);
+                    env, mime_headers_len, buf_num, len_array, part_start, pos, buf_array, mime_parser);
                 if(!mime_headers)
                 {
                     return NULL;
@@ -533,6 +569,10 @@
                 {
                     buffer = AXIS2_MALLOC(env->allocator, sizeof(axis2_char_t) * (
                         size + 1));
+
+                    mime_parser->total = mime_parser->total + sizeof(axis2_char_t) *(size + 1);
+                    
+
                     if(malloc_len > 0)
                     {
                         memcpy(buffer, pos + 4, malloc_len);
@@ -563,7 +603,7 @@
             if(mime_headers_len > 0)
             {
                 mime_headers = axiom_mime_parser_create_part(
-                    env, soap_len, buf_num - 1, len_array, part_start, pos, buf_array);
+                    env, soap_len, buf_num - 1, len_array, part_start, pos, buf_array, mime_parser);
                 if(!mime_headers)
                 {
                     return NULL;
@@ -578,6 +618,9 @@
                 {
                     buffer = AXIS2_MALLOC(env->allocator, sizeof(axis2_char_t) * (
                         size + 1));
+
+                    mime_parser->total = mime_parser->total + sizeof(axis2_char_t) *(size + 1);
+
                     if(malloc_len > 0)
                     {
                         memcpy(buffer, buf_array[buf_num] + search_info->match_len2, malloc_len);
@@ -611,7 +654,7 @@
 
         /*We extract the mime headers. So lets search for the attachment.*/
 
-        pos = axiom_mime_parser_search_for_attachment(env, callback, callback_ctx, &buf_num,
+        pos = axiom_mime_parser_search_for_attachment(mime_parser, env, callback, callback_ctx, &buf_num,
           len_array, buf_array, search_info, size, temp_mime_boundary);
 
         if(pos)
@@ -628,7 +671,7 @@
                     if(mime_binary_len > 0)
                     {
                         mime_binary = axiom_mime_parser_create_part(
-                            env, mime_binary_len, buf_num, len_array, part_start, pos, buf_array);
+                            env, mime_binary_len, buf_num, len_array, part_start, pos, buf_array, mime_parser);
                         if(!mime_binary)
                         {
                             return NULL;
@@ -648,7 +691,7 @@
                     if(mime_binary_len > 0)
                     {
                         mime_headers = axiom_mime_parser_create_part(
-                            env, soap_len, buf_num - 1, len_array, part_start, pos, buf_array);
+                            env, soap_len, buf_num - 1, len_array, part_start, pos, buf_array, mime_parser);
                         if(!mime_headers)
                         {
                             return NULL;
@@ -672,6 +715,9 @@
                 {
                     buffer = AXIS2_MALLOC(env->allocator, sizeof(axis2_char_t) * (
                         size + 1));
+
+                    mime_parser->total = mime_parser->total + sizeof(axis2_char_t) *(size + 1);
+
                     if(malloc_len > 0)
                     {
                         memcpy(buffer, pos + temp_mime_boundary_size, malloc_len);
@@ -708,6 +754,9 @@
                 {
                     buffer = AXIS2_MALLOC(env->allocator, sizeof(axis2_char_t) * (
                         size + 1));
+
+                    mime_parser->total = mime_parser->total + sizeof(axis2_char_t) *(size + 1);
+
                     if(malloc_len > 0)
                     {
                         memcpy(buffer, buf_array[buf_num] + search_info->match_len2, malloc_len);
@@ -736,8 +785,14 @@
 
         /*We have the attachment now either cached or not. So lets process the mime headers.*/        
 
+        if((search_info->cached) && (!mime_parser->caching_callback))
+        {
+            mime_binary = (axis2_char_t *)search_info->handler;
+            mime_binary_len = search_info->binary_size;
+        }
+
         status = axiom_mime_parser_process_mime_headers(env, mime_parser, mime_headers,
-            mime_binary, mime_binary_len);
+            mime_binary, mime_binary_len, search_info->cached);
 
         /*Check wether we encounter --MIMEBOUNDARY-- to find the end of mime*/
 
@@ -783,6 +838,8 @@
         search_info = NULL;
     }
 
+    printf("Memory in mime parser--- %d \n", mime_parser->total);
+
     return mime_parser->mime_parts_map;
 
 }
@@ -797,7 +854,8 @@
     int *len_array,
     axis2_char_t **buf_array,
     axiom_search_info_t *search_info,
-    int size)
+    int size,
+    axiom_mime_parser_t *mime_parser)
 {
     axis2_char_t *found = NULL;
     int len = 0;    
@@ -812,6 +870,7 @@
     search_info->primary_search = AXIS2_FALSE;
     search_info->cached = AXIS2_FALSE;
     search_info->handler = NULL;
+    search_info->binary_size = 0;
 
     /*First do a search in the first buffer*/
 
@@ -828,6 +887,10 @@
 
         *buf_num = *buf_num + 1;
         buf_array[*buf_num] = AXIS2_MALLOC(env->allocator, sizeof(axis2_char_t) * (size + 1));
+
+        mime_parser->total = mime_parser->total + sizeof(axis2_char_t) *(size + 1);
+
+
         if(buf_array[*buf_num])
         {
             len = callback(buf_array[*buf_num], size, (void *) callback_ctx);
@@ -870,7 +933,8 @@
     axis2_char_t **buf_array,
     axiom_search_info_t *search_info,
     int size,
-    axis2_char_t *mime_boundary)
+    axis2_char_t *mime_boundary,
+    axiom_mime_parser_t *mime_parser)
 {
     axis2_char_t *found = NULL;
     int len = 0;    
@@ -895,6 +959,10 @@
     {
         *buf_num = *buf_num + 1;
         buf_array[*buf_num] = AXIS2_MALLOC(env->allocator, sizeof(axis2_char_t) * (size + 1));
+
+        mime_parser->total = mime_parser->total + sizeof(axis2_char_t) *(size + 1);
+
+
         if(buf_array[*buf_num])
         {
             len = callback(buf_array[*buf_num], size, (void *) callback_ctx);
@@ -931,6 +999,7 @@
   second buffer.  */
 
 static axis2_char_t *axiom_mime_parser_search_for_attachment(
+    axiom_mime_parser_t *mime_parser,
     const axutil_env_t * env,
     AXIS2_READ_INPUT_CALLBACK callback,
     void *callback_ctx,
@@ -973,18 +1042,37 @@
         {
             if(!(search_info->handler))
             {
-                search_info->handler = init_handler();
-                if(!(search_info->handler))
+                if(mime_parser->callback_name)
                 {
-                    return NULL;
+                    if(!mime_parser->caching_callback)
+                    {
+                        search_info->handler = axiom_mime_parser_initiate_callback(mime_parser, env);
+                        if(!(search_info->handler))
+                        {
+                            return NULL;
+                        }
+                    }
                 }
             }
 
             /*So lets cache the previous buffer which has undergone the
               full search and the partial search.  */
 
-            status = axis2_caching_callback(env, buf_array[*buf_num - 1],
-                len_array[*buf_num - 1], search_info->handler);
+            if(mime_parser->caching_callback)
+            {
+                status = AXIOM_CACHING_CALLBACK_CACHE(mime_parser->caching_callback, 
+                    env, buf_array[*buf_num - 1], len_array[*buf_num - 1], search_info->handler);
+            }
+            else if(!mime_parser->callback_name)
+            {
+                status = axiom_mime_parser_cache_to_buffer(env, buf_array[*buf_num - 1], 
+                    len_array[*buf_num - 1], search_info, mime_parser);
+            }
+            else
+            {
+                return NULL;
+            }
+
             if(status == AXIS2_FAILURE)
             {
                 return NULL;
@@ -1012,6 +1100,9 @@
         {
             *buf_num = *buf_num + 1;
             buf_array[*buf_num] = AXIS2_MALLOC(env->allocator, sizeof(axis2_char_t) * (size + 1));
+
+            mime_parser->total = mime_parser->total + sizeof(axis2_char_t) *(size + 1);
+
             if(buf_array[*buf_num])
             {
                 printf("Filling to the malloc buf\n");
@@ -1058,34 +1149,40 @@
     {
         if(search_info->match_len2 == 0)
         {
-            /*We first cache the previous buffer*/
-
-            status = axis2_caching_callback(env, buf_array[*buf_num - 1], 
-                len_array[*buf_num - 1], search_info->handler);                                     
-            if(status == AXIS2_FAILURE) 
+            if(mime_parser->caching_callback)
             {
-                return NULL;
-            }   
-            
-            /*Then cache up to the mime boundary*/
-
-            status = axis2_caching_callback(env, buf_array[*buf_num], 
-                found - buf_array[*buf_num], search_info->handler);
-            if(status == AXIS2_FAILURE)
+                status = AXIOM_CACHING_CALLBACK_CACHE(mime_parser->caching_callback,
+                    env, buf_array[*buf_num - 1], len_array[*buf_num - 1], search_info->handler);
+                if(status == AXIS2_SUCCESS)
+                {
+                    status = AXIOM_CACHING_CALLBACK_CACHE(mime_parser->caching_callback,
+                        env, buf_array[*buf_num], found - buf_array[*buf_num], search_info->handler);
+                }
+            }
+            else if(!mime_parser->callback_name)
             {
-                return NULL;
+                status = axiom_mime_parser_cache_to_buffer(env, buf_array[*buf_num - 1],
+                    len_array[*buf_num - 1], search_info, mime_parser);
+                if(status == AXIS2_SUCCESS)
+                {
+                    status = axiom_mime_parser_cache_to_buffer(env, buf_array[*buf_num], 
+                        found - buf_array[*buf_num], search_info, mime_parser);
+                }
             }
         }
         else if(search_info->match_len2 > 0)
         {
             /*Here the curent buffer has partial mime boundary. So we need 
             to cache only the previous buffer. */
-
-            status = axis2_caching_callback(env, buf_array[*buf_num - 1], 
-                search_info->match_len1, search_info->handler);
-            if(status == AXIS2_FAILURE)
+            if(mime_parser->caching_callback)
             {
-                return NULL;
+                status = AXIOM_CACHING_CALLBACK_CACHE(mime_parser->caching_callback,
+                    env, buf_array[*buf_num - 1], search_info->match_len1, search_info->handler);
+            }
+            else if(!mime_parser->callback_name)
+            {
+                status = axiom_mime_parser_cache_to_buffer(env, buf_array[*buf_num - 1],
+                    search_info->match_len1, search_info, mime_parser);
             }
         }
         else
@@ -1093,12 +1190,17 @@
             return NULL;
         }
 
+        if(status == AXIS2_FAILURE)
+        {
+            return NULL;
+        }
     }
 
     printf("Caching is over \n");
-    if(search_info->handler)
+    if(search_info->handler && mime_parser->caching_callback)
     {
-        status = close_handler(search_info->handler);
+        status = AXIOM_CACHING_CALLBACK_CLOSE_HANDLER(mime_parser->caching_callback, env,
+            search_info->handler);
         if(status == AXIS2_FAILURE)
         {
             return NULL;
@@ -1107,27 +1209,6 @@
     return found;
 }
 
-/*User can have his own implementation here.*/
-
-static axis2_status_t axis2_caching_callback(
-    const axutil_env_t *env,
-    axis2_char_t *buf,
-    int buf_len,
-    void *handler)
-{
-    int len = 0;
-    FILE *fp = (FILE *)handler;
-
-    len = fwrite(buf, 1, buf_len, fp);  
-    if(len < 0)
-    {
-        return AXIS2_FAILURE;
-    }
-    else
-    {
-        return AXIS2_SUCCESS;
-    }
-}
 
 /*following two functions are used to extract important information 
   for the buffer list. eg: SOAP, MIME_HEADERS*/
@@ -1164,7 +1245,8 @@
     int *len_list,
     int marker,
     axis2_char_t *pos,
-    axis2_char_t **buf_list)
+    axis2_char_t **buf_list,
+    axiom_mime_parser_t *mime_parser)
 {
     /*We will copy the set of buffers which contains the rrquired part.
      This part can be the SOAP message , mime headers or the mime 
@@ -1176,6 +1258,8 @@
 
     part_str = AXIS2_MALLOC(env->allocator, sizeof(char) * (part_len + 1));
     
+    mime_parser->total = mime_parser->total + sizeof(axis2_char_t) *(part_len + 1);
+
     if (!part_str)
     {
         AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
@@ -1391,7 +1475,8 @@
     axiom_mime_parser_t *mime_parser,
     axis2_char_t *mime_headers,
     axis2_char_t *mime_binary,
-    int mime_binary_len)
+    int mime_binary_len,
+    axis2_bool_t cached)
 {
 	if (mime_parser->mime_parts_map)
     {
@@ -1473,10 +1558,21 @@
 
                         AXIS2_FREE(env->allocator, type);
 
-                        axiom_data_handler_set_binary_data(data_handler,
-                            env, mime_binary, mime_binary_len - 2);
+                        if(!mime_binary && cached)
+                        {
+                            axiom_data_handler_set_cached(data_handler, env, AXIS2_TRUE);    
+                        }
+                        else if(mime_binary)
+                        {
+                            axiom_data_handler_set_binary_data(data_handler,
+                                env, mime_binary, mime_binary_len - 2);
+                        }
+                        else
+                        {
+                            return AXIS2_FAILURE;
+                        }
                         axutil_hash_set(mime_parser->mime_parts_map,
-                            mime_id, AXIS2_HASH_KEY_STRING, data_handler);
+                                mime_id, AXIS2_HASH_KEY_STRING, data_handler);
                     }
                     else
                     {
@@ -1529,24 +1625,55 @@
 }
 
 
-void *init_handler()
+static axis2_status_t axiom_mime_parser_cache_to_buffer(
+    const axutil_env_t *env,
+    axis2_char_t *buf,
+    int buf_len,
+    axiom_search_info_t *search_info,
+    axiom_mime_parser_t *mime_parser)
 {
-    FILE *fp = NULL;
-    fp = fopen("/tmp/attachment", "a+");
-    return (void *)fp;
-}
+    axis2_char_t *data_buffer = NULL;
+    axis2_char_t *temp_buf = NULL;
+    int mime_binary_len = 0;
 
-axis2_status_t close_handler(void *handler)
-{
-    axis2_status_t status = AXIS2_FAILURE;
+    temp_buf = (axis2_char_t *)search_info->handler;
+    mime_binary_len = search_info->binary_size + buf_len;
 
-    if(fclose((FILE *)handler) == 0) 
+    if(mime_binary_len > 0)
     {
-        status = AXIS2_SUCCESS;
-    }    
-    return status;
+        data_buffer = AXIS2_MALLOC(env->allocator, 
+            sizeof(axis2_char_t) * (mime_binary_len));
+
+        mime_parser->total = mime_parser->total + sizeof(axis2_char_t) *(mime_binary_len);        
+
+
+        if(data_buffer)
+        {
+            if(temp_buf && search_info->binary_size > 0)
+            {
+                memcpy(data_buffer, temp_buf, search_info->binary_size);
+                AXIS2_FREE(env->allocator, temp_buf);
+                temp_buf = NULL;
+            }
+            memcpy(data_buffer + (search_info->binary_size), 
+                buf, buf_len);
+            search_info->binary_size = mime_binary_len;
+            search_info->handler = (void *)data_buffer;
+
+            return AXIS2_SUCCESS;
+        }
+        else
+        {
+            return AXIS2_FAILURE;
+        }
+    }
+    else
+    {
+        return AXIS2_FAILURE;
+    }
 }
 
+
 AXIS2_EXTERN void AXIS2_CALL
 axiom_mime_parser_set_buffer_size(
     axiom_mime_parser_t *mime_parser,
@@ -1564,4 +1691,52 @@
 {
     mime_parser->max_buffers = num;
 }
- 
+
+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;
+}
+
+static void* axiom_mime_parser_initiate_callback(
+    axiom_mime_parser_t *mime_parser,
+    const axutil_env_t *env)
+{
+    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, 
+                "[rampart][rampart_util] Unable to load the module %s. ERROR", mime_parser->callback_name);
+            return NULL;
+        }
+
+        mime_parser->caching_callback =  (axiom_caching_callback_t *)ptr;
+        mime_parser->caching_callback->param = impl_info_param;
+
+        return AXIOM_CACHING_CALLBACK_INIT_HANDLER(mime_parser->caching_callback, env);
+    }
+
+    else
+    {
+        return NULL;
+    }
+
+}