Now able to load local files as well
This commit is contained in:
parent
12bb4145d7
commit
810e634a8d
@ -761,9 +761,14 @@ void ghtml_zoom_reset(GtkWidget * widget)
|
|||||||
|
|
||||||
|
|
||||||
/* functions */
|
/* functions */
|
||||||
static ssize_t _document_load_write(Conn * conn, char const * buf, size_t size,
|
static int _document_load_file(GHtml * ghtml, char const * filename);
|
||||||
gpointer data);
|
static int _document_load_url(GHtml * ghtml, char const * url,
|
||||||
static gboolean _document_load_idle(gpointer data);
|
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(GHtml * ghtml, XMLNode * node);
|
||||||
static void _document_load_write_node_entity(GHtml * ghtml,
|
static void _document_load_write_node_entity(GHtml * ghtml,
|
||||||
XMLNodeEntity * node);
|
XMLNodeEntity * node);
|
||||||
@ -797,40 +802,77 @@ static int _ghtml_document_load(GHtml * ghtml, char const * url,
|
|||||||
free(ghtml->base);
|
free(ghtml->base);
|
||||||
ghtml->base = NULL;
|
ghtml->base = NULL;
|
||||||
surfer_set_title(ghtml->surfer, 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)
|
if((ghtml->conn = _conn_new(ghtml->surfer, url, post)) == NULL)
|
||||||
return 1;
|
return 1;
|
||||||
_conn_set_callback_write(ghtml->conn, _document_load_write, ghtml);
|
_conn_set_callback_write(ghtml->conn, _document_load_url_write, ghtml);
|
||||||
g_idle_add(_document_load_idle, ghtml);
|
g_idle_add(_document_load_url_idle, ghtml);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t _document_load_write(Conn * conn, char const * buf, size_t size,
|
static ssize_t _document_load_url_write(Conn * conn, char const * buf,
|
||||||
gpointer data)
|
size_t size, gpointer data)
|
||||||
{
|
{
|
||||||
GHtml * ghtml = data;
|
GHtml * ghtml = data;
|
||||||
XMLPrefs prefs;
|
|
||||||
XML * xml;
|
if(size == 0)
|
||||||
XMLDocument * doc;
|
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;
|
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)
|
if((p = realloc(ghtml->buffer, ghtml->buffer_cnt + size)) == NULL)
|
||||||
return -error_set_code(1, "%s", strerror(errno));
|
return -error_set_code(1, "%s", strerror(errno));
|
||||||
ghtml->buffer = p;
|
ghtml->buffer = p;
|
||||||
memcpy(&ghtml->buffer[ghtml->buffer_cnt], buf, size);
|
memcpy(&ghtml->buffer[ghtml->buffer_cnt], buf, size);
|
||||||
ghtml->buffer_cnt += 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)
|
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));
|
node->attributes[i]->value));
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean _document_load_idle(gpointer data)
|
static gboolean _document_load_url_idle(gpointer data)
|
||||||
{
|
{
|
||||||
GHtml * ghtml = data;
|
GHtml * ghtml = data;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user