ADD : Caching as a preference
[semperweb:semperweb.git] / src / BrowserCache.cpp
1 #include "BrowserCache.h"
2
3 #include <QIODevice>
4 #include <QNetworkCacheMetaData>
5
6 BrowserCache::BrowserCache(QObject *parent) :
7     QAbstractNetworkCache(parent)
8 {
9     m_cache = new QCache<int, BrowserCacheItem>(3000000);
10 }
11
12 BrowserCache::~BrowserCache ()
13 {
14     delete m_cache;
15 }
16
17 qint64 BrowserCache::cacheSize() const
18 {
19     return m_cache->size();
20 }
21
22 QIODevice * BrowserCache::data(const QUrl &url)
23 {
24     BrowserCacheItem* a = m_cache->take(qHash(url.toString()));
25     if (!a)
26         return NULL;
27
28     QBuffer* buf = new QBuffer(&a->data);
29     buf->open(QIODevice::ReadWrite);
30     return buf;
31 }
32
33 void BrowserCache::insert(QIODevice *device)
34 {
35     if (!m_devices.contains(device)) {
36         delete device;
37         return;
38     }
39     BrowserCacheItem* c = m_devices.take(device);
40     m_cache->insert(qHash(c->meta.url().toString()), c, sizeof(BrowserCacheItem) + c->data.size());
41     delete device;
42 }
43
44 QNetworkCacheMetaData BrowserCache::metaData(const QUrl &url)
45 {
46     BrowserCacheItem* c = m_cache->object(qHash(url.toString()));
47     if (c)
48         return c->meta;
49     else {
50         QNetworkCacheMetaData ret;
51         return ret;
52     }
53
54 }
55
56 QIODevice * BrowserCache::prepare(const QNetworkCacheMetaData &metaData)
57 {
58     BrowserCacheItem* c = new BrowserCacheItem;
59     c->meta = metaData;
60     QBuffer* buf = new QBuffer(&c->data);
61     buf->open(QIODevice::ReadWrite);
62     m_devices[buf] = c;
63     return buf;
64 }
65
66 bool BrowserCache::remove(const QUrl &url)
67 {
68     return m_cache->remove(qHash(url.toString()));
69 }
70
71 void BrowserCache::updateMetaData(const QNetworkCacheMetaData &metaData)
72 {
73     BrowserCacheItem* c = m_cache->object(qHash(metaData.url().toString()));
74     if (c) {
75         c->meta = metaData;
76     }
77 }
78
79 void BrowserCache::clear()
80 {
81     m_cache->clear();
82 }
83
84