all repos — mgba @ b176516c36fdadb7e068e0624ec5afc5fad7fdec

mGBA Game Boy Advance Emulator

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};