Skip to content

Commit 7c34609

Browse files
add runtime api selection + void* data for listeners' callbacks (#204)
Co-authored-by: Kamil Gronek <[email protected]>
1 parent 0e9b9b9 commit 7c34609

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+1672
-241
lines changed

.pubnub.yml

+15-8
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
11
name: c-core
22
schema: 1
3-
version: "4.19.1"
3+
version: "5.0.0"
44
scm: github.com/pubnub/c-core
55
changelog:
6+
- date: 2025-04-03
7+
version: v5.0.0
8+
changes:
9+
- type: feature
10+
text: "Add `PUBNUB_NTF_RUNTIME_SELECTION` flag that allows to select API type at runtime."
11+
- type: feature
12+
text: "Introduce `void*` parameter for user data in listeners to let callbacks keep context on demand."
613
- date: 2025-04-02
714
version: v4.19.1
815
changes:
@@ -929,7 +936,7 @@ sdks:
929936
distribution-type: source code
930937
distribution-repository: GitHub release
931938
package-name: C-Core
932-
location: https://github.com/pubnub/c-core/releases/tag/v4.19.1
939+
location: https://github.com/pubnub/c-core/releases/tag/v5.0.0
933940
requires:
934941
-
935942
name: "miniz"
@@ -995,7 +1002,7 @@ sdks:
9951002
distribution-type: source code
9961003
distribution-repository: GitHub release
9971004
package-name: C-Core
998-
location: https://github.com/pubnub/c-core/releases/tag/v4.19.1
1005+
location: https://github.com/pubnub/c-core/releases/tag/v5.0.0
9991006
requires:
10001007
-
10011008
name: "miniz"
@@ -1061,7 +1068,7 @@ sdks:
10611068
distribution-type: source code
10621069
distribution-repository: GitHub release
10631070
package-name: C-Core
1064-
location: https://github.com/pubnub/c-core/releases/tag/v4.19.1
1071+
location: https://github.com/pubnub/c-core/releases/tag/v5.0.0
10651072
requires:
10661073
-
10671074
name: "miniz"
@@ -1123,7 +1130,7 @@ sdks:
11231130
distribution-type: source code
11241131
distribution-repository: GitHub release
11251132
package-name: C-Core
1126-
location: https://github.com/pubnub/c-core/releases/tag/v4.19.1
1133+
location: https://github.com/pubnub/c-core/releases/tag/v5.0.0
11271134
requires:
11281135
-
11291136
name: "miniz"
@@ -1184,7 +1191,7 @@ sdks:
11841191
distribution-type: source code
11851192
distribution-repository: GitHub release
11861193
package-name: C-Core
1187-
location: https://github.com/pubnub/c-core/releases/tag/v4.19.1
1194+
location: https://github.com/pubnub/c-core/releases/tag/v5.0.0
11881195
requires:
11891196
-
11901197
name: "miniz"
@@ -1240,7 +1247,7 @@ sdks:
12401247
distribution-type: source code
12411248
distribution-repository: GitHub release
12421249
package-name: C-Core
1243-
location: https://github.com/pubnub/c-core/releases/tag/v4.19.1
1250+
location: https://github.com/pubnub/c-core/releases/tag/v5.0.0
12441251
requires:
12451252
-
12461253
name: "miniz"
@@ -1293,7 +1300,7 @@ sdks:
12931300
distribution-type: source code
12941301
distribution-repository: GitHub release
12951302
package-name: C-Core
1296-
location: https://github.com/pubnub/c-core/releases/tag/v4.19.1
1303+
location: https://github.com/pubnub/c-core/releases/tag/v5.0.0
12971304
requires:
12981305
-
12991306
name: "miniz"

CHANGELOG.md

+9
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
## v5.0.0
2+
April 03 2025
3+
4+
#### Added
5+
- Add `PUBNUB_NTF_RUNTIME_SELECTION` flag that allows to select API type at runtime.
6+
- Introduce `void*` parameter for user data in listeners to let callbacks keep context on demand.
7+
8+
WARNING: Release contains breaking changes!
9+
110
## v4.19.1
211
April 02 2025
312

CMakeLists.txt

