From 4824b20f28b1ebffb2a57881684ef87f76659a6c Mon Sep 17 00:00:00 2001 From: Mason Sciotti Date: Mon, 14 Jan 2019 00:16:22 -0800 Subject: [PATCH] Choose pipe number on initialize (#250) * Choose pipe number on initialize * Get pipe from base connection instance * UE4 support * Warnings as errors yelling * Fix windows connection * Oops all variables * maybe this fixes it * This one actually works!!!! * Fix double function declaration --- examples/button-clicker/Assets/DiscordRpc.cs | 6 +++--- examples/send-presence/send-presence.c | 2 +- .../Source/DiscordRpc/Private/DiscordRpcBlueprint.cpp | 5 +++-- .../Source/DiscordRpc/Public/DiscordRpcBlueprint.h | 3 ++- include/discord_rpc.h | 3 ++- src/connection.h | 2 +- src/connection_unix.cpp | 5 ++--- src/connection_win.cpp | 5 +++-- src/discord_rpc.cpp | 5 +++-- src/rpc_connection.cpp | 5 +++-- src/rpc_connection.h | 3 ++- 11 files changed, 25 insertions(+), 19 deletions(-) diff --git a/examples/button-clicker/Assets/DiscordRpc.cs b/examples/button-clicker/Assets/DiscordRpc.cs index 92b5c6e..80d6d10 100644 --- a/examples/button-clicker/Assets/DiscordRpc.cs +++ b/examples/button-clicker/Assets/DiscordRpc.cs @@ -78,7 +78,7 @@ public class DiscordRpc 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 = 0) { Callbacks = handlers; @@ -90,11 +90,11 @@ public class DiscordRpc staticEventHandlers.spectateCallback += DiscordRpc.SpectateCallback; 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)] - 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)] public static extern void Shutdown(); diff --git a/examples/send-presence/send-presence.c b/examples/send-presence/send-presence.c index 5449cf8..155372a 100644 --- a/examples/send-presence/send-presence.c +++ b/examples/send-presence/send-presence.c @@ -129,7 +129,7 @@ static void discordInit() handlers.joinGame = handleDiscordJoin; handlers.spectateGame = handleDiscordSpectate; handlers.joinRequest = handleDiscordJoinRequest; - Discord_Initialize(APPLICATION_ID, &handlers, 1, NULL); + Discord_Initialize(APPLICATION_ID, &handlers, 1, NULL, 0); } static void gameLoop() diff --git a/examples/unrealstatus/Plugins/discordrpc/Source/DiscordRpc/Private/DiscordRpcBlueprint.cpp b/examples/unrealstatus/Plugins/discordrpc/Source/DiscordRpc/Private/DiscordRpcBlueprint.cpp index 95388df..1e40457 100644 --- a/examples/unrealstatus/Plugins/discordrpc/Source/DiscordRpc/Private/DiscordRpcBlueprint.cpp +++ b/examples/unrealstatus/Plugins/discordrpc/Source/DiscordRpc/Private/DiscordRpcBlueprint.cpp @@ -82,7 +82,8 @@ static void JoinRequestHandler(const DiscordUser* request) void UDiscordRpc::Initialize(const FString& applicationId, bool autoRegister, - const FString& optionalSteamId) + const FString& optionalSteamId, + int pipe) { self = this; IsConnected = false; @@ -102,7 +103,7 @@ void UDiscordRpc::Initialize(const FString& applicationId, auto appId = StringCast(*applicationId); auto steamId = StringCast(*optionalSteamId); Discord_Initialize( - (const char*)appId.Get(), &handlers, autoRegister, (const char*)steamId.Get()); + (const char*)appId.Get(), &handlers, autoRegister, (const char*)steamId.Get(), pipe); } void UDiscordRpc::Shutdown() diff --git a/examples/unrealstatus/Plugins/discordrpc/Source/DiscordRpc/Public/DiscordRpcBlueprint.h b/examples/unrealstatus/Plugins/discordrpc/Source/DiscordRpc/Public/DiscordRpcBlueprint.h index 17e2f9b..4dbe1d7 100644 --- a/examples/unrealstatus/Plugins/discordrpc/Source/DiscordRpc/Public/DiscordRpcBlueprint.h +++ b/examples/unrealstatus/Plugins/discordrpc/Source/DiscordRpc/Public/DiscordRpcBlueprint.h @@ -99,7 +99,8 @@ public: Category = "Discord") void Initialize(const FString& applicationId, bool autoRegister, - const FString& optionalSteamId); + const FString& optionalSteamId, + int optionalPipeNumber); UFUNCTION(BlueprintCallable, meta = (DisplayName = "Shut down connection", Keywords = "Discord rpc"), diff --git a/include/discord_rpc.h b/include/discord_rpc.h index 3e1441e..6c60756 100644 --- a/include/discord_rpc.h +++ b/include/discord_rpc.h @@ -64,7 +64,8 @@ typedef struct DiscordEventHandlers { DISCORD_EXPORT void Discord_Initialize(const char* applicationId, DiscordEventHandlers* handlers, int autoRegister, - const char* optionalSteamId); + const char* optionalSteamId, + int optionalPipeNumber); DISCORD_EXPORT void Discord_Shutdown(void); /* checks for incoming messages, dispatches callbacks */ diff --git a/src/connection.h b/src/connection.h index a8f99b9..cd08038 100644 --- a/src/connection.h +++ b/src/connection.h @@ -12,7 +12,7 @@ struct BaseConnection { static BaseConnection* Create(); static void Destroy(BaseConnection*&); bool isOpen{false}; - bool Open(); + bool Open(int pipe); bool Close(); bool Write(const void* data, size_t length); bool Read(void* data, size_t length); diff --git a/src/connection_unix.cpp b/src/connection_unix.cpp index 85dace3..518ea94 100644 --- a/src/connection_unix.cpp +++ b/src/connection_unix.cpp @@ -49,7 +49,7 @@ static const char* GetTempPath() c = nullptr; } -bool BaseConnection::Open() +bool BaseConnection::Open(int pipe) { const char* tempPath = GetTempPath(); auto self = reinterpret_cast(this); @@ -62,8 +62,7 @@ bool BaseConnection::Open() int optval = 1; setsockopt(self->sock, SOL_SOCKET, SO_NOSIGPIPE, &optval, sizeof(optval)); #endif - - for (int pipeNum = 0; pipeNum < 10; ++pipeNum) { + for (int pipeNum = pipe; pipeNum < 10; ++pipeNum) { snprintf( PipeAddr.sun_path, sizeof(PipeAddr.sun_path), "%s/discord-ipc-%d", tempPath, pipeNum); int err = connect(self->sock, (const sockaddr*)&PipeAddr, sizeof(PipeAddr)); diff --git a/src/connection_win.cpp b/src/connection_win.cpp index 2dd2750..e94670e 100644 --- a/src/connection_win.cpp +++ b/src/connection_win.cpp @@ -6,6 +6,7 @@ #define NOIME #include #include +#include int GetProcessId() { @@ -30,11 +31,11 @@ static BaseConnectionWin Connection; c = nullptr; } -bool BaseConnection::Open() +bool BaseConnection::Open(int pipe) { wchar_t pipeName[]{L"\\\\?\\pipe\\discord-ipc-0"}; const size_t pipeDigit = sizeof(pipeName) / sizeof(wchar_t) - 2; - pipeName[pipeDigit] = L'0'; + pipeName[pipeDigit] += pipe; auto self = reinterpret_cast(this); for (;;) { self->pipe = ::CreateFileW( diff --git a/src/discord_rpc.cpp b/src/discord_rpc.cpp index 0392453..cd0d711 100644 --- a/src/discord_rpc.cpp +++ b/src/discord_rpc.cpp @@ -273,7 +273,8 @@ static bool DeregisterForEvent(const char* evtName) extern "C" DISCORD_EXPORT void Discord_Initialize(const char* applicationId, DiscordEventHandlers* handlers, int autoRegister, - const char* optionalSteamId) + const char* optionalSteamId, + int pipe) { IoThread = new (std::nothrow) IoThreadHolder(); if (IoThread == nullptr) { @@ -308,7 +309,7 @@ extern "C" DISCORD_EXPORT void Discord_Initialize(const char* applicationId, return; } - Connection = RpcConnection::Create(applicationId); + Connection = RpcConnection::Create(applicationId, pipe); Connection->onConnect = [](JsonDocument& readyMessage) { Discord_UpdateHandlers(&QueuedHandlers); if (QueuedPresence.length > 0) { diff --git a/src/rpc_connection.cpp b/src/rpc_connection.cpp index 0933162..fc8b6e1 100644 --- a/src/rpc_connection.cpp +++ b/src/rpc_connection.cpp @@ -6,10 +6,11 @@ static const int RpcVersion = 1; static RpcConnection Instance; -/*static*/ RpcConnection* RpcConnection::Create(const char* applicationId) +/*static*/ RpcConnection* RpcConnection::Create(const char* applicationId, int pipe) { Instance.connection = BaseConnection::Create(); StringCopy(Instance.appId, applicationId); + Instance.pipe = pipe; return &Instance; } @@ -26,7 +27,7 @@ void RpcConnection::Open() return; } - if (state == State::Disconnected && !connection->Open()) { + if (state == State::Disconnected && !connection->Open(Instance.pipe)) { return; } diff --git a/src/rpc_connection.h b/src/rpc_connection.h index bbdd05c..9a48757 100644 --- a/src/rpc_connection.h +++ b/src/rpc_connection.h @@ -43,11 +43,12 @@ struct RpcConnection { void (*onConnect)(JsonDocument& message){nullptr}; void (*onDisconnect)(int errorCode, const char* message){nullptr}; char appId[64]{}; + int pipe; int lastErrorCode{0}; char lastErrorMessage[256]{}; RpcConnection::MessageFrame sendFrame; - static RpcConnection* Create(const char* applicationId); + static RpcConnection* Create(const char* applicationId, int pipe); static void Destroy(RpcConnection*&); inline bool IsOpen() const { return state == State::Connected; }