on xenial help sign in
Hook up with QNetworkConfigurationManager
e15bd64Michal Hruby
src/CachingNetworkManagerFactory.cpp+33−4
@@ -20,15 +20,44 @@
20#include <QNetworkDiskCache>
20#include <QNetworkDiskCache>
21#include <QNetworkAccessManager>
21#include <QNetworkAccessManager>
22#include <QStandardPaths>
22#include <QStandardPaths>
23+#include <QThread>
24+#include <QNetworkConfigurationManager>
25+
26+CachingNetworkAccessManager::CachingNetworkAccessManager(QObject *parent)
27+ : QNetworkAccessManager(parent)
28+{
29+ m_networkManager = new QNetworkConfigurationManager(this);
30+
31+ QObject::connect(m_networkManager, &QNetworkConfigurationManager::onlineStateChanged, this, &CachingNetworkAccessManager::onlineStateChanged);
32+ m_isOnline = m_networkManager->isOnline();
33+}
34+
35+void CachingNetworkAccessManager::onlineStateChanged(bool isOnline)
36+{
37+ m_isOnline = isOnline;
38+}
39+
40+QNetworkReply* CachingNetworkAccessManager::createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData)
41+{
42+ if (!m_isOnline) {
43+ QNetworkRequest req(request);
44+ req.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysCache);
45+ return QNetworkAccessManager::createRequest(op, req, outgoingData);
46+ }
47+
48+ return QNetworkAccessManager::createRequest(op, request, outgoingData);
49+}
23
50
24CachingNetworkManagerFactory::CachingNetworkManagerFactory()
51CachingNetworkManagerFactory::CachingNetworkManagerFactory()
25− : m_cache(new QNetworkDiskCache())
26{
52{
27− m_cache->setCacheDirectory(QString("%1/network").arg(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)));
28}
53}
29
54
30QNetworkAccessManager *CachingNetworkManagerFactory::create(QObject *parent) {
55QNetworkAccessManager *CachingNetworkManagerFactory::create(QObject *parent) {
31− QNetworkAccessManager *manager = new QNetworkAccessManager(parent);
56+ QNetworkAccessManager *manager = new CachingNetworkAccessManager(parent);
57+
58+ QNetworkDiskCache* cache = new QNetworkDiskCache(manager);
59+ cache->setCacheDirectory(QString("%1/network").arg(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)));
60+
32− manager->setCache(m_cache);
61+ manager->setCache(cache);
33 return manager;
62 return manager;
34}
63}
src/CachingNetworkManagerFactory.h+18−5
@@ -19,9 +19,25 @@
19#define CACHINGNETWORKMANAGERFACTORY_H
19#define CACHINGNETWORKMANAGERFACTORY_H
20
20
21#include <QQmlNetworkAccessManagerFactory>
21#include <QQmlNetworkAccessManagerFactory>
22+#include <QNetworkAccessManager>
22
23
23−class QNetworkDiskCache;
24+class QNetworkConfigurationManager;
25+
24−class QNetworkAccessManager;
26+class CachingNetworkAccessManager : public QNetworkAccessManager
27+{
28+public:
29+ CachingNetworkAccessManager(QObject *parent = 0);
30+
31+protected:
32+ QNetworkReply* createRequest(Operation op, const QNetworkRequest &req, QIODevice *outgoingData = 0) override;
33+
34+private Q_SLOTS:
35+ void onlineStateChanged(bool isOnline);
36+
37+private:
38+ QNetworkConfigurationManager* m_networkManager;
39+ bool m_isOnline;
40+};
25
41
26class CachingNetworkManagerFactory : public QQmlNetworkAccessManagerFactory
42class CachingNetworkManagerFactory : public QQmlNetworkAccessManagerFactory
27{
43{
@@ -29,9 +45,6 @@ public:
29 CachingNetworkManagerFactory();
45 CachingNetworkManagerFactory();
30
46
31 QNetworkAccessManager *create(QObject *parent) override;
47 QNetworkAccessManager *create(QObject *parent) override;
32−
33−private:
34− QNetworkDiskCache *m_cache;
35};
48};
36
49
37#endif // CACHINGNETWORKMANAGERFACTORY_H
50#endif // CACHINGNETWORKMANAGERFACTORY_H