sync
authorBertrand Guiheneuf <bertrand@src.gnome.org>
Thu, 27 May 1999 16:42:26 +0000 (16:42 +0000)
committerBertrand Guiheneuf <bertrand@src.gnome.org>
Thu, 27 May 1999 16:42:26 +0000 (16:42 +0000)
camel/camel-folder.c
camel/camel-log.h
camel/camel-mime-message.c
camel/camel-mime-part.c
camel/camel-mime-part.h
camel/gmime-utils.c
camel/gmime-utils.h
camel/gstring-util.c
camel/gstring-util.h

index 09ba5a7..26b051c 100644 (file)
@@ -367,7 +367,7 @@ _create(CamelFolder *folder)
        if (folder->parent_folder) camel_folder_create(folder->parent_folder);
        else {   
                if (folder->full_name) {
-                       dich_result = g_string_right_dichotomy(folder->full_name, sep, &prefix, NULL, STRIP_TRAILING);
+                       dich_result = g_string_dichotomy(folder->full_name, sep, &prefix, NULL, STRIP_TRAILING | RIGHT_DIR);
                        if (dich_result!='o') {
                                g_warning("I have to handle the case where the path is not OK\n"); 
                                return FALSE;
index 2e68fdc..b2c9cbe 100644 (file)
@@ -33,6 +33,8 @@ extern FILE *camel_log_file_descriptor;
 
 typedef enum {
        NO_LOG     =     0,
+       STRANGE    =     5,
+       WARNING    =     7,
        FULL_DEBUG =     10
 } CamelLogLevel;
 
index 13d8f30..01f9b48 100644 (file)
 #include <stdio.h>
 #include "gmime-content-field.h"
 #include "gstring-util.h"
+#include "camel-log.h"
+
+typedef enum {
+       HEADER_UNKNOWN,
+       HEADER_FROM
+} CamelHeaderType;
+static GHashTable *header_name_table;
 
 
 
@@ -58,12 +65,20 @@ static void _set_message_number (CamelMimeMessage *mime_message, guint number);
 static guint _get_message_number (CamelMimeMessage *mime_message);
 
 static void _write_to_file(CamelDataWrapper *data_wrapper, FILE *file);
+static gboolean _parse_header_pair (CamelMimePart *mime_part, GString *header_name, GString *header_value);
 
 /* Returns the class for a CamelMimeMessage */
 #define CMM_CLASS(so) CAMEL_MIME_MESSAGE_CLASS (GTK_OBJECT(so)->klass)
 #define CDW_CLASS(so) CAMEL_DATA_WRAPPER_CLASS (GTK_OBJECT(so)->klass)
 
 
+static void
+_init_header_name_table()
+{
+       header_name_table = g_hash_table_new (g_string_hash, g_string_equal_for_hash);
+       g_hash_table_insert (header_name_table, g_string_new ("From"), (gpointer)HEADER_FROM);
+
+}
 
 static void
 camel_mime_message_class_init (CamelMimeMessageClass *camel_mime_message_class)
@@ -72,6 +87,7 @@ camel_mime_message_class_init (CamelMimeMessageClass *camel_mime_message_class)
        CamelMimePartClass *camel_mime_part_class = CAMEL_MIME_PART_CLASS (camel_mime_message_class);
 
        parent_class = gtk_type_class (camel_mime_part_get_type ());
+       _init_header_name_table();
 
        received_date_str = g_string_new("");
        sent_date_str = g_string_new("");
@@ -99,6 +115,8 @@ camel_mime_message_class_init (CamelMimeMessageClass *camel_mime_message_class)
        
        /* virtual method overload */
        camel_data_wrapper_class->write_to_file = _write_to_file;
+       camel_mime_part_class->parse_header_pair = _parse_header_pair;
+
 }
 
 
@@ -521,3 +539,31 @@ _write_to_file (CamelDataWrapper *data_wrapper, FILE *file)
        
 }
 
+/*******************************/
+/* mime message header parsing */
+
+static gboolean
+_parse_header_pair (CamelMimePart *mime_part, GString *header_name, GString *header_value)
+{
+       CamelHeaderType header_type;
+       CamelMimeMessage *message = CAMEL_MIME_MESSAGE (mime_part);
+       
+       
+       header_type = (CamelHeaderType) g_hash_table_lookup (header_name_table, header_name);
+       switch (header_type) {
+       
+       case HEADER_FROM:
+               camel_log(FULL_DEBUG,
+                         "CamelMimeMessage::parse_header_pair found HEADER_FROM : %s\n",
+                         header_value->str );
+
+               camel_mime_message_set_from (message, header_value);
+               g_string_free (header_name, TRUE);
+               return TRUE;
+               break;
+       
+       }
+
+       return parent_class->parse_header_pair (mime_part, header_name, header_value);
+       
+}
index 7be15d2..1a18aee 100644 (file)
 #include "gstring-util.h"
 
 
+typedef enum {
+       HEADER_UNKNOWN,
+       HEADER_DESCRIPTION,
+       HEADER_DISPOSITION,
+       HEADER_CONTENT_ID,
+       HEADER_ENCODING,
+       HEADER_CONTENT_LANGUAGES
+} CamelHeaderType;
+static GHashTable *header_name_table;
+
 
 static CamelDataWrapperClass *parent_class=NULL;
 
@@ -57,14 +67,24 @@ static GList *_get_header_lines (CamelMimePart *mime_part);
 static CamelDataWrapper *_get_content_object(CamelMimePart *mime_part);
 static void _write_to_file(CamelDataWrapper *data_wrapper, FILE *file);
 
+static gboolean _parse_header_pair (CamelMimePart *mime_part, GString *header_name, GString *header_value);
 
 
+static void
+_init_header_name_table()
+{
+       header_name_table = g_hash_table_new (g_string_hash, g_string_equal_for_hash);
+       g_hash_table_insert (header_name_table, g_string_new ("Content-Description"), (gpointer)HEADER_DESCRIPTION);
+       g_hash_table_insert (header_name_table, g_string_new ("Content-Disposition"), (gpointer)HEADER_DISPOSITION);
+
+}
 
 static void
 camel_mime_part_class_init (CamelMimePartClass *camel_mime_part_class)
 {
        CamelDataWrapperClass *camel_data_wrapper_class = CAMEL_DATA_WRAPPER_CLASS (camel_mime_part_class);
        parent_class = gtk_type_class (camel_data_wrapper_get_type ());
+       _init_header_name_table();
        
        /* virtual method definition */
        camel_mime_part_class->add_header=_add_header;
@@ -86,8 +106,10 @@ camel_mime_part_class_init (CamelMimePartClass *camel_mime_part_class)
        camel_mime_part_class->get_content_languages=_get_content_languages;
        camel_mime_part_class->set_header_lines=_set_header_lines;
        camel_mime_part_class->get_header_lines=_get_header_lines;
-
+       camel_mime_part_class->parse_header_pair = _parse_header_pair;
        camel_mime_part_class->get_content_object = _get_content_object;
+
+       
        
        /* virtual method overload */
        camel_data_wrapper_class->write_to_file = _write_to_file;
@@ -98,7 +120,7 @@ camel_mime_part_init (gpointer   object,  gpointer   klass)
 {
        CamelMimePart *camel_mime_part = CAMEL_MIME_PART (object);
 
-       camel_mime_part->headers =  g_hash_table_new(g_string_hash, g_string_equal_for_hash);
+       camel_mime_part->headers =  g_hash_table_new (g_string_hash, g_string_equal_for_hash);
 
 }
 
@@ -138,7 +160,9 @@ _add_header (CamelMimePart *mime_part, GString *header_name, GString *header_val
        gboolean header_exists;
        GString *old_header_name;
        GString *old_header_value;
-
+       
+       if (CMP_CLASS(mime_part)->parse_header_pair (mime_part, header_name, header_value)) 
+               return;
        header_exists = g_hash_table_lookup_extended (mime_part->headers, header_name, 
                                                      (gpointer *) &old_header_name,
                                                      (gpointer *) &old_header_value);
@@ -503,3 +527,24 @@ _write_to_file(CamelDataWrapper *data_wrapper, FILE *file)
        
 }
 
+
+
+/*******************************/
+/* mime part parsing           */
+
+static gboolean
+_parse_header_pair (CamelMimePart *mime_part, GString *header_name, GString *header_value)
+{
+       CamelHeaderType header_type;
+       header_type = (CamelHeaderType) g_hash_table_lookup (header_name_table, header_name);
+       switch (header_type) {
+       
+       case HEADER_DESCRIPTION:
+               printf("found HEADER_DESCRIPTION\n");
+               return TRUE;
+               break;
+       
+       }
+       return FALSE;
+       
+}
index 3fdb75d..7cd724e 100644 (file)
@@ -87,7 +87,8 @@ typedef struct {
        GList * (*get_content_languages) (CamelMimePart *mime_part);
        void  (*set_header_lines) (CamelMimePart *mime_part, GList *header_lines);
        GList * (*get_header_lines) (CamelMimePart *mime_part);
-
+       gboolean (*parse_header_pair) (CamelMimePart *mime_part, GString *header_name, GString *header_value);
+       
        CamelDataWrapper * (*get_content_object) (CamelMimePart *mime_part);
 } CamelMimePartClass;
 
index f4009e9..9f489a2 100644 (file)
@@ -24,6 +24,9 @@
 
 
 #include "gmime-utils.h"
+#include "gstring-util.h"
+#include "camel-log.h"
+
 void
 gmime_write_header_pair_to_file (FILE* file, gchar* name, GString *value)
 {
@@ -88,9 +91,29 @@ write_header_with_glist_to_file (FILE *file, gchar *header_name, GList *header_v
 /* * * * * * * * * * * */
 /* scanning functions  */
 
+static void
+_store_header_pair_from_gstring (GHashTable *header_table, GString *header_line)
+{
+       gchar dich_result;
+       GString *header_name, *header_value;
+       
+       g_assert (header_table);
+       if ( (header_line) && (header_line->str) ) {
+               dich_result = g_string_dichotomy(header_line, ':', &header_name, &header_value, NONE);
+               if (dich_result != 'o')
+                       camel_log(WARNING, 
+                                 "store_header_pair_from_gstring : dichotomy result is %c"
+                                 "header line is :\n--\n%s\n--\n");
+               
+               else
+                       g_hash_table_insert (header_table, header_name, header_value);
+       }
+               
+}
+
 
-GList *
-get_header_lines_from_file (FILE *file)
+GHashTable *
+get_header_table_from_file (FILE *file)
 {
        int next_char;
 
@@ -99,8 +122,9 @@ get_header_lines_from_file (FILE *file)
        gboolean end_of_headers = FALSE;
        gboolean end_of_file = FALSE;
        GString *header_line=NULL;
-       GList *header_lines=NULL;
+       GHashTable *header_table;
 
+       header_table = g_hash_table_new (g_string_hash, g_string_equal_for_hash);
        next_char = fgetc (file);
        do {
                header_line = g_string_new("");
@@ -137,13 +161,12 @@ get_header_lines_from_file (FILE *file)
                } while ( !end_of_header_line );
                
                if ( strlen(header_line->str) ) 
-                       header_lines = g_list_append (header_lines, header_line);
-               else 
-                       g_string_free (header_line, FALSE);
+                       _store_header_pair_from_gstring (header_table, header_line);
+               g_string_free (header_line, FALSE);
 
        } while ( (!end_of_headers) && (!end_of_file) );
 
-       return header_lines;
+       return header_table;
 }
                
                
index d7ce1d0..dafc5ca 100644 (file)
@@ -38,7 +38,7 @@ void gmime_write_header_pair_to_file (FILE* file, gchar* name, GString *value);
 void write_header_table_to_file (FILE *file, GHashTable *header_table);
 void write_header_with_glist_to_file (FILE *file, gchar *header_name, GList *header_values);
 
-GList *get_header_lines_from_file (FILE *file);
+GHashTable *get_header_table_from_file (FILE *file);
 
 
 
index 4d0411d..5d11fa9 100644 (file)
@@ -64,7 +64,7 @@ g_string_clone(GString *string)
 
 
 /**
- * right_dichotomy : return the strings before and/or after 
+ * g_string_dichotomy : return the strings before and/or after 
  * the last occurence of the specified separator
  *
  * This routine returns the string before and/or after
@@ -85,20 +85,20 @@ g_string_clone(GString *string)
  *
  **/
 gchar
-g_string_right_dichotomy( GString *string, gchar sep, GString **prefix, GString **suffix, DichotomyOption options)
+g_string_dichotomy (GString *string, gchar sep, GString **prefix, GString **suffix, DichotomyOption options)
 {
        gchar *str, *tmp;
        gint pos, len, first;
        
        CAMEL_LOG(FULL_DEBUG,\
-                 "Entering rightDichotomy: \n\tseparator=%c \n\tprefix=%p \n\tsuffix=%p \n\toptions=%ld\n",\
+                 "Entering string_dichotomy: \n\tseparator=%c \n\tprefix=%p \n\tsuffix=%p \n\toptions=%ld\n",\
                  sep, prefix, suffix, options);
        g_assert( tmp=string->str );
        len = strlen(tmp);
        if (!len) {
                if (prefix) *prefix=NULL;
                if (suffix) *suffix=NULL;
-               CAMEL_LOG(FULL_DEBUG,"rightDichotomy: string is empty\n");
+               CAMEL_LOG(FULL_DEBUG,"string_dichotomy: string is empty\n");
                return 'n';
        }
        first = 0;
@@ -113,32 +113,48 @@ g_string_right_dichotomy( GString *string, gchar sep, GString **prefix, GString
        if (first==len) {
                if (prefix) *prefix=NULL;
                if (suffix) *suffix=NULL;
-               CAMEL_LOG(FULL_DEBUG,"rightDichotomy: after stripping, string is empty\n");
+               CAMEL_LOG(FULL_DEBUG,"string_dichotomy: after stripping, string is empty\n");
                return 'n';
        }
        
-       pos = len;
-       
-       do {
-               pos--;
-       } while ((pos>=first) && (tmp[pos]!=sep));
-       
+       if (options & RIGHT_DIR) {
+               pos = len;
+               
+               do {
+                       pos--;
+               } while ((pos>=first) && (tmp[pos]!=sep));
+       } else {
+               pos = first;
+               do {
+                       pos++;
+               } while ((pos<len) && (tmp[pos]!=sep));
+               
+       }
        
-       if (pos<first
+       if ( (pos<first) || (pos>=len) 
                {
                        if (suffix) *suffix=NULL;
                        if (prefix) *prefix=NULL;
-                       CAMEL_LOG(FULL_DEBUG,"rightDichotomy: separator not found\n");
+                       CAMEL_LOG(FULL_DEBUG,"string_dichotomy: separator not found\n");
                        return 'n';
                }
        
-       /* if we have stripped trailongs separators, we should */
+       /* if we have stripped trailing separators, we should */
        /* never enter here */
        if (pos==len-1) 
                {
                        if (suffix) *suffix=NULL;
                        if (prefix) *prefix=NULL;
-                       CAMEL_LOG(FULL_DEBUG,"rightDichotomy: separator is last character\n");
+                       CAMEL_LOG(FULL_DEBUG,"string_dichotomy: separator is last character\n");
+                       return 'l';
+               }
+       /* if we have stripped leading separators, we should */
+       /* never enter here */
+       if (pos==first)
+               {
+                       if (suffix) *suffix=NULL;
+                       if (prefix) *prefix=NULL;
+                       CAMEL_LOG(FULL_DEBUG,"string_dichotomy: separator is first character\n");
                        return 'l';
                }
        
@@ -159,7 +175,6 @@ g_string_right_dichotomy( GString *string, gchar sep, GString **prefix, GString
 }
 
 
-
 /**
  * g_string_append_g_string : append a GString to another  GString
  *
index f8b7ee3..8d88bf1 100644 (file)
@@ -36,15 +36,16 @@ extern "C" {
 
 typedef enum {
     NONE            =     0,
-    STRIP_TRAILING  =     1,
-    STRIP_LEADING   =     2
+    RIGHT_DIR       =     1,
+    STRIP_TRAILING  =     2,
+    STRIP_LEADING   =     4,
     
 } DichotomyOption;
 
 
 gboolean g_string_equals(GString *string1, GString *string2);
 GString *g_string_clone(GString *string);
-gchar g_string_right_dichotomy( GString *string, gchar sep, GString **prefix, GString **suffix, DichotomyOption options);
+gchar g_string_dichotomy( GString *string, gchar sep, GString **prefix, GString **suffix, DichotomyOption options);
 void g_string_append_g_string(GString *dest_string, GString *other_string);
 
 gboolean g_string_equal_for_hash (gconstpointer v, gconstpointer v2);