Archived
1
Fork 0
This repository has been archived on 2025-04-12. You can view files and clone it, but cannot push or open issues or pull requests.
trinity/include/network.h
Joshua Goins a825c8886d Add basic encryption support
Sorry this is a huge commit, this actually includes a ton
of stuff. Text color is now readable, multiple accounts
are supported alongside end-to-end encryption but no
cross-signing yet :-) There's also a whole lot of other
small changes, such as choosing the server you want to
request a room directory from.
2022-03-01 16:20:32 -05:00

128 lines
4.2 KiB
C++
Executable file

#pragma once
#include <QNetworkAccessManager>
#include <QNetworkRequest>
#include <QJsonObject>
#include <QJsonDocument>
#include <QUrl>
#include "requestsender.h"
class Network {
public:
Network() {
manager = new QNetworkAccessManager();
}
QNetworkAccessManager* manager;
QString homeserverURL, accessToken;
template<typename Fn>
inline void postJSON(const QString& path, const QJsonObject object, Fn&& fn) {
QNetworkRequest request(homeserverURL + path);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
request.setRawHeader("Authorization", accessToken.toLocal8Bit());
const QByteArray jsonPost = QJsonDocument(object).toJson();
request.setHeader(QNetworkRequest::ContentLengthHeader, QByteArray::number(jsonPost.size()));
RequestSender* sender = new RequestSender(manager);
sender->fn = fn;
request.setOriginatingObject(sender);
QObject::connect(manager, &QNetworkAccessManager::finished, sender, &RequestSender::finished);
manager->post(request, jsonPost);
}
template<typename Fn, typename ProgressFn>
inline void postBinary(const QString& path, const QByteArray data, const QString mimeType, Fn&& fn, ProgressFn&& progressFn) {
QNetworkRequest request(homeserverURL + path);
request.setHeader(QNetworkRequest::ContentTypeHeader, mimeType);
request.setRawHeader("Authorization", accessToken.toLocal8Bit());
request.setHeader(QNetworkRequest::ContentLengthHeader, QByteArray::number(data.size()));
RequestSender* sender = new RequestSender(manager);
sender->fn = fn;
request.setOriginatingObject(sender);
QObject::connect(manager, &QNetworkAccessManager::finished, sender, &RequestSender::finished);
QNetworkReply* reply = manager->post(request, data);
QObject::connect(reply, &QNetworkReply::uploadProgress, progressFn);
}
template<typename Fn>
inline void post(const QString& path, Fn&& fn) {
QNetworkRequest request(homeserverURL + path);
request.setRawHeader("Authorization", accessToken.toLocal8Bit());
RequestSender* sender = new RequestSender(manager);
sender->fn = fn;
request.setOriginatingObject(sender);
QObject::connect(manager, &QNetworkAccessManager::finished, sender, &RequestSender::finished);
manager->post(request, QByteArray());
}
inline void post(const QString& path) {
QNetworkRequest request(homeserverURL + path);
request.setRawHeader("Authorization", accessToken.toLocal8Bit());
manager->post(request, QByteArray());
}
inline void putJSON(const QString& path, const QJsonObject object) {
QNetworkRequest request(homeserverURL + path);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
request.setRawHeader("Authorization", accessToken.toLocal8Bit());
const QByteArray jsonPost = QJsonDocument(object).toJson();
request.setHeader(QNetworkRequest::ContentLengthHeader, QByteArray::number(jsonPost.size()));
manager->put(request, jsonPost);
}
template<typename Fn>
inline void putJSON(const QString& path, const QJsonObject object, Fn&& fn) {
QNetworkRequest request(homeserverURL + path);
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
request.setRawHeader("Authorization", accessToken.toLocal8Bit());
RequestSender* sender = new RequestSender(manager);
sender->fn = fn;
request.setOriginatingObject(sender);
const QByteArray jsonPost = QJsonDocument(object).toJson();
request.setHeader(QNetworkRequest::ContentLengthHeader, QByteArray::number(jsonPost.size()));
QObject::connect(manager, &QNetworkAccessManager::finished, sender, &RequestSender::finished);
manager->put(request, jsonPost);
}
template<typename Fn>
inline void get(const QString& path, Fn&& fn, const QString contentType = "application/json") {
QNetworkRequest request(homeserverURL + path);
request.setHeader(QNetworkRequest::ContentTypeHeader, contentType);
request.setRawHeader("Authorization", accessToken.toLocal8Bit());
RequestSender* sender = new RequestSender(manager);
sender->fn = fn;
request.setOriginatingObject(sender);
QObject::connect(manager, &QNetworkAccessManager::finished, sender, &RequestSender::finished);
manager->get(request);
}
};