From 4e798d8b32f77c4e4b09c8aec15a43e60137d706 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Fri, 29 Sep 2017 10:51:47 +0200 Subject: [PATCH] feat(c-wrapper): L_GET_PRIVATE supports CPP_TYPE parameter --- src/c-wrapper/api/c-chat-room.cpp | 4 +- src/c-wrapper/internal/c-tools.h | 62 +++++++++++++++++++++++++------ src/call/call.cpp | 11 +++--- 3 files changed, 58 insertions(+), 19 deletions(-) diff --git a/src/c-wrapper/api/c-chat-room.cpp b/src/c-wrapper/api/c-chat-room.cpp index 251e560d6..dc4bd45d1 100644 --- a/src/c-wrapper/api/c-chat-room.cpp +++ b/src/c-wrapper/api/c-chat-room.cpp @@ -149,7 +149,7 @@ void linphone_chat_room_send_chat_message (LinphoneChatRoom *cr, LinphoneChatMes uint32_t linphone_chat_room_get_char (const LinphoneChatRoom *cr) { if (linphone_core_realtime_text_enabled(linphone_chat_room_get_core(cr))) - return static_cast(L_GET_CPP_PTR_FROM_C_OBJECT(cr).get())->getChar(); + return L_GET_CPP_PTR_FROM_C_OBJECT(cr, RealTimeTextChatRoom)->getChar(); return 0; } @@ -159,7 +159,7 @@ void linphone_chat_room_compose (LinphoneChatRoom *cr) { LinphoneCall *linphone_chat_room_get_call (const LinphoneChatRoom *cr) { if (linphone_core_realtime_text_enabled(linphone_chat_room_get_core(cr))) - return static_cast(L_GET_CPP_PTR_FROM_C_OBJECT(cr).get())->getCall(); + return L_GET_CPP_PTR_FROM_C_OBJECT(cr, RealTimeTextChatRoom)->getCall(); return nullptr; } diff --git a/src/c-wrapper/internal/c-tools.h b/src/c-wrapper/internal/c-tools.h index 0a5c0eff9..2aeb69ac4 100644 --- a/src/c-wrapper/internal/c-tools.h +++ b/src/c-wrapper/internal/c-tools.h @@ -32,6 +32,12 @@ // Internal. // ============================================================================= +#ifdef DEBUG + #define L_INTERNAL_WRAPPER_CONSTEXPR +#else + #define L_INTERNAL_WRAPPER_CONSTEXPR constexpr +#endif + LINPHONE_BEGIN_NAMESPACE template @@ -60,6 +66,13 @@ private: }; }; + template + struct IsPrivateCppObject { + enum { + value = std::is_base_of::value || std::is_base_of::value + }; + }; + template struct IsDefinedCppObject { enum { @@ -106,6 +119,29 @@ private: } public: + // --------------------------------------------------------------------------- + // Casts. + // --------------------------------------------------------------------------- + + template< + typename CppDerivedPrivateType, + typename CppBasePrivateType, + typename = typename std::enable_if::value, CppDerivedPrivateType>::type + > + static L_INTERNAL_WRAPPER_CONSTEXPR CppDerivedPrivateType *cast (CppBasePrivateType *base) { + #ifdef DEBUG + if (!base) + return static_cast(base); + + CppDerivedPrivateType *derived = dynamic_cast(base); + if (!derived) + fatal("Invalid cast."); + return derived; + #else + return static_cast(base); + #endif + } + // --------------------------------------------------------------------------- // Get private data of cpp Object. // --------------------------------------------------------------------------- @@ -122,12 +158,6 @@ public: // Get c/cpp ptr helpers. // --------------------------------------------------------------------------- - #ifdef DEBUG - #define L_INTERNAL_WRAPPER_CONSTEXPR - #else - #define L_INTERNAL_WRAPPER_CONSTEXPR constexpr - #endif - template< typename CType, typename CppType = typename CTypeMetaInfo::cppType, @@ -159,7 +189,7 @@ public: > static L_INTERNAL_WRAPPER_CONSTEXPR std::shared_ptr getCppPtrFromC (const CType *cObject) { #ifdef DEBUG - return getCppPtrFromC(const_cast(cObject)); + return getCppPtrFromC(const_cast(cObject)); #else return reinterpret_cast *>(cObject)->cppPtr; #endif @@ -202,8 +232,6 @@ public: #endif } - #undef L_INTERNAL_WRAPPER_CONSTEXPR - // --------------------------------------------------------------------------- // Set c/cpp ptr helpers. // --------------------------------------------------------------------------- @@ -387,6 +415,8 @@ private: LINPHONE_END_NAMESPACE +#undef L_INTERNAL_WRAPPER_CONSTEXPR + #define L_INTERNAL_C_OBJECT_NO_XTOR(C_OBJECT) #define L_INTERNAL_DECLARE_C_OBJECT_FUNCTIONS(C_TYPE, CONSTRUCTOR, DESTRUCTOR) \ @@ -552,14 +582,22 @@ LINPHONE_END_NAMESPACE LINPHONE_NAMESPACE::Wrapper::setCppPtrFromC(C_OBJECT, CPP_OBJECT) // Get the private data of a shared or simple cpp-ptr. -#define L_GET_PRIVATE(CPP_OBJECT) \ +#define L_GET_PRIVATE_1_ARGS(CPP_OBJECT) \ LINPHONE_NAMESPACE::Wrapper::getPrivate(LINPHONE_NAMESPACE::Utils::getPtr(CPP_OBJECT)) +#define L_GET_PRIVATE_2_ARGS(CPP_OBJECT, CPP_TYPE) \ + LINPHONE_NAMESPACE::Wrapper::cast(L_GET_PRIVATE_1_ARGS(CPP_OBJECT)) + +#define L_GET_PRIVATE_MACRO_CHOOSER(...) \ + L_EXPAND(L_GET_ARG_3(__VA_ARGS__, L_GET_PRIVATE_2_ARGS, L_GET_PRIVATE_1_ARGS)) + +#define L_GET_PRIVATE(...) \ + L_EXPAND(L_GET_PRIVATE_MACRO_CHOOSER(__VA_ARGS__)(__VA_ARGS__)) // Get the private data of a shared or simple cpp-ptr of a wrapped C object. #define L_GET_PRIVATE_FROM_C_OBJECT_1_ARGS(C_OBJECT) \ - L_GET_PRIVATE(LINPHONE_NAMESPACE::Utils::getPtr(L_GET_CPP_PTR_FROM_C_OBJECT_1_ARGS(C_OBJECT))) + L_GET_PRIVATE_1_ARGS(LINPHONE_NAMESPACE::Utils::getPtr(L_GET_CPP_PTR_FROM_C_OBJECT_1_ARGS(C_OBJECT))) #define L_GET_PRIVATE_FROM_C_OBJECT_2_ARGS(C_OBJECT, CPP_TYPE) \ - L_GET_PRIVATE(LINPHONE_NAMESPACE::Utils::getPtr(L_GET_CPP_PTR_FROM_C_OBJECT_2_ARGS(C_OBJECT, CPP_TYPE))) + L_GET_PRIVATE_1_ARGS(LINPHONE_NAMESPACE::Utils::getPtr(L_GET_CPP_PTR_FROM_C_OBJECT_2_ARGS(C_OBJECT, CPP_TYPE))) #define L_GET_PRIVATE_FROM_C_OBJECT_MACRO_CHOOSER(...) \ L_EXPAND(L_GET_ARG_3(__VA_ARGS__, L_GET_PRIVATE_FROM_C_OBJECT_2_ARGS, L_GET_PRIVATE_FROM_C_OBJECT_1_ARGS)) diff --git a/src/call/call.cpp b/src/call/call.cpp index a9f22730e..68adb2b62 100644 --- a/src/call/call.cpp +++ b/src/call/call.cpp @@ -16,6 +16,7 @@ * along with this program. If not, see . */ +#include "c-wrapper/c-wrapper.h" #include "call-p.h" #include "conference/local-conference.h" #include "conference/participant-p.h" @@ -51,11 +52,11 @@ CallPrivate::~CallPrivate () { // ----------------------------------------------------------------------------- shared_ptr CallPrivate::getActiveSession () const { - return conference->getActiveParticipant()->getPrivate()->getSession(); + return L_GET_PRIVATE(conference->getActiveParticipant())->getSession(); } bool CallPrivate::getAudioMuted () const { - return static_cast(getActiveSession().get())->getPrivate()->getAudioMuted(); + return L_GET_PRIVATE(getActiveSession(), MediaSession)->getAudioMuted(); } LinphoneProxyConfig *CallPrivate::getDestProxy () const { @@ -63,11 +64,11 @@ LinphoneProxyConfig *CallPrivate::getDestProxy () const { } IceSession *CallPrivate::getIceSession () const { - return static_cast(getActiveSession().get())->getPrivate()->getIceSession(); + return L_GET_PRIVATE(getActiveSession(), MediaSession)->getIceSession(); } MediaStream *CallPrivate::getMediaStream (LinphoneStreamType type) const { - return static_cast(getActiveSession().get())->getPrivate()->getMediaStream(type); + return L_GET_PRIVATE(getActiveSession(), MediaSession)->getMediaStream(type); } SalOp *CallPrivate::getOp () const { @@ -75,7 +76,7 @@ SalOp *CallPrivate::getOp () const { } void CallPrivate::setAudioMuted (bool value) { - static_cast(getActiveSession().get())->getPrivate()->setAudioMuted(value); + L_GET_PRIVATE(getActiveSession(), MediaSession)->setAudioMuted(value); } // -----------------------------------------------------------------------------