2004-10-02 [colin] 0.9.12cvs119
authorColin Leroy <colin@colino.net>
Sat, 2 Oct 2004 16:26:17 +0000 (16:26 +0000)
committerColin Leroy <colin@colino.net>
Sat, 2 Oct 2004 16:26:17 +0000 (16:26 +0000)
* src/mainwindow.c
* src/messageview.c
* src/prefs_common.h
* src/procmime.c
* src/procmime.h
* src/textview.c
Clean up forced charset feature
Add forced decode

ChangeLog.claws
PATCHSETS
configure.ac
src/mainwindow.c
src/messageview.c
src/prefs_common.h
src/procmime.c
src/procmime.h
src/textview.c

index ecd193b2109f023f199f8ae51f597cc7ce4092d6..d48a39df72aa5a793866a8e7fb23292b08b598b0 100644 (file)
@@ -1,3 +1,14 @@
+2004-10-02 [colin]     0.9.12cvs119
+
+       * src/mainwindow.c
+       * src/messageview.c
+       * src/prefs_common.h
+       * src/procmime.c
+       * src/procmime.h
+       * src/textview.c
+               Clean up forced charset feature
+               Add forced decode
+
 2004-10-01 [colin]     0.9.12cvs118
 
        * src/mimeview.c
index 8ec893614a84504403e8a48ed02f35df45b28587..b410dc6dcbbed730011d69d625afd55acb139882 100644 (file)
--- a/PATCHSETS
+++ b/PATCHSETS
 ( cvs diff -u -r 1.443 -r 1.444 ChangeLog; cvs diff -u -r 1.438 -r 1.439 ChangeLog.jp; cvs diff -u -r 1.73 -r 1.74 src/account.c; cvs diff -u -r 1.227 -r 1.228 src/prefs_common.c; cvs diff -u -r 1.3 -r 1.4 src/gtk/colorlabel.c; ) > 0.9.12cvs116.patchset
 ( cvs diff -u -r 1.126 -r 1.127 src/mimeview.c; ) > 0.9.12cvs117.patchset
 ( cvs diff -u -r 1.127 -r 1.128 src/mimeview.c; ) > 0.9.12cvs118.patchset
+( cvs diff -u -r 1.310 -r 1.311 src/mainwindow.c; cvs diff -u -r 1.124 -r 1.125 src/messageview.c; cvs diff -u -r 1.114 -r 1.115 src/prefs_common.h; cvs diff -u -r 1.84 -r 1.85 src/procmime.c; cvs diff -u -r 1.29 -r 1.30 src/procmime.h; cvs diff -u -r 1.123 -r 1.124 src/textview.c; ) > 0.9.12cvs119.patchset
index ca74d970f1b0d4017c2dacb2feae04a52ca358f9..f5ea46770d8b4e8b31f8f325132a7f9711e9cf47 100644 (file)
@@ -11,7 +11,7 @@ MINOR_VERSION=9
 MICRO_VERSION=12
 INTERFACE_AGE=0
 BINARY_AGE=0
-EXTRA_VERSION=118
+EXTRA_VERSION=119
 EXTRA_RELEASE=
 
 if test \( $EXTRA_VERSION -eq 0 \) -o \( "x$EXTRA_RELEASE" != "x" \); then
index c89fd691d1a4581fd6129b7bc1bc8515ebbc8017..0f97a465a3c1443cdbe4dd6cc41b4df5ebbb7b70 100644 (file)
@@ -260,6 +260,10 @@ static void set_charset_cb         (MainWindow     *mainwin,
                                         guint           action,
                                         GtkWidget      *widget);
 
+static void set_decode_cb              (MainWindow     *mainwin,
+                                        guint           action,
+                                        GtkWidget      *widget);
+
 static void hide_read_messages   (MainWindow   *mainwin,
                                  guint          action,
                                  GtkWidget     *widget);
@@ -614,6 +618,22 @@ static GtkItemFactoryEntry mainwin_entries[] =
 #undef CODESET_SEPARATOR
 #undef CODESET_ACTION
 
+#define DECODE_SEPARATOR \
+       {N_("/_View/Decode/---"),               NULL, NULL, 0, "<Separator>"}
+#define DECODE_ACTION(action) \
+        NULL, set_decode_cb, action, "/View/Decode/Auto detect"
+       {N_("/_View/Decode"),           NULL, NULL, 0, "<Branch>"},
+       {N_("/_View/Decode/_Auto detect"),
+        NULL, set_decode_cb, 0, "<RadioItem>"},
+       {N_("/_View/Decode/---"),               NULL, NULL, 0, "<Separator>"},
+       {N_("/_View/Decode/_8bit"),             DECODE_ACTION(ENC_8BIT)},
+       {N_("/_View/Decode/_Quoted printable"), DECODE_ACTION(ENC_QUOTED_PRINTABLE)},
+       {N_("/_View/Decode/_Base64"),           DECODE_ACTION(ENC_BASE64)},
+       {N_("/_View/Decode/_Uuencode"),         DECODE_ACTION(ENC_X_UUENCODE)},
+
+#undef DECODE_SEPARATOR
+#undef DECODE_ACTION
+
        {N_("/_View/---"),                      NULL, NULL, 0, "<Separator>"},
        {N_("/_View/Open in new _window"),      "<control><alt>N", open_msg_cb, 0, NULL},
        {N_("/_View/Mess_age source"),          "<control>U", view_source_cb, 0, NULL},
