diff --git a/src/chat/chat-message-p.h b/src/chat/chat-message-p.h index 569cd676c..2d269865b 100644 --- a/src/chat/chat-message-p.h +++ b/src/chat/chat-message-p.h @@ -21,6 +21,7 @@ #define _CHAT_MESSAGE_P_H_ #include "chat-message.h" +#include "content/content-type.h" #include "db/events-db.h" #include "object/object-p.h" diff --git a/src/chat/chat-message.cpp b/src/chat/chat-message.cpp index 50822b168..74ca2b62f 100644 --- a/src/chat/chat-message.cpp +++ b/src/chat/chat-message.cpp @@ -998,11 +998,11 @@ LinphoneReason ChatMessagePrivate::receive() { if (internalContent.getContentType() == ContentType::Cpim) { CpimChatMessageModifier ccmm; - ccmm.decode(q->getSharedFromThis(), &errorCode); + ccmm.decode(q->getSharedFromThis(), errorCode); } EncryptionChatMessageModifier ecmm; - ChatMessageModifier::Result result = ecmm.decode(q->getSharedFromThis(), &errorCode); + ChatMessageModifier::Result result = ecmm.decode(q->getSharedFromThis(), errorCode); if (result == ChatMessageModifier::Result::Error) { /* Unable to decrypt message */ chatRoom->getPrivate()->notifyUndecryptableMessageReceived(q->getSharedFromThis()); @@ -1012,7 +1012,7 @@ LinphoneReason ChatMessagePrivate::receive() { } MultipartChatMessageModifier mcmm; - mcmm.decode(q->getSharedFromThis(), &errorCode); + mcmm.decode(q->getSharedFromThis(), errorCode); if (contents.size() == 0) { // All previous modifiers only altered the internal content, let's fill the content list @@ -1138,7 +1138,7 @@ void ChatMessagePrivate::send() { } else { if (contents.size() > 1) { MultipartChatMessageModifier mcmm; - mcmm.encode(q->getSharedFromThis(), &errorCode); + mcmm.encode(q->getSharedFromThis(), errorCode); } currentSendStep |= ChatMessagePrivate::Step::Multipart; } @@ -1147,7 +1147,7 @@ void ChatMessagePrivate::send() { lInfo() << "Encryption step already done, skipping"; } else { EncryptionChatMessageModifier ecmm; - ChatMessageModifier::Result result = ecmm.encode(q->getSharedFromThis(), &errorCode); + ChatMessageModifier::Result result = ecmm.encode(q->getSharedFromThis(), errorCode); if (result == ChatMessageModifier::Result::Error) { sal_error_info_set((SalErrorInfo *)op->get_error_info(), SalReasonNotAcceptable, "SIP", errorCode, "Unable to encrypt IM", nullptr); q->updateState(ChatMessage::State::NotDelivered); @@ -1165,7 +1165,7 @@ void ChatMessagePrivate::send() { } else { if (lp_config_get_int(chatRoom->getCore()->config, "sip", "use_cpim", 0) == 1) { CpimChatMessageModifier ccmm; - ccmm.encode(q->getSharedFromThis(), &errorCode); + ccmm.encode(q->getSharedFromThis(), errorCode); } currentSendStep |= ChatMessagePrivate::Step::Cpim; } diff --git a/src/chat/modifier/chat-message-modifier.h b/src/chat/modifier/chat-message-modifier.h index 8e448063c..c853fd5ae 100644 --- a/src/chat/modifier/chat-message-modifier.h +++ b/src/chat/modifier/chat-message-modifier.h @@ -20,9 +20,7 @@ #ifndef _CHAT_MESSAGE_MODIFIER_H_ #define _CHAT_MESSAGE_MODIFIER_H_ -#include "linphone/utils/general.h" #include "object/object.h" -#include "private.h" // ============================================================================= @@ -32,7 +30,7 @@ class ChatMessage; class ChatMessageModifier { public: - enum Result { + enum class Result { Skipped = -1, Done = 0, Suspended = 1, @@ -43,16 +41,16 @@ public: /** * This method will be called when the message is about to be sent. - * It should check first if the internalContent is filled. + * It should check first if the internalContent is filled. * If so, it should apply it's changes to it, otherwise it should use the contentsList. */ - virtual Result encode (const std::shared_ptr &message, int *errorCode) = 0; + virtual Result encode (const std::shared_ptr &message, int &errorCode) = 0; /** * This method will be called when the message is about to be received. * It should apply it's changes to the internal content, the last modifier will take care of filling the contentsList. */ - virtual Result decode (const std::shared_ptr &message, int *errorCode) = 0; + virtual Result decode (const std::shared_ptr &message, int &errorCode) = 0; }; LINPHONE_END_NAMESPACE diff --git a/src/chat/modifier/cpim-chat-message-modifier.cpp b/src/chat/modifier/cpim-chat-message-modifier.cpp index 04934aead..5f224a950 100644 --- a/src/chat/modifier/cpim-chat-message-modifier.cpp +++ b/src/chat/modifier/cpim-chat-message-modifier.cpp @@ -17,14 +17,14 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#include "cpim-chat-message-modifier.h" - +#include "address/address.h" +#include "chat/chat-message.h" #include "chat/cpim/cpim.h" #include "content/content-type.h" #include "content/content.h" -#include "address/address.h" #include "logger/logger.h" -#include "chat/chat-message.h" + +#include "cpim-chat-message-modifier.h" // ============================================================================= @@ -32,7 +32,7 @@ using namespace std; LINPHONE_BEGIN_NAMESPACE -ChatMessageModifier::Result CpimChatMessageModifier::encode (const shared_ptr &message, int *errorCode) { +ChatMessageModifier::Result CpimChatMessageModifier::encode (const shared_ptr &message, int &errorCode) { Cpim::Message cpimMessage; Cpim::GenericHeader cpimContentTypeHeader; cpimContentTypeHeader.setName("Content-Type"); @@ -50,58 +50,53 @@ ChatMessageModifier::Result CpimChatMessageModifier::encode (const shared_ptrgetContents().front(); } - string contentType = content.getContentType().asString(); - const vector body = content.getBody(); - string contentBody(body.begin(), body.end()); - Cpim::GenericHeader contentTypeHeader; contentTypeHeader.setName("Content-Type"); - contentTypeHeader.setValue(contentType); + contentTypeHeader.setValue(content.getContentType().asString()); cpimMessage.addContentHeader(contentTypeHeader); + const string contentBody = content.getBodyAsString(); cpimMessage.setContent(contentBody); if (!cpimMessage.isValid()) { lError() << "[CPIM] Message is invalid: " << contentBody; - *errorCode = 500; + errorCode = 500; return ChatMessageModifier::Result::Error; - } else { - Content newContent; - ContentType newContentType("Message/CPIM"); - newContent.setContentType(newContentType); - newContent.setBody(cpimMessage.asString()); - message->setInternalContent(newContent); } + + Content newContent; + newContent.setContentType(ContentType("Message/CPIM")); + newContent.setBody(cpimMessage.asString()); + message->setInternalContent(newContent); + return ChatMessageModifier::Result::Done; } -ChatMessageModifier::Result CpimChatMessageModifier::decode (const shared_ptr &message, int *errorCode) { +ChatMessageModifier::Result CpimChatMessageModifier::decode (const shared_ptr &message, int &errorCode) { Content content; - if (!message->getInternalContent().isEmpty()) { + if (!message->getInternalContent().isEmpty()) content = message->getInternalContent(); - } else { + else content = message->getContents().front(); - } - if (content.getContentType() == ContentType::Cpim) { - const vector body = content.getBody(); - string contentBody(body.begin(), body.end()); - shared_ptr cpimMessage = Cpim::Message::createFromString(contentBody); - if (cpimMessage && cpimMessage->isValid()) { - Content newContent; - ContentType newContentType(cpimMessage->getContentHeaders()->front()->getValue()); - newContent.setContentType(newContentType); - newContent.setBody(cpimMessage->getContent()); - message->setInternalContent(newContent); - } else { - lError() << "[CPIM] Message is invalid: " << contentBody; - *errorCode = 500; - return ChatMessageModifier::Result::Error; - } - } else { + if (content.getContentType() != ContentType::Cpim) { lError() << "[CPIM] Message is not CPIM but " << content.getContentType().asString(); return ChatMessageModifier::Result::Skipped; } + + const string contentBody = content.getBodyAsString(); + const shared_ptr cpimMessage = Cpim::Message::createFromString(contentBody); + if (!cpimMessage || !cpimMessage->isValid()) { + lError() << "[CPIM] Message is invalid: " << contentBody; + errorCode = 500; + return ChatMessageModifier::Result::Error; + } + + Content newContent; + newContent.setContentType(ContentType(cpimMessage->getContentHeaders()->front()->getValue())); + newContent.setBody(cpimMessage->getContent()); + message->setInternalContent(newContent); + return ChatMessageModifier::Result::Done; } diff --git a/src/chat/modifier/cpim-chat-message-modifier.h b/src/chat/modifier/cpim-chat-message-modifier.h index 4e26091b2..7cb94c705 100644 --- a/src/chat/modifier/cpim-chat-message-modifier.h +++ b/src/chat/modifier/cpim-chat-message-modifier.h @@ -30,8 +30,8 @@ class CpimChatMessageModifier : public ChatMessageModifier { public: CpimChatMessageModifier () = default; - Result encode (const std::shared_ptr &message, int *errorCode) override; - Result decode (const std::shared_ptr &message, int *errorCode) override; + Result encode (const std::shared_ptr &message, int &errorCode) override; + Result decode (const std::shared_ptr &message, int &errorCode) override; }; LINPHONE_END_NAMESPACE diff --git a/src/chat/modifier/encryption-chat-message-modifier.cpp b/src/chat/modifier/encryption-chat-message-modifier.cpp index 156b7350e..cfda245d2 100644 --- a/src/chat/modifier/encryption-chat-message-modifier.cpp +++ b/src/chat/modifier/encryption-chat-message-modifier.cpp @@ -17,16 +17,14 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#include "encryption-chat-message-modifier.h" - -#include "object/object-p.h" +#include "address/address.h" #include "c-wrapper/c-wrapper.h" - +#include "chat/chat-message.h" +#include "chat/chat-room.h" #include "content/content-type.h" #include "content/content.h" -#include "address/address.h" -#include "chat/chat-room.h" -#include "chat/chat-message.h" + +#include "encryption-chat-message-modifier.h" // ============================================================================= @@ -34,51 +32,67 @@ using namespace std; LINPHONE_BEGIN_NAMESPACE -ChatMessageModifier::Result EncryptionChatMessageModifier::encode (const shared_ptr &message, int *errorCode) { - int retval = -1; +ChatMessageModifier::Result EncryptionChatMessageModifier::encode ( + const shared_ptr &message, + int &errorCode +) { shared_ptr chatRoom = message->getChatRoom(); LinphoneImEncryptionEngine *imee = chatRoom->getCore()->im_encryption_engine; - if (imee) { - LinphoneImEncryptionEngineCbs *imeeCbs = linphone_im_encryption_engine_get_callbacks(imee); - LinphoneImEncryptionEngineCbsOutgoingMessageCb cbProcessOutgoingMessage = linphone_im_encryption_engine_cbs_get_process_outgoing_message(imeeCbs); - if (cbProcessOutgoingMessage) { - retval = cbProcessOutgoingMessage(imee, L_GET_C_BACK_PTR(chatRoom), L_GET_C_BACK_PTR(message->getSharedFromThis())); - if (retval == 0 || retval == 1) { - message->setIsSecured(true); - if (retval == 1) { - return ChatMessageModifier::Result::Suspended; - } - return ChatMessageModifier::Result::Done; - } else if (retval == -1) { - return ChatMessageModifier::Result::Skipped; - } - *errorCode = retval; - return ChatMessageModifier::Result::Error; - } + if (!imee) + return ChatMessageModifier::Result::Skipped; + + LinphoneImEncryptionEngineCbsOutgoingMessageCb cbProcessOutgoingMessage = + linphone_im_encryption_engine_cbs_get_process_outgoing_message( + linphone_im_encryption_engine_get_callbacks(imee) + ); + + if (!cbProcessOutgoingMessage) + return ChatMessageModifier::Result::Skipped; + + int retval = cbProcessOutgoingMessage(imee, L_GET_C_BACK_PTR(chatRoom), L_GET_C_BACK_PTR(message)); + if (retval == -1) + return ChatMessageModifier::Result::Skipped; + + if (retval != 0 && retval != 1) { + errorCode = retval; + return ChatMessageModifier::Result::Error; } - return ChatMessageModifier::Result::Skipped; + + message->setIsSecured(true); + if (retval == 1) + return ChatMessageModifier::Result::Suspended; + + return ChatMessageModifier::Result::Done; } -ChatMessageModifier::Result EncryptionChatMessageModifier::decode (const shared_ptr &message, int *errorCode) { - int retval = -1; +ChatMessageModifier::Result EncryptionChatMessageModifier::decode ( + const shared_ptr &message, + int &errorCode +) { shared_ptr chatRoom = message->getChatRoom(); LinphoneImEncryptionEngine *imee = chatRoom->getCore()->im_encryption_engine; - if (imee) { - LinphoneImEncryptionEngineCbs *imeeCbs = linphone_im_encryption_engine_get_callbacks(imee); - LinphoneImEncryptionEngineCbsIncomingMessageCb cbProcessIncomingMessage = linphone_im_encryption_engine_cbs_get_process_incoming_message(imeeCbs); - if (cbProcessIncomingMessage) { - retval = cbProcessIncomingMessage(imee, L_GET_C_BACK_PTR(chatRoom), L_GET_C_BACK_PTR(message->getSharedFromThis())); - if (retval == 0) { - message->setIsSecured(true); - return ChatMessageModifier::Result::Done; - } else if (retval == -1) { - return ChatMessageModifier::Result::Skipped; - } - *errorCode = retval; - return ChatMessageModifier::Result::Error; - } + if (!imee) + return ChatMessageModifier::Result::Skipped; + + LinphoneImEncryptionEngineCbsIncomingMessageCb cbProcessIncomingMessage = + linphone_im_encryption_engine_cbs_get_process_incoming_message( + linphone_im_encryption_engine_get_callbacks(imee) + ); + + if (!cbProcessIncomingMessage) + return ChatMessageModifier::Result::Skipped; + + int retval = cbProcessIncomingMessage(imee, L_GET_C_BACK_PTR(chatRoom), L_GET_C_BACK_PTR(message)); + if (retval != 0 && retval != -1) { + errorCode = retval; + return ChatMessageModifier::Result::Error; } - return ChatMessageModifier::Result::Skipped; + + if (retval == -1) + return ChatMessageModifier::Result::Skipped; + + message->setIsSecured(true); + return ChatMessageModifier::Result::Done; } LINPHONE_END_NAMESPACE diff --git a/src/chat/modifier/encryption-chat-message-modifier.h b/src/chat/modifier/encryption-chat-message-modifier.h index 6bd8833f2..6b17c9b5f 100644 --- a/src/chat/modifier/encryption-chat-message-modifier.h +++ b/src/chat/modifier/encryption-chat-message-modifier.h @@ -30,8 +30,8 @@ class EncryptionChatMessageModifier : public ChatMessageModifier { public: EncryptionChatMessageModifier () = default; - Result encode (const std::shared_ptr &message, int *errorCode) override; - Result decode (const std::shared_ptr &message, int *errorCode) override; + Result encode (const std::shared_ptr &message, int &errorCode) override; + Result decode (const std::shared_ptr &message, int &errorCode) override; }; LINPHONE_END_NAMESPACE diff --git a/src/chat/modifier/multipart-chat-message-modifier.cpp b/src/chat/modifier/multipart-chat-message-modifier.cpp index 72f1064ca..89b7c008f 100644 --- a/src/chat/modifier/multipart-chat-message-modifier.cpp +++ b/src/chat/modifier/multipart-chat-message-modifier.cpp @@ -17,49 +17,53 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#include "multipart-chat-message-modifier.h" - #include "address/address.h" -#include "chat/chat-room.h" #include "chat/chat-message.h" +#include "chat/chat-room.h" +#include "content/content-type.h" #include "logger/logger.h" +#include "multipart-chat-message-modifier.h" + // ============================================================================= using namespace std; LINPHONE_BEGIN_NAMESPACE -ChatMessageModifier::Result MultipartChatMessageModifier::encode (const shared_ptr &message, int *errorCode) { - if (message->getContents().size() > 1) { - LinphoneCore *lc = message->getChatRoom()->getCore(); - char tmp[64]; - lc->sal->create_uuid(tmp, sizeof(tmp)); - string boundary = tmp; - stringstream multipartMessage; +ChatMessageModifier::Result MultipartChatMessageModifier::encode ( + const shared_ptr &message, + int &errorCode +) { + if (message->getContents().size() <= 1) + return ChatMessageModifier::Result::Skipped; + LinphoneCore *lc = message->getChatRoom()->getCore(); + char tmp[64]; + lc->sal->create_uuid(tmp, sizeof(tmp)); + string boundary = tmp; + stringstream multipartMessage; + + multipartMessage << "--" << boundary; + for (const auto &content : message->getContents()) { + multipartMessage << "\r\n"; + multipartMessage << "Content-Type: " << content.getContentType().asString() << "\r\n\r\n"; + multipartMessage << content.getBodyAsString() << "\r\n\r\n"; multipartMessage << "--" << boundary; - for (auto it = message->getContents().begin(); it != message->getContents().end(); it++) { - multipartMessage << "\r\n"; - multipartMessage << "Content-Type: " << it->getContentType().asString() << "\r\n\r\n"; - multipartMessage << it->getBodyAsString() << "\r\n\r\n"; - multipartMessage << "--" << boundary; - } - multipartMessage << "--"; - - Content newContent; - ContentType newContentType("multipart/mixed"); - newContentType.setParameter("boundary=" + boundary); - newContent.setContentType(newContentType); - newContent.setBody(multipartMessage.str()); - message->setInternalContent(newContent); - - return ChatMessageModifier::Result::Done; } - return ChatMessageModifier::Result::Skipped; -} + multipartMessage << "--"; -ChatMessageModifier::Result MultipartChatMessageModifier::decode (const shared_ptr &message, int *errorCode) { + Content newContent; + ContentType newContentType("multipart/mixed"); + newContentType.setParameter("boundary=" + boundary); + newContent.setContentType(newContentType); + newContent.setBody(multipartMessage.str()); + message->setInternalContent(newContent); + + return ChatMessageModifier::Result::Done; +} + +ChatMessageModifier::Result MultipartChatMessageModifier::decode (const shared_ptr &message, int &errorCode) { if (message->getInternalContent().getContentType().getType() == "multipart") { string boundary = message->getInternalContent().getContentType().getParameter(); if (boundary.empty()) { @@ -74,11 +78,11 @@ ChatMessageModifier::Result MultipartChatMessageModifier::decode (const shared_p } boundary = "--" + boundary.substr(pos + 1); lInfo() << "Multipart boundary is " << boundary; - + const vector body = message->getInternalContent().getBody(); string contentsString(body.begin(), body.end()); - pos = contentsString.find(boundary); + pos = contentsString.find(boundary); if (pos == string::npos) { lError() << "Boundary not found in body !"; return ChatMessageModifier::Result::Error; @@ -89,9 +93,9 @@ ChatMessageModifier::Result MultipartChatMessageModifier::decode (const shared_p do { end = contentsString.find(boundary, start); if (end != string::npos) { - string contentString = contentsString.substr(start, end-start); + string contentString = contentsString.substr(start, end - start); - size_t contentTypePos = contentString.find(": ") + 2; // 2 is the size of : + size_t contentTypePos = contentString.find(": ") + 2; // 2 is the size of : size_t endOfLinePos = contentString.find("\r\n"); if (contentTypePos >= endOfLinePos) { lError() << "Content should start by a 'Content-Type: ' line !"; diff --git a/src/chat/modifier/multipart-chat-message-modifier.h b/src/chat/modifier/multipart-chat-message-modifier.h index 4336af26c..dd6328a22 100644 --- a/src/chat/modifier/multipart-chat-message-modifier.h +++ b/src/chat/modifier/multipart-chat-message-modifier.h @@ -30,8 +30,8 @@ class MultipartChatMessageModifier : public ChatMessageModifier { public: MultipartChatMessageModifier () = default; - Result encode (const std::shared_ptr &message, int *errorCode) override; - Result decode (const std::shared_ptr &message, int *errorCode) override; + Result encode (const std::shared_ptr &message, int &errorCode) override; + Result decode (const std::shared_ptr &message, int &errorCode) override; }; LINPHONE_END_NAMESPACE diff --git a/src/content/content.h b/src/content/content.h index 1e547ddf1..abf86c9d7 100644 --- a/src/content/content.h +++ b/src/content/content.h @@ -22,7 +22,6 @@ #include -#include "content-type.h" #include "object/app-data-container.h" #include "object/clonable-object.h" @@ -30,6 +29,7 @@ LINPHONE_BEGIN_NAMESPACE +class ContentType; class ContentPrivate; class LINPHONE_PUBLIC Content : public ClonableObject, public AppDataContainer { diff --git a/src/db/events-db.cpp b/src/db/events-db.cpp index da472eeae..f1f7b8844 100644 --- a/src/db/events-db.cpp +++ b/src/db/events-db.cpp @@ -29,6 +29,7 @@ #include "abstract/abstract-db-p.h" #include "chat/chat-message.h" #include "conference/participant.h" +#include "content/content-type.h" #include "content/content.h" #include "db/provider/db-session-provider.h" #include "event-log/call-event.h" diff --git a/src/sal/call-op.cpp b/src/sal/call-op.cpp index 4929e6085..8fac3f4e2 100644 --- a/src/sal/call-op.cpp +++ b/src/sal/call-op.cpp @@ -24,6 +24,8 @@ #include #include +#include "content/content-type.h" + using namespace std; LINPHONE_BEGIN_NAMESPACE @@ -35,15 +37,15 @@ SalCallOp::~SalCallOp() { int SalCallOp::set_local_media_description(SalMediaDescription *desc) { if (desc) sal_media_description_ref(desc); - + belle_sip_error_code error; belle_sdp_session_description_t *sdp = media_description_to_sdp(desc); vector buffer = marshal_media_description(sdp, error); if (error != BELLE_SIP_OK) return -1; - + this->local_body.setContentType(ContentType::Sdp); this->local_body.setBody(move(buffer)); - + if (this->local_media) sal_media_description_unref(this->local_media); this->local_media=desc; @@ -66,7 +68,7 @@ int SalCallOp::set_local_body(const Content &body) { int SalCallOp::set_local_body(const Content &&body) { if (!body.isValid()) return -1; - + if (body.getContentType() == ContentType::Sdp) { SalMediaDescription *desc = NULL; if (body.getSize() > 0) { @@ -81,7 +83,7 @@ int SalCallOp::set_local_body(const Content &&body) { if (this->local_media) sal_media_description_unref(this->local_media); this->local_media = desc; } - + this->local_body = body; return 0; } @@ -98,12 +100,12 @@ int SalCallOp::set_custom_body(belle_sip_message_t *msg, const Content &body) { ContentType contentType = body.getContentType(); string contentDisposition = body.getContentDisposition(); size_t bodySize = body.getBody().size(); - + if (bodySize > SIP_MESSAGE_BODY_LIMIT) { bctbx_error("trying to add a body greater than %lukB to message [%p]", (unsigned long)SIP_MESSAGE_BODY_LIMIT/1024, msg); return -1; } - + if (contentType.isValid()) { belle_sip_header_content_type_t *content_type = belle_sip_header_content_type_create(contentType.getType().c_str(), contentType.getSubType().c_str()); belle_sip_message_add_header(msg, BELLE_SIP_HEADER(content_type)); @@ -114,13 +116,13 @@ int SalCallOp::set_custom_body(belle_sip_message_t *msg, const Content &body) { } belle_sip_header_content_length_t *content_length = belle_sip_header_content_length_create(bodySize); belle_sip_message_add_header(msg, BELLE_SIP_HEADER(content_length)); - + if (bodySize > 0) { char *buffer = bctbx_new(char, bodySize); memcpy(buffer, body.getBody().data(), bodySize); belle_sip_message_assign_body(msg, buffer, bodySize); } - + return 0; } @@ -139,25 +141,25 @@ std::vector SalCallOp::marshal_media_description(belle_sdp_session_descrip buff.resize(bufLen); } } - + /* give up if hard limit reached */ if (error != BELLE_SIP_OK) { ms_error("Buffer too small (%d) or not enough memory, giving up SDP", (int)bufLen); return std::vector(); // return a new vector in order to free the buffer held by 'buff' vector } - + buff.resize(length); return buff; } int SalCallOp::set_sdp(belle_sip_message_t *msg,belle_sdp_session_description_t* session_desc) { belle_sip_error_code error; - + if (session_desc == NULL) return -1; vector buff = marshal_media_description(session_desc, error); if (error != BELLE_SIP_OK) return -1; - + Content body; body.setContentType(ContentType::Sdp); body.setBody(move(buff)); @@ -230,7 +232,7 @@ Content SalCallOp::extract_body(belle_sip_message_t *message) { const char *subtype_str = content_type ? belle_sip_header_content_type_get_subtype(content_type) : NULL; size_t length = content_length ? belle_sip_header_content_length_get_content_length(content_length) : 0; const char *body_str = belle_sip_message_get_body(message); - + if (type_str && subtype_str) body.setContentType(ContentType(type_str, subtype_str)); if (contentDisposition) body.setContentDisposition(belle_sip_header_content_disposition_get_content_disposition(contentDisposition)); @@ -241,7 +243,7 @@ Content SalCallOp::extract_body(belle_sip_message_t *message) { int SalCallOp::parse_sdp_body(const Content &body,belle_sdp_session_description_t** session_desc, SalReason *error) { *session_desc = NULL; *error = SalReasonNone; - + if (this->sdp_handling == SalOpSDPSimulateError) { ms_error("Simulating SDP parsing error for op %p", this); *error = SalReasonNotAcceptable; @@ -252,7 +254,7 @@ int SalCallOp::parse_sdp_body(const Content &body,belle_sdp_session_description_ ms_error("Simulating no SDP for op %p", this); return 0; } - + *session_desc = belle_sdp_session_description_parse(body.getBodyAsString().c_str()); if (*session_desc == NULL) { ms_error("Failed to parse SDP message."); @@ -301,7 +303,7 @@ void SalCallOp::sdp_process(){ } } } - + this->sdp_answer=(belle_sdp_session_description_t *)belle_sip_object_ref(media_description_to_sdp(this->result)); /*once we have generated the SDP answer, we modify the result description for processing by the upper layer. It should contains media parameters constraint from the remote offer, not our response*/ @@ -562,10 +564,10 @@ int SalCallOp::is_media_description_acceptable(SalMediaDescription *md) { SalReason SalCallOp::process_body_for_invite(belle_sip_request_t* invite) { SalReason reason = SalReasonNone; - + Content body = extract_body(BELLE_SIP_MESSAGE(invite)); if (!body.isValid()) return SalReasonUnsupportedContent; - + if (body.getContentType() == ContentType::Sdp) { belle_sdp_session_description_t* sdp; if (parse_sdp_body(body, &sdp, &reason) == 0) { @@ -1191,7 +1193,7 @@ int SalCallOp::refer_with_replaces(SalCallOp *other_call_op) { /*rfc3891 ... 4. User Agent Client Behavior: Sending a Replaces Header - + A User Agent that wishes to replace a single existing early or confirmed dialog with a new dialog of its own, MAY send the target User Agent an INVITE request containing a Replaces header field. The @@ -1200,7 +1202,7 @@ int SalCallOp::refer_with_replaces(SalCallOp *other_call_op) { and sends the new INVITE to the target.*/ from_tag=belle_sip_dialog_get_local_tag(other_call_op->dialog); to_tag=belle_sip_dialog_get_remote_tag(other_call_op->dialog); - + replaces=belle_sip_header_replaces_create(belle_sip_header_call_id_get_call_id(belle_sip_dialog_get_call_id(other_call_op->dialog)) ,from_tag,to_tag); escaped_replaces=belle_sip_header_replaces_value_to_escaped_string(replaces); @@ -1223,7 +1225,7 @@ SalCallOp *SalCallOp::get_replaces() { if (this->replaces){ /*rfc3891 3. User Agent Server Behavior: Receiving a Replaces Header - + The Replaces header contains information used to match an existing SIP dialog (call-id, to-tag, and from-tag). Upon receiving an INVITE with a Replaces header, the User Agent (UA) attempts to match this @@ -1438,7 +1440,7 @@ void SalCallOp::process_refer(const belle_sip_request_event_t *event, belle_sip_ belle_sip_header_referred_by_t *referred_by= belle_sip_message_get_header_by_type(BELLE_SIP_MESSAGE(req),belle_sip_header_referred_by_t); belle_sip_response_t* resp; belle_sip_uri_t* refer_to_uri; - + ms_message("Receiving REFER request on op [%p]", this); if (refer_to) { refer_to_uri=belle_sip_header_address_get_uri(BELLE_SIP_HEADER_ADDRESS(refer_to)); diff --git a/tester/cpim-tester.cpp b/tester/cpim-tester.cpp index 35af930bc..fe86d493e 100644 --- a/tester/cpim-tester.cpp +++ b/tester/cpim-tester.cpp @@ -16,10 +16,11 @@ * along with this program. If not, see . */ -#include "chat/cpim/cpim.h" #include "address/address.h" #include "chat/basic-chat-room.h" #include "chat/chat-message.h" +#include "chat/cpim/cpim.h" +#include "content/content-type.h" #include "liblinphone_tester.h" diff --git a/tester/multipart-tester.cpp b/tester/multipart-tester.cpp index b02ea3f4f..ba0917de8 100644 --- a/tester/multipart-tester.cpp +++ b/tester/multipart-tester.cpp @@ -19,6 +19,7 @@ #include "address/address.h" #include "chat/basic-chat-room.h" #include "chat/chat-message.h" +#include "content/content-type.h" #include "liblinphone_tester.h"