/*
* 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
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;
} else
#endif
{
+ mimeview_free_mimeinfo(mimeview);
g_free(mimeview->file);
g_free(mimeview);
mimeviews = g_slist_remove(mimeviews, mimeview);
/* 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 */
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");
/* 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
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;
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
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);
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();
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;
}