@@ -2603,15 +2623,31 @@ static void set_charset_cb(MainWindow *mainwin, guint action,
 
        if (GTK_CHECK_MENU_ITEM(widget)->active) {
                str = conv_get_charset_str((CharSet)action);
-               g_free(prefs_common.force_charset);
-               prefs_common.force_charset = str ? g_strdup(str) : NULL;
-
+               
+               g_free(mainwin->messageview->forced_charset);
+               mainwin->messageview->forced_charset = str ? g_strdup(str) : NULL;
+               procmime_force_charset(str);
+               
                summary_redisplay_msg(mainwin->summaryview);
                
                debug_print("forced charset: %s\n", str ? str : "Auto-Detect");
        }
 }
 
+static void set_decode_cb(MainWindow *mainwin, guint action,
+                          GtkWidget *widget)
+{
+       const gchar *str;
+
+       if (GTK_CHECK_MENU_ITEM(widget)->active) {
+               procmime_force_encoding((EncodingType)action);
+
+               summary_redisplay_msg(mainwin->summaryview);
+               
+               debug_print("forced encoding: %d\n", action);
+       }
+}
+
 static void hide_read_messages (MainWindow *mainwin, guint action,
                                GtkWidget *widget)
 {
index d7a2005a9e8b5045988909aabb983fd9658e115b..c8d1ae6d7d9f37584103de32bbe71045c028942a 100644 (file)
@@ -1274,6 +1274,8 @@ static void set_charset_cb(gpointer data, guint action, GtkWidget *widget)
                charset = conv_get_charset_str((CharSet)action);
                g_free(messageview->forced_charset);
                messageview->forced_charset = g_strdup(charset);
+               procmime_force_charset(charset);
+               
                messageview_show(messageview, messageview->msginfo, FALSE);
        }
 }
index 5305fe9abf6d6d8390ad5a0f37ec0255d1220ab2..12cca8e314ab2adba47798179e9ff9486a0ba8d4 100644 (file)
@@ -30,6 +30,7 @@
 #include "summaryview.h"
 #include "codeconv.h"
 #include "textview.h"
+#include "procmime.h"
 
 typedef struct _PrefsCommon    PrefsCommon;
 
@@ -222,8 +223,6 @@ struct _PrefsCommon
        gint scroll_step;
        gboolean scroll_halfpage;
 
-       gchar *force_charset;
-
        gboolean show_other_header;
        GSList *disphdr_list;
 
index 14aa6ae8a18d2bb20d3e5fc84fa44b49af051c8e..8dcc643f816c90b87501323ff75cc361e3e7bbcf 100644 (file)
@@ -73,6 +73,23 @@ static gboolean procmime_mimeinfo_parameters_destroy(gpointer key, gpointer valu
        return TRUE;
 }
 