+109-29
Original file line numberDiff line numberDiff line change
@@ -79,12 +79,14 @@ num_option(USE_REVOKE_TOKEN_API "Use revoke token API [OPENSSL ONLY]" OFF)
7979
num_option(USE_GRANT_TOKEN_API "Use grant token API [OPENSSL ONLY]" OFF)
8080
num_option(USE_FETCH_HISTORY "Use fetch history" ON)
8181
num_option(USE_CRYPTO_API "Use crypto API [OPENSSL ONLY]" OFF)
82-
num_option(USE_CALLBACK_API "Use callback API [CALLBACK=ON SYNC=OFF]" ${DEFAULT_USE_CALLBACK_API})
82+
num_option(USE_NTF_RUNTIME_SELECTION "Use runtime NTF API selection" OFF)
83+
num_option(USE_CALLBACK_API "Use callback API" ${DEFAULT_USE_CALLBACK_API})
8384
num_option(USE_IPV6 "Use IPv6" ON)
8485
num_option(USE_SET_DNS_SERVERS "Use set DNS servers [CALLBACK=ON]" ${DEFAULT_USE_CALLBACK_API})
8586
num_option(USE_EXTERN_API "Use extern C API [WITH_CPP=ON]" ON)
8687
num_option(USE_LEGACY_CRYPTO_RANDOM_IV "Use random IV for legacy crypto module [OpenSSL only]" ON)
8788
num_option(USE_LOG_CALLBACK "Use possibility to replace default logging function with user provided callback" OFF)
89+
log_option(COMPILE_COMMANDS "Generate compile_commands.json" OFF)
8890
log_set(OPENSSL_ROOT_DIR "" "OpenSSL root directory (leave empty for find_package() defaults)[OPENSSL=ON needed]")
8991
log_set(CUSTOM_OPENSSL_LIB_DIR "lib" "OpenSSL lib directory relative to OPENSSL_ROOT_DIR [used only if find_package() failed]")
9092
log_set(CUSTOM_OPENSSL_INCLUDE_DIR "include" "OpenSSL include directory relative to OPENSSL_ROOT_DIR [used only if find_package() failed]")
@@ -97,6 +99,15 @@ if (${OPENSSL} AND ${MBEDTLS})
9799
message(FATAL_ERROR "You can't use both OpenSSL and mbedTLS at the same time!")
98100
endif ()
99101

102+
if (${USE_NTF_RUNTIME_SELECTION} AND NOT ${USE_CALLBACK_API})
103+
message(FATAL_ERROR "You must enable callback API to use runtime NTF API selection!")
104+
endif ()
105+
106+
if(${COMPILE_COMMANDS})
107+
message(STATUS "Generating compile_commands.json")
108+
set(CMAKE_EXPORT_COMPILE_COMMANDS ON CACHE INTERNAL "")
109+
endif()
110+
100111
# Flags configuration
101112

