new function, broken out from 'camel_formatter_make_html'.
authorMatthew Loper <mloper@src.gnome.org>
Mon, 24 Jan 2000 14:43:06 +0000 (14:43 +0000)
committerMatthew Loper <mloper@src.gnome.org>
Mon, 24 Jan 2000 14:43:06 +0000 (14:43 +0000)
* camel/camel-formatter.c (write_header_info_to_stream): new
function, broken out from 'camel_formatter_make_html'.
(write_mimepart_to_stream): same.
(find_text_body_part_in_multipart_related): new function.
(camel_formatter_make_html): Now tries to deal with
multipart/related, multipart/alternate, and text/(plain|html).

camel/camel-formatter.c
camel/camel-formatter.h

index f1347c7..fec74db 100644 (file)
@@ -46,7 +46,7 @@ write_field_to_stream (gchar* description, gchar* value, CamelStream *stream)
 
 static void
 write_recipients_to_stream (const gchar *recipient_type,
-                           GList *recipients,
+                           const GList *recipients,
                            CamelStream* stream_out)
 {
        gchar *s;
@@ -67,6 +67,7 @@ write_recipients_to_stream (const gchar *recipient_type,
        camel_stream_write_string (stream_out, "<br><br>\n");   
 }
 
+
 CamelFormatter*
 camel_formatter_new ()
 {
@@ -74,23 +75,14 @@ camel_formatter_new ()
 }
 
 
-/**
- * camel_formatter_make_html: 
- * @formatter: the camel formatter object
- * @stream_out: byte stream where data will be written 
- *
- * Writes a CamelMimeMessage out, as html, into a stream passed in as
- * a parameter.
- **/
-void
-camel_formatter_make_html (CamelFormatter* formatter,
-                          CamelMimeMessage* mime_message,
-                          CamelStream* stream_out)
+static void
+write_header_info_to_stream (CamelMimeMessage* mime_message,
+                            CamelStream* stream_out)
 {
        gchar *s = NULL;
-       GList *recipients = NULL;
+       const GList *recipients = NULL;
 
-       g_assert (formatter && mime_message && stream_out);
+       g_assert (mime_message && stream_out);
 
        camel_stream_write_string (stream_out, "Content type: text/html\n");
        
@@ -112,10 +104,11 @@ camel_formatter_make_html (CamelFormatter* formatter,
        if ((s = (gchar*)camel_mime_message_get_sent_date (mime_message))) {
                write_field_to_stream ("Sent Date: ", s, stream_out);
        }               
-
        /* Fill out the "To:" recipients line */
        recipients = camel_mime_message_get_recipients (
                mime_message, CAMEL_RECIPIENT_TYPE_TO);
+       
        if (recipients)
                write_recipients_to_stream ("To:", recipients, stream_out);
 
@@ -124,6 +117,7 @@ camel_formatter_make_html (CamelFormatter* formatter,
                mime_message, CAMEL_RECIPIENT_TYPE_CC);
        if (recipients)
                write_recipients_to_stream ("CC:", recipients, stream_out);     
+
        /* Fill out the "BCC:" recipients line */
        recipients = camel_mime_message_get_recipients (
                mime_message, CAMEL_RECIPIENT_TYPE_BCC);        
@@ -131,6 +125,137 @@ camel_formatter_make_html (CamelFormatter* formatter,
                write_recipients_to_stream ("BCC:", recipients, stream_out);
 }
 
+#define MIME_TYPE_WHOLE(a)  (gmime_content_field_get_mime_type ( \
+                                      camel_mime_part_get_content_type (CAMEL_MIME_PART (a))))
+#define MIME_TYPE_MAIN(a)  ((camel_mime_part_get_content_type (CAMEL_MIME_PART (a)))->type)
+#define MIME_TYPE_SUB(a)   ((camel_mime_part_get_content_type (CAMEL_MIME_PART (a)))->subtype)
+
+static gboolean
+strmatch (gchar *a, gchar *b)
+{
+       return (g_strcasecmp (a,b) == 0);
+}
+
+
+static void
+write_mimepart_to_stream (CamelMimePart* mime_part, CamelStream* stream)
+{
+       if (strmatch (MIME_TYPE_WHOLE(mime_part), "text/plain")) {
+                /* print out the shit plain-style */
+       }
+       else if (strmatch (MIME_TYPE_WHOLE(mime_part), "text/html")) {
+                /* print out the html */
+       }
+       else if (strmatch (MIME_TYPE_MAIN(mime_part), "image")) {
+                /* print out <img src="foofuck"> */
+       }
+}
+
+
+/* returns NULL if no text/html or text/plan msg is found */
+static CamelMimePart*
+find_text_body_part_in_multipart_related (CamelMultipart* multipart)
+{
+       int i, max_multiparts;
+       CamelMimePart* html_part = NULL;
+       CamelMimePart* plain_part = NULL;       
+
+       /* find out out many parts are in it...*/
+       max_multiparts = camel_multipart_get_number (multipart);
+       
+       /* ...and write each one, as html, into the stream. */
+       for (i = 0; i < max_multiparts; i++) {
+               CamelMimeBodyPart* body_part = camel_multipart_get_part (multipart, i);
+               if (strmatch (MIME_TYPE_SUB (body_part), "plain")) {
+                       plain_part = CAMEL_MIME_PART (body_part);
+               }
+               else if (strmatch (MIME_TYPE_SUB (body_part), "html")) {
+                       html_part = CAMEL_MIME_PART (body_part);
+               }
+       }
+
+       if (html_part)
+               return html_part;
+       if (plain_part)
+               return plain_part;
+       return NULL;
+}
+
+
+/**
+ * camel_formatter_make_html: 
+ * @formatter: the camel formatter object
+ * @stream_out: byte stream where data will be written 
+ *
+ * Writes a CamelMimeMessage out, as html, into a stream passed in as
+ * a parameter.
+ **/
+void
+camel_formatter_make_html (CamelFormatter* formatter,
+                          CamelMimeMessage* mime_message,
+                          CamelStream* stream_out)
+{
+       /* Get the mime-type of the mime message */
+       gchar* mime_type_whole = /* ex. "text/plain" */
+               MIME_TYPE_WHOLE (mime_message);
+
+       /* get the contents of the mime message */
+       CamelDataWrapper* message_contents = camel_medium_get_content_object (
+               CAMEL_MEDIUM (mime_message));
+       
+       /* write the 'subject:', 'to:', 'from:', etc. into the output stream */
+       write_header_info_to_stream (mime_message, stream_out);
+
+       /* if we're dealing with a multipart/related message... */
+       if (strmatch (MIME_TYPE_WHOLE (mime_message), "multipart/related")) {
+
+               CamelMultipart *multipart = CAMEL_MULTIPART (
+                       message_contents);
+
+               int i, max_multiparts;
+
+               /* find out out many parts are in it...*/
+               max_multiparts = camel_multipart_get_number (multipart);
+
+               /* ...and write each one, as html, into the stream. */
+               for (i = 0; i < max_multiparts; i++) {
+                       CamelMimeBodyPart* body_part =
+                               camel_multipart_get_part (multipart, i);
+
+                       write_mimepart_to_stream (CAMEL_MIME_PART (body_part), stream_out);
+               }
+       }
+       else { /* okay, it's not multipart-related */
+
+               CamelMimePart* mime_part = NULL;
+
+               if (strmatch (mime_type_whole, "multipart/alternate")) {
+                       mime_part =
+                               find_text_body_part_in_multipart_related (
+                                       CAMEL_MULTIPART(message_contents));
+               }
+               else if (strmatch (mime_type_whole, "text/plain") ||
+                        strmatch (mime_type_whole, "text/html")) {
+
+                       mime_part = CAMEL_MIME_PART (message_contents);
+               }
+
+               if (message_contents) {
+
+               }
+               else {
+                       gchar *error_string = g_strdup_printf (
+                               "Sorry, but I don't know how to display items of type %s\n",
+                               mime_type_whole);
+
+                       camel_stream_write_string (stream_out, error_string);
+                       g_free (error_string);
+               }
+       }
+}
+
+
 static void
 camel_formatter_class_init (CamelFormatterClass *camel_formatter_class)
 {
@@ -143,14 +268,14 @@ camel_formatter_class_init (CamelFormatterClass *camel_formatter_class)
        gtk_object_class->finalize = _finalize;
 }
 
-static void
+void
 camel_formatter_init (gpointer object, gpointer klass) 
 {
        CamelFormatter* cmf = CAMEL_FORMATTER (object);
        cmf->priv = g_new (CamelFormatterPrivate, 1);
 }
 
-
 GtkType
 camel_formatter_get_type (void)
 {
index 16942fc..1bcbb2d 100644 (file)
 #ifndef CAMEL_FORMATTER_H
 #define CAMEL_FORMATTER_H
 
+#ifdef __cplusplus
+extern "C" {
+#pragma }
+#endif /* __cplusplus }*/
+
 #include <gtk/gtk.h>
-#include "camel-mime-message.h"
+#include "camel.h"
 
 #define CAMEL_FORMATTER_TYPE     (camel_formatter_get_type ())
 #define CAMEL_FORMATTER(obj)     (GTK_CHECK_CAST((obj), CAMEL_FORMATTER_TYPE, CamelDataWrapper))
 
 typedef struct _CamelFormatterPrivate CamelFormatterPrivate;
 
-typedef struct 
+typedef struct _CamelFormatter CamelFormatter;
+
+struct _CamelFormatter
 {
        GtkObject parent_object;
        CamelFormatterPrivate *priv;
-} CamelFormatter;
+};
 
 typedef struct {
        GtkObjectClass parent_class;
@@ -50,7 +57,7 @@ typedef struct {
 GtkType  camel_formatter_get_type (void);
 
 /* Public functions */
-CamelFormatter* camel_formatter_new ();
+CamelFormatter* camel_formatter_new (void);
 
 /* The main job of CamelFormatter is to take a mime message, and
    produce html from it. */
@@ -58,5 +65,10 @@ void     camel_formatter_make_html (CamelFormatter* cmf,
                                    CamelMimeMessage *msg,
                                    CamelStream* stream_out);
 
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
 #endif // CAMEL_FORMATTER_H