+static gchar *forced_charset = NULL;
+
+void procmime_force_charset(const gchar *str)
+{
+       g_free(forced_charset);
+       forced_charset = NULL;
+       if (str)
+               forced_charset = g_strdup(str);
+}
+
+static EncodingType forced_encoding = 0;
+
+void procmime_force_encoding(EncodingType encoding)
+{
+       forced_encoding = encoding;
+}
+
 static gboolean free_func(GNode *node, gpointer data)
 {
        MimeInfo *mimeinfo = (MimeInfo *) node->data;
@@ -231,9 +248,15 @@ gboolean procmime_decode_content(MimeInfo *mimeinfo)
        FILE *outfp, *infp;
        struct stat statbuf;
 
+       EncodingType encoding = forced_encoding 
+                               ? forced_encoding
+                               : mimeinfo->encoding_type;
+                  
        g_return_val_if_fail(mimeinfo != NULL, FALSE);
 
-       if (mimeinfo->encoding_type == ENC_BINARY)
+       if (encoding == ENC_BINARY || 
+           encoding == ENC_7BIT ||
+           encoding == ENC_8BIT)
                return TRUE;
 
        infp = fopen(mimeinfo->filename, "rb");
@@ -252,13 +275,13 @@ gboolean procmime_decode_content(MimeInfo *mimeinfo)
 
        readend = mimeinfo->offset + mimeinfo->length;
 
-       if (mimeinfo->encoding_type == ENC_QUOTED_PRINTABLE) {
+       if (encoding == ENC_QUOTED_PRINTABLE) {
                while ((ftell(infp) < readend) && (fgets(buf, sizeof(buf), infp) != NULL)) {
                        gint len;
                        len = qp_decode_line(buf);
                        fwrite(buf, len, 1, outfp);
                }
-       } else if (mimeinfo->encoding_type == ENC_BASE64) {
+       } else if (encoding == ENC_BASE64) {
                gchar outbuf[BUFFSIZE];
                gint len;
                Base64Decoder *decoder;
@@ -273,7 +296,7 @@ gboolean procmime_decode_content(MimeInfo *mimeinfo)
                        fwrite(outbuf, sizeof(gchar), len, outfp);
                }
                base64_decoder_free(decoder);
-       } else if (mimeinfo->encoding_type == ENC_X_UUENCODE) {
+       } else if (encoding == ENC_X_UUENCODE) {
                gchar outbuf[BUFFSIZE];
                gint len;
                gboolean flag = FALSE;
@@ -490,9 +513,9 @@ FILE *procmime_get_text_content(MimeInfo *mimeinfo)
                return NULL;
        }
 
-       src_codeset = prefs_common.force_charset
-               ? prefs_common.force_charset : 
-               procmime_mimeinfo_get_parameter(mimeinfo, "charset");
+       src_codeset = forced_charset
+                     ? forced_charset : 
+                     procmime_mimeinfo_get_parameter(mimeinfo, "charset");
 
        renderer = NULL;
 
@@ -987,10 +1010,7 @@ void procmime_parse_message_rfc822(MimeInfo *mimeinfo)
        FILE *fp;
        gint mime_major, mime_minor;
 
-       if (mimeinfo->encoding_type != ENC_BINARY && 
-          mimeinfo->encoding_type != ENC_7BIT && 
-          mimeinfo->encoding_type != ENC_8BIT)
-               procmime_decode_content(mimeinfo);
+       procmime_decode_content(mimeinfo);
 
        fp = fopen(mimeinfo->filename, "rb");
        if (fp == NULL) {
@@ -1059,10 +1079,7 @@ void procmime_parse_multipart(MimeInfo *mimeinfo)
                return;
        boundary_len = strlen(boundary);
 
-       if (mimeinfo->encoding_type != ENC_BINARY && 
-           mimeinfo->encoding_type != ENC_7BIT && 
-           mimeinfo->encoding_type != ENC_8BIT)
-               procmime_decode_content(mimeinfo);
+       procmime_decode_content(mimeinfo);
 
        fp = fopen(mimeinfo->filename, "rb");
        if (fp == NULL) {
index 62e3b4b1e88233ef64a7ac0b0d92314a0c10513e..9be1ece38e7ffc6ccd30dc4bd4d09dc595a3347d 100644 (file)
@@ -194,6 +194,8 @@ MimeInfo *procmime_scan_queue_file          (gchar          *filename);
 const gchar *procmime_get_type_str             (MimeMediaType   type);
 gchar *procmime_get_content_type_str           (MimeMediaType   type,
                                                 const gchar    *subtype);
+void procmime_force_charset                    (const gchar    *str);
+void procmime_force_encoding                   (EncodingType    encoding);
 
 void renderer_read_config(void);
 void renderer_write_config(void);
index a0d12141ff542b95d53a8ed5d09ec86f27dceb63..a0bb26ccc14ed747318ed99549e124813699050e 100644 (file)
@@ -127,8 +127,7 @@ static void textview_add_part               (TextView       *textview,
 static void textview_add_parts         (TextView       *textview,
                                         MimeInfo       *mimeinfo);
 static void textview_write_body                (TextView       *textview,
-                                        MimeInfo       *mimeinfo,
-                                        const gchar    *charset);
+                                        MimeInfo       *mimeinfo);
 static void textview_show_html         (TextView       *textview,
                                         FILE           *fp,
                                         CodeConverter  *conv);
@@ -311,21 +310,12 @@ void textview_show_message(TextView *textview, MimeInfo *mimeinfo,
 {
        GtkSText *text;
        FILE *fp;
-       const gchar *charset = NULL;
 
        if ((fp = fopen(file, "rb")) == NULL) {
                FILE_OP_ERROR(file, "fopen");
                return;
        }
 
-       if (textview->messageview->forced_charset)
-               charset = textview->messageview->forced_charset;
-       else if (prefs_common.force_charset)
-               charset = prefs_common.force_charset;
-       else
-               charset = procmime_mimeinfo_get_parameter(mimeinfo, "charset");
-
-       textview_set_font(textview, charset);
        textview_clear(textview);
 
        text = GTK_STEXT(textview->text);
@@ -351,7 +341,6 @@ void textview_show_message(TextView *textview, MimeInfo *mimeinfo,
 void textview_show_part(TextView *textview, MimeInfo *mimeinfo, FILE *fp)
 {
        GtkSText *text;
-       const gchar *charset = NULL;
 
        g_return_if_fail(mimeinfo != NULL);
        g_return_if_fail(fp != NULL);
@@ -368,14 +357,6 @@ void textview_show_part(TextView *textview, MimeInfo *mimeinfo, FILE *fp)
 /*
        headers = textview_scan_header(textview, fp);
 */
-       if (textview->messageview->forced_charset)
-               charset = textview->messageview->forced_charset;
-       else if (prefs_common.force_charset)
-               charset = prefs_common.force_charset;
-       else
-               charset = procmime_mimeinfo_get_parameter(mimeinfo, "charset");
-
-       textview_set_font(textview, charset);
 
        text = GTK_STEXT(textview->text);
 
@@ -394,7 +375,7 @@ void textview_show_part(TextView *textview, MimeInfo *mimeinfo, FILE *fp)
        if (mimeinfo->type == MIMETYPE_MULTIPART)
                textview_add_parts(textview, mimeinfo);
        else
-               textview_write_body(textview, mimeinfo, charset);
+               textview_write_body(textview, mimeinfo);
 
        gtk_stext_thaw(text);
 }
@@ -403,7 +384,6 @@ static void textview_add_part(TextView *textview, MimeInfo *mimeinfo)
 {
        GtkSText *text = GTK_STEXT(textview->text);
        gchar buf[BUFFSIZE];
-       const gchar *charset = NULL;
        GPtrArray *headers = NULL;
        const gchar *name;
        gchar *content_type;
@@ -451,40 +431,13 @@ static void textview_add_part(TextView *textview, MimeInfo *mimeinfo)
        } else if (mimeinfo->disposition != DISPOSITIONTYPE_ATTACHMENT) {
                if (prefs_common.display_header && (gtk_stext_get_length(text) > 0))
                        gtk_stext_insert(text, NULL, NULL, NULL, "\n", 1);
-               if (textview->messageview->forced_charset)
-                       charset = textview->messageview->forced_charset;
-               else if (prefs_common.force_charset)
-                       charset = prefs_common.force_charset;
-               else
-                       charset = procmime_mimeinfo_get_parameter(mimeinfo, "charset");
 
-               textview_write_body(textview, mimeinfo, charset);
+               textview_write_body(textview, mimeinfo);
        }
 
        gtk_stext_thaw(text);
 }
 
-#if 0
-static gboolean add_parts_func(GNode *node, gpointer data)
-{
-       MimeInfo *mimeinfo = (MimeInfo *) node->data;
-       TextView *textview = (TextView *) data;
-
-       g_return_val_if_fail(mimeinfo != NULL, FALSE);
-
-       textview_add_part(textview, mimeinfo);
-
-       return FALSE;
-}
-
-static void textview_add_parts(TextView *textview, MimeInfo *mimeinfo)
-{
-       g_return_if_fail(mimeinfo != NULL);
-
-       g_node_traverse(mimeinfo->node, G_PRE_ORDER, G_TRAVERSE_ALL, -1, add_parts_func, textview);
-}
-#endif
-
 static void recursive_add_parts(TextView *textview, GNode *node)
 {
         GNode * iter;
@@ -597,21 +550,25 @@ void textview_show_mime_part(TextView *textview, MimeInfo *partinfo)
 
 #undef TEXT_INSERT
 
-static void textview_write_body(TextView *textview, MimeInfo *mimeinfo,
-                               const gchar *charset)
+static void textview_write_body(TextView *textview, MimeInfo *mimeinfo)
 {
        FILE *tmpfp;
        gchar buf[BUFFSIZE];
        CodeConverter *conv;
+       const gchar *charset;
+       
+       if (textview->messageview->forced_charset)
+               charset = textview->messageview->forced_charset;
+       else
+               charset = procmime_mimeinfo_get_parameter(mimeinfo, "charset");
+
+       textview_set_font(textview, charset);
 
        conv = conv_code_converter_new(charset);
 
        textview->is_in_signature = FALSE;
 
-       if(mimeinfo->encoding_type != ENC_BINARY && 
-          mimeinfo->encoding_type != ENC_7BIT && 
-          mimeinfo->encoding_type != ENC_8BIT)
-               procmime_decode_content(mimeinfo);
+       procmime_decode_content(mimeinfo);
 
        if (!g_strcasecmp(mimeinfo->subtype, "html")) {
                gchar *filename;