|
|
|
@ -16,6 +16,8 @@ |
|
|
|
|
#include <QPainter> |
|
|
|
|
#include <QPainterPath> |
|
|
|
|
#include <QStandardPaths> |
|
|
|
|
#include <QThreadPool> |
|
|
|
|
#include <QTimer> |
|
|
|
|
|
|
|
|
|
#include "Logging.h" |
|
|
|
|
#include "MatrixClient.h" |
|
|
|
@ -23,6 +25,39 @@ |
|
|
|
|
|
|
|
|
|
QHash<QString, mtx::crypto::EncryptedFile> infos; |
|
|
|
|
|
|
|
|
|
MxcImageProvider::MxcImageProvider(QObject *parent) |
|
|
|
|
#if QT_VERSION < 0x60000 |
|
|
|
|
: QObject(parent) |
|
|
|
|
#else |
|
|
|
|
: QQuickAsyncImageProvider(parent) |
|
|
|
|
#endif |
|
|
|
|
{ |
|
|
|
|
auto timer = new QTimer(this); |
|
|
|
|
timer->setInterval(std::chrono::hours(30)); |
|
|
|
|
connect(timer, &QTimer::timeout, this, [] { |
|
|
|
|
QThreadPool::globalInstance()->start([] { |
|
|
|
|
QDir dir(QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + |
|
|
|
|
"/media_cache", |
|
|
|
|
"", |
|
|
|
|
QDir::SortFlags(QDir::Name | QDir::IgnoreCase), |
|
|
|
|
QDir::Filter::Writable | QDir::Filter::NoDotAndDotDot | QDir::Filter::Files); |
|
|
|
|
|
|
|
|
|
for (const auto &fileInfo : dir.entryInfoList()) { |
|
|
|
|
if (fileInfo.fileTime(QFile::FileTime::FileAccessTime) |
|
|
|
|
.daysTo(QDateTime::currentDateTime()) > 30) { |
|
|
|
|
if (QFile::remove(fileInfo.absoluteFilePath())) |
|
|
|
|
nhlog::net()->debug("Deleted stale media '{}'", |
|
|
|
|
fileInfo.absoluteFilePath().toStdString()); |
|
|
|
|
else |
|
|
|
|
nhlog::net()->warn("Failed to delete stale media '{}'", |
|
|
|
|
fileInfo.absoluteFilePath().toStdString()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
}); |
|
|
|
|
timer->start(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
QQuickImageResponse * |
|
|
|
|
MxcImageProvider::requestImageResponse(const QString &id, const QSize &requestedSize) |
|
|
|
|
{ |
|
|
|
@ -97,6 +132,24 @@ clipRadius(QImage img, double radius) |
|
|
|
|
return out; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void |
|
|
|
|
possiblyUpdateAccessTime(const QFileInfo &fileInfo) |
|
|
|
|
{ |
|
|
|
|
if (fileInfo.fileTime(QFile::FileTime::FileAccessTime).daysTo(QDateTime::currentDateTime()) > |
|
|
|
|
7) { |
|
|
|
|
nhlog::net()->debug("Updating file time for '{}'", |
|
|
|
|
fileInfo.absoluteFilePath().toStdString()); |
|
|
|
|
|
|
|
|
|
QFile f(fileInfo.absoluteFilePath()); |
|
|
|
|
|
|
|
|
|
if (!f.open(QIODevice::ReadWrite) || |
|
|
|
|
!f.setFileTime(QDateTime::currentDateTime(), QFile::FileTime::FileAccessTime)) { |
|
|
|
|
nhlog::net()->warn("Failed to update filetime for '{}'", |
|
|
|
|
fileInfo.absoluteFilePath().toStdString()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void |
|
|
|
|
MxcImageProvider::download(const QString &id, |
|
|
|
|
const QSize &requestedSize, |
|
|
|
@ -141,6 +194,8 @@ MxcImageProvider::download(const QString &id, |
|
|
|
|
if (fileInfo.exists()) { |
|
|
|
|
QImage image = utils::readImageFromFile(fileInfo.absoluteFilePath()); |
|
|
|
|
if (!image.isNull()) { |
|
|
|
|
possiblyUpdateAccessTime(fileInfo); |
|
|
|
|
|
|
|
|
|
if (requestedSize.width() <= 0) { |
|
|
|
|
image = image.scaledToHeight(requestedSize.height(), Qt::SmoothTransformation); |
|
|
|
|
} else { |
|
|
|
@ -185,6 +240,8 @@ MxcImageProvider::download(const QString &id, |
|
|
|
|
auto data = QByteArray(res.data(), (int)res.size()); |
|
|
|
|
QImage image = utils::readImage(data); |
|
|
|
|
if (!image.isNull()) { |
|
|
|
|
possiblyUpdateAccessTime(fileInfo); |
|
|
|
|
|
|
|
|
|
if (requestedSize.width() <= 0) { |
|
|
|
|
image = |
|
|
|
|
image.scaledToHeight(requestedSize.height(), Qt::SmoothTransformation); |
|
|
|
@ -238,6 +295,7 @@ MxcImageProvider::download(const QString &id, |
|
|
|
|
QImage image = utils::readImage(data); |
|
|
|
|
image.setText(QStringLiteral("mxc url"), "mxc://" + id); |
|
|
|
|
if (!image.isNull()) { |
|
|
|
|
possiblyUpdateAccessTime(fileInfo); |
|
|
|
|
if (radius != 0) { |
|
|
|
|
image = clipRadius(std::move(image), radius); |
|
|
|
|
} |
|
|
|
@ -248,6 +306,7 @@ MxcImageProvider::download(const QString &id, |
|
|
|
|
} else { |
|
|
|
|
QImage image = utils::readImageFromFile(fileInfo.absoluteFilePath()); |
|
|
|
|
if (!image.isNull()) { |
|
|
|
|
possiblyUpdateAccessTime(fileInfo); |
|
|
|
|
if (radius != 0) { |
|
|
|
|
image = clipRadius(std::move(image), radius); |
|
|
|
|
} |
|
|
|
|