better support for mime/digest
authorAlfons Hoogervorst <alfons@proteus.demon.nl>
Sat, 22 Dec 2001 16:09:08 +0000 (16:09 +0000)
committerAlfons Hoogervorst <alfons@proteus.demon.nl>
Sat, 22 Dec 2001 16:09:08 +0000 (16:09 +0000)
ChangeLog.claws
configure.in
src/compose.c
src/messageview.c
src/mimeview.c
src/pgptext.c
src/procmime.c
src/procmime.h

index dd877101572b7f185730afbae1924184904a2d9a..c12a7a2ac43a0fcc70a0ef5e4bfc977771b8c098 100644 (file)
@@ -1,3 +1,13 @@
+2001-12-22 [alfons]    0.6.6claws9
+
+       * src/compose.c
+       * src/messageview.c
+       * src/mimeview.c
+       * src/pgptext.c
+       * src/procmime.[ch]
+               better support for multipart/digest (submitted
+               by Fredrik <e98fo@efd.lth.se>)
+
 2001-12-22 [alfons]    0.6.6claws8
 
        * src/addressbook.c
index c6f45e2f7943fe3f271dfcb6448989b2cf83b6fd..f4fb881c3068d814a4c884367362f1ba0d279e7b 100644 (file)
@@ -8,7 +8,7 @@ MINOR_VERSION=6
 MICRO_VERSION=6
 INTERFACE_AGE=0
 BINARY_AGE=0
-EXTRA_VERSION=claws8
+EXTRA_VERSION=claws9
 VERSION=$MAJOR_VERSION.$MINOR_VERSION.$MICRO_VERSION$EXTRA_VERSION
 
 dnl
