summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKonstantinos Sideris <sideris.konstantin@gmail.com>2017-12-01 17:33:49 +0200
committerKonstantinos Sideris <sideris.konstantin@gmail.com>2017-12-01 17:33:49 +0200
commit5573548fb1adbaef6ef8e30fd76855b90c0fe26c (patch)
tree2204a70a9de4c565ad9ab1c49a97ef90bc1e059d /src
parent78353a29bce717b46a5aa720927abb88faa53f44 (diff)
Allow audio clip uploads
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);