summaryrefslogtreecommitdiffstats
path: root/bindings/_common/SipEvent.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'bindings/_common/SipEvent.cxx')
-rw-r--r--bindings/_common/SipEvent.cxx284
1 files changed, 284 insertions, 0 deletions
diff --git a/bindings/_common/SipEvent.cxx b/bindings/_common/SipEvent.cxx
new file mode 100644
index 0000000..3518f4a
--- /dev/null
+++ b/bindings/_common/SipEvent.cxx
@@ -0,0 +1,284 @@
+/*
+* Copyright (C) 2010-2011 Mamadou Diop.
+*
+* Contact: Mamadou Diop <diopmamadou(at)doubango.org>
+*
+* This file is part of Open Source Doubango Framework.
+*
+* DOUBANGO is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* DOUBANGO is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with DOUBANGO.
+*
+*/
+#include "SipEvent.h"
+#include "SipSession.h"
+#include "SipMessage.h"
+
+#include "SipStack.h"
+
+
+#define takeOwnership_Implement(cls, name, session) \
+name##Session* cls##Event::take##session##Ownership() const \
+{ \
+ if(this->sipevent && this->sipevent->ss /*&& !tsip_ssession_have_ownership(this->sipevent->ss)*/){ \
+ SipStack* stack = this->getStack(); \
+ if(stack){ \
+ /* The constructor will call take_ownerhip() */ \
+ return new name##Session(stack, this->sipevent->ss); \
+ } \
+ } \
+ return tsk_null; \
+} \
+
+/* ======================== SipEvent ========================*/
+SipEvent::SipEvent(const tsip_event_t *_sipevent)
+{
+ this->sipevent = _sipevent;
+ if(_sipevent){
+ this->sipmessage = new SipMessage(_sipevent->sipmessage);
+ }
+ else{
+ this->sipmessage = tsk_null;
+ }
+}
+
+SipEvent::~SipEvent()
+{
+ if(this->sipmessage){
+ delete this->sipmessage;
+ }
+}
+
+short SipEvent::getCode() const
+{
+ return this->sipevent->code;
+}
+
+const char* SipEvent::getPhrase() const
+{
+ return this->sipevent->phrase;
+}
+
+const SipSession* SipEvent::getBaseSession() const
+{
+ const void* userdata = tsip_ssession_get_userdata(this->sipevent->ss);
+ if(userdata){
+ return dyn_cast<const SipSession*>((const SipSession*)userdata);
+ }
+ return tsk_null;
+}
+
+const SipMessage* SipEvent::getSipMessage() const
+{
+ return this->sipmessage;
+}
+
+SipStack* SipEvent::getStack()const
+{
+ const tsip_stack_handle_t* stack_handle = tsip_ssession_get_stack(sipevent->ss);
+ const void* userdata;
+ if(stack_handle && (userdata = tsip_stack_get_userdata(stack_handle))){
+ return dyn_cast<SipStack*>((SipStack*)userdata);
+ }
+ return tsk_null;
+}
+
+
+/* ======================== DialogEvent ========================*/
+DialogEvent::DialogEvent(const tsip_event_t *_sipevent)
+:SipEvent(_sipevent){ }
+
+DialogEvent::~DialogEvent(){ }
+
+
+/* ======================== DialogEvent ========================*/
+StackEvent::StackEvent(const tsip_event_t *_sipevent)
+:SipEvent(_sipevent){ }
+
+StackEvent::~StackEvent(){ }
+
+
+/* ======================== InviteEvent ========================*/
+InviteEvent::InviteEvent(const tsip_event_t *_sipevent)
+:SipEvent(_sipevent)
+{
+}
+
+InviteEvent::~InviteEvent()
+{
+}
+
+tsip_invite_event_type_t InviteEvent::getType() const
+{
+ return TSIP_INVITE_EVENT(this->sipevent)->type;
+}
+
+twrap_media_type_t InviteEvent::getMediaType() const
+{
+ // Ignore Mixed session (both audio/video and MSRP) as specified by GSMA RCS.
+ if (this->sipevent && this->sipevent->ss) {
+ tmedia_type_t type = tsip_ssession_get_mediatype(this->sipevent->ss);
+ if ((type & tmedia_msrp) == tmedia_msrp) {
+ return twrap_media_msrp;
+ }
+ else {
+ return twrap_get_wrapped_media_type(type);
+ }
+ }
+ return twrap_media_none;
+}
+
+const InviteSession* InviteEvent::getSession() const
+{
+ return dyn_cast<const InviteSession*>(this->getBaseSession());
+}
+
+takeOwnership_Implement(Invite, Call, CallSession);
+takeOwnership_Implement(Invite, Msrp, MsrpSession);
+
+/* ======================== MessagingEvent ========================*/
+MessagingEvent::MessagingEvent(const tsip_event_t *_sipevent)
+:SipEvent(_sipevent)
+{
+}
+
+MessagingEvent::~MessagingEvent()
+{
+}
+
+tsip_message_event_type_t MessagingEvent::getType() const
+{
+ return TSIP_MESSAGE_EVENT(this->sipevent)->type;
+}
+
+const MessagingSession* MessagingEvent::getSession() const
+{
+ return dyn_cast<const MessagingSession*>(this->getBaseSession());
+}
+
+takeOwnership_Implement(Messaging, Messaging, Session);
+
+
+/* ======================== InfoEvent ========================*/
+InfoEvent::InfoEvent(const tsip_event_t *_sipevent)
+:SipEvent(_sipevent)
+{
+}
+
+InfoEvent::~InfoEvent()
+{
+}
+
+tsip_info_event_type_t InfoEvent::getType() const
+{
+ return TSIP_INFO_EVENT(this->sipevent)->type;
+}
+
+const InfoSession* InfoEvent::getSession() const
+{
+ return dyn_cast<const InfoSession*>(this->getBaseSession());
+}
+
+takeOwnership_Implement(Info, Info, Session);
+
+
+
+/* ======================== OptionsEvent ========================*/
+OptionsEvent::OptionsEvent(const tsip_event_t *_sipevent)
+:SipEvent(_sipevent)
+{
+}
+
+OptionsEvent::~OptionsEvent()
+{
+}
+
+tsip_options_event_type_t OptionsEvent::getType() const
+{
+ return TSIP_OPTIONS_EVENT(this->sipevent)->type;
+}
+
+const OptionsSession* OptionsEvent::getSession() const
+{
+ return dyn_cast<const OptionsSession*>(this->getBaseSession());
+}
+
+takeOwnership_Implement(Options, Options, Session);
+
+
+/* ======================== PublicationEvent ========================*/
+PublicationEvent::PublicationEvent(const tsip_event_t *_sipevent)
+:SipEvent(_sipevent)
+{
+}
+
+PublicationEvent::~PublicationEvent()
+{
+}
+
+tsip_publish_event_type_t PublicationEvent::getType() const
+{
+ return TSIP_PUBLISH_EVENT(this->sipevent)->type;
+}
+
+const PublicationSession* PublicationEvent::getSession() const
+{
+ return dyn_cast<const PublicationSession*>(this->getBaseSession());
+}
+
+takeOwnership_Implement(Publication, Publication, Session);
+
+
+/* ======================== RegistrationEvent ========================*/
+RegistrationEvent::RegistrationEvent(const tsip_event_t *_sipevent)
+:SipEvent(_sipevent)
+{
+}
+
+RegistrationEvent::~RegistrationEvent()
+{
+}
+
+tsip_register_event_type_t RegistrationEvent::getType() const
+{
+ return TSIP_REGISTER_EVENT(this->sipevent)->type;
+}
+
+const RegistrationSession* RegistrationEvent::getSession() const
+{
+ return dyn_cast<const RegistrationSession*>(this->getBaseSession());
+}
+
+takeOwnership_Implement(Registration, Registration, Session);
+
+
+/* ======================== SubscriptionEvent ========================*/
+SubscriptionEvent::SubscriptionEvent(const tsip_event_t *sipevent)
+:SipEvent(sipevent)
+{
+}
+
+SubscriptionEvent::~SubscriptionEvent()
+{
+}
+
+tsip_subscribe_event_type_t SubscriptionEvent::getType() const
+{
+ return TSIP_SUBSCRIBE_EVENT(this->sipevent)->type;
+}
+
+const SubscriptionSession* SubscriptionEvent::getSession() const
+{
+ return dyn_cast<const SubscriptionSession*>(this->getBaseSession());
+}
+
+takeOwnership_Implement(Subscription, Subscription, Session); \ No newline at end of file
OpenPOWER on IntegriCloud