static void mimeview_show_message_part(MimeView *mimeview, MimeInfo *partinfo) { FILE *fp; const gchar *fname; if (!partinfo) return; fname = mimeview->messageview->file; if (!fname) return; if ((fp = g_fopen(fname, "rb")) == NULL) { FILE_OP_ERROR(fname, "fopen"); return; } if (fseek(fp, partinfo->fpos, SEEK_SET) < 0) { FILE_OP_ERROR(fname, "fseek"); fclose(fp); return; } mimeview_change_view_type(mimeview, MIMEVIEW_TEXT); textview_show_part(mimeview->textview, partinfo, fp); fclose(fp); }
static void mimeview_selection_changed(GtkTreeSelection *selection, MimeView *mimeview) { GtkTreeModel *model = GTK_TREE_MODEL(mimeview->store); GtkTreeIter iter; GtkTreePath *path; MimeInfo *partinfo; if (!gtk_tree_selection_get_selected(selection, NULL, &iter)) { if (mimeview->opened) { gtk_tree_path_free(mimeview->opened); mimeview->opened = NULL; } return; } path = gtk_tree_model_get_path(model, &iter); if (mimeview->opened && gtk_tree_path_compare(mimeview->opened, path) == 0) { gtk_tree_path_free(path); return; } gtk_tree_path_free(mimeview->opened); mimeview->opened = path; path = NULL; gtk_tree_model_get(model, &iter, COL_MIME_INFO, &partinfo, -1); if (!partinfo) return; switch (partinfo->mime_type) { case MIME_TEXT: case MIME_TEXT_HTML: case MIME_MESSAGE_RFC822: case MIME_MULTIPART: mimeview_show_message_part(mimeview, partinfo); break; case MIME_IMAGE: if (prefs_common.inline_image) { mimeview_show_image_part(mimeview, partinfo); break; } /* FALLTHROUGH */ default: mimeview_change_view_type(mimeview, MIMEVIEW_TEXT); #if USE_GPGME if (rfc2015_is_signature_part(partinfo)) mimeview_show_signature_part(mimeview, partinfo); else #endif mimeview_show_mime_part(mimeview, partinfo); break; } }
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_show_image_part(MimeView *mimeview, MimeInfo *partinfo) { gchar *filename; if (!partinfo) return; filename = procmime_get_tmp_file_name(partinfo); if (procmime_get_part(filename, mimeview->messageview->file, partinfo) < 0) alertpanel_error (_("Can't get the part of multipart message.")); else { mimeview_change_view_type(mimeview, MIMEVIEW_IMAGE); imageview_show_image(mimeview->imageview, partinfo, filename, prefs_common.resize_image); g_unlink(filename); } g_free(filename); }
static void mimeview_selected(GtkCTree *ctree, GtkCTreeNode *node, gint column, MimeView *mimeview) { MimeInfo *partinfo; if (mimeview->opened == node) return; mimeview->opened = node; gtk_ctree_node_moveto(ctree, node, -1, 0.5, 0); partinfo = gtk_ctree_node_get_row_data(ctree, node); if (!partinfo) return; /* ungrab the mouse event */ if (GTK_WIDGET_HAS_GRAB(ctree)) { gtk_grab_remove(GTK_WIDGET(ctree)); if (gdk_pointer_is_grabbed()) gdk_pointer_ungrab(GDK_CURRENT_TIME); } mimeview->textview->default_text = FALSE; update_signature_info(mimeview, partinfo); if (!mimeview_show_part(mimeview, partinfo)) { switch (partinfo->type) { case MIMETYPE_TEXT: case MIMETYPE_MESSAGE: case MIMETYPE_MULTIPART: mimeview_show_message_part(mimeview, partinfo); break; default: mimeview->textview->default_text = TRUE; mimeview_change_view_type(mimeview, MIMEVIEW_TEXT); textview_show_mime_part(mimeview->textview, partinfo); break; } } }
gboolean mimeview_show_part(MimeView *mimeview, MimeInfo *partinfo) { MimeViewer *viewer; viewer = get_viewer_for_mimeinfo(mimeview, partinfo); if (viewer == NULL) { if (mimeview->mimeviewer != NULL) mimeview->mimeviewer->clear_viewer(mimeview->mimeviewer); mimeview->mimeviewer = NULL; return FALSE; } if (mimeview->mimeviewer != viewer) { if (mimeview->mimeviewer != NULL) mimeview->mimeviewer->clear_viewer(mimeview->mimeviewer); mimeview->mimeviewer = viewer; mimeview_change_view_type(mimeview, MIMEVIEW_VIEWER); } viewer->show_mimepart(viewer, mimeview->file, partinfo); return TRUE; }
void mimeview_unregister_viewer_factory(MimeViewerFactory *factory) { GSList *mimeview_list, *viewer_list; for (mimeview_list = mimeviews; mimeview_list != NULL; mimeview_list = g_slist_next(mimeview_list)) { MimeView *mimeview = (MimeView *) mimeview_list->data; if (mimeview->mimeviewer && mimeview->mimeviewer->factory == factory) { mimeview_change_view_type(mimeview, MIMEVIEW_TEXT); mimeview->mimeviewer = NULL; } while ((viewer_list = g_slist_find_custom(mimeview->viewers, factory, cmp_viewer_by_factroy)) != NULL) { MimeViewer *mimeviewer = (MimeViewer *) viewer_list->data; mimeviewer->destroy_viewer(mimeviewer); mimeview->viewers = g_slist_remove(mimeview->viewers, mimeviewer); } } mimeviewer_factories = g_slist_remove(mimeviewer_factories, factory); }