summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Sanders <vince@netsurf-browser.org>2014-02-07 15:04:11 +0000
committerVincent Sanders <vince@netsurf-browser.org>2014-02-07 15:04:11 +0000
commitb351e3146b8a2700e0ca511d7c75a02ab9189912 (patch)
tree2dedfea8cb6ab1d63672e84a288a4ae77919eea3
parentbb9f91caf9c16db960456efd843013236d02cbc7 (diff)
downloadnetsurf-b351e3146b8a2700e0ca511d7c75a02ab9189912.tar.gz
add llcache operation table
-rw-r--r--content/llcache.c18
-rw-r--r--desktop/gui.h12
-rw-r--r--desktop/gui_factory.c44
3 files changed, 70 insertions, 4 deletions
diff --git a/content/llcache.c b/content/llcache.c
index a97d3ccd2..3fbe5ec0b 100644
--- a/content/llcache.c
+++ b/content/llcache.c
@@ -1638,7 +1638,10 @@ static nserror llcache_fetch_ssl_error(llcache_object *object)
#define LLCACHE_MIN_DISC_LIFETIME 3600
#define LLCACHE_MAX_DISC_BANDWIDTH (512*1024)
-nserror write_llcache_file(nsurl *url, const uint8_t *data, size_t datalen)
+static nserror write_llcache_file(nsurl *url,
+ int remaining,
+ const uint8_t *data,
+ size_t datalen)
{
LOG(("Writing cache file for url:%s", nsurl_access(url)));
return NSERROR_OK;
@@ -1670,12 +1673,19 @@ static void llcache_discwrite(void *p)
(remaining_lifetime > LLCACHE_MIN_DISC_LIFETIME)) {
/* ok found an object to write */
ret = write_llcache_file(object->url,
+ remaining_lifetime,
object->source_data,
object->source_len);
- if (ret == NSERROR_OK) {
- object->store_state = LLCACHE_STORE_DISC;
- size_written += object->source_len;
+ if (ret != NSERROR_OK) {
+ /* as there has been a serialisation
+ * error, give up on making any more
+ * objects persistant for now.
+ */
+ return;
}
+ object->store_state = LLCACHE_STORE_DISC;
+ size_written += object->source_len;
+
if (size_written > LLCACHE_MAX_DISC_BANDWIDTH) {
break;
}
diff --git a/desktop/gui.h b/desktop/gui.h
index 162b51cd3..42a1ae588 100644
--- a/desktop/gui.h
+++ b/desktop/gui.h
@@ -446,6 +446,10 @@ struct gui_browser_table {
};
+struct gui_llcache_table {
+ nserror (*persist)(struct nsurl *url, int remaining, const uint8_t *data, size_t datalen);
+ nserror (*retrieve)(struct nsurl *url, int *remaining_out, const uint8_t **data_out, size_t *datalen_out);
+};
/** Graphical user interface function table
*
@@ -479,6 +483,14 @@ struct gui_table {
* implies the local encoding is utf8.
*/
struct gui_utf8_table *utf8;
+
+ /** Low level cache table
+ *
+ * Used by the low level cache to push objects to persistant
+ * storage. The table is optional and may be NULL which
+ * disables persistant caching of objects
+ */
+ struct gui_llcache_table *llcache;
};
diff --git a/desktop/gui_factory.c b/desktop/gui_factory.c
index 8996ab5d6..f8be89aad 100644
--- a/desktop/gui_factory.c
+++ b/desktop/gui_factory.c
@@ -343,6 +343,40 @@ static nserror verify_utf8_register(struct gui_utf8_table *gut)
return NSERROR_OK;
}
+static nserror gui_default_persist(nsurl *url, int remaining, const uint8_t *data, size_t datalen)
+{
+ return NSERROR_SAVE_FAILED;
+}
+
+static nserror gui_default_retrieve(nsurl *url, int *remaining_out, const uint8_t **data_out, size_t *datalen_out)
+{
+ return NSERROR_NOT_FOUND;
+}
+
+static struct gui_llcache_table default_llcache_table = {
+ .persist = gui_default_persist,
+ .retrieve = gui_default_retrieve,
+};
+
+/** verify clipboard table is valid */
+static nserror verify_llcache_register(struct gui_llcache_table *glt)
+{
+ /* check table is present */
+ if (glt == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+
+ /* mandantory operations */
+ if (glt->persist == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+ if (glt->retrieve == NULL) {
+ return NSERROR_BAD_PARAMETER;
+ }
+ return NSERROR_OK;
+}
+
+
static nsurl *gui_default_get_resource_url(const char *path)
{
return NULL;
@@ -529,6 +563,16 @@ nserror gui_factory_register(struct gui_table *gt)
return err;
}
+ /* llcache table */
+ if (gt->llcache == NULL) {
+ /* set default clipboard table */
+ gt->llcache = &default_llcache_table;
+ }
+ err = verify_llcache_register(gt->llcache);
+ if (err != NSERROR_OK) {
+ return err;
+ }
+
guit = gt;
return NSERROR_OK;