mirror of https://github.com/djcb/mu.git
* msg2pdf.c: support images as well
This commit is contained in:
parent
3a4d4f80ff
commit
6321db9129
|
@ -23,6 +23,7 @@
|
||||||
|
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
#include <webkit/webkitwebview.h>
|
#include <webkit/webkitwebview.h>
|
||||||
|
#include <webkit/webkitwebresource.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -41,6 +42,67 @@ get_print_operation (const char *path)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static char*
|
||||||
|
save_file_for_cid (MuMsg *msg, const char* cid)
|
||||||
|
{
|
||||||
|
gint idx;
|
||||||
|
gchar *filepath;
|
||||||
|
gboolean rv;
|
||||||
|
GError *err;
|
||||||
|
|
||||||
|
g_return_val_if_fail (msg, NULL);
|
||||||
|
g_return_val_if_fail (cid, NULL);
|
||||||
|
|
||||||
|
idx = mu_msg_part_find_cid (msg, cid);
|
||||||
|
if (idx < 0) {
|
||||||
|
g_warning ("%s: cannot find %s", __FUNCTION__, cid);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
filepath = mu_msg_part_filepath_cache (msg, idx);
|
||||||
|
if (!filepath) {
|
||||||
|
g_warning ("%s: cannot create filepath", filepath);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = NULL;
|
||||||
|
rv = mu_msg_part_save (msg, filepath, idx, FALSE, TRUE, &err);
|
||||||
|
if (!rv) {
|
||||||
|
g_warning ("%s: failed to save %s: %s", __FUNCTION__,
|
||||||
|
filepath,
|
||||||
|
err&&err->message?err->message:"error");
|
||||||
|
if (err)
|
||||||
|
g_error_free (err);
|
||||||
|
g_free (filepath);
|
||||||
|
filepath = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return filepath;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_resource_request_starting (WebKitWebView *self, WebKitWebFrame *frame,
|
||||||
|
WebKitWebResource *resource,
|
||||||
|
WebKitNetworkRequest *request,
|
||||||
|
WebKitNetworkResponse *response, MuMsg *msg)
|
||||||
|
{
|
||||||
|
const char* uri;
|
||||||
|
uri = webkit_network_request_get_uri (request);
|
||||||
|
|
||||||
|
if (g_ascii_strncasecmp (uri, "cid:", 4) == 0) {
|
||||||
|
gchar *filepath;
|
||||||
|
filepath = save_file_for_cid (msg, uri);
|
||||||
|
if (filepath) {
|
||||||
|
gchar *fileuri;
|
||||||
|
fileuri = g_strdup_printf ("file://%s", filepath);
|
||||||
|
webkit_network_request_set_uri (request, fileuri);
|
||||||
|
g_free (fileuri);
|
||||||
|
g_free (filepath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* return the path to the output file, or NULL in case of error */
|
/* return the path to the output file, or NULL in case of error */
|
||||||
static char*
|
static char*
|
||||||
generate_pdf (MuMsg *msg, const char *str, GError **err)
|
generate_pdf (MuMsg *msg, const char *str, GError **err)
|
||||||
|
@ -48,10 +110,12 @@ generate_pdf (MuMsg *msg, const char *str, GError **err)
|
||||||
GtkWidget *view;
|
GtkWidget *view;
|
||||||
WebKitWebFrame *frame;
|
WebKitWebFrame *frame;
|
||||||
WebKitWebSettings *settings;
|
WebKitWebSettings *settings;
|
||||||
|
|
||||||
GtkPrintOperationResult printres;
|
GtkPrintOperationResult printres;
|
||||||
GtkPrintOperation *printop;
|
GtkPrintOperation *printop;
|
||||||
char *path;
|
char *path;
|
||||||
|
WebKitLoadStatus status;
|
||||||
|
time_t start;
|
||||||
|
const int max_time = 2; /* max two seconds to download stuff */
|
||||||
|
|
||||||
settings = webkit_web_settings_new ();
|
settings = webkit_web_settings_new ();
|
||||||
g_object_set (G_OBJECT(settings),
|
g_object_set (G_OBJECT(settings),
|
||||||
|
@ -61,10 +125,17 @@ generate_pdf (MuMsg *msg, const char *str, GError **err)
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
view = webkit_web_view_new ();
|
view = webkit_web_view_new ();
|
||||||
|
|
||||||
|
/* to support cid: */
|
||||||
|
g_signal_connect (G_OBJECT(view), "resource-request-starting",
|
||||||
|
G_CALLBACK (on_resource_request_starting),
|
||||||
|
msg);
|
||||||
|
|
||||||
webkit_web_view_set_settings (WEBKIT_WEB_VIEW(view), settings);
|
webkit_web_view_set_settings (WEBKIT_WEB_VIEW(view), settings);
|
||||||
webkit_web_view_load_string (WEBKIT_WEB_VIEW(view),
|
webkit_web_view_load_string (WEBKIT_WEB_VIEW(view),
|
||||||
str, "text/html", "utf-8", "");
|
str, "text/html", "utf-8", "");
|
||||||
g_object_unref (settings);
|
g_object_unref (settings);
|
||||||
|
|
||||||
frame = webkit_web_view_get_main_frame (WEBKIT_WEB_VIEW(view));
|
frame = webkit_web_view_get_main_frame (WEBKIT_WEB_VIEW(view));
|
||||||
if (!frame) {
|
if (!frame) {
|
||||||
g_set_error (err, 0, MU_ERROR, "cannot get web frame");
|
g_set_error (err, 0, MU_ERROR, "cannot get web frame");
|
||||||
|
@ -74,6 +145,13 @@ generate_pdf (MuMsg *msg, const char *str, GError **err)
|
||||||
path = g_strdup_printf ("%s%c%x.pdf",mu_util_cache_dir(),
|
path = g_strdup_printf ("%s%c%x.pdf",mu_util_cache_dir(),
|
||||||
G_DIR_SEPARATOR, (unsigned)random());
|
G_DIR_SEPARATOR, (unsigned)random());
|
||||||
|
|
||||||
|
start = time (NULL);
|
||||||
|
do {
|
||||||
|
status = webkit_web_view_get_load_status (WEBKIT_WEB_VIEW(view));
|
||||||
|
g_main_context_iteration (NULL, TRUE);
|
||||||
|
} while (status != WEBKIT_LOAD_FINISHED ||
|
||||||
|
time(NULL) - start > max_time);
|
||||||
|
|
||||||
printop = get_print_operation (path);
|
printop = get_print_operation (path);
|
||||||
printres = webkit_web_frame_print_full
|
printres = webkit_web_frame_print_full
|
||||||
(frame, printop, GTK_PRINT_OPERATION_ACTION_EXPORT,
|
(frame, printop, GTK_PRINT_OPERATION_ACTION_EXPORT,
|
||||||
|
|
Loading…
Reference in New Issue