2011-08-09 [paul] 3.7.9cvs43
[claws.git] / src / mimeview.c
index c7d6116de874826ed61e9fd540aad2059b490a72..21ef99687a99a428fdbbbf9f6657eacf9db77a2d 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
- * Copyright (C) 1999-2009 Hiroyuki Yamamoto and the Claws Mail team
+ * Copyright (C) 1999-2011 Hiroyuki Yamamoto and the Claws Mail team
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -530,7 +530,6 @@ void mimeview_destroy(MimeView *mimeview)
        g_slist_free(mimeview->viewers);
        gtk_target_list_unref(mimeview->target_list);
 
-       mimeview_free_mimeinfo(mimeview);
 #ifdef USE_PTHREAD
        if (mimeview->check_data) {
                mimeview->check_data->destroy_mimeview = TRUE;
@@ -538,6 +537,7 @@ void mimeview_destroy(MimeView *mimeview)
        } else 
 #endif
        {
+               mimeview_free_mimeinfo(mimeview);
                g_free(mimeview->file);
                g_free(mimeview);
                mimeviews = g_slist_remove(mimeviews, mimeview);
@@ -938,22 +938,36 @@ static void update_signature_noticeview(MimeView *mimeview, MimeInfo *mimeinfo,
 /* reset all thread stuff, and do the cleanups we've been left to do */
 static void mimeview_check_data_reset(MimeView *mimeview)
 {
+       gboolean must_free;
+       gboolean must_destroy;
+
        if (!mimeview->check_data)
                return;
 
-       if (mimeview->check_data->free_after_use) {
+       must_free = mimeview->check_data->free_after_use;
+       must_destroy = mimeview->check_data->destroy_mimeview;
+       
+       if (mimeview->check_data->cancel_th_init) {
+               debug_print("killing canceller thread\n");
+               mimeview->check_data->cancel_th_init = FALSE;
+               pthread_cancel(mimeview->check_data->cancel_th);
+       }
+
+       g_free(mimeview->check_data);
+       mimeview->check_data = NULL;
+
+       if (must_free) {
                debug_print("freeing deferred mimeinfo\n");
                procmime_mimeinfo_free_all(mimeview->check_data->siginfo);
        }
-       if (mimeview->check_data->destroy_mimeview) {
+       if (must_destroy) {
                debug_print("freeing deferred mimeview\n");
+               mimeview_free_mimeinfo(mimeview);
                g_free(mimeview->file);
                g_free(mimeview);
                mimeviews = g_slist_remove(mimeviews, mimeview);
        }
 
-       g_free(mimeview->check_data);
-       mimeview->check_data = NULL;
 }
 
 /* GUI update once the checker thread is done or killed */
@@ -1013,9 +1027,13 @@ static void *mimeview_check_sig_worker_thread(void *data)
        if (!mimeview->check_data)
                return NULL;
 
-       if (mimeinfo && mimeinfo == mimeview->check_data->siginfo)
+       if (mimeinfo && mimeinfo == mimeview->check_data->siginfo) {
                privacy_mimeinfo_check_signature(mimeinfo);
-       else {
+               if (mimeview->check_data && mimeview->check_data->cancel_th_init) {
+                       mimeview->check_data->cancel_th_init = FALSE;
+                       pthread_cancel(mimeview->check_data->cancel_th);
+               }
+       } else {
                /* that's strange! we changed message without 
                 * getting killed. */
                g_warning("different siginfo!\n");
@@ -1042,15 +1060,18 @@ static void *mimeview_check_sig_cancel_thread(void *data)
        /* wait for a few seconds... */
        debug_print("waiting a while\n");
 
-       sleep(5);
+       g_usleep(5 * 1000 * 1000);
        
        if (!mimeview->check_data)
                return NULL; /* nothing to kill, it's done in time :) */
        
        /* too late, go away checker thread */
        debug_print("killing checker thread\n");
-       pthread_cancel(mimeview->check_data->th);
-       
+       if (mimeview->check_data->th_init) {
+               mimeview->check_data->th_init = FALSE;
+               pthread_cancel(mimeview->check_data->th);
+       }
+
        /* tell upstream it was a timeout */
        mimeview->check_data->timeout = TRUE;
        /* use g_timeout so that GUI updates is done from the
@@ -1067,7 +1088,10 @@ static void mimeview_check_sig_cancel_now(MimeView *mimeview)
        if (!mimeview->check_data)
                return;
        debug_print("killing checker thread NOW\n");
-       pthread_cancel(mimeview->check_data->th);
+       if (mimeview->check_data->th_init) {
+               mimeview->check_data->th_init = FALSE;
+               pthread_cancel(mimeview->check_data->th);
+       }
 
        /* tell upstream it was a timeout */
        mimeview->check_data->timeout = TRUE;
@@ -1104,13 +1128,18 @@ static void mimeview_check_sig_in_thread(MimeView *mimeview)
                g_free(mimeview->check_data);
                mimeview->check_data = NULL;
                return;
-       } else 
+       } else {
                mimeview->check_data->th = th;
+               mimeview->check_data->th_init = TRUE;
+       }
 
        /* create the killer thread */
        pthread_create(&th2, &detach2, 
                        mimeview_check_sig_cancel_thread, 
                        mimeview);
+
+       mimeview->check_data->cancel_th = th2;
+       mimeview->check_data->cancel_th_init = TRUE;
 }
 #endif
 
@@ -1362,7 +1391,8 @@ skip:
 
        if (node) {
                partinfo = gtk_cmctree_node_get_row_data(ctree, node);
-               if (partinfo->type == MIMETYPE_MULTIPART)
+               if (partinfo->type == MIMETYPE_MULTIPART ||
+                   (!prefs_common.show_inline_attachments && partinfo->id))
                        goto skip;
                gtk_sctree_unselect_all(GTK_SCTREE(ctree));
                gtk_sctree_select(GTK_SCTREE(ctree), node);
@@ -2226,6 +2256,9 @@ static void icon_list_append_icon (MimeView *mimeview, MimeInfo *mimeinfo)
        GtkTooltips *tips = mimeview->tooltips;
 #endif
        
+       if (!prefs_common.show_inline_attachments && mimeinfo->id)
+               return;
+
        vbox = mimeview->icon_vbox;
        mimeview->icon_count++;
        button = gtk_event_box_new();
@@ -2371,7 +2404,7 @@ static void icon_list_append_icon (MimeView *mimeview, MimeInfo *mimeinfo)
                g_free(tmp);
        }
        if (sigshort && *sigshort) {
-               tiptmp = g_strjoin("\n", tip, sigshort, NULL);
+               tiptmp = g_markup_escape_text(sigshort, -1);
                g_free(tip);
                tip = tiptmp;
        }