[Commits] [SCM] claws branch, master, updated. 3.17.3-131-g531b117
ticho at claws-mail.org
ticho at claws-mail.org
Sat Mar 9 22:34:43 CET 2019
The branch, master has been updated
via 531b117a0a3459abf82022f032fa52a2d09c1695 (commit)
from d7481e210baeb7e1ec8b95d34daab6b753ebd92b (commit)
Summary of changes:
src/plugins/litehtml_viewer/container_linux.cpp | 5 +-
src/plugins/litehtml_viewer/container_linux.h | 1 +
.../litehtml_viewer/container_linux_images.cpp | 27 ++++++---
src/plugins/litehtml_viewer/lh_viewer.c | 1 +
src/plugins/litehtml_viewer/lh_widget.cpp | 59 ++++++++++++++++++++
src/plugins/litehtml_viewer/lh_widget.h | 6 ++
src/plugins/litehtml_viewer/lh_widget_wrapped.h | 1 +
7 files changed, 89 insertions(+), 11 deletions(-)
- Log -----------------------------------------------------------------
commit 531b117a0a3459abf82022f032fa52a2d09c1695
Author: Andrej Kacian <ticho at claws-mail.org>
Date: Sat Mar 9 22:32:32 2019 +0100
Added support for local image attachments to the Litehtml plugin
diff --git a/src/plugins/litehtml_viewer/container_linux.cpp b/src/plugins/litehtml_viewer/container_linux.cpp
index 923ce76..ac0f40e 100644
--- a/src/plugins/litehtml_viewer/container_linux.cpp
+++ b/src/plugins/litehtml_viewer/container_linux.cpp
@@ -127,15 +127,14 @@ void container_linux::draw_background( litehtml::uint_ptr hdc, const litehtml::b
litehtml::tstring url;
make_url(bg.image.c_str(), bg.baseurl.c_str(), url);
- lock_images_cache();
- bool found = false;
const image *img_i = NULL;
+ lock_images_cache();
+
for (auto ii = m_images.cbegin(); ii != m_images.cend(); ++ii) {
const image *i = &(*ii);
if (i->first == url) {
img_i = i;
- found = true;
break;
}
}
diff --git a/src/plugins/litehtml_viewer/container_linux.h b/src/plugins/litehtml_viewer/container_linux.h
index 627bda6..f35ffea 100644
--- a/src/plugins/litehtml_viewer/container_linux.h
+++ b/src/plugins/litehtml_viewer/container_linux.h
@@ -96,6 +96,7 @@ public:
void add_image_to_cache(const gchar *url, GdkPixbuf *image);
virtual void redraw(gboolean force_render) = 0;
+ virtual GdkPixbuf *get_local_image(const litehtml::tstring url) const = 0;
protected:
virtual void draw_ellipse(cairo_t* cr, int x, int y, int width, int height, const litehtml::web_color& color, int line_width);
diff --git a/src/plugins/litehtml_viewer/container_linux_images.cpp b/src/plugins/litehtml_viewer/container_linux_images.cpp
index eeefd40..2c9d91d 100644
--- a/src/plugins/litehtml_viewer/container_linux_images.cpp
+++ b/src/plugins/litehtml_viewer/container_linux_images.cpp
@@ -32,13 +32,6 @@ static GdkPixbuf *lh_get_image(const litehtml::tchar_t* url)
GdkPixbuf *pixbuf = NULL;
http* http_loader = NULL;
- if (!lh_prefs_get()->enable_remote_content) {
- debug_print("blocking download of image from '%s'\n", url);
- return NULL;
- }
-
- debug_print("allowing download of image from '%s'\n", url);
-
http_loader = new http();
GInputStream *image = http_loader->load_url(url, &error);
@@ -115,8 +108,26 @@ void container_linux::load_image( const litehtml::tchar_t* src, const litehtml::
unlock_images_cache();
- if(!found) {
+ if (!found) {
struct FetchCtx *ctx = g_new(struct FetchCtx, 1);
+
+ /* Attached images can be loaded into cache right here. */
+ if (!strncmp(src, "cid:", 4)) {
+ GdkPixbuf *pixbuf = get_local_image(src);
+
+ if (pixbuf != NULL)
+ add_image_to_cache(src, pixbuf);
+
+ return;
+ }
+
+ if (!lh_prefs_get()->enable_remote_content) {
+ debug_print("blocking download of image from '%s'\n", src);
+ return;
+ }
+
+ debug_print("allowing download of image from '%s'\n", src);
+
ctx->url = g_strdup(url.c_str());
ctx->container = this;
diff --git a/src/plugins/litehtml_viewer/lh_viewer.c b/src/plugins/litehtml_viewer/lh_viewer.c
index e3e1fdb..cf22959 100644
--- a/src/plugins/litehtml_viewer/lh_viewer.c
+++ b/src/plugins/litehtml_viewer/lh_viewer.c
@@ -93,6 +93,7 @@ static void lh_show_mimepart(MimeViewer *_viewer, const gchar *infile,
return;
}
+ lh_widget_set_partinfo(viewer->widget, partinfo);
lh_widget_open_html(viewer->widget, utf8);
g_free(utf8);
}
diff --git a/src/plugins/litehtml_viewer/lh_widget.cpp b/src/plugins/litehtml_viewer/lh_widget.cpp
index 759b46e..64fdbdd 100644
--- a/src/plugins/litehtml_viewer/lh_widget.cpp
+++ b/src/plugins/litehtml_viewer/lh_widget.cpp
@@ -104,6 +104,8 @@ lh_widget::lh_widget()
m_font_name = NULL;
m_font_size = 0;
+ m_partinfo = NULL;
+
gtk_widget_set_events(m_drawing_area,
GDK_BUTTON_RELEASE_MASK
| GDK_BUTTON_PRESS_MASK
@@ -406,6 +408,58 @@ const litehtml::tstring lh_widget::fullurl(const litehtml::tchar_t *url) const
return _t(url);
}
+void lh_widget::set_partinfo(MimeInfo *partinfo)
+{
+ m_partinfo = partinfo;
+}
+
+GdkPixbuf *lh_widget::get_local_image(const litehtml::tstring url) const
+{
+ GdkPixbuf *pixbuf;
+ const gchar *name;
+ MimeInfo *p = m_partinfo;
+
+ if (strncmp(url.c_str(), "cid:", 4) != 0) {
+ debug_print("lh_widget::get_local_image: '%s' is not a local URI, ignoring\n", url.c_str());
+ return NULL;
+ }
+
+ name = url.c_str() + 4;
+ debug_print("getting message part '%s'\n", name);
+
+ while ((p = procmime_mimeinfo_next(p)) != NULL) {
+ size_t len = strlen(name);
+
+ /* p->id is in format "<partname>" */
+ if (!strncasecmp(name, p->id + 1, len) &&
+ strlen(p->id) >= len + 2 &&
+ *(p->id + len + 1) == '>') {
+ GInputStream *stream;
+ GError *error = NULL;
+
+ stream = procmime_get_part_as_inputstream(p, &error);
+ if (error != NULL) {
+ g_warning("Couldn't get image MIME part: %s\n", error->message);
+ g_error_free(error);
+ return NULL;
+ }
+
+ pixbuf = gdk_pixbuf_new_from_stream(stream, NULL, &error);
+ g_object_unref(stream);
+ if (error != NULL) {
+ g_warning("Couldn't load image: %s\n", error->message);
+ g_error_free(error);
+ return NULL;
+ }
+
+ return pixbuf;
+ }
+ }
+
+ /* MIME part with requested name was not found */
+ return NULL;
+}
+
////////////////////////////////////////////////
static gboolean expose_event_cb(GtkWidget *widget, GdkEvent *event,
gpointer user_data)
@@ -563,4 +617,9 @@ void lh_widget_print(lh_widget_wrapped *w) {
w->print();
}
+void lh_widget_set_partinfo(lh_widget_wrapped *w, MimeInfo *partinfo)
+{
+ w->set_partinfo(partinfo);
+}
+
} /* extern "C" */
diff --git a/src/plugins/litehtml_viewer/lh_widget.h b/src/plugins/litehtml_viewer/lh_widget.h
index 204d612..e6b784a 100644
--- a/src/plugins/litehtml_viewer/lh_widget.h
+++ b/src/plugins/litehtml_viewer/lh_widget.h
@@ -19,6 +19,8 @@
#include <glib.h>
#include <gio/gio.h>
+#include "procmime.h"
+
#include "container_linux.h"
struct pango_font
@@ -63,6 +65,9 @@ class lh_widget : public container_linux
void popup_context_menu(const litehtml::tchar_t *url, GdkEventButton *event);
const litehtml::tstring fullurl(const litehtml::tchar_t *url) const;
+ void set_partinfo(MimeInfo *partinfo);
+ GdkPixbuf *get_local_image(const litehtml::tstring url) const;
+
litehtml::document::ptr m_html;
litehtml::tstring m_clicked_url;
litehtml::tstring m_base_url;
@@ -78,6 +83,7 @@ class lh_widget : public container_linux
litehtml::context m_context;
gint m_height;
litehtml::tstring m_cursor;
+ MimeInfo *m_partinfo;
litehtml::tchar_t *m_font_name;
int m_font_size;
diff --git a/src/plugins/litehtml_viewer/lh_widget_wrapped.h b/src/plugins/litehtml_viewer/lh_widget_wrapped.h
index 8d3e2eb..2f15812 100644
--- a/src/plugins/litehtml_viewer/lh_widget_wrapped.h
+++ b/src/plugins/litehtml_viewer/lh_widget_wrapped.h
@@ -32,6 +32,7 @@ void lh_widget_destroy(lh_widget_wrapped *w);
void lh_widget_statusbar_push(const gchar* msg);
void lh_widget_statusbar_pop();
void lh_widget_print(lh_widget_wrapped *w);
+void lh_widget_set_partinfo(lh_widget_wrapped *w, MimeInfo *partinfo);
#ifdef __cplusplus
} /* extern "C" */
-----------------------------------------------------------------------
hooks/post-receive
--
Claws Mail
More information about the Commits
mailing list