Choose pipe number on initialize

This commit is contained in:
msciotti 2018-11-07 11:14:21 -08:00
parent 4e53fa0392
commit d5a342c7bb
No known key found for this signature in database
GPG Key ID: 40FADA25CF0EAD84
10 changed files with 32 additions and 20 deletions

View File

@ -78,7 +78,7 @@ public class DiscordRpc
Ignore = 2 Ignore = 2
} }
public static void Initialize(string applicationId, ref EventHandlers handlers, bool autoRegister, string optionalSteamId) public static void Initialize(string applicationId, ref EventHandlers handlers, bool autoRegister, string optionalSteamId, int pipe)
{ {
Callbacks = handlers; Callbacks = handlers;
@ -90,11 +90,11 @@ public class DiscordRpc
staticEventHandlers.spectateCallback += DiscordRpc.SpectateCallback; staticEventHandlers.spectateCallback += DiscordRpc.SpectateCallback;
staticEventHandlers.requestCallback += DiscordRpc.RequestCallback; staticEventHandlers.requestCallback += DiscordRpc.RequestCallback;
InitializeInternal(applicationId, ref staticEventHandlers, autoRegister, optionalSteamId); InitializeInternal(applicationId, ref staticEventHandlers, autoRegister, optionalSteamId, pipe);
} }
[DllImport("discord-rpc", EntryPoint = "Discord_Initialize", CallingConvention = CallingConvention.Cdecl)] [DllImport("discord-rpc", EntryPoint = "Discord_Initialize", CallingConvention = CallingConvention.Cdecl)]
static extern void InitializeInternal(string applicationId, ref EventHandlers handlers, bool autoRegister, string optionalSteamId); static extern void InitializeInternal(string applicationId, ref EventHandlers handlers, bool autoRegister, string optionalSteamId, int pipe);
[DllImport("discord-rpc", EntryPoint = "Discord_Shutdown", CallingConvention = CallingConvention.Cdecl)] [DllImport("discord-rpc", EntryPoint = "Discord_Shutdown", CallingConvention = CallingConvention.Cdecl)]
public static extern void Shutdown(); public static extern void Shutdown();
@ -114,6 +114,11 @@ public class DiscordRpc
[DllImport("discord-rpc", EntryPoint = "Discord_UpdateHandlers", CallingConvention = CallingConvention.Cdecl)] [DllImport("discord-rpc", EntryPoint = "Discord_UpdateHandlers", CallingConvention = CallingConvention.Cdecl)]
public static extern void UpdateHandlers(ref EventHandlers handlers); public static extern void UpdateHandlers(ref EventHandlers handlers);
public static void Initialize(string applicationId, ref EventHandlers handlers, bool autoRegister, string optionalSteamId, int pipe = 0)
{
Initialize(applicationId, ref handlers, autoRegister, optionalSteamId, pipe);
}
public static void UpdatePresence(RichPresence presence) public static void UpdatePresence(RichPresence presence)
{ {
var presencestruct = presence.GetStruct(); var presencestruct = presence.GetStruct();

View File

@ -129,7 +129,7 @@ static void discordInit()
handlers.joinGame = handleDiscordJoin; handlers.joinGame = handleDiscordJoin;
handlers.spectateGame = handleDiscordSpectate; handlers.spectateGame = handleDiscordSpectate;
handlers.joinRequest = handleDiscordJoinRequest; handlers.joinRequest = handleDiscordJoinRequest;
Discord_Initialize(APPLICATION_ID, &handlers, 1, NULL); Discord_Initialize(APPLICATION_ID, &handlers, 1, NULL, 0);
} }
static void gameLoop() static void gameLoop()

View File

