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 2009/02/11 18:44:53 UTC
svn commit: r743421 -
/webservices/axis2/trunk/c/axiom/src/attachments/mime_parser.c
Author: manjula
Date: Wed Feb 11 17:44:52 2009
New Revision: 743421
URL: http://svn.apache.org/viewvc?rev=743421&view=rev
Log:
Spliting the mime_parser message parsing logic by seprating the
attachment parsing anf soap parsing.
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=743421&r1=743420&r2=743421&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/src/attachments/mime_parser.c (original)
+++ webservices/axis2/trunk/c/axiom/src/attachments/mime_parser.c Wed Feb 11 17:44:52 2009
@@ -52,6 +52,16 @@
/* The caching callback name specified */
axis2_char_t *callback_name;
+ axis2_char_t **buf_array;
+
+ int *len_array;
+
+ int current_buf_num;
+
+ axis2_bool_t end_of_mime;
+
+ axis2_char_t *mime_boundary;
+
};
struct axiom_search_info
@@ -151,7 +161,8 @@
axiom_search_info_t *search_info,
int size,
axis2_char_t *mime_boundary,
- axis2_char_t *mime_id);
+ axis2_char_t *mime_id,
+ void *user_param);
static axis2_status_t axiom_mime_parser_store_attachment(
const axutil_env_t *env,
@@ -198,7 +209,8 @@
static void* axiom_mime_parser_initiate_callback(
axiom_mime_parser_t *mime_parser,
const axutil_env_t *env,
- axis2_char_t *mime_id);
+ axis2_char_t *mime_id,
+ void *user_param);
@@ -227,6 +239,11 @@
mime_parser->attachment_dir = NULL;
mime_parser->mtom_caching_callback = NULL;
mime_parser->callback_name = NULL;
+ mime_parser->buf_array = NULL;
+ mime_parser->len_array = NULL;
+ mime_parser->current_buf_num = 0;
+ mime_parser->end_of_mime = AXIS2_FALSE;
+ mime_parser->mime_boundary = NULL;
mime_parser->mime_parts_map = axutil_hash_make(env);
if (!(mime_parser->mime_parts_map))
@@ -265,6 +282,18 @@
}
}
+ if(mime_parser->buf_array)
+ {
+ AXIS2_FREE(env->allocator, mime_parser->buf_array);
+ mime_parser->buf_array = NULL;
+ }
+
+ if(mime_parser->len_array)
+ {
+ AXIS2_FREE(env->allocator, mime_parser->len_array);
+ mime_parser->len_array = NULL;
+ }
+
if (mime_parser)
{
AXIS2_FREE(env->allocator, mime_parser);
@@ -273,8 +302,8 @@
return;
}
-AXIS2_EXTERN axutil_hash_t *AXIS2_CALL
-axiom_mime_parser_parse(
+AXIS2_EXTERN axis2_status_t AXIS2_CALL
+axiom_mime_parser_parse_for_soap(
axiom_mime_parser_t * mime_parser,
const axutil_env_t * env,
AXIS2_READ_INPUT_CALLBACK callback,
@@ -284,8 +313,6 @@
int size = 0;
axis2_char_t *soap_str = NULL;
int soap_len = 0;
- axis2_char_t *mime_headers = NULL;
- int mime_headers_len = 0;
int temp_mime_boundary_size = 0;
axis2_char_t *temp_mime_boundary = NULL;
axis2_char_t **buf_array = NULL;
@@ -295,11 +322,7 @@
axiom_search_info_t *search_info = NULL;
int part_start = 0;
axis2_bool_t end_of_mime = AXIS2_FALSE;
- int count = 0;
- int mime_binary_len = 0;
- axis2_char_t *mime_binary = NULL;
int len = 0;
- axis2_status_t status = AXIS2_FAILURE;
axis2_char_t *buffer = NULL;
int malloc_len = 0;
axis2_callback_info_t *callback_info = NULL;
@@ -319,7 +342,7 @@
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"No memory. Failed in creating buffer array");
- return NULL;
+ return AXIS2_FAILURE;
}
/*Keeps the corresponding lengths of buffers in buf_array*/
@@ -332,9 +355,12 @@
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"No memory. Failed in creating length array");
- return NULL;
+ return AXIS2_FAILURE;
}
+ mime_parser->buf_array = buf_array;
+ mime_parser->len_array = len_array;
+
temp_mime_boundary = axutil_stracat(env, "--", mime_boundary);
temp_mime_boundary_size = strlen(mime_boundary) + 2;
@@ -360,7 +386,7 @@
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"Error reading from the stream");
- return NULL;
+ return AXIS2_FAILURE;
}
/*starting buffer for the current search*/
@@ -378,7 +404,7 @@
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"Error in the message.");
- return NULL;
+ return AXIS2_FAILURE;
}
/* The patteren contains in one buffer */
@@ -395,7 +421,7 @@
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"Error in parsing.");
- return NULL;
+ return AXIS2_FAILURE;
}
else
{
@@ -446,7 +472,7 @@
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"Error in parsing.");
- return NULL;
+ return AXIS2_FAILURE;
}
else
{
@@ -476,7 +502,7 @@
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"Error in parsing.");
- return NULL;
+ return AXIS2_FAILURE;
}
/*Resetting the previous search data and getting ready
@@ -499,7 +525,7 @@
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"Error while searching for the SOAP part ");
- return NULL;
+ return AXIS2_FAILURE;
}
if(search_info->match_len2 == 0)
@@ -519,7 +545,7 @@
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"Error while creating the SOAP part from the message ");
- return NULL;
+ return AXIS2_FAILURE;
}
malloc_len = len_array[buf_num] - search_info->match_len1 - temp_mime_boundary_size;
@@ -527,7 +553,7 @@
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
"Error in parsing for mime.");
- return NULL;
+ return AXIS2_FAILURE;
}
else
{
@@ -557,7 +583,7 @@
}
else
{
- return NULL;
+ return AXIS2_FAILURE;
}
}
@@ -578,13 +604,13 @@
env, soap_len, buf_num - 1, len_array, part_start, pos, buf_array, mime_parser);
if(!soap_str)
{
- return NULL;
+ return AXIS2_FAILURE;
}
malloc_len = len_array[buf_num] - search_info->match_len2;
if(malloc_len < 0)
{
- return NULL;
+ return AXIS2_FAILURE;
}
else
{
@@ -610,12 +636,13 @@
}
else
{
- return NULL;
+ return AXIS2_FAILURE;
}
}
mime_parser->soap_body_str = soap_str;
mime_parser->soap_body_len = soap_len;
+ mime_parser->current_buf_num = buf_num;
/* There are multipart/related messages which does not contain attachments
* The only mime_part is the soap envelope. So for those messages the mime
@@ -631,25 +658,89 @@
buf_array[buf_num] = NULL;
}
+ if(temp_mime_boundary)
+ {
+ AXIS2_FREE(env->allocator, temp_mime_boundary);
+ temp_mime_boundary = NULL;
+ }
+
+ if(search_info)
+ {
+ AXIS2_FREE(env->allocator, search_info);
+ search_info = NULL;
+ }
+
+ mime_parser->end_of_mime = end_of_mime;
+
+ return AXIS2_SUCCESS;
+}
+
+
+AXIS2_EXTERN axutil_hash_t *AXIS2_CALL
+axiom_mime_parser_parse_for_attachments(
+ axiom_mime_parser_t * mime_parser,
+ const axutil_env_t * env,
+ AXIS2_READ_INPUT_CALLBACK callback,
+ void *callback_ctx,
+ axis2_char_t * mime_boundary,
+ void *user_param)
+{
+ int count = 0;
+ axiom_search_info_t *search_info = NULL;
+ axis2_char_t *pos = NULL;
+ int part_start = 0;
+ axis2_char_t **buf_array = NULL;
+ int *len_array = NULL;
+ int buf_num = 0;;
+ int size = 0;
+ int malloc_len = 0;
+ axis2_callback_info_t *callback_info = NULL;
+ axis2_char_t *temp_mime_boundary = NULL;
+ int temp_mime_boundary_size = 0;
+ axis2_bool_t end_of_mime = AXIS2_FALSE;
+
+ callback_info = (axis2_callback_info_t *)callback_ctx;
+
+ search_info = AXIS2_MALLOC(env->allocator,
+ sizeof(axiom_search_info_t));
+
+ size = AXIOM_MIME_PARSER_BUFFER_SIZE * (mime_parser->buffer_size);
+
+ buf_array = mime_parser->buf_array;
+ len_array = mime_parser->len_array;
+ buf_num = mime_parser->current_buf_num;
+
+
/*<SOAP></SOAP>--MIMEBOUNDARY
mime_headr1:.......
mime_headr2:....
Binarstart.................
...............--MIMEBOUNDARY
- */
+ */
/* This loop will extract all the attachments in the message. The condition
* with the count is needed because if the sender not marked the end of the
* attachment wiht -- then this loop may run infinitely. To prevent that
* this additional condition has been put */
+ temp_mime_boundary = axutil_stracat(env, "--", mime_boundary);
+ temp_mime_boundary_size = strlen(mime_boundary) + 2;
+
- while (!end_of_mime && count < AXIOM_MIME_PARSER_END_OF_MIME_MAX_COUNT)
+ while ((!(mime_parser->end_of_mime)) && count < AXIOM_MIME_PARSER_END_OF_MIME_MAX_COUNT)
{
/*First we will search for \r\n\r\n*/
axis2_char_t *mime_id = NULL;
axis2_char_t *mime_type = NULL;
+ int mime_headers_len = 0;
+ int mime_binary_len = 0;
+ axis2_char_t *mime_binary = NULL;
+ axis2_char_t *mime_headers = NULL;
+ axis2_char_t *buffer = NULL;
+ int len = 0;
+ axis2_status_t status = AXIS2_FAILURE;
+
search_info->match_len1 = 0;
search_info->match_len2 = 0;
pos = NULL;
@@ -680,7 +771,10 @@
if(mime_headers_len > 0)
{
mime_headers = axiom_mime_parser_create_part(
- env, mime_headers_len, buf_num, len_array, part_start, pos, buf_array, mime_parser);
+ env, mime_headers_len, buf_num,
+ len_array, part_start, pos,
+ buf_array, mime_parser);
+
if(!mime_headers)
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
@@ -739,7 +833,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, mime_parser);
+ env, mime_headers_len, buf_num - 1, len_array, part_start, pos, buf_array, mime_parser);
if(!mime_headers)
{
return NULL;
@@ -807,7 +901,7 @@
/*We extract the mime headers. So lets search for the attachment.*/
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, mime_id);
+ len_array, buf_array, search_info, size, temp_mime_boundary, mime_id, user_param);
if(pos)
{
@@ -846,7 +940,7 @@
if(mime_binary_len > 0)
{
mime_binary = axiom_mime_parser_create_part(
- env, soap_len, buf_num - 1, len_array, part_start, pos, buf_array, mime_parser);
+ env, mime_binary_len, buf_num - 1, len_array, part_start, pos, buf_array, mime_parser);
if(!mime_binary)
{
return NULL;
@@ -978,6 +1072,7 @@
AXIS2_FREE(env->allocator, buf_array[buf_num]);
buf_array[buf_num] = NULL;
}
+ mime_parser->end_of_mime = end_of_mime;
}
if(mime_headers)
@@ -994,7 +1089,7 @@
/*Do the necessary cleaning */
- if (buf_array)
+ /*if (buf_array)
{
AXIS2_FREE(env->allocator, buf_array);
buf_array = NULL;
@@ -1004,7 +1099,7 @@
{
AXIS2_FREE(env->allocator, len_array);
len_array = NULL;
- }
+ }*/
if(temp_mime_boundary)
{
@@ -1195,7 +1290,8 @@
axiom_search_info_t *search_info,
int size,
axis2_char_t *mime_boundary,
- axis2_char_t *mime_id)
+ axis2_char_t *mime_id,
+ void *user_param)
{
axis2_char_t *found = NULL;
int len = 0;
@@ -1235,7 +1331,7 @@
/* 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);
+ search_info->handler = axiom_mime_parser_initiate_callback(mime_parser, env, mime_id, user_param);
if(!(search_info->handler))
{
AXIS2_LOG_ERROR(env->log, AXIS2_LOG_SI,
@@ -2048,13 +2144,32 @@
mime_parser->callback_name = callback_name;
}
+AXIS2_EXTERN void AXIS2_CALL
+axiom_mime_parser_set_mime_boundary(
+ axiom_mime_parser_t *mime_parser,
+ const axutil_env_t *env,
+ axis2_char_t *mime_boundary)
+{
+ mime_parser->mime_boundary = mime_boundary;
+}
+
+
+AXIS2_EXTERN axis2_char_t *AXIS2_CALL
+axiom_mime_parser_get_mime_boundary(
+ axiom_mime_parser_t *mime_parser,
+ const axutil_env_t *env)
+{
+ return mime_parser->mime_boundary;
+}
+
/* 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)
+ axis2_char_t *mime_id,
+ void *user_param)
{
axutil_dll_desc_t *dll_desc = NULL;
axutil_param_t *impl_info_param = NULL;
@@ -2081,6 +2196,7 @@
mime_parser->mtom_caching_callback = (axiom_mtom_caching_callback_t *)ptr;
mime_parser->mtom_caching_callback->param = impl_info_param;
+ mime_parser->mtom_caching_callback->user_param = user_param;
return AXIOM_MTOM_CACHING_CALLBACK_INIT_HANDLER(mime_parser->mtom_caching_callback, env, mime_id);
}
@@ -2154,3 +2270,4 @@
}
}
+