index aad24df71b6171c73b74d1c2d185d2dd3132ee49..9e68c1f3960f7e5e796d39ec92f9d2232f2205d2 100644 (file)
@@ -860,7 +860,7 @@ static void compose_attach_parts(Compose *compose, MsgInfo *msginfo)
 #if USE_GPGME
        for (;;) {
                if ((fp = procmsg_open_message(msginfo)) == NULL) return;
-               mimeinfo = procmime_scan_mime_header(fp);
+               mimeinfo = procmime_scan_mime_header(fp, MIME_TEXT);
                if (!mimeinfo) break;
 
                if (!MSG_IS_ENCRYPTED(msginfo->flags) &&
@@ -882,7 +882,7 @@ static void compose_attach_parts(Compose *compose, MsgInfo *msginfo)
        }
 #else /* !USE_GPGME */
        if ((fp = procmsg_open_message(msginfo)) == NULL) return;
-       mimeinfo = procmime_scan_mime_header(fp);
+       mimeinfo = procmime_scan_mime_header(fp, MIME_TEXT);
 #endif /* USE_GPGME */
 
        fclose(fp);
@@ -927,7 +927,7 @@ static void compose_attach_parts(Compose *compose, MsgInfo *msginfo)
 
                prev_fpos = fpos;
 
-               partinfo = procmime_scan_mime_header(fp);
+               partinfo = procmime_scan_mime_header(fp, MIME_TEXT);
                if (!partinfo) break;
 
                if (npart != 0)
index a78d8fe6280ad4d2bea3e15dd0f2a8b8b19aa2a3..3abff4a46b7b6398e3d47c0a7618c045c25d0e17 100644 (file)
@@ -373,7 +373,7 @@ void messageview_show(MessageView *messageview, MsgInfo *msginfo)
 #if USE_GPGME
        for (;;) {
                if ((fp = procmsg_open_message(msginfo)) == NULL) return;
-               mimeinfo = procmime_scan_mime_header(fp);
+               mimeinfo = procmime_scan_mime_header(fp, MIME_TEXT);
                if (!mimeinfo) break;
 
                if (!MSG_IS_ENCRYPTED(msginfo->flags) &&
@@ -418,7 +418,7 @@ void messageview_show(MessageView *messageview, MsgInfo *msginfo)
        }
 #else /* !USE_GPGME */
        if ((fp = procmsg_open_message(msginfo)) == NULL) return;
-       mimeinfo = procmime_scan_mime_header(fp);
+       mimeinfo = procmime_scan_mime_header(fp, MIME_TEXT);
 #endif /* USE_GPGME */
        fclose(fp);
        if (!mimeinfo) return;
index 9ac05f697f8a5690e99a0390f0c56b2fd85d0ac0..61655527b064613b8588f63a6e6d30d3ab0d7601 100644 (file)
@@ -329,23 +329,21 @@ static void mimeview_set_multipart_tree(MimeView *mimeview,
                                        MimeInfo *mimeinfo,
                                        GtkCTreeNode *parent)
 {
+       GtkCTreeNode *current = parent;
+
        g_return_if_fail(mimeinfo != NULL);
 
-       if (!mimeinfo->main && mimeinfo->parent)
-               parent = mimeview_append_part(mimeview, mimeinfo, parent);
+       if (!mimeinfo->sub && mimeinfo->parent)
+               current = mimeview_append_part(mimeview, mimeinfo, parent);
 
-       if (mimeinfo->sub && mimeinfo->sub->children)
-               mimeview_set_multipart_tree(mimeview, mimeinfo->sub, parent);
+       if (mimeinfo->sub)
+               mimeview_set_multipart_tree(mimeview, mimeinfo->sub, current);
 
-       if (mimeinfo->children) {
-               MimeInfo *child;
+       if (mimeinfo->children)
+               mimeview_set_multipart_tree(mimeview, mimeinfo->children, current);
 
-               child = mimeinfo->children;
-               while (child) {
-                       mimeview_set_multipart_tree(mimeview, child, parent);
-                       child = child->next;
-               }
-       }
+       if (mimeinfo->next)
+               mimeview_set_multipart_tree(mimeview, mimeinfo->next, parent);
 }
 
 static gchar *get_part_name(MimeInfo *partinfo)
index 16908b457db9e81bb8d27bfe983db4071f4dccb5..1c08af771f9c4f00861129bd1303cf094f1d1c0e 100644 (file)
@@ -223,7 +223,7 @@ int pgptext_is_encrypted (MimeInfo *mimeinfo, MsgInfo *msginfo)
                return 0;
        
        if ((fp = procmsg_open_message(msginfo)) == NULL) return;
-       mimeinfo = procmime_scan_mime_header(fp);
+       mimeinfo = procmime_scan_mime_header(fp, MIME_TEXT);
        fclose(fp);
        if (!mimeinfo) return;
 
index 7f6126f8918c654d16bdcd231341d267298a14a2..a0a7e33ae58133a31c7e1bf619cb6b85841e31db 100644 (file)
@@ -188,7 +188,7 @@ MimeInfo *procmime_scan_message(MsgInfo *msginfo)
        g_return_val_if_fail(msginfo != NULL, NULL);
 
        if ((fp = procmsg_open_message(msginfo)) == NULL) return NULL;
-       mimeinfo = procmime_scan_mime_header(fp);
+       mimeinfo = procmime_scan_mime_header(fp, MIME_TEXT);
 
        if (mimeinfo) {
                if (mimeinfo->mime_type != MIME_MULTIPART) {
@@ -216,6 +216,7 @@ void procmime_scan_multipart_message(MimeInfo *mimeinfo, FILE *fp)
        gchar buf[BUFFSIZE];
        glong fpos, prev_fpos;
        gint npart;
+       ContentType default_type;
 
        g_return_if_fail(mimeinfo != NULL);
        g_return_if_fail(mimeinfo->mime_type != MIME_TEXT);
@@ -242,13 +243,19 @@ void procmime_scan_multipart_message(MimeInfo *mimeinfo, FILE *fp)
                return;
        }
 
+       /* Sets default subpart type for multipart/digest */
+       if (!strncasecmp(mimeinfo->content_type, "multipart/digest", 16))
+               default_type = MIME_MESSAGE_RFC822;
+       else
+               default_type = MIME_TEXT;
+
        for (npart = 0;; npart++) {
                MimeInfo *partinfo;
                gboolean eom = FALSE;
 
                prev_fpos = fpos;
 
-               partinfo = procmime_scan_mime_header(fp);
+               partinfo = procmime_scan_mime_header(fp, default_type);
                if (!partinfo) break;
                procmime_mimeinfo_insert(mimeinfo, partinfo);
 
@@ -258,10 +265,11 @@ void procmime_scan_multipart_message(MimeInfo *mimeinfo, FILE *fp)
                } else if (partinfo->mime_type == MIME_MESSAGE_RFC822) {
                        MimeInfo *sub;
 
-                       partinfo->sub = sub = procmime_scan_mime_header(fp);
+                       partinfo->sub = sub = procmime_scan_mime_header
+                                             (fp, MIME_TEXT);
                        if (!sub) break;
                        sub->level = partinfo->level + 1;
-                       sub->parent = partinfo->parent;
+                       sub->parent = partinfo;
                        sub->main = partinfo;
 
                        if (sub->mime_type == MIME_MULTIPART) {
@@ -331,10 +339,10 @@ void procmime_scan_content_type(MimeInfo *mimeinfo, const gchar *content_type)
 
        g_free(mimeinfo->content_type);
        g_free(mimeinfo->charset);
-       g_free(mimeinfo->name);
+       /* g_free(mimeinfo->name); */
        mimeinfo->content_type = NULL;
        mimeinfo->charset      = NULL;
-       mimeinfo->name         = NULL;
+       /* mimeinfo->name      = NULL; */
 
        if ((delim = strchr(buf, ';'))) *delim = '\0';
        mimeinfo->content_type = cnttype = g_strdup(g_strstrip(buf));
@@ -375,6 +383,7 @@ void procmime_scan_content_type(MimeInfo *mimeinfo, const gchar *content_type)
                                len = strlen(value) + 1;
                                Xalloca(tmp, len, return);
                                conv_unmime_header(tmp, len, value, NULL);
+                               g_free(mimeinfo->name);
                                mimeinfo->name = g_strdup(tmp);
                        } else if (!strcasecmp(attr, "boundary"))
                                mimeinfo->boundary = g_strdup(value);
@@ -449,20 +458,76 @@ void procmime_scan_content_disposition(MimeInfo *mimeinfo,
        }
 }
 
+void procmime_scan_content_description(MimeInfo *mimeinfo,
+                                      const gchar *content_description)
+{
+       gchar *delim, *p, *dispos;
+       gchar *buf;
+
+       gchar *tmp;
+       size_t blen;
+
+       if (conv_get_current_charset() == C_EUC_JP &&
+           strchr(content_description, '\033')) {
+               gint len;
+               len = strlen(content_description) * 2 + 1;
+               Xalloca(buf, len, return);
+               conv_jistoeuc(buf, len, content_description);
+       } else
+               Xstrdup_a(buf, content_description, return);
+       
+       blen = strlen(buf) + 1;
+       Xalloca(tmp, blen, return);
+       conv_unmime_header(tmp, blen, buf, NULL);
+       g_free(mimeinfo->name);
+       mimeinfo->name = g_strdup(tmp);
+}
+
+void procmime_scan_subject(MimeInfo *mimeinfo,
+                          const gchar *subject)
+{
+       gchar *delim, *p, *dispos;
+       gchar *buf;
+
+       gchar *tmp;
+       size_t blen;
+
+       if (conv_get_current_charset() == C_EUC_JP &&
+           strchr(subject, '\033')) {
+               gint len;
+               len = strlen(subject) * 2 + 1;
+               Xalloca(buf, len, return);
+               conv_jistoeuc(buf, len, subject);
+       } else
+               Xstrdup_a(buf, subject, return);
+       
+       blen = strlen(buf) + 1;
+       Xalloca(tmp, blen, return);
+       conv_unmime_header(tmp, blen, buf, NULL);
+       g_free(mimeinfo->name);
+       mimeinfo->name = g_strdup(tmp);
+}
+
 enum
 {
        H_CONTENT_TRANSFER_ENCODING = 0,
        H_CONTENT_TYPE              = 1,
-       H_CONTENT_DISPOSITION       = 2
+       H_CONTENT_DISPOSITION       = 2,
+       H_CONTENT_DESCRIPTION       = 3,
+       H_SUBJECT                   = 4
 };
 
-MimeInfo *procmime_scan_mime_header(FILE *fp)
+MimeInfo *procmime_scan_mime_header(FILE *fp, ContentType default_type)
 {
        static HeaderEntry hentry[] = {{"Content-Transfer-Encoding:",
                                                          NULL, FALSE},
                                       {"Content-Type:", NULL, TRUE},
                                       {"Content-Disposition:",
                                                          NULL, TRUE},
+                                      {"Content-description:",
+                                                         NULL, TRUE},
+                                      {"Subject:",
+                                                         NULL, TRUE},
                                       {NULL,             NULL, FALSE}};
        gchar buf[BUFFSIZE];
        gint hnum;
@@ -472,7 +537,8 @@ MimeInfo *procmime_scan_mime_header(FILE *fp)
        g_return_val_if_fail(fp != NULL, NULL);
 
        mimeinfo = procmime_mimeinfo_new();
-       mimeinfo->mime_type = MIME_TEXT;
+       /* Needed for multipart/digest */
+       mimeinfo->mime_type = default_type;
        mimeinfo->encoding_type = ENC_7BIT;
        mimeinfo->fpos = ftell(fp);
 
@@ -489,6 +555,12 @@ MimeInfo *procmime_scan_mime_header(FILE *fp)
                } else if (H_CONTENT_DISPOSITION == hnum) {
                        procmime_scan_content_disposition
                                (mimeinfo, buf + strlen(hp->name));
+               } else if (H_CONTENT_DESCRIPTION == hnum) {
+                       procmime_scan_content_description
+                               (mimeinfo, buf + strlen(hp->name));
+               } else if (H_SUBJECT == hnum) {
+                       procmime_scan_subject
+                               (mimeinfo, buf + strlen(hp->name));
                }
        }
 
@@ -500,8 +572,13 @@ MimeInfo *procmime_scan_mime_header(FILE *fp)
                        mimeinfo->mime_type = procmime_scan_mime_type(type);
        }
 
-       if (!mimeinfo->content_type)
-               mimeinfo->content_type = g_strdup("text/plain");
+       if (!mimeinfo->content_type) {
+               if (mimeinfo->mime_type == MIME_MESSAGE_RFC822) {
+                       mimeinfo->content_type = g_strdup("message/rfc822");
+               } else {
+                       mimeinfo->content_type = g_strdup("text/plain");
+               }
+       }
 
        return mimeinfo;
 }
index d4b661986d9c1d84fc00f59aaf73621f49cc57e8..a21858ef72e20afb6a6247683868254a66bf2c24 100644 (file)
@@ -145,7 +145,12 @@ void procmime_scan_content_type            (MimeInfo       *mimeinfo,
                                         const gchar    *content_type);
 void procmime_scan_content_disposition (MimeInfo       *mimeinfo,
                                         const gchar    *content_disposition);
-MimeInfo *procmime_scan_mime_header    (FILE           *fp);
+void procmime_scan_content_description (MimeInfo       *mimeinfo,
+                                        const gchar    *content_description);
+void procmime_scan_subject              (MimeInfo       *mimeinfo,
+                                        const gchar    *subject);
+MimeInfo *procmime_scan_mime_header    (FILE           *fp,
+                                        ContentType    default_type);
 
 FILE *procmime_decode_content          (FILE           *outfp,
                                         FILE           *infp,