static void textview_add_part (TextView *textview,
MimeInfo *mimeinfo,
FILE *fp);
+static void textview_add_parts (TextView *textview,
+ MimeInfo *mimeinfo,
+ FILE *fp);
static void textview_write_body (TextView *textview,
MimeInfo *mimeinfo,
FILE *fp,
void textview_show_message(TextView *textview, MimeInfo *mimeinfo,
const gchar *file)
{
- GtkSText *text = GTK_STEXT(textview->text);
+ GtkSText *text;
FILE *fp;
const gchar *charset = NULL;
GPtrArray *headers = NULL;
charset = mimeinfo->charset;
textview_set_font(textview, charset);
textview_clear(textview);
- textview->body_pos = 0;
- textview->cur_pos = 0;
+
+ text = GTK_STEXT(textview->text);
gtk_stext_freeze(text);
textview->body_pos = gtk_stext_get_length(text);
}
- while (mimeinfo != NULL) {
- textview_add_part(textview, mimeinfo, fp);
- if (mimeinfo->parent && mimeinfo->parent->content_type &&
- !strcasecmp(mimeinfo->parent->content_type,
- "multipart/alternative"))
- mimeinfo = mimeinfo->parent->next;
- else
- mimeinfo = procmime_mimeinfo_next(mimeinfo);
- }
+ textview_add_parts(textview, mimeinfo, fp);
gtk_stext_thaw(text);
void textview_show_part(TextView *textview, MimeInfo *mimeinfo, FILE *fp)
{
- GtkSText *text = GTK_STEXT(textview->text);
+ GtkSText *text;
gchar buf[BUFFSIZE];
const gchar *boundary = NULL;
gint boundary_len = 0;
const gchar *charset = NULL;
GPtrArray *headers = NULL;
+ gboolean is_rfc822_part = FALSE;
g_return_if_fail(mimeinfo != NULL);
g_return_if_fail(fp != NULL);
- if (mimeinfo->mime_type == MIME_MULTIPART) return;
+ if (mimeinfo->mime_type == MIME_MULTIPART) {
+ textview_clear(textview);
+ textview_add_parts(textview, mimeinfo, fp);
+ return;
+ }
if (mimeinfo->parent && mimeinfo->parent->boundary) {
boundary = mimeinfo->parent->boundary;
}
/* display attached RFC822 single text message */
- if (mimeinfo->parent && mimeinfo->mime_type == MIME_MESSAGE_RFC822) {
- if (headers) procheader_header_array_destroy(headers);
- if (!mimeinfo->sub || mimeinfo->sub->children) return;
- headers = textview_scan_header(textview, fp);
- mimeinfo = mimeinfo->sub;
- } else if (!mimeinfo->parent &&
- mimeinfo->mime_type == MIME_MESSAGE_RFC822) {
+ if (mimeinfo->mime_type == MIME_MESSAGE_RFC822) {
if (headers) procheader_header_array_destroy(headers);
- if (!mimeinfo->sub) return;
+ if (!mimeinfo->sub) {
+ textview_clear(textview);
+ return;
+ }
headers = textview_scan_header(textview, fp);
mimeinfo = mimeinfo->sub;
+ is_rfc822_part = TRUE;
}
if (prefs_common.force_charset)
charset = mimeinfo->charset;
textview_set_font(textview, charset);
- textview_clear(textview);
- gtk_stext_freeze(text);
+ text = GTK_STEXT(textview->text);
- textview->body_pos = 0;
- textview->cur_pos = 0;
+ gtk_stext_freeze(text);
+ textview_clear(textview);
if (headers) {
textview_show_header(textview, headers);
- gtk_stext_insert(text, NULL, NULL, NULL, "\n", 1);
procheader_header_array_destroy(headers);
textview->body_pos = gtk_stext_get_length(text);
+ if (!mimeinfo->main)
+ gtk_stext_insert(text, NULL, NULL, NULL, "\n", 1);
}
- textview_write_body(textview, mimeinfo, fp, charset);
+ if (mimeinfo->mime_type == MIME_MULTIPART || is_rfc822_part)
+ textview_add_parts(textview, mimeinfo, fp);
+ else
+ textview_write_body(textview, mimeinfo, fp, charset);
gtk_stext_thaw(text);
}
if (mimeinfo->mime_type == MIME_MESSAGE_RFC822) {
headers = textview_scan_header(textview, fp);
if (headers) {
+ gtk_stext_freeze(text);
gtk_stext_insert(text, NULL, NULL, NULL, "\n", 1);
textview_show_header(textview, headers);
procheader_header_array_destroy(headers);
+ gtk_stext_thaw(text);
}
return;
}
gtk_stext_thaw(text);
}
+static void textview_add_parts(TextView *textview, MimeInfo *mimeinfo, FILE *fp)
+{
+ gint level;
+
+ g_return_if_fail(mimeinfo != NULL);
+ g_return_if_fail(fp != NULL);
+
+ level = mimeinfo->level;
+
+ for (;;) {
+ textview_add_part(textview, mimeinfo, fp);
+ if (mimeinfo->parent && mimeinfo->parent->content_type &&
+ !strcasecmp(mimeinfo->parent->content_type,
+ "multipart/alternative"))
+ mimeinfo = mimeinfo->parent->next;
+ else
+ mimeinfo = procmime_mimeinfo_next(mimeinfo);
+ if (!mimeinfo || mimeinfo->level <= level)
+ break;
+ }
+}
+
#define TEXT_INSERT(str) \
gtk_stext_insert(text, textview->msgfont, NULL, NULL, str, -1)
}
#endif
+ if (!conv || conv_convert(conv, buf, sizeof(buf), str) < 0)
+ strncpy2(buf, str, sizeof(buf));
+
+ strcrchomp(buf);
+ gtk_stext_insert(text, textview->msgfont, NULL, NULL, " ", 1);
+
/* this part is based on the code in make_clickable_parts */
if (prefs_common.enable_color) {
link_color = &uri_color;
textview_uri_list_remove_all(textview->uri_list);
textview->uri_list = NULL;
+
+ textview->body_pos = 0;
+ textview->cur_pos = 0;
}
void textview_destroy(TextView *textview)