diff options
Diffstat (limited to 'src/MatrixClient.cc')
-rw-r--r-- | src/MatrixClient.cc | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/src/MatrixClient.cc b/src/MatrixClient.cc index a171cd09..66630c80 100644 --- a/src/MatrixClient.cc +++ b/src/MatrixClient.cc @@ -21,6 +21,7 @@ #include <QJsonArray> #include <QJsonDocument> #include <QJsonObject> +#include <QMimeDatabase> #include <QNetworkReply> #include <QNetworkRequest> #include <QPixmap> @@ -287,6 +288,9 @@ MatrixClient::sendRoomMessage(matrix::events::MessageEventType ty, case matrix::events::MessageEventType::Image: body = {{"msgtype", "m.image"}, {"body", msg}, {"url", url}}; break; + case matrix::events::MessageEventType::File: + body = {{"msgtype", "m.file"}, {"body", msg}, {"url", url}}; + break; default: qDebug() << "SendRoomMessage: Unknown message type for" << msg; return; @@ -756,6 +760,62 @@ MatrixClient::uploadImage(const QString &roomid, const QString &filename) } void +MatrixClient::uploadFile(const QString &roomid, 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; + } + + 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()); + connect(reply, &QNetworkReply::finished, this, [this, reply, roomid, filename]() { + reply->deleteLater(); + + int status = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt(); + + if (status == 0 || status >= 400) { + emit syncFailed(reply->errorString()); + return; + } + + 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::joinRoom(const QString &roomIdOrAlias) { QUrlQuery query; |