Skip to content

Commit 13a0696

Browse files
Add Initialization of Default PubnubClient for PubnubSubsystem. Make PublishMessage already work from the Client.
1 parent 1bfb665 commit 13a0696

File tree

3 files changed

+47
-83
lines changed

3 files changed

+47
-83
lines changed

Source/PubnubLibrary/Private/PubnubInternalMacros.h

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@
2424
UPubnubUtilities::CallPubnubDelegateWithInvalidArgumentResult(Delegate, TEXT("Pubnub subsystem is not initialized."), ##__VA_ARGS__); \
2525
return; \
2626
} \
27-
if (!QuickActionThread) \
27+
if (!DefaultClient) \
2828
{ \
29-
PubnubError(FString::Printf(TEXT("[%s]: QuickActionThread is null. Internal systems were not initialized correctly. Try reinitializing Pubnub or contact support."), *UPubnubUtilities::GetNameFromFunctionMacro(ANSI_TO_TCHAR(__FUNCTION__)))); \
30-
UPubnubUtilities::CallPubnubDelegateWithInvalidArgumentResult(Delegate, TEXT("QuickActionThread is invalid."), ##__VA_ARGS__); \
29+
PubnubError(FString::Printf(TEXT("[%s]: DefaultClient is invalid. Internal systems were not initialized correctly. Try reinitializing Pubnub or contact support."), *UPubnubUtilities::GetNameFromFunctionMacro(ANSI_TO_TCHAR(__FUNCTION__)))); \
30+
UPubnubUtilities::CallPubnubDelegateWithInvalidArgumentResult(Delegate, TEXT("DefaultClient is invalid."), ##__VA_ARGS__); \
3131
return; \
3232
} \
3333
} while (false)
@@ -48,14 +48,14 @@
4848
do { \
4949
if (!IsInitialized) \
5050
{ \
51-
PubnubError(FString::Printf(TEXT("[%s]: Pubnub is not initialized. Aborting operation. Ensure InitPubnub is called or InitializeAutomatically is enabled."), *UPubnubUtilities::GetNameFromFunctionMacro(ANSI_TO_TCHAR(__FUNCTION__)))); \
52-
UPubnubUtilities::CallPubnubDelegateWithInvalidArgumentResult(Delegate, TEXT("Pubnub subsystem is not initialized."), ##__VA_ARGS__); \
51+
PubnubError(FString::Printf(TEXT("[%s]: PubnubClient is not initialized. Aborting operation. This client was already destroyed or was not initialized correctly."), *UPubnubUtilities::GetNameFromFunctionMacro(ANSI_TO_TCHAR(__FUNCTION__)))); \
52+
UPubnubUtilities::CallPubnubDelegateWithInvalidArgumentResult(Delegate, TEXT("PubnubClient is not initialized."), ##__VA_ARGS__); \
5353
return; \
5454
} \
5555
if (!PubnubCallsThread) \
5656
{ \
57-
PubnubError(FString::Printf(TEXT("[%s]: PubnubCallsThread is null. Internal systems were not initialized correctly. Try reinitializing Pubnub or contact support."), *UPubnubUtilities::GetNameFromFunctionMacro(ANSI_TO_TCHAR(__FUNCTION__)))); \
58-
UPubnubUtilities::CallPubnubDelegateWithInvalidArgumentResult(Delegate, TEXT("QuickActionThread is invalid."), ##__VA_ARGS__); \
57+
PubnubError(FString::Printf(TEXT("[%s]: PubnubCallsThread is invalid. This client was already destroyed or was not initialized correctly."), *UPubnubUtilities::GetNameFromFunctionMacro(ANSI_TO_TCHAR(__FUNCTION__)))); \
58+
UPubnubUtilities::CallPubnubDelegateWithInvalidArgumentResult(Delegate, TEXT("PubnubCallsThread is invalid."), ##__VA_ARGS__); \
5959
return; \
6060
} \
6161
} while (false)
@@ -70,17 +70,17 @@
7070
*
7171
* Usage: Place this at the beginning of any public-facing API to guard against uninitialized use.
7272
*/
73-
#define PUBNUB_RETURN_IF_NOT_INITIALIZED() \
73+
#define PUBNUB_RETURN_IF_NOT_INITIALIZED(...) \
7474
do { \
7575
if (!IsInitialized) \
7676
{ \
77-
PubnubError(FString::Printf(TEXT("[%s]: PubnubClient is not initialized. Aborting operation. This client was already destroyed or was not initialized correctly."), *UPubnubUtilities::GetNameFromFunctionMacro(ANSI_TO_TCHAR(__FUNCTION__)))); \
78-
return; \
77+
PubnubError(FString::Printf(TEXT("[%s]: Pubnub is not initialized. Aborting operation. Ensure InitPubnub is called or InitializeAutomatically is enabled."), *UPubnubUtilities::GetNameFromFunctionMacro(ANSI_TO_TCHAR(__FUNCTION__)))); \
78+
return __VA_ARGS__; \
7979
} \
80-
if (!QuickActionThread) \
80+
if (!DefaultClient) \
8181
{ \
82-
PubnubError(FString::Printf(TEXT("[%s]: PubnubCallsThread is invalid. Aborting operation. This client was already destroyed or was not initialized correctly."), *UPubnubUtilities::GetNameFromFunctionMacro(ANSI_TO_TCHAR(__FUNCTION__)))); \
83-
return; \
82+
PubnubError(FString::Printf(TEXT("[%s]: DefaultClient is invalid. Internal systems were not initialized correctly. Try reinitializing Pubnub or contact support."), *UPubnubUtilities::GetNameFromFunctionMacro(ANSI_TO_TCHAR(__FUNCTION__)))); \
83+
return __VA_ARGS__; \
8484
} \
8585
} while (false)
8686

Source/PubnubLibrary/Private/PubnubSubsystem.cpp

Lines changed: 27 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -87,117 +87,76 @@ void UPubnubSubsystem::InitPubnubWithConfig(FPubnubConfig Config)
8787
}
8888

8989
SavePubnubConfig(Config);
90-
91-
InitPubnub_priv(Config);
92-
93-
//If initialized correctly, create required thread.
94-
if(IsInitialized)
95-
{
96-
//Create new thread to queue all pubnub sync operations
97-
QuickActionThread = new FPubnubFunctionThread;
98-
}
90+
DefaultClient = CreatePubnubClient(Config);
91+
IsInitialized = true;
9992
}
10093

10194
void UPubnubSubsystem::DeinitPubnub()
10295
{
10396
if(!IsInitialized)
10497
{return;}
105-
106-
if(QuickActionThread)
107-
{
108-
QuickActionThread->Stop();
109-
}
110-
111-
//Unsubscribe from all channels and groups so this user will not be visible for others anymore
112-
UnsubscribeFromAll_priv();
11398

114-
IsInitialized = false;
115-
116-
if(ctx_pub && ctx_ee)
117-
{
118-
//We set this to prevent crash from C-Core when it's trying to clean up provider made in UE
119-
pubnub_set_crypto_module(ctx_pub, nullptr);
120-
pubnub_set_crypto_module(ctx_ee, nullptr);
121-
122-
//Clean up Crypto bridge if it was created
123-
if(CryptoBridge)
124-
{
125-
CryptoBridge->CleanUpCryptoBridge();
126-
}
127-
128-
pubnub_free(ctx_pub);
129-
pubnub_free(ctx_ee);
130-
ctx_pub = nullptr;
131-
ctx_ee = nullptr;
132-
}
99+
DefaultClient->DeinitializeClient();
100+
DefaultClient = nullptr;
133101

134-
ChannelSubscriptions.Empty();
135-
ChannelGroupSubscriptions.Empty();
136-
IsUserIDSet = false;
137-
delete[] AuthTokenBuffer;
102+
IsInitialized = false;
138103

139104
//Notify that Deinitialization is finished
140105
OnPubnubSubsystemDeinitialized.Broadcast();
141106
}
142107

143108
void UPubnubSubsystem::SetUserID(FString UserID)
144109
{
145-
if(!CheckIsPubnubInitialized())
146-
{return;}
147-
148-
SetUserID_priv(UserID);
110+
PUBNUB_RETURN_IF_NOT_INITIALIZED();
111+
112+
DefaultClient->SetUserID(UserID);
149113
}
150114

151115
FString UPubnubSubsystem::GetUserID()
152116
{
153-
return GetUserIDInternal();
117+
PUBNUB_RETURN_IF_NOT_INITIALIZED("");
118+
119+
return DefaultClient->GetUserID();
154120
}
155121

156122
void UPubnubSubsystem::SetSecretKey()
157123
{
158-
if(!CheckIsPubnubInitialized())
159-
{return;}
160-
161-
if(SecretKey[0] == '\0')
162-
{
163-
PubnubError("Can't set Secret Key. Secret Key is empty.");
164-
return;
165-
}
124+
PUBNUB_RETURN_IF_NOT_INITIALIZED();
166125

167-
//This function only changes data locally, doesn't do any networking operations, so no need to call it on separate thread
168-
pubnub_set_secret_key(ctx_pub, SecretKey);
169-
pubnub_set_secret_key(ctx_ee, SecretKey);
126+
DefaultClient->SetSecretKey();
170127
}
171128

172129
void UPubnubSubsystem::PublishMessage(FString Channel, FString Message, FOnPublishMessageResponse OnPublishMessageResponse, FPubnubPublishSettings PublishSettings)
173130
{
174-
FOnPublishMessageResponseNative NativeCallback;
175-
NativeCallback.BindLambda([OnPublishMessageResponse](FPubnubOperationResult Result, FPubnubMessageData PublishedMessage)
131+
PUBNUB_ENSURE_INITIALIZED(OnPublishMessageResponse, FPubnubMessageData());
132+
133+
FPubnubOnPublishMessageResponseNative ConvertedCallback;
134+
ConvertedCallback.BindLambda([OnPublishMessageResponse](const FPubnubOperationResult& Result, const FPubnubMessageData& PublishedMessage)
176135
{
177136
OnPublishMessageResponse.ExecuteIfBound(Result, PublishedMessage);
178137
});
179138

180-
PublishMessage(Channel, Message, NativeCallback, PublishSettings);
139+
DefaultClient->PublishMessage(Channel, Message, ConvertedCallback, PublishSettings);
181140
}
182141

183142
void UPubnubSubsystem::PublishMessage(FString Channel, FString Message, FOnPublishMessageResponseNative NativeCallback, FPubnubPublishSettings PublishSettings)
184143
{
185144
PUBNUB_ENSURE_INITIALIZED(NativeCallback, FPubnubMessageData());
186-
187-
QuickActionThread->AddFunctionToQueue( [this, Channel, Message, NativeCallback, PublishSettings]
188-
{
189-
PublishMessage_priv(Channel, Message, NativeCallback, PublishSettings);
190-
});
145+
146+
FPubnubOnPublishMessageResponseNative ConvertedCallback;
147+
ConvertedCallback.BindLambda([NativeCallback](const FPubnubOperationResult& Result, const FPubnubMessageData& PublishedMessage)
148+
{
149+
NativeCallback.ExecuteIfBound(Result, PublishedMessage);
150+
});
151+
152+
DefaultClient->PublishMessage(Channel, Message, ConvertedCallback, PublishSettings);
191153
}
192154

193155
void UPubnubSubsystem::PublishMessage(FString Channel, FString Message, FPubnubPublishSettings PublishSettings)
194156
{
195157
PUBNUB_RETURN_IF_NOT_INITIALIZED();
196158

197-
QuickActionThread->AddFunctionToQueue( [this, Channel, Message, PublishSettings]
198-
{
199-
PublishMessage_priv(Channel, Message, nullptr, PublishSettings);
200-
});
159+
DefaultClient->PublishMessage(Channel, Message, nullptr, PublishSettings);
201160
}
202161

203162
void UPubnubSubsystem::Signal(FString Channel, FString Message, FOnSignalResponse OnSignalResponse, FPubnubSignalSettings SignalSettings)

Source/PubnubLibrary/Public/PubnubSubsystem.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1832,7 +1832,9 @@ class PUBNUBLIBRARY_API UPubnubSubsystem : public UGameInstanceSubsystem
18321832
UPROPERTY()
18331833
TMap<int, TObjectPtr<UPubnubClient>> PubnubClients;
18341834
int NextClientID = 0;
1835-
1835+
1836+
UPROPERTY()
1837+
UPubnubClient* DefaultClient = nullptr;
18361838

18371839
//Thread for all PubNub operations, this thread will queue all PubNub calls and trigger them one by one
18381840
FPubnubFunctionThread* QuickActionThread = nullptr;
@@ -1904,14 +1906,17 @@ class PUBNUBLIBRARY_API UPubnubSubsystem : public UGameInstanceSubsystem
19041906
bool IsUserIDSet = false;
19051907
bool CheckIsPubnubInitialized();
19061908

1909+
//TO DELETE
19071910
FString GetUserIDInternal();
19081911

19091912
#pragma region PRIVATE FUNCTIONS
19101913

19111914
/* PRIVATE FUNCTIONS */
19121915
//These functions are called from "BLUEPRINT EXPOSED" functions on PubNub threads. They shouldn't be called directly on Game Thread.
1913-
1916+
1917+
//TO DELETE
19141918
void InitPubnub_priv(const FPubnubConfig& Config);
1919+
//TO DELETE
19151920
void SetUserID_priv(FString UserID);
19161921
void PublishMessage_priv(FString Channel, FString Message, FOnPublishMessageResponseNative OnPublishMessageResponse, FPubnubPublishSettings PublishSettings = FPubnubPublishSettings());
19171922
void Signal_priv(FString Channel, FString Message, FOnSignalResponseNative OnSignalResponse, FPubnubSignalSettings SignalSettings = FPubnubSignalSettings());

0 commit comments

Comments
 (0)