aboutsummaryrefslogtreecommitdiff
path: root/externals/discord-rpc/src/rpc_connection.h
diff options
context:
space:
mode:
Diffstat (limited to 'externals/discord-rpc/src/rpc_connection.h')
-rw-r--r--externals/discord-rpc/src/rpc_connection.h59
1 files changed, 59 insertions, 0 deletions
diff --git a/externals/discord-rpc/src/rpc_connection.h b/externals/discord-rpc/src/rpc_connection.h
new file mode 100644
index 0000000000..bbdd05c792
--- /dev/null
+++ b/externals/discord-rpc/src/rpc_connection.h
@@ -0,0 +1,59 @@
+#pragma once
+
+#include "connection.h"
+#include "serialization.h"
+
+// I took this from the buffer size libuv uses for named pipes; I suspect ours would usually be much
+// smaller.
+constexpr size_t MaxRpcFrameSize = 64 * 1024;
+
+struct RpcConnection {
+ enum class ErrorCode : int {
+ Success = 0,
+ PipeClosed = 1,
+ ReadCorrupt = 2,
+ };
+
+ enum class Opcode : uint32_t {
+ Handshake = 0,
+ Frame = 1,
+ Close = 2,
+ Ping = 3,
+ Pong = 4,
+ };
+
+ struct MessageFrameHeader {
+ Opcode opcode;
+ uint32_t length;
+ };
+
+ struct MessageFrame : public MessageFrameHeader {
+ char message[MaxRpcFrameSize - sizeof(MessageFrameHeader)];
+ };
+
+ enum class State : uint32_t {
+ Disconnected,
+ SentHandshake,
+ AwaitingResponse,
+ Connected,
+ };
+
+ BaseConnection* connection{nullptr};
+ State state{State::Disconnected};
+ void (*onConnect)(JsonDocument& message){nullptr};
+ void (*onDisconnect)(int errorCode, const char* message){nullptr};
+ char appId[64]{};
+ int lastErrorCode{0};
+ char lastErrorMessage[256]{};
+ RpcConnection::MessageFrame sendFrame;
+
+ static RpcConnection* Create(const char* applicationId);
+ static void Destroy(RpcConnection*&);
+
+ inline bool IsOpen() const { return state == State::Connected; }
+
+ void Open();
+ void Close();
+ bool Write(const void* data, size_t length);
+ bool Read(JsonDocument& message);
+};