static void mimeview_check_signature(MimeView *mimeview) { MimeInfo *mimeinfo; FILE *fp; g_return_if_fail (mimeview_is_signed(mimeview)); if (!rfc2015_is_available()) return; mimeinfo = mimeview_get_selected_part(mimeview); g_return_if_fail(mimeinfo != NULL); g_return_if_fail(mimeview->messageview->file != NULL); while (mimeinfo->parent) mimeinfo = mimeinfo->parent; if ((fp = g_fopen(mimeview->messageview->file, "rb")) == NULL) { FILE_OP_ERROR(mimeview->messageview->file, "fopen"); return; } rfc2015_check_signature(mimeinfo, fp); fclose(fp); mimeview_update_names(mimeview); mimeview_update_signature_info(mimeview); textview_show_message(mimeview->messageview->textview, mimeinfo, mimeview->messageview->file); }
static gboolean mimeview_is_signed(MimeView *mimeview) { MimeInfo *partinfo; debug_print("mimeview_is signed of %p\n", mimeview); if (!mimeview) return FALSE; if (!mimeview->opened) return FALSE; if (!rfc2015_is_available()) return FALSE; debug_print("mimeview_is_signed: open\n" ); if (!mimeview->messageview->file) return FALSE; debug_print("mimeview_is_signed: file\n" ); partinfo = mimeview_get_selected_part(mimeview); g_return_val_if_fail(partinfo != NULL, FALSE); /* walk the tree and see whether there is a signature somewhere */ do { if (rfc2015_has_signature(partinfo)) return TRUE; } while ((partinfo = partinfo->parent) != NULL); debug_print("mimeview_is_signed: FALSE\n" ); return FALSE; }
static void mimeview_launch(MimeView *mimeview) { MimeInfo *partinfo; gchar *filename; if (!mimeview->opened) return; if (!mimeview->file) return; partinfo = mimeview_get_selected_part(mimeview); if (!partinfo) { partinfo = (MimeInfo *) gtk_object_get_data (GTK_OBJECT(mimeview->popupmenu), "pop_partinfo"); gtk_object_set_data(GTK_OBJECT(mimeview->popupmenu), "pop_partinfo", NULL); } g_return_if_fail(partinfo != NULL); filename = procmime_get_tmp_file_name(partinfo); if (procmime_get_part(filename, partinfo) < 0) alertpanel_error (_("Can't save the part of multipart message.")); else mimeview_view_file(filename, partinfo, NULL); g_free(filename); }
static void mimeview_drag_data_get(GtkWidget *widget, GdkDragContext *drag_context, GtkSelectionData *selection_data, guint info, guint time, MimeView *mimeview) { gchar *filename, *uriname; MimeInfo *partinfo; if (!mimeview->opened) return; if (!mimeview->file) return; partinfo = mimeview_get_selected_part(mimeview); if (!partinfo) return; filename = g_basename(get_part_name(partinfo)); if (*filename == '\0') return; filename = g_strconcat(get_mime_tmp_dir(), G_DIR_SEPARATOR_S, filename, NULL); if (procmime_get_part(filename, partinfo) < 0) alertpanel_error (_("Can't save the part of multipart message.")); uriname = g_strconcat("file://", filename, NULL); gtk_selection_data_set(selection_data, selection_data->target, 8, uriname, strlen(uriname)); g_free(uriname); g_free(filename); }
MimeInfo *messageview_get_selected_mime_part(MessageView *messageview) { if (messageview->type == MVIEW_MIME) return mimeview_get_selected_part(messageview->mimeview); return NULL; }
static void mimeview_display_as_text(MimeView *mimeview) { MimeInfo *partinfo; if (!mimeview->opened) return; partinfo = mimeview_get_selected_part(mimeview); g_return_if_fail(partinfo != NULL); mimeview_show_message_part(mimeview, partinfo); }
/** * Menu callback: Save the selected attachment * \param mimeview Current display */ static void mimeview_save_as(MimeView *mimeview) { gchar *filename; gchar *filepath = NULL; gchar *filedir = NULL; MimeInfo *partinfo; gchar *partname = NULL; if (!mimeview->opened) return; if (!mimeview->file) return; partinfo = mimeview_get_selected_part(mimeview); if (!partinfo) { partinfo = (MimeInfo *) gtk_object_get_data (GTK_OBJECT(mimeview->popupmenu), "pop_partinfo"); gtk_object_set_data(GTK_OBJECT(mimeview->popupmenu), "pop_partinfo", NULL); } g_return_if_fail(partinfo != NULL); if (get_part_name(partinfo) == NULL) { return; } partname = g_strdup(get_part_name(partinfo)); subst_for_filename(partname); if (prefs_common.attach_save_dir) filepath = g_strconcat(prefs_common.attach_save_dir, G_DIR_SEPARATOR_S, partname, NULL); else filepath = g_strdup(partname); g_free(partname); filename = filesel_select_file(_("Save as"), filepath); if (!filename) { g_free(filepath); return; } mimeview_write_part(filename, partinfo); filedir = g_dirname(filename); if (filedir && strcmp(filedir, ".")) { if (prefs_common.attach_save_dir) g_free(prefs_common.attach_save_dir); prefs_common.attach_save_dir = g_strdup(filedir); } g_free(filedir); g_free(filepath); }
static void mimeview_open_with(MimeView *mimeview) { MimeInfo *partinfo; if (!mimeview->opened) return; if (!mimeview->messageview->file) return; partinfo = mimeview_get_selected_part(mimeview); g_return_if_fail(partinfo != NULL); mimeview_open_part_with(mimeview, partinfo); }
static void mimeview_open_with(MimeView *mimeview) { MimeInfo *partinfo; gchar *filename; gchar *cmd; if (!mimeview->opened) return; if (!mimeview->file) return; partinfo = mimeview_get_selected_part(mimeview); if (!partinfo) { partinfo = (MimeInfo *) gtk_object_get_data (GTK_OBJECT(mimeview->popupmenu), "pop_partinfo"); gtk_object_set_data(GTK_OBJECT(mimeview->popupmenu), "pop_partinfo", NULL); } g_return_if_fail(partinfo != NULL); filename = procmime_get_tmp_file_name(partinfo); if (procmime_get_part(filename, partinfo) < 0) { alertpanel_error (_("Can't save the part of multipart message.")); g_free(filename); return; } if (!prefs_common.mime_open_cmd_history) prefs_common.mime_open_cmd_history = add_history(NULL, prefs_common.mime_open_cmd); cmd = input_dialog_combo (_("Open with"), _("Enter the command line to open file:\n" "(`%s' will be replaced with file name)"), prefs_common.mime_open_cmd, prefs_common.mime_open_cmd_history, TRUE); if (cmd) { mimeview_view_file(filename, partinfo, cmd); g_free(prefs_common.mime_open_cmd); prefs_common.mime_open_cmd = cmd; prefs_common.mime_open_cmd_history = add_history(prefs_common.mime_open_cmd_history, cmd); } g_free(filename); }
static void mimeview_start_drag(GtkWidget *widget, gint button, GdkEvent *event, MimeView *mimeview) { GdkDragContext *context; MimeInfo *partinfo; g_return_if_fail(mimeview != NULL); partinfo = mimeview_get_selected_part(mimeview); if (partinfo->disposition == DISPOSITIONTYPE_INLINE) return; context = gtk_drag_begin(widget, mimeview->target_list, GDK_ACTION_COPY, button, event); gtk_drag_set_icon_default(context); }
static void mimeview_update_signature_info(MimeView *mimeview) { MimeInfo *partinfo; if (!mimeview) return; if (!mimeview->opened) return; partinfo = mimeview_get_selected_part(mimeview); if (!partinfo) return; if (rfc2015_is_signature_part(partinfo)) { mimeview_change_view_type(mimeview, MIMEVIEW_TEXT); mimeview_show_signature_part(mimeview, partinfo); } }
static void mimeview_display_as_text(MimeView *mimeview) { MimeInfo *partinfo; if (!mimeview->opened) return; partinfo = mimeview_get_selected_part(mimeview); if (!partinfo) { partinfo = (MimeInfo *) gtk_object_get_data (GTK_OBJECT(mimeview->popupmenu), "pop_partinfo"); gtk_object_set_data(GTK_OBJECT(mimeview->popupmenu), "pop_partinfo", NULL); } g_return_if_fail(partinfo != NULL); mimeview_show_message_part(mimeview, partinfo); }
static gint mimeview_button_pressed(GtkWidget *widget, GdkEventButton *event, MimeView *mimeview) { GtkCList *clist = GTK_CLIST(widget); gint row, column; if (!event) return FALSE; if (event->button == 2 || event->button == 3) { if (!gtk_clist_get_selection_info(clist, event->x, event->y, &row, &column)) return FALSE; gtk_clist_unselect_all(clist); gtk_clist_select_row(clist, row, column); gtkut_clist_set_focus_row(clist, row); } part_button_pressed(mimeview, event, mimeview_get_selected_part(mimeview)); return TRUE; }
static void mimeview_reply(MimeView *mimeview, guint action) { MimeInfo *partinfo; gchar *filename; MsgInfo *msginfo; MsgFlags flags = {0, 0}; ComposeMode mode = action; if (!mimeview->opened) return; if (!mimeview->messageview->file) return; partinfo = mimeview_get_selected_part(mimeview); g_return_if_fail(partinfo != NULL); if (partinfo->mime_type != MIME_MESSAGE_RFC822) return; filename = procmime_get_tmp_file_name(partinfo); if (procmime_get_part(filename, mimeview->messageview->file, partinfo) < 0) { alertpanel_error (_("Can't save the part of multipart message.")); g_free(filename); return; } msginfo = procheader_parse_file(filename, flags, TRUE); msginfo->file_path = filename; filename = NULL; if (prefs_common.reply_with_quote) mode |= COMPOSE_WITH_QUOTE; if (mimeview->messageview->mainwin) compose_reply(msginfo, mimeview->messageview->mainwin->summaryview->folder_item, mode, NULL); else compose_reply(msginfo, NULL, mode, NULL); g_unlink(msginfo->file_path); procmsg_msginfo_free(msginfo); }
static void mimeview_drag_begin(GtkWidget *widget, GdkDragContext *drag_context, MimeView *mimeview) { gchar *filename; gchar *bname = NULL; MimeInfo *partinfo; if (!mimeview->opened) return; if (!mimeview->messageview->file) return; partinfo = mimeview_get_selected_part(mimeview); if (!partinfo) return; filename = partinfo->filename ? partinfo->filename : partinfo->name; if (filename) { const gchar *bname_; bname_ = g_basename(filename); bname = conv_filename_from_utf8(bname_); subst_for_filename(bname); } if (!bname || *bname == '\0') filename = procmime_get_tmp_file_name(partinfo); else filename = g_strconcat(get_mime_tmp_dir(), G_DIR_SEPARATOR_S, bname, NULL); if (procmime_get_part(filename, mimeview->messageview->file, partinfo) < 0) { g_warning(_("Can't save the part of multipart message.")); } else mimeview->drag_file = encode_uri(filename); g_free(filename); gtk_drag_set_icon_default(drag_context); }
static gint mimeview_button_pressed(GtkWidget *widget, GdkEventButton *event, MimeView *mimeview) { GtkTreeView *treeview = GTK_TREE_VIEW(widget); MimeInfo *partinfo; if (!event) return FALSE; if (event->button == 2 || event->button == 3) { GtkTreePath *path; if (!gtk_tree_view_get_path_at_pos(treeview, event->x, event->y, &path, NULL, NULL, NULL)) return FALSE; gtk_tree_view_set_cursor(treeview, path, NULL, FALSE); gtk_tree_path_free(path); } if (event->button == 2 || (event->button == 1 && event->type == GDK_2BUTTON_PRESS)) { /* call external program for image, audio or html */ mimeview_launch(mimeview); } else if (event->button == 3) { partinfo = mimeview_get_selected_part(mimeview); if (partinfo && (partinfo->mime_type == MIME_TEXT || partinfo->mime_type == MIME_TEXT_HTML || partinfo->mime_type == MIME_MESSAGE_RFC822 || partinfo->mime_type == MIME_IMAGE || partinfo->mime_type == MIME_MULTIPART)) menu_set_sensitive(mimeview->popupfactory, "/Display as text", FALSE); else menu_set_sensitive(mimeview->popupfactory, "/Display as text", TRUE); if (partinfo && partinfo->mime_type == MIME_APPLICATION_OCTET_STREAM) menu_set_sensitive(mimeview->popupfactory, "/Open", FALSE); else menu_set_sensitive(mimeview->popupfactory, "/Open", TRUE); menu_set_sensitive(mimeview->popupfactory, "/Save all...", mimeview->has_attach_file); if (partinfo && (partinfo->mime_type == MIME_TEXT || partinfo->mime_type == MIME_TEXT_HTML || partinfo->mime_type == MIME_MESSAGE_RFC822)) menu_set_sensitive(mimeview->popupfactory, "/Print...", TRUE); else menu_set_sensitive(mimeview->popupfactory, "/Print...", FALSE); if (partinfo && partinfo->mime_type == MIME_MESSAGE_RFC822) { gtk_widget_show(mimeview->reply_separator); gtk_widget_show(mimeview->reply_menuitem); } else { gtk_widget_hide(mimeview->reply_separator); gtk_widget_hide(mimeview->reply_menuitem); } #if USE_GPGME menu_set_sensitive(mimeview->popupfactory, "/Check signature", mimeview_is_signed(mimeview)); #endif gtk_menu_popup(GTK_MENU(mimeview->popupmenu), NULL, NULL, NULL, NULL, event->button, event->time); return TRUE; } return FALSE; }
void mimeview_show_message(MimeView *mimeview, MimeInfo *mimeinfo, const gchar *file) { GtkTreeModel *model = GTK_TREE_MODEL(mimeview->store); GtkTreeIter iter; gboolean valid; mimeview_clear(mimeview); textview_clear(mimeview->messageview->textview); g_return_if_fail(file != NULL); g_return_if_fail(mimeinfo != NULL); #if USE_GPGME if (rfc2015_is_available() && prefs_common.auto_check_signatures) { FILE *fp; if ((fp = g_fopen(file, "rb")) == NULL) { FILE_OP_ERROR(file, "fopen"); return; } rfc2015_check_signature(mimeinfo, fp); fclose(fp); } else set_unchecked_signature(mimeinfo); #endif g_signal_handlers_block_by_func (G_OBJECT(mimeview->selection), G_CALLBACK(mimeview_selection_changed), mimeview); mimeview_set_multipart_tree(mimeview, mimeinfo, NULL); gtk_tree_view_expand_all(GTK_TREE_VIEW(mimeview->treeview)); g_signal_handlers_unblock_by_func (G_OBJECT(mimeview->selection), G_CALLBACK(mimeview_selection_changed), mimeview); /* search first text part */ for (valid = gtk_tree_model_get_iter_first(model, &iter); valid; valid = gtkut_tree_model_next(model, &iter)) { MimeInfo *partinfo; gtk_tree_model_get(model, &iter, COL_MIME_INFO, &partinfo, -1); if (partinfo && (partinfo->mime_type == MIME_TEXT || partinfo->mime_type == MIME_TEXT_HTML)) break; } textview_show_message(mimeview->messageview->textview, mimeinfo, file); if (!valid) valid = gtk_tree_model_get_iter_first(model, &iter); if (valid) { GtkTreePath *path; path = gtk_tree_model_get_path(model, &iter); gtk_tree_view_set_cursor(GTK_TREE_VIEW(mimeview->treeview), path, NULL, FALSE); gtk_tree_path_free(path); if (mimeview_get_selected_part(mimeview)) gtk_widget_grab_focus(mimeview->treeview); } }