Mladen Milinkovic
11 years ago
4 changed files with 138 additions and 3 deletions
@ -0,0 +1,92 @@
@@ -0,0 +1,92 @@
|
||||
#include "htmlbrowser.h" |
||||
|
||||
#include <QDebug> |
||||
#include <QNetworkRequest> |
||||
#include <QNetworkReply> |
||||
#include <QNetworkDiskCache> |
||||
#include <QStyle> |
||||
#include <QApplication> |
||||
#include <QDir> |
||||
#include <QDateTime> |
||||
#include <QScrollBar> |
||||
|
||||
#include "fs_utils.h" |
||||
|
||||
HtmlBrowser::HtmlBrowser(QWidget* parent) |
||||
: QTextBrowser(parent) |
||||
{ |
||||
m_netManager = new QNetworkAccessManager(this); |
||||
m_diskCache = new QNetworkDiskCache(this); |
||||
m_diskCache->setCacheDirectory(QDir::cleanPath(fsutils::cacheLocation() + "/browser")); |
||||
m_diskCache->setMaximumCacheSize(50 * 1024 * 1024); |
||||
qDebug() << "HtmlBrowser cache path:" << m_diskCache->cacheDirectory() << " max size:" << m_diskCache->maximumCacheSize() / 1024 / 1024 << "MB"; |
||||
m_netManager->setCache(m_diskCache); |
||||
|
||||
connect(m_netManager, SIGNAL(finished(QNetworkReply *)), this, SLOT(resourceLoaded(QNetworkReply*))); |
||||
} |
||||
|
||||
HtmlBrowser::~HtmlBrowser() |
||||
{ |
||||
} |
||||
|
||||
QVariant HtmlBrowser::loadResource(int type, const QUrl &name) |
||||
{ |
||||
if(type == QTextDocument::ImageResource) { |
||||
QUrl url(name); |
||||
if(url.scheme().isEmpty()) |
||||
url.setScheme("http"); |
||||
|
||||
QIODevice *dev = m_diskCache->data(url); |
||||
if(dev != 0) { |
||||
qDebug() << "HtmlBrowser::loadResource() cache " << url.toString(); |
||||
QByteArray res = dev->readAll(); |
||||
delete dev; |
||||
return res; |
||||
} |
||||
|
||||
if(!m_activeRequests.contains(url)) { |
||||
m_activeRequests.insert(url, true); |
||||
qDebug() << "HtmlBrowser::loadResource() get " << url.toString(); |
||||
QNetworkRequest req(url); |
||||
req.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::PreferCache); |
||||
m_netManager->get(req); |
||||
} |
||||
|
||||
return QVariant(); |
||||
} |
||||
|
||||
return QTextBrowser::loadResource(type, name); |
||||
} |
||||
|
||||
void HtmlBrowser::resourceLoaded(QNetworkReply *reply) |
||||
{ |
||||
m_activeRequests.remove(reply->request().url()); |
||||
|
||||
if(reply->error() == QNetworkReply::NoError && reply->size() > 0) { |
||||
qDebug() << "HtmlBrowser::resourceLoaded() save " << reply->request().url().toString(); |
||||
} else { |
||||
// If resource failed to load, replace it with warning icon and store it in cache for 1 day.
|
||||
// Otherwise HTMLBrowser will keep trying to download it every time article is displayed,
|
||||
// since it's not possible to cache error responses.
|
||||
QNetworkCacheMetaData metaData; |
||||
QNetworkCacheMetaData::AttributesMap atts; |
||||
metaData.setUrl(reply->request().url()); |
||||
metaData.setSaveToDisk(true); |
||||
atts[QNetworkRequest::HttpStatusCodeAttribute] = 200; |
||||
atts[QNetworkRequest::HttpReasonPhraseAttribute] = "Ok"; |
||||
metaData.setAttributes(atts); |
||||
metaData.setLastModified(QDateTime::currentDateTime()); |
||||
metaData.setExpirationDate(QDateTime::currentDateTime().addDays(1)); |
||||
QIODevice *dev = m_diskCache->prepare(metaData); |
||||
if(!dev) |
||||
return; |
||||
QApplication::style()->standardIcon(QStyle::SP_MessageBoxWarning).pixmap(32, 32).save(dev, "PNG"); |
||||
m_diskCache->insert(dev); |
||||
} |
||||
// Refresh the document display and keep scrollbars where they are
|
||||
int sx = horizontalScrollBar()->value(); |
||||
int sy = verticalScrollBar()->value(); |
||||
document()->setHtml(document()->toHtml()); |
||||
horizontalScrollBar()->setValue(sx); |
||||
verticalScrollBar()->setValue(sy); |
||||
} |
@ -0,0 +1,30 @@
@@ -0,0 +1,30 @@
|
||||
#ifndef HTMLBROWSER_H |
||||
#define HTMLBROWSER_H |
||||
|
||||
#include <QTextBrowser> |
||||
#include <QHash> |
||||
|
||||
class QNetworkAccessManager; |
||||
class QNetworkDiskCache; |
||||
class QNetworkReply; |
||||
|
||||
class HtmlBrowser : public QTextBrowser |
||||
{ |
||||
Q_OBJECT |
||||
|
||||
public: |
||||
explicit HtmlBrowser(QWidget* parent = 0); |
||||
~HtmlBrowser(); |
||||
|
||||
virtual QVariant loadResource(int type, const QUrl &name); |
||||
|
||||
protected: |
||||
QNetworkAccessManager *m_netManager; |
||||
QNetworkDiskCache *m_diskCache; |
||||
QHash<QUrl, bool> m_activeRequests; |
||||
|
||||
protected slots: |
||||
void resourceLoaded(QNetworkReply *reply); |
||||
}; |
||||
|
||||
#endif // HTMLBROWSER_H
|
Loading…
Reference in new issue