commit e03d6a381b112bcf6a77452dea3f70a33062a980
parent 5afb1c001ef1dcc080b49772c715c86f5e66f728
Author: Colin Leroy <colin@colino.net>
Date: Thu, 20 Mar 2008 17:44:55 +0000
2008-03-20 [colin] 3.3.1cvs34
* src/messageview.c
* src/messageview.h
* src/textview.c
Show at max 1MB of text, add a noticeview to
show everything optionally.
Diffstat:
6 files changed, 66 insertions(+), 6 deletions(-)
diff --git a/ChangeLog b/ChangeLog
@@ -1,3 +1,11 @@
+2008-03-20 [colin] 3.3.1cvs34
+
+ * src/messageview.c
+ * src/messageview.h
+ * src/textview.c
+ Show at max 1MB of text, add a noticeview to
+ show everything optionally.
+
2008-03-20 [colin] 3.3.1cvs33
* src/stock_pixmap.c
diff --git a/PATCHSETS b/PATCHSETS
@@ -3268,3 +3268,4 @@
( cvs diff -u -r 1.36.2.135 -r 1.36.2.136 src/common/utils.c; cvs diff -u -r 1.20.2.59 -r 1.20.2.60 src/common/utils.h; ) > 3.3.1cvs31.patchset
( cvs diff -u -r 1.47.2.46 -r 1.47.2.47 src/procheader.c; ) > 3.3.1cvs32.patchset
( cvs diff -u -r 1.25.2.52 -r 1.25.2.53 src/stock_pixmap.c; ) > 3.3.1cvs33.patchset
+( cvs diff -u -r 1.94.2.173 -r 1.94.2.174 src/messageview.c; cvs diff -u -r 1.19.2.18 -r 1.19.2.19 src/messageview.h; cvs diff -u -r 1.96.2.197 -r 1.96.2.198 src/textview.c; ) > 3.3.1cvs34.patchset
diff --git a/configure.ac b/configure.ac
@@ -11,7 +11,7 @@ MINOR_VERSION=3
MICRO_VERSION=1
INTERFACE_AGE=0
BINARY_AGE=0
-EXTRA_VERSION=33
+EXTRA_VERSION=34
EXTRA_RELEASE=
EXTRA_GTK2_VERSION=
diff --git a/src/messageview.c b/src/messageview.c
@@ -466,6 +466,8 @@ MessageView *messageview_create(MainWindow *mainwin)
messageview->statusbar = NULL;
messageview->statusbar_cid = 0;
+ messageview->show_full_text= FALSE;
+
messageview->msginfo_update_callback_id =
hooks_register_hook(MSGINFO_UPDATE_HOOKLIST, messageview_update_msg, (gpointer) messageview);
@@ -1000,6 +1002,9 @@ gint messageview_show(MessageView *messageview, MsgInfo *msginfo,
gchar *subject = NULL;
g_return_val_if_fail(msginfo != NULL, -1);
+ if (msginfo != messageview->msginfo)
+ messageview->show_full_text = FALSE;
+
if (messageview->mimeview->textview &&
messageview->mimeview->textview->loading) {
messageview->mimeview->textview->stop_loading = TRUE;
@@ -1124,14 +1129,16 @@ gint messageview_show(MessageView *messageview, MsgInfo *msginfo,
main_create_mailing_list_menu(messageview->mainwin, messageview->msginfo);
if (messageview->msginfo && messageview->msginfo->extradata
- && messageview->msginfo->extradata->partial_recv)
+ && messageview->msginfo->extradata->partial_recv
+ && !noticeview_is_visible(messageview->noticeview))
partial_recv_show(messageview->noticeview,
messageview->msginfo);
else if (messageview->msginfo && messageview->msginfo->extradata &&
(messageview->msginfo->extradata->dispositionnotificationto ||
messageview->msginfo->extradata->returnreceiptto) &&
!MSG_IS_RETRCPT_SENT(messageview->msginfo->flags) &&
- !prefs_common.never_send_retrcpt)
+ !prefs_common.never_send_retrcpt &&
+ !noticeview_is_visible(messageview->noticeview))
return_receipt_show(messageview->noticeview,
messageview->msginfo);
@@ -1489,6 +1496,30 @@ static gboolean key_pressed(GtkWidget *widget, GdkEventKey *event,
return FALSE;
}
#endif
+
+static void messageview_show_partial_display_cb(NoticeView *noticeview, MessageView *messageview)
+{
+ messageview->show_full_text = TRUE;
+ main_window_cursor_wait(mainwindow_get_mainwindow());
+ GTK_EVENTS_FLUSH();
+ messageview_show(messageview, messageview->msginfo, messageview->all_headers);
+ main_window_cursor_normal(mainwindow_get_mainwindow());
+}
+
+void messageview_show_partial_display(MessageView *messageview, MsgInfo *msginfo,
+ size_t length)
+{
+ gchar *msg = g_strdup_printf(_("Show all %s."), to_human_readable(length));
+ noticeview_set_icon(messageview->noticeview, STOCK_PIXMAP_NOTICE_WARN);
+ noticeview_set_text(messageview->noticeview, _("Only the first megabyte of text is shown."));
+ noticeview_set_button_text(messageview->noticeview, msg);
+ g_free(msg);
+ noticeview_set_button_press_callback(messageview->noticeview,
+ G_CALLBACK(messageview_show_partial_display_cb),
+ (gpointer) messageview);
+ noticeview_show(messageview->noticeview);
+}
+
static void return_receipt_show(NoticeView *noticeview, MsgInfo *msginfo)
{
gchar *addr = NULL;
diff --git a/src/messageview.h b/src/messageview.h
@@ -74,6 +74,8 @@ struct _MessageView
gint msginfo_update_callback_id;
gboolean updating;
gboolean deferred_destroy;
+
+ gboolean show_full_text;
};
MessageView *messageview_create (MainWindow *mainwin);
@@ -119,4 +121,7 @@ void messageview_print (MsgInfo *msginfo,
gint partnum);
#endif
void messageview_list_urls (MessageView *msgview);
+void messageview_show_partial_display (MessageView *msgview,
+ MsgInfo *msginfo,
+ size_t length);
#endif /* __MESSAGEVIEW_H__ */
diff --git a/src/textview.c b/src/textview.c
@@ -928,7 +928,9 @@ static void textview_write_body(TextView *textview, MimeInfo *mimeinfo)
CodeConverter *conv;
const gchar *charset, *p, *cmd;
GSList *cur;
-
+ gboolean continue_write = TRUE;
+ size_t wrote = 0, i = 0;
+
if (textview->messageview->forced_charset)
charset = textview->messageview->forced_charset;
else
@@ -1040,13 +1042,20 @@ textview_default:
}
fseek(tmpfp, mimeinfo->offset, SEEK_SET);
debug_print("Viewing text content of type: %s (length: %d)\n", mimeinfo->subtype, mimeinfo->length);
- while ((ftell(tmpfp) < mimeinfo->offset + mimeinfo->length) &&
- (fgets(buf, sizeof(buf), tmpfp) != NULL)) {
+ while (((i = ftell(tmpfp)) < mimeinfo->offset + mimeinfo->length) &&
+ (fgets(buf, sizeof(buf), tmpfp) != NULL)
+ && continue_write) {
textview_write_line(textview, buf, conv, TRUE);
if (textview->stop_loading) {
fclose(tmpfp);
return;
}
+ wrote += ftell(tmpfp)-i;
+ if (mimeinfo->length > 1024*1024
+ && wrote > 1024*1024
+ && !textview->messageview->show_full_text) {
+ continue_write = FALSE;
+ }
}
fclose(tmpfp);
}
@@ -1068,6 +1077,12 @@ textview_default:
}
}
+ if (continue_write == FALSE) {
+ messageview_show_partial_display(
+ textview->messageview,
+ textview->messageview->msginfo,
+ mimeinfo->length);
+ }
GTK_EVENTS_FLUSH();
}