2009-12-05 [pawel] 3.7.3cvs33
[claws.git] / src / messageview.c
index f0c6855c7acd9634481ef8b00721391a36f27aeb..4dead34e1cd690347ad7bb7dce17918372c4f27c 100644 (file)
@@ -730,8 +730,8 @@ static void notification_convert_header(gchar *dest, gint len,
 {
        char *src;
 
-       g_return_if_fail(src_ != NULL);
-       g_return_if_fail(dest != NULL);
+       cm_return_if_fail(src_ != NULL);
+       cm_return_if_fail(dest != NULL);
 
        if (len < 1) return;
 
@@ -964,7 +964,11 @@ static gint disposition_notification_send(MsgInfo *msginfo)
        }
        
        if (account->gen_msgid) {
-               generate_msgid(buf, sizeof(buf));
+               gchar *addr = NULL;
+               if (account->msgid_with_addr) {
+                       addr = account->address;
+               }
+               generate_msgid(buf, sizeof(buf), addr);
 
                if (fprintf(fp, "Message-ID: <%s>\n", buf) < 0) {
                        fclose(fp);
@@ -1107,14 +1111,37 @@ static MimeInfo *find_encrypted_part(MimeInfo *rootinfo)
        return encinfo;
 }
 
+static gboolean find_broken_func(GNode *node, gpointer data)
+{
+       MimeInfo *mimeinfo = (MimeInfo *) node->data;
+       MimeInfo **brokeninfo = (MimeInfo **) data;
+       
+       if (mimeinfo->broken) {
+               *brokeninfo = mimeinfo;
+               return TRUE;
+       }
+       
+       return FALSE;
+}
+
+static MimeInfo *find_broken_part(MimeInfo *rootinfo)
+{
+       MimeInfo *brokeninfo = NULL;
+
+       g_node_traverse(rootinfo->node, G_IN_ORDER, G_TRAVERSE_ALL, -1,
+               find_broken_func, &brokeninfo);
+       
+       return brokeninfo;
+}
+
 gint messageview_show(MessageView *messageview, MsgInfo *msginfo,
                      gboolean all_headers)
 {
        gchar *text = NULL;
        gchar *file;
-       MimeInfo *mimeinfo, *encinfo;
+       MimeInfo *mimeinfo, *encinfo, *brokeninfo;
        gchar *subject = NULL;
-       g_return_val_if_fail(msginfo != NULL, -1);
+       cm_return_val_if_fail(msginfo != NULL, -1);
 
        if (msginfo != messageview->msginfo)
                messageview->show_full_text = FALSE;
@@ -1271,6 +1298,26 @@ gint messageview_show(MessageView *messageview, MsgInfo *msginfo,
                return_receipt_show(messageview->noticeview, 
                                    messageview->msginfo);
 
+       if ((brokeninfo = find_broken_part(mimeinfo)) != NULL) {
+               noticeview_set_icon(messageview->noticeview,
+                                   STOCK_PIXMAP_NOTICE_WARN);
+               if (!noticeview_is_visible(messageview->noticeview)) {
+                       noticeview_set_text(messageview->noticeview, _("Message doesn't conform to MIME standard. "
+                                               "It may render wrongly."));
+                       gtk_widget_hide(messageview->noticeview->button);
+                       gtk_widget_hide(messageview->noticeview->button2);
+               } else {
+                       gchar *full = g_strconcat(
+                                       gtk_label_get_text(GTK_LABEL(messageview->noticeview->text)), 
+                                       "\n", 
+                                       _("Message doesn't conform to MIME standard. "
+                                       "It may render wrongly."), NULL);
+                       noticeview_set_text(messageview->noticeview, full);
+                       g_free(full);
+               }
+               noticeview_show(messageview->noticeview);
+       }
+                       
        mimeinfo = procmime_mimeinfo_next(mimeinfo);
        if (!all_headers && mimeinfo 
                        && (mimeinfo->type != MIMETYPE_TEXT || 
@@ -1363,6 +1410,9 @@ gint messageview_show(MessageView *messageview, MsgInfo *msginfo,
                }
        }
 done:
+       /* plugins may hook in here to work with the message view */
+       hooks_invoke(MESSAGE_VIEW_SHOW_DONE_HOOKLIST, messageview);
+
        g_free(file);
 
        return 0;
@@ -1461,7 +1511,7 @@ void messageview_delete(MessageView *msgview)
        } else {                
                msginfo = msgview->msginfo;
 
-               g_return_if_fail(msginfo != NULL);
+               cm_return_if_fail(msginfo != NULL);
 
                /* to get the trash folder, we have to choose either
                 * the folder's or account's trash default - we prefer
@@ -1476,7 +1526,7 @@ void messageview_delete(MessageView *msgview)
                                trash = folder_get_default_trash();
                }       
 
-               g_return_if_fail(trash != NULL);
+               cm_return_if_fail(trash != NULL);
 
                if (prefs_common.immediate_exec)
                        /* TODO: Delete from trash */
@@ -1503,7 +1553,7 @@ static void messageview_update(MessageView *msgview, MsgInfo *old_msginfo)
 {
        SummaryView *summaryview = (SummaryView*)msgview->mainwin->summaryview;
 
-       g_return_if_fail(summaryview != NULL);
+       cm_return_if_fail(summaryview != NULL);
        
        if (summaryview->selected) {
                MsgInfo *msginfo = summary_get_selected_msg(summaryview);
@@ -1666,7 +1716,7 @@ static gint messageview_delete_cb(GtkWidget *widget, GdkEventAny *event,
 static void messageview_size_allocate_cb(GtkWidget *widget,
                                         GtkAllocation *allocation)
 {
-       g_return_if_fail(allocation != NULL);
+       cm_return_if_fail(allocation != NULL);
 
        prefs_common.msgwin_width  = allocation->width;
        prefs_common.msgwin_height = allocation->height;
@@ -1680,7 +1730,7 @@ static gboolean key_pressed(GtkWidget *widget, GdkEventKey *event,
                return TRUE;
        }
 
-       if ((event->state & (GDK_MOD1_MASK|GDK_CONTROL_MASK|GDK_SHIFT_MASK)) != 0)
+       if (event && (event->state & (GDK_MOD1_MASK|GDK_CONTROL_MASK|GDK_SHIFT_MASK)) != 0)
                return FALSE;
 
        g_signal_stop_emission_by_name(G_OBJECT(widget),
@@ -1880,8 +1930,8 @@ static PrefsAccount *select_account_from_list(GList *ac_list)
        GtkWidget *optmenu;
        gint account_id;
 
-       g_return_val_if_fail(ac_list != NULL, NULL);
-       g_return_val_if_fail(ac_list->data != NULL, NULL);
+       cm_return_val_if_fail(ac_list != NULL, NULL);
+       cm_return_val_if_fail(ac_list->data != NULL, NULL);
        
        optmenu = gtkut_account_menu_new(ac_list,
                        G_CALLBACK(select_account_cb),
@@ -1917,7 +1967,7 @@ gchar *messageview_get_selection(MessageView *msgview)
        GtkTextBuffer *textbuf;
        gint body_pos = 0;
        
-       g_return_val_if_fail(msgview != NULL, NULL);
+       cm_return_val_if_fail(msgview != NULL, NULL);
 
        if (msgview->mimeview->type == MIMEVIEW_VIEWER) {
                MimeViewer *viewer = msgview->mimeview->mimeviewer;
@@ -1929,10 +1979,10 @@ gchar *messageview_get_selection(MessageView *msgview)
        }
 
        textview = messageview_get_current_textview(msgview);
-       g_return_val_if_fail(textview != NULL, NULL);
+       cm_return_val_if_fail(textview != NULL, NULL);
 
        edit = GTK_TEXT_VIEW(textview->text);
-       g_return_val_if_fail(edit != NULL, NULL);
+       cm_return_val_if_fail(edit != NULL, NULL);
        body_pos = textview->body_pos;
 
        textbuf = gtk_text_view_get_buffer(edit);
@@ -2585,7 +2635,7 @@ static void reply_cb(GtkAction *gaction, gpointer data)
        gint action = COMPOSE_REPLY;
        const gchar *a_name = gtk_action_get_name(gaction);
        
-       g_return_if_fail(messageview->msginfo);
+       cm_return_if_fail(messageview->msginfo);
 
        DO_ACTION("Message/Reply", COMPOSE_REPLY);
        DO_ACTION("Message/ReplyTo/All", COMPOSE_REPLY_TO_ALL);
@@ -2752,7 +2802,12 @@ void messageview_list_urls (MessageView  *msgview)
 {
        GSList *cur = msgview->mimeview->textview->uri_list;
        GSList *newlist = NULL;
-       GHashTable *uri_hashtable = g_hash_table_new(g_str_hash, g_str_equal); 
+       GHashTable *uri_hashtable;
+       gchar *tmp;
+       
+       uri_hashtable = g_hash_table_new_full(g_str_hash, g_str_equal,
+                                        (GDestroyNotify) g_free, NULL);
+       
        for (; cur; cur = cur->next) {
                ClickableText *uri = (ClickableText *)cur->data;
                if (uri->uri &&
@@ -2762,12 +2817,16 @@ void messageview_list_urls (MessageView *msgview)
                     !g_ascii_strncasecmp(uri->uri, "http:", 5) ||
                     !g_ascii_strncasecmp(uri->uri, "https:", 6)))
                {
-                       if(g_hash_table_lookup(uri_hashtable, uri->uri))
+                       tmp = g_utf8_strdown(uri->uri, -1);
+                       
+                       if (g_hash_table_lookup(uri_hashtable, tmp)) {
+                               g_free(tmp);
                                continue;
+                       }
                        
                        newlist = g_slist_prepend(newlist, uri);
-                       g_hash_table_insert(uri_hashtable, uri->uri,
-                                           GUINT_TO_POINTER(g_str_hash(uri->uri)));
+                       g_hash_table_insert(uri_hashtable, tmp,
+                                           GUINT_TO_POINTER(g_str_hash(tmp)));
                }
        }
        newlist = g_slist_reverse(newlist);