-
Notifications
You must be signed in to change notification settings - Fork 1
/
cachingnetworkmanagerfactory.cpp
39 lines (30 loc) · 1.87 KB
/
cachingnetworkmanagerfactory.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include "cachingnetworkmanagerfactory.h"
#include <QNetworkDiskCache>
#include <QNetworkAccessManager>
#include <QStandardPaths>
CachingNetworkAccessManager::CachingNetworkAccessManager(QObject *parent)
: QNetworkAccessManager(parent)
{ }
QNetworkReply* CachingNetworkAccessManager::createRequest(Operation op, const QNetworkRequest &request, QIODevice *outgoingData)
{
// 1. Самый простой вариант - кэшировать все. Ломает загрузку JSON.
//return QNetworkAccessManager::createRequest(op, request, outgoingData);
// 2. Продвинутый вариант, когда JSON явно грузится всегда, картинки предпочтительно по сети.
// QNetworkRequest req(request);
// req.setAttribute(QNetworkRequest::CacheLoadControlAttribute, request.url().fileName().endsWith(QLatin1String("png")) ?
// QNetworkRequest::PreferNetwork : QNetworkRequest::AlwaysNetwork);
// return QNetworkAccessManager::createRequest(op, req, outgoingData);
// 3. Компромиссный и простой вариант, когда всегда предпочитается интрнет, а кэш как fallback.
QNetworkRequest req(request);
req.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferNetwork);
return QNetworkAccessManager::createRequest(op, req, outgoingData);
}
CachingNetworkManagerFactory::CachingNetworkManagerFactory()
{ }
QNetworkAccessManager *CachingNetworkManagerFactory::create(QObject *parent) {
QNetworkAccessManager* manager = new CachingNetworkAccessManager(parent);
QNetworkDiskCache* cache = new QNetworkDiskCache(manager);
cache->setCacheDirectory(QString("%1/network").arg(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)));
manager->setCache(cache);
return manager;
}