1
0
Fork 0
mirror of https://github.com/transmission/transmission synced 2024-12-23 08:13:27 +00:00
transmission/qt/RpcClient.h
Mike Gelfand d7930984ef Adjust uncrustify config, reformat all but Mac client
There're places where manual intervention is still required as uncrustify
is not ideal (unfortunately), but at least one may rely on it to do the
right thing most of the time (e.g. when sending in a patch).

The style itself is quite different from what we had before but making it
uniform across all the codebase is the key. I also hope that it'll make the
code more readable (YMMV) and less sensitive to further changes.
2017-04-20 10:01:22 +03:00

100 lines
2.4 KiB
C++

/*
* This file Copyright (C) 2014-2016 Mnemosyne LLC
*
* It may be used under the GNU GPL versions 2 or 3
* or any future license endorsed by Mnemosyne LLC.
*
*/
#pragma once
#include <memory>
#include <QFuture>
#include <QFutureInterface>
#include <QHash>
#include <QNetworkReply>
#include <QObject>
#include <QString>
#include <QUrl>
#include <libtransmission/transmission.h>
#include <libtransmission/quark.h>
#include <libtransmission/variant.h>
class QByteArray;
class QNetworkAccessManager;
typedef std::shared_ptr<tr_variant> TrVariantPtr;
Q_DECLARE_METATYPE(TrVariantPtr)
extern "C"
{
struct evbuffer;
struct tr_session;
}
struct RpcResponse
{
QString result;
TrVariantPtr args;
bool success = false;
QNetworkReply::NetworkError networkError = QNetworkReply::NoError;
};
Q_DECLARE_METATYPE(QFutureInterface<RpcResponse>);
// The response future -- the RPC engine returns one for each request made.
typedef QFuture<RpcResponse> RpcResponseFuture;
class RpcClient : public QObject
{
Q_OBJECT
public:
RpcClient(QObject* parent = nullptr);
virtual ~RpcClient()
{
}
void stop();
void start(tr_session* session);
void start(const QUrl& url);
bool isLocal() const;
const QUrl& url() const;
RpcResponseFuture exec(tr_quark method, tr_variant* args);
RpcResponseFuture exec(const char* method, tr_variant* args);
signals:
void httpAuthenticationRequired();
void dataReadProgress();
void dataSendProgress();
void networkResponse(QNetworkReply::NetworkError code, const QString& message);
private:
RpcResponseFuture sendRequest(TrVariantPtr json);
QNetworkAccessManager* networkAccessManager();
int64_t getNextTag();
void sendNetworkRequest(TrVariantPtr json, const QFutureInterface<RpcResponse>& promise);
void sendLocalRequest(TrVariantPtr json, const QFutureInterface<RpcResponse>& promise, int64_t tag);
int64_t parseResponseTag(tr_variant& response);
RpcResponse parseResponseData(tr_variant& response);
static void localSessionCallback(tr_session* s, tr_variant* response, void* vself);
private slots:
void networkRequestFinished(QNetworkReply* reply);
void localRequestFinished(TrVariantPtr response);
private:
tr_session* mySession;
QString mySessionId;
QUrl myUrl;
QNetworkAccessManager* myNAM;
QHash<int64_t, QFutureInterface<RpcResponse>> myLocalRequests;
int64_t myNextTag;
};