src/third-party/discord-rpc/src/rpc_connection.h (view raw)
1#pragma once
2
3#include "connection.h"
4#include "serialization.h"
5
6// I took this from the buffer size libuv uses for named pipes; I suspect ours would usually be much
7// smaller.
8constexpr size_t MaxRpcFrameSize = 64 * 1024;
9
10struct RpcConnection {
11 enum class ErrorCode : int {
12 Success = 0,
13 PipeClosed = 1,
14 ReadCorrupt = 2,
15 };
16
17 enum class Opcode : uint32_t {
18 Handshake = 0,
19 Frame = 1,
20 Close = 2,
21 Ping = 3,
22 Pong = 4,
23 };
24
25 struct MessageFrameHeader {
26 Opcode opcode;
27 uint32_t length;
28 };
29
30 struct MessageFrame : public MessageFrameHeader {
31 char message[MaxRpcFrameSize - sizeof(MessageFrameHeader)];
32 };
33
34 enum class State : uint32_t {
35 Disconnected,
36 SentHandshake,
37 AwaitingResponse,
38 Connected,
39 };
40
41 BaseConnection* connection{nullptr};
42 State state{State::Disconnected};
43 void (*onConnect)(JsonDocument& message){nullptr};
44 void (*onDisconnect)(int errorCode, const char* message){nullptr};
45 char appId[64]{};
46 int lastErrorCode{0};
47 char lastErrorMessage[256]{};
48 RpcConnection::MessageFrame sendFrame;
49
50 static RpcConnection* Create(const char* applicationId);
51 static void Destroy(RpcConnection*&);
52
53 inline bool IsOpen() const { return state == State::Connected; }
54
55 void Open();
56 void Close();
57 bool Write(const void* data, size_t length);
58 bool Read(JsonDocument& message);
59};