From ef7ae680ffbe24b4dfc4791d614532a52f1ca199 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 28 Nov 2017 11:12:06 +0100 Subject: [PATCH] Add Message-ID header in CPIM messages. --- src/chat/chat-message/chat-message.cpp | 3 ++- src/chat/cpim/header/cpim-core-headers.cpp | 1 + src/chat/cpim/header/cpim-core-headers.h | 1 + src/chat/cpim/parser/cpim-grammar.cpp | 2 ++ src/chat/cpim/parser/cpim-parser.cpp | 7 +++++++ src/chat/modifier/cpim-chat-message-modifier.cpp | 8 ++++++++ 6 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index f7e02e512..2ceb5f27f 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -554,7 +554,8 @@ void ChatMessagePrivate::send () { } } - q->setImdnMessageId(op->get_call_id()); /* must be known at that time */ + if (q->getImdnMessageId().empty()) + q->setImdnMessageId(op->get_call_id()); /* must be known at that time */ //store(); // Store will be done right below in the setState(InProgress) diff --git a/src/chat/cpim/header/cpim-core-headers.cpp b/src/chat/cpim/header/cpim-core-headers.cpp index 2673f3b6e..be6031056 100644 --- a/src/chat/cpim/header/cpim-core-headers.cpp +++ b/src/chat/cpim/header/cpim-core-headers.cpp @@ -49,6 +49,7 @@ MAKE_CORE_HEADER_IMPL(From); MAKE_CORE_HEADER_IMPL(To); MAKE_CORE_HEADER_IMPL(Cc); MAKE_CORE_HEADER_IMPL(DateTime); +MAKE_CORE_HEADER_IMPL(MessageId); MAKE_CORE_HEADER_IMPL(Ns); MAKE_CORE_HEADER_IMPL(Require); diff --git a/src/chat/cpim/header/cpim-core-headers.h b/src/chat/cpim/header/cpim-core-headers.h index 55bb51f0b..deb052958 100644 --- a/src/chat/cpim/header/cpim-core-headers.h +++ b/src/chat/cpim/header/cpim-core-headers.h @@ -72,6 +72,7 @@ namespace Cpim { MAKE_CORE_HEADER(To, "To"); MAKE_CORE_HEADER(Cc, "cc"); MAKE_CORE_HEADER(DateTime, "DateTime"); + MAKE_CORE_HEADER(MessageId, "Message-ID"); MAKE_CORE_HEADER(Ns, "NS"); MAKE_CORE_HEADER(Require, "Require"); diff --git a/src/chat/cpim/parser/cpim-grammar.cpp b/src/chat/cpim/parser/cpim-grammar.cpp index 245477855..09a7c50c2 100644 --- a/src/chat/cpim/parser/cpim-grammar.cpp +++ b/src/chat/cpim/parser/cpim-grammar.cpp @@ -53,6 +53,8 @@ To-header-value = [ Formal-name ] "<" URI ">" DateTime-header = %d68.97.116.101.84.105.109.101 ": " DateTime-header-value DateTime-header-value = date-time +Message-ID-header = %d77.101.115.115.97.103.101.45.73.68 ": " Token + cc-header = %d99.99 ": " cc-header-value cc-header-value = [ Formal-name ] "<" URI ">" diff --git a/src/chat/cpim/parser/cpim-parser.cpp b/src/chat/cpim/parser/cpim-parser.cpp index b54a9a45b..56adb64d5 100644 --- a/src/chat/cpim/parser/cpim-parser.cpp +++ b/src/chat/cpim/parser/cpim-parser.cpp @@ -130,6 +130,7 @@ namespace Cpim { { "To", &HeaderNode::createCoreHeader }, { "cc", &HeaderNode::createCoreHeader }, { "DateTime", &HeaderNode::createCoreHeader }, + { "Message-ID", &HeaderNode::createCoreHeader }, { "Subject", &HeaderNode::createCoreHeader }, { "NS", &HeaderNode::createCoreHeader }, { "Require", &HeaderNode::createCoreHeader } @@ -394,6 +395,12 @@ bool Cpim::Parser::coreHeaderIsValid(const string &headerV return true; } +template<> +bool Cpim::Parser::coreHeaderIsValid(const string &headerValue) const { + L_D(); + return LinphonePrivate::coreHeaderIsValid(d->grammar, "Message-ID", headerValue); +} + template<> bool Cpim::Parser::coreHeaderIsValid(const string &headerValue) const { L_D(); diff --git a/src/chat/modifier/cpim-chat-message-modifier.cpp b/src/chat/modifier/cpim-chat-message-modifier.cpp index b3de39ef5..e0ac09768 100644 --- a/src/chat/modifier/cpim-chat-message-modifier.cpp +++ b/src/chat/modifier/cpim-chat-message-modifier.cpp @@ -45,6 +45,12 @@ ChatMessageModifier::Result CpimChatMessageModifier::encode (const shared_ptrgetToAddress())); cpimMessage.addMessageHeader(cpimToHeader); + char token[13]; + belle_sip_random_token(token, sizeof(token)); + Cpim::MessageIdHeader cpimMessageIdHeader; + cpimMessageIdHeader.setValue(token); + cpimMessage.addMessageHeader(cpimMessageIdHeader); + message->setImdnMessageId(token); const Content *content; if (!message->getInternalContent().isEmpty()) { @@ -127,6 +133,8 @@ ChatMessageModifier::Result CpimChatMessageModifier::decode (const shared_ptrgetValue()); else if (header->getName() == "To") cpimToAddress = Address(header->getValue()); + else if (header->getName() == "Message-Id") + message->setImdnMessageId(header->getValue()); } }