25 #include <QTemporaryFile> 31 #include <QtCore/QTimer> 32 #include <QtCore/QFile> 34 #include <sys/types.h> 39 #ifndef KHTML_PAGE_CACHE_SIZE 40 #define KHTML_PAGE_CACHE_SIZE 12 44 class KHTMLPageCacheEntry
48 KHTMLPageCacheEntry(
long id);
50 ~KHTMLPageCacheEntry();
52 void addData(
const QByteArray &data);
55 bool isComplete()
const {
return m_complete;}
56 QString fileName()
const {
return m_fileName;}
67 class KHTMLPageCachePrivate
74 QQueue<long> expireQueue;
77 KHTMLPageCacheEntry::KHTMLPageCacheEntry(
long id)
84 m_fileName=f->fileName();
85 f->setAutoRemove(
false);
89 m_file->open(QIODevice::WriteOnly);
92 KHTMLPageCacheEntry::~KHTMLPageCacheEntry()
95 QFile::remove(m_fileName);
100 KHTMLPageCacheEntry::addData(
const QByteArray &data)
106 KHTMLPageCacheEntry::endData()
109 m_file->write(m_buffer);
116 KHTMLPageCacheEntry::fetchData(
QObject *recvObj,
const char *recvSlot)
122 delivery->
file->open(QIODevice::ReadOnly);
124 recvObj->connect(delivery, SIGNAL(emitData(QByteArray)), recvSlot);
136 KHTMLPageCache::KHTMLPageCache()
137 :
d( new KHTMLPageCachePrivate)
140 d->deliveryActive =
false;
146 qDeleteAll(d->delivery);
154 KHTMLPageCacheEntry *entry =
new KHTMLPageCacheEntry(d->newId);
155 d->dict.insert(d->newId, entry);
156 d->expireQueue.append(d->newId);
158 delete d->dict.take(d->expireQueue.dequeue());
166 KHTMLPageCacheEntry *entry = d->dict.value(
id );
168 entry->addData(data);
174 KHTMLPageCacheEntry *entry = d->dict.value(
id );
182 KHTMLPageCacheEntry *entry = d->dict.take(
id );
185 d->expireQueue.removeAll(entry->m_id);
193 return d->dict.contains(
id);
199 KHTMLPageCacheEntry *entry = d->dict.value(
id );
201 return entry->isComplete();
208 KHTMLPageCacheEntry *entry = d->dict.value(
id );
209 if (!entry || !entry->isComplete())
return;
212 d->expireQueue.removeAll(entry->m_id);
213 d->expireQueue.enqueue(entry->m_id);
215 d->delivery.append( entry->fetchData(recvObj, recvSlot) );
216 if (!d->deliveryActive)
218 d->deliveryActive =
true;
219 QTimer::singleShot(20,
this, SLOT(sendData()));
226 QMutableListIterator<KHTMLPageCacheDelivery*> it( d->delivery );
227 while (it.hasNext()) {
229 if (delivery->
recvObj == recvObj)
238 KHTMLPageCache::sendData()
240 if (d->delivery.isEmpty())
242 d->deliveryActive =
false;
249 QByteArray byteArray(delivery->
file->read(64*1024));
253 if (delivery->
file->atEnd())
256 delivery->
file->close();
261 d->delivery.append( delivery );
263 QTimer::singleShot(0,
this, SLOT(sendData()));
269 assert(d->dict.contains(
id ));
270 KHTMLPageCacheEntry *entry = d->dict.value(
id );
272 if (!entry->isComplete())
274 QTimer::singleShot(20,
this, SLOT(
saveData()));
279 if (!file->open(QIODevice::ReadOnly))
282 QByteArray byteArray(file->readAll());
285 str->writeRawData(byteArray.constData(), byteArray.length());
295 #include "khtml_pagecache.moc" static QIODevice * deviceForFile(const QString &fileName, const QString &mimetype=QString(), bool forceFilter=false)
void fetchData(long id, QObject *recvObj, const char *recvSlot)
Fetch data for cache entry id and send it to slot recvSlot in the object recvObj.
static KHTMLPageCache * self()
static "constructor".
void emitData(const QByteArray &data)
#define K_GLOBAL_STATIC(TYPE, NAME)
void cancelFetch(QObject *recvObj)
Cancel sending data to recvObj.
void cancelEntry(long id)
Cancel the entry.
Singleton Object that handles a binary cache on top of the http cache management of kio.
static QString locateLocal(const char *type, const QString &filename, const KComponentData &cData=KGlobal::mainComponent())
long createCacheEntry()
Create a new cache entry.
#define KHTML_PAGE_CACHE_SIZE
void saveData(long id, QDataStream *str)
Save the data of cache entry id to the datastream str.
void addData(long id, const QByteArray &data)
Add data to the cache entry with id id.
~KHTMLPageCacheDelivery()
void endData(long id)
Signal end of data for the cache entry with id id.