102113
set(FLAGS "\
@@ -143,7 +154,13 @@ if (${USE_CALLBACK_API})
143154
${FLAGS} \
144155
-D PUBNUB_SET_DNS_SERVERS=${USE_SET_DNS_SERVERS} \
145156
-D PUBNUB_USE_IPV6=${USE_IPV6} \
146-
-D PUBNUB_CALLBACK_API")
157+
-D PUBNUB_CALLBACK_API=${USE_CALLBACK_API}")
158+
endif ()
159+
160+
if (${USE_SYNC_API})
161+
set(FLAGS "\
162+
${FLAGS} \
163+
-D PUBNUB_USE_SYNC_API=${USE_SYNC_API}")
147164
endif ()
148165

149166
if (${ASAN})
@@ -195,30 +212,25 @@ set(CORE_SOURCEFILES
195212
${CMAKE_CURRENT_LIST_DIR}/core/pubnub_helper.c
196213
${CMAKE_CURRENT_LIST_DIR}/core/pubnub_generate_uuid_v3_md5.c
197214
${CMAKE_CURRENT_LIST_DIR}/core/pubnub_free_with_timeout_std.c
215+
${CMAKE_CURRENT_LIST_DIR}/core/pubnub_alloc_std.c
216+
${CMAKE_CURRENT_LIST_DIR}/core/pubnub_memory_block.c
198217
${CMAKE_CURRENT_LIST_DIR}/core/pubnub_url_encode.c)
199218

200219
set(LIB_SOURCEFILES
201220
${CMAKE_CURRENT_LIST_DIR}/lib/sockets/pbpal_handle_socket_error.c
202221
${CMAKE_CURRENT_LIST_DIR}/lib/base64/pbbase64.c
203222
${CMAKE_CURRENT_LIST_DIR}/lib/pb_strnlen_s.c
204-
${CMAKE_CURRENT_LIST_DIR}/lib/pb_strncasecmp.c
205-
${CMAKE_CURRENT_LIST_DIR}/lib/pubnub_dns_codec.c)
223+
${CMAKE_CURRENT_LIST_DIR}/lib/pb_strncasecmp.c)
206224

207225
if (UNIX OR WIN32 OR WIN64 OR MSVC)
208226
set(CORE_SOURCEFILES
209227
${CORE_SOURCEFILES}
210-
${CMAKE_CURRENT_LIST_DIR}/core/pubnub_alloc_std.c
211228
${CMAKE_CURRENT_LIST_DIR}/core/pubnub_generate_uuid.c
212229
${CMAKE_CURRENT_LIST_DIR}/core/pubnub_assert_std.c)
213230

214231
set(LIB_SOURCEFILES
215232
${LIB_SOURCEFILES}
216-
${CMAKE_CURRENT_LIST_DIR}/lib/sockets/pbpal_adns_sockets.c
217233
${CMAKE_CURRENT_LIST_DIR}/lib/sockets/pbpal_resolv_and_connect_sockets.c)
218-
else ()
219-
set(CORE_SOURCEFILES
220-
${CORE_SOURCEFILES}
221-
${CMAKE_CURRENT_LIST_DIR}/core/pubnub_alloc_std.c)
222234
endif ()
223235

224236
if (NOT ${OPENSSL})
@@ -233,11 +245,13 @@ if (UNIX)
233245
set(LDLIBS "-lpthread ${LDLIBS}")
234246
set(OS_SOURCEFILES
235247
${CMAKE_CURRENT_LIST_DIR}/posix/posix_socket_blocking_io.c
236-
${CMAKE_CURRENT_LIST_DIR}/posix/pubnub_version_posix.c
237248
${CMAKE_CURRENT_LIST_DIR}/posix/pubnub_generate_uuid_posix.c
238249
${CMAKE_CURRENT_LIST_DIR}/posix/msstopwatch_monotonic_clock.c
239250
${CMAKE_CURRENT_LIST_DIR}/posix/pbtimespec_elapsed_ms.c
240251
${CMAKE_CURRENT_LIST_DIR}/posix/pb_sleep_ms.c)
252+
if (NOT ${WITH_CPP})
253+
set(OS_SOURCEFILES ${OS_SOURCEFILES} ${CMAKE_CURRENT_LIST_DIR}/posix/pubnub_version_posix.c)
254+
endif ()
241255

242256
if (APPLE)
243257
set(OS_SOURCEFILES ${OS_SOURCEFILES} ${CMAKE_CURRENT_LIST_DIR}/posix/monotonic_clock_get_time_darwin.c)
@@ -251,12 +265,15 @@ elseif (WIN32 OR WIN64 OR MSVC)
251265
set(OS_SOURCEFILES
252266
${CMAKE_CURRENT_LIST_DIR}/windows/windows_socket_blocking_io.c
253267
${CMAKE_CURRENT_LIST_DIR}/windows/pbtimespec_elapsed_ms.c
254-
${CMAKE_CURRENT_LIST_DIR}/windows/pubnub_version_windows.c
255268
${CMAKE_CURRENT_LIST_DIR}/windows/pubnub_generate_uuid_windows.c
256269
${CMAKE_CURRENT_LIST_DIR}/windows/pbpal_windows_blocking_io.c
257270
${CMAKE_CURRENT_LIST_DIR}/windows/msstopwatch_windows.c
258271
${CMAKE_CURRENT_LIST_DIR}/windows/pb_sleep_ms.c
259272
${CMAKE_CURRENT_LIST_DIR}/windows/pbauto_heartbeat_init_windows.c)
273+
274+
if (NOT ${WITH_CPP})
275+
set(OS_SOURCEFILES ${OS_SOURCEFILES} ${CMAKE_CURRENT_LIST_DIR}/windows/pubnub_version_windows.c)
276+
endif ()
260277
else ()
261278
message(STATUS "Using FreeRTOS setup")
262279

@@ -276,11 +293,8 @@ endif ()
276293
set(INTF_SOURCEFILES)
277294

278295
if (${USE_CALLBACK_API})
279-
message(STATUS "Using callback API")
280-
281296
set(CORE_SOURCEFILES
282297
${CORE_SOURCEFILES}
283-
${CMAKE_CURRENT_LIST_DIR}/core/pubnub_memory_block.c
284298
${CMAKE_CURRENT_LIST_DIR}/core/pubnub_dns_servers.c)
285299

286300
set(INTF_SOURCEFILES
@@ -293,31 +307,74 @@ if (${USE_CALLBACK_API})
293307
${CMAKE_CURRENT_LIST_DIR}/core/pubnub_callback_subscribe_loop.c
294308
${CMAKE_CURRENT_LIST_DIR}/core/pbpal_ntf_callback_admin.c
295309
${CMAKE_CURRENT_LIST_DIR}/lib/sockets/pbpal_adns_sockets.c
310+
${CMAKE_CURRENT_LIST_DIR}/lib/pubnub_dns_codec.c
296311
${INTF_SOURCEFILES})
297312

298313
if (UNIX)
299314
set(INTF_SOURCEFILES
300315
${INTF_SOURCEFILES}
301-
${CMAKE_CURRENT_LIST_DIR}/posix/pubnub_dns_system_servers.c
302-
${CMAKE_CURRENT_LIST_DIR}/posix/pubnub_ntf_callback_posix.c
303-
${CMAKE_CURRENT_LIST_DIR}/posix/pubnub_get_native_socket.c)
316+
${CMAKE_CURRENT_LIST_DIR}/posix/pubnub_dns_system_servers.c)
317+
if (${OPENSSL})
318+
set(INTF_SOURCEFILES
319+
${INTF_SOURCEFILES}
320+
${CMAKE_CURRENT_LIST_DIR}/openssl/pubnub_get_native_socket.c
321+
${CMAKE_CURRENT_LIST_DIR}/openssl/pubnub_ntf_callback_posix.c)
322+
else ()
323+
set(INTF_SOURCEFILES
324+
${INTF_SOURCEFILES}
325+
${CMAKE_CURRENT_LIST_DIR}/posix/pubnub_get_native_socket.c
326+
${CMAKE_CURRENT_LIST_DIR}/posix/pubnub_ntf_callback_posix.c)
327+
endif ()
328+
304329
elseif (WIN32 OR WIN64 OR MSVC)
305330
set(INTF_SOURCEFILES
306331
${INTF_SOURCEFILES}
307-
${CMAKE_CURRENT_LIST_DIR}/windows/pubnub_ntf_callback_windows.c
308-
${CMAKE_CURRENT_LIST_DIR}/windows/pubnub_dns_system_servers.c
309-
${CMAKE_CURRENT_LIST_DIR}/windows/pubnub_get_native_socket.c)
332+
${CMAKE_CURRENT_LIST_DIR}/windows/pubnub_dns_system_servers.c)
333+
if (${OPENSSL})
334+
set(INTF_SOURCEFILES
335+
${INTF_SOURCEFILES}
336+
${CMAKE_CURRENT_LIST_DIR}/openssl/pubnub_get_native_socket.c
337+
${CMAKE_CURRENT_LIST_DIR}/openssl/pubnub_ntf_callback_windows.c)
338+
else ()
339+
set(INTF_SOURCEFILES
340+
${INTF_SOURCEFILES}
341+
${CMAKE_CURRENT_LIST_DIR}/windows/pubnub_get_native_socket.c
342+
${CMAKE_CURRENT_LIST_DIR}/windows/pubnub_ntf_callback_windows.c)
343+
endif ()
310344
endif ()
311-
else ()
312-
message(STATUS "Using sync API")
313345

