summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ChatPage.cc11
-rw-r--r--src/MatrixClient.cc115
-rw-r--r--src/TextInputWidget.cc23
-rw-r--r--src/timeline/TimelineView.cc12
-rw-r--r--src/timeline/TimelineViewManager.cc16
-rw-r--r--src/timeline/widgets/AudioItem.cc3
-rw-r--r--src/timeline/widgets/FileItem.cc3
7 files changed, 132 insertions, 51 deletions
diff --git a/src/ChatPage.cc b/src/ChatPage.cc

index 340e75c3..f773ff2c 100644 --- a/src/ChatPage.cc +++ b/src/ChatPage.cc
@@ -192,6 +192,10 @@ ChatPage::ChatPage(QSharedPointer<MatrixClient> client, QWidget *parent) client_->uploadFile(current_room_, filename); }); + connect(text_input_, &TextInputWidget::uploadAudio, this, [=](QString filename) { + client_->uploadAudio(current_room_, filename); + }); + connect(client_.data(), &MatrixClient::joinFailed, this, &ChatPage::showNotification); connect(client_.data(), &MatrixClient::imageUploaded, @@ -207,6 +211,13 @@ ChatPage::ChatPage(QSharedPointer<MatrixClient> client, QWidget *parent) text_input_->hideUploadSpinner(); view_manager_->queueFileMessage(roomid, filename, url); }); + connect(client_.data(), + &MatrixClient::audioUploaded, + this, + [=](QString roomid, QString filename, QString url) { + text_input_->hideUploadSpinner(); + view_manager_->queueAudioMessage(roomid, filename, url); + }); connect(client_.data(), SIGNAL(roomAvatarRetrieved(const QString &, const QPixmap &)), diff --git a/src/MatrixClient.cc b/src/MatrixClient.cc
index 66630c80..3326a47f 100644 --- a/src/MatrixClient.cc +++ b/src/MatrixClient.cc
@@ -265,6 +265,7 @@ MatrixClient::sendRoomMessage(matrix::events::MessageEventType ty, int txnId, const QString &roomid, const QString &msg, + const QFileInfo &fileinfo, const QString &url) noexcept { QUrlQuery query; @@ -276,7 +277,13 @@ MatrixClient::sendRoomMessage(matrix::events::MessageEventType ty, endpoint.setQuery(query); QString msgType(""); + + QMimeDatabase db; + QMimeType mime = + db.mimeTypeForFile(fileinfo.absoluteFilePath(), QMimeDatabase::MatchContent); + QJsonObject body; + QJsonObject info = {{"size", fileinfo.size()}, {"mimetype", mime.name()}}; switch (ty) { case matrix::events::MessageEventType::Text: @@ -286,10 +293,13 @@ MatrixClient::sendRoomMessage(matrix::events::MessageEventType ty, body = {{"msgtype", "m.emote"}, {"body", msg}}; break; case matrix::events::MessageEventType::Image: - body = {{"msgtype", "m.image"}, {"body", msg}, {"url", url}}; + body = {{"msgtype", "m.image"}, {"body", msg}, {"url", url}, {"info", info}}; break; case matrix::events::MessageEventType::File: - body = {{"msgtype", "m.file"}, {"body", msg}, {"url", url}}; + body = {{"msgtype", "m.file"}, {"body", msg}, {"url", url}, {"info", info}}; + break; + case matrix::events::MessageEventType::Audio: + body = {{"msgtype", "m.audio"}, {"body", msg}, {"url", url}, {"info", info}}; break; default: qDebug() << "SendRoomMessage: Unknown message type for" << msg; @@ -706,26 +716,11 @@ MatrixClient::messages(const QString &roomid, const QString &from_token, int lim void MatrixClient::uploadImage(const QString &roomid, const QString &filename) { - QUrlQuery query; - query.addQueryItem("access_token", token_); + auto reply = makeUploadRequest(filename); - QUrl endpoint(server_); - endpoint.setPath(mediaApiUrl_ + "/upload"); - endpoint.setQuery(query); - - QFile file(filename); - if (!file.open(QIODevice::ReadWrite)) { - qDebug() << "Error while reading" << filename; + if (reply == nullptr) return; - } - - auto imgFormat = QString(QImageReader::imageFormat(filename)); - - QNetworkRequest request(QString(endpoint.toEncoded())); - request.setHeader(QNetworkRequest::ContentLengthHeader, file.size()); - request.setHeader(QNetworkRequest::ContentTypeHeader, QString("image/%1").arg(imgFormat)); - auto reply = post(request, file.readAll()); connect(reply, &QNetworkReply::finished, this, [this, reply, roomid, filename]() { reply->deleteLater(); @@ -762,27 +757,46 @@ MatrixClient::uploadImage(const QString &roomid, const QString &filename) void MatrixClient::uploadFile(const QString &roomid, const QString &filename) { - QUrlQuery query; - query.addQueryItem("access_token", token_); + auto reply = makeUploadRequest(filename); - QUrl endpoint(server_); - endpoint.setPath(mediaApiUrl_ + "/upload"); - endpoint.setQuery(query); + connect(reply, &QNetworkReply::finished, this, [this, reply, roomid, filename]() { + reply->deleteLater(); - QFile file(filename); - if (!file.open(QIODevice::ReadWrite)) { - qDebug() << "Error while reading" << filename; - return; - } + int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); - QMimeDatabase db; - QMimeType mime = db.mimeTypeForFile(filename, QMimeDatabase::MatchContent); + if (status == 0 || status >= 400) { + emit syncFailed(reply->errorString()); + return; + } - QNetworkRequest request(QString(endpoint.toEncoded())); - request.setHeader(QNetworkRequest::ContentLengthHeader, file.size()); - request.setHeader(QNetworkRequest::ContentTypeHeader, mime.name()); + auto data = reply->readAll(); + + if (data.isEmpty()) + return; + + auto json = QJsonDocument::fromJson(data); + + if (!json.isObject()) { + qDebug() << "Media upload: Response is not a json object."; + return; + } + + QJsonObject object = json.object(); + if (!object.contains("content_uri")) { + qDebug() << "Media upload: Missing content_uri key"; + qDebug() << object; + return; + } + + emit fileUploaded(roomid, filename, object.value("content_uri").toString()); + }); +} + +void +MatrixClient::uploadAudio(const QString &roomid, const QString &filename) +{ + auto reply = makeUploadRequest(filename); - auto reply = post(request, file.readAll()); connect(reply, &QNetworkReply::finished, this, [this, reply, roomid, filename]() { reply->deleteLater(); @@ -812,9 +826,10 @@ MatrixClient::uploadFile(const QString &roomid, const QString &filename) return; } - emit fileUploaded(roomid, filename, object.value("content_uri").toString()); + emit audioUploaded(roomid, filename, object.value("content_uri").toString()); }); } + void MatrixClient::joinRoom(const QString &roomIdOrAlias) { @@ -961,3 +976,31 @@ MatrixClient::readEvent(const QString &room_id, const QString &event_id) } }); } + +QNetworkReply * +MatrixClient::makeUploadRequest(const QString &filename) +{ + QUrlQuery query; + query.addQueryItem("access_token", token_); + + QUrl endpoint(server_); + endpoint.setPath(mediaApiUrl_ + "/upload"); + endpoint.setQuery(query); + + QFile file(filename); + if (!file.open(QIODevice::ReadWrite)) { + qDebug() << "Error while reading" << filename; + return nullptr; + } + + QMimeDatabase db; + QMimeType mime = db.mimeTypeForFile(filename, QMimeDatabase::MatchContent); + + QNetworkRequest request(QString(endpoint.toEncoded())); + request.setHeader(QNetworkRequest::ContentLengthHeader, file.size()); + request.setHeader(QNetworkRequest::ContentTypeHeader, mime.name()); + + auto reply = post(request, file.readAll()); + + return reply; +} diff --git a/src/TextInputWidget.cc b/src/TextInputWidget.cc
index 2f6c435a..dc2bebe7 100644 --- a/src/TextInputWidget.cc +++ b/src/TextInputWidget.cc
@@ -20,6 +20,8 @@ #include <QFile> #include <QFileDialog> #include <QImageReader> +#include <QMimeDatabase> +#include <QMimeType> #include <QPainter> #include <QStyleOption> @@ -276,24 +278,21 @@ TextInputWidget::command(QString command, QString args) void TextInputWidget::openFileSelection() { - QStringList imageExtensions; - imageExtensions << "jpeg" - << "gif" - << "png" - << "bmp" - << "tiff" - << "webp"; - - auto fileName = - QFileDialog::getOpenFileName(this, tr("Select an file"), "", tr("All Files (*)")); + const auto fileName = + QFileDialog::getOpenFileName(this, tr("Select a file"), "", tr("All Files (*)")); if (fileName.isEmpty()) return; - auto format = QString(QImageReader::imageFormat(fileName)); + QMimeDatabase db; + QMimeType mime = db.mimeTypeForFile(fileName, QMimeDatabase::MatchContent); + + const auto format = mime.name().split("/")[0]; - if (imageExtensions.contains(format)) + if (format == "image") emit uploadImage(fileName); + else if (format == "audio") + emit uploadAudio(fileName); else emit uploadFile(fileName); diff --git a/src/timeline/TimelineView.cc b/src/timeline/TimelineView.cc
index e5fd7f88..af7c0f7f 100644 --- a/src/timeline/TimelineView.cc +++ b/src/timeline/TimelineView.cc
@@ -436,13 +436,19 @@ TimelineView::sendNextPendingMessage() PendingMessage &m = pending_msgs_.head(); switch (m.ty) { + case matrix::events::MessageEventType::Audio: case matrix::events::MessageEventType::Image: case matrix::events::MessageEventType::File: - client_->sendRoomMessage( - m.ty, m.txn_id, room_id_, QFileInfo(m.filename).fileName(), m.body); + // FIXME: Improve the API + client_->sendRoomMessage(m.ty, + m.txn_id, + room_id_, + QFileInfo(m.filename).fileName(), + QFileInfo(m.filename), + m.body); break; default: - client_->sendRoomMessage(m.ty, m.txn_id, room_id_, m.body); + client_->sendRoomMessage(m.ty, m.txn_id, room_id_, m.body, QFileInfo()); break; } } diff --git a/src/timeline/TimelineViewManager.cc b/src/timeline/TimelineViewManager.cc
index 39f07639..281cafcd 100644 --- a/src/timeline/TimelineViewManager.cc +++ b/src/timeline/TimelineViewManager.cc
@@ -27,6 +27,7 @@ #include "timeline/TimelineView.h" #include "timeline/TimelineViewManager.h" +#include "timeline/widgets/AudioItem.h" #include "timeline/widgets/FileItem.h" #include "timeline/widgets/ImageItem.h" @@ -114,6 +115,21 @@ TimelineViewManager::queueFileMessage(const QString &roomid, } void +TimelineViewManager::queueAudioMessage(const QString &roomid, + const QString &filename, + const QString &url) +{ + if (!views_.contains(roomid)) { + qDebug() << "Cannot send m.audio message to a non-managed view"; + return; + } + + auto view = views_[roomid]; + + view->addUserMessage<AudioItem, matrix::events::MessageEventType::Audio>(url, filename); +} + +void TimelineViewManager::clearAll() { for (auto view : views_) diff --git a/src/timeline/widgets/AudioItem.cc b/src/timeline/widgets/AudioItem.cc
index 7c4b2d48..2a417b3e 100644 --- a/src/timeline/widgets/AudioItem.cc +++ b/src/timeline/widgets/AudioItem.cc
@@ -107,6 +107,9 @@ AudioItem::AudioItem(QSharedPointer<MatrixClient> client, QString AudioItem::calculateFileSize(int nbytes) const { + if (nbytes == 0) + return QString(""); + if (nbytes < 1024) return QString("%1 B").arg(nbytes); diff --git a/src/timeline/widgets/FileItem.cc b/src/timeline/widgets/FileItem.cc
index e70be9da..e4cc02b2 100644 --- a/src/timeline/widgets/FileItem.cc +++ b/src/timeline/widgets/FileItem.cc
@@ -94,6 +94,9 @@ FileItem::FileItem(QSharedPointer<MatrixClient> client, QString FileItem::calculateFileSize(int nbytes) const { + if (nbytes == 0) + return QString(""); + if (nbytes < 1024) return QString("%1 B").arg(nbytes);