0.9.6claws76
[claws.git] / src / procmime.c
index bcc227492ff3d81ff4886b478640f6a1f5dcf4da..41630a6bc3eeba15c4228d91c4bcccc36202cecd 100644 (file)
@@ -59,7 +59,7 @@ MimeInfo *procmime_mimeinfo_new(void)
 
        mimeinfo->parameters = g_hash_table_new(g_str_hash, g_str_equal);
        mimeinfo->node       = g_node_new(mimeinfo);
-
+       
        return mimeinfo;
 }
 
@@ -167,15 +167,19 @@ MimeInfo *procmime_mimeinfo_parent(MimeInfo *mimeinfo)
 
 MimeInfo *procmime_mimeinfo_next(MimeInfo *mimeinfo)
 {
-       if (!mimeinfo) return NULL;
+       g_return_val_if_fail(mimeinfo != NULL, NULL);
+       g_return_val_if_fail(mimeinfo->node != NULL, NULL);
 
        if (mimeinfo->node->children)
                return (MimeInfo *) mimeinfo->node->children->data;
        if (mimeinfo->node->next)
                return (MimeInfo *) mimeinfo->node->next->data;
 
-       for (mimeinfo = (MimeInfo *) mimeinfo->node->parent->data; mimeinfo != NULL;
-            mimeinfo = (MimeInfo *) mimeinfo->node->parent->data) {
+       if (mimeinfo->node->parent == NULL)
+               return NULL;
+
+       while (mimeinfo->node->parent != NULL) {
+               mimeinfo = (MimeInfo *) mimeinfo->node->parent->data;
                if (mimeinfo->node->next)
                        return (MimeInfo *) mimeinfo->node->next->data;
        }
@@ -191,7 +195,8 @@ MimeInfo *procmime_scan_message(MsgInfo *msginfo)
        filename = procmsg_get_message_file(msginfo);
        if(!filename)
                return NULL;
-       if (msginfo->folder->stype != F_QUEUE)
+       if (msginfo->folder->stype != F_QUEUE && 
+           msginfo->folder->stype != F_DRAFT)
                mimeinfo = procmime_scan_file(filename);
        else
                mimeinfo = procmime_scan_queue_file(filename);
@@ -597,26 +602,15 @@ FILE *procmime_get_first_text_content(MsgInfo *msginfo)
 gboolean procmime_find_string_part(MimeInfo *mimeinfo, const gchar *filename,
                                   const gchar *str, gboolean case_sens)
 {
-       return FALSE;
-
-#if 0  /* FIXME */
        FILE *infp, *outfp;
        gchar buf[BUFFSIZE];
        gchar *(* StrFindFunc) (const gchar *haystack, const gchar *needle);
 
        g_return_val_if_fail(mimeinfo != NULL, FALSE);
-       g_return_val_if_fail(mimeinfo->mime_type == MIME_TEXT ||
-                            mimeinfo->mime_type == MIME_TEXT_HTML ||
-                            mimeinfo->mime_type == MIME_TEXT_ENRICHED, FALSE);
+       g_return_val_if_fail(mimeinfo->type == MIMETYPE_TEXT, FALSE);
        g_return_val_if_fail(str != NULL, FALSE);
 
-       if ((infp = fopen(filename, "rb")) == NULL) {
-               FILE_OP_ERROR(filename, "fopen");
-               return FALSE;
-       }
-
-       outfp = procmime_get_text_content(mimeinfo, infp);
-       fclose(infp);
+       outfp = procmime_get_text_content(mimeinfo);
 
        if (!outfp)
                return FALSE;
@@ -636,15 +630,11 @@ gboolean procmime_find_string_part(MimeInfo *mimeinfo, const gchar *filename,
        fclose(outfp);
 
        return FALSE;
-#endif
 }
 
 gboolean procmime_find_string(MsgInfo *msginfo, const gchar *str,
                              gboolean case_sens)
 {
-       return FALSE;
-
-#if 0  /* FIXME */
        MimeInfo *mimeinfo;
        MimeInfo *partinfo;
        gchar *filename;
@@ -659,9 +649,7 @@ gboolean procmime_find_string(MsgInfo *msginfo, const gchar *str,
 
        for (partinfo = mimeinfo; partinfo != NULL;
             partinfo = procmime_mimeinfo_next(partinfo)) {
-               if (partinfo->mime_type == MIME_TEXT ||
-                   partinfo->mime_type == MIME_TEXT_HTML ||
-                   partinfo->mime_type == MIME_TEXT_ENRICHED) {
+               if (partinfo->type == MIMETYPE_TEXT) {
                        if (procmime_find_string_part
                                (partinfo, filename, str, case_sens) == TRUE) {
                                found = TRUE;
@@ -674,7 +662,6 @@ gboolean procmime_find_string(MsgInfo *msginfo, const gchar *str,
        g_free(filename);
 
        return found;
-#endif
 }
 
 gchar *procmime_get_tmp_file_name(MimeInfo *mimeinfo)
@@ -691,8 +678,7 @@ gchar *procmime_get_tmp_file_name(MimeInfo *mimeinfo)
        if ((mimeinfo->type == MIMETYPE_TEXT) && !g_strcasecmp(mimeinfo->subtype, "html"))
                base = "mimetmp.html";
        else {
-               base = mimeinfo->filename ? mimeinfo->filename
-                       : mimeinfo->name ? mimeinfo->name : "mimetmp";
+               base = mimeinfo->name ? mimeinfo->name : "mimetmp";
                base = g_basename(base);
                if (*base == '\0') base = "mimetmp";
                Xstrdup_a(base, base, return NULL);
@@ -1012,13 +998,13 @@ void procmime_parse_multipart(MimeInfo *mimeinfo)
        FILE *fp;
 
        boundary = g_hash_table_lookup(mimeinfo->parameters, "boundary");
-       if(!boundary)
+       if (!boundary)
                return;
        boundary_len = strlen(boundary);
 
-       if(mimeinfo->encoding_type != ENC_BINARY && 
-          mimeinfo->encoding_type != ENC_7BIT && 
-          mimeinfo->encoding_type != ENC_8BIT)
+       if (mimeinfo->encoding_type != ENC_BINARY && 
+           mimeinfo->encoding_type != ENC_7BIT && 
+           mimeinfo->encoding_type != ENC_8BIT)
                procmime_decode_content(mimeinfo);
 
        fp = fopen(mimeinfo->filename, "rb");
@@ -1028,7 +1014,7 @@ void procmime_parse_multipart(MimeInfo *mimeinfo)
                        break;
 
                if (IS_BOUNDARY(buf, boundary, boundary_len)) {
-                       if(lastoffset != -1) {
+                       if (lastoffset != -1) {
                                procmime_parse_mimepart(mimeinfo,
                                                        hentry[0].body, hentry[1].body,
                                                        hentry[2].body, hentry[3].body, 
@@ -1048,6 +1034,10 @@ void procmime_parse_multipart(MimeInfo *mimeinfo)
                        lastoffset = ftell(fp);
                }
        }
+       for (i = 0; i < 4; i++) {
+               g_free(hentry[i].body);
+               hentry[i].body = NULL;
+       }
        fclose(fp);
 }