diff options
Diffstat (limited to 'bindings/_common/Msrp.cxx')
-rw-r--r-- | bindings/_common/Msrp.cxx | 283 |
1 files changed, 283 insertions, 0 deletions
diff --git a/bindings/_common/Msrp.cxx b/bindings/_common/Msrp.cxx new file mode 100644 index 0000000..a1d0992 --- /dev/null +++ b/bindings/_common/Msrp.cxx @@ -0,0 +1,283 @@ +/* +* 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 "Msrp.h" + +#include "SipSession.h" +#include "Common.h" + +/* ======================== MsrpMessage ========================*/ +MsrpMessage::MsrpMessage() +:m_pMessage(tsk_null) +{ +} + +MsrpMessage::MsrpMessage(tmsrp_message_t *_message) +{ + m_pMessage = (tmsrp_message_t *)tsk_object_ref(_message); +} + +MsrpMessage::~MsrpMessage() +{ + TSK_OBJECT_SAFE_FREE(m_pMessage); +} + +bool MsrpMessage::isRequest() +{ + return (m_pMessage->type == tmsrp_request); +} + +short MsrpMessage::getCode() +{ + return TMSRP_RESPONSE_CODE(m_pMessage); +} + +const char* MsrpMessage::getPhrase() +{ + return TMSRP_RESPONSE_PHRASE(m_pMessage); +} + +tmsrp_request_type_t MsrpMessage::getRequestType() +{ + if(TMSRP_MESSAGE_IS_REQUEST(m_pMessage)){ + return m_pMessage->line.request.type; + } + return tmsrp_NONE; +} + +void MsrpMessage::getByteRange(int64_t* start, int64_t* end, int64_t* total) +{ + if(m_pMessage->ByteRange){ + *start = m_pMessage->ByteRange->start; + *end = m_pMessage->ByteRange->end; + *total = m_pMessage->ByteRange->total; + } + else{ + *start = *end = *total = -1; + } +} + +bool MsrpMessage::isLastChunck() +{ + if(TMSRP_MESSAGE_IS_REQUEST(m_pMessage)){ + return (m_pMessage->end_line.cflag == '$'); + } + else{ + if(m_pMessage->ByteRange){ + return (m_pMessage->ByteRange->end >= m_pMessage->ByteRange->total); + } + } + return false; +} + +bool MsrpMessage::isSuccessReport() +{ + if(TMSRP_REQUEST_IS_REPORT(m_pMessage)){ + if(m_pMessage->Status){ + return m_pMessage->Status->code >= 200 && m_pMessage->Status->code <= 299; + } + } + return false; +} + +bool MsrpMessage::isFirstChunck() +{ + return (m_pMessage && m_pMessage->ByteRange->start == 1); +} + +char* MsrpMessage::getMsrpHeaderValue(const char* name) +{ + const tmsrp_header_t* header = this->getMsrpHeader(name, 0); + if(header){ + return tmsrp_header_tostring(header); + } + return tsk_null; +} + +char* MsrpMessage::getMsrpHeaderParamValue(const char* name, const char* param) +{ + return tsk_null; +} + +unsigned MsrpMessage::getMsrpContentLength() +{ + if(m_pMessage && + m_pMessage->Content && + m_pMessage->Content->data && + m_pMessage->Content->size){ + return m_pMessage->Content->size; + } + return 0; +} + +unsigned MsrpMessage::getMsrpContent(void* output, unsigned maxsize) +{ + unsigned retsize = 0; + if(!output || + !m_pMessage || + !m_pMessage->Content || + !m_pMessage->Content->data || + !m_pMessage->Content->size){ + return 0; + } + + + retsize = (m_pMessage->Content->size > maxsize) ? maxsize : m_pMessage->Content->size; + memcpy(output, m_pMessage->Content->data, retsize); + return retsize; +} + +const tmsrp_header_t* MsrpMessage::getMsrpHeader(const char* name, unsigned index /*= 0*/) +{ + tsk_size_t pos = 0; + const tmsrp_header_t* hdr = tsk_null; + const tsk_list_item_t *item; + + /* From tmsrp_message_get_headerAt() */ + if(!m_pMessage || !name){ + return tsk_null; + } + + if(tsk_striequals(name, "To-Path")){ + if(index == 0){ + hdr = (const tmsrp_header_t*)m_pMessage->To; + goto bail; + }else pos++; } + if(tsk_striequals(name, "From-Path")){ + if(index == 0){ + hdr = (const tmsrp_header_t*)m_pMessage->From; + goto bail; + }else pos++; } + if(tsk_striequals(name, "Message-ID")){ + if(index == 0){ + hdr = (const tmsrp_header_t*)m_pMessage->MessageID; + goto bail; + }else pos++; } + if(tsk_striequals(name, "Byte-Range")){ + if(index == 0){ + hdr = (const tmsrp_header_t*)m_pMessage->ByteRange; + goto bail; + }else pos++; } + if(tsk_striequals(name, "Failure-Report")){ + if(index == 0){ + hdr = (const tmsrp_header_t*)m_pMessage->FailureReport; + goto bail; + }else pos++; } + if(tsk_striequals(name, "Success-Report")){ + if(index == 0){ + hdr = (const tmsrp_header_t*)m_pMessage->SuccessReport; + goto bail; + }else pos++; } + if(tsk_striequals(name, "Status")){ + if(index == 0){ + hdr = (const tmsrp_header_t*)m_pMessage->Status; + goto bail; + }else pos++; } + if(tsk_striequals(name, "Content-Type")){ + if(index == 0){ + hdr = (const tmsrp_header_t*)m_pMessage->ContentType; + goto bail; + }else pos++; } + + + /* All other headers */ + tsk_list_foreach(item, m_pMessage->headers){ + if(tsk_striequals(tmsrp_header_get_nameex(TMSRP_HEADER(item->data)), name)){ + if(pos++ >= index){ + hdr = (const tmsrp_header_t*)item->data; + break; + } + } + } + + +bail: + return hdr; + +} + + + +/* ======================== MsrpEvent ========================*/ +MsrpEvent::MsrpEvent(const tmsrp_event_t *_msrpevent) +{ + this->_event = _msrpevent; + if(this->_event && this->_event->message){ + m_pMessage = new MsrpMessage((tmsrp_message_t *)this->_event->message); + } + else{ + m_pMessage = tsk_null; + } +} + +MsrpEvent::~MsrpEvent() +{ + if(m_pMessage){ + delete m_pMessage; + } +} + +tmsrp_event_type_t MsrpEvent::getType() +{ + if(this->_event){ + return this->_event->type; + } + return tmsrp_event_type_none; +} + +const MsrpSession* MsrpEvent::getSipSession() +{ + if(this->_event && this->_event->callback_data){ + return dyn_cast<const MsrpSession*>((const MsrpSession*)this->_event->callback_data); + } + return tsk_null; +} + +const MsrpMessage* MsrpEvent::getMessage() const +{ + return m_pMessage; +} + + + + +int twrap_msrp_cb(const tmsrp_event_t* _event) +{ + const MsrpSession* session = (const MsrpSession*)_event->callback_data; + MsrpCallback* callback; + int ret = -1; + + if(session){ + if((callback = session->getCallback())){ + MsrpEvent* e = new MsrpEvent(_event); + ret = callback->OnEvent(e); + delete e; + } + else{ + return 0; + } + } + else{ + TSK_DEBUG_ERROR("Invalid parameter"); + } + + return ret; +}
\ No newline at end of file |