browsercore/core/network/featherweightcache_p.h
author hgs
Fri, 15 Oct 2010 17:30:59 -0400
changeset 16 3c88a81ff781
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16
hgs
parents:
diff changeset
     1
/****************************************************************************
hgs
parents:
diff changeset
     2
**
hgs
parents:
diff changeset
     3
 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     4
 *
hgs
parents:
diff changeset
     5
 * This file is part of Qt Web Runtime.
hgs
parents:
diff changeset
     6
 *
hgs
parents:
diff changeset
     7
 * This library is free software; you can redistribute it and/or
hgs
parents:
diff changeset
     8
 * modify it under the terms of the GNU Lesser General Public License
hgs
parents:
diff changeset
     9
 * version 2.1 as published by the Free Software Foundation.
hgs
parents:
diff changeset
    10
 *
hgs
parents:
diff changeset
    11
 * This library is distributed in the hope that it will be useful,
hgs
parents:
diff changeset
    12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
hgs
parents:
diff changeset
    13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
hgs
parents:
diff changeset
    14
 * Lesser General Public License for more details.
hgs
parents:
diff changeset
    15
 *
hgs
parents:
diff changeset
    16
 * You should have received a copy of the GNU Lesser General Public
hgs
parents:
diff changeset
    17
 * License along with this library; if not, write to the Free Software
hgs
parents:
diff changeset
    18
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
hgs
parents:
diff changeset
    19
 *
hgs
parents:
diff changeset
    20
 */
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
#ifndef FEATHERWEIGHTCACHE_P_H
hgs
parents:
diff changeset
    23
#define FEATHERWEIGHTCACHE_P_H
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
#include <QBuffer>
hgs
parents:
diff changeset
    26
#include <QHash>
hgs
parents:
diff changeset
    27
#include <QTemporaryFile>
hgs
parents:
diff changeset
    28
#include <QFile>
hgs
parents:
diff changeset
    29
#include <QNetworkCacheMetaData>
hgs
parents:
diff changeset
    30
#include <QObject>
hgs
parents:
diff changeset
    31
#include <QQueue>
hgs
parents:
diff changeset
    32
#include <QMutex>
hgs
parents:
diff changeset
    33
#include <QWaitCondition>
hgs
parents:
diff changeset
    34
#include <cacheworkerthread.h>
hgs
parents:
diff changeset
    35
hgs
parents:
diff changeset
    36
