feat(c-wrapper): L_GET_PRIVATE supports CPP_TYPE parameter

This commit is contained in:
Ronan Abhamon 2017-09-29 10:51:47 +02:00
parent 6024a8fd4e
commit 4e798d8b32
3 changed files with 58 additions and 19 deletions

View file

@ -149,7 +149,7 @@ void linphone_chat_room_send_chat_message (LinphoneChatRoom *cr, LinphoneChatMes
uint32_t linphone_chat_room_get_char (const LinphoneChatRoom *cr) { uint32_t linphone_chat_room_get_char (const LinphoneChatRoom *cr) {
if (linphone_core_realtime_text_enabled(linphone_chat_room_get_core(cr))) if (linphone_core_realtime_text_enabled(linphone_chat_room_get_core(cr)))
return static_cast<const LinphonePrivate::RealTimeTextChatRoom *>(L_GET_CPP_PTR_FROM_C_OBJECT(cr).get())->getChar(); return L_GET_CPP_PTR_FROM_C_OBJECT(cr, RealTimeTextChatRoom)->getChar();
return 0; return 0;
} }
@ -159,7 +159,7 @@ void linphone_chat_room_compose (LinphoneChatRoom *cr) {
LinphoneCall *linphone_chat_room_get_call (const LinphoneChatRoom *cr) { LinphoneCall *linphone_chat_room_get_call (const LinphoneChatRoom *cr) {
if (linphone_core_realtime_text_enabled(linphone_chat_room_get_core(cr))) if (linphone_core_realtime_text_enabled(linphone_chat_room_get_core(cr)))
return static_cast<const LinphonePrivate::RealTimeTextChatRoom *>(L_GET_CPP_PTR_FROM_C_OBJECT(cr).get())->getCall(); return L_GET_CPP_PTR_FROM_C_OBJECT(cr, RealTimeTextChatRoom)->getCall();
return nullptr; return nullptr;
} }

View file

@ -32,6 +32,12 @@
// Internal. // Internal.
// ============================================================================= // =============================================================================
#ifdef DEBUG
#define L_INTERNAL_WRAPPER_CONSTEXPR
#else
#define L_INTERNAL_WRAPPER_CONSTEXPR constexpr
#endif
LINPHONE_BEGIN_NAMESPACE LINPHONE_BEGIN_NAMESPACE
template<typename CppType> template<typename CppType>
@ -60,6 +66,13 @@ private:
}; };
}; };
template<typename CppPrivateType>
struct IsPrivateCppObject {
enum {
value = std::is_base_of<ObjectPrivate, CppPrivateType>::value || std::is_base_of<ClonableObjectPrivate, CppPrivateType>::value
};
};
template<typename CppType> template<typename CppType>
struct IsDefinedCppObject { struct IsDefinedCppObject {
enum { enum {
@ -106,6 +119,29 @@ private:
} }
public: public:
// ---------------------------------------------------------------------------
// Casts.
// ---------------------------------------------------------------------------
template<
typename CppDerivedPrivateType,
typename CppBasePrivateType,
typename = typename std::enable_if<IsPrivateCppObject<CppDerivedPrivateType>::value, CppDerivedPrivateType>::type
>
static L_INTERNAL_WRAPPER_CONSTEXPR CppDerivedPrivateType *cast (CppBasePrivateType *base) {
#ifdef DEBUG
if (!base)
return static_cast<CppDerivedPrivateType *>(base);
CppDerivedPrivateType *derived = dynamic_cast<CppDerivedPrivateType *>(base);
if (!derived)
fatal("Invalid cast.");
return derived;
#else
return static_cast<CppDerivedPrivateType *>(base);
#endif
}
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// Get private data of cpp Object. // Get private data of cpp Object.
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
@ -122,12 +158,6 @@ public:
// Get c/cpp ptr helpers. // Get c/cpp ptr helpers.
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
#ifdef DEBUG
#define L_INTERNAL_WRAPPER_CONSTEXPR
#else
#define L_INTERNAL_WRAPPER_CONSTEXPR constexpr
#endif
template< template<
typename CType, typename CType,
typename CppType = typename CTypeMetaInfo<CType>::cppType, typename CppType = typename CTypeMetaInfo<CType>::cppType,
@ -159,7 +189,7 @@ public:
> >
static L_INTERNAL_WRAPPER_CONSTEXPR std::shared_ptr<const CppType> getCppPtrFromC (const CType *cObject) { static L_INTERNAL_WRAPPER_CONSTEXPR std::shared_ptr<const CppType> getCppPtrFromC (const CType *cObject) {
#ifdef DEBUG #ifdef DEBUG
return getCppPtrFromC(const_cast<CType *>(cObject)); return getCppPtrFromC<CType, CppType>(const_cast<CType *>(cObject));
#else #else
return reinterpret_cast<const WrappedObject<CppType> *>(cObject)->cppPtr; return reinterpret_cast<const WrappedObject<CppType> *>(cObject)->cppPtr;
#endif #endif
@ -202,8 +232,6 @@ public:
#endif #endif
} }
#undef L_INTERNAL_WRAPPER_CONSTEXPR
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// Set c/cpp ptr helpers. // Set c/cpp ptr helpers.
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
@ -387,6 +415,8 @@ private:
LINPHONE_END_NAMESPACE LINPHONE_END_NAMESPACE
#undef L_INTERNAL_WRAPPER_CONSTEXPR
#define L_INTERNAL_C_OBJECT_NO_XTOR(C_OBJECT) #define L_INTERNAL_C_OBJECT_NO_XTOR(C_OBJECT)
#define L_INTERNAL_DECLARE_C_OBJECT_FUNCTIONS(C_TYPE, CONSTRUCTOR, DESTRUCTOR) \ #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) LINPHONE_NAMESPACE::Wrapper::setCppPtrFromC(C_OBJECT, CPP_OBJECT)
// Get the private data of a shared or simple cpp-ptr. // 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)) LINPHONE_NAMESPACE::Wrapper::getPrivate(LINPHONE_NAMESPACE::Utils::getPtr(CPP_OBJECT))
#define L_GET_PRIVATE_2_ARGS(CPP_OBJECT, CPP_TYPE) \
LINPHONE_NAMESPACE::Wrapper::cast<CPP_TYPE ## Private>(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. // 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) \ #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) \ #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(...) \ #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)) L_EXPAND(L_GET_ARG_3(__VA_ARGS__, L_GET_PRIVATE_FROM_C_OBJECT_2_ARGS, L_GET_PRIVATE_FROM_C_OBJECT_1_ARGS))

View file

@ -16,6 +16,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "c-wrapper/c-wrapper.h"
#include "call-p.h" #include "call-p.h"
#include "conference/local-conference.h" #include "conference/local-conference.h"
#include "conference/participant-p.h" #include "conference/participant-p.h"
@ -51,11 +52,11 @@ CallPrivate::~CallPrivate () {
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
shared_ptr<CallSession> CallPrivate::getActiveSession () const { shared_ptr<CallSession> CallPrivate::getActiveSession () const {
return conference->getActiveParticipant()->getPrivate()->getSession(); return L_GET_PRIVATE(conference->getActiveParticipant())->getSession();
} }
bool CallPrivate::getAudioMuted () const { bool CallPrivate::getAudioMuted () const {
return static_cast<MediaSession *>(getActiveSession().get())->getPrivate()->getAudioMuted(); return L_GET_PRIVATE(getActiveSession(), MediaSession)->getAudioMuted();
} }
LinphoneProxyConfig *CallPrivate::getDestProxy () const { LinphoneProxyConfig *CallPrivate::getDestProxy () const {
@ -63,11 +64,11 @@ LinphoneProxyConfig *CallPrivate::getDestProxy () const {
} }
IceSession *CallPrivate::getIceSession () const { IceSession *CallPrivate::getIceSession () const {
return static_cast<MediaSession *>(getActiveSession().get())->getPrivate()->getIceSession(); return L_GET_PRIVATE(getActiveSession(), MediaSession)->getIceSession();
} }
MediaStream *CallPrivate::getMediaStream (LinphoneStreamType type) const { MediaStream *CallPrivate::getMediaStream (LinphoneStreamType type) const {
return static_cast<MediaSession *>(getActiveSession().get())->getPrivate()->getMediaStream(type); return L_GET_PRIVATE(getActiveSession(), MediaSession)->getMediaStream(type);
} }
SalOp *CallPrivate::getOp () const { SalOp *CallPrivate::getOp () const {
@ -75,7 +76,7 @@ SalOp *CallPrivate::getOp () const {
} }
void CallPrivate::setAudioMuted (bool value) { void CallPrivate::setAudioMuted (bool value) {
static_cast<MediaSession *>(getActiveSession().get())->getPrivate()->setAudioMuted(value); L_GET_PRIVATE(getActiveSession(), MediaSession)->setAudioMuted(value);
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------