diff --git a/src/app/avatarimageprovider.h b/src/app/avatarimageprovider.h index 7d72776e8f25ca991223484370909283517e52d8..277134a9016091bcdc1e5138161268e21f6261b1 100644 --- a/src/app/avatarimageprovider.h +++ b/src/app/avatarimageprovider.h @@ -53,21 +53,21 @@ public: return {}; } - auto imageId = idInfo.at(1); + const auto& imageId = idInfo.at(1); if (!imageId.size()) { qWarning() << Q_FUNC_INFO << "Missing id in the image url"; return {}; } - auto type = idInfo.at(0); + const auto& type = idInfo.at(0); if (type == "conversation") { if (imageId == "temp") return Utils::tempConversationAvatar(requestedSize); - return Utils::conversationAvatar(lrcInstance_, imageId, requestedSize); - } else if (type == "account") + } + if (type == "account") return Utils::accountPhoto(lrcInstance_, imageId, requestedSize); - else if (type == "contact") + if (type == "contact") return Utils::contactPhoto(lrcInstance_, imageId, requestedSize); qWarning() << Q_FUNC_INFO << "Missing valid prefix in the image url"; diff --git a/src/app/commoncomponents/Avatar.qml b/src/app/commoncomponents/Avatar.qml index c495487d18f4e985c74445acb2a2cf60676b29f7..846ed3d678f1196da388aafcfbe2c9787dae6d5d 100644 --- a/src/app/commoncomponents/Avatar.qml +++ b/src/app/commoncomponents/Avatar.qml @@ -38,7 +38,7 @@ Item { property string imageId readonly property string divider: '_' - readonly property string baseProviderPrefix: 'image://avatarImage' + readonly property string baseProviderPrefix: 'image://avatarimage' property string typePrefix: { switch (mode) { case Avatar.Mode.Account: diff --git a/src/app/commoncomponents/DataTransferMessageDelegate.qml b/src/app/commoncomponents/DataTransferMessageDelegate.qml index 969d89957cd198a3609b722626d88619675cce7c..bbedbabc764c1e417af441982bacb71861f5ec69 100644 --- a/src/app/commoncomponents/DataTransferMessageDelegate.qml +++ b/src/app/commoncomponents/DataTransferMessageDelegate.qml @@ -88,8 +88,11 @@ Loader { target: parent enabled: canOpen onHoveredChanged: { - dataTransferItem.hoveredLink = enabled && hovered ? - ("file:///" + Body) : "" + if (enabled && hovered) { + dataTransferItem.hoveredLink = UtilsAdapter.urlFromLocalPath(Body) + } else { + dataTransferItem.hoveredLink = "" + } } cursorShape: enabled ? Qt.PointingHandCursor : @@ -199,10 +202,12 @@ Loader { Qt.PointingHandCursor : Qt.ArrowCursor onClicked: function (mouse) { - dataTransferItem.hoveredLink = canOpen ? - ("file:///" + Body) : "" - if (dataTransferItem.hoveredLink) + if (canOpen) { + dataTransferItem.hoveredLink = UtilsAdapter.urlFromLocalPath(Body) Qt.openUrlExternally(new Url(dataTransferItem.hoveredLink)) + } else { + dataTransferItem.hoveredLink = "" + } } } } @@ -303,7 +308,7 @@ Loader { antialiasing: true autoTransform: true asynchronous: true - source: "file:///" + Body + source: UtilsAdapter.urlFromLocalPath(Body) property real aspectRatio: implicitWidth / implicitHeight property real adjustedWidth: Math.min(maxSize, Math.max(minSize, @@ -348,7 +353,7 @@ Loader { antialiasing: true autoTransform: true asynchronous: true - source: Body !== undefined ? "file:///" + Body : '' + source: Body !== undefined ? UtilsAdapter.urlFromLocalPath(Body) : '' // The sourceSize represents the maximum source dimensions. // This should not be a dynamic binding, as property changes diff --git a/src/app/imagedownloader.cpp b/src/app/imagedownloader.cpp index 9eb0784d50d64877c558223795dedbbb285c98b1..d0b66611c08d533e64c39930ccc66786357d28a1 100644 --- a/src/app/imagedownloader.cpp +++ b/src/app/imagedownloader.cpp @@ -16,6 +16,7 @@ */ #include "imagedownloader.h" + #include <QDir> #include <QLockFile> @@ -38,29 +39,29 @@ ImageDownloader::downloadImage(const QUrl& url, const QString& localPath) void ImageDownloader::onDownloadImageFinished(const QByteArray& data, const QString& localPath) { - if (!data.isEmpty()) { - // Check if the parent folders exist create them if not - QString dirPath = localPath.left(localPath.lastIndexOf('/')); - QDir dir; - dir.mkpath(dirPath); - - QLockFile lf(localPath + ".lock"); - QFile file(localPath); + if (data.isEmpty()) { + Q_EMIT downloadImageFailed(localPath); + return; + } - if (!lf.lock()) { - qWarning().noquote() << "Can't lock file for writing: " << file.fileName(); - return; - } - if (!file.open(QIODevice::WriteOnly)) { - qWarning().noquote() << "Can't open file for writing: " << file.fileName(); - return; - } + // Make sure the parent folders exists. + const QString dirPath = localPath.left(localPath.lastIndexOf('/')); + const QDir dir; + if (!dir.mkpath(dirPath)) { + qWarning() << Q_FUNC_INFO << "Failed to create directory" << dirPath; + Q_EMIT downloadImageFailed(localPath); + return; + } + QLockFile lf(localPath + ".lock"); + QFile file(localPath); + if (lf.lock() && file.open(QIODevice::WriteOnly)) { file.write(data); file.close(); - qWarning() << Q_FUNC_INFO; Q_EMIT downloadImageSuccessful(localPath); return; } + + qWarning() << Q_FUNC_INFO << "Failed to write image to" << localPath; Q_EMIT downloadImageFailed(localPath); } diff --git a/src/app/mainview/components/CachedImage.qml b/src/app/mainview/components/CachedImage.qml index 618277b165a8477a990f0b726ba6184c954e11c7..23f24f17e648430dd3950070cf0d84bf9e9b0031 100644 --- a/src/app/mainview/components/CachedImage.qml +++ b/src/app/mainview/components/CachedImage.qml @@ -42,7 +42,10 @@ Item { fillMode: imageFillMode smooth: true antialiasing: true - property bool isGif: getIsGif(this) + property bool isGif: { + // True only for local gifs. + UtilsAdapter.getMimeNameForUrl(source).startsWith("image/gif"); + } source: defaultImage onStatusChanged: { @@ -52,22 +55,11 @@ Item { } } - function getIsGif(img) { - if (img.source && img.source != "") { - var localPath = img.source.toString(); - if (localPath.startsWith("file://")) { - localPath = localPath.substring(7); - } - return UtilsAdapter.getMimeName(localPath).startsWith("image/gif"); - } - return false; - } - Connections { target: ImageDownloader function onDownloadImageSuccessful(localPath) { if (localPath === cachedImage.localPath) { - image.source = "file://" + localPath; + image.source = UtilsAdapter.urlFromLocalPath(localPath); } } } @@ -92,7 +84,7 @@ Item { if (!UtilsAdapter.fileExists(localPath)) { ImageDownloader.downloadImage(downloadUrl, localPath); } else { - image.source = "file://" + localPath; + image.source = UtilsAdapter.urlFromLocalPath(localPath); if (image.isGif) { image.playing = true; } diff --git a/src/app/qmlregister.cpp b/src/app/qmlregister.cpp index 6e2f3377b9121e5a23fde4e193777a10cc9c2f7a..7ebab391d79b46efbd0a7bb9d9921b3bcd4e8383 100644 --- a/src/app/qmlregister.cpp +++ b/src/app/qmlregister.cpp @@ -240,7 +240,7 @@ registerTypes(QQmlEngine* engine, QML_REGISTERUNCREATABLE(NS_ENUMS, VideoFormatFpsModel) engine->addImageProvider(QLatin1String("qrImage"), new QrImageProvider(lrcInstance)); - engine->addImageProvider(QLatin1String("avatarImage"), + engine->addImageProvider(QLatin1String("avatarimage"), new AvatarImageProvider(lrcInstance)); engine->setObjectOwnership(&lrcInstance->avModel(), QQmlEngine::CppOwnership); diff --git a/src/app/utils.cpp b/src/app/utils.cpp index 5d664a85ed2e692ec29c823aa6d8deb97716e5c1..5a12bf33d49cdd0a9e3912d3fe3d81c0263df2fd 100644 --- a/src/app/utils.cpp +++ b/src/app/utils.cpp @@ -850,10 +850,9 @@ Utils::QByteArrayFromFile(const QString& filename) } if (file.open(QIODevice::ReadOnly)) { return file.readAll(); - } else { - qDebug() << "QByteArrayFromFile: can't open file" << filename; - return QByteArray(); } + qDebug() << "QByteArrayFromFile: can't open file" << filename; + return {}; } QPixmap @@ -938,4 +937,4 @@ QString Utils::getPlatformString() { return "desktop"; -} \ No newline at end of file +} diff --git a/src/app/utilsadapter.cpp b/src/app/utilsadapter.cpp index aee1138a569646737dcf0e71a7a26e9577a3c71d..386a09d80db893c6860d6488c3217a102dd8d58e 100644 --- a/src/app/utilsadapter.cpp +++ b/src/app/utilsadapter.cpp @@ -857,15 +857,21 @@ UtilsAdapter::getStandardTempLocation() } QString -UtilsAdapter::getMimeName(const QString &filePath) const +UtilsAdapter::getMimeNameForUrl(const QUrl& fileUrl) const { QMimeDatabase db; - QMimeType mime = db.mimeTypeForFile(filePath); + QMimeType mime = db.mimeTypeForUrl(fileUrl); return mime.name(); } +QUrl +UtilsAdapter::urlFromLocalPath(const QString& filePath) const +{ + return QUrl::fromLocalFile(filePath); +} + #ifdef ENABLE_TESTS -//Must only be used for testing purposes +// Must only be used for testing purposes QString UtilsAdapter::createDummyImage() const { diff --git a/src/app/utilsadapter.h b/src/app/utilsadapter.h index 8aa5eea980e3db20c4995d6e62781778f979b9d2..6a01f510514dafc7e4a8d861196ba33440f205a2 100644 --- a/src/app/utilsadapter.h +++ b/src/app/utilsadapter.h @@ -156,7 +156,8 @@ public: Q_INVOKABLE QString base64Encode(const QString& input); Q_INVOKABLE bool fileExists(const QString& filePath); Q_INVOKABLE QString getStandardTempLocation(); - Q_INVOKABLE QString getMimeName(const QString& filePath) const; + Q_INVOKABLE QString getMimeNameForUrl(const QUrl& fileUrl) const; + Q_INVOKABLE QUrl urlFromLocalPath(const QString& filePath) const; #ifdef ENABLE_TESTS Q_INVOKABLE QString createDummyImage() const;