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 sa...@apache.org on 2006/05/29 09:09:41 UTC
svn commit: r410041 -
/webservices/axis2/trunk/c/axiom/src/attachments/mime_parser.c
Author: samisa
Date: Mon May 29 00:09:41 2006
New Revision: 410041
URL: http://svn.apache.org/viewvc?rev=410041&view=rev
Log:
Added support for parsing multiple mime attachments
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=410041&r1=410040&r2=410041&view=diff
==============================================================================
--- webservices/axis2/trunk/c/axiom/src/attachments/mime_parser.c (original)
+++ webservices/axis2/trunk/c/axiom/src/attachments/mime_parser.c Mon May 29 00:09:41 2006
@@ -155,101 +155,112 @@
axis2_char_t *mime_binary = NULL;
int mime_binary_len = 0;
axis2_char_t *pos = NULL;
+ axis2_bool_t end_of_mime = AXIS2_FALSE;
AXIS2_ENV_CHECK(env, NULL);
mime_parser_impl = AXIS2_INTF_TO_IMPL(mime_parser);
- buffer = AXIS2_MALLOC((*env)->allocator, sizeof(axis2_char_t) * (size + 1));
-
- do
- {
- len = callback(buffer, size, (void*)callback_ctx);
- if (len > 0)
+ buffer = AXIS2_MALLOC((*env)->allocator, sizeof(axis2_char_t) * (size + 1));
+
+ do
+ {
+ len = callback(buffer, size, (void*)callback_ctx);
+ if (len > 0)
+ {
+ axis2_char_t *temp_root_mime = root_mime;
+ root_mime = AXIS2_MALLOC((*env)->allocator,
+ sizeof(char) * (root_mime_len + len + 1));
+ if (root_mime)
{
- axis2_char_t *temp_root_mime = root_mime;
- root_mime = AXIS2_MALLOC((*env)->allocator,
- sizeof(char) * (root_mime_len + len + 1));
- if (root_mime)
+ if (temp_root_mime)
{
- if (temp_root_mime)
- {
- memcpy(root_mime, temp_root_mime, root_mime_len);
- AXIS2_FREE((*env)->allocator, temp_root_mime);
- temp_root_mime = NULL;
- }
-
- memcpy(root_mime + root_mime_len, buffer, len);
- root_mime_len += len;
- root_mime[root_mime_len] = '\0';
+ memcpy(root_mime, temp_root_mime, root_mime_len);
+ AXIS2_FREE((*env)->allocator, temp_root_mime);
+ temp_root_mime = NULL;
+ }
+
+ memcpy(root_mime + root_mime_len, buffer, len);
+ root_mime_len += len;
+ root_mime[root_mime_len] = '\0';
- pos = AXIS2_STRSTR(root_mime, "\r\n\r\n");
- if (pos)
+ pos = AXIS2_STRSTR(root_mime, "\r\n\r\n");
+ if (pos)
+ {
+ if (root_mime_len > (pos - root_mime + 4))
{
- if (root_mime_len > (pos - root_mime + 4))
- {
- soap_body_len = root_mime_len - (pos - root_mime + 4);
- soap_body_str = AXIS2_MALLOC((*env)->allocator,
- sizeof(char) * (soap_body_len + 1));
- memcpy(soap_body_str, pos + 4, soap_body_len);
- soap_body_str[soap_body_len] = '\0';
- *pos = '\0';
- }
+ soap_body_len = root_mime_len - (pos - root_mime + 4);
+ soap_body_str = AXIS2_MALLOC((*env)->allocator,
+ sizeof(char) * (soap_body_len + 1));
+ memcpy(soap_body_str, pos + 4, soap_body_len);
+ soap_body_str[soap_body_len] = '\0';
+ *pos = '\0';
}
}
}
-
- } while(!pos && len > 0);
+ }
+
+ } while(!pos && len > 0);
- pos = NULL;
- len = 0;
+ pos = NULL;
+ len = 0;
- do
+ do
+ {
+ if (soap_body_str)
{
- if (soap_body_str)
- {
- pos = AXIS2_STRSTR(soap_body_str, mime_boundary);
- }
+ pos = AXIS2_STRSTR(soap_body_str, mime_boundary);
+ }
+
+ if (pos)
+ {
+ pos -= 2;
+ body_mime_len = soap_body_len - (pos - soap_body_str);
+ body_mime = AXIS2_MALLOC((*env)->allocator,
+ sizeof(char) * (body_mime_len + 1));
+ memcpy(body_mime, pos, body_mime_len);
+ body_mime[body_mime_len] = '\0';
- if (pos)
- {
- pos -= 2;
- body_mime_len = soap_body_len - (pos - soap_body_str);
- body_mime = AXIS2_MALLOC((*env)->allocator,
- sizeof(char) * (body_mime_len + 1));
- memcpy(body_mime, pos, body_mime_len);
- body_mime[body_mime_len] = '\0';
-
- *(pos) = '\0';
- soap_body_len = (pos - soap_body_str);
- }
- else
+ *(pos) = '\0';
+ soap_body_len = (pos - soap_body_str);
+ }
+ else
+ {
+ len = callback(buffer, size, (void*)callback_ctx);
+ if (len > 0)
{
- len = callback(buffer, size, (void*)callback_ctx);
- if (len > 0)
+ axis2_char_t *temp_soap_body = soap_body_str;
+ soap_body_str = AXIS2_MALLOC((*env)->allocator,
+ sizeof(char) * (soap_body_len + len + 1));
+ if (soap_body_str)
{
- axis2_char_t *temp_soap_body = soap_body_str;
- soap_body_str = AXIS2_MALLOC((*env)->allocator,
- sizeof(char) * (soap_body_len + len + 1));
- if (soap_body_str)
+ if (temp_soap_body)
{
- if (temp_soap_body)
- {
- memcpy(soap_body_str, temp_soap_body, soap_body_len);
- AXIS2_FREE((*env)->allocator, temp_soap_body);
- temp_soap_body = NULL;
- }
-
- memcpy(soap_body_str + soap_body_len, buffer, len);
- soap_body_len += len;
- soap_body_str[soap_body_len] = '\0';
+ memcpy(soap_body_str, temp_soap_body, soap_body_len);
+ AXIS2_FREE((*env)->allocator, temp_soap_body);
+ temp_soap_body = NULL;
}
- }
+
+ memcpy(soap_body_str + soap_body_len, buffer, len);
+ soap_body_len += len;
+ soap_body_str[soap_body_len] = '\0';
+ }
}
- } while(!pos && len > 0);
-
+ }
+ } while(!pos && len > 0);
+
+ if (soap_body_str)
+ {
+ mime_parser_impl->soap_body_len = soap_body_len;
+ mime_parser_impl->soap_body_str = soap_body_str;
+ }
+
+ while (!end_of_mime)
+ {
+ axis2_char_t *temp_body_mime = NULL;
+ int temp_body_mime_len = 0;
pos = NULL;
len = 0;
-
+
do
{
if (body_mime)
@@ -274,7 +285,7 @@
len = callback(buffer, size, (void*)callback_ctx);
if (len > 0)
{
- axis2_char_t *temp_body_mime = body_mime;
+ temp_body_mime = body_mime;
body_mime = AXIS2_MALLOC((*env)->allocator,
sizeof(char) * (body_mime_len + len + 1));
if (body_mime)
@@ -294,13 +305,12 @@
}
} while(!pos && len > 0);
-
- /* TODO: need to address the ultiple attachment case */
pos = NULL;
len = 0;
do
{
axis2_char_t *old_pos = NULL;
+ int old_mime_binary_len = 0;
if (mime_binary)
{
axis2_char_t *temp_pos = NULL;
@@ -308,7 +318,6 @@
do
{
-
pos = memchr(old_pos, AXIS2_MIME_BOUNDARY_BYTE,
(mime_binary_len - (old_pos - mime_binary)));
if (!pos)
@@ -324,9 +333,10 @@
temp_pos = AXIS2_STRSTR(pos + 1, mime_boundary);
}
} while ( *(pos + 1) != AXIS2_MIME_BOUNDARY_BYTE || temp_pos != pos + 2);
-
+
if ( pos && *(pos + 1) == AXIS2_MIME_BOUNDARY_BYTE && temp_pos == pos + 2)
{
+ old_mime_binary_len = mime_binary_len;
mime_binary_len = pos - mime_binary;
}
else
@@ -356,69 +366,75 @@
}
}
}
-
- } while(!pos && len > 0);
+ else
+ {
+ axis2_char_t *temp_pos = NULL;
+ temp_pos = pos + 2 + AXIS2_STRLEN(mime_boundary);
- if (soap_body_str)
+ end_of_mime = (AXIS2_MIME_BOUNDARY_BYTE == *(temp_pos)) &&
+ (AXIS2_MIME_BOUNDARY_BYTE == *(temp_pos + 1));
+
+ /* capture the next mime part */
+ temp_body_mime = AXIS2_MALLOC((*env)->allocator,
+ sizeof(char) * (old_mime_binary_len - mime_binary_len + 1));
+ if (temp_body_mime)
+ {
+ memcpy(temp_body_mime, pos, old_mime_binary_len - mime_binary_len);
+ temp_body_mime_len = old_mime_binary_len - mime_binary_len;
+ temp_body_mime[temp_body_mime_len] = '\0';
+ }
+ }
+ } while(!pos && len > 0);
+
+
+ if (mime_parser_impl->mime_parts_map)
{
- mime_parser_impl->soap_body_len = soap_body_len;
- mime_parser_impl->soap_body_str = soap_body_str;
- /* create a basic stream with soap string to pull SOAP */
- /*axis2_stream_t *stream = axis2_stream_create_basic(env);
- if (stream)
- {
- AXIS2_STREAM_WRITE(stream, env, soap_body_str, soap_body_len);
- callback_ctx.in_stream = stream;
- callback_ctx.chunked_stream = NULL;
- callback_ctx.content_length = soap_body_len;
- callback_ctx.unread_len = soap_body_len;
- }*/
-
- /* data handler hash map */
- /*binary_data_map = axis2_hash_make(env);*/
- if (mime_parser_impl->mime_parts_map)
- {
- /* get MIME ID */
- axis2_char_t *id = NULL;
- id = AXIS2_STRSTR(body_mime, "content-id");
+ /* get MIME ID */
+ axis2_char_t *id = NULL;
+ id = AXIS2_STRSTR(body_mime, "content-id");
+ if (id)
+ {
+ id += AXIS2_STRLEN("content-id");
+ while (id && *id && *id != ':')
+ id++;
if (id)
{
- id += AXIS2_STRLEN("content-id");
- while (id && *id && *id != ':')
+ while (id && *id && *id != '<')
id++;
+ id++;
if (id)
{
- while (id && *id && *id != '<')
- id++;
- id++;
- if (id)
+ axis2_char_t *pos = NULL;
+ pos = AXIS2_STRSTR(id, ">");
+ if (pos)
{
- axis2_char_t *pos = NULL;
- pos = AXIS2_STRSTR(id, ">");
- if (pos)
+ axis2_char_t *mime_id = NULL;
+ int mime_id_len = 0;
+ mime_id_len = pos - id;
+ mime_id = AXIS2_MALLOC((*env)->allocator,
+ sizeof(axis2_char_t) * mime_id_len + 1);
+ if (mime_id)
{
- axis2_char_t *mime_id = NULL;
- int mime_id_len = 0;
- mime_id_len = pos - id;
- mime_id = AXIS2_MALLOC((*env)->allocator,
- sizeof(axis2_char_t) * mime_id_len + 1);
- if (mime_id)
- {
- axis2_data_handler_t *data_handler = NULL;
- memcpy(mime_id, id, mime_id_len);
- mime_id[mime_id_len] = '\0';
- data_handler = axis2_data_handler_create(env, NULL, NULL);
- AXIS2_DATA_HANDLER_SET_BINARY_DATA(data_handler, env,
- mime_binary, mime_binary_len);
- axis2_hash_set(mime_parser_impl->mime_parts_map, mime_id,
- AXIS2_HASH_KEY_STRING, data_handler);
- }
+
+ axis2_data_handler_t *data_handler = NULL;
+ memcpy(mime_id, id, mime_id_len);
+ mime_id[mime_id_len] = '\0';
+ data_handler = axis2_data_handler_create(env, NULL, NULL);
+ AXIS2_DATA_HANDLER_SET_BINARY_DATA(data_handler, env,
+ mime_binary, mime_binary_len);
+ axis2_hash_set(mime_parser_impl->mime_parts_map, mime_id,
+ AXIS2_HASH_KEY_STRING, data_handler);
}
}
}
}
}
- }
+
+ body_mime = temp_body_mime;
+ body_mime_len = temp_body_mime_len;
+
+ }/*if (mime_parser_impl->mime_parts_map)*/
+ }/* end while (!end_of_mime) */
return mime_parser_impl->mime_parts_map;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-cvs-help@ws.apache.org