From 54de6bb650119f6bf8a12cd1f368a4c060009dca Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 3 Oct 2017 14:41:02 +0200 Subject: [PATCH] Moved from shared_ptr to Content in ChatMessage --- src/chat/chat-message-p.h | 4 +- src/chat/chat-message.cpp | 39 +++++++------------ src/chat/chat-message.h | 6 +-- src/chat/chat-room.cpp | 30 +++++++------- .../modifier/cpim-chat-message-modifier.cpp | 28 ++++++------- src/content/content.cpp | 5 +++ src/content/content.h | 1 + 7 files changed, 55 insertions(+), 58 deletions(-) diff --git a/src/chat/chat-message-p.h b/src/chat/chat-message-p.h index efcd9bcf0..f931f421a 100644 --- a/src/chat/chat-message-p.h +++ b/src/chat/chat-message-p.h @@ -117,8 +117,8 @@ private: std::string rttMessage = ""; bool isSecured = false; bool isReadOnly = false; - std::list > contents; - std::shared_ptr internalContent; + std::list contents; + Content internalContent; std::unordered_map customHeaders; std::shared_ptr eventsDb; mutable LinphoneErrorInfo * errorInfo = NULL; diff --git a/src/chat/chat-message.cpp b/src/chat/chat-message.cpp index 27f6edca6..e72f89d6f 100644 --- a/src/chat/chat-message.cpp +++ b/src/chat/chat-message.cpp @@ -140,41 +140,35 @@ string ChatMessagePrivate::getSalCustomHeaderValue(const string& name) { // ----------------------------------------------------------------------------- const string& ChatMessagePrivate::getContentType() { - if (internalContent) { - cContentType = internalContent->getContentType().asString(); + if (!internalContent.isEmpty()) { + cContentType = internalContent.getContentType().asString(); } else { if (contents.size() > 0) { - shared_ptr content = contents.front(); - cContentType = content->getContentType().asString(); + Content content = contents.front(); + cContentType = content.getContentType().asString(); } } return cContentType; } void ChatMessagePrivate::setContentType(const string& contentType) { - if (!internalContent) { - internalContent = make_shared(); - } - internalContent->setContentType(contentType); + internalContent.setContentType(contentType); } const string& ChatMessagePrivate::getText() { - if (internalContent) { - cText = internalContent->getBodyAsString(); + if (!internalContent.isEmpty()) { + cText = internalContent.getBodyAsString(); } else { if (contents.size() > 0) { - shared_ptr content = contents.front(); - cText = content->getBodyAsString(); + Content content = contents.front(); + cText = content.getBodyAsString(); } } return cText; } void ChatMessagePrivate::setText(const string& text) { - if (!internalContent) { - internalContent = make_shared(); - } - internalContent->setBody(text); + internalContent.setBody(text); } LinphoneContent * ChatMessagePrivate::getFileTransferInformation() const { @@ -1297,26 +1291,23 @@ bool ChatMessage::isReadOnly () const { return d->isReadOnly; } -list > ChatMessage::getContents () const { +const list& ChatMessage::getContents () const { L_D(); - list > contents; - for (const auto &content : d->contents) - contents.push_back(content); - return contents; + return d->contents; } -void ChatMessage::addContent (const shared_ptr &content) { +void ChatMessage::addContent (const Content &content) { L_D(); if (d->isReadOnly) return; d->contents.push_back(content); } -void ChatMessage::removeContent (const shared_ptr &content) { +void ChatMessage::removeContent (const Content& content) { L_D(); if (d->isReadOnly) return; - d->contents.remove(const_pointer_cast(content)); + d->contents.remove(content); } string ChatMessage::getCustomHeaderValue (const string &headerName) const { diff --git a/src/chat/chat-message.h b/src/chat/chat-message.h index 3fb5d4a2d..8344fe11e 100644 --- a/src/chat/chat-message.h +++ b/src/chat/chat-message.h @@ -133,9 +133,9 @@ public: bool isReadOnly() const; - std::list > getContents() const; - void addContent(const std::shared_ptr &content); - void removeContent(const std::shared_ptr &content); + const std::list& getContents() const; + void addContent(const Content& content); + void removeContent(const Content& content); std::string getCustomHeaderValue(const std::string &headerName) const; void addCustomHeader(const std::string &headerName, const std::string &headerValue); diff --git a/src/chat/chat-room.cpp b/src/chat/chat-room.cpp index ab5aa3116..dda6f4c7f 100644 --- a/src/chat/chat-room.cpp +++ b/src/chat/chat-room.cpp @@ -120,9 +120,9 @@ void ChatRoomPrivate::sendImdn (const string &payload, LinphoneReason reason) { msg->setFromAddress(identity); msg->setToAddress(peerAddress.asString()); - shared_ptr content = make_shared(); - content->setContentType("message/imdn+xml"); - content->setBody(payload); + Content content; + content.setContentType("message/imdn+xml"); + content.setBody(payload); msg->addContent(content); /* Do not try to encrypt the notification when it is reporting an error (maybe it should be bypassed only for some reasons). */ @@ -212,9 +212,9 @@ void ChatRoomPrivate::sendIsComposingNotification () { msg->setFromAddress(identity); msg->setToAddress(peerAddress.asString()); - shared_ptr content = make_shared(); - content->setContentType("application/im-iscomposing+xml"); - content->setBody(payload); + Content content; + content.setContentType("application/im-iscomposing+xml"); + content.setBody(payload); msg->addContent(content); LinphoneImEncryptionEngine *imee = linphone_core_get_im_encryption_engine(core); @@ -269,14 +269,14 @@ int ChatRoomPrivate::createChatMessageFromDb (int argc, char **argv, char **colN if (!message) { message = q->createMessage(); - shared_ptr content = make_shared(); + Content content; message->addContent(content); if (argv[4]) { - content->setBody(argv[4]); + content.setBody(argv[4]); } if (argv[13]) { - content->setContentType(argv[13]); + content.setContentType(argv[13]); } Address peer(peerAddress.asString()); @@ -399,9 +399,9 @@ LinphoneReason ChatRoomPrivate::messageReceived (SalOp *op, const SalMessage *sa msg = q->createMessage(); - shared_ptr content = make_shared(); - content->setContentType(salMsg->content_type); - content->setBody(salMsg->text ? salMsg->text : ""); + Content content; + content.setContentType(salMsg->content_type); + content.setBody(salMsg->text ? salMsg->text : ""); msg->addContent(content); msg->setToAddress(op->get_to() ? op->get_to() : linphone_core_get_identity(core)); @@ -565,9 +565,9 @@ shared_ptr ChatRoom::createMessage (const string &message) { L_D(); shared_ptr chatMessage = createMessage(); - shared_ptr content = make_shared(); - content->setContentType("text/plain"); - content->setBody(message); + Content content; + content.setContentType("text/plain"); + content.setBody(message); chatMessage->addContent(content); chatMessage->setToAddress(d->peerAddress); diff --git a/src/chat/modifier/cpim-chat-message-modifier.cpp b/src/chat/modifier/cpim-chat-message-modifier.cpp index 65cb25e1e..c46dd0223 100644 --- a/src/chat/modifier/cpim-chat-message-modifier.cpp +++ b/src/chat/modifier/cpim-chat-message-modifier.cpp @@ -37,8 +37,8 @@ int CpimChatMessageModifier::encode (ChatMessagePrivate *messagePrivate) { cpimContentTypeHeader.setValue("Message/CPIM"); message.addCpimHeader(cpimContentTypeHeader); - shared_ptr content; - if (messagePrivate->internalContent) { + Content content; + if (!messagePrivate->internalContent.isEmpty()) { // Another ChatMessageModifier was called before this one, we apply our changes on the private content content = messagePrivate->internalContent; } else { @@ -48,8 +48,8 @@ int CpimChatMessageModifier::encode (ChatMessagePrivate *messagePrivate) { content = messagePrivate->contents.front(); } - string contentType = content->getContentType().asString(); - const vector body = content->getBody(); + string contentType = content.getContentType().asString(); + const vector body = content.getBody(); string contentBody(body.begin(), body.end()); Cpim::GenericHeader contentTypeHeader; @@ -62,33 +62,33 @@ int CpimChatMessageModifier::encode (ChatMessagePrivate *messagePrivate) { if (!message.isValid()) { //TODO } else { - shared_ptr newContent = make_shared(); + Content newContent; ContentType newContentType("Message/CPIM"); - newContent->setContentType(newContentType); - newContent->setBody(message.asString()); + newContent.setContentType(newContentType); + newContent.setBody(message.asString()); messagePrivate->internalContent = newContent; } return 0; } int CpimChatMessageModifier::decode (ChatMessagePrivate *messagePrivate) { - shared_ptr content; - if (messagePrivate->internalContent) { + Content content; + if (!messagePrivate->internalContent.isEmpty()) { content = messagePrivate->internalContent; } else { content = messagePrivate->contents.front(); } - ContentType contentType = content->getContentType(); + ContentType contentType = content.getContentType(); if (contentType.asString() == "Message/CPIM") { - const vector body = content->getBody(); + const vector body = content.getBody(); string contentBody(body.begin(), body.end()); shared_ptr message = Cpim::Message::createFromString(contentBody); if (message && message->isValid()) { - shared_ptr newContent = make_shared(); + Content newContent; ContentType newContentType(message->getContentHeaders()->front()->getValue()); - newContent->setContentType(newContentType); - newContent->setBody(message->getContent()); + newContent.setContentType(newContentType); + newContent.setBody(message->getContent()); } else { //TODO } diff --git a/src/content/content.cpp b/src/content/content.cpp index 9c12562dc..2c3786ea5 100644 --- a/src/content/content.cpp +++ b/src/content/content.cpp @@ -67,6 +67,11 @@ Content &Content::operator= (Content &&src) { return *this; } +bool Content::operator==(const Content& content) { + // return true if the two are equal, and false otherwise. + return true; +} + const ContentType &Content::getContentType () const { L_D(); return d->contentType; diff --git a/src/content/content.h b/src/content/content.h index 084f47fc8..c7f419223 100644 --- a/src/content/content.h +++ b/src/content/content.h @@ -38,6 +38,7 @@ public: Content &operator= (const Content &src); Content &operator= (Content &&src); + bool operator==(const Content& content); const ContentType &getContentType () const; void setContentType (const ContentType &contentType);