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;
+}
|