Agora C++ API Reference for All Platforms
AgoraExtensionProviderEntry.h
1 //
2 // Copyright (c) 2020 Agora.io. All rights reserved
3 
4 // This program is confidential and proprietary to Agora.io.
5 // And may not be copied, reproduced, modified, disclosed to others, published
6 // or used, in whole or in part, without the express prior written permission
7 // of Agora.io.
8 
9 #pragma once // NOLINT(build/header_guard)
10 
11 #include "NGIAgoraExtensionControl.h"
12 AGORA_API agora::rtc::IExtensionControl* AGORA_CALL getAgoraExtensionControl();
13 
14 #define DECLARE_CREATE_AND_REGISTER_PROVIDER(PROVIDER_NAME, PROVIDER_CLASS, ...) \
15 static void register_##PROVIDER_NAME##_to_agora() { \
16  auto control = getAgoraExtensionControl(); \
17  if (#PROVIDER_NAME && control) { \
18  control->registerProvider(#PROVIDER_NAME, \
19  new agora::RefCountedObject<PROVIDER_CLASS>(__VA_ARGS__)); \
20  } \
21 } \
22 
23 #if defined (__GNUC__) && defined (TARGET_OS_IPHONE)
24 #define REGISTER_AGORA_EXTENSION_PROVIDER(PROVIDER_NAME, PROVIDER_CLASS, ...) \
25 DECLARE_CREATE_AND_REGISTER_PROVIDER(PROVIDER_NAME, PROVIDER_CLASS, __VA_ARGS__); \
26 typedef void(*agora_ext_entry_func_t)(void); \
27 AGORA_API void AGORA_CALL registerProviderEntry(const char*, agora_ext_entry_func_t); \
28 __attribute__((constructor, used)) \
29 static void _##PROVIDER_NAME##_provider_entry() { \
30  registerProviderEntry(#PROVIDER_NAME, register_##PROVIDER_NAME##_to_agora); \
31 } \
32 
33 #elif defined (__GNUC__) && (defined (__ANDROID__) || (__linux__))
34 #define REGISTER_AGORA_EXTENSION_PROVIDER(PROVIDER_NAME, PROVIDER_CLASS, ...) \
35 DECLARE_CREATE_AND_REGISTER_PROVIDER(PROVIDER_NAME, PROVIDER_CLASS, __VA_ARGS__); \
36 __attribute__((constructor, used)) \
37 static void _##PROVIDER_NAME##_provider_entry() { \
38  register_##PROVIDER_NAME##_to_agora(); \
39 } \
40 
41 #elif defined (_MSC_VER)
42 #define REGISTER_AGORA_EXTENSION_PROVIDER(PROVIDER_NAME, PROVIDER_CLASS, ...) \
43 DECLARE_CREATE_AND_REGISTER_PROVIDER(PROVIDER_NAME, PROVIDER_CLASS, __VA_ARGS__); \
44 typedef void(*agora_ext_entry_func_t)(void); \
45 AGORA_API void AGORA_CALL registerProviderEntry(const char*, agora_ext_entry_func_t); \
46 BOOL APIENTRY DllMain( HMODULE hModule, \
47  DWORD ul_reason_for_call, \
48  LPVOID lpReserved) { \
49  switch (ul_reason_for_call) { \
50  case DLL_PROCESS_ATTACH: \
51  registerProviderEntry(#PROVIDER_NAME, register_##PROVIDER_NAME##_to_agora); \
52  break; \
53  default: \
54  break; \
55  } \
56  return TRUE; \
57 } \
58 
59 #define REGISTER_AGORA_EXTENSION_PROVIDER_WITH_CUSTOM_DLLMAIN(PROVIDER_NAME, PROVIDER_CLASS, DLLMAINFUNC, ...) \
60 DECLARE_CREATE_AND_REGISTER_PROVIDER(PROVIDER_NAME, PROVIDER_CLASS, __VA_ARGS__); \
61 typedef void(*agora_ext_entry_func_t)(void); \
62 AGORA_API void AGORA_CALL registerProviderEntry(const char*, agora_ext_entry_func_t); \
63 BOOL APIENTRY DllMain( HMODULE hModule, \
64  DWORD ul_reason_for_call, \
65  LPVOID lpReserved) { \
66  if (!DLLMAINFUNC(hModule, ul_reason_for_call, lpReserved)) { \
67  return FALSE; \
68  } \
69  switch (ul_reason_for_call) { \
70  case DLL_PROCESS_ATTACH: \
71  registerProviderEntry(#PROVIDER_NAME, register_##PROVIDER_NAME##_to_agora); \
72  break; \
73  default: \
74  break; \
75  } \
76  return TRUE; \
77 } \
78 
79 #else
80 #error Unsupported Compilation Toolchain!
81 #endif
agora::rtc::IExtensionControl
Definition: NGIAgoraExtensionControl.h:23