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