From 810e634a8da0c1ccd5de08d5d06f5ea11df0f254 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Mon, 10 Jun 2013 02:42:15 +0200 Subject: [PATCH] Now able to load local files as well --- src/ghtml-gtktextview.c | 90 ++++++++++++++++++++++++++++++----------- 1 file changed, 66 insertions(+), 24 deletions(-) diff --git a/src/ghtml-gtktextview.c b/src/ghtml-gtktextview.c index 0dab93f..6b17f68 100644 --- a/src/ghtml-gtktextview.c +++ b/src/ghtml-gtktextview.c @@ -761,9 +761,14 @@ void ghtml_zoom_reset(GtkWidget * widget) /* functions */ -static ssize_t _document_load_write(Conn * conn, char const * buf, size_t size, - gpointer data); -static gboolean _document_load_idle(gpointer data); +static int _document_load_file(GHtml * ghtml, char const * filename); +static int _document_load_url(GHtml * ghtml, char const * url, + char const * post); +static gboolean _document_load_url_idle(gpointer data); +static ssize_t _document_load_url_write(Conn * conn, char const * buf, + size_t size, gpointer data); +static int _document_load_write(GHtml * ghtml, char const * buf, size_t size); +static int _document_load_write_close(GHtml * ghtml); static void _document_load_write_node(GHtml * ghtml, XMLNode * node); static void _document_load_write_node_entity(GHtml * ghtml, XMLNodeEntity * node); @@ -797,40 +802,77 @@ static int _ghtml_document_load(GHtml * ghtml, char const * url, free(ghtml->base); ghtml->base = NULL; surfer_set_title(ghtml->surfer, NULL); + if(strncmp(url, "file:", 5) == 0 || strncmp(url, "/", 1) == 0) + return _document_load_file(ghtml, &url[5]); + return _document_load_url(ghtml, url, post); +} + +static int _document_load_file(GHtml * ghtml, char const * filename) +{ + FILE * fp; + char buf[BUFSIZ]; + size_t size; + + if((fp = fopen(filename, "r")) == NULL) + return -error_set_code(1, "%s: %s", filename, strerror(errno)); + while((size = fread(buf, sizeof(*buf), sizeof(buf), fp)) > 0) + if(_document_load_write(ghtml, buf, size) != 0) + return -error_set_code(1, "%s: %s", filename, + strerror(errno)); + fclose(fp); + return _document_load_write_close(ghtml); +} + +static int _document_load_url(GHtml * ghtml, char const * url, + char const * post) +{ if((ghtml->conn = _conn_new(ghtml->surfer, url, post)) == NULL) return 1; - _conn_set_callback_write(ghtml->conn, _document_load_write, ghtml); - g_idle_add(_document_load_idle, ghtml); + _conn_set_callback_write(ghtml->conn, _document_load_url_write, ghtml); + g_idle_add(_document_load_url_idle, ghtml); return 0; } -static ssize_t _document_load_write(Conn * conn, char const * buf, size_t size, - gpointer data) +static ssize_t _document_load_url_write(Conn * conn, char const * buf, + size_t size, gpointer data) { GHtml * ghtml = data; - XMLPrefs prefs; - XML * xml; - XMLDocument * doc; + + if(size == 0) + return _document_load_write_close(ghtml); + if(_document_load_write(ghtml, buf, size) != 0) + return -1; + return size; +} + +static int _document_load_write(GHtml * ghtml, char const * buf, size_t size) +{ char * p; - memset(&prefs, 0, sizeof(prefs)); - prefs.filters |= XML_FILTER_WHITESPACE; - if(size == 0) - { - if((xml = xml_new_string(&prefs, ghtml->buffer, - ghtml->buffer_cnt)) == NULL) - return 0; - ghtml->position = GHTML_POSITION_BEFORE; - if((doc = xml_get_document(xml)) != NULL) - _document_load_write_node(ghtml, doc->root); - xml_delete(xml); - } if((p = realloc(ghtml->buffer, ghtml->buffer_cnt + size)) == NULL) return -error_set_code(1, "%s", strerror(errno)); ghtml->buffer = p; memcpy(&ghtml->buffer[ghtml->buffer_cnt], buf, size); ghtml->buffer_cnt += size; - return size; + return 0; +} + +static int _document_load_write_close(GHtml * ghtml) +{ + XMLPrefs prefs; + XML * xml; + XMLDocument * doc; + + memset(&prefs, 0, sizeof(prefs)); + prefs.filters |= XML_FILTER_WHITESPACE; + if((xml = xml_new_string(&prefs, ghtml->buffer, + ghtml->buffer_cnt)) == NULL) + return 0; + ghtml->position = GHTML_POSITION_BEFORE; + if((doc = xml_get_document(xml)) != NULL) + _document_load_write_node(ghtml, doc->root); + xml_delete(xml); + return 0; } static void _document_load_write_node(GHtml * ghtml, XMLNode * node) @@ -974,7 +1016,7 @@ static void _document_load_write_node_tag_link(GHtml * ghtml, XMLNodeTag * node) node->attributes[i]->value)); } -static gboolean _document_load_idle(gpointer data) +static gboolean _document_load_url_idle(gpointer data) { GHtml * ghtml = data;