diff options
Diffstat (limited to 'bindings/_common/Msrp.cxx')
-rwxr-xr-x | bindings/_common/Msrp.cxx | 628 |
1 files changed, 314 insertions, 314 deletions
diff --git a/bindings/_common/Msrp.cxx b/bindings/_common/Msrp.cxx index edb25d3..743be04 100755 --- a/bindings/_common/Msrp.cxx +++ b/bindings/_common/Msrp.cxx @@ -1,315 +1,315 @@ -/* -* 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; +/*
+* 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 |