From 94441e68fde86977a70d60c735b1363c8b61ba08 Mon Sep 17 00:00:00 2001
From: Thulinma <jaron@vietors.com>
Date: Tue, 28 Sep 2021 01:42:35 +0200
Subject: [PATCH] Support pasting image/svg+xml format straight from supporting
 applications

---
 src/dialogs/PreviewUploadOverlay.cpp |  7 +++++++
 src/timeline/InputBar.cpp            | 15 +++++++++++++--
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/src/dialogs/PreviewUploadOverlay.cpp b/src/dialogs/PreviewUploadOverlay.cpp
index e850c03bc..2e95bd911 100644
--- a/src/dialogs/PreviewUploadOverlay.cpp
+++ b/src/dialogs/PreviewUploadOverlay.cpp
@@ -158,6 +158,8 @@ PreviewUploadOverlay::setPreview(const QImage &src, const QString &mime)
 void
 PreviewUploadOverlay::setPreview(const QByteArray data, const QString &mime)
 {
+    nhlog::ui()->info("Pasting {} bytes of data, mimetype {}", data.size(), mime.toStdString());
+
     auto const &split = mime.split('/');
     auto const &type  = split[1];
 
@@ -166,6 +168,11 @@ PreviewUploadOverlay::setPreview(const QByteArray data, const QString &mime)
     filePath_  = "clipboard." + type;
     isImage_   = false;
 
+    if (mime == "image/svg+xml") {
+        isImage_ = true;
+        image_.loadFromData(data_, mediaType_.toStdString().c_str());
+    }
+
     setLabels(type, mime, data_.size());
     init();
 }
diff --git a/src/timeline/InputBar.cpp b/src/timeline/InputBar.cpp
index c83bb19c9..f518248be 100644
--- a/src/timeline/InputBar.cpp
+++ b/src/timeline/InputBar.cpp
@@ -68,7 +68,11 @@ InputBar::insertMimeData(const QMimeData *md)
     const auto video   = formats.filter("video/", Qt::CaseInsensitive);
 
     if (md->hasImage()) {
-        showPreview(*md, "", image);
+        if (formats.contains("image/svg+xml", Qt::CaseInsensitive)) {
+            showPreview(*md, "", QStringList("image/svg+xml"));
+        } else {
+            showPreview(*md, "", image);
+        }
     } else if (!audio.empty()) {
         showPreview(*md, "", audio);
     } else if (!video.empty()) {
@@ -651,7 +655,8 @@ InputBar::showPreview(const QMimeData &source, QString path, const QStringList &
       new dialogs::PreviewUploadOverlay(ChatPage::instance());
     previewDialog_->setAttribute(Qt::WA_DeleteOnClose);
 
-    if (source.hasImage()) {
+    // Force SVG to _not_ be handled as an image, but as raw data
+    if (source.hasImage() && (!formats.size() || formats.front() != "image/svg+xml")) {
         if (formats.size() && formats.front().startsWith("image/")) {
             // known format, keep as-is
             previewDialog_->setPreview(qvariant_cast<QImage>(source.imageData()), formats.front());
@@ -679,6 +684,12 @@ InputBar::showPreview(const QMimeData &source, QString path, const QStringList &
       &dialogs::PreviewUploadOverlay::confirmUpload,
       this,
       [this](const QByteArray data, const QString &mime, const QString &fn) {
+          if (!data.size()) {
+              nhlog::ui()->warn("Attempted to upload zero-byte file?! Mimetype {}, filename {}",
+                                mime.toStdString(),
+                                fn.toStdString());
+              return;
+          }
           setUploading(true);
 
           setText("");
-- 
GitLab