summaryrefslogtreecommitdiff
path: root/desktop/cache.c
diff options
context:
space:
mode:
authorJames Bursa <james@netsurf-browser.org>2002-11-02 22:28:05 +0000
committerJames Bursa <james@netsurf-browser.org>2002-11-02 22:28:05 +0000
commit24080add5c78f09e0604b7ae180ec52209c86d1e (patch)
tree56c08122691d2c35ee50bdd490d7b92290e75c1f /desktop/cache.c
parentc009c7111c99ff78c5116f874a57a9ac7daf960d (diff)
downloadnetsurf-24080add5c78f09e0604b7ae180ec52209c86d1e.tar.gz
netsurf-24080add5c78f09e0604b7ae180ec52209c86d1e.tar.bz2
[project @ 2002-11-02 22:28:05 by bursa]
Memory cache. svn path=/import/netsurf/; revision=47
Diffstat (limited to 'desktop/cache.c')
-rw-r--r--desktop/cache.c128
1 files changed, 128 insertions, 0 deletions
diff --git a/desktop/cache.c b/desktop/cache.c
new file mode 100644
index 000000000..012683ebe
--- /dev/null
+++ b/desktop/cache.c
@@ -0,0 +1,128 @@
+/**
+ * $Id: cache.c,v 1.1 2002/11/02 22:28:05 bursa Exp $
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "netsurf/desktop/cache.h"
+#include "netsurf/render/utils.h"
+#include "netsurf/utils/log.h"
+#include "curl/curl.h"
+#include "ubiqx/ubi_Cache.h"
+
+/**
+ * internal structures and declarations
+ */
+
+ubi_cacheRoot memcache;
+
+struct memcache_entry {
+ ubi_cacheEntry Node;
+ char * url;
+ struct content * content;
+};
+
+static int memcache_compare(ubi_trItemPtr item, ubi_trNode * node);
+void memcache_free(ubi_trNode * node);
+
+
+/**
+ * cache_init -- initialise the cache manager
+ */
+
+void cache_init(void)
+{
+ /* memory cache */
+ ubi_cacheInit(&memcache, memcache_compare, memcache_free, 40, 100*1024);
+}
+
+
+/**
+ * cache_quit -- terminate the cache manager
+ */
+
+void cache_quit(void)
+{
+ ubi_cacheClear(&memcache);
+}
+
+
+/**
+ * cache_get -- retrieve url from memory cache or disc cache
+ */
+
+struct content * cache_get(char * const url)
+{
+ struct memcache_entry * entry;
+
+ entry = (struct memcache_entry *) ubi_cacheGet(&memcache, url);
+ if (entry != 0) {
+ LOG(("url %s in cache, node %p", url, entry));
+ entry->content->ref_count++;
+ return entry->content;
+ }
+
+ LOG(("url %s not cached", url));
+
+ /* TODO: check disc cache */
+
+ return 0;
+}
+
+
+/**
+ * cache_put -- place content in the memory cache
+ */
+
+void cache_put(char * const url, struct content * content, unsigned long size)
+{
+ struct memcache_entry * entry;
+
+ entry = xcalloc(1, sizeof(struct memcache_entry));
+ entry->url = xstrdup(url);
+ entry->content = content;
+ content->ref_count = 2; /* cache, caller */
+ ubi_cachePut(&memcache, size,
+ (ubi_cacheEntry *) entry, entry->url);
+}
+
+
+/**
+ * cache_free -- free a cache object if it is no longer used
+ */
+
+void cache_free(struct content * content)
+{
+ LOG(("content %p, ref_count %u", content, content->ref_count));
+ if (--content->ref_count == 0) {
+ LOG(("ref count 0, freeing"));
+ content_destroy(content);
+ }
+}
+
+
+/**
+ * memory cache
+ */
+
+static int memcache_compare(ubi_trItemPtr item, ubi_trNode * node)
+{
+ return strcmp((char *) item, ((struct memcache_entry *) node)->url);
+}
+
+
+void memcache_free(ubi_trNode * node)
+{
+ struct memcache_entry * entry = (struct memcache_entry *) node;
+
+ LOG(("node %p, node->url %s", node, entry->url));
+
+ cache_free(entry->content);
+ free(entry->url);
+ free(entry);
+
+ /* TODO: place the object in a disc cache */
+}
+
+