LeechCraft 0.6.70-14794-g33744ae6ce
Modular cross-platform feature rich live environment.
Loading...
Searching...
No Matches
networkdiskcache.cpp
Go to the documentation of this file.
1/**********************************************************************
2 * LeechCraft - modular cross-platform feature rich internet client.
3 * Copyright (C) 2006-2014 Georg Rudoy
4 *
5 * Distributed under the Boost Software License, Version 1.0.
6 * (See accompanying file LICENSE or copy at https://www.boost.org/LICENSE_1_0.txt)
7 **********************************************************************/
8
9#include "networkdiskcache.h"
10#include <QtDebug>
11#include <QDir>
12#include <QMutexLocker>
13#include <util/sys/paths.h>
15#include "networkdiskcachegc.h"
16
17namespace LC::Util
18{
19 namespace
20 {
21 QString GetCacheDir (const QString& subpath)
22 {
23 return GetUserDir (UserDir::Cache, "network/" + subpath).absolutePath ();
24 }
25 }
26
27 NetworkDiskCache::NetworkDiskCache (const QString& subpath, QObject *parent)
28 : QNetworkDiskCache (parent)
29 , CurrentSize_ (-1)
30 , InsertRemoveMutex_ (QMutex::Recursive)
31 , GcGuard_ (NetworkDiskCacheGC::Instance ().RegisterDirectory (GetCacheDir (subpath),
32 [this] { return maximumCacheSize (); }))
33 {
34 setCacheDirectory (GetCacheDir (subpath));
35 }
36
38 {
39 return CurrentSize_;
40 }
41
42 QIODevice* NetworkDiskCache::data (const QUrl& url)
43 {
44 QMutexLocker lock (&InsertRemoveMutex_);
45 return QNetworkDiskCache::data (url);
46 }
47
48 void NetworkDiskCache::insert (QIODevice *device)
49 {
50 QMutexLocker lock (&InsertRemoveMutex_);
51 if (!PendingDev2Url_.contains (device))
52 {
53 qWarning () << Q_FUNC_INFO
54 << "stall device detected";
55 return;
56 }
57
58 PendingUrl2Devs_ [PendingDev2Url_.take (device)].removeAll (device);
59
60 CurrentSize_ += device->size ();
61 QNetworkDiskCache::insert (device);
62 }
63
64 QNetworkCacheMetaData NetworkDiskCache::metaData (const QUrl& url)
65 {
66 QMutexLocker lock (&InsertRemoveMutex_);
67 return QNetworkDiskCache::metaData (url);
68 }
69
70 QIODevice* NetworkDiskCache::prepare (const QNetworkCacheMetaData& metadata)
71 {
72 QMutexLocker lock (&InsertRemoveMutex_);
73 const auto dev = QNetworkDiskCache::prepare (metadata);
74 PendingDev2Url_ [dev] = metadata.url ();
75 PendingUrl2Devs_ [metadata.url ()] << dev;
76 return dev;
77 }
78
79 bool NetworkDiskCache::remove (const QUrl& url)
80 {
81 QMutexLocker lock (&InsertRemoveMutex_);
82 for (const auto dev : PendingUrl2Devs_.take (url))
83 PendingDev2Url_.remove (dev);
84 return QNetworkDiskCache::remove (url);
85 }
86
87 void NetworkDiskCache::updateMetaData (const QNetworkCacheMetaData& metaData)
88 {
89 QMutexLocker lock (&InsertRemoveMutex_);
90 QNetworkDiskCache::updateMetaData (metaData);
91 }
92
94 {
95 if (CurrentSize_ < 0)
96 {
97 const auto& dir = cacheDirectory ();
98 Util::Sequence (this, NetworkDiskCacheGC::Instance ().GetCurrentSize (dir)) >>
99 [this] (qint64 res) { CurrentSize_ = res; };
100
101 return maximumCacheSize () * 8 / 10;
102 }
103
104 return CurrentSize_;
105 }
106}
Garbage collection for a set of network disk caches.
static NetworkDiskCacheGC & Instance()
Returns a single global instance of the GC manager.
qint64 cacheSize() const override
Reimplemented from QNetworkDiskCache.
QIODevice * data(const QUrl &url) override
Reimplemented from QNetworkDiskCache.
bool remove(const QUrl &url) override
Reimplemented from QNetworkDiskCache.
void updateMetaData(const QNetworkCacheMetaData &metaData) override
Reimplemented from QNetworkDiskCache.
qint64 expire() override
Reimplemented from QNetworkDiskCache.
NetworkDiskCache(const QString &subpath, QObject *parent=nullptr)
Constructs the new disk cache.
QNetworkCacheMetaData metaData(const QUrl &url) override
Reimplemented from QNetworkDiskCache.
void insert(QIODevice *device) override
Reimplemented from QNetworkDiskCache.
QIODevice * prepare(const QNetworkCacheMetaData &) override
Reimplemented from QNetworkDiskCache.
@ Cache
Cache for volatile data.
QDir GetUserDir(UserDir dir, const QString &subpath)
Definition: paths.cpp:96