namespace WRT {
hgs
parents:
diff changeset
    37
class CacheItem
hgs
parents:
diff changeset
    38
{
hgs
parents:
diff changeset
    39
public:
hgs
parents:
diff changeset
    40
    CacheItem() : file(0)
hgs
parents:
diff changeset
    41
    {
hgs
parents:
diff changeset
    42
    }
hgs
parents:
diff changeset
    43
    ~CacheItem()
hgs
parents:
diff changeset
    44
    {
hgs
parents:
diff changeset
    45
        reset();
hgs
parents:
diff changeset
    46
    }
hgs
parents:
diff changeset
    47
hgs
parents:
diff changeset
    48
    QNetworkCacheMetaData metaData;
hgs
parents:
diff changeset
    49
    QBuffer data;
hgs
parents:
diff changeset
    50
    QTemporaryFile *file;
hgs
parents:
diff changeset
    51
    inline qint64 size() const
hgs
parents:
diff changeset
    52
        { return file ? file->size() : data.size(); }
hgs
parents:
diff changeset
    53
hgs
parents:
diff changeset
    54
    inline void reset() {
hgs
parents:
diff changeset
    55
        metaData = QNetworkCacheMetaData();
hgs
parents:
diff changeset
    56
        data.close();
hgs
parents:
diff changeset
    57
        delete file;
hgs
parents:
diff changeset
    58
        file = 0;
hgs
parents:
diff changeset
    59
    }
hgs
parents:
diff changeset
    60
    void writeHeader(QFile *device) const;
hgs
parents:
diff changeset
    61
    void writeCompressedData(QFile *device) const;
hgs
parents:
diff changeset
    62
    bool read(QFile *device, bool readData);
hgs
parents:
diff changeset
    63
hgs
parents:
diff changeset
    64
    bool canCompress() const;
hgs
parents:
diff changeset
    65
};
hgs
parents:
diff changeset
    66
hgs
parents:
diff changeset
    67
hgs
parents:
diff changeset
    68
class WorkerThread : public QThread
hgs
parents:
diff changeset
    69
{
hgs
parents:
diff changeset
    70
hgs
parents:
diff changeset
    71
    Q_OBJECT
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
public:
hgs
parents:
diff changeset
    74
    WorkerThread();
hgs
parents:
diff changeset
    75
    ~WorkerThread();
hgs
parents:
diff changeset
    76
hgs
parents:
diff changeset
    77
    void expireLazily(QString cacheDir, qint64 maxCacheSize);
hgs
parents:
diff changeset
    78
hgs
parents:
diff changeset
    79
protected:
hgs
parents:
diff changeset
    80
    void run();
hgs
parents:
diff changeset
    81
hgs
parents:
diff changeset
    82
private:
hgs
parents:
diff changeset
    83
    QMutex mutex;
hgs
parents:
diff changeset
    84
    QWaitCondition condition;
hgs
parents:
diff changeset
    85
    bool abort;
hgs
parents:
diff changeset
    86
    qint64 expireImpl();
hgs
parents:
diff changeset
    87
hgs
parents:
diff changeset
    88
    QString cacheDir;
hgs
parents:
diff changeset
    89
    qint64 maxCacheSize;
hgs
parents:
diff changeset
    90
hgs
parents:
diff changeset
    91
signals:
hgs
parents:
diff changeset
    92
    void onDiskSizeChanged(qint64 newSize);
hgs
parents:
diff changeset
    93
hgs
parents:
diff changeset
    94
};
hgs
parents:
diff changeset
    95
hgs
parents:
diff changeset
    96
hgs
parents:
diff changeset
    97
#define URL2HASH(url) FeatherWeightCachePrivate::generateId(url).toUInt()
hgs
parents:
diff changeset
    98
hgs
parents:
diff changeset
    99
// Assume this much higher physical disk usage. Platform and media dependent
hgs
parents:
diff changeset
   100
// TODO: On Symbian, we could instead round up number to multiple of TVolumeIOParamInfo.iClusterSize
hgs
parents:
diff changeset
   101
#define FILESYSTEMOVERHEAD 2048
hgs
parents:
diff changeset
   102
#define ROUNDUPTOMULTIPLE(x, multipleof)    ( (x + multipleof - 1) & ~(multipleof - 1) )
hgs
parents:
diff changeset
   103
hgs
parents:
diff changeset
   104
class FeatherWeightCachePrivate : public QObject
hgs
parents:
diff changeset
   105
{
hgs
parents:
diff changeset
   106
    Q_OBJECT
hgs
parents:
diff changeset
   107
hgs
parents:
diff changeset
   108
public:
hgs
parents:
diff changeset
   109
    FeatherWeightCachePrivate(QObject* parent): QObject(parent)
hgs
parents:
diff changeset
   110
        , maximumCacheSize(1024 * 1024 * 10) //set the maximum default cache to 10M 
hgs
parents:
diff changeset
   111
        , currentCacheSize(-1)
hgs
parents:
diff changeset
   112
    {
hgs
parents:
diff changeset
   113
        // Queued connection because onDiskSizeChanged() is currently always triggered from run() method of worker thread
hgs
parents:
diff changeset
   114
        QObject::connect( &beastOfBurden, SIGNAL( onDiskSizeChanged(qint64) ), this, SLOT( updateCacheSize(qint64) ), Qt::DirectConnection );
hgs
parents:
diff changeset
   115
    }
hgs
parents:
diff changeset
   116
hgs
parents:
diff changeset
   117
    ~FeatherWeightCachePrivate()
hgs
parents:
diff changeset
   118
    {
hgs
parents:
diff changeset
   119
        // When beastOfBurden's d'tor is called
hgs
parents:
diff changeset
   120
        // it will wait() and then auto-terminate
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
        QObject::disconnect(&beastOfBurden, SIGNAL( onDiskSizeChanged(qint64) ), this, SLOT( updateCacheSize(qint64)));
hgs
parents:
diff changeset
   123
    }
hgs
parents:
diff changeset
   124
hgs
parents:
diff changeset
   125
    qint64 expire();
hgs
parents:
diff changeset
   126
    static QByteArray generateId(const QUrl &url);
hgs
parents:
diff changeset
   127
    QString cacheFileName(const QUrl &url) const;
hgs
parents:
diff changeset
   128
    QString tmpCacheFileName() const;
hgs
parents:
diff changeset
   129
    bool removeFile(const QString &file);
hgs
parents:
diff changeset
   130
    void storeItem(CacheItem *item);
hgs
parents:
diff changeset
   131
    void prepareLayout();
hgs
parents:
diff changeset
   132
    static quint32 crc32(const char *data, uint len);
hgs
parents:
diff changeset
   133
hgs
parents:
diff changeset
   134
    mutable CacheItem lastItem;
hgs
parents:
diff changeset
   135
    QString cacheDirectory;
hgs
parents:
diff changeset
   136
    qint64 maximumCacheSize;
hgs
parents:
diff changeset
   137
    qint64 currentCacheSize;
hgs
parents:
diff changeset
   138
hgs
parents:
diff changeset
   139
    QHash<QIODevice*, CacheItem*> inserting;
hgs
parents:
diff changeset
   140
hgs
parents:
diff changeset
   141
    WorkerThread beastOfBurden;
hgs
parents:
diff changeset
   142
hgs
parents:
diff changeset
   143
    // a look up table (LUT) that stores file sizes
hgs
parents:
diff changeset
   144
    // corresponding to cached URLs. Helps speed up
hgs
parents:
diff changeset
   145
    // cache eviction or expiration logic.
hgs
parents:
diff changeset
   146
    // key = CRC32 hash of url , value = size of file on disk
hgs
parents:
diff changeset
   147
    // QHash<quint32, qint64> lut;
hgs
parents:
diff changeset
   148
hgs
parents:
diff changeset
   149
    // bool isTrimPending;
hgs
parents:
diff changeset
   150
hgs
parents:
diff changeset
   151
    //Recommended buffer sizes for fast IO on caching volume
hgs
parents:
diff changeset
   152
    struct {
hgs
parents:
diff changeset
   153
        quint32 readBufSize;
hgs
parents:
diff changeset
   154
        quint32 writeBufSize;
hgs
parents:
diff changeset
   155
        quint32 clusterSize;
hgs
parents:
diff changeset
   156
    } volumeInfo;
hgs
parents:
diff changeset
   157
hgs
parents:
diff changeset
   158
public slots:
hgs
parents:
diff changeset
   159
    void updateCacheSize(qint64);
hgs
parents:
diff changeset
   160
};
hgs
parents:
diff changeset
   161
}
hgs
parents:
diff changeset
   162
hgs
parents:
diff changeset
   163
#endif // FEATHERWEIGHTCACHE_P_H