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/05/16 13:30:35 UTC

svn commit: r657020 - /webservices/axis2/branches/c/post_1_4_mtom/c/axiom/src/attachments/mime_parser.c

Author: manjula
Date: Fri May 16 04:30:34 2008
New Revision: 657020

URL: http://svn.apache.org/viewvc?rev=657020&view=rev
Log:
Adding some comments to the code.

Modified:
    webservices/axis2/branches/c/post_1_4_mtom/c/axiom/src/attachments/mime_parser.c

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=657020&r1=657019&r2=657020&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 Fri May 16 04:30:34 2008
@@ -195,7 +195,7 @@
     void *callback_ctx,
     axis2_char_t * mime_boundary)
 {
-    int size = AXIOM_MIME_PARSER_BUFFER_SIZE;
+    int size = 0;
     axis2_char_t *soap_str = NULL;
     int soap_len = 0;
     axis2_char_t *mime_headers = NULL;
@@ -217,6 +217,10 @@
     axis2_char_t *buffer = NULL;
     int malloc_len = 0;
 
+    size = AXIOM_MIME_PARSER_BUFFER_SIZE * (mime_parser->buffer_size); 
+
+    /*An array to keep the set of buffers*/
+
     buf_array = AXIS2_MALLOC(env->allocator,
         sizeof(axis2_char_t *) * (mime_parser->max_buffers));
 
@@ -228,6 +232,8 @@
         return NULL;
     }
 
+    /*Keeps the corresponding lenghts of buffers in buf_array*/
+
     len_array = AXIS2_MALLOC(env->allocator,
         sizeof(int) * (mime_parser->max_buffers));
 
@@ -241,6 +247,7 @@
     temp_mime_boundary = axutil_stracat(env, "--", mime_boundary);
     temp_mime_boundary_size = strlen(mime_boundary) + 2;
 
+    /*This struct keeps the pre-post search informations*/
     search_info = AXIS2_MALLOC(env->allocator,
         sizeof(axiom_search_info_t));
 
@@ -259,8 +266,12 @@
         return NULL;
     }
 
+    /*starting buffer for the current search*/
     part_start = buf_num;
 
+    /*We are passing the address of the buf_num , beacause that value 
+    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);
 
@@ -270,8 +281,12 @@
     }   
 
     /*The patteren contains in one buffer*/
+
     if((search_info->match_len2 == 0))
     {
+        /*Readusting the buffers for the next search and discarding the prevoius 
+        buffers*/
+
         malloc_len = buf_array[buf_num] + len_array[buf_num] - pos - 4;
         buffer = AXIS2_MALLOC(env->allocator, sizeof(axis2_char_t) * (
             size + 1));
@@ -280,6 +295,8 @@
         buf_array[buf_num] = buffer;
         len_array[buf_num] = malloc_len;                    
     }
+
+    /*The pattern divides among two buffers*/
         
     else if(search_info->match_len2 > 0)
     {
@@ -296,6 +313,9 @@
         return NULL;
     }
 
+    /*Resetting the previous search data and getting ready 
+      for the next search */
+
     pos = NULL;
     malloc_len = 0;
     part_start = buf_num;   
@@ -303,6 +323,9 @@
     search_info->match_len1 = 0;
     search_info->match_len2 = 0;
 
+    /*In order to extract the soap envelope we need to search for the first
+      --MIMEBOUNDARY  */
+
     pos = axiom_mime_parser_search_for_soap(env, callback, callback_ctx, &buf_num,
           len_array, buf_array, search_info, size, temp_mime_boundary);
 
