summary refs log tree commit diff
path: root/src/MatrixClient.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/MatrixClient.cc')
-rw-r--r--src/MatrixClient.cc115
1 files changed, 79 insertions, 36 deletions
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; +}