346+
if (UNIX OR WIN32 OR WIN64 OR MSVC)
347+
set(INTF_SOURCEFILES
348+
${INTF_SOURCEFILES}
349+
${CMAKE_CURRENT_LIST_DIR}/lib/sockets/pbpal_adns_sockets.c)
350+
endif ()
351+
endif ()
352+
353+
if (${USE_NTF_RUNTIME_SELECTION} OR NOT ${USE_CALLBACK_API})
314354
set(INTF_SOURCEFILES
315355
${INTF_SOURCEFILES}
316356
${CMAKE_CURRENT_LIST_DIR}/core/pubnub_ntf_sync.c
317357
${CMAKE_CURRENT_LIST_DIR}/core/pubnub_sync_subscribe_loop.c
318358
${CMAKE_CURRENT_LIST_DIR}/core/srand_from_pubnub_time.c)
319359
endif ()
320360

361+
if (${USE_NTF_RUNTIME_SELECTION})
362+
message(STATUS "Using runtime API selection")
363+
364+
set(CMAKE_C_FLAGS "\
365+
${CMAKE_C_FLAGS} \
366+
-D PUBNUB_NTF_RUNTIME_SELECTION")
367+
368+
set(INTF_SOURCEFILES
369+
${INTF_SOURCEFILES}
370+
${CMAKE_CURRENT_LIST_DIR}/core/pubnub_ntf_enforcement.c)
371+
372+
elseif (${USE_CALLBACK_API})
373+
message(STATUS "Using callback API")
374+
else ()
375+
message(STATUS "Using sync API")
376+
endif ()
377+
321378
set(FEATURE_SOURCEFILES)
322379

323380
if (${USE_PROXY})
@@ -495,6 +552,7 @@ if (${OPENSSL})
495552
${LIB_SOURCEFILES})
496553

