From dd587b0bae0715b95fb78142466fd34fb3b340d8 Mon Sep 17 00:00:00 2001
From: Sylvain Berfini <sylvain.berfini@belledonne-communications.com>
Date: Fri, 26 Feb 2021 16:13:56 +0100
Subject: [PATCH] Added C/wrapped method to be able to add a generic content to
 a ChatMessage + added a custom content type multipart group chat test

---
 include/linphone/api/c-chat-message.h |  7 +++
 src/c-wrapper/api/c-chat-message.cpp  |  9 ++++
 tester/group_chat_tester.c            | 76 +++++++++++++++++++++++++++
 3 files changed, 92 insertions(+)

diff --git a/include/linphone/api/c-chat-message.h b/include/linphone/api/c-chat-message.h
index 3d7c97cbc2..5f968ef22e 100644
--- a/include/linphone/api/c-chat-message.h
+++ b/include/linphone/api/c-chat-message.h
@@ -382,6 +382,13 @@ LINPHONE_PUBLIC void linphone_chat_message_add_file_content (LinphoneChatMessage
  */
 LINPHONE_PUBLIC void linphone_chat_message_add_utf8_text_content (LinphoneChatMessage *message, const char *text);
 
+/**
+ * Adds a content to the ChatMessage.
+ * @param message #LinphoneChatMessage object. @notnil
+ * @param content the #LinphoneContent object to add. @notnil
+ */
+LINPHONE_PUBLIC void linphone_chat_message_add_content (LinphoneChatMessage *message, LinphoneContent *content);
+
 /**
  * Removes a content from the ChatMessage.
  * @param message #LinphoneChatMessage object. @notnil
diff --git a/src/c-wrapper/api/c-chat-message.cpp b/src/c-wrapper/api/c-chat-message.cpp
index b3169abbda..fdea542717 100644
--- a/src/c-wrapper/api/c-chat-message.cpp
+++ b/src/c-wrapper/api/c-chat-message.cpp
@@ -375,6 +375,15 @@ void linphone_chat_message_add_utf8_text_content (LinphoneChatMessage *msg, cons
 	L_GET_CPP_PTR_FROM_C_OBJECT(msg)->addContent(content);
 }
 
+void linphone_chat_message_add_content (LinphoneChatMessage *msg, LinphoneContent *c_content) {
+	LinphonePrivate::Content *content = L_GET_CPP_PTR_FROM_C_OBJECT(c_content);
+	LinphonePrivate::Content *cppContent = new LinphonePrivate::Content();
+	cppContent->setContentType(content->getContentType());
+	cppContent->setBody(content->getBody());
+	cppContent->setUserData(content->getUserData());
+	L_GET_CPP_PTR_FROM_C_OBJECT(msg)->addContent(cppContent);
+}
+
 void linphone_chat_message_remove_content (LinphoneChatMessage *msg, LinphoneContent *content) {
 	L_GET_CPP_PTR_FROM_C_OBJECT(msg)->removeContent(L_GET_CPP_PTR_FROM_C_OBJECT(content));
 }
diff --git a/tester/group_chat_tester.c b/tester/group_chat_tester.c
index 406d06995e..c85fae899a 100644
--- a/tester/group_chat_tester.c
+++ b/tester/group_chat_tester.c
@@ -3390,6 +3390,81 @@ static void group_chat_room_send_two_files_plus_text (void) {
 	group_chat_room_send_file_with_or_without_text(TRUE, TRUE, FALSE);
 }
 
+static void group_chat_room_send_multipart_custom_content_types(void) {
+	LinphoneCoreManager *marie = linphone_core_manager_create("marie_rc");
+	LinphoneCoreManager *pauline = linphone_core_manager_create("pauline_rc");
+	bctbx_list_t *coresManagerList = NULL;
+	bctbx_list_t *participantsAddresses = NULL;
+	stats initialMarieStats = marie->stat;
+	stats initialPaulineStats = pauline->stat;
+	coresManagerList = bctbx_list_append(coresManagerList, marie);
+	coresManagerList = bctbx_list_append(coresManagerList, pauline);
+	bctbx_list_t *coresList = init_core_for_conference_with_groupchat_version(coresManagerList, "1.0");
+	start_core_for_conference(coresManagerList);
+	participantsAddresses = bctbx_list_append(participantsAddresses, linphone_address_new(linphone_core_get_identity(pauline->lc)));
+
+	const char *initialSubject = "Colleagues";
+	LinphoneChatRoom *marieCr = create_chat_room_client_side(coresList, marie, &initialMarieStats, participantsAddresses, initialSubject, FALSE);
+	const LinphoneAddress *confAddr = linphone_chat_room_get_conference_address(marieCr);
+
+	// Check that the chat room is correctly created on Pauline's side and that the participants are added
+	LinphoneChatRoom *paulineCr = check_creation_chat_room_client_side(coresList, pauline, &initialPaulineStats, confAddr, initialSubject, 1, FALSE);
+
+	// Add our custom content types
+	linphone_core_add_content_type_support(marie->lc, "application/vnd.3gpp.mcptt-info+xml");
+	linphone_core_add_content_type_support(marie->lc, "application/vnd.3gpp.mcptt-location-info+xml");
+	linphone_core_add_content_type_support(pauline->lc, "application/vnd.3gpp.mcptt-info+xml");
+	linphone_core_add_content_type_support(pauline->lc, "application/vnd.3gpp.mcptt-location-info+xml");
+
+	const char *data1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><mcpttinfo xmlns=\"urn:3gpp:ns:mcpttInfo:1.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><mcptt-Params><mcptt-request-uri type=\"Normal\"><mcpttURI>sip:test@sip.example.org</mcpttURI></mcptt-request-uri></mcptt-Params></mcpttinfo>";
+	const char *data2 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><location-info xmlns=\"urn:3gpp:ns:mcpttILocationInfo:1.0\"><Configuration><NonEmergencyLocationInformation><ServingEcgi/><NeighbouringEcgi/><MbmsSaId/><MbsfnArea/><GeographicalCoordinate/><minimumIntervalLength>10</minimumIntervalLength></NonEmergencyLocationInformation><TriggeringCriteria><CellChange><AnyCellChange TriggerId=\"AnyCellChange\"/></CellChange><TrackingAreaChange><AnyTrackingAreaChange TriggerId=\"AnyTrackingAreaChange\"/></TrackingAreaChange><PlmnChange><AnyPlmnChange TriggerId=\"AnyPlmnChange\"/></PlmnChange><PeriodicReport TriggerId=\"Periodic\">20</PeriodicReport><GeographicalAreaChange><AnyAreaChange TriggerId=\"177db491c22\"></AnyAreaChange></GeographicalAreaChange></TriggeringCriteria></Configuration></location-info>";
+
+	LinphoneChatMessage *msg;
+	msg = linphone_chat_room_create_empty_message(marieCr);
+
+	LinphoneContent *content = linphone_factory_create_content(linphone_factory_get());
+	linphone_content_set_type(content, "application");
+	linphone_content_set_subtype(content, "vnd.3gpp.mcptt-info+xml");
+	linphone_content_set_utf8_text(content, data1);
+	linphone_chat_message_add_content(msg, content);
+	linphone_content_unref(content);
+
+	content = linphone_factory_create_content(linphone_factory_get());
+	linphone_content_set_type(content, "application");
+	linphone_content_set_subtype(content, "vnd.3gpp.mcptt-location-info+xml");
+	linphone_content_set_utf8_text(content, data2);
+	linphone_chat_message_add_content(msg, content);
+	linphone_content_unref(content);
+
+	linphone_chat_message_send(msg);
+	BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &pauline->stat.number_of_LinphoneMessageReceived, 1));
+	linphone_chat_message_unref(msg);
+
+	if (pauline->stat.last_received_chat_message) {
+		const bctbx_list_t* contents = linphone_chat_message_get_contents(pauline->stat.last_received_chat_message);
+		BC_ASSERT_EQUAL(bctbx_list_size(contents), 2, int, "%d");
+
+		LinphoneContent *content1 = bctbx_list_get_data(contents);
+		BC_ASSERT_STRING_EQUAL(linphone_content_get_type(content1), "application");
+		BC_ASSERT_STRING_EQUAL(linphone_content_get_subtype(content1), "vnd.3gpp.mcptt-info+xml");
+		BC_ASSERT_STRING_EQUAL(linphone_content_get_utf8_text(content1), data1);
+
+		LinphoneContent *content2 = bctbx_list_nth_data(contents, 1);
+		BC_ASSERT_STRING_EQUAL(linphone_content_get_type(content2), "application");
+		BC_ASSERT_STRING_EQUAL(linphone_content_get_subtype(content2), "vnd.3gpp.mcptt-location-info+xml");
+		BC_ASSERT_STRING_EQUAL(linphone_content_get_utf8_text(content2), data2);
+	}
+
+	// Clean db from chat room
+	linphone_core_manager_delete_chat_room(marie, marieCr, coresList);
+	linphone_core_manager_delete_chat_room(pauline, paulineCr, coresList);
+
+	bctbx_list_free(coresList);
+	bctbx_list_free(coresManagerList);
+	linphone_core_manager_destroy(marie);
+	linphone_core_manager_destroy(pauline);
+}
+
 static void group_chat_room_unique_one_to_one_chat_room_base(bool_t secondDeviceForSender) {
 	LinphoneCoreManager *marie = linphone_core_manager_create("marie_rc");
 	LinphoneCoreManager *marie2 = NULL;
@@ -6652,6 +6727,7 @@ test_t group_chat_tests[] = {
 	TEST_NO_TAG("Send file using buffer", group_chat_room_send_file_2),
 	TEST_NO_TAG("Send file + text", group_chat_room_send_file_plus_text),
 	TEST_NO_TAG("Send 2 files + text", group_chat_room_send_two_files_plus_text),
+	TEST_NO_TAG("Send multipart message with custom content types", group_chat_room_send_multipart_custom_content_types),
 	TEST_NO_TAG("Unique one-to-one chatroom", group_chat_room_unique_one_to_one_chat_room),
 	TEST_NO_TAG("Unique one-to-one chatroom with dual sender device", group_chat_room_unique_one_to_one_chat_room_dual_sender_device),
 	TEST_NO_TAG("Unique one-to-one chatroom recreated from message", group_chat_room_unique_one_to_one_chat_room_recreated_from_message),
-- 
GitLab