summaryrefslogtreecommitdiffstats
path: root/src/MatrixClient.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/MatrixClient.cc')
-rw-r--r--src/MatrixClient.cc60
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;