497554
set(FEATURE_SOURCEFILES
555+
${CMAKE_CURRENT_LIST_DIR}/core/pubnub_ssl.c
498556
${CMAKE_CURRENT_LIST_DIR}/openssl/pbpal_openssl.c
499557
${CMAKE_CURRENT_LIST_DIR}/openssl/pbpal_connect_openssl.c
500558
${CMAKE_CURRENT_LIST_DIR}/openssl/pbpal_openssl_blocking_io.c
@@ -732,11 +790,18 @@ if (${EXAMPLES})
732790
message(STATUS "Building callback examples")
733791
set(EXAMPLE_LIST
734792
pubnub_callback_sample
735-
pubnub_callback_subloop_sample
736793
subscribe_publish_callback_sample
737794
subscribe_publish_from_callback
738-
publish_callback_subloop_sample
739-
publish_queue_callback_subloop)
795+
${EXAMPLE_LIST})
796+
797+
if (NOT ${USE_SYNC_API})
798+
set(EXAMPLE_LIST
799+
pubnub_callback_subloop_sample
800+
publish_callback_subloop_sample
801+
publish_queue_callback_subloop
802+
${EXAMPLE_LIST})
803+
endif ()
804+
740805
if (${USE_SUBSCRIBE_EVENT_ENGINE})
741806
set(EXAMPLE_LIST
742807
subscribe_event_engine_sample
@@ -747,16 +812,24 @@ if (${EXAMPLES})
747812
subscribe_publish_callback_sample # Only supports callback!
748813
${CPP_EXAMPLE_LIST})
749814
endif ()
750-
else ()
815+
endif ()
816+
if (NOT ${USE_CALLBACK_API} OR ${USE_NTF_RUNTIME_SELECTION})
751817
message(STATUS "Building sync examples")
752818
set(EXAMPLE_LIST
753819
metadata
754-
pubnub_sync_subloop_sample
755820
pubnub_sync_publish_retry
756821
pubnub_publish_via_post_sample
757822
pubnub_advanced_history_sample
758823
pubnub_fetch_history_sample
759-
cancel_subscribe_sync_sample)
824+
cancel_subscribe_sync_sample
825+
${EXAMPLE_LIST})
826+
827+
if (NOT ${USE_CALLBACK_API})
828+
set(EXAMPLE_LIST
829+
pubnub_sync_subloop_sample
830+
${EXAMPLE_LIST})
831+
endif ()
832+
760833
if (OPENSSL)
761834
set(EXAMPLE_LIST
762835
pubnub_crypto_module_sample
@@ -773,6 +846,13 @@ if (${EXAMPLES})
773846
${EXAMPLE_LIST})
774847
endif ()
775848
endif ()
849+
850+
if (${USE_NTF_RUNTIME_SELECTION})
851+
set(EXAMPLE_LIST
852+
pubnub_api_enforcement_sample
853+
${EXAMPLE_LIST})
854+
endif ()
855+
776856
else ()
777857
message(STATUS "Building example ${EXAMPLE}")
778858
set(EXAMPLE_LIST ${EXAMPLE})

0 commit comments

Comments
 (0)