LeechCraft  0.6.70-15082-g543737046d
Modular cross-platform feature rich live environment.
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>
14 #include <util/threads/futures.h>
15 #include "networkdiskcachegc.h"
16 
17 namespace 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 
35  qint64 NetworkDiskCache::cacheSize () const
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 
91  qint64 NetworkDiskCache::expire ()
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 }
LC::Util::GetUserDir
QDir GetUserDir(UserDir dir, const QString &subpath)
Definition: paths.cpp:103
LC::Util
Definition: icoreproxy.h:33
networkdiskcache.h
LC::Util::UserDir::Cache
@ Cache
Cache for volatile data.
futures.h
LC::Util::NetworkDiskCache::NetworkDiskCache
NetworkDiskCache(const QString &subpath, QObject *parent=nullptr)
Constructs the new disk cache.
Definition: networkdiskcache.cpp:33
paths.h
networkdiskcachegc.h