@ -99,7 +99,8 @@ public:
Category = "Discord") Category = "Discord")
void Initialize(const FString& applicationId, void Initialize(const FString& applicationId,
bool autoRegister, bool autoRegister,
const FString& optionalSteamId); const FString& optionalSteamId,
int optionalPipeNumber);
UFUNCTION(BlueprintCallable, UFUNCTION(BlueprintCallable,
meta = (DisplayName = "Shut down connection", Keywords = "Discord rpc"), meta = (DisplayName = "Shut down connection", Keywords = "Discord rpc"),

View File

@ -64,7 +64,8 @@ typedef struct DiscordEventHandlers {
DISCORD_EXPORT void Discord_Initialize(const char* applicationId, DISCORD_EXPORT void Discord_Initialize(const char* applicationId,
DiscordEventHandlers* handlers, DiscordEventHandlers* handlers,
int autoRegister, int autoRegister,
const char* optionalSteamId); const char* optionalSteamId,
int optionalPipeNumber);
DISCORD_EXPORT void Discord_Shutdown(void); DISCORD_EXPORT void Discord_Shutdown(void);
/* checks for incoming messages, dispatches callbacks */ /* checks for incoming messages, dispatches callbacks */

View File

@ -12,7 +12,7 @@ struct BaseConnection {
static BaseConnection* Create(); static BaseConnection* Create();
static void Destroy(BaseConnection*&); static void Destroy(BaseConnection*&);
bool isOpen{false}; bool isOpen{false};
bool Open(); bool Open(int pipe);
bool Close(); bool Close();
bool Write(const void* data, size_t length); bool Write(const void* data, size_t length);
bool Read(void* data, size_t length); bool Read(void* data, size_t length);

View File

@ -49,7 +49,7 @@ static const char* GetTempPath()
c = nullptr; c = nullptr;
} }
bool BaseConnection::Open() bool BaseConnection::Open(int pipe)
{ {
const char* tempPath = GetTempPath(); const char* tempPath = GetTempPath();
auto self = reinterpret_cast<BaseConnectionUnix*>(this); auto self = reinterpret_cast<BaseConnectionUnix*>(this);
@ -62,8 +62,7 @@ bool BaseConnection::Open()
int optval = 1; int optval = 1;
setsockopt(self->sock, SOL_SOCKET, SO_NOSIGPIPE, &optval, sizeof(optval)); setsockopt(self->sock, SOL_SOCKET, SO_NOSIGPIPE, &optval, sizeof(optval));
#endif #endif
for (int pipeNum = pipe; pipeNum < 10; ++pipeNum) {
for (int pipeNum = 0; pipeNum < 10; ++pipeNum) {
snprintf( snprintf(
PipeAddr.sun_path, sizeof(PipeAddr.sun_path), "%s/discord-ipc-%d", tempPath, pipeNum); PipeAddr.sun_path, sizeof(PipeAddr.sun_path), "%s/discord-ipc-%d", tempPath, pipeNum);
int err = connect(self->sock, (const sockaddr*)&PipeAddr, sizeof(PipeAddr)); int err = connect(self->sock, (const sockaddr*)&PipeAddr, sizeof(PipeAddr));

View File

@ -30,11 +30,11 @@ static BaseConnectionWin Connection;
c = nullptr; c = nullptr;
} }
bool BaseConnection::Open() bool BaseConnection::Open(int pipe)
{ {
wchar_t pipeName[]{L"\\\\?\\pipe\\discord-ipc-0"}; wchar_t pipeName[]{L"\\\\?\\pipe\\discord-ipc-0"};
const size_t pipeDigit = sizeof(pipeName) / sizeof(wchar_t) - 2; const size_t pipeDigit = sizeof(pipeName) / sizeof(wchar_t) - 2;
pipeName[pipeDigit] = L'0'; pipeName[pipeDigit] = sprintf(L"%d", pipe);
auto self = reinterpret_cast<BaseConnectionWin*>(this); auto self = reinterpret_cast<BaseConnectionWin*>(this);
for (;;) { for (;;) {
self->pipe = ::CreateFileW( self->pipe = ::CreateFileW(

View File

@ -67,6 +67,7 @@ static QueuedMessage QueuedPresence{};
static MsgQueue<QueuedMessage, MessageQueueSize> SendQueue; static MsgQueue<QueuedMessage, MessageQueueSize> SendQueue;
static MsgQueue<User, JoinQueueSize> JoinAskQueue; static MsgQueue<User, JoinQueueSize> JoinAskQueue;
static User connectedUser; static User connectedUser;
static int PipeNumber{0};
// We want to auto connect, and retry on failure, but not as fast as possible. This does expoential // We want to auto connect, and retry on failure, but not as fast as possible. This does expoential
// backoff from 0.5 seconds to 1 minute // backoff from 0.5 seconds to 1 minute
@ -141,7 +142,7 @@ static void Discord_UpdateConnection(void)
if (!Connection->IsOpen()) { if (!Connection->IsOpen()) {
if (std::chrono::system_clock::now() >= NextConnect) { if (std::chrono::system_clock::now() >= NextConnect) {
UpdateReconnectTime(); UpdateReconnectTime();
Connection->Open(); Connection->Open(PipeNumber);
} }
} }
else { else {
@ -273,7 +274,8 @@ static bool DeregisterForEvent(const char* evtName)
extern "C" DISCORD_EXPORT void Discord_Initialize(const char* applicationId, extern "C" DISCORD_EXPORT void Discord_Initialize(const char* applicationId,
DiscordEventHandlers* handlers, DiscordEventHandlers* handlers,
int autoRegister, int autoRegister,
const char* optionalSteamId) const char* optionalSteamId,
int pipe = 0)
{ {
IoThread = new (std::nothrow) IoThreadHolder(); IoThread = new (std::nothrow) IoThreadHolder();
if (IoThread == nullptr) { if (IoThread == nullptr) {
@ -308,7 +310,9 @@ extern "C" DISCORD_EXPORT void Discord_Initialize(const char* applicationId,
return; return;
} }
Connection = RpcConnection::Create(applicationId); PipeNumber = pipe;
Connection = RpcConnection::Create(applicationId, PipeNumber);
Connection->onConnect = [](JsonDocument& readyMessage) { Connection->onConnect = [](JsonDocument& readyMessage) {
Discord_UpdateHandlers(&QueuedHandlers); Discord_UpdateHandlers(&QueuedHandlers);
if (QueuedPresence.length > 0) { if (QueuedPresence.length > 0) {

View File

@ -6,10 +6,11 @@
static const int RpcVersion = 1; static const int RpcVersion = 1;
static RpcConnection Instance; static RpcConnection Instance;
/*static*/ RpcConnection* RpcConnection::Create(const char* applicationId) /*static*/ RpcConnection* RpcConnection::Create(const char* applicationId, int pipe)
{ {
Instance.connection = BaseConnection::Create(); Instance.connection = BaseConnection::Create();
StringCopy(Instance.appId, applicationId); StringCopy(Instance.appId, applicationId);
Instance.pipe = pipe;
return &Instance; return &Instance;
} }
@ -20,13 +21,13 @@ static RpcConnection Instance;
c = nullptr; c = nullptr;
} }
void RpcConnection::Open() void RpcConnection::Open(int pipe)
{ {
if (state == State::Connected) { if (state == State::Connected) {
return; return;
} }
if (state == State::Disconnected && !connection->Open()) { if (state == State::Disconnected && !connection->Open(pipe)) {
return; return;
} }

View File

@ -43,16 +43,17 @@ struct RpcConnection {
void (*onConnect)(JsonDocument& message){nullptr}; void (*onConnect)(JsonDocument& message){nullptr};
void (*onDisconnect)(int errorCode, const char* message){nullptr}; void (*onDisconnect)(int errorCode, const char* message){nullptr};
char appId[64]{}; char appId[64]{};
int pipe;
int lastErrorCode{0}; int lastErrorCode{0};
char lastErrorMessage[256]{}; char lastErrorMessage[256]{};
RpcConnection::MessageFrame sendFrame; RpcConnection::MessageFrame sendFrame;
static RpcConnection* Create(const char* applicationId); static RpcConnection* Create(const char* applicationId, int optionalPipeNumber);
static void Destroy(RpcConnection*&); static void Destroy(RpcConnection*&);
inline bool IsOpen() const { return state == State::Connected; } inline bool IsOpen() const { return state == State::Connected; }
void Open(); void Open(int pipe);
void Close(); void Close();
bool Write(const void* data, size_t length); bool Write(const void* data, size_t length);
bool Read(JsonDocument& message); bool Read(JsonDocument& message);