All pastes #359377 Raw Edit

Something

public text v1 · immutable
·published 2007-02-16 20:04 UTC
rendered paste body
#ifdef HAVE_CONFIG_H
#  include "config.h"
#endif

#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <glib.h>
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
#include <poppler.h>
#include "claws.h"
#include "version.h"
#include "main.h"
#include "plugin.h"
#include "utils.h"
#include "mimeview.h"
#include "messageview.h"
#include "prefs_common.h"
#include "log.h"
#include "codeconv.h"
#include "menu.h"
#include "defs.h"

#ifdef USE_PTHREAD
#include <pthread.h>
#endif

#define FAIL(msg) \
    do { fprintf (stderr, "FAIL: %s\n", msg); exit (-1); } while (0)

struct _PopplerViewer
{
	MimeViewer	 mimeviewer;
	GtkWidget	*pdf_view;
	GtkWidget	*scrollwin;
	PopplerDocument	*pdf_doc;
	PopplerPage	*pdf_page;
	gchar		*filename;
	gchar		*fsname;
	double		width;
	double		height;
	MimeInfo	*mimeinfo;
	MimeInfo	*to_load;
	GMutex		*mutex;
};

typedef struct _PopplerViewer PopplerViewer;

static MimeViewerFactory poppler_viewer_factory;

static GtkWidget *poppler_get_widget(MimeViewer *_viewer)
{
	PopplerViewer *viewer = (PopplerViewer *) _viewer;

	debug_print("poppler_get_widget: %p\n", viewer->scrollwin);

	return GTK_WIDGET(viewer->scrollwin);
}

static gint poppler_show_mimepart_real(MimeViewer *_viewer)
{
	PopplerViewer *viewer = (PopplerViewer *) _viewer;
	gchar buf[4096];
	const gchar *charset = NULL;
	MessageView *messageview = ((MimeViewer *)viewer)->mimeview 
					? ((MimeViewer *)viewer)->mimeview->messageview 
					: NULL;
	MimeInfo *partinfo = viewer->to_load;

	memset(buf, 0, sizeof(buf));

	messageview->updating = TRUE;
	debug_print("poppler_show_mimepart\n");

	if (viewer->filename != NULL) {
		g_unlink(viewer->filename);
		g_free(viewer->filename);
		viewer->filename = NULL;
	}

	viewer->mimeinfo = NULL;
	if (messageview) {
		NoticeView *noticeview = messageview->noticeview;
		noticeview_hide(noticeview);
	}

	
	if (partinfo) {
	    viewer->filename = procmime_get_tmp_file_name(partinfo);
	    viewer->fsname = g_strconcat("file://", viewer->filename, NULL);
	}
	
	if (partinfo && !(procmime_get_part(viewer->filename, partinfo) < 0)) {

		if (_viewer && _viewer->mimeview &&
		    _viewer->mimeview->messageview->forced_charset)
			charset = _viewer->mimeview->messageview->forced_charset;
		else
			charset = procmime_mimeinfo_get_parameter(partinfo, "charset");
		if (charset == NULL)
			charset = conv_get_locale_charset_str();

		debug_print("using charset %s\n", charset);
		
		viewer->mimeinfo = partinfo;
	}
	g_mutex_lock(viewer->mutex);
	g_mutex_unlock(viewer->mutex);
	messageview->updating = TRUE;
	return FALSE;
}
static void poppler_pdf_view_new(MimeViewer *_viewer) {

	PopplerViewer *viewer = (PopplerViewer *) _viewer;
	GError *error;
	GtkImage *im;
	GdkPixbuf *pb;
	error = NULL;
	viewer->pdf_doc = poppler_document_new_from_file( viewer->fsname, NULL, &error);
	    if (viewer->pdf_doc == NULL)
		FAIL (error->message);	
	viewer->pdf_page = poppler_document_get_page_by_label (viewer->pdf_doc, "1");
	    if (viewer->pdf_page == NULL)
		FAIL ("Page not found");
	poppler_page_get_size(viewer->pdf_page, &viewer->width, &viewer->height);
	//pb = gdk_pixbuf_new_from_file("/opt/media/pics/Linside.jpg",NULL);
	pb = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, 220, 220);
	gdk_pixbuf_fill (pb, 0x00106000);
	poppler_page_render_to_pixbuf (viewer->pdf_page, 100, 100, 200, 200, 1, 0, pb);
	viewer->pdf_view = gtk_image_new_from_pixbuf(pb);
}
static void poppler_show_mimepart(MimeViewer *_viewer,
				const gchar *infile,
				MimeInfo *partinfo)
{
	PopplerViewer *viewer = (PopplerViewer *) _viewer;
	viewer->to_load = partinfo;
	gtk_timeout_add(5, (GtkFunction)poppler_show_mimepart_real, viewer);
	
}

