#include "alertpanel.h"
#include "send.h"
#include "pgptext.h"
+#include "menu.h"
static void messageview_change_view_type(MessageView *messageview,
MessageType type);
static void key_pressed (GtkWidget *widget,
GdkEventKey *event,
MessageView *messageview);
-static void messageview_toggle_view(MessageView *messageview);
+
+static void return_receipt_show (NoticeView *noticeview,
+ MsgInfo *msginfo);
+static void return_receipt_send_clicked (NoticeView *noticeview,
+ MsgInfo *msginfo);
MessageView *messageview_create(void)
{
TextView *textview;
ImageView *imageview;
MimeView *mimeview;
+ NoticeView *noticeview;
debug_print(_("Creating message view...\n"));
messageview = g_new0(MessageView, 1);
headerview = headerview_create();
+ noticeview = noticeview_create();
+
textview = textview_create();
textview->messageview = messageview;
vbox = gtk_vbox_new(FALSE, 0);
gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET_PTR(headerview),
FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET_PTR(noticeview),
+ FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET_PTR(textview),
TRUE, TRUE, 0);
messageview->textview = textview;
messageview->imageview = imageview;
messageview->mimeview = mimeview;
+ messageview->noticeview = noticeview;
return messageview;
}
msgview->new_window = TRUE;
msgview->window = window;
+ msgview->visible = TRUE;
messageview_init(msgview);
imageview_init(messageview->imageview);
mimeview_init(messageview->mimeview);
/*messageview_set_font(messageview);*/
+
+ noticeview_hide(messageview->noticeview);
}
-static void notification_convert_header(gchar *dest, gint len, gchar *src,
+static void notification_convert_header(gchar *dest, gint len,
+ const gchar *src_,
gint header_len)
{
- g_return_if_fail(src != NULL);
+ char *src;
+
+ g_return_if_fail(src_ != NULL);
g_return_if_fail(dest != NULL);
if (len < 1) return;
+ Xstrndup_a(src, src_, len, return);
+
remove_return(src);
if (is_ascii_str(src)) {
gchar * to, const gchar *file)
{
FolderItem *queue;
- gchar *tmp, *queue_path;
+ gchar *tmp;
FILE *fp, *src_fp;
- GSList *cur;
gchar buf[BUFFSIZE];
gint num;
tmp = g_strdup_printf("%s%cqueue.%d", g_get_tmp_dir(),
G_DIR_SEPARATOR, (gint)file);
- if ((fp = fopen(tmp, "w")) == NULL) {
+ if ((fp = fopen(tmp, "wb")) == NULL) {
FILE_OP_ERROR(tmp, "fopen");
g_free(tmp);
return -1;
}
- if ((src_fp = fopen(file, "r")) == NULL) {
+ if ((src_fp = fopen(file, "rb")) == NULL) {
FILE_OP_ERROR(file, "fopen");
fclose(fp);
unlink(tmp);
}
queue = folder_get_default_queue();
- folder_item_scan(queue);
- queue_path = folder_item_get_path(queue);
- if (!is_dir_exist(queue_path))
- make_dir_hier(queue_path);
if ((num = folder_item_add_msg(queue, tmp, TRUE)) < 0) {
g_warning(_("can't queue the message\n"));
unlink(tmp);
g_free(tmp);
- g_free(queue_path);
return -1;
}
g_free(tmp);
- if ((fp = procmsg_open_mark_file(queue_path, TRUE)) == NULL)
- g_warning(_("can't open mark file\n"));
- else {
- MsgInfo newmsginfo;
-
- newmsginfo.msgnum = num;
- newmsginfo.flags.perm_flags = newmsginfo.flags.tmp_flags = 0;
- procmsg_write_flags(&newmsginfo, fp);
- fclose(fp);
- }
- g_free(queue_path);
-
- folder_item_scan(queue);
folderview_update_item(queue, TRUE);
return 0;
gchar * to;
if ((!msginfo->returnreceiptto) &&
- (!msginfo->dispositionnotificationto))
+ (!msginfo->dispositionnotificationto))
return -1;
/* write to temporary file */
g_snprintf(tmp, sizeof(tmp), "%s%ctmpmsg%d",
get_rc_dir(), G_DIR_SEPARATOR, (gint)msginfo);
- if ((fp = fopen(tmp, "w")) == NULL) {
+ if ((fp = fopen(tmp, "wb")) == NULL) {
FILE_OP_ERROR(tmp, "fopen");
return -1;
}
return -1;
}
- to_list = address_list_append(NULL, msginfo->dispositionnotificationto);
+ to_list = address_list_append(NULL, to);
ok = send_message(tmp, cur_account, to_list);
if (ok < 0) {
if (!mimeinfo) return;
file = procmsg_get_message_file_path(msginfo);
- g_return_if_fail(file != NULL);
-
- /* FIXME - doesn't tmpmsginfo->flags have the value
- * of msginfo->flags after procheader_parse()???
- * in any case, checking tmpmsginfo->flags for MSG_UNREAD
- * fixes the return-receipt-request bug */
-
- tmpmsginfo = procheader_parse(file, msginfo->flags, TRUE, TRUE);
- if (MSG_IS_MIME(tmpmsginfo->flags))
- MSG_SET_TMP_FLAGS(msginfo->flags, MSG_MIME);
-
- if (prefs_common.return_receipt
- && (tmpmsginfo->dispositionnotificationto
- || tmpmsginfo->returnreceiptto)
- && (MSG_IS_RETRCPT_PENDING(msginfo->flags))) {
- gint ok;
-
- if (alertpanel(_("Return Receipt"), _("Send return receipt ?"),
- _("Yes"), _("No"), NULL) == G_ALERTDEFAULT) {
- ok = disposition_notification_send(tmpmsginfo);
- if (ok < 0)
- alertpanel_error(_("Error occurred while sending notification."));
- }
- MSG_UNSET_PERM_FLAGS(msginfo->flags, MSG_RETRCPT_PENDING);
+ if (!file) {
+ g_warning(_("can't get message file path.\n"));
+ procmime_mimeinfo_free(mimeinfo);
+ return;
}
+ tmpmsginfo = procheader_parse_file(file, msginfo->flags, TRUE, TRUE);
+
headerview_show(messageview->headerview, tmpmsginfo);
procmsg_msginfo_free(tmpmsginfo);
textview_set_all_headers(messageview->textview, all_headers);
+ textview_set_all_headers(messageview->mimeview->textview, all_headers);
- if (mimeinfo->mime_type != MIME_TEXT) {
+ if (mimeinfo->mime_type != MIME_TEXT &&
+ mimeinfo->mime_type != MIME_TEXT_HTML) {
messageview_change_view_type(messageview, MVIEW_MIME);
mimeview_show_message(messageview->mimeview, mimeinfo, file);
} else {
procmime_mimeinfo_free(mimeinfo);
}
+ if (MSG_IS_RETRCPT_PENDING(msginfo->flags))
+ return_receipt_show(messageview->noticeview, msginfo);
+ else
+ noticeview_hide(messageview->noticeview);
+
g_free(file);
}
headerview_clear(messageview->headerview);
textview_clear(messageview->textview);
imageview_clear(messageview->imageview);
+ noticeview_hide(messageview->noticeview);
}
void messageview_destroy(MessageView *messageview)
textview_destroy(messageview->textview);
imageview_destroy(messageview->imageview);
mimeview_destroy(messageview->mimeview);
+ noticeview_destroy(messageview->noticeview);
g_free(messageview);
textview_set_font(messageview->textview, NULL);
}
-void messageview_copy_clipboard(MessageView *messageview)
+TextView *messageview_get_current_textview(MessageView *messageview)
{
- switch (messageview->type) {
- case MVIEW_TEXT:
- gtk_editable_copy_clipboard(GTK_EDITABLE(messageview->textview->text));
- break;
- case MVIEW_MIME:
- if (messageview->mimeview->type == MIMEVIEW_TEXT)
- gtk_editable_copy_clipboard(GTK_EDITABLE(messageview->mimeview->textview->text));
- default:
- break;
+ TextView *text = NULL;
+
+ if (messageview->type == MVIEW_TEXT)
+ text = messageview->textview;
+ else if (messageview->type == MVIEW_MIME) {
+ if (gtk_notebook_get_current_page
+ (GTK_NOTEBOOK(messageview->mimeview->notebook)) == 0)
+ text = messageview->textview;
+ else if (messageview->mimeview->type == MIMEVIEW_TEXT)
+ text = messageview->mimeview->textview;
}
+
+ return text;
+}
+
+void messageview_copy_clipboard(MessageView *messageview)
+{
+ TextView *text;
+
+ text = messageview_get_current_textview(messageview);
+ if (text)
+ gtk_editable_copy_clipboard(GTK_EDITABLE(text->text));
}
void messageview_select_all(MessageView *messageview)
{
- switch (messageview->type) {
- case MVIEW_TEXT:
- gtk_editable_select_region(GTK_EDITABLE(messageview->textview->text), 0, -1);
- break;
- case MVIEW_MIME:
- if (messageview->mimeview->type == MIMEVIEW_TEXT)
- gtk_editable_select_region(GTK_EDITABLE(messageview->mimeview->textview->text), 0, -1);
- default:
- break;
- }
+ TextView *text;
+
+ text = messageview_get_current_textview(messageview);
+ if (text)
+ gtk_editable_select_region(GTK_EDITABLE(text->text), 0, -1);
}
void messageview_set_position(MessageView *messageview, gint pos)
{
- switch (messageview->type) {
- case MVIEW_TEXT:
- textview_set_position(messageview->textview, pos);
- break;
- case MVIEW_MIME:
- if (messageview->mimeview->type == MIMEVIEW_TEXT)
- textview_set_position(messageview->mimeview->textview, pos);
- break;
- default:
- break;
- }
+ textview_set_position(messageview->textview, pos);
}
gboolean messageview_search_string(MessageView *messageview, const gchar *str,
gboolean case_sens)
{
- switch (messageview->type) {
- case MVIEW_TEXT:
- return textview_search_string(messageview->textview,
- str, case_sens);
- case MVIEW_MIME:
- if (messageview->mimeview->type == MIMEVIEW_TEXT)
- return textview_search_string(messageview->mimeview->textview,
- str, case_sens);
- else
- return FALSE;
- default:
- return FALSE;
- }
-
+ return textview_search_string(messageview->textview, str, case_sens);
return FALSE;
}
const gchar *str,
gboolean case_sens)
{
- switch (messageview->type) {
- case MVIEW_TEXT:
- return textview_search_string_backward(messageview->textview,
- str, case_sens);
- case MVIEW_MIME:
- if (messageview->mimeview->type == MIMEVIEW_TEXT)
- return textview_search_string_backward(messageview->mimeview->textview,
- str, case_sens);
- else
- return FALSE;
- default:
- return FALSE;
- }
-
+ return textview_search_string_backward(messageview->textview,
+ str, case_sens);
return FALSE;
-
}
-GtkWidget *messageview_get_text_widget(MessageView *messageview)
+gboolean messageview_is_visible(MessageView *messageview)
{
- return messageview->textview->text;
+ return messageview->visible;
}
static void messageview_destroy_cb(GtkWidget *widget, MessageView *messageview)
gtk_widget_destroy(messageview->window);
}
-static void messageview_toggle_view(MessageView *messageview)
-{
- MainWindow *mainwin = messageview->mainwin;
- GtkItemFactory *ifactory;
-
- if (!mainwin) return;
-
- ifactory = gtk_item_factory_from_widget(mainwin->menubar);
- menu_toggle_toggle(ifactory, "/View/Expand Summary View");
-}
-
void messageview_toggle_view_real(MessageView *messageview)
{
MainWindow *mainwin = messageview->mainwin;
gtk_widget_grab_focus(GTK_WIDGET(mainwin->summaryview->ctree));
}
}
+
+static void return_receipt_show(NoticeView *noticeview, MsgInfo *msginfo)
+{
+ noticeview_set_text(noticeview, _("This messages asks for a return receipt."));
+ noticeview_set_button_text(noticeview, _("Send receipt"));
+ noticeview_set_button_press_callback(noticeview,
+ GTK_SIGNAL_FUNC(return_receipt_send_clicked),
+ (gpointer) msginfo);
+ noticeview_show(noticeview);
+}
+
+static void return_receipt_send_clicked(NoticeView *noticeview, MsgInfo *msginfo)
+{
+ MsgInfo *tmpmsginfo;
+ gchar *file;
+
+ file = procmsg_get_message_file_path(msginfo);
+ if (!file) {
+ g_warning(_("can't get message file path.\n"));
+ return;
+ }
+
+ tmpmsginfo = procheader_parse_file(file, msginfo->flags, TRUE, TRUE);
+ if (disposition_notification_send(tmpmsginfo) >= 0) {
+ procmsg_msginfo_unset_flags(msginfo, MSG_RETRCPT_PENDING, 0);
+ noticeview_hide(noticeview);
+ }
+
+ procmsg_msginfo_free(tmpmsginfo);
+ g_free(file);
+}
+
+