LeechCraft 0.6.70-16373-g319c272718
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 , GcGuard_ (NetworkDiskCacheGC::Instance ().RegisterDirectory (GetCacheDir (subpath),
30 [this] { return maximumCacheSize (); }))
31 {
32 setCacheDirectory (GetCacheDir (subpath));
33 }
34
36 {
37 return CurrentSize_;
38 }
39
40 QIODevice* NetworkDiskCache::data (const QUrl& url)
41 {
42 QMutexLocker lock (&InsertRemoveMutex_);
43 return QNetworkDiskCache::data (url);
44 }
45
46 void NetworkDiskCache::insert (QIODevice *device)
47 {
48 QMutexLocker lock (&InsertRemoveMutex_);
49 if (!PendingDev2Url_.contains (device))
50 {
51 qWarning () << Q_FUNC_INFO
52 << "stall device detected";
53 return;
54 }
55
56 PendingUrl2Devs_ [PendingDev2Url_.take (device)].removeAll (device);
57
58 CurrentSize_ += device->size ();
59 QNetworkDiskCache::insert (device);
60 }
61
62 QNetworkCacheMetaData NetworkDiskCache::metaData (const QUrl& url)
63 {
64 QMutexLocker lock (&InsertRemoveMutex_);
65 return QNetworkDiskCache::metaData (url);
66 }
67
68 QIODevice* NetworkDiskCache::prepare (const QNetworkCacheMetaData& metadata)
69 {
70 QMutexLocker lock (&InsertRemoveMutex_);
71 const auto dev = QNetworkDiskCache::prepare (metadata);
72 PendingDev2Url_ [dev] = metadata.url ();
73 PendingUrl2Devs_ [metadata.url ()] << dev;
74 return dev;
75 }
76
77 bool NetworkDiskCache::remove (const QUrl& url)
78 {
79 QMutexLocker lock (&InsertRemoveMutex_);
80 for (const auto dev : PendingUrl2Devs_.take (url))
81 PendingDev2Url_.remove (dev);
82 return QNetworkDiskCache::remove (url);
83 }
84
85 void NetworkDiskCache::updateMetaData (const QNetworkCacheMetaData& metaData)
86 {
87 QMutexLocker lock (&InsertRemoveMutex_);
88 QNetworkDiskCache::updateMetaData (metaData);
89 }
90
92 {
93 if (CurrentSize_ < 0)
94 {
95 const auto& dir = cacheDirectory ();
96 Util::Sequence (this, NetworkDiskCacheGC::Instance ().GetCurrentSize (dir)) >>
97 [this] (qint64 res) { CurrentSize_ = res; };
98
99 return maximumCacheSize () * 8 / 10;
100 }
101
102 return CurrentSize_;
103 }
104}
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.
Definition paths.h:151
QDir GetUserDir(UserDir dir, const QString &subpath)
Definition paths.cpp:97