@@ -313,6 +336,8 @@
     
     if(search_info->match_len2 == 0)
     {
+        /*Calculating the length of the SOAP str*/
+
         soap_len = axiom_mime_parser_calculate_part_len (
             env, buf_num, len_array, part_start, pos, buf_array[buf_num]);
         if(soap_len > 0)
@@ -370,8 +395,19 @@
 
     printf("\n\n%s\n\n", soap_str);
 
+    /*<SOAP></SOAP>--MIMEBOUNDARY
+      mime_headr1:.......
+      mime_jeadr2:....
+
+      Binarstart.................
+      ...............--MIMEBOUNDARY      
+ */
+    
+
     while (!end_of_mime && count < AXIOM_MIME_PARSER_END_OF_MIME_MAX_COUNT)
     {
+        /*First we will search for \r\n\r\n*/
+ 
         search_info->match_len1 = 0;
         search_info->match_len2 = 0;
         pos = NULL;
@@ -394,6 +430,9 @@
         /*The patteren contains in one buffer*/
         if(search_info->match_len2 == 0)
         {
+            /*We found it . so lets seperates the details of this binary into 
+              mime headers.*/
+
             mime_headers_len = axiom_mime_parser_calculate_part_len (
                 env, buf_num, len_array, part_start, pos, buf_array[buf_num]);
             if(mime_headers_len > 0)
@@ -458,11 +497,16 @@
         part_start = buf_num;
         malloc_len = 0;
 
+        /*We extract the mime headers. So lets searc for the attachment.*/
+
         pos = axiom_mime_parser_search_for_attachment(env, callback, callback_ctx, &buf_num,
           len_array, buf_array, search_info, size, temp_mime_boundary);
 
         if(pos)
         {
+            /*If it is small we are not caching. Hence the attachment 
+              is in memory. So store it in a buffer. */
+
             if(!search_info->cached)
             {
                 if(search_info->match_len2 == 0)
@@ -530,13 +574,23 @@
         {
             return NULL;
         }
-        
+
+        /*We have the attachment now either cached or not. So lets process the mime headers.*/        
+
         status = axiom_mime_parser_process_mime_headers(env, mime_parser, mime_headers,
             mime_binary, mime_binary_len);
 
+        /*Check wether we encounter --MIMEBOUNDARY-- to find the end of mime*/
+
         end_of_mime = (AXIOM_MIME_BOUNDARY_BYTE == *(buf_array[buf_num])) &&
                         (AXIOM_MIME_BOUNDARY_BYTE == *(buf_array[buf_num] + 1));
-    
+
+        if(mime_headers)
+        {
+            AXIS2_FREE(env->allocator, mime_headers);
+            mime_headers = NULL;
+        }    
+
         if(status != AXIS2_SUCCESS)
         {
             return NULL;
@@ -571,6 +625,8 @@
 
 }
 
+/*This method will search for \r\n\r\n */
+
 static axis2_char_t *axiom_mime_parser_search_for_crlf(
     const axutil_env_t * env,
     AXIS2_READ_INPUT_CALLBACK callback,
@@ -595,12 +651,16 @@
     search_info->cached = AXIS2_FALSE;
     search_info->handler = NULL;
 
+    /*First do a search in the first buffer*/
+
     search_info->buffer1 = buf_array[*buf_num];
     search_info->len1 = len_array[*buf_num];
     found = axiom_mime_parser_search_string(search_info, env);
 
     while(!found)
     {
+        /*Let's read another buffer and do a boundary search in both*/
+
         *buf_num = *buf_num + 1;
         buf_array[*buf_num] = AXIS2_MALLOC(env->allocator, sizeof(axis2_char_t) * (size + 1));
         if(buf_array[*buf_num])
@@ -620,6 +680,8 @@
         }
         if(!found)
         {
+            /*Let's do a full search in the second buffer*/
+
             search_info->buffer1 = buf_array[*buf_num];
             search_info->len1 = len_array[*buf_num];
             search_info->primary_search = AXIS2_FALSE;
@@ -632,6 +694,8 @@
     return found;
 }
 
+
+
 static axis2_char_t *axiom_mime_parser_search_for_soap(
     const axutil_env_t * env,
     AXIS2_READ_INPUT_CALLBACK callback,
@@ -692,6 +756,12 @@
     return found;
 }
 
+/*The caching is done in this function. Caching happens when we did not 
+  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 the search failed with the
+  second buffer.  */
+
 static axis2_char_t *axiom_mime_parser_search_for_attachment(
     const axutil_env_t * env,
     AXIS2_READ_INPUT_CALLBACK callback,
@@ -740,12 +810,17 @@
                 }
             }
 
+            /*We always cache the buffer which is done with full and
+             buffer boudary searched.*/
+
             status = axis2_caching_callback(env, buf_array[*buf_num - 1],
                 len_array[*buf_num - 1], search_info->handler);
             if(status == AXIS2_FAILURE)
             {
                 return NULL;
             }
+            /*Here we interchange the buffers.*/
+
             temp = buf_array[*buf_num - 1];    
             buf_array[*buf_num - 1] = buf_array[*buf_num];
             buf_array[*buf_num] = temp;
@@ -754,8 +829,10 @@
             len_array[*buf_num] = temp_length;
             if(buf_array[*buf_num])
             {
+                /*The cached buffer is the one which get filled.*/
+
                 printf("requested: %d\n", size);
-                len = callback(buf_array[*buf_num], /*len_array[*buf_num]*/size, (void *) callback_ctx);
+                len = callback(buf_array[*buf_num], size, (void *) callback_ctx);
                 printf("read length: %d\n", len);
             }
         }
@@ -801,16 +878,23 @@
         }
     }
 
+    /*Caching of the final buffer*/
+
     if(search_info->cached)
     {
         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) 
             {
                 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)
@@ -820,7 +904,11 @@
         }
         else if(search_info->match_len2 > 0)
         {
-            status = axis2_caching_callback(env, buf_array[*buf_num - 1], search_info->match_len1, search_info->handler);
+            /*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)
             {
                 return NULL;
@@ -845,6 +933,8 @@
     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,
@@ -865,6 +955,11 @@
     }
 }
 
+/*following two functions are used to extract important information 
+  for the buffer list. eg: SOAP, MIME_HEADERS*/
+
+/*marker is the starting buffer of the required 
+     part  */
 
 static int axiom_mime_parser_calculate_part_len (
     const axutil_env_t *env,
@@ -950,6 +1045,11 @@
     return mime_parser->soap_body_str;
 }
 
+/*This is the new search function. This will first do a
+search for the entire search string.Then will do a search 
+for the partial string which can be divided among two buffers.*/
+
+
 static axis2_char_t *axiom_mime_parser_search_string(
     axiom_search_info_t *search_info,
     const axutil_env_t *env)
@@ -1103,6 +1203,9 @@
     }
 }
 
+/*This will parse the string containing the mime header
+information and extract necessary details.*/
+
 
 static axis2_status_t 
 axiom_mime_parser_process_mime_headers(
@@ -1224,6 +1327,10 @@
     }    
 }
 
+/*This is used to free some unwanted buffers. For example we did
+not want the buffers which contains the data before the soap
+envelope starts. */
+
 static void axiom_mime_parser_clear_buffers(
     const axutil_env_t *env,
     axis2_char_t **buf_list,
@@ -1243,6 +1350,7 @@
     return;
 }
 
+
 void *init_handler()
 {
     FILE *fp = NULL;