summaryrefslogtreecommitdiffstats
path: root/bindings/_common/SipMessage.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'bindings/_common/SipMessage.cxx')
-rwxr-xr-xbindings/_common/SipMessage.cxx422
1 files changed, 244 insertions, 178 deletions
diff --git a/bindings/_common/SipMessage.cxx b/bindings/_common/SipMessage.cxx
index a4f09fd..2f0000b 100755
--- a/bindings/_common/SipMessage.cxx
+++ b/bindings/_common/SipMessage.cxx
@@ -2,19 +2,19 @@
* 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.
*
@@ -23,231 +23,297 @@
SdpMessage::SdpMessage()
-:m_pSdpMessage(tsk_null)
+ :m_pSdpMessage(tsk_null)
{
}
SdpMessage::SdpMessage(tsdp_message_t *_sdpmessage)
{
- m_pSdpMessage = (tsdp_message_t *)tsk_object_ref(_sdpmessage);
+ m_pSdpMessage = (tsdp_message_t *)tsk_object_ref(_sdpmessage);
}
SdpMessage::~SdpMessage()
{
- TSK_OBJECT_SAFE_FREE(m_pSdpMessage);
+ TSK_OBJECT_SAFE_FREE(m_pSdpMessage);
}
char* SdpMessage::getSdpHeaderValue(const char* media, char name, unsigned index /*= 0*/)
{
- const tsdp_header_M_t* M;
-
- if((M = (const tsdp_header_M_t*)tsdp_message_get_header(m_pSdpMessage, tsdp_htype_M))){
- tsdp_header_type_t type = tsdp_htype_Dummy;
- const tsdp_header_t* header;
- switch(name){
- case 'a': type = tsdp_htype_A; break;
- case 'b': type = tsdp_htype_B; break;
- case 'c': type = tsdp_htype_C; break;
- case 'e': type = tsdp_htype_E; break;
- case 'i': type = tsdp_htype_I; break;
- case 'k': type = tsdp_htype_K; break;
- case 'm': type = tsdp_htype_M; break;
- case 'o': type = tsdp_htype_O; break;
-
-
- case 'p': type = tsdp_htype_P; break;
- case 'r': type = tsdp_htype_R; break;
- case 's': type = tsdp_htype_S; break;
- case 't': type = tsdp_htype_T; break;
- case 'u': type = tsdp_htype_U; break;
- case 'v': type = tsdp_htype_V; break;
- case 'z': type = tsdp_htype_Z; break;
- }
-
- if((header = tsdp_message_get_headerAt(m_pSdpMessage, type, index))){
- return tsdp_header_tostring(header);
- }
- }
-
- return tsk_null;
+ const tsdp_header_M_t* M;
+
+ if((M = (const tsdp_header_M_t*)tsdp_message_get_header(m_pSdpMessage, tsdp_htype_M))) {
+ tsdp_header_type_t type = tsdp_htype_Dummy;
+ const tsdp_header_t* header;
+ switch(name) {
+ case 'a':
+ type = tsdp_htype_A;
+ break;
+ case 'b':
+ type = tsdp_htype_B;
+ break;
+ case 'c':
+ type = tsdp_htype_C;
+ break;
+ case 'e':
+ type = tsdp_htype_E;
+ break;
+ case 'i':
+ type = tsdp_htype_I;
+ break;
+ case 'k':
+ type = tsdp_htype_K;
+ break;
+ case 'm':
+ type = tsdp_htype_M;
+ break;
+ case 'o':
+ type = tsdp_htype_O;
+ break;
+
+
+ case 'p':
+ type = tsdp_htype_P;
+ break;
+ case 'r':
+ type = tsdp_htype_R;
+ break;
+ case 's':
+ type = tsdp_htype_S;
+ break;
+ case 't':
+ type = tsdp_htype_T;
+ break;
+ case 'u':
+ type = tsdp_htype_U;
+ break;
+ case 'v':
+ type = tsdp_htype_V;
+ break;
+ case 'z':
+ type = tsdp_htype_Z;
+ break;
+ }
+
+ if((header = tsdp_message_get_headerAt(m_pSdpMessage, type, index))) {
+ return tsdp_header_tostring(header);
+ }
+ }
+
+ return tsk_null;
}
char* SdpMessage::getSdpHeaderAValue(const char* media, const char* attributeName)
{
- const tsdp_header_M_t* M;
- tsk_size_t i;
-
- for(i = 0; (M = (const tsdp_header_M_t*)tsdp_message_get_headerAt(m_pSdpMessage, tsdp_htype_M, i)); i++){
- if(tsk_striequals(M->media, media)){
- const tsdp_header_A_t* A;
- if((A = tsdp_header_M_findA(M, attributeName))){
- return tsk_strdup(A->value);
- }
- }
- }
-
- return tsk_null;
+ const tsdp_header_M_t* M;
+ tsk_size_t i;
+
+ for(i = 0; (M = (const tsdp_header_M_t*)tsdp_message_get_headerAt(m_pSdpMessage, tsdp_htype_M, i)); i++) {
+ if(tsk_striequals(M->media, media)) {
+ const tsdp_header_A_t* A;
+ if((A = tsdp_header_M_findA(M, attributeName))) {
+ return tsk_strdup(A->value);
+ }
+ }
+ }
+
+ return tsk_null;
}
SipMessage::SipMessage()
-:m_pSipMessage(tsk_null), m_pSdpMessage(tsk_null)
-{
+ :m_pSipMessage(tsk_null), m_pSdpMessage(tsk_null)
+{
}
SipMessage::SipMessage(tsip_message_t *_sipmessage)
-: m_pSdpMessage(tsk_null)
+ : m_pSdpMessage(tsk_null)
{
- m_pSipMessage = (tsip_message_t *)tsk_object_ref(_sipmessage);
+ m_pSipMessage = (tsip_message_t *)tsk_object_ref(_sipmessage);
}
SipMessage::~SipMessage()
{
- TSK_OBJECT_SAFE_FREE(m_pSipMessage);
- if(m_pSdpMessage){
- delete m_pSdpMessage;
- }
+ TSK_OBJECT_SAFE_FREE(m_pSipMessage);
+ if(m_pSdpMessage) {
+ delete m_pSdpMessage;
+ }
}
bool SipMessage::isResponse()
{
- return TSIP_MESSAGE_IS_RESPONSE(m_pSipMessage);
+ return TSIP_MESSAGE_IS_RESPONSE(m_pSipMessage);
}
tsip_request_type_t SipMessage::getRequestType()
{
- if(TSIP_MESSAGE_IS_REQUEST(m_pSipMessage)){
- return (m_pSipMessage)->line.request.request_type;
- }
- return tsip_NONE;
+ if(TSIP_MESSAGE_IS_REQUEST(m_pSipMessage)) {
+ return (m_pSipMessage)->line.request.request_type;
+ }
+ return tsip_NONE;
}
short SipMessage::getResponseCode()
{
- return TSIP_RESPONSE_CODE(m_pSipMessage);
+ return TSIP_RESPONSE_CODE(m_pSipMessage);
}
const char* SipMessage::getResponsePhrase()
{
- return TSIP_RESPONSE_PHRASE(m_pSipMessage);
+ return TSIP_RESPONSE_PHRASE(m_pSipMessage);
}
const tsip_header_t* SipMessage::getSipHeader(const char* name, unsigned index /* =0 */)
{
- /* Do not worry about calling tsk_striequals() several times because the function
- * is fully optimized.
- */
- /* Code below comes from tsip_message_get_headerAt() */
- tsk_size_t pos = 0;
- const tsk_list_item_t *item;
- const tsip_header_t* hdr = tsk_null;
- if(!m_pSipMessage || !name){
- return tsk_null;
- }
-
- if(tsk_striequals(name, "v") || tsk_striequals(name, "via")){
- if(index == 0){
- hdr = (const tsip_header_t*)m_pSipMessage->firstVia;
- goto bail;
- }else pos++; }
- if(tsk_striequals(name, "f") || tsk_striequals(name, "from")){
- if(index == 0){
- hdr = (const tsip_header_t*)m_pSipMessage->From;
- goto bail;
- }else pos++; }
- if(tsk_striequals(name, "t") || tsk_striequals(name, "to")){
- if(index == 0){
- hdr = (const tsip_header_t*)m_pSipMessage->To;
- goto bail;
- }else pos++; }
- if(tsk_striequals(name, "m") || tsk_striequals(name, "contact")){
- if(index == 0){
- hdr = (const tsip_header_t*)m_pSipMessage->Contact;
- goto bail;
- }else pos++; }
- if(tsk_striequals(name, "i") || tsk_striequals(name, "call-id")){
- if(index == 0){
- hdr = (const tsip_header_t*)m_pSipMessage->Call_ID;
- goto bail;
- }else pos++; }
- if(tsk_striequals(name, "cseq")){
- if(index == 0){
- hdr = (const tsip_header_t*)m_pSipMessage->CSeq;
- goto bail;
- }else pos++; }
- if(tsk_striequals(name, "expires")){
- if(index == 0){
- hdr = (const tsip_header_t*)m_pSipMessage->Expires;
- goto bail;
- }else pos++; }
- if(tsk_striequals(name, "c") || tsk_striequals(name, "content-type")){
- if(index == 0){
- hdr = (const tsip_header_t*)m_pSipMessage->Content_Type;
- goto bail;
- }else pos++; }
- if(tsk_striequals(name, "l") || tsk_striequals(name, "content-length")){
- if(index == 0){
- hdr = (const tsip_header_t*)m_pSipMessage->Content_Length;
- goto bail;
- }else pos++; }
-
-
- tsk_list_foreach(item, m_pSipMessage->headers){
- if(tsk_striequals(tsip_header_get_name_2(TSIP_HEADER(item->data)), name)){
- if(pos++ >= index){
- hdr = (const tsip_header_t*)item->data;
- break;
- }
- }
- }
-
+ /* Do not worry about calling tsk_striequals() several times because the function
+ * is fully optimized.
+ */
+ /* Code below comes from tsip_message_get_headerAt() */
+ tsk_size_t pos = 0;
+ const tsk_list_item_t *item;
+ const tsip_header_t* hdr = tsk_null;
+ if(!m_pSipMessage || !name) {
+ return tsk_null;
+ }
+
+ if(tsk_striequals(name, "v") || tsk_striequals(name, "via")) {
+ if(index == 0) {
+ hdr = (const tsip_header_t*)m_pSipMessage->firstVia;
+ goto bail;
+ }
+ else {
+ pos++;
+ }
+ }
+ if(tsk_striequals(name, "f") || tsk_striequals(name, "from")) {
+ if(index == 0) {
+ hdr = (const tsip_header_t*)m_pSipMessage->From;
+ goto bail;
+ }
+ else {
+ pos++;
+ }
+ }
+ if(tsk_striequals(name, "t") || tsk_striequals(name, "to")) {
+ if(index == 0) {
+ hdr = (const tsip_header_t*)m_pSipMessage->To;
+ goto bail;
+ }
+ else {
+ pos++;
+ }
+ }
+ if(tsk_striequals(name, "m") || tsk_striequals(name, "contact")) {
+ if(index == 0) {
+ hdr = (const tsip_header_t*)m_pSipMessage->Contact;
+ goto bail;
+ }
+ else {
+ pos++;
+ }
+ }
+ if(tsk_striequals(name, "i") || tsk_striequals(name, "call-id")) {
+ if(index == 0) {
+ hdr = (const tsip_header_t*)m_pSipMessage->Call_ID;
+ goto bail;
+ }
+ else {
+ pos++;
+ }
+ }
+ if(tsk_striequals(name, "cseq")) {
+ if(index == 0) {
+ hdr = (const tsip_header_t*)m_pSipMessage->CSeq;
+ goto bail;
+ }
+ else {
+ pos++;
+ }
+ }
+ if(tsk_striequals(name, "expires")) {
+ if(index == 0) {
+ hdr = (const tsip_header_t*)m_pSipMessage->Expires;
+ goto bail;
+ }
+ else {
+ pos++;
+ }
+ }
+ if(tsk_striequals(name, "c") || tsk_striequals(name, "content-type")) {
+ if(index == 0) {
+ hdr = (const tsip_header_t*)m_pSipMessage->Content_Type;
+ goto bail;
+ }
+ else {
+ pos++;
+ }
+ }
+ if(tsk_striequals(name, "l") || tsk_striequals(name, "content-length")) {
+ if(index == 0) {
+ hdr = (const tsip_header_t*)m_pSipMessage->Content_Length;
+ goto bail;
+ }
+ else {
+ pos++;
+ }
+ }
+
+
+ tsk_list_foreach(item, m_pSipMessage->headers) {
+ if(tsk_striequals(tsip_header_get_name_2(TSIP_HEADER(item->data)), name)) {
+ if(pos++ >= index) {
+ hdr = (const tsip_header_t*)item->data;
+ break;
+ }
+ }
+ }
+
bail:
- return hdr;
+ return hdr;
}
// e.g. getHeaderParamValue("content-type");
char* SipMessage::getSipHeaderValue(const char* name, unsigned index /* = 0*/)
{
- const tsip_header_t* header;
- if((header = this->getSipHeader(name, index))){
-
- switch(header->type){
- case tsip_htype_From:
- return tsip_uri_tostring(((const tsip_header_From_t*)header)->uri, tsk_false, tsk_false);
- case tsip_htype_To:
- return tsip_uri_tostring(((const tsip_header_To_t*)header)->uri, tsk_false, tsk_false);
- break;
- case tsip_htype_P_Asserted_Identity:
- return tsip_uri_tostring(((const tsip_header_P_Asserted_Identity_t*)header)->uri, tsk_false, tsk_false);
- break;
-
- default:
- return tsip_header_value_tostring(header);
- }
- }
- // SWIG: %newobject getHeaderValueAt;
- return tsk_null;
+ const tsip_header_t* header;
+ if((header = this->getSipHeader(name, index))) {
+
+ switch(header->type) {
+ case tsip_htype_From:
+ return tsip_uri_tostring(((const tsip_header_From_t*)header)->uri, tsk_false, tsk_false);
+ case tsip_htype_To:
+ return tsip_uri_tostring(((const tsip_header_To_t*)header)->uri, tsk_false, tsk_false);
+ break;
+ case tsip_htype_P_Asserted_Identity:
+ return tsip_uri_tostring(((const tsip_header_P_Asserted_Identity_t*)header)->uri, tsk_false, tsk_false);
+ break;
+
+ default:
+ return tsip_header_value_tostring(header);
+ }
+ }
+ // SWIG: %newobject getHeaderValueAt;
+ return tsk_null;
}
// e.g. getHeaderParamValue("content-type", "charset");
char* SipMessage::getSipHeaderParamValue(const char* name, const char* param, unsigned index /*=0*/)
{
- const tsip_header_t* header;
+ const tsip_header_t* header;
- if((header = this->getSipHeader(name, index))){
- return tsip_header_get_param_value(header, param);
- }
+ if((header = this->getSipHeader(name, index))) {
+ return tsip_header_get_param_value(header, param);
+ }
- // SWIG: %newobject getSipHeaderParamValue;
- return tsk_null;
+ // SWIG: %newobject getSipHeaderParamValue;
+ return tsk_null;
}
/** Returns the content length.
*/
unsigned SipMessage::getSipContentLength()
{
- return TSIP_MESSAGE_CONTENT_DATA_LENGTH(m_pSipMessage);
+ return TSIP_MESSAGE_CONTENT_DATA_LENGTH(m_pSipMessage);
}
/** Gets the message content
@@ -259,31 +325,31 @@ unsigned SipMessage::getSipContentLength()
*/
unsigned SipMessage::getSipContent(void* output, unsigned maxsize)
{
- unsigned retsize = 0;
- if(output && maxsize && TSIP_MESSAGE_HAS_CONTENT(m_pSipMessage)){
- retsize = (m_pSipMessage->Content->size > maxsize) ? maxsize : m_pSipMessage->Content->size;
- memcpy(output, m_pSipMessage->Content->data, retsize);
- }
- return retsize;
+ unsigned retsize = 0;
+ if(output && maxsize && TSIP_MESSAGE_HAS_CONTENT(m_pSipMessage)) {
+ retsize = (m_pSipMessage->Content->size > maxsize) ? maxsize : m_pSipMessage->Content->size;
+ memcpy(output, m_pSipMessage->Content->data, retsize);
+ }
+ return retsize;
}
const void* SipMessage::getSipContentPtr()
{
- if(m_pSipMessage && m_pSipMessage->Content){
- return m_pSipMessage->Content->data;
- }
- return tsk_null;
+ if(m_pSipMessage && m_pSipMessage->Content) {
+ return m_pSipMessage->Content->data;
+ }
+ return tsk_null;
}
const SdpMessage* SipMessage::getSdpMessage()
{
- if(!m_pSdpMessage && TSIP_MESSAGE_HAS_CONTENT(m_pSipMessage)){
- tsdp_message_t* sdp = tsdp_message_parse(m_pSipMessage->Content->data, m_pSipMessage->Content->size);
- if(sdp){
- m_pSdpMessage = new SdpMessage(sdp);
- TSK_OBJECT_SAFE_FREE(sdp);
- }
- }
-
- return m_pSdpMessage;
+ if(!m_pSdpMessage && TSIP_MESSAGE_HAS_CONTENT(m_pSipMessage)) {
+ tsdp_message_t* sdp = tsdp_message_parse(m_pSipMessage->Content->data, m_pSipMessage->Content->size);
+ if(sdp) {
+ m_pSdpMessage = new SdpMessage(sdp);
+ TSK_OBJECT_SAFE_FREE(sdp);
+ }
+ }
+
+ return m_pSdpMessage;
}
OpenPOWER on IntegriCloud