mirror of
https://gitlab.linphone.org/BC/public/linphone-iphone.git
synced 2026-01-30 17:59:21 +00:00
fix(CharModifier): clean code (refactor, cppcheck and errorCode is now one reference
This commit is contained in:
parent
9e73b3402b
commit
f54682374b
14 changed files with 174 additions and 157 deletions
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<ChatMessage> &message, int *errorCode) = 0;
|
||||
virtual Result encode (const std::shared_ptr<ChatMessage> &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<ChatMessage> &message, int *errorCode) = 0;
|
||||
virtual Result decode (const std::shared_ptr<ChatMessage> &message, int &errorCode) = 0;
|
||||
};
|
||||
|
||||
LINPHONE_END_NAMESPACE
|
||||
|
|
|
|||
|
|
@ -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<ChatMessage> &message, int *errorCode) {
|
||||
ChatMessageModifier::Result CpimChatMessageModifier::encode (const shared_ptr<ChatMessage> &message, int &errorCode) {
|
||||
Cpim::Message cpimMessage;
|
||||
Cpim::GenericHeader cpimContentTypeHeader;
|
||||
cpimContentTypeHeader.setName("Content-Type");
|
||||
|
|
@ -50,58 +50,53 @@ ChatMessageModifier::Result CpimChatMessageModifier::encode (const shared_ptr<Ch
|
|||
content = message->getContents().front();
|
||||
}
|
||||
|
||||
string contentType = content.getContentType().asString();
|
||||
const vector<char> 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<ChatMessage> &message, int *errorCode) {
|
||||
ChatMessageModifier::Result CpimChatMessageModifier::decode (const shared_ptr<ChatMessage> &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<char> body = content.getBody();
|
||||
string contentBody(body.begin(), body.end());
|
||||
shared_ptr<const Cpim::Message> 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<const Cpim::Message> 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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -30,8 +30,8 @@ class CpimChatMessageModifier : public ChatMessageModifier {
|
|||
public:
|
||||
CpimChatMessageModifier () = default;
|
||||
|
||||
Result encode (const std::shared_ptr<ChatMessage> &message, int *errorCode) override;
|
||||
Result decode (const std::shared_ptr<ChatMessage> &message, int *errorCode) override;
|
||||
Result encode (const std::shared_ptr<ChatMessage> &message, int &errorCode) override;
|
||||
Result decode (const std::shared_ptr<ChatMessage> &message, int &errorCode) override;
|
||||
};
|
||||
|
||||
LINPHONE_END_NAMESPACE
|
||||
|
|
|
|||
|
|
@ -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<ChatMessage> &message, int *errorCode) {
|
||||
int retval = -1;
|
||||
ChatMessageModifier::Result EncryptionChatMessageModifier::encode (
|
||||
const shared_ptr<ChatMessage> &message,
|
||||
int &errorCode
|
||||
) {
|
||||
shared_ptr<ChatRoom> 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<ChatMessage> &message, int *errorCode) {
|
||||
int retval = -1;
|
||||
ChatMessageModifier::Result EncryptionChatMessageModifier::decode (
|
||||
const shared_ptr<ChatMessage> &message,
|
||||
int &errorCode
|
||||
) {
|
||||
shared_ptr<ChatRoom> 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
|
||||
|
|
|
|||
|
|
@ -30,8 +30,8 @@ class EncryptionChatMessageModifier : public ChatMessageModifier {
|
|||
public:
|
||||
EncryptionChatMessageModifier () = default;
|
||||
|
||||
Result encode (const std::shared_ptr<ChatMessage> &message, int *errorCode) override;
|
||||
Result decode (const std::shared_ptr<ChatMessage> &message, int *errorCode) override;
|
||||
Result encode (const std::shared_ptr<ChatMessage> &message, int &errorCode) override;
|
||||
Result decode (const std::shared_ptr<ChatMessage> &message, int &errorCode) override;
|
||||
};
|
||||
|
||||
LINPHONE_END_NAMESPACE
|
||||
|
|
|
|||
|
|
@ -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<ChatMessage> &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<ChatMessage> &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<ChatMessage> &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<ChatMessage> &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<char> 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 !";
|
||||
|
|
|
|||
|
|
@ -30,8 +30,8 @@ class MultipartChatMessageModifier : public ChatMessageModifier {
|
|||
public:
|
||||
MultipartChatMessageModifier () = default;
|
||||
|
||||
Result encode (const std::shared_ptr<ChatMessage> &message, int *errorCode) override;
|
||||
Result decode (const std::shared_ptr<ChatMessage> &message, int *errorCode) override;
|
||||
Result encode (const std::shared_ptr<ChatMessage> &message, int &errorCode) override;
|
||||
Result decode (const std::shared_ptr<ChatMessage> &message, int &errorCode) override;
|
||||
};
|
||||
|
||||
LINPHONE_END_NAMESPACE
|
||||
|
|
|
|||
|
|
@ -22,7 +22,6 @@
|
|||
|
||||
#include <vector>
|
||||
|
||||
#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 {
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -24,6 +24,8 @@
|
|||
#include <bctoolbox/defs.h>
|
||||
#include <belle-sip/provider.h>
|
||||
|
||||
#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<char> 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<char> 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<char>(); // 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<char> 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));
|
||||
|
|
|
|||
|
|
@ -16,10 +16,11 @@
|
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#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"
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue