summary refs log tree commit diff
path: root/src/timeline/widgets
diff options
context:
space:
mode:
authorKonstantinos Sideris <sideris.konstantin@gmail.com>2018-06-17 19:18:12 +0300
committerKonstantinos Sideris <sideris.konstantin@gmail.com>2018-06-17 19:18:12 +0300
commit8704265978572e60f8b04d89cec2f404f5ea4113 (patch)
treef1e272705c26ce2b0121d6fffccd60f98246b84d /src/timeline/widgets
parentAdd Visual Studio 2017 support (#336) (diff)
parentUpdate build instructions (diff)
downloadnheko-8704265978572e60f8b04d89cec2f404f5ea4113.tar.xz
Merge branch 'e2ee'
- Support for e2ee rooms
- Implement categories & file logging
- Let the user know when the app can't reach the server (#93)

fixes #13
fixes #326
Diffstat (limited to 'src/timeline/widgets')
-rw-r--r--src/timeline/widgets/AudioItem.cc39
-rw-r--r--src/timeline/widgets/FileItem.cc51
-rw-r--r--src/timeline/widgets/ImageItem.cc146
-rw-r--r--src/timeline/widgets/VideoItem.cc17
4 files changed, 132 insertions, 121 deletions
diff --git a/src/timeline/widgets/AudioItem.cc b/src/timeline/widgets/AudioItem.cc

index 65ca401b..7cbbed28 100644 --- a/src/timeline/widgets/AudioItem.cc +++ b/src/timeline/widgets/AudioItem.cc
@@ -16,13 +16,13 @@ */ #include <QBrush> -#include <QDebug> #include <QDesktopServices> #include <QFile> #include <QFileDialog> #include <QPainter> #include <QPixmap> +#include "Logging.hpp" #include "MatrixClient.h" #include "Utils.h" @@ -50,21 +50,12 @@ AudioItem::init() playIcon_.addFile(":/icons/icons/ui/play-sign.png"); pauseIcon_.addFile(":/icons/icons/ui/pause-symbol.png"); - QList<QString> url_parts = url_.toString().split("mxc://"); - if (url_parts.size() != 2) { - qDebug() << "Invalid format for image" << url_.toString(); - return; - } - - QString media_params = url_parts[1]; - url_ = QString("%1/_matrix/media/r0/download/%2") - .arg(http::client()->getHomeServer().toString(), media_params); - player_ = new QMediaPlayer; player_->setMedia(QUrl(url_)); player_->setVolume(100); player_->setNotifyInterval(1000); + connect(this, &AudioItem::fileDownloadedCb, this, &AudioItem::fileDownloaded); connect(player_, &QMediaPlayer::stateChanged, this, [this](QMediaPlayer::State state) { if (state == QMediaPlayer::StoppedState) { state_ = AudioState::Play; @@ -129,14 +120,20 @@ AudioItem::mousePressEvent(QMouseEvent *event) if (filenameToSave_.isEmpty()) return; - auto proxy = http::client()->downloadFile(url_); - connect(proxy.data(), - &DownloadMediaProxy::fileDownloaded, - this, - [proxy, this](const QByteArray &data) { - proxy->deleteLater(); - fileDownloaded(data); - }); + http::v2::client()->download( + url_.toString().toStdString(), + [this](const std::string &data, + const std::string &, + const std::string &, + mtx::http::RequestErr err) { + if (err) { + nhlog::net()->info("failed to retrieve m.audio content: {}", + url_.toString().toStdString()); + return; + } + + emit fileDownloadedCb(QByteArray(data.data(), data.size())); + }); } } @@ -151,8 +148,8 @@ AudioItem::fileDownloaded(const QByteArray &data) file.write(data); file.close(); - } catch (const std::exception &ex) { - qDebug() << "Error while saving file to:" << ex.what(); + } catch (const std::exception &e) { + nhlog::ui()->warn("error while saving file: {}", e.what()); } } diff --git a/src/timeline/widgets/FileItem.cc b/src/timeline/widgets/FileItem.cc
index f3906a04..4ce4d256 100644 --- a/src/timeline/widgets/FileItem.cc +++ b/src/timeline/widgets/FileItem.cc
@@ -16,13 +16,13 @@ */ #include <QBrush> -#include <QDebug> #include <QDesktopServices> #include <QFile> #include <QFileDialog> #include <QPainter> #include <QPixmap> +#include "Logging.hpp" #include "MatrixClient.h" #include "Utils.h" @@ -49,17 +49,9 @@ FileItem::init() icon_.addFile(":/icons/icons/ui/arrow-pointing-down.png"); - QList<QString> url_parts = url_.toString().split("mxc://"); - if (url_parts.size() != 2) { - qDebug() << "Invalid format for image" << url_.toString(); - return; - } - - QString media_params = url_parts[1]; - url_ = QString("%1/_matrix/media/r0/download/%2") - .arg(http::client()->getHomeServer().toString(), media_params); - setFixedHeight(Height); + + connect(this, &FileItem::fileDownloadedCb, this, &FileItem::fileDownloaded); } FileItem::FileItem(const mtx::events::RoomEvent<mtx::events::msg::File> &event, QWidget *parent) @@ -89,8 +81,15 @@ FileItem::openUrl() if (url_.toString().isEmpty()) return; - if (!QDesktopServices::openUrl(url_)) - qWarning() << "Could not open url" << url_.toString(); + auto mxc_parts = mtx::client::utils::parse_mxc_url(url_.toString().toStdString()); + auto urlToOpen = QString("https://%1:%2/_matrix/media/r0/download/%3/%4") + .arg(QString::fromStdString(http::v2::client()->server())) + .arg(http::v2::client()->port()) + .arg(QString::fromStdString(mxc_parts.server)) + .arg(QString::fromStdString(mxc_parts.media_id)); + + if (!QDesktopServices::openUrl(urlToOpen)) + nhlog::ui()->warn("Could not open url: {}", urlToOpen.toStdString()); } QSize @@ -115,14 +114,20 @@ FileItem::mousePressEvent(QMouseEvent *event) if (filenameToSave_.isEmpty()) return; - auto proxy = http::client()->downloadFile(url_); - connect(proxy.data(), - &DownloadMediaProxy::fileDownloaded, - this, - [proxy, this](const QByteArray &data) { - proxy->deleteLater(); - fileDownloaded(data); - }); + http::v2::client()->download( + url_.toString().toStdString(), + [this](const std::string &data, + const std::string &, + const std::string &, + mtx::http::RequestErr err) { + if (err) { + nhlog::ui()->warn("failed to retrieve m.file content: {}", + url_.toString().toStdString()); + return; + } + + emit fileDownloadedCb(QByteArray(data.data(), data.size())); + }); } else { openUrl(); } @@ -139,8 +144,8 @@ FileItem::fileDownloaded(const QByteArray &data) file.write(data); file.close(); - } catch (const std::exception &ex) { - qDebug() << "Error while saving file to:" << ex.what(); + } catch (const std::exception &e) { + nhlog::ui()->warn("Error while saving file to: {}", e.what()); } } diff --git a/src/timeline/widgets/ImageItem.cc b/src/timeline/widgets/ImageItem.cc
index 66cd31ab..bf1c05d6 100644 --- a/src/timeline/widgets/ImageItem.cc +++ b/src/timeline/widgets/ImageItem.cc
@@ -16,7 +16,6 @@ */ #include <QBrush> -#include <QDebug> #include <QDesktopServices> #include <QFileDialog> #include <QFileInfo> @@ -25,42 +24,71 @@ #include <QUuid> #include "Config.h" +#include "Logging.hpp" #include "MatrixClient.h" #include "Utils.h" #include "dialogs/ImageOverlay.h" #include "timeline/widgets/ImageItem.h" -ImageItem::ImageItem(const mtx::events::RoomEvent<mtx::events::msg::Image> &event, QWidget *parent) - : QWidget(parent) - , event_{event} +void +ImageItem::downloadMedia(const QUrl &url) { - setMouseTracking(true); - setCursor(Qt::PointingHandCursor); - setAttribute(Qt::WA_Hover, true); + http::v2::client()->download(url.toString().toStdString(), + [this, url](const std::string &data, + const std::string &, + const std::string &, + mtx::http::RequestErr err) { + if (err) { + nhlog::net()->warn( + "failed to retrieve image {}: {} {}", + url.toString().toStdString(), + err->matrix_error.error, + static_cast<int>(err->status_code)); + return; + } - url_ = QString::fromStdString(event.content.url); - text_ = QString::fromStdString(event.content.body); + QPixmap img; + img.loadFromData(QByteArray(data.data(), data.size())); + emit imageDownloaded(img); + }); +} - QList<QString> url_parts = url_.toString().split("mxc://"); +void +ImageItem::saveImage(const QString &filename, const QByteArray &data) +{ + try { + QFile file(filename); - if (url_parts.size() != 2) { - qDebug() << "Invalid format for image" << url_.toString(); - return; + if (!file.open(QIODevice::WriteOnly)) + return; + + file.write(data); + file.close(); + } catch (const std::exception &e) { + nhlog::ui()->warn("Error while saving file to: {}", e.what()); } +} - QString media_params = url_parts[1]; - url_ = QString("%1/_matrix/media/r0/download/%2") - .arg(http::client()->getHomeServer().toString(), media_params); +void +ImageItem::init() +{ + setMouseTracking(true); + setCursor(Qt::PointingHandCursor); + setAttribute(Qt::WA_Hover, true); - auto proxy = http::client()->downloadImage(url_); + connect(this, &ImageItem::imageDownloaded, this, &ImageItem::setImage); + connect(this, &ImageItem::imageSaved, this, &ImageItem::saveImage); + downloadMedia(url_); +} - connect(proxy.data(), - &DownloadMediaProxy::imageDownloaded, - this, - [this, proxy](const QPixmap &img) { - proxy->deleteLater(); - setImage(img); - }); +ImageItem::ImageItem(const mtx::events::RoomEvent<mtx::events::msg::Image> &event, QWidget *parent) + : QWidget(parent) + , event_{event} +{ + url_ = QString::fromStdString(event.content.url); + text_ = QString::fromStdString(event.content.body); + + init(); } ImageItem::ImageItem(const QString &url, const QString &filename, uint64_t size, QWidget *parent) @@ -69,31 +97,7 @@ ImageItem::ImageItem(const QString &url, const QString &filename, uint64_t size, , text_{filename} { Q_UNUSED(size); - - setMouseTracking(true); - setCursor(Qt::PointingHandCursor); - setAttribute(Qt::WA_Hover, true); - - QList<QString> url_parts = url_.toString().split("mxc://"); - - if (url_parts.size() != 2) { - qDebug() << "Invalid format for image" << url_.toString(); - return; - } - - QString media_params = url_parts[1]; - url_ = QString("%1/_matrix/media/r0/download/%2") - .arg(http::client()->getHomeServer().toString(), media_params); - - auto proxy = http::client()->downloadImage(url_); - - connect(proxy.data(), - &DownloadMediaProxy::imageDownloaded, - this, - [proxy, this](const QPixmap &img) { - proxy->deleteLater(); - setImage(img); - }); + init(); } void @@ -102,8 +106,15 @@ ImageItem::openUrl() if (url_.toString().isEmpty()) return; - if (!QDesktopServices::openUrl(url_)) - qWarning() << "Could not open url" << url_.toString(); + auto mxc_parts = mtx::client::utils::parse_mxc_url(url_.toString().toStdString()); + auto urlToOpen = QString("https://%1:%2/_matrix/media/r0/download/%3/%4") + .arg(QString::fromStdString(http::v2::client()->server())) + .arg(http::v2::client()->port()) + .arg(QString::fromStdString(mxc_parts.server)) + .arg(QString::fromStdString(mxc_parts.media_id)); + + if (!QDesktopServices::openUrl(urlToOpen)) + nhlog::ui()->warn("could not open url: {}", urlToOpen.toStdString()); } QSize @@ -231,23 +242,22 @@ ImageItem::saveAs() if (filename.isEmpty()) return; - auto proxy = http::client()->downloadFile(url_); - connect(proxy.data(), - &DownloadMediaProxy::fileDownloaded, - this, - [proxy, filename](const QByteArray &data) { - proxy->deleteLater(); - - try { - QFile file(filename); + const auto url = url_.toString().toStdString(); - if (!file.open(QIODevice::WriteOnly)) - return; + http::v2::client()->download( + url, + [this, filename, url](const std::string &data, + const std::string &, + const std::string &, + mtx::http::RequestErr err) { + if (err) { + nhlog::net()->warn("failed to retrieve image {}: {} {}", + url, + err->matrix_error.error, + static_cast<int>(err->status_code)); + return; + } - file.write(data); - file.close(); - } catch (const std::exception &ex) { - qDebug() << "Error while saving file to:" << ex.what(); - } - }); + emit imageSaved(filename, QByteArray(data.data(), data.size())); + }); } diff --git a/src/timeline/widgets/VideoItem.cc b/src/timeline/widgets/VideoItem.cc
index f5bcfd6e..34d963a9 100644 --- a/src/timeline/widgets/VideoItem.cc +++ b/src/timeline/widgets/VideoItem.cc
@@ -15,7 +15,6 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#include <QDebug> #include <QLabel> #include <QVBoxLayout> @@ -27,15 +26,15 @@ void VideoItem::init() { - QList<QString> url_parts = url_.toString().split("mxc://"); - if (url_parts.size() != 2) { - qDebug() << "Invalid format for image" << url_.toString(); - return; - } + // QList<QString> url_parts = url_.toString().split("mxc://"); + // if (url_parts.size() != 2) { + // qDebug() << "Invalid format for image" << url_.toString(); + // return; + // } - QString media_params = url_parts[1]; - url_ = QString("%1/_matrix/media/r0/download/%2") - .arg(http::client()->getHomeServer().toString(), media_params); + // QString media_params = url_parts[1]; + // url_ = QString("%1/_matrix/media/r0/download/%2") + // .arg(http::client()->getHomeServer().toString(), media_params); } VideoItem::VideoItem(const mtx::events::RoomEvent<mtx::events::msg::Video> &event, QWidget *parent)