[Commits] [SCM] claws branch, litehtml, updated. 3.17.0-152-g57ee5d6
miras at claws-mail.org
miras at claws-mail.org
Wed Nov 7 23:49:47 CET 2018
The branch, litehtml has been updated
via 57ee5d67b1f1e8e58be3f80701eaf9dba882a58e (commit)
from 1110b8f941df04e8a6dcbc167bd39429786aa578 (commit)
Summary of changes:
configure.ac | 6 +-
src/plugins/litehtml_viewer/Makefile.am | 4 +-
src/plugins/litehtml_viewer/http.cpp | 79 ++++++++++++++++++
src/plugins/litehtml_viewer/http.h | 28 +++++++
src/plugins/litehtml_viewer/lh_widget.cpp | 123 +++--------------------------
src/plugins/litehtml_viewer/lh_widget.h | 3 +-
6 files changed, 128 insertions(+), 115 deletions(-)
create mode 100644 src/plugins/litehtml_viewer/http.cpp
create mode 100644 src/plugins/litehtml_viewer/http.h
- Log -----------------------------------------------------------------
commit 57ee5d67b1f1e8e58be3f80701eaf9dba882a58e
Author: Michael Rasmussen <mir at datanom.net>
Date: Wed Nov 7 23:49:35 2018 +0100
Refactor image loading to a separate class. Add dependency to curl
Signed-off-by: Michael Rasmussen <mir at datanom.net>
diff --git a/configure.ac b/configure.ac
index 4c6c798..adb1436 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1136,7 +1136,7 @@ dnl either yes or no, and do the AC_SUBST calls.
dnl Archive: libarchive
dnl Fancy: Webkit, curl, optionally libsoup-gnome
dnl Gdata: libgdata
-dnl Litehtml cairo, fontconfig, gumbo
+dnl Litehtml cairo, fontconfig, gumbo, curl
dnl Libravatar: libcurl
dnl Notification: optionally libnotify unity/messaging-menu
dnl libcanberra_gtk hotkey
@@ -1639,6 +1639,10 @@ if test x"$enable_litehtml_viewer_plugin" != xno; then
if test x"$HAVE_LIBGUMBO" = xno; then
dependencies_missing="libgumbo $dependencies_missing"
fi
+ if test x"$HAVE_CURL" = xno; then
+ dependencies_missing="libcurl $dependencies_missing"
+ fi
+
if test x"$dependencies_missing" = x; then
PLUGINS="$PLUGINS litehtml_viewer"
diff --git a/src/plugins/litehtml_viewer/Makefile.am b/src/plugins/litehtml_viewer/Makefile.am
index 15cb479..648960c 100644
--- a/src/plugins/litehtml_viewer/Makefile.am
+++ b/src/plugins/litehtml_viewer/Makefile.am
@@ -46,7 +46,9 @@ litehtml_viewer_la_SOURCES = \
container_linux.h \
lh_viewer.h \
lh_widget.h \
- lh_widget_wrapped.h
+ lh_widget_wrapped.h \
+ http.h \
+ http.cpp
litehtml_viewer_la_LDFLAGS = \
$(plugin_res_ldflag) $(no_undefined) $(export_symbols) \
diff --git a/src/plugins/litehtml_viewer/http.cpp b/src/plugins/litehtml_viewer/http.cpp
new file mode 100644
index 0000000..46882e1
--- /dev/null
+++ b/src/plugins/litehtml_viewer/http.cpp
@@ -0,0 +1,79 @@
+#include "http.h"
+
+http::http()
+{
+ curl = curl_easy_init();
+ curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
+ curl_easy_setopt(curl, CURLOPT_TIMEOUT, HTTP_GET_TIMEOUT);
+ curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);
+ curl_easy_setopt(curl, CURLOPT_TCP_KEEPALIVE, 1L);
+ curl_easy_setopt(curl, CURLOPT_TCP_KEEPIDLE, 120L);
+ curl_easy_setopt(curl, CURLOPT_TCP_KEEPINTVL, 60L);
+ curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, http::curl_write_data);
+ response_data = NULL;
+ response_size = 0;;
+}
+
+http::~http()
+{
+ curl_easy_cleanup(curl);
+ if (response_data) {
+ g_free(response_data);
+ }
+}
+
+size_t http::curl_write_data(char* ptr, size_t size, size_t nmemb, void* data) {
+ if (!response_data)
+ response_data = (char *) malloc(size * nmemb);
+ else
+ response_data = (char *) realloc(response_data, response_size + size * nmemb);
+ if (response_data) {
+ memcpy(response_data + response_size, ptr, size * nmemb);
+ response_size += size * nmemb;
+ }
+ return size * nmemb;
+}
+
+void http::destroy_giostream(gpointer data) {
+ GInputStream* gio;
+ if (data) {
+ gio = G_INPUT_STREAM(data);
+ g_input_stream_close(gio, NULL, NULL);
+ gio = NULL;
+ }
+}
+
+GInputStream *http::load_url(const gchar *url, GError **error)
+{
+ GError* _error = NULL;
+ CURLcode res = CURLE_OK;
+ gsize len;
+ gchar* content;
+ GInputStream* stream = NULL;
+
+
+ if (!strncmp(url, "file:///", 8) || g_file_test(url, G_FILE_TEST_EXISTS)) {
+ gchar* newurl = g_filename_from_uri(url, NULL, NULL);
+ if (g_file_get_contents(newurl ? newurl : url, &content, &len, &_error)) {
+ stream = g_memory_input_stream_new_from_data(content, len, http::destroy_giostream);
+ } else {
+ g_log(NULL, G_LOG_LEVEL_MESSAGE, "%s", _error->message);
+ }
+ g_free(newurl);
+ } else {
+ if (!curl) return NULL;
+ curl_easy_setopt(curl, CURLOPT_URL, url);
+ curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_write_data);
+ res = curl_easy_perform(curl);
+ if (res != CURLE_OK) {
+ _error = g_error_new_literal(G_FILE_ERROR, res, curl_easy_strerror(res));
+ } else {
+ stream = g_memory_input_stream_new_from_data(response_data, response_size, http::destroy_giostream);
+ }
+ }
+
+ if (error && _error) *error = _error;
+
+ return stream;
+}
+
diff --git a/src/plugins/litehtml_viewer/http.h b/src/plugins/litehtml_viewer/http.h
new file mode 100644
index 0000000..4c4b03f
--- /dev/null
+++ b/src/plugins/litehtml_viewer/http.h
@@ -0,0 +1,28 @@
+#include <glib.h>
+#include <glib/gstdio.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <curl/curl.h>
+#include <gio/gio.h>
+
+#define HTTP_GET_TIMEOUT 5L
+
+class http
+{
+ CURL* curl;
+ static gchar* response_data;
+ static size_t response_size;
+
+public:
+ http();
+ ~http();
+
+ GInputStream *load_url(const gchar *url, GError **error);
+
+private:
+ static size_t curl_write_data(char* ptr, size_t size, size_t nmemb, void* data);
+ static void destroy_giostream(gpointer data);
+};
+
+
diff --git a/src/plugins/litehtml_viewer/lh_widget.cpp b/src/plugins/litehtml_viewer/lh_widget.cpp
index 5c90005..ba423a0 100644
--- a/src/plugins/litehtml_viewer/lh_widget.cpp
+++ b/src/plugins/litehtml_viewer/lh_widget.cpp
@@ -30,24 +30,16 @@
#include <curl/curl.h>
#include "lh_widget.h"
#include "lh_widget_wrapped.h"
+#include "http.h"
char master_css[] = {
#include "css.inc"
};
-/**
- * curl callback
- */
-static char* response_mime = NULL; /* response content-type. ex: "text/html" */
-static char* response_data = NULL; /* response data from server. */
-static size_t response_size = 0; /* response size of data */
-
static gboolean expose_event_cb(GtkWidget *widget, GdkEvent *event,
gpointer user_data);
static void size_allocate_cb(GtkWidget *widget, GdkRectangle *allocation,
gpointer user_data);
-static size_t handle_returned_data(char* ptr, size_t size, size_t nmemb, void* stream);
-static size_t handle_returned_header(void* ptr, size_t size, size_t nmemb, void* stream);
lh_widget::lh_widget()
{
@@ -76,7 +68,6 @@ lh_widget::lh_widget()
m_html = NULL;
m_rendered_width = 0;
m_context.load_master_stylesheet(master_css);
- stream = NULL;
}
lh_widget::~lh_widget()
@@ -86,10 +77,6 @@ lh_widget::~lh_widget()
g_object_unref(m_scrolled_window);
m_scrolled_window = NULL;
m_html = NULL;
- if (stream) {
- g_input_stream_close(stream, NULL, NULL);
- stream = NULL;
- }
}
GtkWidget *lh_widget::get_widget() const
@@ -149,27 +136,20 @@ GdkPixbuf *lh_widget::get_image(const litehtml::tchar_t* url, bool redraw_on_rea
g_log(NULL, G_LOG_LEVEL_MESSAGE, "Loading... %s", url);
- GInputStream *image = load_url(url, &error);
+ http http_loader;
+ GInputStream *image = http_loader.load_url(url, &error);
+
+ if (!image) return NULL;
+
+ pixbuf = gdk_pixbuf_new_from_stream(image, NULL, &error);
if (error) {
- g_log(NULL, G_LOG_LEVEL_MESSAGE, "Error: %s", error->message);
- g_error_free(error);
- return NULL;
+ g_log(NULL, G_LOG_LEVEL_ERROR, "lh_widget::get_image: Could not create pixbuf %s", error->message);
+ pixbuf = NULL;
}
- GdkPixbufLoader* loader = gdk_pixbuf_loader_new();
- if (gdk_pixbuf_loader_write(loader, (const guchar*)response_data, response_size, &error)) {
- pixbuf = gdk_pixbuf_loader_get_pixbuf(loader);
- } else {
- g_log(NULL, G_LOG_LEVEL_ERROR, "lh_widget::get_image: Could not create pixbuf");
- }
- gdk_pixbuf_loader_close(loader, NULL);
-
- /* cleanup callback data */
- if (response_mime) g_free(response_mime);
- if (response_data) g_free(response_data);
- response_data = NULL;
- response_mime = NULL;
- response_size = 0;
+/* if (redraw_on_ready) {
+ redraw();
+ }*/
return pixbuf;
}
@@ -282,57 +262,6 @@ void lh_widget::clear()
m_rendered_width = 0;
}
-GInputStream *lh_widget::load_url(const gchar *url, GError **error)
-{
- GError* _error = NULL;
- CURL* curl = NULL;
- CURLcode res = CURLE_OK;
- gsize len;
- gchar* content;
-
- /* initialize callback data */
- response_mime = NULL;
- response_data = NULL;
- response_size = 0;
- if (stream) {
- g_input_stream_close(stream, NULL, &_error);
- if (_error) {
- if (error) *error = _error;
- return NULL;
- }
- }
-
- stream = NULL;
-
- if (!strncmp(url, "file:///", 8) || g_file_test(url, G_FILE_TEST_EXISTS)) {
- gchar* newurl = g_filename_from_uri(url, NULL, NULL);
- if (g_file_get_contents(newurl ? newurl : url, &content, &len, &_error)) {
- stream = g_memory_input_stream_new_from_data(content, len, g_free);
- } else {
- g_log(NULL, G_LOG_LEVEL_MESSAGE, "%s", _error->message);
- }
- g_free(newurl);
- } else {
- curl = curl_easy_init();
- if (!curl) return NULL;
- curl_easy_setopt(curl, CURLOPT_URL, url);
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, handle_returned_data);
- curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, handle_returned_header);
- curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
- curl_easy_setopt(curl, CURLOPT_TIMEOUT, HTTP_GET_TIMEOUT);
- curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);
- res = curl_easy_perform(curl);
- curl_easy_cleanup(curl);
- if (res == CURLE_OK) {
- stream = g_memory_input_stream_new_from_data(content, response_size, g_free);
- } else
- _error = g_error_new_literal(G_FILE_ERROR, res, curl_easy_strerror(res));
- }
-
- if (error && _error) *error = _error;
-
- return stream;
-}
static gboolean expose_event_cb(GtkWidget *widget, GdkEvent *event,
gpointer user_data)
@@ -354,34 +283,6 @@ static void size_allocate_cb(GtkWidget *widget, GdkRectangle *allocation,
w->redraw();
}
-static size_t handle_returned_data(char* ptr, size_t size, size_t nmemb, void* stream) {
- if (!response_data)
- response_data = (char*)malloc(size*nmemb);
- else
- response_data = (char*)realloc(response_data, response_size+size*nmemb);
- if (response_data) {
- memcpy(response_data+response_size, ptr, size*nmemb);
- response_size += size*nmemb;
- }
- return size*nmemb;
-}
-
-static size_t handle_returned_header(void* ptr, size_t size, size_t nmemb, void* stream) {
- char* header = NULL;
-
- header = (char*) malloc(size*nmemb + 1);
- memcpy(header, ptr, size*nmemb);
- header[size*nmemb] = 0;
- if (strncmp(header, "Content-Type: ", 14) == 0) {
- char* stop = header + 14;
- stop = strpbrk(header + 14, "\r\n;");
- if (stop) *stop = 0;
- response_mime = strdup(header + 14);
- }
- free(header);
- return size*nmemb;
-}
-
///////////////////////////////////////////////////////////
extern "C" {
diff --git a/src/plugins/litehtml_viewer/lh_widget.h b/src/plugins/litehtml_viewer/lh_widget.h
index b17b626..0cb97c6 100644
--- a/src/plugins/litehtml_viewer/lh_widget.h
+++ b/src/plugins/litehtml_viewer/lh_widget.h
@@ -4,7 +4,7 @@
#include "container_linux.h"
-#define HTTP_GET_TIMEOUT 60L
+#define HTTP_GET_TIMEOUT 5L
class lh_widget : public container_linux
{
@@ -33,7 +33,6 @@ class lh_widget : public container_linux
void paint_white();
GInputStream *load_url(const gchar *url, GError **error);
- GInputStream *stream;
litehtml::document::ptr m_html;
gint m_rendered_width;
GtkWidget *m_drawing_area;
-----------------------------------------------------------------------
hooks/post-receive
--
Claws Mail
More information about the Commits
mailing list