static void poppler_clear_viewer(MimeViewer *_viewer)
{
	PopplerViewer *viewer = (PopplerViewer *) _viewer;
	GtkAdjustment *vadj;
	
	debug_print("poppler_clear_viewer\n");
	viewer->to_load = NULL;
	
	vadj = gtk_scrolled_window_get_vadjustment(
		GTK_SCROLLED_WINDOW(viewer->scrollwin));
	vadj->value = 0.0;
	g_signal_emit_by_name(G_OBJECT(vadj), "value-changed", 0);
}

static void poppler_destroy_viewer(MimeViewer *_viewer)
{
	PopplerViewer *viewer = (PopplerViewer *) _viewer;

	debug_print("poppler_destroy_viewer\n");

	gtk_widget_unref(GTK_WIDGET(viewer->pdf_view));
	gtk_widget_unref(GTK_WIDGET(viewer->scrollwin));
	g_unlink(viewer->filename);
	g_free(viewer->filename);
    	g_free(viewer);
}

static MimeViewer *poppler_viewer_create(void)
{
	PopplerViewer *viewer;
	
	debug_print("poppler_viewer_create\n");

	viewer = g_new0(PopplerViewer, 1);
	viewer->mimeviewer.factory = &poppler_viewer_factory;
	viewer->mimeviewer.get_widget = poppler_get_widget;
	viewer->mimeviewer.show_mimepart = poppler_show_mimepart;
	viewer->mimeviewer.clear_viewer = poppler_clear_viewer;
	viewer->mimeviewer.destroy_viewer = poppler_destroy_viewer;
	viewer->scrollwin = gtk_scrolled_window_new(NULL, NULL);
	viewer->mimeinfo  = NULL;
	viewer->pdf_view = poppler_pdf_view_new;
	viewer->mutex     = g_mutex_new();
	gtk_scrolled_window_set_policy(
			GTK_SCROLLED_WINDOW(viewer->scrollwin), 
			GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);

	gtk_scrolled_window_set_shadow_type(
			GTK_SCROLLED_WINDOW(viewer->scrollwin),
			GTK_SHADOW_IN);

	gtk_container_add(
		GTK_CONTAINER(viewer->scrollwin),
		viewer->pdf_view);

	
	gtk_widget_show(GTK_WIDGET(viewer->scrollwin));
	gtk_widget_ref(GTK_WIDGET(viewer->scrollwin));
		gtk_widget_show(GTK_WIDGET(viewer->pdf_view));
	gtk_widget_ref(GTK_WIDGET(viewer->pdf_view));
	viewer->filename = NULL;
	return (MimeViewer *) viewer;
}

static gchar *content_types[] =
	{"application/pdf", NULL};

static MimeViewerFactory poppler_viewer_factory =
{
	content_types,
	0,
	poppler_viewer_create,
};

gint plugin_init(gchar **error)
{
	if (!check_plugin_version(MAKE_NUMERIC_VERSION(2, 7, 2, 2),
		    VERSION_NUMERIC, "PDF Viewer", error))
		return -1;
	mimeview_register_viewer_factory(&poppler_viewer_factory);
	return 0;
}

void plugin_done(void)
{
	mimeview_unregister_viewer_factory(&poppler_viewer_factory);
}

const gchar *plugin_name(void)
{
	return ("PDF Viewer");
}

const gchar *plugin_desc(void)
{
	return ("This plugin renders PDF attachments in mails using the poppler lib..\n"
		"The extended name is Red Poppler PDF Viewer"
		);
}

const gchar *plugin_type(void)
{
	return "GTK2";
}

const gchar *plugin_licence(void)
{
	return "GPL";
}

const gchar *plugin_version(void)
{
	return PLUGINVERSION;
}

struct PluginFeature *plugin_provides(void)
{
	static struct PluginFeature features[] = 
		{ {PLUGIN_MIMEVIEWER, "application/pdf"},
		  {PLUGIN_NOTHING, NULL} };
	return features;
}