From 017f4790b046bcb311dca20f440bf85ee09dc3b5 Mon Sep 17 00:00:00 2001 From: Benjamin Reis Date: Thu, 8 Feb 2018 15:45:26 +0100 Subject: [PATCH 001/281] use BackgroundTask object instead of call directly sal API --- src/call/call-p.h | 5 ++-- src/call/call.cpp | 9 +++---- .../file-transfer-chat-message-modifier.cpp | 25 +++++-------------- .../file-transfer-chat-message-modifier.h | 17 +++++++------ 4 files changed, 23 insertions(+), 33 deletions(-) diff --git a/src/call/call-p.h b/src/call/call-p.h index 94ec4cf07..71eb8fa41 100644 --- a/src/call/call-p.h +++ b/src/call/call-p.h @@ -24,6 +24,7 @@ #include "conference/conference.h" #include "conference/session/call-session-listener.h" #include "object/object-p.h" +#include "utils/background-task.h" // TODO: Remove me later. #include "private.h" @@ -113,11 +114,11 @@ private: CallCallbackObj nextVideoFrameDecoded; - unsigned long backgroundTaskId = 0; - bool ringingBeep = false; bool playingRingbackTone = false; + BackgroundTask bgTask; + L_DECLARE_PUBLIC(Call); }; diff --git a/src/call/call.cpp b/src/call/call.cpp index 4e00dcf2b..973e352e3 100644 --- a/src/call/call.cpp +++ b/src/call/call.cpp @@ -186,14 +186,11 @@ void CallPrivate::onAckReceived (const shared_ptr &session, L } void CallPrivate::onBackgroundTaskToBeStarted (const shared_ptr &session) { - backgroundTaskId = sal_begin_background_task("liblinphone call notification", nullptr, nullptr); + bgTask.start(); } void CallPrivate::onBackgroundTaskToBeStopped (const shared_ptr &session) { - if (backgroundTaskId != 0) { - sal_end_background_task(backgroundTaskId); - backgroundTaskId = 0; - } + bgTask.stop(); } bool CallPrivate::onCallSessionAccepted (const shared_ptr &session) { @@ -468,6 +465,8 @@ Call::Call (CallPrivate &p, shared_ptr core) : Object(p), CoreAccessor(cor L_D(); d->nextVideoFrameDecoded._func = nullptr; d->nextVideoFrameDecoded._user_data = nullptr; + + d->bgTask.setName("Liblinphone call notification"); } // ----------------------------------------------------------------------------- diff --git a/src/chat/modifier/file-transfer-chat-message-modifier.cpp b/src/chat/modifier/file-transfer-chat-message-modifier.cpp index 30d088d2c..951efa582 100644 --- a/src/chat/modifier/file-transfer-chat-message-modifier.cpp +++ b/src/chat/modifier/file-transfer-chat-message-modifier.cpp @@ -35,6 +35,10 @@ using namespace std; LINPHONE_BEGIN_NAMESPACE +FileTransferChatMessageModifier::FileTransferChatMessageModifier () { + bgTask.setName("File transfer upload"); +} + belle_http_request_t *FileTransferChatMessageModifier::getHttpRequest () const { return httpRequest; } @@ -480,29 +484,12 @@ error: return -1; } -static void _chat_message_file_upload_background_task_ended (void *data) { - FileTransferChatMessageModifier *d = (FileTransferChatMessageModifier *)data; - d->fileUploadBackgroundTaskEnded(); -} - -void FileTransferChatMessageModifier::fileUploadBackgroundTaskEnded () { - lWarning() << "channel [" << this << "]: file upload background task has to be ended now, but work isn't finished."; - fileUploadEndBackgroundTask(); -} - void FileTransferChatMessageModifier::fileUploadBeginBackgroundTask () { - if (backgroundTaskId == 0) { - backgroundTaskId = sal_begin_background_task("file transfer upload", _chat_message_file_upload_background_task_ended, this); - if (backgroundTaskId) lInfo() << "channel [" << this << "]: starting file upload background task with id=[" << backgroundTaskId << "]."; - } + bgTask.start(); } void FileTransferChatMessageModifier::fileUploadEndBackgroundTask () { - if (backgroundTaskId) { - lInfo() << "channel [" << this << "]: ending file upload background task with id=[" << backgroundTaskId << "]."; - sal_end_background_task(backgroundTaskId); - backgroundTaskId = 0; - } + bgTask.stop(); } // ---------------------------------------------------------- diff --git a/src/chat/modifier/file-transfer-chat-message-modifier.h b/src/chat/modifier/file-transfer-chat-message-modifier.h index c711285d5..d79b5bdc2 100644 --- a/src/chat/modifier/file-transfer-chat-message-modifier.h +++ b/src/chat/modifier/file-transfer-chat-message-modifier.h @@ -23,6 +23,7 @@ #include #include "chat-message-modifier.h" +#include "utils/background-task.h" // ============================================================================= @@ -35,7 +36,7 @@ class FileTransferContent; class FileTransferChatMessageModifier : public ChatMessageModifier { public: - FileTransferChatMessageModifier () = default; + FileTransferChatMessageModifier (); ~FileTransferChatMessageModifier (); Result encode (const std::shared_ptr &message, int &errorCode) override; @@ -64,18 +65,20 @@ public: bool isFileTransferInProgressAndValid(); private: - std::weak_ptr chatMessage; - FileContent* currentFileContentToTransfer; - unsigned long backgroundTaskId = 0; - belle_http_request_t *httpRequest = nullptr; - belle_http_request_listener_t *httpListener = nullptr; - int uploadFile(); int startHttpTransfer(const std::string &url, const std::string &action, belle_http_request_listener_callbacks_t *cbs); void fileUploadBeginBackgroundTask(); void fileUploadEndBackgroundTask(); void releaseHttpRequest(); + + std::weak_ptr chatMessage; + FileContent* currentFileContentToTransfer; + + belle_http_request_t *httpRequest = nullptr; + belle_http_request_listener_t *httpListener = nullptr; + + BackgroundTask bgTask; }; LINPHONE_END_NAMESPACE From 1c9f356e4f6abb0d168271961b823df0ded00bd5 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 8 Feb 2018 15:48:19 +0100 Subject: [PATCH 002/281] Fixed crash in chat room state changed callback if trying to find chat room --- src/chat/chat-room/client-group-to-basic-chat-room.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chat/chat-room/client-group-to-basic-chat-room.cpp b/src/chat/chat-room/client-group-to-basic-chat-room.cpp index 5890f8252..e5c31bb8c 100644 --- a/src/chat/chat-room/client-group-to-basic-chat-room.cpp +++ b/src/chat/chat-room/client-group-to-basic-chat-room.cpp @@ -79,8 +79,8 @@ public: shared_ptr bcr = cgcr->getCore()->onlyGetOrCreateBasicChatRoom(invitedAddresses.front()); L_SET_CPP_PTR_FROM_C_OBJECT(lcr, bcr); bcr->getPrivate()->setState(ChatRoom::State::Instantiated); - bcr->getPrivate()->setState(ChatRoom::State::Created); cgcr->getCore()->getPrivate()->insertChatRoom(bcr); + bcr->getPrivate()->setState(ChatRoom::State::Created); cgcr->getCore()->getPrivate()->insertChatRoomWithDb(bcr); return; } From 6cc3fb27dba032b7519a195795c0eb26b8945345 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Thu, 8 Feb 2018 17:28:27 +0100 Subject: [PATCH 003/281] add test to make sure no invite from chat room are in call logs --- tester/group_chat_tester.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tester/group_chat_tester.c b/tester/group_chat_tester.c index 59cba3be5..641454617 100644 --- a/tester/group_chat_tester.c +++ b/tester/group_chat_tester.c @@ -451,6 +451,11 @@ static void group_chat_room_creation_server (void) { linphone_core_manager_delete_chat_room(pauline, paulineCr, coresList); linphone_core_manager_delete_chat_room(chloe, chloeCr, coresList); + BC_ASSERT_EQUAL(linphone_core_get_call_history_size(marie->lc), 0, int,"%i"); + BC_ASSERT_EQUAL(linphone_core_get_call_history_size(laure->lc), 0, int,"%i"); + BC_ASSERT_EQUAL(linphone_core_get_call_history_size(pauline->lc), 0, int,"%i"); + BC_ASSERT_EQUAL(linphone_core_get_call_history_size(chloe->lc), 0, int,"%i"); + bctbx_list_free(coresList); bctbx_list_free(coresManagerList); linphone_core_manager_destroy(marie); @@ -2434,6 +2439,12 @@ static void group_chat_room_unique_one_to_one_chat_room_recreated_from_message_b linphone_core_manager_delete_chat_room(marie, marieCr, coresList); linphone_core_manager_delete_chat_room(pauline, paulineCr, coresList); + wait_for_list(coresList, 0, 1, 2000); + BC_ASSERT_EQUAL(linphone_core_get_call_history_size(marie->lc), 0, int,"%i"); + BC_ASSERT_EQUAL(linphone_core_get_call_history_size(pauline->lc), 0, int,"%i"); + BC_ASSERT_PTR_NULL(linphone_core_get_call_logs(marie->lc)); + BC_ASSERT_PTR_NULL(linphone_core_get_call_logs(pauline->lc)); + linphone_address_unref(confAddr); bctbx_list_free(coresList); bctbx_list_free(coresManagerList); From 6858207bc295c72aeade5119f94e8307b431df61 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Fri, 9 Feb 2018 10:57:25 +0100 Subject: [PATCH 004/281] feat(MainDb): add a security to delete basic chat room on migration when peer sip address is a server sip address chat room --- src/db/main-db.cpp | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 1e76e96ae..cf92abd52 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -89,8 +89,10 @@ public: } catch (const soci::soci_error &e) { lWarning() << "Catched exception in MainDb::" << info.name << "."; soci::soci_error::error_category category = e.get_error_category(); - if ((category == soci::soci_error::connection_error - || category == soci::soci_error::unknown) && info.mainDb->forceReconnect()) { + if ( + (category == soci::soci_error::connection_error || category == soci::soci_error::unknown) && + info.mainDb->forceReconnect() + ) { mResult = mFunction(); return; } @@ -2528,6 +2530,19 @@ void MainDb::migrateBasicToClientGroupChatRoom ( const long long &localSipAddressId = d->insertSipAddress(newChatRoomId.getLocalAddress().asString()); const int &capabilities = clientGroupChatRoom->getCapabilities(); + { + shared_ptr buggyChatRoom = getCore()->findChatRoom(newChatRoomId); + if (buggyChatRoom) { + lError() << "Chat room was found with the same chat room id of a new migrated ClientGroupChatRoom!!!"; + AbstractChatRoom::CapabilitiesMask capabilities = buggyChatRoom->getCapabilities(); + if (capabilities & AbstractChatRoom::Capabilities::Basic) { + lError() << "Delete invalid basic chat room..."; + Core::deleteChatRoom(buggyChatRoom); + } else + lError() << "Unable to delete invalid chat room with capabilities: " << capabilities << "."; + } + } + *session << "UPDATE chat_room" " SET capabilities = :capabilities," " peer_sip_address_id = :peerSipAddressId," From a19e505394b60255890e9983c2f6a47109c87d0b Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Fri, 9 Feb 2018 14:11:45 +0100 Subject: [PATCH 005/281] add test for call declined on timeout --- tester/call_single_tester.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/tester/call_single_tester.c b/tester/call_single_tester.c index eea49d2a3..57e502ef8 100644 --- a/tester/call_single_tester.c +++ b/tester/call_single_tester.c @@ -1450,18 +1450,21 @@ static void call_declined_with_error(void) { linphone_core_manager_destroy(caller_mgr); } -static void call_declined(void) { +static void call_declined_base(bool_t use_timeout) { LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new(transport_supported(LinphoneTransportTls) ? "pauline_rc" : "pauline_tcp_rc"); LinphoneCall* in_call; LinphoneCall* out_call = linphone_core_invite_address(pauline->lc,marie->identity); + if (use_timeout) + linphone_core_set_inc_timeout(marie->lc, 1); linphone_call_ref(out_call); BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallIncomingReceived,1)); BC_ASSERT_PTR_NOT_NULL(in_call=linphone_core_get_current_call(marie->lc)); if (in_call) { linphone_call_ref(in_call); - linphone_call_terminate(in_call); + if (!use_timeout) + linphone_call_terminate(in_call); BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneCallReleased,1)); BC_ASSERT_TRUE(wait_for(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneCallReleased,1)); BC_ASSERT_EQUAL(marie->stat.number_of_LinphoneCallEnd,1, int, "%d"); @@ -1477,6 +1480,14 @@ static void call_declined(void) { linphone_core_manager_destroy(pauline); } +static void call_declined(void) { + call_declined_base(FALSE); +} + +static void call_declined_on_timeout(void) { + call_declined_base(TRUE); +} + static void call_terminated_by_caller(void) { LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new(transport_supported(LinphoneTransportTls) ? "pauline_rc" : "pauline_tcp_rc"); @@ -6339,6 +6350,7 @@ end: test_t call_tests[] = { TEST_NO_TAG("Early declined call", early_declined_call), TEST_NO_TAG("Call declined", call_declined), + TEST_NO_TAG("Call declined on timeout",call_declined_on_timeout), TEST_NO_TAG("Call declined with error", call_declined_with_error), TEST_NO_TAG("Cancelled call", cancelled_call), TEST_NO_TAG("Early cancelled call", early_cancelled_call), From c27c1b07673185ab395cf441a4a5f98fc381aa9e Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 9 Feb 2018 14:48:12 +0100 Subject: [PATCH 006/281] Use C++ API. --- src/conference/session/media-session.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/conference/session/media-session.cpp b/src/conference/session/media-session.cpp index 013406e9f..b3b6f04cd 100644 --- a/src/conference/session/media-session.cpp +++ b/src/conference/session/media-session.cpp @@ -624,7 +624,7 @@ void MediaSessionPrivate::stopStreams () { rtpIoVideoProfile = nullptr; } - linphone_core_soundcard_hint_check(q->getCore()->getCCore()); + q->getCore()->soundcardHintCheck(); } // ----------------------------------------------------------------------------- From 3cc6e3ef7d64bd021e673d53a7a692775fad748e Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 9 Feb 2018 14:48:33 +0100 Subject: [PATCH 007/281] Fix crash when an incoming call times out. --- src/core/core-call.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/core/core-call.cpp b/src/core/core-call.cpp index 44c6bacdd..5bc9912a7 100644 --- a/src/core/core-call.cpp +++ b/src/core/core-call.cpp @@ -86,7 +86,9 @@ bool CorePrivate::isAlreadyInCallWithAddress (const Address &addr) const { } void CorePrivate::iterateCalls (time_t currentRealTime, bool oneSecondElapsed) const { - for (const auto &call : calls) { + // Make a copy of the list af calls because it may be altered during calls to the Call::iterate method + list> savedCalls(calls); + for (const auto &call : savedCalls) { call->getPrivate()->iterate(currentRealTime, oneSecondElapsed); } } From 214c2a3a61f140c33cc32a0b8896cdc1aea66bf9 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 9 Feb 2018 14:48:59 +0100 Subject: [PATCH 008/281] Add group chat tester for participant removed while it is not connected. --- tester/group_chat_tester.c | 57 ++++++++++++++++++++++++++++--------- tester/liblinphone_tester.h | 3 +- tester/tester.c | 17 ++++++----- 3 files changed, 54 insertions(+), 23 deletions(-) diff --git a/tester/group_chat_tester.c b/tester/group_chat_tester.c index 641454617..f40fe50e6 100644 --- a/tester/group_chat_tester.c +++ b/tester/group_chat_tester.c @@ -1304,7 +1304,7 @@ static void group_chat_room_create_room_with_disconnected_friends_and_initial_me group_chat_room_create_room_with_disconnected_friends_base(TRUE); } -static void group_chat_room_reinvited_after_removed (void) { +static void group_chat_room_reinvited_after_removed_base (bool_t offline_when_removed) { LinphoneCoreManager *marie = linphone_core_manager_create("marie_rc"); LinphoneCoreManager *pauline = linphone_core_manager_create("pauline_rc"); LinphoneCoreManager *laure = linphone_core_manager_create("laure_tcp_rc"); @@ -1320,6 +1320,7 @@ static void group_chat_room_reinvited_after_removed (void) { stats initialMarieStats = marie->stat; stats initialPaulineStats = pauline->stat; stats initialLaureStats = laure->stat; + char *savedLaureUuid = NULL; // Marie creates a new group chat room const char *initialSubject = "Colleagues"; @@ -1333,23 +1334,44 @@ static void group_chat_room_reinvited_after_removed (void) { // Check that the chat room is correctly created on Laure's side and that the participants are added LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, 0); - // Marie removes Laure from the chat room LinphoneAddress *laureAddr = linphone_address_new(linphone_core_get_identity(laure->lc)); + if (offline_when_removed) { + savedLaureUuid = bctbx_strdup(lp_config_get_string(linphone_core_get_config(laure->lc), "misc", "uuid", NULL)); + coresList = bctbx_list_remove(coresList, laure->lc); + coresManagerList = bctbx_list_remove(coresManagerList, laure); + linphone_core_set_network_reachable(laure->lc, FALSE); + linphone_core_manager_stop(laure); + } + + // Marie removes Laure from the chat room LinphoneParticipant *laureParticipant = linphone_chat_room_find_participant(marieCr, laureAddr); linphone_address_unref(laureAddr); BC_ASSERT_PTR_NOT_NULL(laureParticipant); linphone_chat_room_remove_participant(marieCr, laureParticipant); - BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_LinphoneChatRoomStateTerminated, initialLaureStats.number_of_LinphoneChatRoomStateTerminated + 1, 3000)); BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_participants_removed, initialMarieStats.number_of_participants_removed + 1, 1000)); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_participants_removed, initialPaulineStats.number_of_participants_removed + 1, 1000)); + if (offline_when_removed) { + linphone_core_manager_configure(laure); + lp_config_set_string(linphone_core_get_config(laure->lc), "misc", "uuid", savedLaureUuid); + bctbx_free(savedLaureUuid); + bctbx_list_t *tmpCoresManagerList = bctbx_list_append(NULL, laure); + init_core_for_conference(tmpCoresManagerList); + bctbx_list_free(tmpCoresManagerList); + linphone_core_manager_start(laure, TRUE); + coresList = bctbx_list_append(coresList, laure->lc); + coresManagerList = bctbx_list_append(coresManagerList, laure); + initialLaureStats = laure->stat; + } + BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_LinphoneChatRoomStateTerminated, initialLaureStats.number_of_LinphoneChatRoomStateTerminated + 1, 3000)); + // Marie adds Laure to the chat room participantsAddresses = bctbx_list_append(participantsAddresses, linphone_address_new(linphone_core_get_identity(laure->lc))); linphone_chat_room_add_participants(marieCr, participantsAddresses); bctbx_list_free_with_data(participantsAddresses, (bctbx_list_free_func)linphone_address_unref); participantsAddresses = NULL; - BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_LinphoneChatRoomStateCreationPending, initialLaureStats.number_of_LinphoneChatRoomStateCreationPending + 2, 5000)); - BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_LinphoneChatRoomStateCreated, initialLaureStats.number_of_LinphoneChatRoomStateCreated + 2, 5000)); + BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_LinphoneChatRoomStateCreationPending, initialLaureStats.number_of_LinphoneChatRoomStateCreationPending + 1, 5000)); + BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_LinphoneChatRoomStateCreated, initialLaureStats.number_of_LinphoneChatRoomStateCreated + 1, 5000)); BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_participants_added, initialMarieStats.number_of_participants_added + 1, 1000)); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_participants_added, initialPaulineStats.number_of_participants_added + 1, 1000)); BC_ASSERT_EQUAL(linphone_chat_room_get_nb_participants(marieCr), 2, int, "%d"); @@ -1357,13 +1379,14 @@ static void group_chat_room_reinvited_after_removed (void) { laureAddr = linphone_address_new(linphone_core_get_device_identity(laure->lc)); LinphoneChatRoom *newLaureCr = linphone_core_find_chat_room(laure->lc, confAddr, laureAddr); linphone_address_unref(laureAddr); - BC_ASSERT_PTR_EQUAL(newLaureCr, laureCr); + if (!offline_when_removed) + BC_ASSERT_PTR_EQUAL(newLaureCr, laureCr); BC_ASSERT_EQUAL(linphone_chat_room_get_nb_participants(newLaureCr), 2, int, "%d"); BC_ASSERT_STRING_EQUAL(linphone_chat_room_get_subject(newLaureCr), initialSubject); // Clean db from chat room linphone_core_manager_delete_chat_room(marie, marieCr, coresList); - linphone_core_manager_delete_chat_room(laure, laureCr, coresList); + linphone_core_manager_delete_chat_room(laure, newLaureCr, coresList); linphone_core_manager_delete_chat_room(pauline, paulineCr, coresList); bctbx_list_free(coresList); @@ -1373,6 +1396,14 @@ static void group_chat_room_reinvited_after_removed (void) { linphone_core_manager_destroy(laure); } +static void group_chat_room_reinvited_after_removed (void) { + group_chat_room_reinvited_after_removed_base(FALSE); +} + +static void group_chat_room_reinvited_after_removed_while_offline (void) { + group_chat_room_reinvited_after_removed_base(TRUE); +} + static void group_chat_room_notify_after_disconnection (void) { LinphoneCoreManager *marie = linphone_core_manager_create("marie_rc"); LinphoneCoreManager *pauline = linphone_core_manager_create("pauline_rc"); @@ -2401,15 +2432,14 @@ static void group_chat_room_unique_one_to_one_chat_room_recreated_from_message_b if (with_app_restart) { //to simulate dialog removal linphone_core_set_network_reachable(marie->lc, FALSE); - //linphone_core_set_network_reachable(marie->lc, TRUE); coresList=bctbx_list_remove(coresList, marie->lc); - linphone_core_manager_reinit(marie,TRUE); + linphone_core_manager_reinit(marie); bctbx_list_t *tmpCoresManagerList = bctbx_list_append(NULL, marie); init_core_for_conference(tmpCoresManagerList); bctbx_list_free(tmpCoresManagerList); coresList = bctbx_list_append(coresList, marie->lc); - linphone_core_manager_start(marie,TRUE); - wait_for_list(coresList, 0, 1, 2000); + linphone_core_manager_start(marie, TRUE); + //wait_for_list(coresList, 0, 1, 2000); LinphoneChatRoom *oldMarieCr = marieCr; marieCr = linphone_core_get_chat_room(marie->lc, linphone_chat_room_get_peer_address(oldMarieCr)); } @@ -2424,7 +2454,7 @@ static void group_chat_room_unique_one_to_one_chat_room_recreated_from_message_b initialMarieStats = marie->stat; initialPaulineStats = pauline->stat; - // Marie sends a new message + // Pauline sends a new message message = "Hey you"; _send_message(paulineCr, message); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneMessageDelivered, initialPaulineStats.number_of_LinphoneMessageDelivered + 1, 10000)); @@ -2534,6 +2564,7 @@ test_t group_chat_tests[] = { TEST_TWO_TAGS("Create chat room with disconnected friends", group_chat_room_create_room_with_disconnected_friends, "Server", "LeaksMemory"), TEST_TWO_TAGS("Create chat room with disconnected friends and initial message", group_chat_room_create_room_with_disconnected_friends_and_initial_message, "Server", "LeaksMemory"), TEST_TWO_TAGS("Reinvited after removed from group chat room", group_chat_room_reinvited_after_removed, "Server", "LeaksMemory"), + TEST_TWO_TAGS("Reinvited after removed from group chat room while offline", group_chat_room_reinvited_after_removed_while_offline, "Server", "LeaksMemory"), TEST_TWO_TAGS("Notify after disconnection", group_chat_room_notify_after_disconnection, "Server", "LeaksMemory"), TEST_TWO_TAGS("Send refer to all participants devices", group_chat_room_send_refer_to_all_devices, "Server", "LeaksMemory"), // TODO: Use when we support adding a new device in created conf @@ -2549,7 +2580,7 @@ test_t group_chat_tests[] = { TEST_TWO_TAGS("Send file + text", group_chat_room_send_file_plus_text, "Server", "LeaksMemory"), TEST_TWO_TAGS("Unique one-to-one chatroom", group_chat_room_unique_one_to_one_chat_room, "Server", "LeaksMemory"), TEST_TWO_TAGS("Unique one-to-one chatroom recreated from message", group_chat_room_unique_one_to_one_chat_room_recreated_from_message, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Unique one-to-one chatroom recreated from message with app restart",group_chat_room_unique_one_to_one_chat_room_recreated_from_message_with_app_restart, "Server", "LeaksMemory"), + TEST_TWO_TAGS("Unique one-to-one chatroom recreated from message with app restart", group_chat_room_unique_one_to_one_chat_room_recreated_from_message_with_app_restart, "Server", "LeaksMemory"), TEST_TWO_TAGS("New unique one-to-one chatroom after both participants left", group_chat_room_new_unique_one_to_one_chat_room_after_both_participants_left, "Server", "LeaksMemory") }; diff --git a/tester/liblinphone_tester.h b/tester/liblinphone_tester.h index 050462630..7e07493d0 100644 --- a/tester/liblinphone_tester.h +++ b/tester/liblinphone_tester.h @@ -322,6 +322,7 @@ typedef struct _LinphoneCallTestParams { void liblinphone_tester_add_suites(void); void linphone_core_manager_init(LinphoneCoreManager *mgr, const char* rc_file, const char* phone_alias); +void linphone_core_manager_configure (LinphoneCoreManager *mgr); void linphone_core_manager_start(LinphoneCoreManager *mgr, bool_t check_for_proxies); LinphoneCoreManager* linphone_core_manager_create2(const char* rc_file, const char* phone_alias); LinphoneCoreManager* linphone_core_manager_create(const char* rc_file); @@ -329,7 +330,7 @@ LinphoneCoreManager* linphone_core_manager_new3(const char* rc_file, bool_t chec LinphoneCoreManager* linphone_core_manager_new2(const char* rc_file, bool_t check_for_proxies); LinphoneCoreManager* linphone_core_manager_new(const char* rc_file); void linphone_core_manager_stop(LinphoneCoreManager *mgr); -void linphone_core_manager_reinit(LinphoneCoreManager *mgr, bool_t check_for_proxies); +void linphone_core_manager_reinit(LinphoneCoreManager *mgr); void linphone_core_manager_restart(LinphoneCoreManager *mgr, bool_t check_for_proxies); void linphone_core_manager_uninit(LinphoneCoreManager *mgr); void linphone_core_manager_wait_for_stun_resolution(LinphoneCoreManager *mgr); diff --git a/tester/tester.c b/tester/tester.c index 50d3bd6d4..71b7a7d65 100644 --- a/tester/tester.c +++ b/tester/tester.c @@ -459,24 +459,23 @@ void linphone_core_manager_stop(LinphoneCoreManager *mgr){ } } -void linphone_core_manager_reinit(LinphoneCoreManager *mgr, bool_t check_for_proxies) { - char* uuid = NULL; +void linphone_core_manager_reinit(LinphoneCoreManager *mgr) { + char *uuid = NULL; if (mgr->lc) { - if (lp_config_get_string(linphone_core_get_config(mgr->lc),"misc","uuid",NULL)) { - uuid = bctbx_strdup(lp_config_get_string(linphone_core_get_config(mgr->lc),"misc","uuid",NULL)); - } + if (lp_config_get_string(linphone_core_get_config(mgr->lc), "misc", "uuid", NULL)) + uuid = bctbx_strdup(lp_config_get_string(linphone_core_get_config(mgr->lc), "misc", "uuid", NULL)); linphone_core_unref(mgr->lc); } linphone_core_manager_configure(mgr); reset_counters(&mgr->stat); - //to make sure gruu is preserved - lp_config_set_string(linphone_core_get_config(mgr->lc),"misc","uuid",uuid); + // Make sure gruu is preserved + lp_config_set_string(linphone_core_get_config(mgr->lc), "misc", "uuid", uuid); if (uuid) - bctbx_free(uuid); + bctbx_free(uuid); } void linphone_core_manager_restart(LinphoneCoreManager *mgr, bool_t check_for_proxies) { - linphone_core_manager_reinit(mgr, check_for_proxies); + linphone_core_manager_reinit(mgr); linphone_core_manager_start(mgr, check_for_proxies); } From bccf926b1d3ecbc6a4a3cf58543d4b2e78bb57b8 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 9 Feb 2018 15:44:32 +0100 Subject: [PATCH 009/281] Add LinphoneEventCbs object. --- coreapi/callbacks.c | 31 ++++++++++++--------- coreapi/event.c | 52 ++++++++++++++++++++++++++++++++++++ coreapi/private_functions.h | 1 + coreapi/private_structs.h | 9 +++++++ include/linphone/callbacks.h | 15 +++++++++++ include/linphone/event.h | 50 ++++++++++++++++++++++++++++++++++ include/linphone/types.h | 6 +++++ src/c-wrapper/c-wrapper.h | 1 + src/sal/event-op.cpp | 30 ++++++++------------- 9 files changed, 163 insertions(+), 32 deletions(-) diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index 25967bcb8..f3554763d 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -668,20 +668,25 @@ static void on_expire(SalOp *op){ static void on_notify_response(SalOp *op){ LinphoneEvent *lev=(LinphoneEvent*)op->get_user_pointer(); + if (!lev) + return; - if (lev==NULL) return; - /*this is actually handling out of dialogs notify - for the moment*/ - if (!lev->is_out_of_dialog_op) return; - switch (linphone_event_get_subscription_state(lev)){ - case LinphoneSubscriptionIncomingReceived: - if (op->get_error_info()->reason == SalReasonNone){ - linphone_event_set_state(lev, LinphoneSubscriptionTerminated); - }else{ - linphone_event_set_state(lev, LinphoneSubscriptionError); - } - break; - default: - ms_warning("Unhandled on_notify_response() case %s", linphone_subscription_state_to_string(linphone_event_get_subscription_state(lev))); + if (lev->is_out_of_dialog_op) { + switch (linphone_event_get_subscription_state(lev)) { + case LinphoneSubscriptionIncomingReceived: + if (op->get_error_info()->reason == SalReasonNone) + linphone_event_set_state(lev, LinphoneSubscriptionTerminated); + else + linphone_event_set_state(lev, LinphoneSubscriptionError); + break; + default: + ms_warning("Unhandled on_notify_response() case %s", + linphone_subscription_state_to_string(linphone_event_get_subscription_state(lev))); + break; + } + } else { + ms_warning("on_notify_response in dialog"); + _linphone_event_notify_notify_response(lev); } } diff --git a/coreapi/event.c b/coreapi/event.c index 950c4ca2c..582774843 100644 --- a/coreapi/event.c +++ b/coreapi/event.c @@ -76,6 +76,46 @@ LINPHONE_PUBLIC const char *linphone_publish_state_to_string(LinphonePublishStat return NULL; } + +BELLE_SIP_DECLARE_NO_IMPLEMENTED_INTERFACES(LinphoneEventCbs); + +BELLE_SIP_INSTANCIATE_VPTR(LinphoneEventCbs, belle_sip_object_t, + NULL, // destroy + NULL, // clone + NULL, // marshal + FALSE +); + +static LinphoneEventCbs *linphone_event_cbs_new(void) { + return belle_sip_object_new(LinphoneEventCbs); +} + +LinphoneEventCbs *linphone_event_cbs_ref(LinphoneEventCbs *cbs) { + belle_sip_object_ref(cbs); + return cbs; +} + +void linphone_event_cbs_unref(LinphoneEventCbs *cbs) { + belle_sip_object_unref(cbs); +} + +void *linphone_event_cbs_get_user_data(const LinphoneEventCbs *cbs) { + return cbs->user_data; +} + +void linphone_event_cbs_set_user_data(LinphoneEventCbs *cbs, void *ud) { + cbs->user_data = ud; +} + +LinphoneEventCbsNotifyResponseCb linphone_event_cbs_get_notify_response(const LinphoneEventCbs *cbs) { + return cbs->notify_response_cb; +} + +void linphone_event_cbs_set_notify_response(LinphoneEventCbs *cbs, LinphoneEventCbsNotifyResponseCb cb) { + cbs->notify_response_cb = cb; +} + + static void linphone_event_release(LinphoneEvent *lev){ if (lev->op) { /*this will stop the refresher*/ @@ -86,6 +126,7 @@ static void linphone_event_release(LinphoneEvent *lev){ static LinphoneEvent * linphone_event_new_base(LinphoneCore *lc, LinphoneSubscriptionDir dir, const char *name, LinphonePrivate::SalEventOp *op){ LinphoneEvent *lev=belle_sip_object_new(LinphoneEvent); + lev->callbacks = linphone_event_cbs_new(); lev->lc=lc; lev->dir=dir; lev->op=op; @@ -446,6 +487,7 @@ static void linphone_event_destroy(LinphoneEvent *lev){ if (lev->to_address) linphone_address_unref(lev->to_address); if (lev->from_address) linphone_address_unref(lev->from_address); if (lev->remote_contact_address) linphone_address_unref(lev->remote_contact_address); + linphone_event_cbs_unref(lev->callbacks); ms_free(lev->name); } @@ -523,6 +565,16 @@ static belle_sip_error_code _linphone_event_marshall(belle_sip_object_t *obj, ch return err; } +void _linphone_event_notify_notify_response(const LinphoneEvent *lev) { + LinphoneEventCbsNotifyResponseCb cb = linphone_event_cbs_get_notify_response(lev->callbacks); + if (cb) + cb(lev); +} + +LinphoneEventCbs *linphone_event_get_callbacks(const LinphoneEvent *ev) { + return ev->callbacks; +} + BELLE_SIP_DECLARE_NO_IMPLEMENTED_INTERFACES(LinphoneEvent); BELLE_SIP_INSTANCIATE_VPTR(LinphoneEvent, belle_sip_object_t, diff --git a/coreapi/private_functions.h b/coreapi/private_functions.h index 4bd4d5fd8..e0e48308f 100644 --- a/coreapi/private_functions.h +++ b/coreapi/private_functions.h @@ -380,6 +380,7 @@ void linphone_event_set_internal(LinphoneEvent *lev, bool_t internal); bool_t linphone_event_is_internal(LinphoneEvent *lev); void linphone_event_set_state(LinphoneEvent *lev, LinphoneSubscriptionState state); void linphone_event_set_publish_state(LinphoneEvent *lev, LinphonePublishState state); +void _linphone_event_notify_notify_response(const LinphoneEvent *lev); LinphoneSubscriptionState linphone_subscription_state_from_sal(SalSubscribeStatus ss); LinphoneContent *linphone_content_from_sal_body_handler(SalBodyHandler *ref); void linphone_core_invalidate_friend_subscriptions(LinphoneCore *lc); diff --git a/coreapi/private_structs.h b/coreapi/private_structs.h index 449609ba9..073598723 100644 --- a/coreapi/private_structs.h +++ b/coreapi/private_structs.h @@ -378,6 +378,14 @@ struct _LCCallbackObj { void *_user_data; }; +struct _LinphoneEventCbs { + belle_sip_object_t base; + void *user_data; + LinphoneEventCbsNotifyResponseCb notify_response_cb; +}; + +BELLE_SIP_DECLARE_VPTR_NO_EXPORT(LinphoneEventCbs); + struct _LinphoneEvent{ belle_sip_object_t base; LinphoneErrorInfo *ei; @@ -389,6 +397,7 @@ struct _LinphoneEvent{ LinphonePublishState publish_state; void *userdata; char *name; + LinphoneEventCbs *callbacks; int expires; bool_t terminating; bool_t is_out_of_dialog_op; /*used for out of dialog notify*/ diff --git a/include/linphone/callbacks.h b/include/linphone/callbacks.h index 714dac323..7511a1d97 100644 --- a/include/linphone/callbacks.h +++ b/include/linphone/callbacks.h @@ -448,6 +448,21 @@ typedef LinphoneCoreCbsPublishStateChangedCb LinphoneCorePublishStateChangedCb; * @} **/ +/** + * @addtogroup event_api + * @{ + */ + +/** + * Callback used to notify the response to a sent NOTIFY + * @param ev The LinphoneEvent object that has sent the NOTIFY and for which we received a response +**/ +typedef void (*LinphoneEventCbsNotifyResponseCb)(const LinphoneEvent *ev); + +/** + * @} + */ + /** * @addtogroup buddy_list * @{ diff --git a/include/linphone/event.h b/include/linphone/event.h index c49ab0167..cdb63a6d7 100644 --- a/include/linphone/event.h +++ b/include/linphone/event.h @@ -20,6 +20,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #ifndef LINPHONE_EVENT_H_ #define LINPHONE_EVENT_H_ +#include "linphone/callbacks.h" #include "linphone/types.h" #ifdef __cplusplus @@ -203,6 +204,55 @@ LINPHONE_PUBLIC const LinphoneAddress *linphone_event_get_remote_contact (const **/ LINPHONE_PUBLIC LinphoneCore *linphone_event_get_core(const LinphoneEvent *lev); +/** + * Get the LinphoneEventCbs object associated with a LinphoneEvent. + * @param[in] ev LinphoneEvent object + * @return The LinphoneEventCbs object associated with the LinphoneEvent. +**/ + +LINPHONE_PUBLIC LinphoneEventCbs *linphone_event_get_callbacks(const LinphoneEvent *ev); + +/** + * Acquire a reference to a LinphoneEventCbs object. + * @param[in] cbs LinphoneEventCbs object. + * @return The same LinphoneEventCbs object. +**/ +LINPHONE_PUBLIC LinphoneEventCbs *linphone_event_cbs_ref(LinphoneEventCbs *cbs); + +/** + * Release a reference to a LinphoneEventCbs object. + * @param[in] cbs LinphoneEventCbs object. +**/ +LINPHONE_PUBLIC void linphone_event_cbs_unref(LinphoneEventCbs *cbs); + +/** + * Retrieve the user pointer associated with a LinphoneEventCbs object. + * @param[in] cbs LinphoneEventCbs object. + * @return The user pointer associated with the LinphoneEventCbs object. +**/ +LINPHONE_PUBLIC void *linphone_event_cbs_get_user_data(const LinphoneEventCbs *cbs); + +/** + * Assign a user pointer to a LinphoneEventCbs object. + * @param[in] cbs LinphoneEventCbs object. + * @param[in] ud The user pointer to associate with the LinphoneEventCbs object. +**/ +LINPHONE_PUBLIC void linphone_event_cbs_set_user_data(LinphoneEventCbs *cbs, void *ud); + +/** + * Get the notify response callback. + * @param[in] cbs LinphoneEventCbs object. + * @return The current notify response callback. +**/ +LINPHONE_PUBLIC LinphoneEventCbsNotifyResponseCb linphone_event_cbs_get_notify_response(const LinphoneEventCbs *cbs); + +/** + * Set the notify response callback. + * @param[in] cbs LinphoneEventCbs object. + * @param[in] cb The notify response callback to be used. +**/ +LINPHONE_PUBLIC void linphone_event_cbs_set_notify_response(LinphoneEventCbs *cbs, LinphoneEventCbsNotifyResponseCb cb); + /** * @} **/ diff --git a/include/linphone/types.h b/include/linphone/types.h index d3b03ce25..9a8ba46c9 100644 --- a/include/linphone/types.h +++ b/include/linphone/types.h @@ -420,6 +420,12 @@ typedef struct _LinphoneErrorInfo LinphoneErrorInfo; **/ typedef struct _LinphoneEvent LinphoneEvent; +/** + * An object to handle the callbacks for handling the LinphoneEvent operations. + * @ingroup event_api +**/ +typedef struct _LinphoneEventCbs LinphoneEventCbs; + /** * #LinphoneFactory is a singleton object devoted to the creation of all the object * of Liblinphone that cannot created by #LinphoneCore or #LinphoneCore itself. diff --git a/src/c-wrapper/c-wrapper.h b/src/c-wrapper/c-wrapper.h index 2e1260e5e..a1c2fd2df 100644 --- a/src/c-wrapper/c-wrapper.h +++ b/src/c-wrapper/c-wrapper.h @@ -87,6 +87,7 @@ BELLE_SIP_TYPE_ID(LinphoneContent), BELLE_SIP_TYPE_ID(LinphoneCoreCbs), BELLE_SIP_TYPE_ID(LinphoneErrorInfo), BELLE_SIP_TYPE_ID(LinphoneEvent), +BELLE_SIP_TYPE_ID(LinphoneEventCbs), BELLE_SIP_TYPE_ID(LinphoneFactory), BELLE_SIP_TYPE_ID(LinphoneFriend), BELLE_SIP_TYPE_ID(LinphoneFriendList), diff --git a/src/sal/event-op.cpp b/src/sal/event-op.cpp index 8e99fcd9e..89cbdb5e7 100644 --- a/src/sal/event-op.cpp +++ b/src/sal/event-op.cpp @@ -31,13 +31,10 @@ void SalSubscribeOp::subscribe_process_io_error_cb(void *user_ctx, const belle_s belle_sip_request_t* req = belle_sip_transaction_get_request((belle_sip_transaction_t*)tr); const char *method=belle_sip_request_get_method(req); - if (!op->dialog) { - /*this is handling outgoing out-of-dialog notifies*/ - if (strcmp(method,"NOTIFY")==0){ - SalErrorInfo *ei=&op->error_info; - sal_error_info_set(ei,SalReasonIOError, "SIP", 0,NULL,NULL); - op->root->callbacks.on_notify_response(op); - } + if (strcmp(method,"NOTIFY")==0){ + SalErrorInfo *ei=&op->error_info; + sal_error_info_set(ei,SalReasonIOError, "SIP", 0,NULL,NULL); + op->root->callbacks.on_notify_response(op); } } } @@ -52,11 +49,9 @@ void SalSubscribeOp::subscribe_response_event_cb(void *op_base, const belle_sip_ req = belle_sip_transaction_get_request((belle_sip_transaction_t*)tr); method = belle_sip_request_get_method(req); - if (!op->dialog) { - if (strcmp(method,"NOTIFY")==0){ - op->set_error_info_from_response(belle_sip_response_event_get_response(event)); - op->root->callbacks.on_notify_response(op); - } + if (strcmp(method,"NOTIFY")==0){ + op->set_error_info_from_response(belle_sip_response_event_get_response(event)); + op->root->callbacks.on_notify_response(op); } } @@ -70,13 +65,10 @@ void SalSubscribeOp::subscribe_process_timeout_cb(void *user_ctx, const belle_si req = belle_sip_transaction_get_request((belle_sip_transaction_t*)tr); method = belle_sip_request_get_method(req); - if (!op->dialog) { - /*this is handling outgoing out-of-dialog notifies*/ - if (strcmp(method,"NOTIFY")==0){ - SalErrorInfo *ei=&op->error_info; - sal_error_info_set(ei,SalReasonRequestTimeout, "SIP", 0,NULL,NULL); - op->root->callbacks.on_notify_response(op); - } + if (strcmp(method,"NOTIFY")==0){ + SalErrorInfo *ei=&op->error_info; + sal_error_info_set(ei,SalReasonRequestTimeout, "SIP", 0,NULL,NULL); + op->root->callbacks.on_notify_response(op); } } From acd22269faadbb17cd7df6e3c125f9b5e64297d9 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 9 Feb 2018 15:44:44 +0100 Subject: [PATCH 010/281] Add state of conference participant device. --- src/chat/chat-room/server-group-chat-room-p.h | 24 ++- .../chat-room/server-group-chat-room-stub.cpp | 26 ++- src/chat/chat-room/server-group-chat-room.h | 3 + src/conference/conference-listener.h | 18 +- src/conference/conference.cpp | 3 +- src/conference/conference.h | 2 + .../local-conference-event-handler-p.h | 6 +- .../local-conference-event-handler.cpp | 170 ++++++++++-------- src/conference/participant-device.h | 10 ++ src/conference/remote-conference.h | 3 +- tester/conference-event-tester.cpp | 4 +- 11 files changed, 170 insertions(+), 99 deletions(-) diff --git a/src/chat/chat-room/server-group-chat-room-p.h b/src/chat/chat-room/server-group-chat-room-p.h index 1aeb4cff2..6b9ef0da0 100644 --- a/src/chat/chat-room/server-group-chat-room-p.h +++ b/src/chat/chat-room/server-group-chat-room-p.h @@ -20,6 +20,10 @@ #ifndef _L_SERVER_GROUP_CHAT_ROOM_P_H_ #define _L_SERVER_GROUP_CHAT_ROOM_P_H_ +#include +#include +#include + #include "chat-room-p.h" #include "server-group-chat-room.h" @@ -27,15 +31,20 @@ LINPHONE_BEGIN_NAMESPACE +class ParticipantDevice; + class ServerGroupChatRoomPrivate : public ChatRoomPrivate { public: std::shared_ptr addParticipant (const IdentityAddress &participantAddress); void removeParticipant (const std::shared_ptr &participant); - std::shared_ptr findRemovedParticipant (const std::shared_ptr &session) const; + + std::shared_ptr findFilteredParticipant (const std::shared_ptr &session) const; + std::shared_ptr findFilteredParticipant (const IdentityAddress &participantAddress) const; void confirmCreation (); void confirmJoining (SalCallOp *op); void confirmRecreation (SalCallOp *op); + void dispatchQueuedMessages (); IdentityAddress generateConferenceAddress (const std::shared_ptr &me) const; @@ -60,13 +69,18 @@ private: IdentityAddress fromAddr; Content content; + std::chrono::system_clock::time_point timestamp = std::chrono::system_clock::now(); }; void designateAdmin (); - void dispatchMessage (const Message &message); - void dispatchQueuedMessages (); + void dispatchMessage (const std::shared_ptr &message, const std::string &uri); void finalizeCreation (); + void inviteDevice (const std::shared_ptr &device); bool isAdminLeft () const; + void queueMessage (const std::shared_ptr &message); + void queueMessage (const std::shared_ptr &msg, const IdentityAddress &deviceAddress); + + void onParticipantDeviceLeft (const std::shared_ptr &session); // ChatRoomListener void onChatRoomInsertRequested (const std::shared_ptr &chatRoom) override; @@ -80,11 +94,11 @@ private: const std::string &message ) override; - std::list> removedParticipants; + std::list> filteredParticipants; ChatRoomListener *chatRoomListener = this; ServerGroupChatRoom::CapabilitiesMask capabilities = ServerGroupChatRoom::Capabilities::Conference; bool joiningPendingAfterCreation = false; - std::list queuedMessages; + std::unordered_map>> queuedMessages; L_DECLARE_PUBLIC(ServerGroupChatRoom); }; diff --git a/src/chat/chat-room/server-group-chat-room-stub.cpp b/src/chat/chat-room/server-group-chat-room-stub.cpp index 1fa4c58f5..0e59145ab 100644 --- a/src/chat/chat-room/server-group-chat-room-stub.cpp +++ b/src/chat/chat-room/server-group-chat-room-stub.cpp @@ -34,9 +34,11 @@ shared_ptr ServerGroupChatRoomPrivate::addParticipant (const Identi void ServerGroupChatRoomPrivate::removeParticipant (const shared_ptr &) {} -shared_ptr ServerGroupChatRoomPrivate::findRemovedParticipant ( - const shared_ptr & -) const { +shared_ptr ServerGroupChatRoomPrivate::findFilteredParticipant (const shared_ptr &session) const { + return nullptr; +} + +shared_ptr ServerGroupChatRoomPrivate::findFilteredParticipant (const IdentityAddress &participantAddress) const { return nullptr; } @@ -48,6 +50,8 @@ void ServerGroupChatRoomPrivate::confirmJoining (SalCallOp *) {} void ServerGroupChatRoomPrivate::confirmRecreation (SalCallOp *) {} +void ServerGroupChatRoomPrivate::dispatchQueuedMessages () {} + // ----------------------------------------------------------------------------- IdentityAddress ServerGroupChatRoomPrivate::generateConferenceAddress (const shared_ptr &me) const { @@ -76,16 +80,24 @@ LinphoneReason ServerGroupChatRoomPrivate::onSipMessageReceived (SalOp *, const void ServerGroupChatRoomPrivate::designateAdmin () {} -void ServerGroupChatRoomPrivate::dispatchMessage (const Message &message) {} - -void ServerGroupChatRoomPrivate::dispatchQueuedMessages () {} +void ServerGroupChatRoomPrivate::dispatchMessage (const std::shared_ptr &message, const std::string &uri) {} void ServerGroupChatRoomPrivate::finalizeCreation () {} +void ServerGroupChatRoomPrivate::inviteDevice (const std::shared_ptr &device) {} + bool ServerGroupChatRoomPrivate::isAdminLeft () const { return false; } +void ServerGroupChatRoomPrivate::queueMessage (const std::shared_ptr &message) {} + +void ServerGroupChatRoomPrivate::queueMessage (const std::shared_ptr &msg, const IdentityAddress &deviceAddress) {} + +// ----------------------------------------------------------------------------- + +void ServerGroupChatRoomPrivate::onParticipantDeviceLeft (const std::shared_ptr &session) {} + // ----------------------------------------------------------------------------- void ServerGroupChatRoomPrivate::onChatRoomInsertRequested (const shared_ptr &chatRoom) {} @@ -189,4 +201,6 @@ void ServerGroupChatRoom::join () {} void ServerGroupChatRoom::leave () {} +void ServerGroupChatRoom::onFirstNotifyReceived (const IdentityAddress &addr) {} + LINPHONE_END_NAMESPACE diff --git a/src/chat/chat-room/server-group-chat-room.h b/src/chat/chat-room/server-group-chat-room.h index bd480533c..fa4fd0ab4 100644 --- a/src/chat/chat-room/server-group-chat-room.h +++ b/src/chat/chat-room/server-group-chat-room.h @@ -85,6 +85,9 @@ public: void join () override; void leave () override; + /* ConferenceListener */ + void onFirstNotifyReceived (const IdentityAddress &addr) override; + private: L_DECLARE_PRIVATE(ServerGroupChatRoom); L_DISABLE_COPY(ServerGroupChatRoom); diff --git a/src/conference/conference-listener.h b/src/conference/conference-listener.h index e90c00760..e4da1bd7b 100644 --- a/src/conference/conference-listener.h +++ b/src/conference/conference-listener.h @@ -36,16 +36,16 @@ class IdentityAddress; class ConferenceListener { public: - virtual void onConferenceCreated (const IdentityAddress &addr) = 0; + virtual void onConferenceCreated (const IdentityAddress &addr) {} virtual void onConferenceKeywordsChanged (const std::vector &keywords) {} - virtual void onConferenceTerminated (const IdentityAddress &addr) = 0; - virtual void onFirstNotifyReceived (const IdentityAddress &addr) = 0; - virtual void onParticipantAdded (const std::shared_ptr &event, bool isFullState) = 0; - virtual void onParticipantRemoved (const std::shared_ptr &event, bool isFullState) = 0; - virtual void onParticipantSetAdmin (const std::shared_ptr &event, bool isFullState) = 0; - virtual void onSubjectChanged (const std::shared_ptr &event, bool isFullState) = 0; - virtual void onParticipantDeviceAdded (const std::shared_ptr &event, bool isFullState) = 0; - virtual void onParticipantDeviceRemoved (const std::shared_ptr &event, bool isFullState) = 0; + virtual void onConferenceTerminated (const IdentityAddress &addr) {} + virtual void onFirstNotifyReceived (const IdentityAddress &addr) {} + virtual void onParticipantAdded (const std::shared_ptr &event, bool isFullState) {} + virtual void onParticipantRemoved (const std::shared_ptr &event, bool isFullState) {} + virtual void onParticipantSetAdmin (const std::shared_ptr &event, bool isFullState) {} + virtual void onSubjectChanged (const std::shared_ptr &event, bool isFullState) {} + virtual void onParticipantDeviceAdded (const std::shared_ptr &event, bool isFullState) {} + virtual void onParticipantDeviceRemoved (const std::shared_ptr &event, bool isFullState) {} }; LINPHONE_END_NAMESPACE diff --git a/src/conference/conference.cpp b/src/conference/conference.cpp index b3127d89d..1aa3459e6 100644 --- a/src/conference/conference.cpp +++ b/src/conference/conference.cpp @@ -83,8 +83,7 @@ shared_ptr Conference::getMe () const { } int Conference::getParticipantCount () const { - L_D(); - return static_cast(d->participants.size()); + return static_cast(getParticipants().size()); } const list> &Conference::getParticipants () const { diff --git a/src/conference/conference.h b/src/conference/conference.h index 733c1360e..9891240ea 100644 --- a/src/conference/conference.h +++ b/src/conference/conference.h @@ -23,6 +23,7 @@ #include "linphone/types.h" #include "conference/conference-interface.h" +#include "conference/conference-listener.h" #include "core/core-accessor.h" // ============================================================================= @@ -36,6 +37,7 @@ class ConferencePrivate; class LINPHONE_PUBLIC Conference : public ConferenceInterface, + public ConferenceListener, public CoreAccessor { friend class CallSessionPrivate; diff --git a/src/conference/handlers/local-conference-event-handler-p.h b/src/conference/handlers/local-conference-event-handler-p.h index 6fce0ddb3..a4ad08b2a 100644 --- a/src/conference/handlers/local-conference-event-handler-p.h +++ b/src/conference/handlers/local-conference-event-handler-p.h @@ -40,11 +40,11 @@ public: std::string createNotifyFullState (int notifyId = -1, bool oneToOne = false); std::string createNotifyMultipart (int notifyId); std::string createNotifyParticipantAdded (const Address &addr, int notifyId = -1); + std::string createNotifyParticipantAdminStatusChanged (const Address &addr, bool isAdmin, int notifyId = -1); std::string createNotifyParticipantRemoved (const Address &addr, int notifyId = -1); - std::string createNotifyParticipantAdmined (const Address &addr, bool isAdmin, int notifyId = -1); - std::string createNotifySubjectChanged (int notifyId = -1); std::string createNotifyParticipantDeviceAdded (const Address &addr, const Address &gruu, int notifyId = -1); std::string createNotifyParticipantDeviceRemoved (const Address &addr, const Address &gruu, int notifyId = -1); + std::string createNotifySubjectChanged (int notifyId = -1); inline unsigned int getLastNotify () const { return lastNotify; }; @@ -54,6 +54,8 @@ private: LocalConference *conf = nullptr; unsigned int lastNotify = 1; + static void notifyResponseCb (const LinphoneEvent *ev); + std::string createNotify (Xsd::ConferenceInfo::ConferenceType confInfo, int notifyId = -1, bool isFullState = false); std::string createNotifySubjectChanged (const std::string &subject, int notifyId = -1); void notifyParticipant (const std::string ¬ify, const std::shared_ptr &participant); diff --git a/src/conference/handlers/local-conference-event-handler.cpp b/src/conference/handlers/local-conference-event-handler.cpp index 7b3989b72..d02280dc7 100644 --- a/src/conference/handlers/local-conference-event-handler.cpp +++ b/src/conference/handlers/local-conference-event-handler.cpp @@ -62,51 +62,6 @@ void LocalConferenceEventHandlerPrivate::notifyAll (const string ¬ify) { notifyParticipant(notify, participant); } -void LocalConferenceEventHandlerPrivate::notifyParticipant (const string ¬ify, const shared_ptr &participant) { - for (const auto &device : participant->getPrivate()->getDevices()) - notifyParticipantDevice(notify, device); -} - -void LocalConferenceEventHandlerPrivate::notifyParticipantDevice (const string ¬ify, const shared_ptr &device, bool multipart) { - if (device->isSubscribedToConferenceEventPackage() && !notify.empty()) { - LinphoneEvent *ev = device->getConferenceSubscribeEvent(); - LinphoneContent *content = linphone_core_create_content(ev->lc); - linphone_content_set_buffer(content, (const uint8_t *)notify.c_str(), strlen(notify.c_str())); - if (multipart) { - linphone_content_set_type(content, "multipart"); - linphone_content_set_subtype(content, "mixed;boundary=---------------------------14737809831466499882746641449"); - } else { - linphone_content_set_type(content, "application"); - linphone_content_set_subtype(content, "conference-info"); - } - linphone_event_notify(ev, content); - linphone_content_unref(content); - } -} - -string LocalConferenceEventHandlerPrivate::createNotify (ConferenceType confInfo, int notifyId, bool isFullState) { - if (notifyId == -1) { - lastNotify = lastNotify + 1; - confInfo.setVersion(lastNotify); - } else { - confInfo.setVersion(static_cast(notifyId)); - } - confInfo.setState(isFullState ? StateType::full : StateType::partial); - if (!confInfo.getConferenceDescription()) { - ConferenceDescriptionType description = ConferenceDescriptionType(); - confInfo.setConferenceDescription(description); - } - - time_t result = time(nullptr); - confInfo.getConferenceDescription()->setFreeText(Utils::toString(static_cast(result))); - - stringstream notify; - Xsd::XmlSchema::NamespaceInfomap map; - map[""].name = "urn:ietf:params:xml:ns:conference-info"; - serializeConferenceInfo(notify, confInfo, map); - return notify.str(); -} - string LocalConferenceEventHandlerPrivate::createNotifyFullState (int notifyId, bool oneToOne) { string entity = conf->getConferenceAddress().asString(); string subject = conf->getSubject(); @@ -177,7 +132,7 @@ string LocalConferenceEventHandlerPrivate::createNotifyMultipart (int notifyId) case EventLog::Type::ConferenceParticipantSetAdmin: { shared_ptr setAdminEvent = static_pointer_cast(eventLog); - body = createNotifyParticipantAdmined( + body = createNotifyParticipantAdminStatusChanged( setAdminEvent->getParticipantAddress(), true, eventNotifyId @@ -186,7 +141,7 @@ string LocalConferenceEventHandlerPrivate::createNotifyMultipart (int notifyId) case EventLog::Type::ConferenceParticipantUnsetAdmin: { shared_ptr unsetAdminEvent = static_pointer_cast(eventLog); - body = createNotifyParticipantAdmined( + body = createNotifyParticipantAdminStatusChanged( unsetAdminEvent->getParticipantAddress(), false, eventNotifyId @@ -263,21 +218,7 @@ string LocalConferenceEventHandlerPrivate::createNotifyParticipantAdded (const A return createNotify(confInfo, notifyId); } -string LocalConferenceEventHandlerPrivate::createNotifyParticipantRemoved (const Address &addr, int notifyId) { - string entity = conf->getConferenceAddress().asString(); - ConferenceType confInfo = ConferenceType(entity); - UsersType users; - confInfo.setUsers(users); - - UserType user = UserType(); - user.setEntity(addr.asStringUriOnly()); - user.setState(StateType::deleted); - confInfo.getUsers()->getUser().push_back(user); - - return createNotify(confInfo, notifyId); -} - -string LocalConferenceEventHandlerPrivate::createNotifyParticipantAdmined (const Address &addr, bool isAdmin, int notifyId) { +string LocalConferenceEventHandlerPrivate::createNotifyParticipantAdminStatusChanged (const Address &addr, bool isAdmin, int notifyId) { string entity = conf->getConferenceAddress().asString(); ConferenceType confInfo = ConferenceType(entity); UsersType users; @@ -294,16 +235,16 @@ string LocalConferenceEventHandlerPrivate::createNotifyParticipantAdmined (const return createNotify(confInfo, notifyId); } -string LocalConferenceEventHandlerPrivate::createNotifySubjectChanged (int notifyId) { - return createNotifySubjectChanged(conf->getSubject(), notifyId); -} - -string LocalConferenceEventHandlerPrivate::createNotifySubjectChanged (const string &subject, int notifyId) { +string LocalConferenceEventHandlerPrivate::createNotifyParticipantRemoved (const Address &addr, int notifyId) { string entity = conf->getConferenceAddress().asString(); ConferenceType confInfo = ConferenceType(entity); - ConferenceDescriptionType confDescr = ConferenceDescriptionType(); - confDescr.setSubject(subject); - confInfo.setConferenceDescription((const ConferenceDescriptionType)confDescr); + UsersType users; + confInfo.setUsers(users); + + UserType user = UserType(); + user.setEntity(addr.asStringUriOnly()); + user.setState(StateType::deleted); + confInfo.getUsers()->getUser().push_back(user); return createNotify(confInfo, notifyId); } @@ -350,6 +291,93 @@ string LocalConferenceEventHandlerPrivate::createNotifyParticipantDeviceRemoved return createNotify(confInfo, notifyId); } +string LocalConferenceEventHandlerPrivate::createNotifySubjectChanged (int notifyId) { + return createNotifySubjectChanged(conf->getSubject(), notifyId); +} + +// ----------------------------------------------------------------------------- + +void LocalConferenceEventHandlerPrivate::notifyResponseCb (const LinphoneEvent *ev) { + LinphoneEventCbs *cbs = linphone_event_get_callbacks(ev); + LocalConferenceEventHandlerPrivate *handler = reinterpret_cast( + linphone_event_cbs_get_user_data(cbs) + ); + linphone_event_cbs_set_user_data(cbs, nullptr); + linphone_event_cbs_set_notify_response(cbs, nullptr); + + if (linphone_event_get_reason(ev) != LinphoneReasonNone) + return; + + for (const auto &p : handler->conf->getParticipants()) { + for (const auto &d : p->getPrivate()->getDevices()) { + if ((d->getConferenceSubscribeEvent() == ev) && (d->getState() == ParticipantDevice::State::Joining)) { + handler->conf->onFirstNotifyReceived(d->getAddress()); + return; + } + } + } +} + +// ----------------------------------------------------------------------------- + +string LocalConferenceEventHandlerPrivate::createNotify (ConferenceType confInfo, int notifyId, bool isFullState) { + if (notifyId == -1) { + lastNotify = lastNotify + 1; + confInfo.setVersion(lastNotify); + } else { + confInfo.setVersion(static_cast(notifyId)); + } + confInfo.setState(isFullState ? StateType::full : StateType::partial); + if (!confInfo.getConferenceDescription()) { + ConferenceDescriptionType description = ConferenceDescriptionType(); + confInfo.setConferenceDescription(description); + } + + time_t result = time(nullptr); + confInfo.getConferenceDescription()->setFreeText(Utils::toString(static_cast(result))); + + stringstream notify; + Xsd::XmlSchema::NamespaceInfomap map; + map[""].name = "urn:ietf:params:xml:ns:conference-info"; + serializeConferenceInfo(notify, confInfo, map); + return notify.str(); +} + +string LocalConferenceEventHandlerPrivate::createNotifySubjectChanged (const string &subject, int notifyId) { + string entity = conf->getConferenceAddress().asString(); + ConferenceType confInfo = ConferenceType(entity); + ConferenceDescriptionType confDescr = ConferenceDescriptionType(); + confDescr.setSubject(subject); + confInfo.setConferenceDescription((const ConferenceDescriptionType)confDescr); + + return createNotify(confInfo, notifyId); +} + +void LocalConferenceEventHandlerPrivate::notifyParticipant (const string ¬ify, const shared_ptr &participant) { + for (const auto &device : participant->getPrivate()->getDevices()) + notifyParticipantDevice(notify, device); +} + +void LocalConferenceEventHandlerPrivate::notifyParticipantDevice (const string ¬ify, const shared_ptr &device, bool multipart) { + if (device->isSubscribedToConferenceEventPackage() && !notify.empty()) { + LinphoneEvent *ev = device->getConferenceSubscribeEvent(); + LinphoneEventCbs *cbs = linphone_event_get_callbacks(ev); + linphone_event_cbs_set_user_data(cbs, this); + linphone_event_cbs_set_notify_response(cbs, notifyResponseCb); + LinphoneContent *content = linphone_core_create_content(ev->lc); + linphone_content_set_buffer(content, (const uint8_t *)notify.c_str(), strlen(notify.c_str())); + if (multipart) { + linphone_content_set_type(content, "multipart"); + linphone_content_set_subtype(content, "mixed;boundary=---------------------------14737809831466499882746641449"); + } else { + linphone_content_set_type(content, "application"); + linphone_content_set_subtype(content, "conference-info"); + } + linphone_event_notify(ev, content); + linphone_content_unref(content); + } +} + // ============================================================================= LocalConferenceEventHandler::LocalConferenceEventHandler (LocalConference *localConference, unsigned int notify) : @@ -434,7 +462,7 @@ shared_ptr LocalConferenceEventHandler::notifyPartic shared_ptr LocalConferenceEventHandler::notifyParticipantSetAdmin (const Address &addr, bool isAdmin) { L_D(); - d->notifyAll(d->createNotifyParticipantAdmined(addr, isAdmin)); + d->notifyAll(d->createNotifyParticipantAdminStatusChanged(addr, isAdmin)); shared_ptr event = make_shared( isAdmin ? EventLog::Type::ConferenceParticipantSetAdmin : EventLog::Type::ConferenceParticipantUnsetAdmin, time(nullptr), diff --git a/src/conference/participant-device.h b/src/conference/participant-device.h index c4ee94e62..09fa3101c 100644 --- a/src/conference/participant-device.h +++ b/src/conference/participant-device.h @@ -34,6 +34,13 @@ class CallSession; class ParticipantDevice { public: + enum class State { + Joining, + Present, + Leaving, + Left + }; + ParticipantDevice (); explicit ParticipantDevice (const IdentityAddress &gruu); virtual ~ParticipantDevice (); @@ -43,6 +50,8 @@ public: inline const IdentityAddress &getAddress () const { return mGruu; } inline std::shared_ptr getSession () const { return mSession; } inline void setSession (std::shared_ptr session) { mSession = session; } + inline State getState () const { return mState; } + inline void setState (State newState) { mState = newState; } inline bool isSubscribedToConferenceEventPackage () const { return mConferenceSubscribeEvent != nullptr; } LinphoneEvent *getConferenceSubscribeEvent () const { return mConferenceSubscribeEvent; } @@ -54,6 +63,7 @@ private: IdentityAddress mGruu; std::shared_ptr mSession; LinphoneEvent *mConferenceSubscribeEvent = nullptr; + State mState = State::Joining; L_DISABLE_COPY(ParticipantDevice); }; diff --git a/src/conference/remote-conference.h b/src/conference/remote-conference.h index 95f1bee8f..1dd2b5931 100644 --- a/src/conference/remote-conference.h +++ b/src/conference/remote-conference.h @@ -20,7 +20,6 @@ #ifndef _L_REMOTE_CONFERENCE_H_ #define _L_REMOTE_CONFERENCE_H_ -#include "conference-listener.h" #include "conference.h" #include "core/core-accessor.h" @@ -30,7 +29,7 @@ LINPHONE_BEGIN_NAMESPACE class RemoteConferencePrivate; -class LINPHONE_PUBLIC RemoteConference : public Conference, public ConferenceListener { +class LINPHONE_PUBLIC RemoteConference : public Conference { friend class ClientGroupChatRoomPrivate; public: diff --git a/tester/conference-event-tester.cpp b/tester/conference-event-tester.cpp index 8f531974f..ecde1d4ab 100644 --- a/tester/conference-event-tester.cpp +++ b/tester/conference-event-tester.cpp @@ -1023,7 +1023,7 @@ void send_admined_notify() { BC_ASSERT_TRUE(!tester->participants.find(bobAddr.asString())->second); BC_ASSERT_TRUE(tester->participants.find(aliceAddr.asString())->second); - notify = localHandlerPrivate->createNotifyParticipantAdmined(bobAddr, true); + notify = localHandlerPrivate->createNotifyParticipantAdminStatusChanged(bobAddr, true); tester->handler->notifyReceived(notify); BC_ASSERT_EQUAL(tester->participants.size(), 2, int, "%d"); @@ -1078,7 +1078,7 @@ void send_unadmined_notify() { BC_ASSERT_TRUE(!tester->participants.find(bobAddr.asString())->second); BC_ASSERT_TRUE(tester->participants.find(aliceAddr.asString())->second); - notify = localHandlerPrivate->createNotifyParticipantAdmined(aliceAddr, false); + notify = localHandlerPrivate->createNotifyParticipantAdminStatusChanged(aliceAddr, false); tester->handler->notifyReceived(notify); BC_ASSERT_EQUAL(tester->participants.size(), 2, int, "%d"); From ea11871ddb4c6b64c019ba60ae3a0a86c1913a69 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 9 Feb 2018 16:49:15 +0100 Subject: [PATCH 011/281] Fix bug in linphone_core_get_call_history_size() when no database has been set. --- coreapi/call_log.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/coreapi/call_log.c b/coreapi/call_log.c index cc1874e41..176ad4960 100644 --- a/coreapi/call_log.c +++ b/coreapi/call_log.c @@ -610,7 +610,10 @@ int linphone_core_get_call_history_size(LinphoneCore *lc) { sqlite3_stmt *selectStatement; int returnValue; - if (!lc || lc->logs_db == NULL) return 0; + if (!lc) + return 0; + if (!lc->logs_db) + return (int)bctbx_list_size(lc->call_logs); buf = sqlite3_mprintf("SELECT count(*) FROM call_history"); returnValue = sqlite3_prepare_v2(lc->logs_db, buf, -1, &selectStatement, NULL); From ace638771e22798fb1a74ccb546aec1e59a847b6 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 9 Feb 2018 16:49:36 +0100 Subject: [PATCH 012/281] Fix workaround to prevent insertion of group chat room call sessions in call logs. --- coreapi/misc.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/coreapi/misc.c b/coreapi/misc.c index 169cc6b88..c95d2fa54 100644 --- a/coreapi/misc.c +++ b/coreapi/misc.c @@ -907,17 +907,18 @@ void linphone_core_report_call_log(LinphoneCore *lc, LinphoneCallLog *call_log){ // TODO: This is a workaround that has to be removed ASAP // Do not add calls made to the conference factory in the history - char *to = linphone_address_as_string(call_log->to); const char *conference_factory_uri = linphone_core_get_conference_factory_uri(lc); - if (conference_factory_uri && (strcmp(conference_factory_uri, to) == 0)) { - bctbx_free(to); - return; + if (conference_factory_uri) { + LinphoneAddress *conference_factory_addr = linphone_address_new(conference_factory_uri); + if (linphone_address_weak_equal(call_log->to, conference_factory_addr)) { + linphone_address_unref(conference_factory_addr); + return; + } + linphone_address_unref(conference_factory_addr); } - if (strstr(to, "chatroom-") == to) { - bctbx_free(to); + const char *username = linphone_address_get_username(call_log->to); + if (strstr(username, "chatroom-") == username) return; - } - bctbx_free(to); // End of workaround #ifdef SQLITE_STORAGE_ENABLED From 2ad51e7a0eb4539c6a99acd000de1e1c188e8f99 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Mon, 12 Feb 2018 14:43:31 +0100 Subject: [PATCH 013/281] Fix operator< of ChatRoomId. --- src/chat/chat-room/chat-room-id.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/chat/chat-room/chat-room-id.cpp b/src/chat/chat-room/chat-room-id.cpp index 5ffe44697..8ff0b8d35 100644 --- a/src/chat/chat-room/chat-room-id.cpp +++ b/src/chat/chat-room/chat-room-id.cpp @@ -61,7 +61,8 @@ bool ChatRoomId::operator!= (const ChatRoomId &chatRoomId) const { bool ChatRoomId::operator< (const ChatRoomId &chatRoomId) const { L_D(); const ChatRoomIdPrivate *dChatRoomId = chatRoomId.getPrivate(); - return d->peerAddress < dChatRoomId->peerAddress || d->localAddress < dChatRoomId->localAddress; + return d->peerAddress < dChatRoomId->peerAddress + || (d->peerAddress == dChatRoomId->peerAddress && d->localAddress < dChatRoomId->localAddress); } const IdentityAddress &ChatRoomId::getPeerAddress () const { From 790b948683ebda3d4cc5a577ae6214efba88078b Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Mon, 12 Feb 2018 14:44:57 +0100 Subject: [PATCH 014/281] Add back pointer to the Participant in a ParticipantDevice. --- src/conference/participant-device.cpp | 5 ++--- src/conference/participant-device.h | 6 +++++- src/conference/participant.cpp | 3 ++- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/conference/participant-device.cpp b/src/conference/participant-device.cpp index ea8b1c7a8..e04ecef3f 100644 --- a/src/conference/participant-device.cpp +++ b/src/conference/participant-device.cpp @@ -29,9 +29,8 @@ LINPHONE_BEGIN_NAMESPACE ParticipantDevice::ParticipantDevice () {} -ParticipantDevice::ParticipantDevice (const IdentityAddress &gruu) { - mGruu = gruu; -} +ParticipantDevice::ParticipantDevice (const Participant *participant, const IdentityAddress &gruu) + : mParticipant(participant), mGruu(gruu) {} ParticipantDevice::~ParticipantDevice () { if (mConferenceSubscribeEvent) diff --git a/src/conference/participant-device.h b/src/conference/participant-device.h index 09fa3101c..f1abe8e1e 100644 --- a/src/conference/participant-device.h +++ b/src/conference/participant-device.h @@ -23,6 +23,7 @@ #include #include "address/identity-address.h" + #include "linphone/types.h" #include "linphone/utils/general.h" @@ -31,6 +32,7 @@ LINPHONE_BEGIN_NAMESPACE class CallSession; +class Participant; class ParticipantDevice { public: @@ -42,12 +44,13 @@ public: }; ParticipantDevice (); - explicit ParticipantDevice (const IdentityAddress &gruu); + explicit ParticipantDevice (const Participant *participant, const IdentityAddress &gruu); virtual ~ParticipantDevice (); bool operator== (const ParticipantDevice &device) const; inline const IdentityAddress &getAddress () const { return mGruu; } + const Participant *getParticipant () const { return mParticipant; } inline std::shared_ptr getSession () const { return mSession; } inline void setSession (std::shared_ptr session) { mSession = session; } inline State getState () const { return mState; } @@ -60,6 +63,7 @@ public: bool isValid () const { return mGruu.isValid(); } private: + const Participant *mParticipant = nullptr; IdentityAddress mGruu; std::shared_ptr mSession; LinphoneEvent *mConferenceSubscribeEvent = nullptr; diff --git a/src/conference/participant.cpp b/src/conference/participant.cpp index f67694d4e..68d6e26f7 100644 --- a/src/conference/participant.cpp +++ b/src/conference/participant.cpp @@ -47,10 +47,11 @@ shared_ptr ParticipantPrivate::createSession ( // ----------------------------------------------------------------------------- shared_ptr ParticipantPrivate::addDevice (const IdentityAddress &gruu) { + L_Q(); shared_ptr device = findDevice(gruu); if (device) return device; - device = make_shared(gruu); + device = make_shared(q, gruu); devices.push_back(device); return device; } From 68ce70b0722a4f4eea1e943091c150090c2fb0c6 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Mon, 12 Feb 2018 14:47:46 +0100 Subject: [PATCH 015/281] Allow storage of participant device state in database. --- src/chat/chat-room/server-group-chat-room-p.h | 4 +++ .../chat-room/server-group-chat-room-stub.cpp | 8 +++++ src/db/main-db-p.h | 1 + src/db/main-db.cpp | 35 ++++++++++++++++++- src/db/main-db.h | 3 ++ 5 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/chat/chat-room/server-group-chat-room-p.h b/src/chat/chat-room/server-group-chat-room-p.h index 6b9ef0da0..9d8ec8946 100644 --- a/src/chat/chat-room/server-group-chat-room-p.h +++ b/src/chat/chat-room/server-group-chat-room-p.h @@ -26,6 +26,7 @@ #include "chat-room-p.h" #include "server-group-chat-room.h" +#include "conference/participant-device.h" // ============================================================================= @@ -41,6 +42,9 @@ public: std::shared_ptr findFilteredParticipant (const std::shared_ptr &session) const; std::shared_ptr findFilteredParticipant (const IdentityAddress &participantAddress) const; + ParticipantDevice::State getParticipantDeviceState (const std::shared_ptr &device) const; + void setParticipantDeviceState (const std::shared_ptr &device, ParticipantDevice::State state); + void confirmCreation (); void confirmJoining (SalCallOp *op); void confirmRecreation (SalCallOp *op); diff --git a/src/chat/chat-room/server-group-chat-room-stub.cpp b/src/chat/chat-room/server-group-chat-room-stub.cpp index 0e59145ab..23ea6d49b 100644 --- a/src/chat/chat-room/server-group-chat-room-stub.cpp +++ b/src/chat/chat-room/server-group-chat-room-stub.cpp @@ -42,6 +42,14 @@ shared_ptr ServerGroupChatRoomPrivate::findFilteredParticipant (con return nullptr; } +ParticipantDevice::State ServerGroupChatRoomPrivate::getParticipantDeviceState (const std::shared_ptr &device) const { + return device->getState(); +} + +void ServerGroupChatRoomPrivate::setParticipantDeviceState (const std::shared_ptr &device, ParticipantDevice::State state) { + device->setState(state); +} + // ----------------------------------------------------------------------------- void ServerGroupChatRoomPrivate::confirmCreation () {} diff --git a/src/db/main-db-p.h b/src/db/main-db-p.h index 5f3ea6896..3223aa00e 100644 --- a/src/db/main-db-p.h +++ b/src/db/main-db-p.h @@ -156,6 +156,7 @@ private: unsigned int getModuleVersion (const std::string &name); void updateModuleVersion (const std::string &name, unsigned int version); + void updateSchema (); // --------------------------------------------------------------------------- // Import. diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index cf92abd52..167e6293e 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -36,7 +36,7 @@ #include "main-db-key-p.h" #include "main-db-p.h" -#define DB_MODULE_VERSION_EVENTS L_VERSION(1, 0, 0) +#define DB_MODULE_VERSION_EVENTS L_VERSION(1, 0, 1) #define DB_MODULE_VERSION_FRIENDS L_VERSION(1, 0, 0) #define DB_MODULE_VERSION_LEGACY_FRIENDS_IMPORT L_VERSION(1, 0, 0) #define DB_MODULE_VERSION_LEGACY_HISTORY_IMPORT L_VERSION(1, 0, 0) @@ -1133,6 +1133,15 @@ void MainDbPrivate::updateModuleVersion (const string &name, unsigned int versio soci::use(name), soci::use(version); } +void MainDbPrivate::updateSchema () { + soci::session *session = dbSession.getBackendSession(); + unsigned int version = getModuleVersion("events"); + + if (version < L_VERSION(1, 0, 1)) { + *session << "ALTER TABLE chat_room_participant_device ADD COLUMN state TINYINT UNSIGNED DEFAULT 0"; + } +} + // ----------------------------------------------------------------------------- #define CHECK_LEGACY_TABLE_EXISTS(SESSION, NAME) \ @@ -1752,6 +1761,8 @@ void MainDb::init () { " version INT UNSIGNED NOT NULL" ") " + charset; + d->updateSchema(); + d->updateModuleVersion("events", DB_MODULE_VERSION_EVENTS); d->updateModuleVersion("friends", DB_MODULE_VERSION_FRIENDS); } @@ -2696,6 +2707,28 @@ void MainDb::enableChatRoomMigration (const ChatRoomId &chatRoomId, bool enable) }; } +void MainDb::updateChatRoomParticipantDevice (const shared_ptr &chatRoom, const shared_ptr &device) { + L_SAFE_TRANSACTION { + L_D(); + + soci::session *session = d->dbSession.getBackendSession(); + soci::transaction tr(*session); + + const long long &dbChatRoomId = d->selectChatRoomId(chatRoom->getChatRoomId()); + const long long &participantSipAddressId = d->selectSipAddressId(device->getParticipant()->getAddress().asString()); + const long long &participantId = d->selectChatRoomParticipantId(dbChatRoomId, participantSipAddressId); + const long long &participantSipDeviceAddressId = d->selectSipAddressId(device->getAddress().asString()); + unsigned int stateInt = static_cast(device->getState()); + *session << "UPDATE chat_room_participant_device SET state = :state" + " WHERE chat_room_participant_id = :participantId AND participant_device_sip_address_id = :participantSipDeviceAddressId", + soci::use(stateInt), soci::use(participantId), soci::use(participantSipDeviceAddressId); + + tr.commit(); + + return true; + }; +} + // ----------------------------------------------------------------------------- bool MainDb::import (Backend, const string ¶meters) { diff --git a/src/db/main-db.h b/src/db/main-db.h index f3301b007..53b9c71be 100644 --- a/src/db/main-db.h +++ b/src/db/main-db.h @@ -38,6 +38,7 @@ class Core; class EventLog; class MainDbKey; class MainDbPrivate; +class ParticipantDevice; class MainDb : public AbstractDb, public CoreAccessor { friend class MainDbChatMessageKey; @@ -135,6 +136,8 @@ public: ) const; void insertOneToOneConferenceChatRoom (const std::shared_ptr &chatRoom); + void updateChatRoomParticipantDevice (const std::shared_ptr &chatRoom, const std::shared_ptr &device); + // --------------------------------------------------------------------------- // Other. // --------------------------------------------------------------------------- From 589a0393b4e3d699d15199a0aeb0f6e9758e461f Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Mon, 12 Feb 2018 15:43:16 +0100 Subject: [PATCH 016/281] fix(MainDb): handle exception after reconnect in SafeTransaction --- src/db/main-db.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 167e6293e..f06ce52fb 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -87,13 +87,17 @@ public: try { mResult = mFunction(); } catch (const soci::soci_error &e) { - lWarning() << "Catched exception in MainDb::" << info.name << "."; + lWarning() << "Catched exception in MainDb::" << info.name << "(" << e.what() << ")."; soci::soci_error::error_category category = e.get_error_category(); if ( (category == soci::soci_error::connection_error || category == soci::soci_error::unknown) && info.mainDb->forceReconnect() ) { - mResult = mFunction(); + try { + mResult = mFunction(); + } catch (const exception &e) { + lWarning() << "Unable to execute query after reconnect in MainDb::" << info.name << "(" << e.what() << ")."; + } return; } lError() << "Unhandled [" << getErrorCategoryAsString(category) << "] exception in MainDb::" << From de13310b0335ccba0476992bb829507a189be720 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Mon, 12 Feb 2018 17:48:33 +0100 Subject: [PATCH 017/281] Fix const bug in getCppPtrFromC that was causing an infinite loop. --- src/c-wrapper/internal/c-tools.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/c-wrapper/internal/c-tools.h b/src/c-wrapper/internal/c-tools.h index 55d12a33b..a54e98c3b 100644 --- a/src/c-wrapper/internal/c-tools.h +++ b/src/c-wrapper/internal/c-tools.h @@ -338,7 +338,7 @@ public: typename = typename std::enable_if::value, CppType>::type > static inline std::shared_ptr getCppPtrFromC (const CType *cObject) { - return getCppPtrFromC(const_cast(cObject)); + return getCppPtrFromC::type, CppType>(const_cast(cObject)); } template< From 983471e8d0aec48f00d8c038109d363b6aec1a81 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Mon, 12 Feb 2018 17:48:55 +0100 Subject: [PATCH 018/281] For fixes for real time text. --- coreapi/call_log.c | 6 +- coreapi/chat.c | 10 +-- coreapi/private_structs.h | 5 -- coreapi/private_types.h | 2 - include/linphone/call_log.h | 9 ++- src/c-wrapper/api/c-call.cpp | 15 ++-- src/c-wrapper/api/c-chat-room.cpp | 18 +++-- src/call/call-p.h | 5 ++ src/call/call.cpp | 29 +++++-- src/call/call.h | 3 +- src/chat/chat-message/chat-message.cpp | 76 ++++++++++--------- .../chat-room/real-time-text-chat-room-p.h | 12 ++- .../chat-room/real-time-text-chat-room.cpp | 53 ++++++------- src/chat/chat-room/real-time-text-chat-room.h | 6 +- .../session/call-session-listener.h | 4 + src/conference/session/call-session.cpp | 10 ++- src/conference/session/call-session.h | 10 +-- src/conference/session/media-session.cpp | 9 +-- tester/message_tester.c | 1 + 19 files changed, 156 insertions(+), 127 deletions(-) diff --git a/coreapi/call_log.c b/coreapi/call_log.c index 176ad4960..abdcf98b5 100644 --- a/coreapi/call_log.c +++ b/coreapi/call_log.c @@ -198,7 +198,11 @@ const char *linphone_call_log_get_ref_key(const LinphoneCallLog *cl){ return cl->refkey; } -LinphoneAddress *linphone_call_log_get_remote_address(const LinphoneCallLog *cl){ +const LinphoneAddress *linphone_call_log_get_local_address(const LinphoneCallLog *cl) { + return (cl->dir == LinphoneCallIncoming) ? cl->to : cl->from; +} + +const LinphoneAddress *linphone_call_log_get_remote_address(const LinphoneCallLog *cl){ return (cl->dir == LinphoneCallIncoming) ? cl->from : cl->to; } diff --git a/coreapi/chat.c b/coreapi/chat.c index 19a3d040a..ac9c8dcf0 100644 --- a/coreapi/chat.c +++ b/coreapi/chat.c @@ -36,6 +36,7 @@ #include "linphone/wrapper_utils.h" #include "c-wrapper/c-wrapper.h" +#include "call/call.h" #include "chat/chat-room/basic-chat-room.h" #include "chat/chat-room/client-group-chat-room.h" #include "chat/chat-room/client-group-to-basic-chat-room.h" @@ -149,12 +150,9 @@ int linphone_core_message_received(LinphoneCore *lc, LinphonePrivate::SalOp *op, } void linphone_core_real_time_text_received(LinphoneCore *lc, LinphoneChatRoom *cr, uint32_t character, LinphoneCall *call) { - if (linphone_core_realtime_text_enabled(lc)) { - shared_ptr rttcr = - static_pointer_cast(L_GET_CPP_PTR_FROM_C_OBJECT(cr)); - L_GET_PRIVATE(rttcr)->realtimeTextReceived(character, call); - //L_GET_PRIVATE(static_pointer_cast(L_GET_CPP_PTR_FROM_C_OBJECT(cr)))->realtimeTextReceived(character, call); - } + if (!(L_GET_CPP_PTR_FROM_C_OBJECT(cr)->getCapabilities() & LinphonePrivate::ChatRoom::Capabilities::RealTimeText)) + return; + L_GET_PRIVATE_FROM_C_OBJECT(cr, RealTimeTextChatRoom)->realtimeTextReceived(character, L_GET_CPP_PTR_FROM_C_OBJECT(call)); } unsigned int linphone_chat_message_store(LinphoneChatMessage *msg) { diff --git a/coreapi/private_structs.h b/coreapi/private_structs.h index 073598723..993e5f983 100644 --- a/coreapi/private_structs.h +++ b/coreapi/private_structs.h @@ -151,11 +151,6 @@ struct _LinphoneAuthInfo char *algorithm; }; -struct _LinphoneChatMessageCharacter { - uint32_t value; - bool_t has_been_read; -}; - struct _LinphoneFriendPresence { char *uri_or_tel; LinphonePresenceModel *presence; diff --git a/coreapi/private_types.h b/coreapi/private_types.h index f646ce3ce..5e7ca8029 100644 --- a/coreapi/private_types.h +++ b/coreapi/private_types.h @@ -27,8 +27,6 @@ typedef struct StunCandidate StunCandidate; typedef struct _PortConfig PortConfig; -typedef struct _LinphoneChatMessageCharacter LinphoneChatMessageCharacter; - typedef struct _LinphoneFriendPresence LinphoneFriendPresence; typedef struct _LinphoneFriendPhoneNumberSipUri LinphoneFriendPhoneNumberSipUri; diff --git a/include/linphone/call_log.h b/include/linphone/call_log.h index 205865fad..004377e55 100644 --- a/include/linphone/call_log.h +++ b/include/linphone/call_log.h @@ -90,12 +90,19 @@ LINPHONE_PUBLIC float linphone_call_log_get_quality(const LinphoneCallLog *cl); **/ LINPHONE_PUBLIC const char * linphone_call_log_get_ref_key(const LinphoneCallLog *cl); +/** + * Get the local address (that is from or to depending on call direction) + * @param[in] cl LinphoneCallLog object + * @return The local address of the call + */ +LINPHONE_PUBLIC const LinphoneAddress *linphone_call_log_get_local_address(const LinphoneCallLog *cl); + /** * Get the remote address (that is from or to depending on call direction). * @param[in] cl LinphoneCallLog object * @return The remote address of the call. **/ -LINPHONE_PUBLIC LinphoneAddress * linphone_call_log_get_remote_address(const LinphoneCallLog *cl); +LINPHONE_PUBLIC const LinphoneAddress * linphone_call_log_get_remote_address(const LinphoneCallLog *cl); /** * Get the RTP statistics computed by the remote end and sent back via RTCP. diff --git a/src/c-wrapper/api/c-call.cpp b/src/c-wrapper/api/c-call.cpp index 3f0b4f376..07159bfc4 100644 --- a/src/c-wrapper/api/c-call.cpp +++ b/src/c-wrapper/api/c-call.cpp @@ -27,6 +27,7 @@ #include "call/call.h" #include "call/local-conference-call.h" #include "call/remote-conference-call.h" +#include "chat/chat-room/real-time-text-chat-room.h" #include "conference/params/media-session-params-p.h" #include "core/core-p.h" @@ -246,7 +247,7 @@ const char *linphone_call_get_to_header (const LinphoneCall *call, const char *n } char *linphone_call_get_remote_address_as_string (const LinphoneCall *call) { - return ms_strdup(L_GET_CPP_PTR_FROM_C_OBJECT(call)->getRemoteAddressAsString().c_str()); + return ms_strdup(L_GET_CPP_PTR_FROM_C_OBJECT(call)->getRemoteAddress().asString().c_str()); } const LinphoneAddress *linphone_call_get_diversion_address (const LinphoneCall *call) { @@ -538,16 +539,10 @@ bool_t linphone_call_echo_limiter_enabled (const LinphoneCall *call) { } LinphoneChatRoom *linphone_call_get_chat_room (LinphoneCall *call) { -#if 0 - if (!call->chat_room){ - if (call->state != LinphoneCallReleased && call->state != LinphoneCallEnd){ - call->chat_room = _linphone_core_create_chat_room_from_call(call); - } - } - return call->chat_room; -#else + shared_ptr acr = L_GET_PRIVATE_FROM_C_OBJECT(call)->getChatRoom(); + if (acr) + return L_GET_C_BACK_PTR(acr); return nullptr; -#endif } float linphone_call_get_play_volume (const LinphoneCall *call) { diff --git a/src/c-wrapper/api/c-chat-room.cpp b/src/c-wrapper/api/c-chat-room.cpp index 3288f1073..72fad5d60 100644 --- a/src/c-wrapper/api/c-chat-room.cpp +++ b/src/c-wrapper/api/c-chat-room.cpp @@ -27,6 +27,7 @@ #include "address/identity-address.h" #include "c-wrapper/c-wrapper.h" +#include "call/call.h" #include "chat/chat-message/chat-message-p.h" #include "chat/chat-room/basic-chat-room.h" #include "chat/chat-room/client-group-chat-room-p.h" @@ -156,9 +157,9 @@ void linphone_chat_room_receive_chat_message (LinphoneChatRoom *cr, LinphoneChat } uint32_t linphone_chat_room_get_char (const LinphoneChatRoom *cr) { - if (linphone_core_realtime_text_enabled(linphone_chat_room_get_core(cr))) - return L_GET_CPP_PTR_FROM_C_OBJECT(cr, RealTimeTextChatRoom)->getChar(); - return 0; + if (!(L_GET_CPP_PTR_FROM_C_OBJECT(cr)->getCapabilities() & LinphonePrivate::ChatRoom::Capabilities::RealTimeText)) + return 0; + return L_GET_CPP_PTR_FROM_C_OBJECT(cr, RealTimeTextChatRoom)->getChar(); } void linphone_chat_room_compose (LinphoneChatRoom *cr) { @@ -166,14 +167,15 @@ void linphone_chat_room_compose (LinphoneChatRoom *cr) { } LinphoneCall *linphone_chat_room_get_call (const LinphoneChatRoom *cr) { - if (linphone_core_realtime_text_enabled(linphone_chat_room_get_core(cr))) - return L_GET_CPP_PTR_FROM_C_OBJECT(cr, RealTimeTextChatRoom)->getCall(); - return nullptr; + if (!(L_GET_CPP_PTR_FROM_C_OBJECT(cr)->getCapabilities() & LinphonePrivate::ChatRoom::Capabilities::RealTimeText)) + return nullptr; + return L_GET_C_BACK_PTR(L_GET_CPP_PTR_FROM_C_OBJECT(cr, RealTimeTextChatRoom)->getCall()); } void linphone_chat_room_set_call (LinphoneChatRoom *cr, LinphoneCall *call) { - if (linphone_core_realtime_text_enabled(linphone_chat_room_get_core(cr))) - L_GET_PRIVATE_FROM_C_OBJECT(cr, RealTimeTextChatRoom)->call = call; + if (!(L_GET_CPP_PTR_FROM_C_OBJECT(cr)->getCapabilities() & LinphonePrivate::ChatRoom::Capabilities::RealTimeText)) + return; + L_GET_PRIVATE_FROM_C_OBJECT(cr, RealTimeTextChatRoom)->call = L_GET_CPP_PTR_FROM_C_OBJECT(call); } void linphone_chat_room_mark_as_read (LinphoneChatRoom *cr) { diff --git a/src/call/call-p.h b/src/call/call-p.h index 71eb8fa41..09f796d4c 100644 --- a/src/call/call-p.h +++ b/src/call/call-p.h @@ -34,6 +34,7 @@ LINPHONE_BEGIN_NAMESPACE class CallSession; +class RealTimeTextChatRoom; class CallPrivate : public ObjectPrivate, public CallSessionListener { public: @@ -50,6 +51,7 @@ public: virtual std::shared_ptr getActiveSession () const { return nullptr; } bool getAudioMuted () const; + std::shared_ptr getChatRoom (); LinphoneProxyConfig *getDestProxy () const; IceSession *getIceSession () const; @@ -109,6 +111,7 @@ private: void onStopRingingIfNeeded (const std::shared_ptr &session) override; bool areSoundResourcesAvailable (const std::shared_ptr &session) override; bool isPlayingRingbackTone (const std::shared_ptr &session) override; + void onRealTimeTextCharacterReceived (const std::shared_ptr &session, RealtimeTextReceivedCharacter *character) override; mutable LinphonePlayer *player = nullptr; @@ -119,6 +122,8 @@ private: BackgroundTask bgTask; + mutable std::shared_ptr chatRoom; + L_DECLARE_PUBLIC(Call); }; diff --git a/src/call/call.cpp b/src/call/call.cpp index 973e352e3..6153c3848 100644 --- a/src/call/call.cpp +++ b/src/call/call.cpp @@ -19,6 +19,7 @@ #include "c-wrapper/c-wrapper.h" #include "call-p.h" +#include "chat/chat-room/real-time-text-chat-room-p.h" #include "conference/params/media-session-params-p.h" #include "conference/session/call-session-p.h" #include "conference/session/media-session-p.h" @@ -37,6 +38,17 @@ bool CallPrivate::getAudioMuted () const { return static_pointer_cast(getActiveSession())->getPrivate()->getAudioMuted(); } +shared_ptr CallPrivate::getChatRoom () { + L_Q(); + if (!chatRoom && (q->getState() != CallSession::State::End) && (q->getState() != CallSession::State::Released)) { + ChatRoomId chatRoomId(q->getRemoteAddress(), q->getLocalAddress()); + RealTimeTextChatRoom *rttcr = new RealTimeTextChatRoom(q->getCore(), chatRoomId); + chatRoom.reset(rttcr); + rttcr->getPrivate()->setCall(q->getSharedFromThis()); + } + return chatRoom; +} + LinphoneProxyConfig *CallPrivate::getDestProxy () const { return getActiveSession()->getPrivate()->getDestProxy(); } @@ -167,7 +179,7 @@ void CallPrivate::startRemoteRing () { void CallPrivate::terminateBecauseOfLostMedia () { L_Q(); - lInfo() << "Call [" << q << "]: Media connectivity with " << q->getRemoteAddressAsString() + lInfo() << "Call [" << q << "]: Media connectivity with " << q->getRemoteAddress().asString() << " is lost, call is going to be terminated"; static_pointer_cast(getActiveSession())->terminateBecauseOfLostMedia(); linphone_core_play_named_tone(q->getCore()->getCCore(), LinphoneToneCallLost); @@ -459,6 +471,11 @@ bool CallPrivate::isPlayingRingbackTone (const shared_ptr &se return playingRingbackTone; } +void CallPrivate::onRealTimeTextCharacterReceived (const shared_ptr &session, RealtimeTextReceivedCharacter *data) { + L_Q(); + getChatRoom()->getPrivate()->realtimeTextReceived(data->character, q->getSharedFromThis()); +} + // ============================================================================= Call::Call (CallPrivate &p, shared_ptr core) : Object(p), CoreAccessor(core) { @@ -682,6 +699,11 @@ const LinphoneErrorInfo *Call::getErrorInfo () const { return d->getActiveSession()->getErrorInfo(); } +const Address &Call::getLocalAddress () const { + L_D(); + return d->getActiveSession()->getLocalAddress(); +} + LinphoneCallLog *Call::getLog () const { L_D(); return d->getActiveSession()->getLog(); @@ -756,11 +778,6 @@ const Address &Call::getRemoteAddress () const { return d->getActiveSession()->getRemoteAddress(); } -string Call::getRemoteAddressAsString () const { - L_D(); - return d->getActiveSession()->getRemoteAddressAsString(); -} - string Call::getRemoteContact () const { L_D(); return d->getActiveSession()->getRemoteContact(); diff --git a/src/call/call.h b/src/call/call.h index 6d1059127..15204a797 100644 --- a/src/call/call.h +++ b/src/call/call.h @@ -36,6 +36,7 @@ class MediaSessionPrivate; class Call : public Object, public CoreAccessor { friend class CallSessionPrivate; + friend class ChatMessage; friend class CorePrivate; friend class MediaSessionPrivate; @@ -85,6 +86,7 @@ public: const Address &getDiversionAddress () const; int getDuration () const; const LinphoneErrorInfo *getErrorInfo () const; + const Address &getLocalAddress () const; LinphoneCallLog *getLog () const; RtpTransport *getMetaRtcpTransport (int streamIndex) const; RtpTransport *getMetaRtpTransport (int streamIndex) const; @@ -98,7 +100,6 @@ public: std::shared_ptr getReferer () const; std::string getReferTo () const; const Address &getRemoteAddress () const; - std::string getRemoteAddressAsString () const; std::string getRemoteContact () const; const MediaSessionParams *getRemoteParams () const; std::string getRemoteUserAgent () const; diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index d6f7d3f95..13045da1f 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -25,7 +25,7 @@ #include "address/address.h" #include "c-wrapper/c-wrapper.h" -#include "call/call.h" +#include "call/call-p.h" #include "chat/chat-message/chat-message-p.h" #include "chat/chat-room/chat-room-p.h" #include "chat/chat-room/client-group-to-basic-chat-room.h" @@ -981,48 +981,50 @@ void ChatMessage::cancelFileTransfer () { int ChatMessage::putCharacter (uint32_t character) { L_D(); - shared_ptr core = getCore(); - if (linphone_core_realtime_text_enabled(core->getCCore())) { - static const uint32_t new_line = 0x2028; - static const uint32_t crlf = 0x0D0A; - static const uint32_t lf = 0x0A; + static const uint32_t new_line = 0x2028; + static const uint32_t crlf = 0x0D0A; + static const uint32_t lf = 0x0A; - shared_ptr chatRoom = getChatRoom(); + shared_ptr chatRoom = getChatRoom(); + if (!(chatRoom->getCapabilities() & LinphonePrivate::ChatRoom::Capabilities::RealTimeText)) + return -1; - shared_ptr rttcr = - static_pointer_cast(chatRoom); - LinphoneCall *call = rttcr->getCall(); + shared_ptr rttcr = + static_pointer_cast(chatRoom); + if (!rttcr) + return -1; - if (!call || !linphone_call_get_stream(call, LinphoneStreamTypeText)) - return -1; + shared_ptr call = rttcr->getCall(); + if (!call || !call->getPrivate()->getMediaStream(LinphoneStreamTypeText)) + return -1; - if (character == new_line || character == crlf || character == lf) { - if (lp_config_get_int(core->getCCore()->config, "misc", "store_rtt_messages", 1) == 1) { - // TODO: History. - lDebug() << "New line sent, forge a message with content " << d->rttMessage.c_str(); - d->setTime(ms_time(0)); - d->state = State::Displayed; - // d->direction = Direction::Outgoing; - // setFromAddress(Address( - // linphone_address_as_string(linphone_address_new(linphone_core_get_identity(core->getCCore()))) - // )); - // linphone_chat_message_store(L_GET_C_BACK_PTR(this)); - d->rttMessage = ""; - } - } else { - char *value = LinphonePrivate::Utils::utf8ToChar(character); - d->rttMessage = d->rttMessage + string(value); - lDebug() << "Sent RTT character: " << value << "(" << (unsigned long)character << - "), pending text is " << d->rttMessage.c_str(); - delete value; + if (character == new_line || character == crlf || character == lf) { + shared_ptr core = getCore(); + if (lp_config_get_int(core->getCCore()->config, "misc", "store_rtt_messages", 1) == 1) { + // TODO: History. + lDebug() << "New line sent, forge a message with content " << d->rttMessage.c_str(); + d->setTime(ms_time(0)); + d->state = State::Displayed; + // d->direction = Direction::Outgoing; + // setFromAddress(Address( + // linphone_address_as_string(linphone_address_new(linphone_core_get_identity(core->getCCore()))) + // )); + // linphone_chat_message_store(L_GET_C_BACK_PTR(this)); + d->rttMessage = ""; } - - text_stream_putchar32(reinterpret_cast( - linphone_call_get_stream(call, LinphoneStreamTypeText)), character - ); - return 0; + } else { + char *value = LinphonePrivate::Utils::utf8ToChar(character); + d->rttMessage = d->rttMessage + string(value); + lDebug() << "Sent RTT character: " << value << "(" << (unsigned long)character << + "), pending text is " << d->rttMessage.c_str(); + delete[] value; } - return -1; + + text_stream_putchar32( + reinterpret_cast(call->getPrivate()->getMediaStream(LinphoneStreamTypeText)), + character + ); + return 0; } LINPHONE_END_NAMESPACE diff --git a/src/chat/chat-room/real-time-text-chat-room-p.h b/src/chat/chat-room/real-time-text-chat-room-p.h index c8e5e2b62..ae9af9de3 100644 --- a/src/chat/chat-room/real-time-text-chat-room-p.h +++ b/src/chat/chat-room/real-time-text-chat-room-p.h @@ -29,13 +29,19 @@ LINPHONE_BEGIN_NAMESPACE class RealTimeTextChatRoomPrivate : public BasicChatRoomPrivate { public: + struct Character { + uint32_t value; + bool hasBeenRead; + }; + RealTimeTextChatRoomPrivate () = default; - void realtimeTextReceived (uint32_t character, LinphoneCall *call); + void realtimeTextReceived (uint32_t character, const std::shared_ptr &call); void sendChatMessage (const std::shared_ptr &chatMessage) override; + void setCall (const std::shared_ptr &value) { call = value; } - LinphoneCall *call = nullptr; - std::list receivedRttCharacters; + std::weak_ptr call; + std::list receivedRttCharacters; std::shared_ptr pendingMessage = nullptr; private: diff --git a/src/chat/chat-room/real-time-text-chat-room.cpp b/src/chat/chat-room/real-time-text-chat-room.cpp index f12e120b3..ec6eb3df5 100644 --- a/src/chat/chat-room/real-time-text-chat-room.cpp +++ b/src/chat/chat-room/real-time-text-chat-room.cpp @@ -18,6 +18,7 @@ */ #include "c-wrapper/c-wrapper.h" +#include "call/call.h" #include "chat/chat-message/chat-message-p.h" #include "conference/participant.h" #include "core/core.h" @@ -32,7 +33,7 @@ LINPHONE_BEGIN_NAMESPACE // ----------------------------------------------------------------------------- -void RealTimeTextChatRoomPrivate::realtimeTextReceived (uint32_t character, LinphoneCall *call) { +void RealTimeTextChatRoomPrivate::realtimeTextReceived (uint32_t character, const shared_ptr &call) { L_Q(); const uint32_t new_line = 0x2028; const uint32_t crlf = 0x0D0A; @@ -41,14 +42,13 @@ void RealTimeTextChatRoomPrivate::realtimeTextReceived (uint32_t character, Linp shared_ptr core = q->getCore(); LinphoneCore *cCore = core->getCCore(); - if (call && linphone_call_params_realtime_text_enabled(linphone_call_get_current_params(call))) { - LinphoneChatMessageCharacter *cmc = bctbx_new0(LinphoneChatMessageCharacter, 1); - + if (call && call->getCurrentParams()->realtimeTextEnabled()) { if (!pendingMessage) pendingMessage = q->createChatMessage(""); - cmc->value = character; - cmc->has_been_read = FALSE; + Character cmc; + cmc.value = character; + cmc.hasBeenRead = false; receivedRttCharacters.push_back(cmc); remoteIsComposing.push_back(q->getPeerAddress()); @@ -74,23 +74,24 @@ void RealTimeTextChatRoomPrivate::realtimeTextReceived (uint32_t character, Linp onChatMessageReceived(pendingMessage); pendingMessage = nullptr; - for (auto &rttChars : receivedRttCharacters) - ms_free(rttChars); receivedRttCharacters.clear(); } else { char *value = Utils::utf8ToChar(character); - char *text = (char *)pendingMessage->getPrivate()->getText().c_str(); - pendingMessage->getPrivate()->setText(ms_strcat_printf(text, value)); - lDebug() << "Received RTT character: " << value << " (" << character << "), pending text is " << pendingMessage->getPrivate()->getText(); - delete value; + string text(pendingMessage->getPrivate()->getText()); + text += string(value); + pendingMessage->getPrivate()->setText(text); + lInfo() << "Received RTT character: " << value << " (" << character << "), pending text is " << pendingMessage->getPrivate()->getText(); + delete[] value; } } } void RealTimeTextChatRoomPrivate::sendChatMessage (const shared_ptr &chatMessage) { - if (call && linphone_call_params_realtime_text_enabled(linphone_call_get_current_params(call))) { - uint32_t new_line = 0x2028; - chatMessage->putCharacter(new_line); + L_Q(); + shared_ptr call = q->getCall(); + if (call && call->getCurrentParams()->realtimeTextEnabled()) { + uint32_t newLine = 0x2028; + chatMessage->putCharacter(newLine); } } @@ -99,26 +100,16 @@ void RealTimeTextChatRoomPrivate::sendChatMessage (const shared_ptr RealTimeTextChatRoom::RealTimeTextChatRoom (const shared_ptr &core, const ChatRoomId &chatRoomId) : BasicChatRoom(*new RealTimeTextChatRoomPrivate, core, chatRoomId) {} -RealTimeTextChatRoom::~RealTimeTextChatRoom () { - L_D(); - - if (!d->receivedRttCharacters.empty()) - for (auto &rttChars : d->receivedRttCharacters) - bctbx_free(rttChars); -} - RealTimeTextChatRoom::CapabilitiesMask RealTimeTextChatRoom::getCapabilities () const { return BasicChatRoom::getCapabilities() | Capabilities::RealTimeText; } uint32_t RealTimeTextChatRoom::getChar () const { L_D(); - if (!d->receivedRttCharacters.empty()) { - for (auto &cmc : d->receivedRttCharacters) { - if (!cmc->has_been_read) { - cmc->has_been_read = TRUE; - return cmc->value; - } + for (const auto &cmc : d->receivedRttCharacters) { + if (!cmc.hasBeenRead) { + const_cast(&cmc)->hasBeenRead = true; + return cmc.value; } } return 0; @@ -126,9 +117,9 @@ uint32_t RealTimeTextChatRoom::getChar () const { // ----------------------------------------------------------------------------- -LinphoneCall *RealTimeTextChatRoom::getCall () const { +shared_ptr RealTimeTextChatRoom::getCall () const { L_D(); - return d->call; + return d->call.lock(); } LINPHONE_END_NAMESPACE diff --git a/src/chat/chat-room/real-time-text-chat-room.h b/src/chat/chat-room/real-time-text-chat-room.h index 7206bf3bc..4f0d8cb7f 100644 --- a/src/chat/chat-room/real-time-text-chat-room.h +++ b/src/chat/chat-room/real-time-text-chat-room.h @@ -26,18 +26,20 @@ LINPHONE_BEGIN_NAMESPACE +class Call; class RealTimeTextChatRoomPrivate; class LINPHONE_PUBLIC RealTimeTextChatRoom : public BasicChatRoom { + friend class CallPrivate; friend class CorePrivate; public: - ~RealTimeTextChatRoom (); + ~RealTimeTextChatRoom () = default; CapabilitiesMask getCapabilities () const override; uint32_t getChar () const; - LinphoneCall *getCall () const; + std::shared_ptr getCall () const; private: RealTimeTextChatRoom (const std::shared_ptr &core, const ChatRoomId &chatRoomId); diff --git a/src/conference/session/call-session-listener.h b/src/conference/session/call-session-listener.h index f14d9249c..65f76eeb6 100644 --- a/src/conference/session/call-session-listener.h +++ b/src/conference/session/call-session-listener.h @@ -22,6 +22,8 @@ #include "conference/session/call-session.h" +#include + // ============================================================================= LINPHONE_BEGIN_NAMESPACE @@ -75,6 +77,8 @@ public: virtual bool areSoundResourcesAvailable (const std::shared_ptr &session) { return true; } virtual bool isPlayingRingbackTone (const std::shared_ptr &session) { return false; } + + virtual void onRealTimeTextCharacterReceived (const std::shared_ptr &session, RealtimeTextReceivedCharacter *data) {} }; LINPHONE_END_NAMESPACE diff --git a/src/conference/session/call-session.cpp b/src/conference/session/call-session.cpp index 97aa06f6f..944fb8b91 100644 --- a/src/conference/session/call-session.cpp +++ b/src/conference/session/call-session.cpp @@ -1226,6 +1226,12 @@ const LinphoneErrorInfo * CallSession::getErrorInfo () const { return d->ei; } +const Address& CallSession::getLocalAddress () const { + L_D(); + return *L_GET_CPP_PTR_FROM_C_OBJECT((d->direction == LinphoneCallIncoming) + ? linphone_call_log_get_to(d->log) : linphone_call_log_get_from(d->log)); +} + LinphoneCallLog * CallSession::getLog () const { L_D(); return d->log; @@ -1251,10 +1257,6 @@ const Address& CallSession::getRemoteAddress () const { ? linphone_call_log_get_from(d->log) : linphone_call_log_get_to(d->log)); } -string CallSession::getRemoteAddressAsString () const { - return getRemoteAddress().asString(); -} - string CallSession::getRemoteContact () const { L_D(); if (d->op) { diff --git a/src/conference/session/call-session.h b/src/conference/session/call-session.h index cddbfbaa4..4fc531734 100644 --- a/src/conference/session/call-session.h +++ b/src/conference/session/call-session.h @@ -78,23 +78,23 @@ public: CallSessionParams *getCurrentParams () const; LinphoneCallDir getDirection () const; - const Address& getDiversionAddress () const; + const Address &getDiversionAddress () const; int getDuration () const; const LinphoneErrorInfo * getErrorInfo () const; - LinphoneCallLog * getLog () const; + const Address &getLocalAddress () const; + LinphoneCallLog *getLog () const; virtual const CallSessionParams *getParams () const; LinphoneReason getReason () const; std::shared_ptr getReferer () const; std::string getReferTo () const; - const Address& getRemoteAddress () const; - std::string getRemoteAddressAsString () const; + const Address &getRemoteAddress () const; std::string getRemoteContact () const; const Address *getRemoteContactAddress () const; const CallSessionParams *getRemoteParams (); std::string getRemoteUserAgent () const; std::shared_ptr getReplacedCallSession () const; CallSession::State getState () const; - const Address& getToAddress () const; + const Address &getToAddress () const; CallSession::State getTransferState () const; std::shared_ptr getTransferTarget () const; std::string getToHeader (const std::string &name) const; diff --git a/src/conference/session/media-session.cpp b/src/conference/session/media-session.cpp index b3b6f04cd..89ab3d443 100644 --- a/src/conference/session/media-session.cpp +++ b/src/conference/session/media-session.cpp @@ -2830,7 +2830,7 @@ void MediaSessionPrivate::startTextStream () { rtp_session_set_multicast_ttl(textStream->ms.sessions.rtp_session, tstream->ttl); text_stream_start(textStream, textProfile, rtpAddr, tstream->rtp_port, rtcpAddr, (linphone_core_rtcp_enabled(q->getCore()->getCCore()) && !isMulticast) ? (tstream->rtcp_port ? tstream->rtcp_port : tstream->rtp_port + 1) : 0, usedPt); - ms_filter_add_notify_callback(textStream->rttsink, realTimeTextCharacterReceived, q, false); + ms_filter_add_notify_callback(textStream->rttsink, realTimeTextCharacterReceived, this, false); ms_media_stream_sessions_set_encryption_mandatory(&textStream->ms.sessions, isEncryptionMandatory()); } } else @@ -3806,12 +3806,11 @@ void MediaSessionPrivate::videoStreamEventCb (const MSFilter *f, const unsigned #endif void MediaSessionPrivate::realTimeTextCharacterReceived (MSFilter *f, unsigned int id, void *arg) { + L_Q(); if (id == MS_RTT_4103_RECEIVED_CHAR) { -#if 0 RealtimeTextReceivedCharacter *data = reinterpret_cast(arg); - LinphoneChatRoom * chat_room = linphone_call_get_chat_room(call); - linphone_core_real_time_text_received(call->core, chat_room, data->character, call); -#endif + if (listener) + listener->onRealTimeTextCharacterReceived(q->getSharedFromThis(), data); } } diff --git a/tester/message_tester.c b/tester/message_tester.c index cc62e98c3..3d7f16e0e 100644 --- a/tester/message_tester.c +++ b/tester/message_tester.c @@ -1709,6 +1709,7 @@ static void real_time_text(bool_t audio_stream_enabled, bool_t srtp_enabled, boo } linphone_chat_room_send_chat_message(pauline_chat_room, rtt_message); BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneMessageReceived, 1)); + linphone_chat_message_unref(rtt_message); if (sql_storage) { bctbx_list_t *marie_messages = linphone_chat_room_get_history(marie_chat_room, 0); From 8c9164a5eb0331756a4c8c802f887146e033d2b8 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Mon, 12 Feb 2018 18:06:54 +0100 Subject: [PATCH 019/281] Some more fixes for real time text. --- src/chat/chat-room/real-time-text-chat-room.cpp | 14 +++----------- tester/message_tester.c | 6 ++++++ 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/chat/chat-room/real-time-text-chat-room.cpp b/src/chat/chat-room/real-time-text-chat-room.cpp index ec6eb3df5..f33162682 100644 --- a/src/chat/chat-room/real-time-text-chat-room.cpp +++ b/src/chat/chat-room/real-time-text-chat-room.cpp @@ -55,19 +55,11 @@ void RealTimeTextChatRoomPrivate::realtimeTextReceived (uint32_t character, cons linphone_core_notify_is_composing_received(cCore, L_GET_C_BACK_PTR(q)); if ((character == new_line) || (character == crlf) || (character == lf)) { - /* End of message */ + // End of message lDebug() << "New line received, forge a message with content " << pendingMessage->getPrivate()->getText().c_str(); - // TODO: REPAIR ME. - // pendingMessage->setFromAddress(peerAddress); - // pendingMessage->setToAddress( - // Address( - // linphone_call_get_dest_proxy(call) - // ? linphone_address_as_string(linphone_call_get_dest_proxy(call)->identity_address) - // : linphone_core_get_identity(cCore) - // ) - // ); pendingMessage->getPrivate()->setState(ChatMessage::State::Delivered); pendingMessage->getPrivate()->setDirection(ChatMessage::Direction::Incoming); + pendingMessage->getPrivate()->setTime(::ms_time(0)); if (lp_config_get_int(linphone_core_get_config(cCore), "misc", "store_rtt_messages", 1) == 1) pendingMessage->getPrivate()->storeInDb(); @@ -80,7 +72,7 @@ void RealTimeTextChatRoomPrivate::realtimeTextReceived (uint32_t character, cons string text(pendingMessage->getPrivate()->getText()); text += string(value); pendingMessage->getPrivate()->setText(text); - lInfo() << "Received RTT character: " << value << " (" << character << "), pending text is " << pendingMessage->getPrivate()->getText(); + lDebug() << "Received RTT character: " << value << " (" << character << "), pending text is " << pendingMessage->getPrivate()->getText(); delete[] value; } } diff --git a/tester/message_tester.c b/tester/message_tester.c index 3d7f16e0e..e88cb05c5 100644 --- a/tester/message_tester.c +++ b/tester/message_tester.c @@ -1828,6 +1828,8 @@ static void real_time_text_conversation(void) { } } + linphone_chat_message_unref(pauline_rtt_message); + linphone_chat_message_unref(marie_rtt_message); reset_counters(&pauline->stat); reset_counters(&marie->stat); pauline_rtt_message = linphone_chat_room_create_message(pauline_chat_room,NULL); @@ -1863,6 +1865,8 @@ static void real_time_text_conversation(void) { BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(msg), message2_2); } } + linphone_chat_message_unref(pauline_rtt_message); + linphone_chat_message_unref(marie_rtt_message); } end_call(marie, pauline); linphone_call_params_unref(marie_params); @@ -1980,6 +1984,7 @@ static void real_time_text_message_accented_chars(void) { linphone_chat_room_send_chat_message(pauline_chat_room, rtt_message); BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneMessageReceived, 1)); BC_ASSERT_EQUAL(strcmp(linphone_chat_message_get_text(marie->stat.last_received_chat_message), "ãæçéîøùÿ"), 0, int, "%i"); + linphone_chat_message_unref(rtt_message); } end_call(marie, pauline); } @@ -2032,6 +2037,7 @@ static void real_time_text_copy_paste(void) { } linphone_chat_room_send_chat_message(pauline_chat_room, rtt_message); BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneMessageReceived, 1)); + linphone_chat_message_unref(rtt_message); } end_call(marie, pauline); From cefa3cb85a266b96a1b8bc78c15ac673effdb920 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 13 Feb 2018 09:24:22 +0100 Subject: [PATCH 020/281] feat(MainDb): better code, L_SAFE_TRANSACTION supports query without returned value --- src/db/main-db.cpp | 43 +++++++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index f06ce52fb..f992d72a1 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -80,12 +80,18 @@ struct SafeTransactionInfo { template class SafeTransaction { + using InternalReturnType = typename remove_reference()())>::type; + public: - using ReturnType = typename remove_reference()())>::type; + using ReturnType = typename std::conditional< + std::is_same::value, + bool, + InternalReturnType + >::type; SafeTransaction (SafeTransactionInfo &info, Function function) : mFunction(move(function)) { try { - mResult = mFunction(); + mResult= exec(); } catch (const soci::soci_error &e) { lWarning() << "Catched exception in MainDb::" << info.name << "(" << e.what() << ")."; soci::soci_error::error_category category = e.get_error_category(); @@ -94,9 +100,9 @@ public: info.mainDb->forceReconnect() ) { try { - mResult = mFunction(); + mResult = exec(); } catch (const exception &e) { - lWarning() << "Unable to execute query after reconnect in MainDb::" << info.name << "(" << e.what() << ")."; + lError() << "Unable to execute query after reconnect in MainDb::" << info.name << "(" << e.what() << ")."; } return; } @@ -114,6 +120,17 @@ public: } private: + template + typename std::enable_if::value, bool>::type exec () const { + mFunction(); + return true; + } + + template + typename std::enable_if::value, T>::type exec () const { + return mFunction(); + } + static const char *getErrorCategoryAsString (soci::soci_error::error_category category) { switch (category) { case soci::soci_error::connection_error: @@ -2104,8 +2121,6 @@ void MainDb::markChatMessagesAsRead (const ChatRoomId &chatRoomId) const { *session << query, soci::use(dbChatRoomId); tr.commit(); } - - return true; }; } @@ -2337,8 +2352,6 @@ void MainDb::cleanHistory (const ChatRoomId &chatRoomId, FilterMask mask) { *session << "DELETE FROM event WHERE id IN (" + query + ")", soci::use(dbChatRoomId); tr.commit(); - - return true; }; } @@ -2492,8 +2505,6 @@ void MainDb::insertChatRoom (const shared_ptr &chatRoom) { d->insertChatRoom(chatRoom); tr.commit(); - - return true; }; } @@ -2518,8 +2529,6 @@ void MainDb::deleteChatRoom (const ChatRoomId &chatRoomId) { *session << "DELETE FROM chat_room WHERE id = :chatRoomId", soci::use(dbChatRoomId); tr.commit(); - - return true; }; } @@ -2585,8 +2594,6 @@ void MainDb::migrateBasicToClientGroupChatRoom ( } tr.commit(); - - return true; }; } @@ -2681,8 +2688,6 @@ void MainDb::insertOneToOneConferenceChatRoom (const shared_ptr soci::use(stateInt), soci::use(participantId), soci::use(participantSipDeviceAddressId); tr.commit(); - - return true; }; } @@ -2751,12 +2752,10 @@ bool MainDb::import (Backend, const string ¶meters) { // TODO: Remove condition after cpp migration in friends/friends list. if (false) d->importLegacyFriends(inDbSession); - return true; }; L_SAFE_TRANSACTION { d->importLegacyHistory(inDbSession); - return true; }; return true; From 68bb9a122453679c932d24d4c04057b890444e0c Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 13 Feb 2018 09:30:31 +0100 Subject: [PATCH 021/281] feat(MainDb): exec on SafeTransaction is now constexpr --- src/db/main-db.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index f992d72a1..6c2c7e31e 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -120,14 +120,16 @@ public: } private: + // Exec function with no return type. template - typename std::enable_if::value, bool>::type exec () const { + constexpr typename std::enable_if::value, bool>::type exec () const { mFunction(); return true; } + // Exec function with return type. template - typename std::enable_if::value, T>::type exec () const { + constexpr typename std::enable_if::value, T>::type exec () const { return mFunction(); } From 79c5e8e0ab38a5da8fdf9bf71526f2c6fce0dd3c Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 13 Feb 2018 09:32:14 +0100 Subject: [PATCH 022/281] fix(MainDb): remove useless check on migrateBasicToClientGroupChatRoom --- src/db/main-db.cpp | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 6c2c7e31e..5db7cccb3 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -2556,19 +2556,6 @@ void MainDb::migrateBasicToClientGroupChatRoom ( const long long &localSipAddressId = d->insertSipAddress(newChatRoomId.getLocalAddress().asString()); const int &capabilities = clientGroupChatRoom->getCapabilities(); - { - shared_ptr buggyChatRoom = getCore()->findChatRoom(newChatRoomId); - if (buggyChatRoom) { - lError() << "Chat room was found with the same chat room id of a new migrated ClientGroupChatRoom!!!"; - AbstractChatRoom::CapabilitiesMask capabilities = buggyChatRoom->getCapabilities(); - if (capabilities & AbstractChatRoom::Capabilities::Basic) { - lError() << "Delete invalid basic chat room..."; - Core::deleteChatRoom(buggyChatRoom); - } else - lError() << "Unable to delete invalid chat room with capabilities: " << capabilities << "."; - } - } - *session << "UPDATE chat_room" " SET capabilities = :capabilities," " peer_sip_address_id = :peerSipAddressId," From 57687e1b99972dccd0d2d449e7213ff2da126597 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 13 Feb 2018 09:57:59 +0100 Subject: [PATCH 023/281] Handle fetching a participant device's state from database. --- src/db/main-db.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 5db7cccb3..08a768615 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -2421,13 +2421,19 @@ list> MainDb::getChatRooms () const { // Fetch devices. { const long long &participantId = d->resolveId(row, 0); - static const string query = "SELECT sip_address.value FROM chat_room_participant_device, sip_address" + static const string query = "SELECT sip_address.value, state FROM chat_room_participant_device, sip_address" " WHERE chat_room_participant_id = :participantId" " AND participant_device_sip_address_id = sip_address.id"; soci::rowset rows = (session->prepare << query, soci::use(participantId)); - for (const auto &row : rows) - dParticipant->addDevice(IdentityAddress(row.get(0))); + for (const auto &row : rows) { + shared_ptr device = dParticipant->addDevice(IdentityAddress(row.get(0))); + ParticipantDevice::State state = static_cast(getBackend() == Backend::Mysql + ? row.get(1, 0) + : static_cast(row.get(1, 0)) + ); + device->setState(state); + } } if (participant->getAddress() == chatRoomId.getLocalAddress().getAddressWithoutGruu()) From 66a6499f56f4d87d03b70ffc5890643542540eac Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 13 Feb 2018 10:22:47 +0100 Subject: [PATCH 024/281] fix(MainDb): remove constexpr on exec (unsupported on android in this case) --- src/db/main-db.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 08a768615..e048cb6c2 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -122,14 +122,14 @@ public: private: // Exec function with no return type. template - constexpr typename std::enable_if::value, bool>::type exec () const { + typename std::enable_if::value, bool>::type exec () const { mFunction(); return true; } // Exec function with return type. template - constexpr typename std::enable_if::value, T>::type exec () const { + typename std::enable_if::value, T>::type exec () const { return mFunction(); } From 2f39f845d57d37b6c2b86ad323786fed8874158d Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 13 Feb 2018 10:31:01 +0100 Subject: [PATCH 025/281] Fix crash in linphone_core_report_call_log(). --- coreapi/misc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreapi/misc.c b/coreapi/misc.c index c95d2fa54..b82e749bf 100644 --- a/coreapi/misc.c +++ b/coreapi/misc.c @@ -917,7 +917,7 @@ void linphone_core_report_call_log(LinphoneCore *lc, LinphoneCallLog *call_log){ linphone_address_unref(conference_factory_addr); } const char *username = linphone_address_get_username(call_log->to); - if (strstr(username, "chatroom-") == username) + if (username && (strstr(username, "chatroom-") == username)) return; // End of workaround From 593c48faaf7fd43f2693052c68eee36021ba2538 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 13 Feb 2018 10:33:55 +0100 Subject: [PATCH 026/281] feat(General): replace L_VERSION macro by makeVersion constexpr func (better and safe) --- include/linphone/utils/general.h | 8 +++++--- src/db/main-db.cpp | 26 ++++++++++++++------------ src/utils/general.cpp | 2 +- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/include/linphone/utils/general.h b/include/linphone/utils/general.h index c1970637d..6d393aec9 100644 --- a/include/linphone/utils/general.h +++ b/include/linphone/utils/general.h @@ -75,10 +75,10 @@ LINPHONE_BEGIN_NAMESPACE // Debug. // ----------------------------------------------------------------------------- -void l_assert (const char *condition, const char *file, int line); +void lAssert (const char *condition, const char *file, int line); #ifdef DEBUG - #define L_ASSERT(CONDITION) ((CONDITION) ? static_cast(0) : LinphonePrivate::l_assert(#CONDITION, __FILE__, __LINE__)) + #define L_ASSERT(CONDITION) ((CONDITION) ? static_cast(0) : LinphonePrivate::lAssert(#CONDITION, __FILE__, __LINE__)) #else #define L_ASSERT(CONDITION) static_cast(false && (CONDITION)) #endif @@ -100,7 +100,9 @@ void l_assert (const char *condition, const char *file, int line); // ----------------------------------------------------------------------------- // Define an integer version like: 0xXXYYZZ, XX=MAJOR, YY=MINOR, and ZZ=PATCH. -#define L_VERSION(MAJOR, MINOR, PATCH) (((MAJOR) << 16) | ((MINOR) << 8) | (PATCH)) +constexpr unsigned int makeVersion (unsigned int major, unsigned int minor, unsigned int patch) { + return ((major << 16) | (minor << 8) | patch); +} // Not available in C++11... template diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index e048cb6c2..ee4d757bc 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -36,11 +36,6 @@ #include "main-db-key-p.h" #include "main-db-p.h" -#define DB_MODULE_VERSION_EVENTS L_VERSION(1, 0, 1) -#define DB_MODULE_VERSION_FRIENDS L_VERSION(1, 0, 0) -#define DB_MODULE_VERSION_LEGACY_FRIENDS_IMPORT L_VERSION(1, 0, 0) -#define DB_MODULE_VERSION_LEGACY_HISTORY_IMPORT L_VERSION(1, 0, 0) - // ============================================================================= // See: http://soci.sourceforge.net/doc/3.2/exchange.html @@ -52,6 +47,13 @@ using namespace std; LINPHONE_BEGIN_NAMESPACE +namespace { + constexpr unsigned int ModuleVersionEvents = makeVersion(1, 0, 1); + constexpr unsigned int ModuleVersionFriends = makeVersion(1, 0, 0); + constexpr unsigned int ModuleVersionLegacyFriendsImport = makeVersion(1, 0, 0); + constexpr unsigned int ModuleVersionLegacyHistoryImport = makeVersion(1, 0, 0); +} + // ----------------------------------------------------------------------------- MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), CoreAccessor(core) {} @@ -1160,7 +1162,7 @@ void MainDbPrivate::updateSchema () { soci::session *session = dbSession.getBackendSession(); unsigned int version = getModuleVersion("events"); - if (version < L_VERSION(1, 0, 1)) { + if (version < makeVersion(1, 0, 1)) { *session << "ALTER TABLE chat_room_participant_device ADD COLUMN state TINYINT UNSIGNED DEFAULT 0"; } } @@ -1216,9 +1218,9 @@ void MainDbPrivate::importLegacyFriends (DbSession &inDbSession) { soci::session *inSession = inDbSession.getBackendSession(); soci::transaction tr(*dbSession.getBackendSession()); - if (getModuleVersion("legacy-friends-import") >= L_VERSION(1, 0, 0)) + if (getModuleVersion("legacy-friends-import") >= makeVersion(1, 0, 0)) return; - updateModuleVersion("legacy-friends-import", DB_MODULE_VERSION_LEGACY_FRIENDS_IMPORT); + updateModuleVersion("legacy-friends-import", ModuleVersionLegacyFriendsImport); if (!checkLegacyFriendsTableExists(*inSession)) return; @@ -1311,9 +1313,9 @@ void MainDbPrivate::importLegacyHistory (DbSession &inDbSession) { soci::transaction tr(*dbSession.getBackendSession()); unsigned int version = getModuleVersion("legacy-history-import"); - if (version >= L_VERSION(1, 0, 0)) + if (version >= makeVersion(1, 0, 0)) return; - updateModuleVersion("legacy-history-import", DB_MODULE_VERSION_LEGACY_HISTORY_IMPORT); + updateModuleVersion("legacy-history-import", ModuleVersionLegacyHistoryImport); if (!checkLegacyHistoryTableExists(*inSession)) return; @@ -1786,8 +1788,8 @@ void MainDb::init () { d->updateSchema(); - d->updateModuleVersion("events", DB_MODULE_VERSION_EVENTS); - d->updateModuleVersion("friends", DB_MODULE_VERSION_FRIENDS); + d->updateModuleVersion("events", ModuleVersionEvents); + d->updateModuleVersion("friends", ModuleVersionFriends); } bool MainDb::addEvent (const shared_ptr &eventLog) { diff --git a/src/utils/general.cpp b/src/utils/general.cpp index 16a956214..73ac6f1b8 100644 --- a/src/utils/general.cpp +++ b/src/utils/general.cpp @@ -25,7 +25,7 @@ LINPHONE_BEGIN_NAMESPACE -void l_assert (const char *condition, const char *file, int line) { +void lAssert (const char *condition, const char *file, int line) { lFatal() << "ASSERT: " << condition << " in " << file << " line " << line << "."; } From 884ddffb7de2bae320099ee7a6eb490b0b2ad9f1 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 13 Feb 2018 10:46:53 +0100 Subject: [PATCH 027/281] fix(General): replace make_unique by makeUnique (avoid mistakes) --- include/linphone/utils/general.h | 2 +- src/db/session/db-session.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/linphone/utils/general.h b/include/linphone/utils/general.h index 6d393aec9..5ca37dde4 100644 --- a/include/linphone/utils/general.h +++ b/include/linphone/utils/general.h @@ -106,7 +106,7 @@ constexpr unsigned int makeVersion (unsigned int major, unsigned int minor, unsi // Not available in C++11... template -std::unique_ptr make_unique(Args && ...args) { +std::unique_ptr makeUnique(Args && ...args) { return std::unique_ptr(new T(std::forward(args)...)); } diff --git a/src/db/session/db-session.cpp b/src/db/session/db-session.cpp index 6c2fda1cc..5a38a73c3 100644 --- a/src/db/session/db-session.cpp +++ b/src/db/session/db-session.cpp @@ -34,7 +34,7 @@ DbSession::DbSession (const string &uri) : DbSession() { #ifdef SOCI_ENABLED try { L_D(); - d->backendSession = make_unique(uri); + d->backendSession = makeUnique(uri); d->backend = !uri.find("mysql") ? DbSessionPrivate::Backend::Mysql : DbSessionPrivate::Backend::Sqlite3; } catch (const exception &e) { lWarning() << "Unable to build db session with uri: " << e.what(); From 107aa11e139df6b3ab76f18930e75b9129bcbad7 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 13 Feb 2018 11:19:49 +0100 Subject: [PATCH 028/281] Added methods to get only a list of ChatMessageEventLog from a ChatRoom --- include/linphone/api/c-chat-room.h | 17 +++++++++++++++++ src/c-wrapper/api/c-chat-room.cpp | 13 ++++++++++--- src/chat/chat-room/abstract-chat-room.h | 2 ++ src/chat/chat-room/chat-room.cpp | 8 ++++++++ src/chat/chat-room/chat-room.h | 2 ++ src/chat/chat-room/proxy-chat-room.cpp | 10 ++++++++++ src/chat/chat-room/proxy-chat-room.h | 2 ++ 7 files changed, 51 insertions(+), 3 deletions(-) diff --git a/include/linphone/api/c-chat-room.h b/include/linphone/api/c-chat-room.h index 392bce10f..b3f40bc6f 100644 --- a/include/linphone/api/c-chat-room.h +++ b/include/linphone/api/c-chat-room.h @@ -179,6 +179,23 @@ LINPHONE_PUBLIC bctbx_list_t *linphone_chat_room_get_history (LinphoneChatRoom * */ LINPHONE_PUBLIC bctbx_list_t *linphone_chat_room_get_history_range(LinphoneChatRoom *cr, int begin, int end); +/** + * Gets nb_events most recent chat message events from cr chat room, sorted from oldest to most recent. + * @param[in] cr The #LinphoneChatRoom object corresponding to the conversation for which events should be retrieved + * @param[in] nb_events Number of events to retrieve. 0 means everything. + * @return \bctbx_list{LinphoneEventLog} + */ +LINPHONE_PUBLIC bctbx_list_t *linphone_chat_room_get_history_message_events (LinphoneChatRoom *cr, int nb_events); + +/** + * Gets the partial list of chat message events in the given range, sorted from oldest to most recent. + * @param[in] cr The #LinphoneChatRoom object corresponding to the conversation for which events should be retrieved + * @param[in] begin The first event of the range to be retrieved. History most recent event has index 0. + * @param[in] end The last event of the range to be retrieved. History oldest event has index of history size - 1 + * @return \bctbx_list{LinphoneEventLog} + */ +LINPHONE_PUBLIC bctbx_list_t *linphone_chat_room_get_history_range_message_events (LinphoneChatRoom *cr, int begin, int end); + /** * Gets nb_events most recent events from cr chat room, sorted from oldest to most recent. * @param[in] cr The #LinphoneChatRoom object corresponding to the conversation for which events should be retrieved diff --git a/src/c-wrapper/api/c-chat-room.cpp b/src/c-wrapper/api/c-chat-room.cpp index 72fad5d60..99d9d2d46 100644 --- a/src/c-wrapper/api/c-chat-room.cpp +++ b/src/c-wrapper/api/c-chat-room.cpp @@ -204,9 +204,8 @@ void linphone_chat_room_delete_history (LinphoneChatRoom *cr) { bctbx_list_t *linphone_chat_room_get_history_range (LinphoneChatRoom *cr, int startm, int endm) { list> chatMessages; - for (auto &event : L_GET_CPP_PTR_FROM_C_OBJECT(cr)->getHistoryRange(startm, endm)) - if (event->getType() == LinphonePrivate::EventLog::Type::ConferenceChatMessage) - chatMessages.push_back(static_pointer_cast(event)->getChatMessage()); + for (auto &event : L_GET_CPP_PTR_FROM_C_OBJECT(cr)->getMessageHistoryRange(startm, endm)) + chatMessages.push_back(static_pointer_cast(event)->getChatMessage()); return L_GET_RESOLVED_C_LIST_FROM_CPP_LIST(chatMessages); } @@ -215,6 +214,14 @@ bctbx_list_t *linphone_chat_room_get_history (LinphoneChatRoom *cr, int nb_messa return linphone_chat_room_get_history_range(cr, 0, nb_message); } +bctbx_list_t *linphone_chat_room_get_history_range_message_events (LinphoneChatRoom *cr, int startm, int endm) { + return L_GET_RESOLVED_C_LIST_FROM_CPP_LIST(L_GET_CPP_PTR_FROM_C_OBJECT(cr)->getMessageHistoryRange(startm, endm)); +} + +bctbx_list_t *linphone_chat_room_get_history_message_events (LinphoneChatRoom *cr, int nb_events) { + return L_GET_RESOLVED_C_LIST_FROM_CPP_LIST(L_GET_CPP_PTR_FROM_C_OBJECT(cr)->getMessageHistory(nb_events)); +} + bctbx_list_t *linphone_chat_room_get_history_events (LinphoneChatRoom *cr, int nb_events) { return L_GET_RESOLVED_C_LIST_FROM_CPP_LIST(L_GET_CPP_PTR_FROM_C_OBJECT(cr)->getHistory(nb_events)); } diff --git a/src/chat/chat-room/abstract-chat-room.h b/src/chat/chat-room/abstract-chat-room.h index 46f5aec29..9662f89b9 100644 --- a/src/chat/chat-room/abstract-chat-room.h +++ b/src/chat/chat-room/abstract-chat-room.h @@ -68,6 +68,8 @@ public: virtual State getState () const = 0; virtual bool hasBeenLeft () const = 0; + virtual std::list> getMessageHistory (int nLast) const = 0; + virtual std::list> getMessageHistoryRange (int begin, int end) const = 0; virtual std::list> getHistory (int nLast) const = 0; virtual std::list> getHistoryRange (int begin, int end) const = 0; virtual int getHistorySize () const = 0; diff --git a/src/chat/chat-room/chat-room.cpp b/src/chat/chat-room/chat-room.cpp index 14e92cf85..cd7314757 100644 --- a/src/chat/chat-room/chat-room.cpp +++ b/src/chat/chat-room/chat-room.cpp @@ -321,6 +321,14 @@ ChatRoom::State ChatRoom::getState () const { // ----------------------------------------------------------------------------- +list> ChatRoom::getMessageHistory (int nLast) const { + return getCore()->getPrivate()->mainDb->getHistory(getChatRoomId(), nLast, MainDb::Filter::ConferenceChatMessageFilter); +} + +list> ChatRoom::getMessageHistoryRange (int begin, int end) const { + return getCore()->getPrivate()->mainDb->getHistoryRange(getChatRoomId(), begin, end, MainDb::Filter::ConferenceChatMessageFilter); +} + list> ChatRoom::getHistory (int nLast) const { return getCore()->getPrivate()->mainDb->getHistory(getChatRoomId(), nLast); } diff --git a/src/chat/chat-room/chat-room.h b/src/chat/chat-room/chat-room.h index 35d887e59..e5a270a97 100644 --- a/src/chat/chat-room/chat-room.h +++ b/src/chat/chat-room/chat-room.h @@ -42,6 +42,8 @@ public: State getState () const override; + std::list> getMessageHistory (int nLast) const override; + std::list> getMessageHistoryRange (int begin, int end) const override; std::list> getHistory (int nLast) const override; std::list> getHistoryRange (int begin, int end) const override; int getHistorySize () const override; diff --git a/src/chat/chat-room/proxy-chat-room.cpp b/src/chat/chat-room/proxy-chat-room.cpp index bf984d2a1..547317551 100644 --- a/src/chat/chat-room/proxy-chat-room.cpp +++ b/src/chat/chat-room/proxy-chat-room.cpp @@ -195,6 +195,16 @@ bool ProxyChatRoom::hasBeenLeft () const { // ----------------------------------------------------------------------------- +list> ProxyChatRoom::getMessageHistory (int nLast) const { + L_D(); + return d->chatRoom->getMessageHistory(nLast); +} + +list> ProxyChatRoom::getMessageHistoryRange (int begin, int end) const { + L_D(); + return d->chatRoom->getMessageHistoryRange(begin, end); +} + list> ProxyChatRoom::getHistory (int nLast) const { L_D(); return d->chatRoom->getHistory(nLast); diff --git a/src/chat/chat-room/proxy-chat-room.h b/src/chat/chat-room/proxy-chat-room.h index 16a5c49aa..4f162e8ad 100644 --- a/src/chat/chat-room/proxy-chat-room.h +++ b/src/chat/chat-room/proxy-chat-room.h @@ -43,6 +43,8 @@ public: State getState () const override; bool hasBeenLeft () const override; + std::list> getMessageHistory (int nLast) const override; + std::list> getMessageHistoryRange (int begin, int end) const override; std::list> getHistory (int nLast) const override; std::list> getHistoryRange (int begin, int end) const override; int getHistorySize () const override; From a5e684ef91b7a2eb6c113f19fa171e239f262f1a Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 13 Feb 2018 10:53:13 +0100 Subject: [PATCH 029/281] fix(General): remove L_RESOLVE_OVERLOAD macro, provide a resolveOverload function instead --- include/linphone/utils/general.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/include/linphone/utils/general.h b/include/linphone/utils/general.h index 5ca37dde4..5b2260446 100644 --- a/include/linphone/utils/general.h +++ b/include/linphone/utils/general.h @@ -275,7 +275,8 @@ namespace Private { } // Useful to select a specific overloaded function. (Avoid usage of static_cast.) -#define L_RESOLVE_OVERLOAD(ARGS) LinphonePrivate::Private::ResolveOverload +template +using resolveOverload = Private::ResolveOverload; // ----------------------------------------------------------------------------- // Wrapper public. From c8648d0f794a5ddc98782e48b922d8d8d5414d54 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 13 Feb 2018 12:08:04 +0100 Subject: [PATCH 030/281] fix(General): remove macros when possible and clean code --- include/linphone/utils/general.h | 130 +++++++++++++++++-------------- 1 file changed, 70 insertions(+), 60 deletions(-) diff --git a/include/linphone/utils/general.h b/include/linphone/utils/general.h index 5b2260446..5a4c3b15f 100644 --- a/include/linphone/utils/general.h +++ b/include/linphone/utils/general.h @@ -27,6 +27,10 @@ // ============================================================================= +// ----------------------------------------------------------------------------- +// Namespace. +// ----------------------------------------------------------------------------- + #ifdef __cplusplus #define LINPHONE_BEGIN_NAMESPACE namespace LinphonePrivate { #define LINPHONE_END_NAMESPACE } @@ -111,7 +115,15 @@ std::unique_ptr makeUnique(Args && ...args) { } // ----------------------------------------------------------------------------- -// Data access. +// Class tools. +// ----------------------------------------------------------------------------- + +#define L_DISABLE_COPY(CLASS) \ + CLASS (const CLASS &) = delete; \ + CLASS &operator= (const CLASS &) = delete; + +// ----------------------------------------------------------------------------- +// PImpl tools. // ----------------------------------------------------------------------------- class BaseObject; @@ -121,34 +133,68 @@ class ClonableObjectPrivate; class Object; class ObjectPrivate; +namespace Private { + template + using BetterPrivateAncestor = typename std::conditional< + std::is_base_of::value, + BaseObject, + typename std::conditional< + std::is_base_of::value, + ClonableObject, + T + >::type + >::type; + + // Generic public helper. + template< + typename R, + typename P, + typename C + > + constexpr R *getPublicHelper (P *object, const C *) { + return static_cast(object); + } + + // Generic public helper. Deal with shared data. + template< + typename R, + typename P, + typename C + > + inline R *getPublicHelper (const P &objectSet, const C *) { + auto it = objectSet.cbegin(); + L_ASSERT(it != objectSet.cend()); + return static_cast(*it); + } + + template + struct AddConstMirror { + typedef U type; + }; + + template + struct AddConstMirror { + typedef typename std::add_const::type type; + }; +} + #define L_INTERNAL_CHECK_OBJECT_INHERITANCE(CLASS) \ static_assert( \ !(std::is_base_of::value && std::is_base_of::value), \ "Multiple inheritance between BaseObject and ClonableObject is not allowed." \ ); -#define L_INTERNAL_GET_BETTER_PRIVATE_ANCESTOR(CLASS) \ - std::conditional< \ - std::is_base_of::value, \ - BaseObject, \ - std::conditional< \ - std::is_base_of::value, \ - ClonableObject, \ - CLASS \ - >::type \ - >::type - #define L_INTERNAL_DECLARE_PRIVATE(CLASS) \ inline CLASS ## Private *getPrivate () { \ L_INTERNAL_CHECK_OBJECT_INHERITANCE(CLASS); \ return reinterpret_cast( \ - L_INTERNAL_GET_BETTER_PRIVATE_ANCESTOR(CLASS)::mPrivate \ + LinphonePrivate::Private::BetterPrivateAncestor::mPrivate \ ); \ } \ inline const CLASS ## Private *getPrivate () const { \ L_INTERNAL_CHECK_OBJECT_INHERITANCE(CLASS); \ return reinterpret_cast( \ - L_INTERNAL_GET_BETTER_PRIVATE_ANCESTOR(CLASS)::mPrivate \ + LinphonePrivate::Private::BetterPrivateAncestor::mPrivate \ ); \ } \ friend class CLASS ## Private; \ @@ -164,61 +210,25 @@ class ObjectPrivate; friend class Tester; #endif -// Generic public helper. -template< - typename R, - typename P, - typename C -> -constexpr R *getPublicHelper (P *object, const C *) { - return static_cast(object); -} - -// Generic public helper. Deal with shared data. -template< - typename R, - typename P, - typename C -> -inline R *getPublicHelper (const P &objectSet, const C *) { - auto it = objectSet.cbegin(); - L_ASSERT(it != objectSet.cend()); - return static_cast(*it); -} - #define L_DECLARE_PUBLIC(CLASS) \ - inline CLASS *getPublic () { \ - return getPublicHelper(mPublic, this); \ + CLASS *getPublic () { \ + return LinphonePrivate::Private::getPublicHelper(mPublic, this); \ } \ - inline const CLASS *getPublic () const { \ - return getPublicHelper(mPublic, this); \ + const CLASS *getPublic () const { \ + return LinphonePrivate::Private::getPublicHelper(mPublic, this); \ } \ friend class CLASS; -#define L_DISABLE_COPY(CLASS) \ - CLASS (const CLASS &) = delete; \ - CLASS &operator= (const CLASS &) = delete; - // Get Private data. #define L_D() decltype(getPrivate()) const d = getPrivate(); // Get Public data. #define L_Q() decltype(getPublic()) const q = getPublic(); -template -struct AddConstMirror { - typedef U type; -}; - -template -struct AddConstMirror { - typedef typename std::add_const::type type; -}; - // Get Private data of class in a multiple inheritance case. #define L_D_T(CLASS, NAME) \ auto const NAME = static_cast< \ - AddConstMirror< \ + LinphonePrivate::Private::AddConstMirror< \ std::remove_reference::type, \ CLASS ## Private \ >::type * \ @@ -227,12 +237,16 @@ struct AddConstMirror { // Get Private data of class in a multiple inheritance case. #define L_Q_T(CLASS, NAME) \ auto const NAME = static_cast< \ - AddConstMirror< \ + LinphonePrivate::Private::AddConstMirror< \ std::remove_reference::type, \ CLASS \ >::type * \ >(getPublic()); +// ----------------------------------------------------------------------------- +// Overload. +// ----------------------------------------------------------------------------- + #define L_OVERRIDE_SHARED_FROM_THIS(CLASS) \ inline std::shared_ptr getSharedFromThis () { \ return std::static_pointer_cast(Object::getSharedFromThis()); \ @@ -241,10 +255,6 @@ struct AddConstMirror { return std::static_pointer_cast(Object::getSharedFromThis()); \ } -// ----------------------------------------------------------------------------- -// Overload. -// ----------------------------------------------------------------------------- - namespace Private { template struct ResolveMemberFunctionOverload { From cbb14ad1cff58569597cf5ec86fcc344881af831 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 13 Feb 2018 13:56:49 +0100 Subject: [PATCH 031/281] feat(MainDb): attach resolveId to DbSession --- src/db/main-db-p.h | 6 ------ src/db/main-db.cpp | 27 ++++++++------------------- src/db/main-db.h | 5 ++++- src/db/session/db-session.cpp | 33 ++++++++++++++++++++++++++++----- src/db/session/db-session.h | 13 ++++++++++--- 5 files changed, 50 insertions(+), 34 deletions(-) diff --git a/src/db/main-db-p.h b/src/db/main-db-p.h index 3223aa00e..5d4dd4e57 100644 --- a/src/db/main-db-p.h +++ b/src/db/main-db-p.h @@ -42,12 +42,6 @@ public: mutable std::unordered_map> storageIdToChatMessage; private: - // --------------------------------------------------------------------------- - // SOCI helpers. - // --------------------------------------------------------------------------- - - long long resolveId (const soci::row &row, int col) const; - // --------------------------------------------------------------------------- // Low level API. // --------------------------------------------------------------------------- diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index ee4d757bc..03746a0f4 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -258,17 +258,6 @@ static constexpr string &blobToString (string &in) { // ----------------------------------------------------------------------------- -long long MainDbPrivate::resolveId (const soci::row &row, int col) const { - L_Q(); - // See: http://soci.sourceforge.net/doc/master/backends/ - // `row id` is not supported by soci on Sqlite3. It's necessary to cast id to int... - return q->getBackend() == AbstractDb::Sqlite3 - ? static_cast(row.get(0)) - : static_cast(row.get(0)); -} - -// ----------------------------------------------------------------------------- - long long MainDbPrivate::insertSipAddress (const string &sipAddress) { soci::session *session = dbSession.getBackendSession(); @@ -698,7 +687,7 @@ shared_ptr MainDbPrivate::selectConferenceChatMessageEvent ( soci::rowset rows = (session->prepare << query, soci::use(eventId)); for (const auto &row : rows) { ContentType contentType(row.get(2)); - const long long &contentId = resolveId(row, 0); + const long long &contentId = dbSession.resolveId(row, 0); Content *content; if (contentType == ContentType::FileTransfer) { @@ -1121,7 +1110,7 @@ void MainDbPrivate::invalidConferenceEventsFromQuery (const string &query, long soci::session *session = dbSession.getBackendSession(); soci::rowset rows = (session->prepare << query, soci::use(chatRoomId)); for (const auto &row : rows) { - long long eventId = resolveId(row, 0); + long long eventId = dbSession.resolveId(row, 0); shared_ptr eventLog = getEventFromCache(eventId); if (eventLog) { const EventLogPrivate *dEventLog = eventLog->getPrivate(); @@ -2015,7 +2004,7 @@ list> MainDb::getConferenceNotifiedEvents ( list> events; soci::rowset rows = (session->prepare << query, soci::use(dbChatRoomId), soci::use(lastNotifyId)); for (const auto &row : rows) { - long long eventId = d->resolveId(row, 0); + long long eventId = d->dbSession.resolveId(row, 0); shared_ptr eventLog = d->getEventFromCache(eventId); events.push_back(eventLog ? eventLog : d->selectGenericConferenceEvent( @@ -2161,7 +2150,7 @@ list> MainDb::getUnreadChatMessages (const ChatRoomId &c : (session->prepare << query); for (const auto &row : rows) { - long long eventId = d->resolveId(row, 0); + long long eventId = d->dbSession.resolveId(row, 0); shared_ptr event = d->getEventFromCache(eventId); if (!event) @@ -2215,7 +2204,7 @@ list> MainDb::findChatMessages ( const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId); soci::rowset rows = (session->prepare << query, soci::use(imdnMessageId), soci::use(dbChatRoomId)); for (const auto &row : rows) { - long long eventId = d->resolveId(row, 0); + long long eventId = d->dbSession.resolveId(row, 0); shared_ptr event = d->getEventFromCache(eventId); if (!event) @@ -2290,7 +2279,7 @@ list> MainDb::getHistoryRange ( const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId); soci::rowset rows = (session->prepare << query, soci::use(dbChatRoomId)); for (const auto &row : rows) { - long long eventId = d->resolveId(row, 0); + long long eventId = d->dbSession.resolveId(row, 0); shared_ptr event = d->getEventFromCache(eventId); if (!event) @@ -2405,7 +2394,7 @@ list> MainDb::getChatRooms () const { } else if (capabilities & ChatRoom::CapabilitiesMask(ChatRoom::Capabilities::Conference)) { list> participants; - const long long &dbChatRoomId = d->resolveId(row, 0); + const long long &dbChatRoomId = d->dbSession.resolveId(row, 0); static const string query = "SELECT chat_room_participant.id, sip_address.value, is_admin" " FROM sip_address, chat_room, chat_room_participant" " WHERE chat_room.id = :chatRoomId" @@ -2422,7 +2411,7 @@ list> MainDb::getChatRooms () const { // Fetch devices. { - const long long &participantId = d->resolveId(row, 0); + const long long &participantId = d->dbSession.resolveId(row, 0); static const string query = "SELECT sip_address.value, state FROM chat_room_participant_device, sip_address" " WHERE chat_room_participant_id = :participantId" " AND participant_device_sip_address_id = sip_address.id"; diff --git a/src/db/main-db.h b/src/db/main-db.h index 53b9c71be..c22041597 100644 --- a/src/db/main-db.h +++ b/src/db/main-db.h @@ -136,7 +136,10 @@ public: ) const; void insertOneToOneConferenceChatRoom (const std::shared_ptr &chatRoom); - void updateChatRoomParticipantDevice (const std::shared_ptr &chatRoom, const std::shared_ptr &device); + void updateChatRoomParticipantDevice ( + const std::shared_ptr &chatRoom, + const std::shared_ptr &device + ); // --------------------------------------------------------------------------- // Other. diff --git a/src/db/session/db-session.cpp b/src/db/session/db-session.cpp index 5a38a73c3..7e4f141d1 100644 --- a/src/db/session/db-session.cpp +++ b/src/db/session/db-session.cpp @@ -51,12 +51,14 @@ DbSession::operator bool () const { L_USE_DEFAULT_CLONABLE_OBJECT_SHARED_IMPL(DbSession); -#ifdef SOCI_ENABLED - soci::session *DbSession::getBackendSession () const { +soci::session *DbSession::getBackendSession () const { + #ifdef SOCI_ENABLED L_D(); return d->backendSession.get(); - } -#endif // ifdef SOCI_ENABLED + #else + return nullptr; + #endif // ifdef SOCI_ENABLED +} string DbSession::primaryKeyStr (const string &type) const { L_D(); @@ -195,10 +197,31 @@ bool DbSession::checkTableExists (const string &table) const { return false; } L_ASSERT(false); + #else + (void)table; #endif // ifdef SOCI_ENABLED - (void)table; return false; } +long long DbSession::resolveId (const soci::row &row, int col) const { + #ifdef SOCI_ENABLED + L_D(); + switch (d->backend) { + case DbSessionPrivate::Backend::Mysql: + return static_cast(row.get(0)); + case DbSessionPrivate::Backend::Sqlite3: + return static_cast(row.get(0)); + case DbSessionPrivate::Backend::None: + return 0; + } + L_ASSERT(false); + #else + (void)row; + (void)col; + #endif // ifdef SOCI_ENABLED + + return 0; +} + LINPHONE_END_NAMESPACE diff --git a/src/db/session/db-session.h b/src/db/session/db-session.h index 2acfdfc73..1b27635f6 100644 --- a/src/db/session/db-session.h +++ b/src/db/session/db-session.h @@ -28,6 +28,13 @@ // ============================================================================= +#ifndef SOCI_ENABLED + namespace soci { + class row; + class session; + } +#endif // ifndef SOCI_ENABLED + LINPHONE_BEGIN_NAMESPACE class DbSessionPrivate; @@ -44,9 +51,7 @@ public: operator bool () const; - #ifdef SOCI_ENABLED - soci::session *getBackendSession () const; - #endif // ifdef SOCI_ENABLED + soci::session *getBackendSession () const; std::string primaryKeyStr (const std::string &type = "INT") const; std::string primaryKeyRefStr (const std::string &type = "INT") const; @@ -62,6 +67,8 @@ public: bool checkTableExists (const std::string &table) const; + long long resolveId (const soci::row &row, int col) const; + private: L_DECLARE_PRIVATE(DbSession); }; From 21e426b98d5c4282cd1f0cdae55bda3a625711ce Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 13 Feb 2018 14:07:50 +0100 Subject: [PATCH 032/281] fix(MainDb): use constexpr instead of define --- src/db/main-db.cpp | 107 ++++++++++++++++++++++----------------------- 1 file changed, 53 insertions(+), 54 deletions(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 03746a0f4..00558fb4d 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -52,6 +52,34 @@ namespace { constexpr unsigned int ModuleVersionFriends = makeVersion(1, 0, 0); constexpr unsigned int ModuleVersionLegacyFriendsImport = makeVersion(1, 0, 0); constexpr unsigned int ModuleVersionLegacyHistoryImport = makeVersion(1, 0, 0); + + constexpr int LegacyFriendListColId = 0; + constexpr int LegacyFriendListColName = 1; + constexpr int LegacyFriendListColRlsUri = 2; + constexpr int LegacyFriendListColSyncUri = 3; + constexpr int LegacyFriendListColRevision = 4; + + constexpr int LegacyFriendColFriendListId = 1; + constexpr int LegacyFriendColSipAddress = 2; + constexpr int LegacyFriendColSubscribePolicy = 3; + constexpr int LegacyFriendColSendSubscribe = 4; + constexpr int LegacyFriendColRefKey = 5; + constexpr int LegacyFriendColVCard = 6; + constexpr int LegacyFriendColVCardEtag = 7; + constexpr int LegacyFriendColVCardSyncUri = 8; + constexpr int LegacyFriendColPresenceReceived = 9; + + constexpr int LegacyMessageColLocalAddress = 1; + constexpr int LegacyMessageColRemoteAddress = 2; + constexpr int LegacyMessageColDirection = 3; + constexpr int LegacyMessageColText = 4; + constexpr int LegacyMessageColState = 7; + constexpr int LegacyMessageColUrl = 8; + constexpr int LegacyMessageColDate = 9; + constexpr int LegacyMessageColAppData = 10; + constexpr int LegacyMessageColContentId = 11; + constexpr int LegacyMessageColContentType = 13; + constexpr int LegacyMessageColIsSecured = 14; } // ----------------------------------------------------------------------------- @@ -1187,22 +1215,6 @@ static T getValueFromRow (const soci::row &row, int index, bool &isNull) { // ----------------------------------------------------------------------------- -#define LEGACY_FRIEND_LIST_COL_ID 0 -#define LEGACY_FRIEND_LIST_COL_NAME 1 -#define LEGACY_FRIEND_LIST_COL_RLS_URI 2 -#define LEGACY_FRIEND_LIST_COL_SYNC_URI 3 -#define LEGACY_FRIEND_LIST_COL_REVISION 4 - -#define LEGACY_FRIEND_COL_FRIEND_LIST_ID 1 -#define LEGACY_FRIEND_COL_SIP_ADDRESS 2 -#define LEGACY_FRIEND_COL_SUBSCRIBE_POLICY 3 -#define LEGACY_FRIEND_COL_SEND_SUBSCRIBE 4 -#define LEGACY_FRIEND_COL_REF_KEY 5 -#define LEGACY_FRIEND_COL_V_CARD 6 -#define LEGACY_FRIEND_COL_V_CARD_ETAG 7 -#define LEGACY_FRIEND_COL_V_CARD_SYNC_URI 8 -#define LEGACY_FRIEND_COL_PRESENCE_RECEIVED 9 - void MainDbPrivate::importLegacyFriends (DbSession &inDbSession) { soci::session *inSession = inDbSession.getBackendSession(); soci::transaction tr(*dbSession.getBackendSession()); @@ -1221,10 +1233,10 @@ void MainDbPrivate::importLegacyFriends (DbSession &inDbSession) { try { set names; for (const auto &friendList : friendsLists) { - const string &name = friendList.get(LEGACY_FRIEND_LIST_COL_NAME, ""); - const string &rlsUri = friendList.get(LEGACY_FRIEND_LIST_COL_RLS_URI, ""); - const string &syncUri = friendList.get(LEGACY_FRIEND_LIST_COL_SYNC_URI, ""); - const int &revision = friendList.get(LEGACY_FRIEND_LIST_COL_REVISION, 0); + const string &name = friendList.get(LegacyFriendListColName, ""); + const string &rlsUri = friendList.get(LegacyFriendListColRlsUri, ""); + const string &syncUri = friendList.get(LegacyFriendListColSyncUri, ""); + const int &revision = friendList.get(LegacyFriendListColRevision, 0); string uniqueName = name; for (int id = 0; names.find(uniqueName) != names.end(); uniqueName = name + "-" + Utils::toString(id++)); @@ -1233,7 +1245,7 @@ void MainDbPrivate::importLegacyFriends (DbSession &inDbSession) { *session << "INSERT INTO friends_list (name, rls_uri, sync_uri, revision) VALUES (" " :name, :rlsUri, :syncUri, :revision" ")", soci::use(uniqueName), soci::use(rlsUri), soci::use(syncUri), soci::use(revision); - resolvedListsIds[friendList.get(LEGACY_FRIEND_LIST_COL_ID)] = dbSession.getLastInsertId(); + resolvedListsIds[friendList.get(LegacyFriendListColId)] = dbSession.getLastInsertId(); } } catch (const exception &e) { lWarning() << "Failed to import legacy friends list: " << e.what() << "."; @@ -1245,19 +1257,19 @@ void MainDbPrivate::importLegacyFriends (DbSession &inDbSession) { for (const auto &friendInfo : friends) { long long friendsListId; { - auto it = resolvedListsIds.find(friendInfo.get(LEGACY_FRIEND_COL_FRIEND_LIST_ID, -1)); + auto it = resolvedListsIds.find(friendInfo.get(LegacyFriendColFriendListId, -1)); if (it == resolvedListsIds.end()) continue; friendsListId = it->second; } - const long long &sipAddressId = insertSipAddress(friendInfo.get(LEGACY_FRIEND_COL_SIP_ADDRESS, "")); - const int &subscribePolicy = friendInfo.get(LEGACY_FRIEND_COL_SUBSCRIBE_POLICY, LinphoneSPAccept); - const int &sendSubscribe = friendInfo.get(LEGACY_FRIEND_COL_SEND_SUBSCRIBE, 1); - const string &vCard = friendInfo.get(LEGACY_FRIEND_COL_V_CARD, ""); - const string &vCardEtag = friendInfo.get(LEGACY_FRIEND_COL_V_CARD_ETAG, ""); - const string &vCardSyncUri = friendInfo.get(LEGACY_FRIEND_COL_V_CARD_SYNC_URI, ""); - const int &presenceReveived = friendInfo.get(LEGACY_FRIEND_COL_PRESENCE_RECEIVED, 0); + const long long &sipAddressId = insertSipAddress(friendInfo.get(LegacyFriendColSipAddress, "")); + const int &subscribePolicy = friendInfo.get(LegacyFriendColSubscribePolicy, LinphoneSPAccept); + const int &sendSubscribe = friendInfo.get(LegacyFriendColSendSubscribe, 1); + const string &vCard = friendInfo.get(LegacyFriendColVCard, ""); + const string &vCardEtag = friendInfo.get(LegacyFriendColVCardEtag, ""); + const string &vCardSyncUri = friendInfo.get(LegacyFriendColVCardSyncUri, ""); + const int &presenceReveived = friendInfo.get(LegacyFriendColPresenceReceived, 0); *session << "INSERT INTO friend (" " sip_address_id, friends_list_id, subscribe_policy, send_subscribe," @@ -1269,7 +1281,7 @@ void MainDbPrivate::importLegacyFriends (DbSession &inDbSession) { soci::use(presenceReveived), soci::use(vCard), soci::use(vCardEtag), soci::use(vCardSyncUri); bool isNull; - const string &data = getValueFromRow(friendInfo, LEGACY_FRIEND_COL_REF_KEY, isNull); + const string &data = getValueFromRow(friendInfo, LegacyFriendColRefKey, isNull); if (!isNull) *session << "INSERT INTO friend_app_data (friend_id, name, data) VALUES" " (:friendId, 'legacy', :data)", @@ -1284,19 +1296,6 @@ void MainDbPrivate::importLegacyFriends (DbSession &inDbSession) { lInfo() << "Successful import of legacy friends."; } -#define LEGACY_MESSAGE_COL_LOCAL_ADDRESS 1 -#define LEGACY_MESSAGE_COL_REMOTE_ADDRESS 2 -#define LEGACY_MESSAGE_COL_DIRECTION 3 -#define LEGACY_MESSAGE_COL_TEXT 4 -#define LEGACY_MESSAGE_COL_STATE 7 -#define LEGACY_MESSAGE_COL_URL 8 -#define LEGACY_MESSAGE_COL_DATE 9 -#define LEGACY_MESSAGE_COL_APP_DATA 10 -#define LEGACY_MESSAGE_COL_CONTENT_ID 11 -#define LEGACY_MESSAGE_COL_IMDN_MESSAGE_ID 12 -#define LEGACY_MESSAGE_COL_CONTENT_TYPE 13 -#define LEGACY_MESSAGE_COL_IS_SECURED 14 - void MainDbPrivate::importLegacyHistory (DbSession &inDbSession) { soci::session *inSession = inDbSession.getBackendSession(); soci::transaction tr(*dbSession.getBackendSession()); @@ -1312,27 +1311,27 @@ void MainDbPrivate::importLegacyHistory (DbSession &inDbSession) { soci::rowset messages = (inSession->prepare << "SELECT * FROM history"); try { for (const auto &message : messages) { - const int direction = message.get(LEGACY_MESSAGE_COL_DIRECTION); + const int direction = message.get(LegacyMessageColDirection); if (direction != 0 && direction != 1) { lWarning() << "Unable to import legacy message with invalid direction."; continue; } const int &state = message.get( - LEGACY_MESSAGE_COL_STATE, static_cast(ChatMessage::State::Displayed) + LegacyMessageColState, static_cast(ChatMessage::State::Displayed) ); if (state < 0 || state > static_cast(ChatMessage::State::Displayed)) { lWarning() << "Unable to import legacy message with invalid state."; continue; } - const tm &creationTime = Utils::getTimeTAsTm(message.get(LEGACY_MESSAGE_COL_DATE, 0)); + const tm &creationTime = Utils::getTimeTAsTm(message.get(LegacyMessageColDate, 0)); bool isNull; - getValueFromRow(message, LEGACY_MESSAGE_COL_URL, isNull); + getValueFromRow(message, LegacyMessageColUrl, isNull); - const int &contentId = message.get(LEGACY_MESSAGE_COL_CONTENT_ID, -1); - ContentType contentType(message.get(LEGACY_MESSAGE_COL_CONTENT_TYPE, "")); + const int &contentId = message.get(LegacyMessageColContentId, -1); + ContentType contentType(message.get(LegacyMessageColContentType, "")); if (!contentType.isValid()) contentType = contentId != -1 ? ContentType::FileTransfer @@ -1342,7 +1341,7 @@ void MainDbPrivate::importLegacyHistory (DbSession &inDbSession) { continue; } - const string &text = getValueFromRow(message, LEGACY_MESSAGE_COL_TEXT, isNull); + const string &text = getValueFromRow(message, LegacyMessageColText, isNull); Content content; content.setContentType(contentType); @@ -1358,7 +1357,7 @@ void MainDbPrivate::importLegacyHistory (DbSession &inDbSession) { continue; } - const string appData = getValueFromRow(message, LEGACY_MESSAGE_COL_APP_DATA, isNull); + const string appData = getValueFromRow(message, LegacyMessageColAppData, isNull); if (isNull) { lWarning() << "Unable to import legacy file message without app data."; continue; @@ -1373,14 +1372,14 @@ void MainDbPrivate::importLegacyHistory (DbSession &inDbSession) { soci::use(eventType), soci::use(creationTime); const long long &eventId = dbSession.getLastInsertId(); - const long long &localSipAddressId = insertSipAddress(message.get(LEGACY_MESSAGE_COL_LOCAL_ADDRESS)); - const long long &remoteSipAddressId = insertSipAddress(message.get(LEGACY_MESSAGE_COL_REMOTE_ADDRESS)); + const long long &localSipAddressId = insertSipAddress(message.get(LegacyMessageColLocalAddress)); + const long long &remoteSipAddressId = insertSipAddress(message.get(LegacyMessageColRemoteAddress)); const long long &chatRoomId = insertOrUpdateImportedBasicChatRoom( remoteSipAddressId, localSipAddressId, creationTime ); - const int &isSecured = message.get(LEGACY_MESSAGE_COL_IS_SECURED, 0); + const int &isSecured = message.get(LegacyMessageColIsSecured, 0); *session << "INSERT INTO conference_event (event_id, chat_room_id)" " VALUES (:eventId, :chatRoomId)", soci::use(eventId), soci::use(chatRoomId); From aba6043b8b90d9744ab56c7f91cd0bee25621581 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 13 Feb 2018 14:12:20 +0100 Subject: [PATCH 033/281] fix(MainDb): remove CHECK_LEGACY_TABLE_EXISTS macro --- src/db/main-db.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 00558fb4d..cbb002daf 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -1186,18 +1186,18 @@ void MainDbPrivate::updateSchema () { // ----------------------------------------------------------------------------- -#define CHECK_LEGACY_TABLE_EXISTS(SESSION, NAME) \ - do { \ - SESSION << "SELECT name FROM sqlite_master WHERE type='table' AND name='" NAME "'"; \ - return SESSION.got_data() > 0; \ - } while (false); +// NOTE: Legacy supports only sqlite. +static inline bool checkLegacyTableExists (soci::session &session, const string &name) { + session << "SELECT name FROM sqlite_master WHERE type='table' AND name = :name", soci::use(name); + return session.got_data() > 0; +} static inline bool checkLegacyFriendsTableExists (soci::session &session) { - CHECK_LEGACY_TABLE_EXISTS(session, "friends"); + return checkLegacyTableExists(session, "friends"); } static inline bool checkLegacyHistoryTableExists (soci::session &session) { - CHECK_LEGACY_TABLE_EXISTS(session, "history"); + return checkLegacyTableExists(session, "history"); } template From b885d643e46043d1870692aac636807df8823c32 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 13 Feb 2018 14:42:46 +0100 Subject: [PATCH 034/281] Prevent crash in message tester. --- tester/message_tester.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tester/message_tester.c b/tester/message_tester.c index e88cb05c5..7a7adaa1f 100644 --- a/tester/message_tester.c +++ b/tester/message_tester.c @@ -1983,7 +1983,13 @@ static void real_time_text_message_accented_chars(void) { linphone_chat_room_send_chat_message(pauline_chat_room, rtt_message); BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneMessageReceived, 1)); - BC_ASSERT_EQUAL(strcmp(linphone_chat_message_get_text(marie->stat.last_received_chat_message), "ãæçéîøùÿ"), 0, int, "%i"); + BC_ASSERT_PTR_NOT_NULL(marie->stat.last_received_chat_message); + if (marie->stat.last_received_chat_message) { + const char *text = linphone_chat_message_get_text(marie->stat.last_received_chat_message); + BC_ASSERT_PTR_NOT_NULL(text); + if (text) + BC_ASSERT_STRING_EQUAL(text, "ãæçéîøùÿ"); + } linphone_chat_message_unref(rtt_message); } end_call(marie, pauline); From 9f5a74bd4232c14d9be52dd81aea4bf4cc03402b Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 13 Feb 2018 14:46:42 +0100 Subject: [PATCH 035/281] Added linphone_chat_room_get_last_update_time method --- include/linphone/api/c-chat-room.h | 7 +++++++ src/c-wrapper/api/c-chat-room.cpp | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/include/linphone/api/c-chat-room.h b/include/linphone/api/c-chat-room.h index b3f40bc6f..8fc03d6c6 100644 --- a/include/linphone/api/c-chat-room.h +++ b/include/linphone/api/c-chat-room.h @@ -298,6 +298,13 @@ LINPHONE_PUBLIC LinphoneChatRoomState linphone_chat_room_get_state (const Linpho */ LINPHONE_PUBLIC bool_t linphone_chat_room_has_been_left (const LinphoneChatRoom *cr); +/** + * Return the last updated time for the chat room + * @param[in] cr LinphoneChatRoom object + * @return the last updated time + */ +LINPHONE_PUBLIC time_t linphone_chat_room_get_last_update_time(const LinphoneChatRoom *cr); + /** * Add a participant to a chat room. This may fail if this type of chat room does not handle participants. * Use linphone_chat_room_can_handle_participants() to know if this chat room handles participants. diff --git a/src/c-wrapper/api/c-chat-room.cpp b/src/c-wrapper/api/c-chat-room.cpp index 99d9d2d46..d0cd1c61f 100644 --- a/src/c-wrapper/api/c-chat-room.cpp +++ b/src/c-wrapper/api/c-chat-room.cpp @@ -260,6 +260,10 @@ bool_t linphone_chat_room_has_been_left (const LinphoneChatRoom *cr) { return (bool_t)L_GET_CPP_PTR_FROM_C_OBJECT(cr)->hasBeenLeft(); } +time_t linphone_chat_room_get_last_update_time(const LinphoneChatRoom *cr) { + return L_GET_CPP_PTR_FROM_C_OBJECT(cr)->getLastUpdateTime(); +} + void linphone_chat_room_add_participant (LinphoneChatRoom *cr, const LinphoneAddress *addr) { L_GET_CPP_PTR_FROM_C_OBJECT(cr)->addParticipant( LinphonePrivate::IdentityAddress(*L_GET_CPP_PTR_FROM_C_OBJECT(addr)), nullptr, false From 09bc70d1fdd287b6a5ac973ce37542aa064e943c Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 13 Feb 2018 15:53:21 +0100 Subject: [PATCH 036/281] feat(RemoteConferenceEventHandler): try to simplify code of simpleNotifyReceived (not a success...) --- src/chat/chat-room/client-group-chat-room.h | 6 +- .../remote-conference-event-handler.cpp | 264 ++++++++++-------- src/db/main-db.cpp | 1 + 3 files changed, 144 insertions(+), 127 deletions(-) diff --git a/src/chat/chat-room/client-group-chat-room.h b/src/chat/chat-room/client-group-chat-room.h index dc518e6e3..37423a6bb 100644 --- a/src/chat/chat-room/client-group-chat-room.h +++ b/src/chat/chat-room/client-group-chat-room.h @@ -56,7 +56,7 @@ public: ); std::shared_ptr getCore () const; - + void allowCpim (bool value) override; void allowMultipart (bool value) override; bool canHandleCpim () const override; @@ -100,11 +100,11 @@ private: void onConferenceTerminated (const IdentityAddress &addr) override; void onFirstNotifyReceived (const IdentityAddress &addr) override; void onParticipantAdded (const std::shared_ptr &event, bool isFullState) override; + void onParticipantDeviceAdded (const std::shared_ptr &event, bool isFullState) override; + void onParticipantDeviceRemoved (const std::shared_ptr &event, bool isFullState) override; void onParticipantRemoved (const std::shared_ptr &event, bool isFullState) override; void onParticipantSetAdmin (const std::shared_ptr &event, bool isFullState) override; void onSubjectChanged (const std::shared_ptr &event, bool isFullState) override; - void onParticipantDeviceAdded (const std::shared_ptr &event, bool isFullState) override; - void onParticipantDeviceRemoved (const std::shared_ptr &event, bool isFullState) override; L_DECLARE_PRIVATE(ClientGroupChatRoom); L_DISABLE_COPY(ClientGroupChatRoom); diff --git a/src/conference/handlers/remote-conference-event-handler.cpp b/src/conference/handlers/remote-conference-event-handler.cpp index 6df681ccf..090c81ff6 100644 --- a/src/conference/handlers/remote-conference-event-handler.cpp +++ b/src/conference/handlers/remote-conference-event-handler.cpp @@ -19,6 +19,7 @@ #include +#include "linphone/utils/algorithm.h" #include "linphone/utils/utils.h" #include "conference/remote-conference.h" @@ -45,135 +46,150 @@ using namespace Xsd::ConferenceInfo; void RemoteConferenceEventHandlerPrivate::simpleNotifyReceived (const string &xmlBody) { istringstream data(xmlBody); unique_ptr confInfo = parseConferenceInfo(data, Xsd::XmlSchema::Flags::dont_validate); - time_t tm = time(nullptr); - if (confInfo->getConferenceDescription()->getFreeText().present()) - tm = static_cast(Utils::stoll(confInfo->getConferenceDescription()->getFreeText().get())); - - bool isFullState = (confInfo->getState() == StateType::full); - - ConferenceListener *confListener = static_cast(conf); IdentityAddress entityAddress(confInfo->getEntity().c_str()); - if (entityAddress == chatRoomId.getPeerAddress()) { - if (confInfo->getVersion().present()) - lastNotify = confInfo->getVersion().get(); + if (entityAddress != chatRoomId.getPeerAddress()) + return; - if (confInfo->getConferenceDescription().present()) { - if (confInfo->getConferenceDescription().get().getSubject().present() && - !confInfo->getConferenceDescription().get().getSubject().get().empty() - ) { - confListener->onSubjectChanged( - make_shared( - tm, - chatRoomId, - lastNotify, - confInfo->getConferenceDescription().get().getSubject().get() - ), - isFullState - ); - } - if (confInfo->getConferenceDescription().get().getKeywords().present() - && !confInfo->getConferenceDescription().get().getKeywords().get().empty() - ) { - KeywordsType xmlKeywords = confInfo->getConferenceDescription().get().getKeywords().get(); - vector keywords; - for (const auto &k : xmlKeywords) - keywords.push_back(k); - confListener->onConferenceKeywordsChanged(keywords); - } - } + auto &confDescription = confInfo->getConferenceDescription(); - if (!confInfo->getUsers().present()) - return; - - for (const auto &user : confInfo->getUsers()->getUser()) { - LinphoneAddress *cAddr = linphone_core_interpret_url(conf->getCore()->getCCore(), user.getEntity()->c_str()); - char *cAddrStr = linphone_address_as_string(cAddr); - Address addr(cAddrStr); - bctbx_free(cAddrStr); - if (user.getState() == StateType::deleted) { - confListener->onParticipantRemoved( - make_shared( - EventLog::Type::ConferenceParticipantRemoved, - tm, - chatRoomId, - lastNotify, - addr - ), - isFullState - ); - } else { - if (user.getState() == StateType::full) { - confListener->onParticipantAdded( - make_shared( - EventLog::Type::ConferenceParticipantAdded, - tm, - chatRoomId, - lastNotify, - addr - ), - isFullState - ); - } - - if (user.getRoles()) { - bool isAdmin = false; - for (const auto &entry : user.getRoles()->getEntry()) { - if (entry == "admin") { - isAdmin = true; - break; - } - } - confListener->onParticipantSetAdmin( - make_shared( - isAdmin ? EventLog::Type::ConferenceParticipantSetAdmin : EventLog::Type::ConferenceParticipantUnsetAdmin, - tm, - chatRoomId, - lastNotify, - addr - ), - isFullState - ); - } - - for (const auto &endpoint : user.getEndpoint()) { - if (!endpoint.getEntity().present()) - break; - - Address gruu(endpoint.getEntity().get()); - if (endpoint.getState() == StateType::deleted) { - confListener->onParticipantDeviceRemoved( - make_shared( - EventLog::Type::ConferenceParticipantDeviceRemoved, - tm, - chatRoomId, - lastNotify, - addr, - gruu - ), - isFullState - ); - } else if (endpoint.getState() == StateType::full) { - confListener->onParticipantDeviceAdded( - make_shared( - EventLog::Type::ConferenceParticipantDeviceAdded, - tm, - chatRoomId, - lastNotify, - addr, - gruu - ), - isFullState - ); - } - } - } - linphone_address_unref(cAddr); - } - - if (isFullState) - confListener->onFirstNotifyReceived(chatRoomId.getPeerAddress()); + // 1. Compute event time. + time_t creationTime = time(nullptr); + { + auto &freeText = confDescription->getFreeText(); + if (freeText.present()) + creationTime = static_cast(Utils::stoll(freeText.get())); } + + // 2. Update last notify. + { + auto &version = confInfo->getVersion(); + if (version.present()) + lastNotify = version.get(); + } + + bool isFullState = confInfo->getState() == StateType::full; + ConferenceListener *confListener = static_cast(conf); + + // 3. Notify subject and keywords. + if (confDescription.present()) { + auto &subject = confDescription.get().getSubject(); + if (subject.present() && !subject.get().empty()) + confListener->onSubjectChanged( + make_shared( + creationTime, + chatRoomId, + lastNotify, + subject.get() + ), + isFullState + ); + + auto &keywords = confDescription.get().getKeywords(); + if (keywords.present() && !keywords.get().empty()) { + KeywordsType xmlKeywords = keywords.get(); + confListener->onConferenceKeywordsChanged( + vector(xmlKeywords.begin(), xmlKeywords.end()) + ); + } + } + + auto &users = confInfo->getUsers(); + if (!users.present()) + return; + + // 4. Notify changes on users. + for (auto &user : users->getUser()) { + LinphoneAddress *cAddr = linphone_core_interpret_url(conf->getCore()->getCCore(), user.getEntity()->c_str()); + char *cAddrStr = linphone_address_as_string(cAddr); + linphone_address_unref(cAddr); + + Address addr(cAddrStr); + bctbx_free(cAddrStr); + + StateType state = user.getState(); + + if (state == StateType::deleted) { + confListener->onParticipantRemoved( + make_shared( + EventLog::Type::ConferenceParticipantRemoved, + creationTime, + chatRoomId, + lastNotify, + addr + ), + isFullState + ); + + continue; + } + + if (state == StateType::full) + confListener->onParticipantAdded( + make_shared( + EventLog::Type::ConferenceParticipantAdded, + creationTime, + chatRoomId, + lastNotify, + addr + ), + isFullState + ); + + auto &roles = user.getRoles(); + if (roles) { + auto &entry = roles->getEntry(); + confListener->onParticipantSetAdmin( + make_shared( + find(entry, "admin") != entry.end() + ? EventLog::Type::ConferenceParticipantSetAdmin + : EventLog::Type::ConferenceParticipantUnsetAdmin, + creationTime, + chatRoomId, + lastNotify, + addr + ), + isFullState + ); + } + + for (const auto &endpoint : user.getEndpoint()) { + if (!endpoint.getEntity().present()) + break; + + Address gruu(endpoint.getEntity().get()); + StateType state = endpoint.getState(); + + if (state == StateType::deleted) { + confListener->onParticipantDeviceRemoved( + make_shared( + EventLog::Type::ConferenceParticipantDeviceRemoved, + creationTime, + chatRoomId, + lastNotify, + addr, + gruu + ), + isFullState + ); + } else if (state == StateType::full) { + confListener->onParticipantDeviceAdded( + make_shared( + EventLog::Type::ConferenceParticipantDeviceAdded, + creationTime, + chatRoomId, + lastNotify, + addr, + gruu + ), + isFullState + ); + } + } + } + + if (isFullState) + confListener->onFirstNotifyReceived(chatRoomId.getPeerAddress()); } // ----------------------------------------------------------------------------- diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index cbb002daf..92cb2d078 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -745,6 +745,7 @@ shared_ptr MainDbPrivate::selectConferenceChatMessageEvent ( content->setBody(row.get(3)); // 2.2 - Fetch contents' app data. + // TODO: Do not test backend, encapsulate!!! if (q->getBackend() == MainDb::Backend::Sqlite3) { soci::blob data(*session); fetchContentAppData(session, *content, contentId, data); From fd286647474ed9a73c66d972f7b4e10779905612 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 13 Feb 2018 16:32:42 +0100 Subject: [PATCH 037/281] feat(ChatRoom): update chat room time on events insertion --- src/chat/chat-message/chat-message.cpp | 4 +- src/chat/chat-room/abstract-chat-room-p.h | 2 + src/chat/chat-room/chat-room-p.h | 2 + src/chat/chat-room/chat-room.cpp | 7 ++++ src/chat/chat-room/client-group-chat-room.cpp | 41 +++++++++++-------- src/chat/chat-room/proxy-chat-room-p.h | 5 +++ 6 files changed, 42 insertions(+), 19 deletions(-) diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index 13045da1f..7b5b569bd 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -665,7 +665,7 @@ void ChatMessagePrivate::send () { } else { msgOp->send_message(ContentType::PlainText.asString().c_str(), internalContent.getBodyAsUtf8String().c_str()); } - + // Restore FileContents and remove FileTransferContents list::iterator it = contents.begin(); while (it != contents.end()) { @@ -712,7 +712,7 @@ void ChatMessagePrivate::storeInDb () { updateInDb(); } else { shared_ptr eventLog = make_shared(time, q->getSharedFromThis()); - q->getChatRoom()->getCore()->getPrivate()->mainDb->addEvent(eventLog); + q->getChatRoom()->getPrivate()->addEvent(eventLog); if (direction == ChatMessage::Direction::Incoming) { if (hasFileTransferContent()) { diff --git a/src/chat/chat-room/abstract-chat-room-p.h b/src/chat/chat-room/abstract-chat-room-p.h index 5577122ec..bd2ea703e 100644 --- a/src/chat/chat-room/abstract-chat-room-p.h +++ b/src/chat/chat-room/abstract-chat-room-p.h @@ -42,6 +42,8 @@ public: virtual void sendChatMessage (const std::shared_ptr &chatMessage) = 0; + virtual void addEvent (const std::shared_ptr &eventLog) = 0; + virtual void addTransientEvent (const std::shared_ptr &eventLog) = 0; virtual void removeTransientEvent (const std::shared_ptr &eventLog) = 0; diff --git a/src/chat/chat-room/chat-room-p.h b/src/chat/chat-room/chat-room-p.h index dcb22bb92..5492f9bdc 100644 --- a/src/chat/chat-room/chat-room-p.h +++ b/src/chat/chat-room/chat-room-p.h @@ -46,6 +46,8 @@ public: void sendChatMessage (const std::shared_ptr &chatMessage) override; void sendIsComposingNotification (); + void addEvent (const std::shared_ptr &eventLog) override; + void addTransientEvent (const std::shared_ptr &eventLog) override; void removeTransientEvent (const std::shared_ptr &eventLog) override; diff --git a/src/chat/chat-room/chat-room.cpp b/src/chat/chat-room/chat-room.cpp index cd7314757..257892be1 100644 --- a/src/chat/chat-room/chat-room.cpp +++ b/src/chat/chat-room/chat-room.cpp @@ -90,6 +90,13 @@ void ChatRoomPrivate::sendIsComposingNotification () { // ----------------------------------------------------------------------------- +void ChatRoomPrivate::addEvent (const shared_ptr &eventLog) { + L_Q(); + + q->getCore()->getPrivate()->mainDb->addEvent(eventLog); + setLastUpdateTime(eventLog->getCreationTime()); +} + void ChatRoomPrivate::addTransientEvent (const shared_ptr &eventLog) { auto it = find(transientEvents.begin(), transientEvents.end(), eventLog); if (it == transientEvents.end()) diff --git a/src/chat/chat-room/client-group-chat-room.cpp b/src/chat/chat-room/client-group-chat-room.cpp index a3e2847b4..7ff1e7979 100644 --- a/src/chat/chat-room/client-group-chat-room.cpp +++ b/src/chat/chat-room/client-group-chat-room.cpp @@ -20,16 +20,14 @@ #include "linphone/utils/utils.h" #include "address/address-p.h" -#include "c-wrapper/c-wrapper.h" -#include "basic-chat-room.h" #include "basic-to-client-group-chat-room.h" +#include "c-wrapper/c-wrapper.h" #include "client-group-chat-room-p.h" #include "conference/handlers/remote-conference-event-handler.h" #include "conference/participant-p.h" #include "conference/remote-conference-p.h" #include "conference/session/call-session-p.h" #include "core/core-p.h" -#include "event-log/events.h" #include "logger/logger.h" #include "sal/refer-op.h" @@ -65,12 +63,11 @@ shared_ptr ClientGroupChatRoomPrivate::createSession () { if (capabilities & ClientGroupChatRoom::Capabilities::OneToOne) csp.addCustomHeader("One-To-One-Chat-Room", "true"); - shared_ptr focus = qConference->getPrivate()->focus; - shared_ptr session = focus->getPrivate()->createSession(*q, &csp, false, callSessionListener); - const Address &myAddress = q->getMe()->getAddress(); - Address myCleanedAddress(myAddress); - myCleanedAddress.removeUriParam("gr"); // Remove gr parameter for INVITE - session->configure(LinphoneCallOutgoing, nullptr, nullptr, myCleanedAddress, focus->getPrivate()->getDevices().front()->getAddress()); + ParticipantPrivate *dFocus = qConference->getPrivate()->focus->getPrivate(); + shared_ptr session = dFocus->createSession(*q, &csp, false, callSessionListener); + Address myCleanedAddress(q->getMe()->getAddress()); + myCleanedAddress.removeUriParam("gr"); // Remove gr parameter for INVITE. + session->configure(LinphoneCallOutgoing, nullptr, nullptr, myCleanedAddress, dFocus->getDevices().front()->getAddress()); session->initiateOutgoing(); session->getPrivate()->createOp(); return session; @@ -442,7 +439,7 @@ void ClientGroupChatRoom::onConferenceTerminated (const IdentityAddress &addr) { L_D_T(RemoteConference, dConference); dConference->eventHandler->resetLastNotify(); d->setState(ChatRoom::State::Terminated); - getCore()->getPrivate()->mainDb->addEvent(make_shared( + d->addEvent(make_shared( EventLog::Type::ConferenceTerminated, time(nullptr), d->chatRoomId @@ -471,7 +468,7 @@ void ClientGroupChatRoom::onFirstNotifyReceived (const IdentityAddress &addr) { // TODO: Bug. Event is inserted many times. // Avoid this in the future. Deal with signals/slots system. #if 0 - getCore()->getPrivate()->mainDb->addEvent(make_shared( + d->addEvent(make_shared( EventLog::Type::ConferenceCreated, time(nullptr), d->chatRoomId @@ -481,6 +478,7 @@ void ClientGroupChatRoom::onFirstNotifyReceived (const IdentityAddress &addr) { } void ClientGroupChatRoom::onParticipantAdded (const shared_ptr &event, bool isFullState) { + L_D(); L_D_T(RemoteConference, dConference); const IdentityAddress &addr = event->getParticipantAddress(); @@ -499,7 +497,7 @@ void ClientGroupChatRoom::onParticipantAdded (const shared_ptrgetPrivate()->mainDb->addEvent(event); + d->addEvent(event); LinphoneChatRoom *cr = L_GET_C_BACK_PTR(this); LinphoneChatRoomCbs *cbs = linphone_chat_room_get_callbacks(cr); @@ -511,6 +509,7 @@ void ClientGroupChatRoom::onParticipantAdded (const shared_ptr &event, bool isFullState) { (void)isFullState; + L_D(); L_D_T(RemoteConference, dConference); const IdentityAddress &addr = event->getParticipantAddress(); @@ -521,7 +520,7 @@ void ClientGroupChatRoom::onParticipantRemoved (const shared_ptrparticipants.remove(participant); - getCore()->getPrivate()->mainDb->addEvent(event); + d->addEvent(event); LinphoneChatRoom *cr = L_GET_C_BACK_PTR(this); LinphoneChatRoomCbs *cbs = linphone_chat_room_get_callbacks(cr); @@ -531,6 +530,8 @@ void ClientGroupChatRoom::onParticipantRemoved (const shared_ptr &event, bool isFullState) { + L_D(); + const IdentityAddress &addr = event->getParticipantAddress(); shared_ptr participant; if (isMe(addr)) @@ -550,7 +551,7 @@ void ClientGroupChatRoom::onParticipantSetAdmin (const shared_ptrgetPrivate()->mainDb->addEvent(event); + d->addEvent(event); LinphoneChatRoom *cr = L_GET_C_BACK_PTR(this); LinphoneChatRoomCbs *cbs = linphone_chat_room_get_callbacks(cr); @@ -560,6 +561,8 @@ void ClientGroupChatRoom::onParticipantSetAdmin (const shared_ptr &event, bool isFullState) { + L_D(); + if (getSubject() == event->getSubject()) return; // No change in the local subject, do not notify RemoteConference::setSubject(event->getSubject()); @@ -567,7 +570,7 @@ void ClientGroupChatRoom::onSubjectChanged (const shared_ptrgetPrivate()->mainDb->addEvent(event); + d->addEvent(event); LinphoneChatRoom *cr = L_GET_C_BACK_PTR(this); LinphoneChatRoomCbs *cbs = linphone_chat_room_get_callbacks(cr); @@ -577,6 +580,8 @@ void ClientGroupChatRoom::onSubjectChanged (const shared_ptr &event, bool isFullState) { + L_D(); + const IdentityAddress &addr = event->getParticipantAddress(); shared_ptr participant; if (isMe(addr)) @@ -592,7 +597,7 @@ void ClientGroupChatRoom::onParticipantDeviceAdded (const shared_ptrgetPrivate()->mainDb->addEvent(event); + d->addEvent(event); LinphoneChatRoom *cr = L_GET_C_BACK_PTR(this); LinphoneChatRoomCbs *cbs = linphone_chat_room_get_callbacks(cr); @@ -602,6 +607,8 @@ void ClientGroupChatRoom::onParticipantDeviceAdded (const shared_ptr &event, bool isFullState) { + L_D(); + (void)isFullState; const IdentityAddress &addr = event->getParticipantAddress(); @@ -615,7 +622,7 @@ void ClientGroupChatRoom::onParticipantDeviceRemoved (const shared_ptrgetPrivate()->removeDevice(event->getDeviceAddress()); - getCore()->getPrivate()->mainDb->addEvent(event); + d->addEvent(event); LinphoneChatRoom *cr = L_GET_C_BACK_PTR(this); LinphoneChatRoomCbs *cbs = linphone_chat_room_get_callbacks(cr); diff --git a/src/chat/chat-room/proxy-chat-room-p.h b/src/chat/chat-room/proxy-chat-room-p.h index 9559c31c4..89fb81e21 100644 --- a/src/chat/chat-room/proxy-chat-room-p.h +++ b/src/chat/chat-room/proxy-chat-room-p.h @@ -21,6 +21,7 @@ #define _L_PROXY_CHAT_ROOM_P_H_ #include "abstract-chat-room-p.h" +#include "proxy-chat-room.h" // ============================================================================= @@ -44,6 +45,10 @@ public: chatRoom->getPrivate()->sendChatMessage(chatMessage); } + inline void addEvent (const std::shared_ptr &eventLog) override { + chatRoom->getPrivate()->addEvent(eventLog); + } + inline void addTransientEvent (const std::shared_ptr &eventLog) override { chatRoom->getPrivate()->addTransientEvent(eventLog); } From 6f8e2f5c2b409bdf49df3d7d1cf17b57898383b8 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 13 Feb 2018 17:58:57 +0100 Subject: [PATCH 038/281] Remove const in CallSessionListener methods to allow the session to be modified. --- src/call/call-p.h | 76 ++++++++--------- src/call/call.cpp | 82 +++++++++---------- .../basic-to-client-group-chat-room.cpp | 2 +- src/chat/chat-room/client-group-chat-room-p.h | 4 +- src/chat/chat-room/client-group-chat-room.cpp | 4 +- .../client-group-to-basic-chat-room.cpp | 6 +- src/chat/chat-room/server-group-chat-room-p.h | 3 +- .../chat-room/server-group-chat-room-stub.cpp | 4 +- .../session/call-session-listener.h | 76 ++++++++--------- src/conference/session/call-session-p.h | 2 +- src/conference/session/call-session.cpp | 2 +- src/conference/session/call-session.h | 2 +- src/conference/session/media-session-p.h | 2 +- src/conference/session/media-session.cpp | 2 +- 14 files changed, 135 insertions(+), 132 deletions(-) diff --git a/src/call/call-p.h b/src/call/call-p.h index 09f796d4c..0c6f9ae65 100644 --- a/src/call/call-p.h +++ b/src/call/call-p.h @@ -74,44 +74,44 @@ private: void terminateBecauseOfLostMedia (); /* CallSessionListener */ - void onAckBeingSent (const std::shared_ptr &session, LinphoneHeaders *headers) override; - void onAckReceived (const std::shared_ptr &session, LinphoneHeaders *headers) override; - void onBackgroundTaskToBeStarted (const std::shared_ptr &session) override; - void onBackgroundTaskToBeStopped (const std::shared_ptr &session) override; - bool onCallSessionAccepted (const std::shared_ptr &session) override; - void onCallSessionConferenceStreamStarting (const std::shared_ptr &session, bool mute) override; - void onCallSessionConferenceStreamStopping (const std::shared_ptr &session) override; - void onCallSessionEarlyFailed (const std::shared_ptr &session, LinphoneErrorInfo *ei) override; - void onCallSessionSetReleased (const std::shared_ptr &session) override; - void onCallSessionSetTerminated (const std::shared_ptr &session) override; - void onCallSessionStartReferred (const std::shared_ptr &session) override; - void onCallSessionStateChanged (const std::shared_ptr &session, CallSession::State state, const std::string &message) override; - void onCallSessionTransferStateChanged (const std::shared_ptr &session, CallSession::State state) override; - void onCheckForAcceptation (const std::shared_ptr &session) override; - void onDtmfReceived (const std::shared_ptr &session, char dtmf) override; - void onIncomingCallSessionNotified (const std::shared_ptr &session) override; - void onIncomingCallSessionStarted (const std::shared_ptr &session) override; - void onIncomingCallSessionTimeoutCheck (const std::shared_ptr &session, int elapsed, bool oneSecondElapsed) override; - void onInfoReceived (const std::shared_ptr &session, const LinphoneInfoMessage *im) override; - void onNoMediaTimeoutCheck (const std::shared_ptr &session, bool oneSecondElapsed) override; - void onEncryptionChanged (const std::shared_ptr &session, bool activated, const std::string &authToken) override; - void onCallSessionStateChangedForReporting (const std::shared_ptr &session) override; - void onRtcpUpdateForReporting (const std::shared_ptr &session, SalStreamType type) override; - void onStatsUpdated (const std::shared_ptr &session, const LinphoneCallStats *stats) override; - void onUpdateMediaInfoForReporting (const std::shared_ptr &session, int statsType) override; - void onResetCurrentSession (const std::shared_ptr &session) override; - void onSetCurrentSession (const std::shared_ptr &session) override; - void onFirstVideoFrameDecoded (const std::shared_ptr &session) override; - void onResetFirstVideoFrameDecoded (const std::shared_ptr &session) override; - void onPlayErrorTone (const std::shared_ptr &session, LinphoneReason reason) override; - void onRingbackToneRequested (const std::shared_ptr &session, bool requested) override; - void onStartRinging (const std::shared_ptr &session) override; - void onStopRinging (const std::shared_ptr &session) override; - void onStopRingingIfInCall (const std::shared_ptr &session) override; - void onStopRingingIfNeeded (const std::shared_ptr &session) override; - bool areSoundResourcesAvailable (const std::shared_ptr &session) override; - bool isPlayingRingbackTone (const std::shared_ptr &session) override; - void onRealTimeTextCharacterReceived (const std::shared_ptr &session, RealtimeTextReceivedCharacter *character) override; + void onAckBeingSent (const std::shared_ptr &session, LinphoneHeaders *headers) override; + void onAckReceived (const std::shared_ptr &session, LinphoneHeaders *headers) override; + void onBackgroundTaskToBeStarted (const std::shared_ptr &session) override; + void onBackgroundTaskToBeStopped (const std::shared_ptr &session) override; + bool onCallSessionAccepted (const std::shared_ptr &session) override; + void onCallSessionConferenceStreamStarting (const std::shared_ptr &session, bool mute) override; + void onCallSessionConferenceStreamStopping (const std::shared_ptr &session) override; + void onCallSessionEarlyFailed (const std::shared_ptr &session, LinphoneErrorInfo *ei) override; + void onCallSessionSetReleased (const std::shared_ptr &session) override; + void onCallSessionSetTerminated (const std::shared_ptr &session) override; + void onCallSessionStartReferred (const std::shared_ptr &session) override; + void onCallSessionStateChanged (const std::shared_ptr &session, CallSession::State state, const std::string &message) override; + void onCallSessionTransferStateChanged (const std::shared_ptr &session, CallSession::State state) override; + void onCheckForAcceptation (const std::shared_ptr &session) override; + void onDtmfReceived (const std::shared_ptr &session, char dtmf) override; + void onIncomingCallSessionNotified (const std::shared_ptr &session) override; + void onIncomingCallSessionStarted (const std::shared_ptr &session) override; + void onIncomingCallSessionTimeoutCheck (const std::shared_ptr &session, int elapsed, bool oneSecondElapsed) override; + void onInfoReceived (const std::shared_ptr &session, const LinphoneInfoMessage *im) override; + void onNoMediaTimeoutCheck (const std::shared_ptr &session, bool oneSecondElapsed) override; + void onEncryptionChanged (const std::shared_ptr &session, bool activated, const std::string &authToken) override; + void onCallSessionStateChangedForReporting (const std::shared_ptr &session) override; + void onRtcpUpdateForReporting (const std::shared_ptr &session, SalStreamType type) override; + void onStatsUpdated (const std::shared_ptr &session, const LinphoneCallStats *stats) override; + void onUpdateMediaInfoForReporting (const std::shared_ptr &session, int statsType) override; + void onResetCurrentSession (const std::shared_ptr &session) override; + void onSetCurrentSession (const std::shared_ptr &session) override; + void onFirstVideoFrameDecoded (const std::shared_ptr &session) override; + void onResetFirstVideoFrameDecoded (const std::shared_ptr &session) override; + void onPlayErrorTone (const std::shared_ptr &session, LinphoneReason reason) override; + void onRingbackToneRequested (const std::shared_ptr &session, bool requested) override; + void onStartRinging (const std::shared_ptr &session) override; + void onStopRinging (const std::shared_ptr &session) override; + void onStopRingingIfInCall (const std::shared_ptr &session) override; + void onStopRingingIfNeeded (const std::shared_ptr &session) override; + bool areSoundResourcesAvailable (const std::shared_ptr &session) override; + bool isPlayingRingbackTone (const std::shared_ptr &session) override; + void onRealTimeTextCharacterReceived (const std::shared_ptr &session, RealtimeTextReceivedCharacter *character) override; mutable LinphonePlayer *player = nullptr; diff --git a/src/call/call.cpp b/src/call/call.cpp index 6153c3848..9cd36d9ed 100644 --- a/src/call/call.cpp +++ b/src/call/call.cpp @@ -187,25 +187,25 @@ void CallPrivate::terminateBecauseOfLostMedia () { // ----------------------------------------------------------------------------- -void CallPrivate::onAckBeingSent (const shared_ptr &session, LinphoneHeaders *headers) { +void CallPrivate::onAckBeingSent (const shared_ptr &session, LinphoneHeaders *headers) { L_Q(); linphone_call_notify_ack_processing(L_GET_C_BACK_PTR(q), headers, false); } -void CallPrivate::onAckReceived (const shared_ptr &session, LinphoneHeaders *headers) { +void CallPrivate::onAckReceived (const shared_ptr &session, LinphoneHeaders *headers) { L_Q(); linphone_call_notify_ack_processing(L_GET_C_BACK_PTR(q), headers, true); } -void CallPrivate::onBackgroundTaskToBeStarted (const shared_ptr &session) { +void CallPrivate::onBackgroundTaskToBeStarted (const shared_ptr &session) { bgTask.start(); } -void CallPrivate::onBackgroundTaskToBeStopped (const shared_ptr &session) { +void CallPrivate::onBackgroundTaskToBeStopped (const shared_ptr &session) { bgTask.stop(); } -bool CallPrivate::onCallSessionAccepted (const shared_ptr &session) { +bool CallPrivate::onCallSessionAccepted (const shared_ptr &session) { L_Q(); LinphoneCore *lc = q->getCore()->getCCore(); bool wasRinging = false; @@ -226,21 +226,21 @@ bool CallPrivate::onCallSessionAccepted (const shared_ptr &se return wasRinging; } -void CallPrivate::onCallSessionConferenceStreamStarting (const shared_ptr &session, bool mute) { +void CallPrivate::onCallSessionConferenceStreamStarting (const shared_ptr &session, bool mute) { L_Q(); if (q->getCore()->getCCore()->conf_ctx) { linphone_conference_on_call_stream_starting(q->getCore()->getCCore()->conf_ctx, L_GET_C_BACK_PTR(q), mute); } } -void CallPrivate::onCallSessionConferenceStreamStopping (const shared_ptr &session) { +void CallPrivate::onCallSessionConferenceStreamStopping (const shared_ptr &session) { L_Q(); LinphoneCore *lc = q->getCore()->getCCore(); if (lc->conf_ctx && _linphone_call_get_endpoint(L_GET_C_BACK_PTR(q))) linphone_conference_on_call_stream_stopping(lc->conf_ctx, L_GET_C_BACK_PTR(q)); } -void CallPrivate::onCallSessionEarlyFailed (const shared_ptr &session, LinphoneErrorInfo *ei) { +void CallPrivate::onCallSessionEarlyFailed (const shared_ptr &session, LinphoneErrorInfo *ei) { L_Q(); LinphoneCallLog *log = session->getLog(); linphone_core_report_early_failed_call(q->getCore()->getCCore(), @@ -251,12 +251,12 @@ void CallPrivate::onCallSessionEarlyFailed (const shared_ptr linphone_call_unref(L_GET_C_BACK_PTR(q)); } -void CallPrivate::onCallSessionSetReleased (const shared_ptr &session) { +void CallPrivate::onCallSessionSetReleased (const shared_ptr &session) { L_Q(); linphone_call_unref(L_GET_C_BACK_PTR(q)); } -void CallPrivate::onCallSessionSetTerminated (const shared_ptr &session) { +void CallPrivate::onCallSessionSetTerminated (const shared_ptr &session) { L_Q(); LinphoneCore *core = q->getCore()->getCCore(); if (q->getSharedFromThis() == q->getCore()->getCurrentCall()) { @@ -279,21 +279,21 @@ void CallPrivate::onCallSessionSetTerminated (const shared_ptrbw_controller); } -void CallPrivate::onCallSessionStartReferred (const shared_ptr &session) { +void CallPrivate::onCallSessionStartReferred (const shared_ptr &session) { startReferredCall(nullptr); } -void CallPrivate::onCallSessionStateChanged (const shared_ptr &session, CallSession::State state, const string &message) { +void CallPrivate::onCallSessionStateChanged (const shared_ptr &session, CallSession::State state, const string &message) { L_Q(); linphone_call_notify_state_changed(L_GET_C_BACK_PTR(q), static_cast(state), message.c_str()); } -void CallPrivate::onCallSessionTransferStateChanged (const shared_ptr &session, CallSession::State state) { +void CallPrivate::onCallSessionTransferStateChanged (const shared_ptr &session, CallSession::State state) { L_Q(); linphone_call_notify_transfer_state_changed(L_GET_C_BACK_PTR(q), static_cast(state)); } -void CallPrivate::onCheckForAcceptation (const shared_ptr &session) { +void CallPrivate::onCheckForAcceptation (const shared_ptr &session) { L_Q(); LinphoneCall *lcall = L_GET_C_BACK_PTR(q); bctbx_list_t *copy = bctbx_list_copy(linphone_core_get_calls(q->getCore()->getCCore())); @@ -316,23 +316,23 @@ void CallPrivate::onCheckForAcceptation (const shared_ptr &se bctbx_list_free(copy); } -void CallPrivate::onDtmfReceived (const shared_ptr &session, char dtmf) { +void CallPrivate::onDtmfReceived (const shared_ptr &session, char dtmf) { L_Q(); linphone_call_notify_dtmf_received(L_GET_C_BACK_PTR(q), dtmf); } -void CallPrivate::onIncomingCallSessionNotified (const shared_ptr &session) { +void CallPrivate::onIncomingCallSessionNotified (const shared_ptr &session) { L_Q(); /* The call is acceptable so we can now add it to our list */ q->getCore()->getPrivate()->addCall(q->getSharedFromThis()); } -void CallPrivate::onIncomingCallSessionStarted (const shared_ptr &session) { +void CallPrivate::onIncomingCallSessionStarted (const shared_ptr &session) { L_Q(); linphone_core_notify_incoming_call(q->getCore()->getCCore(), L_GET_C_BACK_PTR(q)); } -void CallPrivate::onIncomingCallSessionTimeoutCheck (const shared_ptr &session, int elapsed, bool oneSecondElapsed) { +void CallPrivate::onIncomingCallSessionTimeoutCheck (const shared_ptr &session, int elapsed, bool oneSecondElapsed) { L_Q(); if (oneSecondElapsed) lInfo() << "Incoming call ringing for " << elapsed << " seconds"; @@ -344,12 +344,12 @@ void CallPrivate::onIncomingCallSessionTimeoutCheck (const shared_ptr &session, const LinphoneInfoMessage *im) { +void CallPrivate::onInfoReceived (const shared_ptr &session, const LinphoneInfoMessage *im) { L_Q(); linphone_call_notify_info_message_received(L_GET_C_BACK_PTR(q), im); } -void CallPrivate::onNoMediaTimeoutCheck (const shared_ptr &session, bool oneSecondElapsed) { +void CallPrivate::onNoMediaTimeoutCheck (const shared_ptr &session, bool oneSecondElapsed) { L_Q(); int disconnectTimeout = linphone_core_get_nortp_timeout(q->getCore()->getCCore()); bool disconnected = false; @@ -361,42 +361,42 @@ void CallPrivate::onNoMediaTimeoutCheck (const shared_ptr &se terminateBecauseOfLostMedia(); } -void CallPrivate::onEncryptionChanged (const shared_ptr &session, bool activated, const string &authToken) { +void CallPrivate::onEncryptionChanged (const shared_ptr &session, bool activated, const string &authToken) { L_Q(); linphone_call_notify_encryption_changed(L_GET_C_BACK_PTR(q), activated, authToken.empty() ? nullptr : authToken.c_str()); } -void CallPrivate::onCallSessionStateChangedForReporting (const shared_ptr &session) { +void CallPrivate::onCallSessionStateChangedForReporting (const shared_ptr &session) { L_Q(); linphone_reporting_call_state_updated(L_GET_C_BACK_PTR(q)); } -void CallPrivate::onRtcpUpdateForReporting (const shared_ptr &session, SalStreamType type) { +void CallPrivate::onRtcpUpdateForReporting (const shared_ptr &session, SalStreamType type) { L_Q(); linphone_reporting_on_rtcp_update(L_GET_C_BACK_PTR(q), type); } -void CallPrivate::onStatsUpdated (const shared_ptr &session, const LinphoneCallStats *stats) { +void CallPrivate::onStatsUpdated (const shared_ptr &session, const LinphoneCallStats *stats) { L_Q(); linphone_call_notify_stats_updated(L_GET_C_BACK_PTR(q), stats); } -void CallPrivate::onUpdateMediaInfoForReporting (const std::shared_ptr &session, int statsType) { +void CallPrivate::onUpdateMediaInfoForReporting (const shared_ptr &session, int statsType) { L_Q(); linphone_reporting_update_media_info(L_GET_C_BACK_PTR(q), statsType); } -void CallPrivate::onResetCurrentSession (const shared_ptr &session) { +void CallPrivate::onResetCurrentSession (const shared_ptr &session) { L_Q(); q->getCore()->getPrivate()->setCurrentCall(nullptr); } -void CallPrivate::onSetCurrentSession (const shared_ptr &session) { +void CallPrivate::onSetCurrentSession (const shared_ptr &session) { L_Q(); q->getCore()->getPrivate()->setCurrentCall(q->getSharedFromThis()); } -void CallPrivate::onFirstVideoFrameDecoded (const shared_ptr &session) { +void CallPrivate::onFirstVideoFrameDecoded (const shared_ptr &session) { L_Q(); if (nextVideoFrameDecoded._func) { nextVideoFrameDecoded._func(L_GET_C_BACK_PTR(q), nextVideoFrameDecoded._user_data); @@ -405,16 +405,16 @@ void CallPrivate::onFirstVideoFrameDecoded (const shared_ptr } } -void CallPrivate::onResetFirstVideoFrameDecoded (const shared_ptr &session) { +void CallPrivate::onResetFirstVideoFrameDecoded (const shared_ptr &session) { resetFirstVideoFrameDecoded(); } -void CallPrivate::onPlayErrorTone (const shared_ptr &session, LinphoneReason reason) { +void CallPrivate::onPlayErrorTone (const shared_ptr &session, LinphoneReason reason) { L_Q(); linphone_core_play_call_error_tone(q->getCore()->getCCore(), reason); } -void CallPrivate::onRingbackToneRequested (const shared_ptr &session, bool requested) { +void CallPrivate::onRingbackToneRequested (const shared_ptr &session, bool requested) { L_Q(); if (requested && linphone_core_get_remote_ringback_tone(q->getCore()->getCCore())) playingRingbackTone = true; @@ -422,7 +422,7 @@ void CallPrivate::onRingbackToneRequested (const shared_ptr & playingRingbackTone = false; } -void CallPrivate::onStartRinging (const shared_ptr &session) { +void CallPrivate::onStartRinging (const shared_ptr &session) { L_Q(); LinphoneCore *lc = q->getCore()->getCCore(); if (lc->ringstream) @@ -430,12 +430,12 @@ void CallPrivate::onStartRinging (const shared_ptr &session) startRemoteRing(); } -void CallPrivate::onStopRinging (const shared_ptr &session) { +void CallPrivate::onStopRinging (const shared_ptr &session) { L_Q(); linphone_core_stop_ringing(q->getCore()->getCCore()); } -void CallPrivate::onStopRingingIfInCall (const shared_ptr &session) { +void CallPrivate::onStopRingingIfInCall (const shared_ptr &session) { L_Q(); LinphoneCore *lc = q->getCore()->getCCore(); // We stop the ring only if we have this current call or if we are in call @@ -444,7 +444,7 @@ void CallPrivate::onStopRingingIfInCall (const shared_ptr &se } } -void CallPrivate::onStopRingingIfNeeded (const shared_ptr &session) { +void CallPrivate::onStopRingingIfNeeded (const shared_ptr &session) { L_Q(); LinphoneCore *lc = q->getCore()->getCCore(); bool stopRinging = true; @@ -460,18 +460,18 @@ void CallPrivate::onStopRingingIfNeeded (const shared_ptr &se linphone_core_stop_ringing(lc); } -bool CallPrivate::areSoundResourcesAvailable (const shared_ptr &session) { +bool CallPrivate::areSoundResourcesAvailable (const shared_ptr &session) { L_Q(); LinphoneCore *lc = q->getCore()->getCCore(); shared_ptr currentCall = q->getCore()->getCurrentCall(); return !linphone_core_is_in_conference(lc) && (!currentCall || (currentCall == q->getSharedFromThis())); } -bool CallPrivate::isPlayingRingbackTone (const shared_ptr &session) { +bool CallPrivate::isPlayingRingbackTone (const shared_ptr &session) { return playingRingbackTone; } -void CallPrivate::onRealTimeTextCharacterReceived (const shared_ptr &session, RealtimeTextReceivedCharacter *data) { +void CallPrivate::onRealTimeTextCharacterReceived (const shared_ptr &session, RealtimeTextReceivedCharacter *data) { L_Q(); getChatRoom()->getPrivate()->realtimeTextReceived(data->character, q->getSharedFromThis()); } @@ -538,7 +538,7 @@ LinphoneStatus Call::pause () { return static_pointer_cast(d->getActiveSession())->pause(); } -LinphoneStatus Call::redirect (const std::string &redirectUri) { +LinphoneStatus Call::redirect (const string &redirectUri) { L_D(); return d->getActiveSession()->redirect(redirectUri); } @@ -553,7 +553,7 @@ LinphoneStatus Call::sendDtmf (char dtmf) { return static_pointer_cast(d->getActiveSession())->sendDtmf(dtmf); } -LinphoneStatus Call::sendDtmfs (const std::string &dtmfs) { +LinphoneStatus Call::sendDtmfs (const string &dtmfs) { L_D(); return static_pointer_cast(d->getActiveSession())->sendDtmfs(dtmfs); } @@ -840,7 +840,7 @@ const Address &Call::getToAddress () const { return d->getActiveSession()->getToAddress(); } -string Call::getToHeader (const std::string &name) const { +string Call::getToHeader (const string &name) const { L_D(); return d->getActiveSession()->getToHeader(name); } diff --git a/src/chat/chat-room/basic-to-client-group-chat-room.cpp b/src/chat/chat-room/basic-to-client-group-chat-room.cpp index 827d9b3d9..e75c56337 100644 --- a/src/chat/chat-room/basic-to-client-group-chat-room.cpp +++ b/src/chat/chat-room/basic-to-client-group-chat-room.cpp @@ -77,7 +77,7 @@ public: } void onCallSessionStateChanged ( - const shared_ptr &session, + const shared_ptr &session, CallSession::State newState, const string &message ) override { diff --git a/src/chat/chat-room/client-group-chat-room-p.h b/src/chat/chat-room/client-group-chat-room-p.h index fa51cf8a3..f75a5abac 100644 --- a/src/chat/chat-room/client-group-chat-room-p.h +++ b/src/chat/chat-room/client-group-chat-room-p.h @@ -46,8 +46,8 @@ public: void onChatRoomDeleteRequested (const std::shared_ptr &chatRoom) override; // CallSessionListener - void onCallSessionSetReleased (const std::shared_ptr &session) override; - void onCallSessionStateChanged (const std::shared_ptr &session, CallSession::State state, const std::string &message) override; + void onCallSessionSetReleased (const std::shared_ptr &session) override; + void onCallSessionStateChanged (const std::shared_ptr &session, CallSession::State state, const std::string &message) override; private: CallSessionListener *callSessionListener = this; diff --git a/src/chat/chat-room/client-group-chat-room.cpp b/src/chat/chat-room/client-group-chat-room.cpp index 7ff1e7979..36f583820 100644 --- a/src/chat/chat-room/client-group-chat-room.cpp +++ b/src/chat/chat-room/client-group-chat-room.cpp @@ -119,7 +119,7 @@ void ClientGroupChatRoomPrivate::onChatRoomDeleteRequested (const shared_ptr &session) { +void ClientGroupChatRoomPrivate::onCallSessionSetReleased (const shared_ptr &session) { L_Q_T(RemoteConference, qConference); ParticipantPrivate *participantPrivate = qConference->getPrivate()->focus->getPrivate(); @@ -128,7 +128,7 @@ void ClientGroupChatRoomPrivate::onCallSessionSetReleased (const shared_ptr &session, + const shared_ptr &session, CallSession::State newState, const string &message ) { diff --git a/src/chat/chat-room/client-group-to-basic-chat-room.cpp b/src/chat/chat-room/client-group-to-basic-chat-room.cpp index e5c31bb8c..7ca4ab61f 100644 --- a/src/chat/chat-room/client-group-to-basic-chat-room.cpp +++ b/src/chat/chat-room/client-group-to-basic-chat-room.cpp @@ -52,14 +52,14 @@ public: setState(AbstractChatRoom::State::Deleted); } - void onCallSessionSetReleased (const std::shared_ptr &session) override { + void onCallSessionSetReleased (const shared_ptr &session) override { if (!(chatRoom->getCapabilities() & ChatRoom::Capabilities::Conference)) return; static_pointer_cast(chatRoom)->getPrivate()->onCallSessionSetReleased(session); } void onCallSessionStateChanged ( - const shared_ptr &session, + const shared_ptr &session, CallSession::State newState, const string &message ) override { @@ -111,7 +111,7 @@ void ClientGroupToBasicChatRoom::addParticipant ( ProxyChatRoom::addParticipant(participantAddress, params, hasMedia); } void ClientGroupToBasicChatRoom::addParticipants ( - const std::list &addresses, + const list &addresses, const CallSessionParams *params, bool hasMedia ) { diff --git a/src/chat/chat-room/server-group-chat-room-p.h b/src/chat/chat-room/server-group-chat-room-p.h index 9d8ec8946..2780e0a08 100644 --- a/src/chat/chat-room/server-group-chat-room-p.h +++ b/src/chat/chat-room/server-group-chat-room-p.h @@ -45,6 +45,7 @@ public: ParticipantDevice::State getParticipantDeviceState (const std::shared_ptr &device) const; void setParticipantDeviceState (const std::shared_ptr &device, ParticipantDevice::State state); + void acceptSession (const std::shared_ptr &session); void confirmCreation (); void confirmJoining (SalCallOp *op); void confirmRecreation (SalCallOp *op); @@ -93,7 +94,7 @@ private: // CallSessionListener void onCallSessionStateChanged ( - const std::shared_ptr &session, + const std::shared_ptr &session, CallSession::State newState, const std::string &message ) override; diff --git a/src/chat/chat-room/server-group-chat-room-stub.cpp b/src/chat/chat-room/server-group-chat-room-stub.cpp index 23ea6d49b..57a4d2491 100644 --- a/src/chat/chat-room/server-group-chat-room-stub.cpp +++ b/src/chat/chat-room/server-group-chat-room-stub.cpp @@ -52,6 +52,8 @@ void ServerGroupChatRoomPrivate::setParticipantDeviceState (const std::shared_pt // ----------------------------------------------------------------------------- +void ServerGroupChatRoomPrivate::acceptSession (const shared_ptr &session) {} + void ServerGroupChatRoomPrivate::confirmCreation () {} void ServerGroupChatRoomPrivate::confirmJoining (SalCallOp *) {} @@ -117,7 +119,7 @@ void ServerGroupChatRoomPrivate::onChatRoomDeleteRequested (const shared_ptr &, + const shared_ptr &, CallSession::State, const string & ) {} diff --git a/src/conference/session/call-session-listener.h b/src/conference/session/call-session-listener.h index 65f76eeb6..a334614ea 100644 --- a/src/conference/session/call-session-listener.h +++ b/src/conference/session/call-session-listener.h @@ -34,51 +34,51 @@ class LINPHONE_PUBLIC CallSessionListener { public: virtual ~CallSessionListener() = default; - virtual void onAckBeingSent (const std::shared_ptr &session, LinphoneHeaders *headers) {} - virtual void onAckReceived (const std::shared_ptr &session, LinphoneHeaders *headers) {} - virtual void onBackgroundTaskToBeStarted (const std::shared_ptr &session) {} - virtual void onBackgroundTaskToBeStopped (const std::shared_ptr &session) {} - virtual bool onCallSessionAccepted (const std::shared_ptr &session) { return false; } - virtual void onCallSessionConferenceStreamStarting (const std::shared_ptr &session, bool mute) {} - virtual void onCallSessionConferenceStreamStopping (const std::shared_ptr &session) {} - virtual void onCallSessionEarlyFailed (const std::shared_ptr &session, LinphoneErrorInfo *ei) {} - virtual void onCallSessionSetReleased (const std::shared_ptr &session) {} - virtual void onCallSessionSetTerminated (const std::shared_ptr &session) {} - virtual void onCallSessionStartReferred (const std::shared_ptr &session) {} - virtual void onCallSessionStateChanged (const std::shared_ptr &session, CallSession::State state, const std::string &message) {} - virtual void onCallSessionTransferStateChanged (const std::shared_ptr &session, CallSession::State state) {} - virtual void onCheckForAcceptation (const std::shared_ptr &session) {} - virtual void onDtmfReceived (const std::shared_ptr &session, char dtmf) {} - virtual void onIncomingCallSessionNotified (const std::shared_ptr &session) {} - virtual void onIncomingCallSessionStarted (const std::shared_ptr &session) {} - virtual void onIncomingCallSessionTimeoutCheck (const std::shared_ptr &session, int elapsed, bool oneSecondElapsed) {} - virtual void onInfoReceived (const std::shared_ptr &session, const LinphoneInfoMessage *im) {} - virtual void onNoMediaTimeoutCheck (const std::shared_ptr &session, bool oneSecondElapsed) {} + virtual void onAckBeingSent (const std::shared_ptr &session, LinphoneHeaders *headers) {} + virtual void onAckReceived (const std::shared_ptr &session, LinphoneHeaders *headers) {} + virtual void onBackgroundTaskToBeStarted (const std::shared_ptr &session) {} + virtual void onBackgroundTaskToBeStopped (const std::shared_ptr &session) {} + virtual bool onCallSessionAccepted (const std::shared_ptr &session) { return false; } + virtual void onCallSessionConferenceStreamStarting (const std::shared_ptr &session, bool mute) {} + virtual void onCallSessionConferenceStreamStopping (const std::shared_ptr &session) {} + virtual void onCallSessionEarlyFailed (const std::shared_ptr &session, LinphoneErrorInfo *ei) {} + virtual void onCallSessionSetReleased (const std::shared_ptr &session) {} + virtual void onCallSessionSetTerminated (const std::shared_ptr &session) {} + virtual void onCallSessionStartReferred (const std::shared_ptr &session) {} + virtual void onCallSessionStateChanged (const std::shared_ptr &session, CallSession::State state, const std::string &message) {} + virtual void onCallSessionTransferStateChanged (const std::shared_ptr &session, CallSession::State state) {} + virtual void onCheckForAcceptation (const std::shared_ptr &session) {} + virtual void onDtmfReceived (const std::shared_ptr &session, char dtmf) {} + virtual void onIncomingCallSessionNotified (const std::shared_ptr &session) {} + virtual void onIncomingCallSessionStarted (const std::shared_ptr &session) {} + virtual void onIncomingCallSessionTimeoutCheck (const std::shared_ptr &session, int elapsed, bool oneSecondElapsed) {} + virtual void onInfoReceived (const std::shared_ptr &session, const LinphoneInfoMessage *im) {} + virtual void onNoMediaTimeoutCheck (const std::shared_ptr &session, bool oneSecondElapsed) {} - virtual void onEncryptionChanged (const std::shared_ptr &session, bool activated, const std::string &authToken) {} + virtual void onEncryptionChanged (const std::shared_ptr &session, bool activated, const std::string &authToken) {} - virtual void onCallSessionStateChangedForReporting (const std::shared_ptr &session) {} - virtual void onRtcpUpdateForReporting (const std::shared_ptr &session, SalStreamType type) {} - virtual void onStatsUpdated (const std::shared_ptr &session, const LinphoneCallStats *stats) {} - virtual void onUpdateMediaInfoForReporting (const std::shared_ptr &session, int statsType) {} + virtual void onCallSessionStateChangedForReporting (const std::shared_ptr &session) {} + virtual void onRtcpUpdateForReporting (const std::shared_ptr &session, SalStreamType type) {} + virtual void onStatsUpdated (const std::shared_ptr &session, const LinphoneCallStats *stats) {} + virtual void onUpdateMediaInfoForReporting (const std::shared_ptr &session, int statsType) {} - virtual void onResetCurrentSession (const std::shared_ptr &session) {} - virtual void onSetCurrentSession (const std::shared_ptr &session) {} + virtual void onResetCurrentSession (const std::shared_ptr &session) {} + virtual void onSetCurrentSession (const std::shared_ptr &session) {} - virtual void onFirstVideoFrameDecoded (const std::shared_ptr &session) {} - virtual void onResetFirstVideoFrameDecoded (const std::shared_ptr &session) {} + virtual void onFirstVideoFrameDecoded (const std::shared_ptr &session) {} + virtual void onResetFirstVideoFrameDecoded (const std::shared_ptr &session) {} - virtual void onPlayErrorTone (const std::shared_ptr &session, LinphoneReason reason) {} - virtual void onRingbackToneRequested (const std::shared_ptr &session, bool requested) {} - virtual void onStartRinging (const std::shared_ptr &session) {} - virtual void onStopRinging (const std::shared_ptr &session) {} - virtual void onStopRingingIfInCall (const std::shared_ptr &session) {} - virtual void onStopRingingIfNeeded (const std::shared_ptr &session) {} + virtual void onPlayErrorTone (const std::shared_ptr &session, LinphoneReason reason) {} + virtual void onRingbackToneRequested (const std::shared_ptr &session, bool requested) {} + virtual void onStartRinging (const std::shared_ptr &session) {} + virtual void onStopRinging (const std::shared_ptr &session) {} + virtual void onStopRingingIfInCall (const std::shared_ptr &session) {} + virtual void onStopRingingIfNeeded (const std::shared_ptr &session) {} - virtual bool areSoundResourcesAvailable (const std::shared_ptr &session) { return true; } - virtual bool isPlayingRingbackTone (const std::shared_ptr &session) { return false; } + virtual bool areSoundResourcesAvailable (const std::shared_ptr &session) { return true; } + virtual bool isPlayingRingbackTone (const std::shared_ptr &session) { return false; } - virtual void onRealTimeTextCharacterReceived (const std::shared_ptr &session, RealtimeTextReceivedCharacter *data) {} + virtual void onRealTimeTextCharacterReceived (const std::shared_ptr &session, RealtimeTextReceivedCharacter *data) {} }; LINPHONE_END_NAMESPACE diff --git a/src/conference/session/call-session-p.h b/src/conference/session/call-session-p.h index 091fd20ca..8ad819ce7 100644 --- a/src/conference/session/call-session-p.h +++ b/src/conference/session/call-session-p.h @@ -75,7 +75,7 @@ protected: void accept (const CallSessionParams *params); virtual LinphoneStatus acceptUpdate (const CallSessionParams *csp, CallSession::State nextState, const std::string &stateInfo); - LinphoneStatus checkForAcceptation () const; + LinphoneStatus checkForAcceptation (); virtual void handleIncomingReceivedStateInIncomingNotification (); virtual bool isReadyForInvite () const; bool isUpdateAllowed (CallSession::State &nextState) const; diff --git a/src/conference/session/call-session.cpp b/src/conference/session/call-session.cpp index 944fb8b91..1e640f584 100644 --- a/src/conference/session/call-session.cpp +++ b/src/conference/session/call-session.cpp @@ -521,7 +521,7 @@ LinphoneStatus CallSessionPrivate::acceptUpdate (const CallSessionParams *csp, C return startAcceptUpdate(nextState, stateInfo); } -LinphoneStatus CallSessionPrivate::checkForAcceptation () const { +LinphoneStatus CallSessionPrivate::checkForAcceptation () { L_Q(); switch (state) { case CallSession::State::IncomingReceived: diff --git a/src/conference/session/call-session.h b/src/conference/session/call-session.h index 4fc531734..563ca89bb 100644 --- a/src/conference/session/call-session.h +++ b/src/conference/session/call-session.h @@ -57,7 +57,7 @@ public: virtual ~CallSession (); LinphoneStatus accept (const CallSessionParams *csp = nullptr); - LinphoneStatus acceptUpdate (const CallSessionParams *csp); + LinphoneStatus acceptUpdate (const CallSessionParams *csp = nullptr); virtual void configure (LinphoneCallDir direction, LinphoneProxyConfig *cfg, SalCallOp *op, const Address &from, const Address &to); LinphoneStatus decline (LinphoneReason reason); LinphoneStatus decline (const LinphoneErrorInfo *ei); diff --git a/src/conference/session/media-session-p.h b/src/conference/session/media-session-p.h index a4ba68257..a238078c1 100644 --- a/src/conference/session/media-session-p.h +++ b/src/conference/session/media-session-p.h @@ -135,7 +135,7 @@ private: void updateRemoteSessionIdAndVer (); void initStats (LinphoneCallStats *stats, LinphoneStreamType type); - void notifyStatsUpdated (int streamIndex) const; + void notifyStatsUpdated (int streamIndex); OrtpEvQueue *getEventQueue (int streamIndex) const; MediaStream *getMediaStream (int streamIndex) const; diff --git a/src/conference/session/media-session.cpp b/src/conference/session/media-session.cpp index 89ab3d443..c21b2fa22 100644 --- a/src/conference/session/media-session.cpp +++ b/src/conference/session/media-session.cpp @@ -933,7 +933,7 @@ void MediaSessionPrivate::initStats (LinphoneCallStats *stats, LinphoneStreamTyp _linphone_call_stats_set_ice_state(stats, LinphoneIceStateNotActivated); } -void MediaSessionPrivate::notifyStatsUpdated (int streamIndex) const { +void MediaSessionPrivate::notifyStatsUpdated (int streamIndex) { L_Q(); LinphoneCallStats *stats = nullptr; if (streamIndex == mainAudioStreamIndex) From 78f40ae222f8e71a006040b83b00f20e2dca1154 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 14 Feb 2018 10:39:54 +0100 Subject: [PATCH 039/281] Fixed issue with find_friend_by_address if address has a gruu --- coreapi/friendlist.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreapi/friendlist.c b/coreapi/friendlist.c index 159409449..b92c13a02 100644 --- a/coreapi/friendlist.c +++ b/coreapi/friendlist.c @@ -766,7 +766,7 @@ void linphone_friend_list_synchronize_friends_from_server(LinphoneFriendList *li LinphoneFriend * linphone_friend_list_find_friend_by_address(const LinphoneFriendList *list, const LinphoneAddress *address) { LinphoneAddress *clean_addr = linphone_address_clone(address); LinphoneFriend *lf; - if (linphone_address_has_param(clean_addr, "gr")) { + if (linphone_address_has_uri_param(clean_addr, "gr")) { linphone_address_remove_uri_param(clean_addr, "gr"); } char *uri = linphone_address_as_string_uri_only(clean_addr); From 997496ffa98f5599339e248a8ee5e6516b6ae0a2 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 14 Feb 2018 11:33:08 +0100 Subject: [PATCH 040/281] Add group chat test for admin designation when creator of a room that is the only admin leaves the room. --- tester/group_chat_tester.c | 50 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/tester/group_chat_tester.c b/tester/group_chat_tester.c index f40fe50e6..f44b196c7 100644 --- a/tester/group_chat_tester.c +++ b/tester/group_chat_tester.c @@ -888,6 +888,55 @@ static void group_chat_room_remove_admin (void) { linphone_core_manager_destroy(laure); } +static void group_chat_room_admin_creator_leaves_the_room (void) { + LinphoneCoreManager *marie = linphone_core_manager_create("marie_rc"); + LinphoneCoreManager *pauline = linphone_core_manager_create("pauline_rc"); + LinphoneCoreManager *laure = linphone_core_manager_create("laure_tcp_rc"); + bctbx_list_t *coresManagerList = NULL; + bctbx_list_t *participantsAddresses = NULL; + coresManagerList = bctbx_list_append(coresManagerList, marie); + coresManagerList = bctbx_list_append(coresManagerList, pauline); + coresManagerList = bctbx_list_append(coresManagerList, laure); + bctbx_list_t *coresList = init_core_for_conference(coresManagerList); + start_core_for_conference(coresManagerList); + participantsAddresses = bctbx_list_append(participantsAddresses, linphone_address_new(linphone_core_get_identity(pauline->lc))); + participantsAddresses = bctbx_list_append(participantsAddresses, linphone_address_new(linphone_core_get_identity(laure->lc))); + stats initialMarieStats = marie->stat; + stats initialPaulineStats = pauline->stat; + stats initialLaureStats = laure->stat; + + // Marie creates a new group chat room + const char *initialSubject = "Colleagues"; + LinphoneChatRoom *marieCr = create_chat_room_client_side(coresList, marie, &initialMarieStats, participantsAddresses, initialSubject, -1); + + 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, 2, 0); + + // Check that the chat room is correctly created on Laure's side and that the participants are added + LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, 0); + + // Marie leaves the room + linphone_chat_room_leave(marieCr); + BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneChatRoomStateTerminated, initialMarieStats.number_of_LinphoneChatRoomStateTerminated + 1, 3000)); + BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_participants_removed, initialPaulineStats.number_of_participants_removed + 1, 1000)); + BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_participants_removed, initialLaureStats.number_of_participants_removed + 1, 1000)); + BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_participant_admin_statuses_changed, initialPaulineStats.number_of_participant_admin_statuses_changed + 1, 1000)); + BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_participant_admin_statuses_changed, initialLaureStats.number_of_participant_admin_statuses_changed + 1, 1000)); + BC_ASSERT_TRUE(linphone_participant_is_admin(linphone_chat_room_get_me(laureCr))); + + // Clean db from chat room + linphone_core_manager_delete_chat_room(marie, marieCr, coresList); + linphone_core_manager_delete_chat_room(laure, laureCr, 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); + linphone_core_manager_destroy(laure); +} static void group_chat_room_change_subject (void) { LinphoneCoreManager *marie = linphone_core_manager_create("marie_rc"); @@ -2555,6 +2604,7 @@ test_t group_chat_tests[] = { TEST_TWO_TAGS("Add admin lately notified", group_chat_room_add_admin_lately_notified, "Server", "LeaksMemory"), TEST_TWO_TAGS("Add admin with a non admin", group_chat_room_add_admin_non_admin, "Server", "LeaksMemory"), TEST_TWO_TAGS("Remove admin", group_chat_room_remove_admin, "Server", "LeaksMemory"), + TEST_TWO_TAGS("Admin creator leaves the room", group_chat_room_admin_creator_leaves_the_room, "Server", "LeaksMemory"), TEST_TWO_TAGS("Change subject", group_chat_room_change_subject, "Server", "LeaksMemory"), TEST_TWO_TAGS("Change subject with a non admin", group_chat_room_change_subject_non_admin, "Server", "LeaksMemory"), TEST_TWO_TAGS("Remove participant", group_chat_room_remove_participant, "Server", "LeaksMemory"), From b5b6ef454533557a5df6667c26643d0be9d9140a Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 14 Feb 2018 11:29:59 +0100 Subject: [PATCH 041/281] Added new chat room callback to let app decides whether or not store chat message in database --- include/linphone/api/c-callbacks.h | 7 +++++++ include/linphone/api/c-chat-room-cbs.h | 13 +++++++++++++ src/c-wrapper/api/c-chat-room-cbs.cpp | 9 +++++++++ src/chat/chat-message/chat-message.cpp | 21 +++++++++++++-------- src/chat/chat-room/chat-room-p.h | 1 - src/chat/chat-room/chat-room.cpp | 17 ----------------- 6 files changed, 42 insertions(+), 26 deletions(-) diff --git a/include/linphone/api/c-callbacks.h b/include/linphone/api/c-callbacks.h index a053e78a8..ea533f2c8 100644 --- a/include/linphone/api/c-callbacks.h +++ b/include/linphone/api/c-callbacks.h @@ -249,6 +249,13 @@ typedef void (*LinphoneChatRoomCbsParticipantDeviceFetchedCb) (LinphoneChatRoom */ typedef void (*LinphoneChatRoomCbsParticipantsCapabilitiesCheckedCb) (LinphoneChatRoom *cr, const LinphoneAddress *deviceAddr, const bctbx_list_t *participantsAddr); +/** + * Callback used to tell the core whether or not to store the incoming message in db or not using linphone_chat_message_set_to_be_stored(). + * @param[in] cr #LinphoneChatRoom object + * @param[in] msg The #LinphoneChatMessage that is being received + */ +typedef void (*LinphoneChatRoomCbsShouldChatMessageBeStoredCb) (LinphoneChatRoom *cr, LinphoneChatMessage *msg); + /** * @} **/ diff --git a/include/linphone/api/c-chat-room-cbs.h b/include/linphone/api/c-chat-room-cbs.h index 9dc396fac..0e02b615c 100644 --- a/include/linphone/api/c-chat-room-cbs.h +++ b/include/linphone/api/c-chat-room-cbs.h @@ -271,6 +271,19 @@ LINPHONE_PUBLIC LinphoneChatRoomCbsParticipantsCapabilitiesCheckedCb linphone_ch */ LINPHONE_PUBLIC void linphone_chat_room_cbs_set_participants_capabilities_checked (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsParticipantsCapabilitiesCheckedCb cb); +/** + * Get the message should be stored callback. + * @param[in] cbs LinphoneChatRoomCbs object + * @return The message should be stored getting callback + */ +LINPHONE_PUBLIC LinphoneChatRoomCbsShouldChatMessageBeStoredCb linphone_chat_room_cbs_get_chat_message_should_be_stored( LinphoneChatRoomCbs *cbs); +/** + * Set the message should be stored callback. + * @param[in] cbs LinphoneChatRoomCbs object + * @param[in] cb The message should be stored callback to be used + */ +LINPHONE_PUBLIC void linphone_chat_room_cbs_set_chat_message_should_be_stored( LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsShouldChatMessageBeStoredCb cb); + /** * @} */ diff --git a/src/c-wrapper/api/c-chat-room-cbs.cpp b/src/c-wrapper/api/c-chat-room-cbs.cpp index c8c8ca89d..cce0b165a 100644 --- a/src/c-wrapper/api/c-chat-room-cbs.cpp +++ b/src/c-wrapper/api/c-chat-room-cbs.cpp @@ -41,6 +41,7 @@ struct _LinphoneChatRoomCbs { LinphoneChatRoomCbsConferenceAddressGenerationCb conferenceAddressGenerationCb; LinphoneChatRoomCbsParticipantDeviceFetchedCb participantDeviceFetchedCb; LinphoneChatRoomCbsParticipantsCapabilitiesCheckedCb participantsCapabilitiesChecked; + LinphoneChatRoomCbsShouldChatMessageBeStoredCb shouldMessageBeStoredCb; }; BELLE_SIP_DECLARE_VPTR_NO_EXPORT(LinphoneChatRoomCbs); @@ -196,3 +197,11 @@ LinphoneChatRoomCbsParticipantsCapabilitiesCheckedCb linphone_chat_room_cbs_get_ void linphone_chat_room_cbs_set_participants_capabilities_checked (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsParticipantsCapabilitiesCheckedCb cb) { cbs->participantsCapabilitiesChecked = cb; } + +LinphoneChatRoomCbsShouldChatMessageBeStoredCb linphone_chat_room_cbs_get_chat_message_should_be_stored( LinphoneChatRoomCbs *cbs) { + return cbs->shouldMessageBeStoredCb; +} + +void linphone_chat_room_cbs_set_chat_message_should_be_stored( LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsShouldChatMessageBeStoredCb cb) { + cbs->shouldMessageBeStoredCb = cb; +} diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index 7b5b569bd..40a80054e 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -401,18 +401,23 @@ void ChatMessagePrivate::notifyReceiving () { LinphoneChatRoom *chatRoom = L_GET_C_BACK_PTR(q->getChatRoom()); LinphoneChatRoomCbs *cbs = linphone_chat_room_get_callbacks(chatRoom); - LinphoneChatRoomCbsParticipantAddedCb cb = linphone_chat_room_cbs_get_chat_message_received(cbs); - shared_ptr event = make_shared( - ::time(nullptr), q->getSharedFromThis() - ); - if (cb) - cb(chatRoom, L_GET_C_BACK_PTR(event)); - // Legacy - q->getChatRoom()->getPrivate()->notifyChatMessageReceived(q->getSharedFromThis()); + + LinphoneChatRoomCbsShouldChatMessageBeStoredCb shouldMessageBeStoredCb = linphone_chat_room_cbs_get_chat_message_should_be_stored(cbs); + if (shouldMessageBeStoredCb) + shouldMessageBeStoredCb(chatRoom, L_GET_C_BACK_PTR(q->getSharedFromThis())); if (toBeStored) storeInDb(); + shared_ptr event = make_shared( + ::time(nullptr), q->getSharedFromThis() + ); + LinphoneChatRoomCbsChatMessageReceivedCb messageReceivedCb = linphone_chat_room_cbs_get_chat_message_received(cbs); + if (messageReceivedCb) + messageReceivedCb(chatRoom, L_GET_C_BACK_PTR(event)); + // Legacy + q->getChatRoom()->getPrivate()->notifyChatMessageReceived(q->getSharedFromThis()); + q->sendDeliveryNotification(LinphoneReasonNone); } diff --git a/src/chat/chat-room/chat-room-p.h b/src/chat/chat-room/chat-room-p.h index 5492f9bdc..7b45cc6c0 100644 --- a/src/chat/chat-room/chat-room-p.h +++ b/src/chat/chat-room/chat-room-p.h @@ -78,7 +78,6 @@ private: time_t creationTime = std::time(nullptr); time_t lastUpdateTime = std::time(nullptr); - std::shared_ptr pendingMessage; std::unique_ptr isComposingHandler; bool isComposing = false; diff --git a/src/chat/chat-room/chat-room.cpp b/src/chat/chat-room/chat-room.cpp index 257892be1..6a9fa970c 100644 --- a/src/chat/chat-room/chat-room.cpp +++ b/src/chat/chat-room/chat-room.cpp @@ -189,7 +189,6 @@ void ChatRoomPrivate::notifyUndecryptableChatMessageReceived (const shared_ptr msg; @@ -224,29 +223,18 @@ LinphoneReason ChatRoomPrivate::onSipMessageReceived (SalOp *op, const SalMessag if (msg->getPrivate()->getContentType() == ContentType::ImIsComposing) { onIsComposingReceived(msg->getFromAddress(), msg->getPrivate()->getText()); - increaseMsgCount = FALSE; if (lp_config_get_int(linphone_core_get_config(cCore), "sip", "deliver_imdn", 0) != 1) { goto end; } } else if (msg->getPrivate()->getContentType() == ContentType::Imdn) { onImdnReceived(msg->getPrivate()->getText()); - increaseMsgCount = FALSE; if (lp_config_get_int(linphone_core_get_config(cCore), "sip", "deliver_imdn", 0) != 1) { goto end; } } - if (increaseMsgCount) { - /* Mark the message as pending so that if ChatRoom::markAsRead() is called in the - * ChatRoomPrivate::chatMessageReceived() callback, it will effectively be marked as - * being read before being stored. */ - pendingMessage = msg; - } - onChatMessageReceived(msg); - pendingMessage = nullptr; - end: return reason; } @@ -438,11 +426,6 @@ void ChatRoom::markAsRead () { chatMessage->sendDisplayNotification(); dCore->mainDb->markChatMessagesAsRead(d->chatRoomId); - - if (d->pendingMessage) { - d->pendingMessage->updateState(ChatMessage::State::Displayed); - d->pendingMessage->sendDisplayNotification(); - } } LINPHONE_END_NAMESPACE From 076c7715ec0054697d8afb58d3f2271149360b43 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Wed, 14 Feb 2018 11:36:25 +0100 Subject: [PATCH 042/281] feat(MainDb): delete chat_message_participant when message is displayed --- src/db/main-db.cpp | 110 +++++++++++++++++++----------------------- tester/db/linphone.db | Bin 4382720 -> 4382720 bytes 2 files changed, 49 insertions(+), 61 deletions(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 92cb2d078..84ec4112c 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -17,9 +17,9 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#include #include +#include "linphone/utils/algorithm.h" #include "linphone/utils/utils.h" #include "chat/chat-message/chat-message-p.h" @@ -216,6 +216,7 @@ static constexpr const char *mapEnumToSql (const EnumToSql enumToSql[], size_ ); } +// Update me event-log-enums values are changed! static constexpr EnumToSql eventFilterToSql[] = { { MainDb::ConferenceCallFilter, "3, 4" }, { MainDb::ConferenceChatMessageFilter, "5" }, @@ -235,11 +236,7 @@ static string buildSqlEventFilter ( MainDb::FilterMask mask, const string &condKeyWord = "WHERE" ) { - L_ASSERT( - find_if(filters.cbegin(), filters.cend(), [](const MainDb::Filter &filter) { - return filter == MainDb::NoFilter; - }) == filters.cend() - ); + L_ASSERT(findIf(filters, [](const MainDb::Filter &filter) { return filter == MainDb::NoFilter; }) == filters.cend()); if (mask == MainDb::NoFilter) return ""; @@ -475,7 +472,7 @@ void MainDbPrivate::insertChatMessageParticipant (long long eventId, long long s soci::use(state), soci::use(eventId), soci::use(sipAddressId) ); statement.execute(); - if (statement.get_affected_rows() == 0 && state != static_cast(ChatMessage::State::Displayed)) + if (statement.get_affected_rows() == 0 && state != int(ChatMessage::State::Displayed)) *session << "INSERT INTO chat_message_participant (event_id, participant_sip_address_id, state)" " VALUES (:eventId, :sipAddressId, :state)", soci::use(eventId), soci::use(sipAddressId), soci::use(state); @@ -692,12 +689,12 @@ shared_ptr MainDbPrivate::selectConferenceChatMessageEvent ( chatMessage = shared_ptr(new ChatMessage( chatRoom, - static_cast(direction) + ChatMessage::Direction(direction) )); - chatMessage->setIsSecured(static_cast(isSecured)); + chatMessage->setIsSecured(bool(isSecured)); ChatMessagePrivate *dChatMessage = chatMessage->getPrivate(); - dChatMessage->setState(static_cast(state), true); + dChatMessage->setState(ChatMessage::State(state), true); dChatMessage->forceFromAddress(IdentityAddress(fromSipAddress)); dChatMessage->forceToAddress(IdentityAddress(toSipAddress)); @@ -734,7 +731,7 @@ shared_ptr MainDbPrivate::selectConferenceChatMessageEvent ( FileContent *fileContent = new FileContent(); fileContent->setFileName(name); - fileContent->setFileSize(static_cast(size)); + fileContent->setFileSize(size_t(size)); fileContent->setFilePath(path); content = fileContent; @@ -856,7 +853,7 @@ shared_ptr MainDbPrivate::selectConferenceSubjectEvent ( long long MainDbPrivate::insertEvent (const shared_ptr &eventLog) { soci::session *session = dbSession.getBackendSession(); - const int &type = static_cast(eventLog->getType()); + const int &type = int(eventLog->getType()); const tm &creationTime = Utils::getTimeTAsTm(eventLog->getCreationTime()); *session << "INSERT INTO event (type, creation_time) VALUES (:type, :creationTime)", soci::use(type), @@ -921,8 +918,8 @@ long long MainDbPrivate::insertConferenceChatMessageEvent (const shared_ptrgetFromAddress().asString()); const long long &toSipAddressId = insertSipAddress(chatMessage->getToAddress().asString()); const tm &messageTime = Utils::getTimeTAsTm(chatMessage->getTime()); - const int &state = static_cast(chatMessage->getState()); - const int &direction = static_cast(chatMessage->getDirection()); + const int &state = int(chatMessage->getState()); + const int &direction = int(chatMessage->getDirection()); const string &imdnMessageId = chatMessage->getImdnMessageId(); const int &isSecured = chatMessage->isSecured() ? 1 : 0; @@ -955,7 +952,7 @@ void MainDbPrivate::updateConferenceChatMessageEvent (const shared_ptr const long long &eventId = dEventKey->storageId; soci::session *session = dbSession.getBackendSession(); - const int &state = static_cast(chatMessage->getState()); + const int &state = int(chatMessage->getState()); const string &imdnMessageId = chatMessage->getImdnMessageId(); *session << "UPDATE conference_chat_message_event SET state = :state, imdn_message_id = :imdnMessageId" " WHERE event_id = :eventId", @@ -1206,7 +1203,7 @@ static T getValueFromRow (const soci::row &row, int index, bool &isNull) { isNull = false; try { - return row.get(static_cast(index)); + return row.get(size_t(index)); } catch (const exception &) { isNull = true; } @@ -1319,9 +1316,9 @@ void MainDbPrivate::importLegacyHistory (DbSession &inDbSession) { } const int &state = message.get( - LegacyMessageColState, static_cast(ChatMessage::State::Displayed) + LegacyMessageColState, int(ChatMessage::State::Displayed) ); - if (state < 0 || state > static_cast(ChatMessage::State::Displayed)) { + if (state < 0 || state > int(ChatMessage::State::Displayed)) { lWarning() << "Unable to import legacy message with invalid state."; continue; } @@ -1368,7 +1365,7 @@ void MainDbPrivate::importLegacyHistory (DbSession &inDbSession) { } soci::session *session = dbSession.getBackendSession(); - const int &eventType = static_cast(EventLog::Type::ConferenceChatMessage); + const int &eventType = int(EventLog::Type::ConferenceChatMessage); *session << "INSERT INTO event (type, creation_time) VALUES (:type, :creationTime)", soci::use(eventType), soci::use(creationTime); @@ -1398,7 +1395,7 @@ void MainDbPrivate::importLegacyHistory (DbSession &inDbSession) { insertContent(eventId, content); insertChatRoomParticipant(chatRoomId, remoteSipAddressId, false); - if (state != static_cast(ChatMessage::State::Displayed)) + if (state != int(ChatMessage::State::Displayed)) insertChatMessageParticipant(eventId, remoteSipAddressId, state); } @@ -1697,32 +1694,6 @@ void MainDb::init () { " ON DELETE CASCADE" ") " + charset; - // Trigger to delete participant_message cache entries. - // TODO: Fix me in the future. (Problem on Mysql backend.) - #if 0 - string displayedId = Utils::toString(static_cast(ChatMessage::State::Displayed)); - string participantMessageDeleter = - "CREATE TRIGGER IF NOT EXISTS chat_message_participant_deleter" - " AFTER UPDATE OF state ON chat_message_participant FOR EACH ROW" - " WHEN NEW.state = "; - participantMessageDeleter += displayedId; - participantMessageDeleter += " AND (SELECT COUNT(*) FROM (" - " SELECT state FROM chat_message_participant WHERE" - " NEW.event_id = chat_message_participant.event_id" - " AND state <> "; - participantMessageDeleter += displayedId; - participantMessageDeleter += " LIMIT 1" - " )) = 0" - " BEGIN" - " DELETE FROM chat_message_participant WHERE NEW.event_id = chat_message_participant.event_id;" - " UPDATE conference_chat_message_event SET state = "; - participantMessageDeleter += displayedId; - participantMessageDeleter += " WHERE event_id = NEW.event_id;" - " END"; - - *session << participantMessageDeleter; - #endif - *session << "CREATE TABLE IF NOT EXISTS friends_list (" " id" + primaryKeyStr("INT UNSIGNED") + "," @@ -1775,6 +1746,24 @@ void MainDb::init () { " version INT UNSIGNED NOT NULL" ") " + charset; + if (getBackend() == Backend::Mysql) + *session << + "CREATE TRIGGER IF NOT EXISTS chat_message_participant_deleter" + " AFTER UPDATE ON conference_chat_message_event FOR EACH ROW" + " BEGIN" + " IF NEW.state = " + Utils::toString(int(ChatMessage::State::Displayed)) + " THEN" + " DELETE FROM chat_message_participant WHERE event_id = NEW.event_id;" + " END IF;" + " END "; + else + *session << + "CREATE TRIGGER IF NOT EXISTS chat_message_participant_deleter" + " AFTER UPDATE OF state ON conference_chat_message_event FOR EACH ROW" + " WHEN NEW.state = " + Utils::toString(int(ChatMessage::State::Displayed)) + + " BEGIN" + " DELETE FROM chat_message_participant WHERE event_id = NEW.event_id;" + " END "; + d->updateSchema(); d->updateModuleVersion("events", ModuleVersionEvents); @@ -1969,7 +1958,7 @@ shared_ptr MainDb::getEventFromKey (const MainDbKey &dbKey) { return d->selectGenericConferenceEvent( storageId, - static_cast(type), + EventLog::Type(type), Utils::getTmAsTimeT(creationTime), ChatRoomId(IdentityAddress(peerSipAddress), IdentityAddress(localSipAddress)) ); @@ -2009,7 +1998,7 @@ list> MainDb::getConferenceNotifiedEvents ( events.push_back(eventLog ? eventLog : d->selectGenericConferenceEvent( eventId, - static_cast(row.get(1)), + EventLog::Type(row.get(1)), Utils::getTmAsTimeT(row.get(2)), chatRoomId )); @@ -2056,8 +2045,8 @@ int MainDb::getUnreadChatMessageCount (const ChatRoomId &chatRoomId) const { " SELECT event_id FROM conference_event WHERE chat_room_id = :chatRoomId" ") AND"; - query += " direction = " + Utils::toString(static_cast(ChatMessage::Direction::Incoming)) + - + " AND state <> " + Utils::toString(static_cast(ChatMessage::State::Displayed)); + query += " direction = " + Utils::toString(int(ChatMessage::Direction::Incoming)) + + + " AND state <> " + Utils::toString(int(ChatMessage::State::Displayed)); DurationLogger durationLogger( "Get unread chat messages count of: (peer=" + chatRoomId.getPeerAddress().asString() + @@ -2088,13 +2077,13 @@ void MainDb::markChatMessagesAsRead (const ChatRoomId &chatRoomId) const { return; string query = "UPDATE conference_chat_message_event" - " SET state = " + Utils::toString(static_cast(ChatMessage::State::Displayed)) + " "; + " SET state = " + Utils::toString(int(ChatMessage::State::Displayed)) + " "; query += "WHERE"; if (chatRoomId.isValid()) query += " event_id IN (" " SELECT event_id FROM conference_event WHERE chat_room_id = :chatRoomId" ") AND"; - query += " direction = " + Utils::toString(static_cast(ChatMessage::Direction::Incoming)); + query += " direction = " + Utils::toString(int(ChatMessage::Direction::Incoming)); DurationLogger durationLogger( "Mark chat messages as read of: (peer=" + chatRoomId.getPeerAddress().asString() + @@ -2125,8 +2114,8 @@ list> MainDb::getUnreadChatMessages (const ChatRoomId &c if (chatRoomId.isValid()) query += " chat_room_id = :chatRoomId AND "; query += " conference_event.event_id = conference_chat_message_event.event_id" - " AND direction = " + Utils::toString(static_cast(ChatMessage::Direction::Incoming)) + - " AND state <> " + Utils::toString(static_cast(ChatMessage::State::Displayed)) + + " AND direction = " + Utils::toString(int(ChatMessage::Direction::Incoming)) + + " AND state <> " + Utils::toString(int(ChatMessage::State::Displayed)) + ")"; DurationLogger durationLogger( @@ -2210,7 +2199,7 @@ list> MainDb::findChatMessages ( if (!event) event = d->selectGenericConferenceEvent( eventId, - static_cast(row.get(1)), + EventLog::Type(row.get(1)), Utils::getTmAsTimeT(row.get(2)), chatRoomId ); @@ -2285,7 +2274,7 @@ list> MainDb::getHistoryRange ( if (!event) event = d->selectGenericConferenceEvent( eventId, - static_cast(row.get(1)), + EventLog::Type(row.get(1)), Utils::getTmAsTimeT(row.get(2)), chatRoomId ); @@ -2419,11 +2408,10 @@ list> MainDb::getChatRooms () const { soci::rowset rows = (session->prepare << query, soci::use(participantId)); for (const auto &row : rows) { shared_ptr device = dParticipant->addDevice(IdentityAddress(row.get(0))); - ParticipantDevice::State state = static_cast(getBackend() == Backend::Mysql + device->setState(ParticipantDevice::State(getBackend() == Backend::Mysql ? row.get(1, 0) : static_cast(row.get(1, 0)) - ); - device->setState(state); + )); } } @@ -2690,9 +2678,9 @@ void MainDb::enableChatRoomMigration (const ChatRoomId &chatRoomId, bool enable) *session << "SELECT capabilities FROM chat_room WHERE id = :chatRoomId", soci::use(dbChatRoomId), soci::into(capabilities); if (enable) - capabilities |= static_cast(ChatRoom::Capabilities::Migratable); + capabilities |= int(ChatRoom::Capabilities::Migratable); else - capabilities &= ~static_cast(ChatRoom::Capabilities::Migratable); + capabilities &= ~int(ChatRoom::Capabilities::Migratable); *session << "UPDATE chat_room SET capabilities = :capabilities WHERE id = :chatRoomId", soci::use(capabilities), soci::use(dbChatRoomId); diff --git a/tester/db/linphone.db b/tester/db/linphone.db index 8e7f0f8a8666184fb0398fa8d75a34c79536b207..ae7fe37abfda8ce2a6e080f37dbc361e3f3df2f2 100644 GIT binary patch delta 572 zcmYMuO-NKx6bJBo=6&7wym#J=rQ`I*yw0TQ%g?dzEYp07SgnfI#Y_-{g^IZJgEDZV ztGCLDaNi>GE;Dc=;VL2oH+}3Y+XN-~w-zmaoO3w*;Xkv!n3#d3ARRJhb}+`?GM4y) znO$z{u|n4VsdcvWszgs40#C6dtumuxD)W}PW7Sv{=PS>n^pb47cIJ7`3gm41d;GjbXbV3(&LlJu5B%FfNa0br8IXDj&pcgK} PCFq08(66}|`1x)hr*n&l delta 724 zcmZwB%}*0S7zXf}ZoAu$-F}GB)>3&X6x#|dr6MX6EU;>o7K6ne8dt1c1x>uPx@ttaz$^X zxL1GWP(sN}evu;A)FpMHKnu&O`9dTXr3)*|If@Wg_hzGZqoy5}JDGkeUQ$=o_KUn) zjCaN^Rmzm6&h_NK3SP9oI1HGXrKxt$QZ|<@P?9JbMawwRym~R4*S|TGG1vd{dj953 z6Rlod%oJ48JxLyPV!%Q-JWW$|E-T;!7r4O#N1z9eLND}z7kuD{V-SFT2*Pm~0D?gX z!4M2X7)Ia(L?8+=I0>UL260HhI3!^LQg8|;;WV^oJp*Uq98ALuq+u53;5=juF3%r) F{sR+-yIKGM From 3d53c71b8586ecb525e7c2d317cb0da55d20703e Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 14 Feb 2018 11:54:55 +0100 Subject: [PATCH 043/281] Add group chat test for addition of participant after its removal while it is offline. --- tester/group_chat_tester.c | 40 ++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/tester/group_chat_tester.c b/tester/group_chat_tester.c index f44b196c7..56f5f22fd 100644 --- a/tester/group_chat_tester.c +++ b/tester/group_chat_tester.c @@ -1353,7 +1353,7 @@ static void group_chat_room_create_room_with_disconnected_friends_and_initial_me group_chat_room_create_room_with_disconnected_friends_base(TRUE); } -static void group_chat_room_reinvited_after_removed_base (bool_t offline_when_removed) { +static void group_chat_room_reinvited_after_removed_base (bool_t offline_when_removed, bool_t offline_when_reinvited) { LinphoneCoreManager *marie = linphone_core_manager_create("marie_rc"); LinphoneCoreManager *pauline = linphone_core_manager_create("pauline_rc"); LinphoneCoreManager *laure = linphone_core_manager_create("laure_tcp_rc"); @@ -1394,35 +1394,50 @@ static void group_chat_room_reinvited_after_removed_base (bool_t offline_when_re // Marie removes Laure from the chat room LinphoneParticipant *laureParticipant = linphone_chat_room_find_participant(marieCr, laureAddr); - linphone_address_unref(laureAddr); BC_ASSERT_PTR_NOT_NULL(laureParticipant); linphone_chat_room_remove_participant(marieCr, laureParticipant); BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_participants_removed, initialMarieStats.number_of_participants_removed + 1, 1000)); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_participants_removed, initialPaulineStats.number_of_participants_removed + 1, 1000)); - if (offline_when_removed) { + if (offline_when_removed && !offline_when_reinvited) { linphone_core_manager_configure(laure); lp_config_set_string(linphone_core_get_config(laure->lc), "misc", "uuid", savedLaureUuid); bctbx_free(savedLaureUuid); bctbx_list_t *tmpCoresManagerList = bctbx_list_append(NULL, laure); init_core_for_conference(tmpCoresManagerList); bctbx_list_free(tmpCoresManagerList); + initialLaureStats = laure->stat; linphone_core_manager_start(laure, TRUE); coresList = bctbx_list_append(coresList, laure->lc); coresManagerList = bctbx_list_append(coresManagerList, laure); - initialLaureStats = laure->stat; } - BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_LinphoneChatRoomStateTerminated, initialLaureStats.number_of_LinphoneChatRoomStateTerminated + 1, 3000)); + if (!offline_when_reinvited) + BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_LinphoneChatRoomStateTerminated, initialLaureStats.number_of_LinphoneChatRoomStateTerminated + 1, 3000)); // Marie adds Laure to the chat room - participantsAddresses = bctbx_list_append(participantsAddresses, linphone_address_new(linphone_core_get_identity(laure->lc))); + participantsAddresses = bctbx_list_append(participantsAddresses, laureAddr); linphone_chat_room_add_participants(marieCr, participantsAddresses); bctbx_list_free_with_data(participantsAddresses, (bctbx_list_free_func)linphone_address_unref); participantsAddresses = NULL; - BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_LinphoneChatRoomStateCreationPending, initialLaureStats.number_of_LinphoneChatRoomStateCreationPending + 1, 5000)); - BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_LinphoneChatRoomStateCreated, initialLaureStats.number_of_LinphoneChatRoomStateCreated + 1, 5000)); BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_participants_added, initialMarieStats.number_of_participants_added + 1, 1000)); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_participants_added, initialPaulineStats.number_of_participants_added + 1, 1000)); + if (offline_when_reinvited) { + linphone_core_manager_configure(laure); + lp_config_set_string(linphone_core_get_config(laure->lc), "misc", "uuid", savedLaureUuid); + bctbx_free(savedLaureUuid); + bctbx_list_t *tmpCoresManagerList = bctbx_list_append(NULL, laure); + init_core_for_conference(tmpCoresManagerList); + bctbx_list_free(tmpCoresManagerList); + initialLaureStats = laure->stat; + linphone_core_manager_start(laure, TRUE); + coresList = bctbx_list_append(coresList, laure->lc); + coresManagerList = bctbx_list_append(coresManagerList, laure); + BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_LinphoneChatRoomStateCreationPending, initialLaureStats.number_of_LinphoneChatRoomStateCreationPending + 1, 5000)); + BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_LinphoneChatRoomStateCreated, initialLaureStats.number_of_LinphoneChatRoomStateCreated + 2, 5000)); + } else { + BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_LinphoneChatRoomStateCreationPending, initialLaureStats.number_of_LinphoneChatRoomStateCreationPending + 1, 5000)); + BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_LinphoneChatRoomStateCreated, initialLaureStats.number_of_LinphoneChatRoomStateCreated + 1, 5000)); + } BC_ASSERT_EQUAL(linphone_chat_room_get_nb_participants(marieCr), 2, int, "%d"); BC_ASSERT_EQUAL(linphone_chat_room_get_nb_participants(paulineCr), 2, int, "%d"); laureAddr = linphone_address_new(linphone_core_get_device_identity(laure->lc)); @@ -1446,11 +1461,15 @@ static void group_chat_room_reinvited_after_removed_base (bool_t offline_when_re } static void group_chat_room_reinvited_after_removed (void) { - group_chat_room_reinvited_after_removed_base(FALSE); + group_chat_room_reinvited_after_removed_base(FALSE, FALSE); } static void group_chat_room_reinvited_after_removed_while_offline (void) { - group_chat_room_reinvited_after_removed_base(TRUE); + group_chat_room_reinvited_after_removed_base(TRUE, FALSE); +} + +static void group_chat_room_reinvited_after_removed_while_offline_2 (void) { + group_chat_room_reinvited_after_removed_base(TRUE, TRUE); } static void group_chat_room_notify_after_disconnection (void) { @@ -2615,6 +2634,7 @@ test_t group_chat_tests[] = { TEST_TWO_TAGS("Create chat room with disconnected friends and initial message", group_chat_room_create_room_with_disconnected_friends_and_initial_message, "Server", "LeaksMemory"), TEST_TWO_TAGS("Reinvited after removed from group chat room", group_chat_room_reinvited_after_removed, "Server", "LeaksMemory"), TEST_TWO_TAGS("Reinvited after removed from group chat room while offline", group_chat_room_reinvited_after_removed_while_offline, "Server", "LeaksMemory"), + TEST_TWO_TAGS("Reinvited after removed from group chat room while offline 2", group_chat_room_reinvited_after_removed_while_offline_2, "Server", "LeaksMemory"), TEST_TWO_TAGS("Notify after disconnection", group_chat_room_notify_after_disconnection, "Server", "LeaksMemory"), TEST_TWO_TAGS("Send refer to all participants devices", group_chat_room_send_refer_to_all_devices, "Server", "LeaksMemory"), // TODO: Use when we support adding a new device in created conf From c613beed2e0c19c9c011edfb980268e0d4b20146 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 14 Feb 2018 11:55:38 +0100 Subject: [PATCH 044/281] Allow joining a ClientGroupChatRoom while it is being left. --- src/chat/chat-room/client-group-chat-room.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/chat/chat-room/client-group-chat-room.cpp b/src/chat/chat-room/client-group-chat-room.cpp index 36f583820..8064e8499 100644 --- a/src/chat/chat-room/client-group-chat-room.cpp +++ b/src/chat/chat-room/client-group-chat-room.cpp @@ -393,7 +393,10 @@ void ClientGroupChatRoom::join () { if (!session && ((getState() == ChatRoom::State::Instantiated) || (getState() == ChatRoom::State::Terminated))) { d->bgTask.start(); session = d->createSession(); - session->startInvite(nullptr, "", nullptr); + } + if (session) { + if (getState() != ChatRoom::State::TerminationPending) + session->startInvite(nullptr, "", nullptr); d->setState(ChatRoom::State::CreationPending); } } From a0b7336ec3cdb729df4367bc8f14395a5e114852 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 14 Feb 2018 11:58:46 +0100 Subject: [PATCH 045/281] Add error logs in addition of participants in conferences. --- src/conference/local-conference.cpp | 5 ++++- src/conference/remote-conference.cpp | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/conference/local-conference.cpp b/src/conference/local-conference.cpp index b07f17287..fe06f6464 100644 --- a/src/conference/local-conference.cpp +++ b/src/conference/local-conference.cpp @@ -21,6 +21,7 @@ #include "content/content-type.h" #include "handlers/local-conference-event-handler.h" #include "local-conference-p.h" +#include "logger/logger.h" #include "participant-p.h" #include "xml/resource-lists.h" @@ -46,8 +47,10 @@ LocalConference::~LocalConference () { void LocalConference::addParticipant (const IdentityAddress &addr, const CallSessionParams *params, bool hasMedia) { L_D(); shared_ptr participant = findParticipant(addr); - if (participant) + if (participant) { + lInfo() << "Not adding participant '" << addr.asString() << "' because it is already a participant of the LocalConference"; return; + } participant = make_shared(addr); participant->getPrivate()->createSession(*this, params, hasMedia, d->listener); d->participants.push_back(participant); diff --git a/src/conference/remote-conference.cpp b/src/conference/remote-conference.cpp index dd2a8a67d..ffdcde9ab 100644 --- a/src/conference/remote-conference.cpp +++ b/src/conference/remote-conference.cpp @@ -18,6 +18,7 @@ */ #include "handlers/remote-conference-event-handler.h" +#include "logger/logger.h" #include "participant-p.h" #include "remote-conference-p.h" #include "xml/resource-lists.h" @@ -47,8 +48,10 @@ RemoteConference::~RemoteConference () { void RemoteConference::addParticipant (const IdentityAddress &addr, const CallSessionParams *params, bool hasMedia) { L_D(); shared_ptr participant = findParticipant(addr); - if (participant) + if (participant) { + lInfo() << "Not adding participant '" << addr.asString() << "' because it is already a participant of the RemoteConference"; return; + } participant = make_shared(addr); participant->getPrivate()->createSession(*this, params, hasMedia, d->listener); d->participants.push_back(participant); From 4723f8d6162bb00e614077e88af71a3ca311cca6 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 14 Feb 2018 12:08:37 +0100 Subject: [PATCH 046/281] Cleaning in server group chat room stub. --- src/chat/chat-room/server-group-chat-room-p.h | 1 + .../chat-room/server-group-chat-room-stub.cpp | 16 +++++++++------- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/chat/chat-room/server-group-chat-room-p.h b/src/chat/chat-room/server-group-chat-room-p.h index 2780e0a08..724d32fb4 100644 --- a/src/chat/chat-room/server-group-chat-room-p.h +++ b/src/chat/chat-room/server-group-chat-room-p.h @@ -84,6 +84,7 @@ private: bool isAdminLeft () const; void queueMessage (const std::shared_ptr &message); void queueMessage (const std::shared_ptr &msg, const IdentityAddress &deviceAddress); + void removeLeftParticipants (const std::list &compatibleParticipants); void onParticipantDeviceLeft (const std::shared_ptr &session); diff --git a/src/chat/chat-room/server-group-chat-room-stub.cpp b/src/chat/chat-room/server-group-chat-room-stub.cpp index 57a4d2491..9f30159bd 100644 --- a/src/chat/chat-room/server-group-chat-room-stub.cpp +++ b/src/chat/chat-room/server-group-chat-room-stub.cpp @@ -42,11 +42,11 @@ shared_ptr ServerGroupChatRoomPrivate::findFilteredParticipant (con return nullptr; } -ParticipantDevice::State ServerGroupChatRoomPrivate::getParticipantDeviceState (const std::shared_ptr &device) const { +ParticipantDevice::State ServerGroupChatRoomPrivate::getParticipantDeviceState (const shared_ptr &device) const { return device->getState(); } -void ServerGroupChatRoomPrivate::setParticipantDeviceState (const std::shared_ptr &device, ParticipantDevice::State state) { +void ServerGroupChatRoomPrivate::setParticipantDeviceState (const shared_ptr &device, ParticipantDevice::State state) { device->setState(state); } @@ -90,23 +90,25 @@ LinphoneReason ServerGroupChatRoomPrivate::onSipMessageReceived (SalOp *, const void ServerGroupChatRoomPrivate::designateAdmin () {} -void ServerGroupChatRoomPrivate::dispatchMessage (const std::shared_ptr &message, const std::string &uri) {} +void ServerGroupChatRoomPrivate::dispatchMessage (const shared_ptr &message, const string &uri) {} void ServerGroupChatRoomPrivate::finalizeCreation () {} -void ServerGroupChatRoomPrivate::inviteDevice (const std::shared_ptr &device) {} +void ServerGroupChatRoomPrivate::inviteDevice (const shared_ptr &device) {} bool ServerGroupChatRoomPrivate::isAdminLeft () const { return false; } -void ServerGroupChatRoomPrivate::queueMessage (const std::shared_ptr &message) {} +void ServerGroupChatRoomPrivate::queueMessage (const shared_ptr &message) {} -void ServerGroupChatRoomPrivate::queueMessage (const std::shared_ptr &msg, const IdentityAddress &deviceAddress) {} +void ServerGroupChatRoomPrivate::queueMessage (const shared_ptr &msg, const IdentityAddress &deviceAddress) {} + +void ServerGroupChatRoomPrivate::removeLeftParticipants (const list &compatibleParticipants) {} // ----------------------------------------------------------------------------- -void ServerGroupChatRoomPrivate::onParticipantDeviceLeft (const std::shared_ptr &session) {} +void ServerGroupChatRoomPrivate::onParticipantDeviceLeft (const shared_ptr &session) {} // ----------------------------------------------------------------------------- From 3f4c6a5fa793abf70d07bd5087621939815a4cae Mon Sep 17 00:00:00 2001 From: Benjamin Reis Date: Wed, 14 Feb 2018 13:59:49 +0100 Subject: [PATCH 047/281] add boundary to multipart ocntent type --- src/content/content-manager.cpp | 2 -- src/content/content-type.cpp | 2 +- src/content/content-type.h | 3 +++ 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/content/content-manager.cpp b/src/content/content-manager.cpp index 0eb453329..ce6fe3545 100644 --- a/src/content/content-manager.cpp +++ b/src/content/content-manager.cpp @@ -23,8 +23,6 @@ #include "content-type.h" #include "content/content.h" -#define MULTIPART_BOUNDARY "---------------------------14737809831466499882746641449" - // ============================================================================= using namespace std; diff --git a/src/content/content-type.cpp b/src/content/content-type.cpp index 66b22e7f9..93e27859c 100644 --- a/src/content/content-type.cpp +++ b/src/content/content-type.cpp @@ -45,7 +45,7 @@ const ContentType ContentType::ExternalBody("message/external-body"); const ContentType ContentType::FileTransfer("application/vnd.gsma.rcs-ft-http+xml"); const ContentType ContentType::Imdn("message/imdn+xml"); const ContentType ContentType::ImIsComposing("application/im-iscomposing+xml"); -const ContentType ContentType::Multipart("multipart/mixed"); +const ContentType ContentType::Multipart("multipart/mixed;boundary=" MULTIPART_BOUNDARY); const ContentType ContentType::PlainText("text/plain"); const ContentType ContentType::ResourceLists("application/resource-lists+xml"); const ContentType ContentType::Sdp("application/sdp"); diff --git a/src/content/content-type.h b/src/content/content-type.h index d37168f08..473b0ab80 100644 --- a/src/content/content-type.h +++ b/src/content/content-type.h @@ -22,6 +22,9 @@ #include "object/clonable-object.h" + +#define MULTIPART_BOUNDARY "---------------------------14737809831466499882746641449" + // ============================================================================= LINPHONE_BEGIN_NAMESPACE From 7be8d6aa3e86aae17a0e14c433441a7ea942df86 Mon Sep 17 00:00:00 2001 From: Benjamin Reis Date: Wed, 14 Feb 2018 14:12:22 +0100 Subject: [PATCH 048/281] do not return 'nullptr' as a string --- src/chat/notification/imdn.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/chat/notification/imdn.cpp b/src/chat/notification/imdn.cpp index b3412ce12..eceda4c11 100644 --- a/src/chat/notification/imdn.cpp +++ b/src/chat/notification/imdn.cpp @@ -40,7 +40,8 @@ string Imdn::createXml (const string &id, time_t time, Imdn::Type imdnType, Linp char *datetime = nullptr; // Check that the chat message has a message id. - if (id.empty()) return nullptr; + if (id.empty()) + return content; buf = xmlBufferCreate(); if (buf == nullptr) { From 0e61ad55729e9148bdeb1fc6fae1f923fdf22170 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 14 Feb 2018 14:15:46 +0100 Subject: [PATCH 049/281] Added tests for unread count on ChatRoom --- tester/message_tester.c | 48 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/tester/message_tester.c b/tester/message_tester.c index 7a7adaa1f..bdcafa835 100644 --- a/tester/message_tester.c +++ b/tester/message_tester.c @@ -2282,6 +2282,52 @@ void im_encryption_engine_b64_async(void) { im_encryption_engine_b64_base(TRUE); } +void unread_message_count(void) { + LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc"); + LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc"); + + text_message_base(marie, pauline); + + BC_ASSERT_PTR_NOT_NULL(marie->stat.last_received_chat_message); + if (marie->stat.last_received_chat_message != NULL) { + LinphoneChatRoom *marie_room = linphone_chat_message_get_chat_room(marie->stat.last_received_chat_message); + BC_ASSERT_EQUAL(1, linphone_chat_room_get_unread_messages_count(marie_room), int, "%d"); + linphone_chat_room_mark_as_read(marie_room); + BC_ASSERT_EQUAL(0, linphone_chat_room_get_unread_messages_count(marie_room), int, "%d"); + } + + linphone_core_manager_destroy(marie); + linphone_core_manager_destroy(pauline); +} + +static void message_received_callback(LinphoneCore *lc, LinphoneChatRoom *room, LinphoneChatMessage* msg) { + BC_ASSERT_PTR_NOT_NULL(room); + BC_ASSERT_EQUAL(1, linphone_chat_room_get_unread_messages_count(room), int, "%d"); + BC_ASSERT_PTR_NOT_NULL(msg); + if (room != NULL) { + linphone_chat_room_mark_as_read(room); + } + BC_ASSERT_EQUAL(0, linphone_chat_room_get_unread_messages_count(room), int, "%d"); +} + +void unread_message_count_callback(void) { + LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc"); + LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc"); + int dummy = 0; + + LinphoneCoreCbs *cbs = linphone_factory_create_core_cbs(linphone_factory_get()); + linphone_core_cbs_set_message_received(cbs, message_received_callback); + linphone_core_add_callbacks(marie->lc, cbs); + + text_message_base(marie, pauline); + + wait_for_until(pauline->lc, marie->lc, &dummy, 1, 5000); + + linphone_core_cbs_unref(cbs); + linphone_core_manager_destroy(marie); + linphone_core_manager_destroy(pauline); +} + test_t message_tests[] = { TEST_NO_TAG("Text message", text_message), TEST_NO_TAG("Text message with credentials from auth callback", text_message_with_credential_from_auth_callback), @@ -2305,6 +2351,8 @@ test_t message_tests[] = { TEST_NO_TAG("IMDN notifications", imdn_notifications), TEST_NO_TAG("IM notification policy", im_notification_policy), #ifdef SQLITE_STORAGE_ENABLED + TEST_NO_TAG("Unread message count", unread_message_count), + TEST_NO_TAG("Unread message count in callback", unread_message_count_callback), TEST_ONE_TAG("IsComposing notification lime", is_composing_notification_with_lime, "LIME"), TEST_ONE_TAG("IMDN notifications with lime", imdn_notifications_with_lime, "LIME"), TEST_ONE_TAG("IM notification policy with lime", im_notification_policy_with_lime, "LIME"), From 01e4b753cb5fe41d4f8f51a929eed8f595ef1221 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 14 Feb 2018 14:21:50 +0100 Subject: [PATCH 050/281] Better fix for multipart boundary in content type --- src/content/content-manager.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/content/content-manager.cpp b/src/content/content-manager.cpp index ce6fe3545..5d6c66139 100644 --- a/src/content/content-manager.cpp +++ b/src/content/content-manager.cpp @@ -94,7 +94,9 @@ Content ContentManager::contentListToMultipart (const list &contents) { Content content; content.setBody(desc); - content.setContentType(ContentType::Multipart); + ContentType contentType = ContentType::Multipart; + contentType.setParameter("boundary=" + boundary); + content.setContentType(contentType); belle_sip_free(desc); belle_sip_object_unref(mpbh); From a4614bf48269e9e59fd25d9f02e94d4ab8f1a3ed Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 14 Feb 2018 14:21:52 +0100 Subject: [PATCH 051/281] Revert "add boundary to multipart ocntent type" This reverts commit 3f4c6a5fa793abf70d07bd5087621939815a4cae. --- src/content/content-manager.cpp | 2 ++ src/content/content-type.cpp | 2 +- src/content/content-type.h | 3 --- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/content/content-manager.cpp b/src/content/content-manager.cpp index 5d6c66139..46cc01c28 100644 --- a/src/content/content-manager.cpp +++ b/src/content/content-manager.cpp @@ -23,6 +23,8 @@ #include "content-type.h" #include "content/content.h" +#define MULTIPART_BOUNDARY "---------------------------14737809831466499882746641449" + // ============================================================================= using namespace std; diff --git a/src/content/content-type.cpp b/src/content/content-type.cpp index 93e27859c..66b22e7f9 100644 --- a/src/content/content-type.cpp +++ b/src/content/content-type.cpp @@ -45,7 +45,7 @@ const ContentType ContentType::ExternalBody("message/external-body"); const ContentType ContentType::FileTransfer("application/vnd.gsma.rcs-ft-http+xml"); const ContentType ContentType::Imdn("message/imdn+xml"); const ContentType ContentType::ImIsComposing("application/im-iscomposing+xml"); -const ContentType ContentType::Multipart("multipart/mixed;boundary=" MULTIPART_BOUNDARY); +const ContentType ContentType::Multipart("multipart/mixed"); const ContentType ContentType::PlainText("text/plain"); const ContentType ContentType::ResourceLists("application/resource-lists+xml"); const ContentType ContentType::Sdp("application/sdp"); diff --git a/src/content/content-type.h b/src/content/content-type.h index 473b0ab80..d37168f08 100644 --- a/src/content/content-type.h +++ b/src/content/content-type.h @@ -22,9 +22,6 @@ #include "object/clonable-object.h" - -#define MULTIPART_BOUNDARY "---------------------------14737809831466499882746641449" - // ============================================================================= LINPHONE_BEGIN_NAMESPACE From 3ffbfbdafe06762336b859528b3e2a3435b37d28 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 14 Feb 2018 14:24:05 +0100 Subject: [PATCH 052/281] Fixed compil --- src/chat/modifier/multipart-chat-message-modifier.cpp | 2 +- src/content/content-manager.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/chat/modifier/multipart-chat-message-modifier.cpp b/src/chat/modifier/multipart-chat-message-modifier.cpp index 4abf91210..243cb32e1 100644 --- a/src/chat/modifier/multipart-chat-message-modifier.cpp +++ b/src/chat/modifier/multipart-chat-message-modifier.cpp @@ -59,7 +59,7 @@ ChatMessageModifier::Result MultipartChatMessageModifier::encode ( multipartMessage << "--"; Content newContent; - ContentType newContentType("multipart/mixed"); + ContentType newContentType(ContentType::Multipart); newContentType.setParameter("boundary=" + boundary); newContent.setContentType(newContentType); newContent.setBody(multipartMessage.str()); diff --git a/src/content/content-manager.cpp b/src/content/content-manager.cpp index 46cc01c28..1381f8dc1 100644 --- a/src/content/content-manager.cpp +++ b/src/content/content-manager.cpp @@ -97,7 +97,7 @@ Content ContentManager::contentListToMultipart (const list &contents) { Content content; content.setBody(desc); ContentType contentType = ContentType::Multipart; - contentType.setParameter("boundary=" + boundary); + contentType.setParameter("boundary=" + MULTIPART_BOUNDARY); content.setContentType(contentType); belle_sip_free(desc); From d0da718ac4e154a59fd3e8f595881767f006e826 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 14 Feb 2018 14:27:26 +0100 Subject: [PATCH 053/281] Real compil fix --- src/content/content-manager.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/content/content-manager.cpp b/src/content/content-manager.cpp index 1381f8dc1..fea82b66c 100644 --- a/src/content/content-manager.cpp +++ b/src/content/content-manager.cpp @@ -97,7 +97,8 @@ Content ContentManager::contentListToMultipart (const list &contents) { Content content; content.setBody(desc); ContentType contentType = ContentType::Multipart; - contentType.setParameter("boundary=" + MULTIPART_BOUNDARY); + string boundary = "boundary=" + string(MULTIPART_BOUNDARY); + contentType.setParameter(boundary); content.setContentType(contentType); belle_sip_free(desc); From c20c54a2846941a80a4118bdaae2952d00db29d8 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Wed, 14 Feb 2018 15:01:24 +0100 Subject: [PATCH 054/281] feat(MainDb): improve performance of selectSipAddressId and selectChatRoomId --- src/db/abstract/abstract-db.cpp | 1 + src/db/main-db-p.h | 10 +++-- src/db/main-db.cpp | 78 ++++++++++++++++++++++++++++----- 3 files changed, 75 insertions(+), 14 deletions(-) diff --git a/src/db/abstract/abstract-db.cpp b/src/db/abstract/abstract-db.cpp index ed6295891..54d63ceb1 100644 --- a/src/db/abstract/abstract-db.cpp +++ b/src/db/abstract/abstract-db.cpp @@ -92,6 +92,7 @@ bool AbstractDb::forceReconnect () { try { lInfo() << "Reconnect... Try: " << i; session->reconnect(); + init(); lInfo() << "Database reconnection successful!"; return true; } catch (const soci::soci_error &e) { diff --git a/src/db/main-db-p.h b/src/db/main-db-p.h index 5d4dd4e57..81e5535b4 100644 --- a/src/db/main-db-p.h +++ b/src/db/main-db-p.h @@ -28,20 +28,22 @@ // ============================================================================= -namespace soci { - class row; -} - LINPHONE_BEGIN_NAMESPACE class Content; class MainDbPrivate : public AbstractDbPrivate { public: + struct Statements; + mutable std::unordered_map> storageIdToEvent; mutable std::unordered_map> storageIdToChatMessage; private: + std::unique_ptr statements; + + void initStatements (); + // --------------------------------------------------------------------------- // Low level API. // --------------------------------------------------------------------------- diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 84ec4112c..0015c1947 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -281,6 +281,59 @@ static constexpr string &blobToString (string &in) { return in; } +// ----------------------------------------------------------------------------- +// Statements and helpers. +// ----------------------------------------------------------------------------- + +class StatementBind { +public: + StatementBind (soci::statement &stmt) : mStmt(stmt) {} + + ~StatementBind () { + mStmt.bind_clean_up(); + } + + template + void bind (const T &var, const char *name) { + mStmt.exchange(soci::use(var, name)); + } + + template + void bindResult (T &var) { + mStmt.exchange(soci::into(var)); + } + + bool exec () { + mStmt.define_and_bind(); + return mStmt.execute(true); + } + +private: + soci::statement &mStmt; +}; + +static inline unique_ptr makeStatement (soci::session &session, const char *stmt) { + return makeUnique(session.prepare << stmt); +} + +struct MainDbPrivate::Statements { + typedef unique_ptr Statement; + + Statement selectSipAddressId; + Statement selectChatRoomId; +}; + +void MainDbPrivate::initStatements () { + soci::session *session = dbSession.getBackendSession(); + statements = makeUnique(); + + statements->selectSipAddressId = makeStatement(*session, "SELECT id FROM sip_address WHERE value = :sipAddress"); + statements->selectChatRoomId = makeStatement( + *session, + "SELECT id FROM chat_room WHERE peer_sip_address_id = :peerSipAddressId AND local_sip_address_id = :localSipAddressId" + ); +} + // ----------------------------------------------------------------------------- long long MainDbPrivate::insertSipAddress (const string &sipAddress) { @@ -481,21 +534,24 @@ void MainDbPrivate::insertChatMessageParticipant (long long eventId, long long s // ----------------------------------------------------------------------------- long long MainDbPrivate::selectSipAddressId (const string &sipAddress) const { - soci::session *session = dbSession.getBackendSession(); - long long id; - *session << "SELECT id FROM sip_address WHERE value = :sipAddress", soci::use(sipAddress), soci::into(id); - return session->got_data() ? id : -1; + + StatementBind stmt(*statements->selectSipAddressId); + stmt.bind(sipAddress, "sipAddress"); + stmt.bindResult(id); + + return stmt.exec() ? id : -1; } long long MainDbPrivate::selectChatRoomId (long long peerSipAddressId, long long localSipAddressId) const { - soci::session *session = dbSession.getBackendSession(); - long long id; - *session << "SELECT id FROM chat_room" - " WHERE peer_sip_address_id = :peerSipAddressId AND local_sip_address_id = :localSipAddressId", - soci::use(peerSipAddressId), soci::use(localSipAddressId), soci::into(id); - return session->got_data() ? id : -1; + + StatementBind stmt(*statements->selectChatRoomId); + stmt.bind(peerSipAddressId, "peerSipAddressId"); + stmt.bind(localSipAddressId, "localSipAddressId"); + stmt.bindResult(id); + + return stmt.exec() ? id : -1; } long long MainDbPrivate::selectChatRoomId (const ChatRoomId &chatRoomId) const { @@ -1768,6 +1824,8 @@ void MainDb::init () { d->updateModuleVersion("events", ModuleVersionEvents); d->updateModuleVersion("friends", ModuleVersionFriends); + + d->initStatements(); } bool MainDb::addEvent (const shared_ptr &eventLog) { From afe6bca958697190345256658ee7496f2d9caf60 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Wed, 14 Feb 2018 16:46:27 +0100 Subject: [PATCH 055/281] feat(MainDb): better performances --- src/db/main-db.cpp | 123 ++++++++++++++++++++++++++++----------------- 1 file changed, 78 insertions(+), 45 deletions(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 0015c1947..6c4968657 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -294,21 +294,36 @@ public: } template - void bind (const T &var, const char *name) { - mStmt.exchange(soci::use(var, name)); + StatementBind &in (const T &var) { + mStmt.exchange(soci::use(var)); + return *this; } template - void bindResult (T &var) { + StatementBind &out (T &var) { mStmt.exchange(soci::into(var)); + return *this; + } + + StatementBind &out (soci::row &row) { + mUseRow = true; + mStmt.define_and_bind(); + mStmt.exchange_for_rowset(soci::into(row)); + return *this; + } + + soci::statement &getStatement () const { + return mStmt; } bool exec () { - mStmt.define_and_bind(); + if (!mUseRow) + mStmt.define_and_bind(); return mStmt.execute(true); } private: + bool mUseRow = false; soci::statement &mStmt; }; @@ -321,6 +336,10 @@ struct MainDbPrivate::Statements { Statement selectSipAddressId; Statement selectChatRoomId; + + Statement selectConferenceChatMessageEvent; + Statement selectConferenceChatMessageContent; + Statement selectConferenceChatMessageFileContent; }; void MainDbPrivate::initStatements () { @@ -332,6 +351,29 @@ void MainDbPrivate::initStatements () { *session, "SELECT id FROM chat_room WHERE peer_sip_address_id = :peerSipAddressId AND local_sip_address_id = :localSipAddressId" ); + + statements->selectConferenceChatMessageEvent = makeStatement( + *session, + "SELECT from_sip_address.value, to_sip_address.value, time, imdn_message_id, state, direction, is_secured" + " FROM event, conference_chat_message_event, sip_address AS from_sip_address, sip_address AS to_sip_address" + " WHERE event_id = :eventId" + " AND event_id = event.id" + " AND from_sip_address_id = from_sip_address.id" + " AND to_sip_address_id = to_sip_address.id" + ); + + statements->selectConferenceChatMessageContent = makeStatement( + *session, + "SELECT chat_message_content.id, content_type.id, content_type.value, body" + " FROM chat_message_content, content_type" + " WHERE event_id = :eventId AND content_type_id = content_type.id" + ); + + statements->selectConferenceChatMessageFileContent = makeStatement( + *session, + "SELECT name, size, path FROM chat_message_file_content" + " WHERE chat_message_content_id = :contentId" + ); } // ----------------------------------------------------------------------------- @@ -535,23 +577,14 @@ void MainDbPrivate::insertChatMessageParticipant (long long eventId, long long s long long MainDbPrivate::selectSipAddressId (const string &sipAddress) const { long long id; - - StatementBind stmt(*statements->selectSipAddressId); - stmt.bind(sipAddress, "sipAddress"); - stmt.bindResult(id); - - return stmt.exec() ? id : -1; + return StatementBind(*statements->selectSipAddressId) + .in(sipAddress).out(id).exec() ? id : -1; } long long MainDbPrivate::selectChatRoomId (long long peerSipAddressId, long long localSipAddressId) const { long long id; - - StatementBind stmt(*statements->selectChatRoomId); - stmt.bind(peerSipAddressId, "peerSipAddressId"); - stmt.bind(localSipAddressId, "localSipAddressId"); - stmt.bindResult(id); - - return stmt.exec() ? id : -1; + return StatementBind(*statements->selectChatRoomId) + .in(peerSipAddressId).in(localSipAddressId).out(id).exec() ? id : -1; } long long MainDbPrivate::selectChatRoomId (const ChatRoomId &chatRoomId) const { @@ -706,21 +739,18 @@ shared_ptr MainDbPrivate::selectConferenceChatMessageEvent ( ) const { L_Q(); - shared_ptr core = q->getCore(); - shared_ptr chatRoom = core->findChatRoom(chatRoomId); - if (!chatRoom) { - lError() << "Unable to find chat room storage id of (peer=" + - chatRoomId.getPeerAddress().asString() + - ", local=" + chatRoomId.getLocalAddress().asString() + "`)."; + shared_ptr chatRoom = q->getCore()->findChatRoom(chatRoomId); + if (!chatRoom) return nullptr; - } - - bool hasFileTransferContent = false; // 1 - Fetch chat message. shared_ptr chatMessage = getChatMessageFromCache(eventId); if (chatMessage) - goto end; + return make_shared( + creationTime, + chatMessage + ); + { string fromSipAddress; string toSipAddress; @@ -733,15 +763,16 @@ shared_ptr MainDbPrivate::selectConferenceChatMessageEvent ( int direction; int isSecured; - soci::session *session = dbSession.getBackendSession(); - *session << "SELECT from_sip_address.value, to_sip_address.value, time, imdn_message_id, state, direction, is_secured" - " FROM event, conference_chat_message_event, sip_address AS from_sip_address, sip_address AS to_sip_address" - " WHERE event_id = :eventId" - " AND event_id = event.id" - " AND from_sip_address_id = from_sip_address.id" - " AND to_sip_address_id = to_sip_address.id", soci::into(fromSipAddress), soci::into(toSipAddress), - soci::into(messageTime), soci::into(imdnMessageId), soci::into(state), soci::into(direction), - soci::into(isSecured), soci::use(eventId); + StatementBind(*statements->selectConferenceChatMessageEvent) + .in(eventId) + .out(fromSipAddress) + .out(toSipAddress) + .out(messageTime) + .out(imdnMessageId) + .out(state) + .out(direction) + .out(isSecured) + .exec(); chatMessage = shared_ptr(new ChatMessage( chatRoom, @@ -760,13 +791,17 @@ shared_ptr MainDbPrivate::selectConferenceChatMessageEvent ( } // 2 - Fetch contents. + bool hasFileTransferContent = false; { soci::session *session = dbSession.getBackendSession(); - static const string query = "SELECT chat_message_content.id, content_type.id, content_type.value, body" - " FROM chat_message_content, content_type" - " WHERE event_id = :eventId AND content_type_id = content_type.id"; - soci::rowset rows = (session->prepare << query, soci::use(eventId)); - for (const auto &row : rows) { + + soci::row row; + StatementBind stmtBind(*statements->selectConferenceChatMessageContent); + stmtBind.in(eventId).out(row).exec(); + + for (soci::rowset_iterator it(stmtBind.getStatement(), row), end; it != end; ++it) { + const soci::row &row = *it; + ContentType contentType(row.get(2)); const long long &contentId = dbSession.resolveId(row, 0); Content *content; @@ -781,9 +816,8 @@ shared_ptr MainDbPrivate::selectConferenceChatMessageEvent ( int size; string path; - *session << "SELECT name, size, path FROM chat_message_file_content" - " WHERE chat_message_content_id = :contentId", - soci::into(name), soci::into(size), soci::into(path), soci::use(contentId); + StatementBind(*statements->selectConferenceChatMessageFileContent) + .in(contentId).out(name).out(size).out(path).exec(); FileContent *fileContent = new FileContent(); fileContent->setFileName(name); @@ -816,7 +850,6 @@ shared_ptr MainDbPrivate::selectConferenceChatMessageEvent ( cache(chatMessage, eventId); -end: return make_shared( creationTime, chatMessage From 25d05ede90de719fbb4ef1eb0654ac867cc213e6 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Wed, 14 Feb 2018 16:52:51 +0100 Subject: [PATCH 056/281] Revert "feat(MainDb): better performances" This reverts commit afe6bca958697190345256658ee7496f2d9caf60. --- src/db/main-db.cpp | 123 +++++++++++++++++---------------------------- 1 file changed, 45 insertions(+), 78 deletions(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 6c4968657..0015c1947 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -294,36 +294,21 @@ public: } template - StatementBind &in (const T &var) { - mStmt.exchange(soci::use(var)); - return *this; + void bind (const T &var, const char *name) { + mStmt.exchange(soci::use(var, name)); } template - StatementBind &out (T &var) { + void bindResult (T &var) { mStmt.exchange(soci::into(var)); - return *this; - } - - StatementBind &out (soci::row &row) { - mUseRow = true; - mStmt.define_and_bind(); - mStmt.exchange_for_rowset(soci::into(row)); - return *this; - } - - soci::statement &getStatement () const { - return mStmt; } bool exec () { - if (!mUseRow) - mStmt.define_and_bind(); + mStmt.define_and_bind(); return mStmt.execute(true); } private: - bool mUseRow = false; soci::statement &mStmt; }; @@ -336,10 +321,6 @@ struct MainDbPrivate::Statements { Statement selectSipAddressId; Statement selectChatRoomId; - - Statement selectConferenceChatMessageEvent; - Statement selectConferenceChatMessageContent; - Statement selectConferenceChatMessageFileContent; }; void MainDbPrivate::initStatements () { @@ -351,29 +332,6 @@ void MainDbPrivate::initStatements () { *session, "SELECT id FROM chat_room WHERE peer_sip_address_id = :peerSipAddressId AND local_sip_address_id = :localSipAddressId" ); - - statements->selectConferenceChatMessageEvent = makeStatement( - *session, - "SELECT from_sip_address.value, to_sip_address.value, time, imdn_message_id, state, direction, is_secured" - " FROM event, conference_chat_message_event, sip_address AS from_sip_address, sip_address AS to_sip_address" - " WHERE event_id = :eventId" - " AND event_id = event.id" - " AND from_sip_address_id = from_sip_address.id" - " AND to_sip_address_id = to_sip_address.id" - ); - - statements->selectConferenceChatMessageContent = makeStatement( - *session, - "SELECT chat_message_content.id, content_type.id, content_type.value, body" - " FROM chat_message_content, content_type" - " WHERE event_id = :eventId AND content_type_id = content_type.id" - ); - - statements->selectConferenceChatMessageFileContent = makeStatement( - *session, - "SELECT name, size, path FROM chat_message_file_content" - " WHERE chat_message_content_id = :contentId" - ); } // ----------------------------------------------------------------------------- @@ -577,14 +535,23 @@ void MainDbPrivate::insertChatMessageParticipant (long long eventId, long long s long long MainDbPrivate::selectSipAddressId (const string &sipAddress) const { long long id; - return StatementBind(*statements->selectSipAddressId) - .in(sipAddress).out(id).exec() ? id : -1; + + StatementBind stmt(*statements->selectSipAddressId); + stmt.bind(sipAddress, "sipAddress"); + stmt.bindResult(id); + + return stmt.exec() ? id : -1; } long long MainDbPrivate::selectChatRoomId (long long peerSipAddressId, long long localSipAddressId) const { long long id; - return StatementBind(*statements->selectChatRoomId) - .in(peerSipAddressId).in(localSipAddressId).out(id).exec() ? id : -1; + + StatementBind stmt(*statements->selectChatRoomId); + stmt.bind(peerSipAddressId, "peerSipAddressId"); + stmt.bind(localSipAddressId, "localSipAddressId"); + stmt.bindResult(id); + + return stmt.exec() ? id : -1; } long long MainDbPrivate::selectChatRoomId (const ChatRoomId &chatRoomId) const { @@ -739,18 +706,21 @@ shared_ptr MainDbPrivate::selectConferenceChatMessageEvent ( ) const { L_Q(); - shared_ptr chatRoom = q->getCore()->findChatRoom(chatRoomId); - if (!chatRoom) + shared_ptr core = q->getCore(); + shared_ptr chatRoom = core->findChatRoom(chatRoomId); + if (!chatRoom) { + lError() << "Unable to find chat room storage id of (peer=" + + chatRoomId.getPeerAddress().asString() + + ", local=" + chatRoomId.getLocalAddress().asString() + "`)."; return nullptr; + } + + bool hasFileTransferContent = false; // 1 - Fetch chat message. shared_ptr chatMessage = getChatMessageFromCache(eventId); if (chatMessage) - return make_shared( - creationTime, - chatMessage - ); - + goto end; { string fromSipAddress; string toSipAddress; @@ -763,16 +733,15 @@ shared_ptr MainDbPrivate::selectConferenceChatMessageEvent ( int direction; int isSecured; - StatementBind(*statements->selectConferenceChatMessageEvent) - .in(eventId) - .out(fromSipAddress) - .out(toSipAddress) - .out(messageTime) - .out(imdnMessageId) - .out(state) - .out(direction) - .out(isSecured) - .exec(); + soci::session *session = dbSession.getBackendSession(); + *session << "SELECT from_sip_address.value, to_sip_address.value, time, imdn_message_id, state, direction, is_secured" + " FROM event, conference_chat_message_event, sip_address AS from_sip_address, sip_address AS to_sip_address" + " WHERE event_id = :eventId" + " AND event_id = event.id" + " AND from_sip_address_id = from_sip_address.id" + " AND to_sip_address_id = to_sip_address.id", soci::into(fromSipAddress), soci::into(toSipAddress), + soci::into(messageTime), soci::into(imdnMessageId), soci::into(state), soci::into(direction), + soci::into(isSecured), soci::use(eventId); chatMessage = shared_ptr(new ChatMessage( chatRoom, @@ -791,17 +760,13 @@ shared_ptr MainDbPrivate::selectConferenceChatMessageEvent ( } // 2 - Fetch contents. - bool hasFileTransferContent = false; { soci::session *session = dbSession.getBackendSession(); - - soci::row row; - StatementBind stmtBind(*statements->selectConferenceChatMessageContent); - stmtBind.in(eventId).out(row).exec(); - - for (soci::rowset_iterator it(stmtBind.getStatement(), row), end; it != end; ++it) { - const soci::row &row = *it; - + static const string query = "SELECT chat_message_content.id, content_type.id, content_type.value, body" + " FROM chat_message_content, content_type" + " WHERE event_id = :eventId AND content_type_id = content_type.id"; + soci::rowset rows = (session->prepare << query, soci::use(eventId)); + for (const auto &row : rows) { ContentType contentType(row.get(2)); const long long &contentId = dbSession.resolveId(row, 0); Content *content; @@ -816,8 +781,9 @@ shared_ptr MainDbPrivate::selectConferenceChatMessageEvent ( int size; string path; - StatementBind(*statements->selectConferenceChatMessageFileContent) - .in(contentId).out(name).out(size).out(path).exec(); + *session << "SELECT name, size, path FROM chat_message_file_content" + " WHERE chat_message_content_id = :contentId", + soci::into(name), soci::into(size), soci::into(path), soci::use(contentId); FileContent *fileContent = new FileContent(); fileContent->setFileName(name); @@ -850,6 +816,7 @@ shared_ptr MainDbPrivate::selectConferenceChatMessageEvent ( cache(chatMessage, eventId); +end: return make_shared( creationTime, chatMessage From 38fed6a292519e61776fa6d0129490eeaa31bffb Mon Sep 17 00:00:00 2001 From: Erwan Croze Date: Wed, 14 Feb 2018 17:12:50 +0100 Subject: [PATCH 057/281] Adding C API + first test --- include/CMakeLists.txt | 2 + include/linphone/api/c-api.h | 2 + include/linphone/api/c-magic-search.h | 121 +++++++++++++++++ include/linphone/api/c-search-result.h | 67 ++++++++++ include/linphone/api/c-types.h | 12 ++ include/linphone/utils/utils.h | 2 + src/CMakeLists.txt | 8 ++ src/c-wrapper/api/c-magic-search.cpp | 86 ++++++++++++ src/c-wrapper/api/c-search-result.cpp | 44 +++++++ src/c-wrapper/c-wrapper.h | 4 +- src/search/magic-search-p.h | 42 ++++++ src/search/magic-search.cpp | 174 +++++++++++++++++++++++++ src/search/magic-search.h | 119 +++++++++++++++++ src/search/search-result-p.h | 42 ++++++ src/search/search-result.cpp | 66 ++++++++++ src/search/search-result.h | 63 +++++++++ src/utils/utils.cpp | 1 + tester/setup_tester.c | 29 ++++- 18 files changed, 882 insertions(+), 2 deletions(-) create mode 100644 include/linphone/api/c-magic-search.h create mode 100644 include/linphone/api/c-search-result.h create mode 100644 src/c-wrapper/api/c-magic-search.cpp create mode 100644 src/c-wrapper/api/c-search-result.cpp create mode 100644 src/search/magic-search-p.h create mode 100644 src/search/magic-search.cpp create mode 100644 src/search/magic-search.h create mode 100644 src/search/search-result-p.h create mode 100644 src/search/search-result.cpp create mode 100644 src/search/search-result.h diff --git a/include/CMakeLists.txt b/include/CMakeLists.txt index 055f1840d..92593391a 100644 --- a/include/CMakeLists.txt +++ b/include/CMakeLists.txt @@ -86,7 +86,9 @@ set(C_API_HEADER_FILES c-chat-room.h c-dial-plan.h c-event-log.h + c-magic-search.h c-participant.h + c-search-result.h c-types.h ) diff --git a/include/linphone/api/c-api.h b/include/linphone/api/c-api.h index 0b671d6ee..039b55246 100644 --- a/include/linphone/api/c-api.h +++ b/include/linphone/api/c-api.h @@ -34,6 +34,8 @@ #include "linphone/api/c-dial-plan.h" #include "linphone/api/c-event-log.h" #include "linphone/api/c-participant.h" +#include "linphone/api/c-magic-search.h" +#include "linphone/api/c-search-result.h" #include "linphone/api/c-types.h" #endif // ifndef _L_C_API_H_ diff --git a/include/linphone/api/c-magic-search.h b/include/linphone/api/c-magic-search.h new file mode 100644 index 000000000..6637b64e8 --- /dev/null +++ b/include/linphone/api/c-magic-search.h @@ -0,0 +1,121 @@ +/* + * c-magic-search.h + * Copyright (C) 2010-2018 Belledonne Communications SARL + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _L_C_MAGIC_SEARCH_H_ +#define _L_C_MAGIC_SEARCH_H_ + +#include "linphone/api/c-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @addtogroup misc + * @{ + */ + +/** + * Constructs a LinphoneMagicSearch object + **/ +LINPHONE_PUBLIC LinphoneMagicSearch *linphone_magic_search_new(LinphoneCore *lc); + +/** + * Increment reference count of LinphoneMagicSearch object. + **/ +LINPHONE_PUBLIC LinphoneMagicSearch *linphone_magic_search_ref(LinphoneMagicSearch *magicSearch); + +/** + * Decrement reference count of LinphoneMagicSearch object. When dropped to zero, memory is freed. + **/ +LINPHONE_PUBLIC void linphone_magic_search_unref(LinphoneMagicSearch *magicSearch); + +/** + * Set the minimum value used to calculate the weight in search + * @param[in] weight minimum weight + **/ +LINPHONE_PUBLIC void linphone_magic_search_set_min_weight(LinphoneMagicSearch *magicSearch, const unsigned int weight); + +/** + * @return the minimum value used to calculate the weight in search + **/ +LINPHONE_PUBLIC unsigned int linphone_magic_search_get_min_weight(const LinphoneMagicSearch *magicSearch); + +/** + * Set the maximum value used to calculate the weight in search + * @param[in] weight maximum weight + **/ +LINPHONE_PUBLIC void linphone_magic_search_set_max_weight(LinphoneMagicSearch *magicSearch, const unsigned int weight); + +/** + * @return the maximum value used to calculate the weight in search + **/ +LINPHONE_PUBLIC unsigned int linphone_magic_search_get_max_weight(const LinphoneMagicSearch *magicSearch); + +/** + * @return the delimiter used to find matched filter word + **/ +LINPHONE_PUBLIC const char *linphone_magic_search_get_delimiter(const LinphoneMagicSearch *magicSearch); + +/** + * Set the delimiter used to find matched filter word + * @param[in] delimiter delimiter (example "-_.,") + **/ +LINPHONE_PUBLIC void linphone_magic_search_set_delimiter(LinphoneMagicSearch *magicSearch, const char *delimiter); + +/** + * @return the number of the maximum SearchResult which will be return + **/ +LINPHONE_PUBLIC unsigned int linphone_magic_search_get_search_limit(const LinphoneMagicSearch *magicSearch); + +/** + * Set the number of the maximum SearchResult which will be return + * @param[in] limit + **/ +LINPHONE_PUBLIC void linphone_magic_search_set_search_limit(LinphoneMagicSearch *magicSearch, const unsigned int limit); + +/** + * @return if the search is limited + **/ +LINPHONE_PUBLIC bool_t linphone_magic_search_get_limited_search(const LinphoneMagicSearch *magicSearch); + +/** + * Enable or disable the limited search + * @param[in] limited + **/ +LINPHONE_PUBLIC void linphone_magic_search_set_limited_search(LinphoneMagicSearch *magicSearch, const bool_t limited); + +/** + * Create a sorted list of SearchResult from SipUri, Contact name, + * Contact displayname, Contact phone number, which match with a filter word + * @param[in] filter word we search + * @param[in] withDomain domain which we want to search only + * @return sorted list of \bctbx_list{LinphoneSearchResult} + **/ +LINPHONE_PUBLIC bctbx_list_t* linphone_magic_search_get_contact_list_from_filter(const LinphoneMagicSearch *magicSearch, const char *filter, const char *withDomain); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif // _L_C_MAGIC_SEARCH_H_ diff --git a/include/linphone/api/c-search-result.h b/include/linphone/api/c-search-result.h new file mode 100644 index 000000000..98b858993 --- /dev/null +++ b/include/linphone/api/c-search-result.h @@ -0,0 +1,67 @@ +/* + * c-search-result.h + * Copyright (C) 2010-2018 Belledonne Communications SARL + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _L_C_SEARCH_RESULT_H_ +#define _L_C_SEARCH_RESULT_H_ + +#include "linphone/api/c-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @addtogroup misc + * @{ + */ + +/** + * Increment reference count of LinphoneSearchResult object. + **/ +LINPHONE_PUBLIC LinphoneSearchResult *linphone_search_result_ref(LinphoneSearchResult *searchResult); + +/** + * Decrement reference count of LinphoneSearchResult object. When dropped to zero, memory is freed. + **/ +LINPHONE_PUBLIC void linphone_search_result_unref(LinphoneSearchResult *searchResult); + +/** + * @return LinphoneFriend associed + **/ +LINPHONE_PUBLIC const LinphoneFriend* linphone_search_result_get_friend(LinphoneSearchResult *searchResult); + +/** + * @return LinphoneAddress associed + **/ +LINPHONE_PUBLIC const LinphoneAddress* linphone_search_result_get_address(LinphoneSearchResult *searchResult); + +/** + * @return the result weight + **/ +LINPHONE_PUBLIC unsigned int linphone_search_result_get_weight(LinphoneSearchResult *searchResult); + +/** + * @} + */ + +#ifdef __cplusplus +} +#endif + +#endif // _L_C_SEARCH_RESULT_H_ diff --git a/include/linphone/api/c-types.h b/include/linphone/api/c-types.h index 6c109375f..f587b77f8 100644 --- a/include/linphone/api/c-types.h +++ b/include/linphone/api/c-types.h @@ -150,12 +150,24 @@ typedef struct _LinphoneEventLog LinphoneEventLog; **/ typedef struct _LinphoneDialPlan LinphoneDialPlan; +/** + * A LinphoneMagicSearch is used to do specifics searchs + * @ingroup misc +**/ +typedef struct _LinphoneMagicSearch LinphoneMagicSearch; + /** * The LinphoneParticipant object represents a participant of a conference. * @ingroup misc **/ typedef struct _LinphoneParticipant LinphoneParticipant; +/** + * The LinphoneSearchResult object represents a result of a search + * @ingroup misc + **/ +typedef struct _LinphoneSearchResult LinphoneSearchResult; + // ============================================================================= // C Enums. // ============================================================================= diff --git a/include/linphone/utils/utils.h b/include/linphone/utils/utils.h index 9e853e25a..7200ec935 100644 --- a/include/linphone/utils/utils.h +++ b/include/linphone/utils/utils.h @@ -21,7 +21,9 @@ #define _L_UTILS_H_ #include +#include #include +#include #include #include "linphone/utils/enum-generator.h" diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6246f1d3e..bb174d7eb 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -144,6 +144,10 @@ set(LINPHONE_CXX_OBJECTS_PRIVATE_HEADER_FILES object/property-container.h object/singleton.h sal/sal.h + search/magic-search.h + search/magic-search-p.h + search/search-result.h + search/search-result-p.h utils/background-task.h utils/payload-type-handler.h variant/variant.h @@ -167,7 +171,9 @@ set(LINPHONE_CXX_OBJECTS_SOURCE_FILES c-wrapper/api/c-core.cpp c-wrapper/api/c-dial-plan.cpp c-wrapper/api/c-event-log.cpp + c-wrapper/api/c-magic-search.cpp c-wrapper/api/c-participant.cpp + c-wrapper/api/c-search-result.cpp c-wrapper/internal/c-sal.cpp c-wrapper/internal/c-tools.cpp call/call.cpp @@ -249,6 +255,8 @@ set(LINPHONE_CXX_OBJECTS_SOURCE_FILES sal/refer-op.cpp sal/register-op.cpp sal/sal.cpp + search/magic-search.cpp + search/search-result.cpp utils/background-task.cpp utils/fs.cpp utils/general.cpp diff --git a/src/c-wrapper/api/c-magic-search.cpp b/src/c-wrapper/api/c-magic-search.cpp new file mode 100644 index 000000000..0a01e99fc --- /dev/null +++ b/src/c-wrapper/api/c-magic-search.cpp @@ -0,0 +1,86 @@ +/* + * c-magic-search.cpp + * Copyright (C) 2010-2018 Belledonne Communications SARL + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "search/magic-search.h" +#include "c-wrapper/c-wrapper.h" + +using namespace std; + +L_DECLARE_C_OBJECT_IMPL(MagicSearch); + +LinphoneMagicSearch *linphone_magic_search_new(LinphoneCore *lc) { + shared_ptr cppPtr = make_shared(L_GET_CPP_PTR_FROM_C_OBJECT(lc)); + + LinphoneMagicSearch *object = L_INIT(MagicSearch); + L_SET_CPP_PTR_FROM_C_OBJECT(object, cppPtr); + return object; +} + +LinphoneMagicSearch *linphone_magic_search_ref(LinphoneMagicSearch *magicSearch) { + belle_sip_object_ref(magicSearch); + return magicSearch; +} + +void linphone_magic_search_unref(LinphoneMagicSearch *magicSearch) { + belle_sip_object_unref(magicSearch); +} + +void linphone_magic_search_set_min_weight(LinphoneMagicSearch *magicSearch, const unsigned int weight) { + L_GET_CPP_PTR_FROM_C_OBJECT(magicSearch)->setMinWeight(weight); +} + +unsigned int linphone_magic_search_get_min_weight(const LinphoneMagicSearch *magicSearch) { + return L_GET_CPP_PTR_FROM_C_OBJECT(magicSearch)->getMinWeight(); +} + +void linphone_magic_search_set_max_weight(LinphoneMagicSearch *magicSearch, const unsigned int weight) { + L_GET_CPP_PTR_FROM_C_OBJECT(magicSearch)->setMaxWeight(weight); +} + +unsigned int linphone_magic_search_get_max_weight(const LinphoneMagicSearch *magicSearch) { + return L_GET_CPP_PTR_FROM_C_OBJECT(magicSearch)->getMaxWeight(); +} + +const char *linphone_magic_search_get_delimiter(const LinphoneMagicSearch *magicSearch) { + return L_STRING_TO_C(L_GET_CPP_PTR_FROM_C_OBJECT(magicSearch)->getDelimiter()); +} + +void linphone_magic_search_set_delimiter(LinphoneMagicSearch *magicSearch, const char *delimiter) { + L_GET_CPP_PTR_FROM_C_OBJECT(magicSearch)->setDelimiter(L_C_TO_STRING(delimiter)); +} + +unsigned int linphone_magic_search_get_search_limit(const LinphoneMagicSearch *magicSearch) { + return L_GET_CPP_PTR_FROM_C_OBJECT(magicSearch)->getSearchLimit(); +} + +void linphone_magic_search_set_search_limit(LinphoneMagicSearch *magicSearch, const unsigned int limit) { + L_GET_CPP_PTR_FROM_C_OBJECT(magicSearch)->setSearchLimit(limit); +} + +bool_t linphone_magic_search_get_limited_search(const LinphoneMagicSearch *magicSearch) { + return L_GET_CPP_PTR_FROM_C_OBJECT(magicSearch)->getLimitedSearch(); +} + +void linphone_magic_search_set_limited_search(LinphoneMagicSearch *magicSearch, const bool_t limited) { + L_GET_CPP_PTR_FROM_C_OBJECT(magicSearch)->setLimitedSearch(limited); +} + +bctbx_list_t* linphone_magic_search_get_contact_list_from_filter(const LinphoneMagicSearch *magicSearch, const char *filter, const char *withDomain) { + return L_GET_RESOLVED_C_LIST_FROM_CPP_LIST(L_GET_CPP_PTR_FROM_C_OBJECT(magicSearch)->getContactListFromFilter(L_C_TO_STRING(filter), L_C_TO_STRING(withDomain))); +} diff --git a/src/c-wrapper/api/c-search-result.cpp b/src/c-wrapper/api/c-search-result.cpp new file mode 100644 index 000000000..5fb8ed578 --- /dev/null +++ b/src/c-wrapper/api/c-search-result.cpp @@ -0,0 +1,44 @@ +/* + * c-search-result.cpp + * Copyright (C) 2010-2018 Belledonne Communications SARL + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "search/search-result.h" +#include "c-wrapper/c-wrapper.h" + +L_DECLARE_C_CLONABLE_OBJECT_IMPL(SearchResult); + +LinphoneSearchResult *linphone_search_result_ref(LinphoneSearchResult *searchResult) { + belle_sip_object_ref(searchResult); + return searchResult; +} + +void linphone_search_result_unref(LinphoneSearchResult *searchResult) { + belle_sip_object_unref(searchResult); +} + +const LinphoneFriend* linphone_search_result_get_friend(LinphoneSearchResult *searchResult) { + return L_GET_CPP_PTR_FROM_C_OBJECT(searchResult)->getFriend(); +} + +const LinphoneAddress* linphone_search_result_get_address(LinphoneSearchResult *searchResult) { + return L_GET_CPP_PTR_FROM_C_OBJECT(searchResult)->getAddress(); +} + +unsigned int linphone_search_result_get_weight(LinphoneSearchResult *searchResult) { + return L_GET_CPP_PTR_FROM_C_OBJECT(searchResult)->getWeight(); +} diff --git a/src/c-wrapper/c-wrapper.h b/src/c-wrapper/c-wrapper.h index a1c2fd2df..9ebb30f72 100644 --- a/src/c-wrapper/c-wrapper.h +++ b/src/c-wrapper/c-wrapper.h @@ -39,8 +39,10 @@ F(Core, Core) \ F(DialPlan, DialPlan) \ F(EventLog, EventLog) \ + F(MagicSearch, MagicSearch) \ F(MediaSessionParams, CallParams) \ - F(Participant, Participant) + F(Participant, Participant) \ + F(SearchResult, SearchResult) #define L_REGISTER_SUBTYPES(F) \ F(AbstractChatRoom, BasicChatRoom) \ diff --git a/src/search/magic-search-p.h b/src/search/magic-search-p.h new file mode 100644 index 000000000..b22bda379 --- /dev/null +++ b/src/search/magic-search-p.h @@ -0,0 +1,42 @@ +/* + * magic-search-p.h + * Copyright (C) 2010-2018 Belledonne Communications SARL + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _L_MAGIC_SEARCH_P_H_ +#define _L_MAGIC_SEARCH_P_H_ + +#include "magic-search.h" +#include "object/object-p.h" + +LINPHONE_BEGIN_NAMESPACE + +class MagicSearchPrivate : public ObjectPrivate{ +private: + unsigned int mMaxWeight; + unsigned int mMinWeight; + unsigned int mSearchLimit; // Number of ResultSearch maximum when the search is limited + bool mLimitedSearch; // Limit the search + std::string mDelimiter; // Delimiter use for the search + + L_DECLARE_PUBLIC(MagicSearch); +}; + +LINPHONE_END_NAMESPACE + +#endif //_L_MAGIC_SEARCH_P_H_ + diff --git a/src/search/magic-search.cpp b/src/search/magic-search.cpp new file mode 100644 index 000000000..67932583a --- /dev/null +++ b/src/search/magic-search.cpp @@ -0,0 +1,174 @@ +/* + * magic-search.cpp + * Copyright (C) 2010-2018 Belledonne Communications SARL + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "magic-search-p.h" + +#include + +#include "c-wrapper/internal/c-tools.h" +#include "linphone/utils/utils.h" +#include "linphone/core.h" +#include "linphone/types.h" +#include "private.h" + +using namespace std; + +LINPHONE_BEGIN_NAMESPACE + +MagicSearch::MagicSearch(const std::shared_ptr &core) : CoreAccessor(core), Object(*new MagicSearchPrivate){ + L_D(); + d->mMinWeight = 0; + d->mMaxWeight = 1000; + d->mSearchLimit = 10; + d->mLimitedSearch = true; + d->mDelimiter = "+_-"; +} + +void MagicSearch::setMinWeight(const unsigned int weight) { + L_D(); + d->mMinWeight = weight; +} + +unsigned int MagicSearch::getMinWeight() const { + L_D(); + return d->mMinWeight; +} + +void MagicSearch::setMaxWeight(const unsigned int weight) { + L_D(); + d->mMaxWeight = weight; +} + +unsigned int MagicSearch::getMaxWeight() const { + L_D(); + return d->mMaxWeight; +} + +const string &MagicSearch::getDelimiter() const { + L_D(); + return d->mDelimiter; +} + +void MagicSearch::setDelimiter(const string &delimiter) { + L_D(); + d->mDelimiter = delimiter; +} + +unsigned int MagicSearch::getSearchLimit() const { + L_D(); + return d->mSearchLimit; +} + +void MagicSearch::setSearchLimit(const unsigned int limit) { + L_D(); + d->mSearchLimit = limit; +} + +bool MagicSearch::getLimitedSearch() const { + L_D(); + return d->mLimitedSearch; +} + +void MagicSearch::setLimitedSearch(const bool limited) { + L_D(); + d->mLimitedSearch = limited; +} + +list MagicSearch::getContactListFromFilter(const string &filter, const string &withDomain) const { + list resultList = list(); + LinphoneFriendList* list = linphone_core_get_default_friend_list(this->getCore()->getCCore()); + + // For all friends or when we reach the search limit + for (bctbx_list_t *f = list->friends ; + f != nullptr && (!getLimitedSearch() || resultList.size() < getSearchLimit()); + f = bctbx_list_next(f) + ) { + unsigned int weight = getMinWeight(); + LinphoneFriend* lFriend = reinterpret_cast(f->data); + const LinphoneAddress* lAddress = linphone_friend_get_address(lFriend); + + if (lAddress == nullptr) break; + + // Check domain + if (!withDomain.empty() && + withDomain.compare(linphone_address_get_domain(lAddress)) != 0 + ) break; + + // NAME + if (linphone_friend_get_name(lFriend) != nullptr) { + weight += getWeight(linphone_friend_get_name(lFriend), filter); + } + + // PHONE NUMBER + bctbx_list_t *phoneNumbers = linphone_friend_get_phone_numbers(lFriend); + while (phoneNumbers != nullptr && phoneNumbers->data != nullptr) { + string number = static_cast(phoneNumbers->data); + weight += getWeight(number, filter); + phoneNumbers = phoneNumbers->next; + } + + // SIPURI + if (linphone_address_get_username(lAddress) != nullptr) { + weight += getWeight(linphone_address_get_username(lAddress), filter); + } + + + // DISPLAYNAME + if (linphone_address_get_display_name(lAddress) != nullptr) { + weight += getWeight(linphone_address_get_display_name(lAddress), filter); + } + + resultList.push_back(SearchResult(weight, lAddress, lFriend)); + } + + resultList.sort(); + + return resultList; +} + +unsigned int MagicSearch::getWeight(const string &stringWords, const string &filter) const { + size_t weight = string::npos; + + // Finding all occurrences of "filter" in "stringWords" + for (size_t w = stringWords.find(filter) ; w != string::npos ; w = stringWords.find(filter, w)) { + // weight max if occurence find at beginning + if (w == 0) { + weight = getMaxWeight(); + } else { + bool isDelimiter = false; + // get the char before the matched filter + const char l = stringWords.at(w - 1); + // Check if it's a delimiter + for (const char d : getDelimiter()) { + if (l == d) { + isDelimiter = true; + break; + } + } + unsigned int newWeight = getMaxWeight() - (unsigned int)((isDelimiter) ? 1 : w + 1); + weight = (weight != string::npos) ? weight + newWeight : newWeight; + } + } + + return (weight != string::npos) ? (unsigned int)(weight) : getMinWeight(); +} + +MagicSearch::~MagicSearch() {} + +LINPHONE_END_NAMESPACE diff --git a/src/search/magic-search.h b/src/search/magic-search.h new file mode 100644 index 000000000..5b6caa262 --- /dev/null +++ b/src/search/magic-search.h @@ -0,0 +1,119 @@ +/* + * magic-search.h + * Copyright (C) 2010-2018 Belledonne Communications SARL + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _L_MAGIC_SEARCH_H_ +#define _L_MAGIC_SEARCH_H_ + +#include +#include +#include + +#include "core/core.h" +#include "core/core-accessor.h" +#include "search-result.h" + +LINPHONE_BEGIN_NAMESPACE + +class MagicSearchPrivate; + +class LINPHONE_PUBLIC MagicSearch : public CoreAccessor, public Object{ +public: + + MagicSearch(const std::shared_ptr &core); + ~MagicSearch(); + + /** + * Set the minimum value used to calculate the weight in search + * @param[in] weight minimum weight + **/ + void setMinWeight(const unsigned int weight); + + /** + * @return the minimum value used to calculate the weight in search + **/ + unsigned int getMinWeight() const; + + /** + * Set the maximum value used to calculate the weight in search + * @param[in] weight maximum weight + **/ + void setMaxWeight(const unsigned int weight); + + /** + * @return the maximum value used to calculate the weight in search + **/ + unsigned int getMaxWeight() const; + + /** + * @return the delimiter used to find matched filter word + **/ + const std::string& getDelimiter() const; + + /** + * Set the delimiter used to find matched filter word + * @param[in] delimiter delimiter (example "-_.,") + **/ + void setDelimiter(const std::string &delimiter); + + /** + * @return the number of the maximum SearchResult which will be return + **/ + unsigned int getSearchLimit() const; + + /** + * Set the number of the maximum SearchResult which will be return + * @param[in] limit + **/ + void setSearchLimit(const unsigned int limit); + + /** + * @return if the search is limited + **/ + bool getLimitedSearch() const; + + /** + * Enable or disable the limited search + * @param[in] limited + **/ + void setLimitedSearch(const bool limited); + + /** + * Create a sorted list of SearchResult from SipUri, Contact name, + * Contact displayname, Contact phone number, which match with a filter word + * @param[in] filter word we search + * @param[in] withDomain domain which we want to search only + * @return sorted list of SearchResult with "filter" + **/ + std::list getContactListFromFilter(const std::string &filter, const std::string &withDomain = "") const; + +private: + /** + * Return a weight for a searched in with a filter + * @param[in] stringWords which where we are searching + * @param[in] filter what we are searching + * @return calculate weight + **/ + unsigned int getWeight(const std::string &stringWords, const std::string &filter) const; + + L_DECLARE_PRIVATE(MagicSearch); +}; + +LINPHONE_END_NAMESPACE + +#endif //_L_MAGIC_SEARCH_H_ diff --git a/src/search/search-result-p.h b/src/search/search-result-p.h new file mode 100644 index 000000000..07830689a --- /dev/null +++ b/src/search/search-result-p.h @@ -0,0 +1,42 @@ +/* + * search-result-p.h + * Copyright (C) 2010-2018 Belledonne Communications SARL + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _L_SEARCH_RESULT_P_H_ +#define _L_SEARCH_RESULT_P_H_ + +#include "search-result.h" +#include "object/clonable-object-p.h" + +#include "linphone/types.h" + +LINPHONE_BEGIN_NAMESPACE + +class SearchResultPrivate : public ClonableObjectPrivate { +private: + const LinphoneFriend *mFriend; + const LinphoneAddress *mAddress; + unsigned int mWeight; + + L_DECLARE_PUBLIC(SearchResult); +}; + +LINPHONE_END_NAMESPACE + +#endif //_L_SEARCH_RESULT_P_H_ + diff --git a/src/search/search-result.cpp b/src/search/search-result.cpp new file mode 100644 index 000000000..d60cd4a2b --- /dev/null +++ b/src/search/search-result.cpp @@ -0,0 +1,66 @@ +/* + * search-result.cpp + * Copyright (C) 2010-2018 Belledonne Communications SARL + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "search-result-p.h" +#include "linphone/utils/utils.h" + +using namespace LinphonePrivate; + +LINPHONE_BEGIN_NAMESPACE + +SearchResult::SearchResult(const unsigned int weight, const LinphoneAddress *a, const LinphoneFriend *f) : ClonableObject(*new SearchResultPrivate) { + L_D(); + d->mWeight = weight; + d->mAddress = a; + d->mFriend = f; +} + +SearchResult::SearchResult(const SearchResult &sr) : ClonableObject(*new SearchResultPrivate) { + L_D(); + d->mWeight = sr.getWeight(); + d->mAddress = sr.getAddress(); + d->mFriend = sr.getFriend(); +} + +SearchResult::~SearchResult() {}; + +bool SearchResult::operator<(const SearchResult& rsr) { + return this->getWeight() < rsr.getWeight(); +} + +bool SearchResult::operator=(const SearchResult& rsr) { + return this->getWeight() == rsr.getWeight(); +} + +const LinphoneFriend* SearchResult::getFriend() const { + L_D(); + return d->mFriend; +} + +const LinphoneAddress *SearchResult::getAddress() const { + L_D(); + return d->mAddress; +} + +unsigned int SearchResult::getWeight() const { + L_D(); + return d->mWeight; +} + +LINPHONE_END_NAMESPACE diff --git a/src/search/search-result.h b/src/search/search-result.h new file mode 100644 index 000000000..8c5b87522 --- /dev/null +++ b/src/search/search-result.h @@ -0,0 +1,63 @@ +/* + * search-result.h + * Copyright (C) 2010-2018 Belledonne Communications SARL + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _L_SEARCH_RESULT_H_ +#define _L_SEARCH_RESULT_H_ + +#include "object/clonable-object.h" +#include "linphone/utils/general.h" +#include "linphone/types.h" +#include "private.h" + +LINPHONE_BEGIN_NAMESPACE + +class SearchResultPrivate; + +class LINPHONE_PUBLIC SearchResult : public ClonableObject { +public: + SearchResult() = delete; + SearchResult(const unsigned int weight, const LinphoneAddress *a, const LinphoneFriend *f = nullptr); + SearchResult(const SearchResult &sr); + ~SearchResult(); + + bool operator<(const SearchResult& rsr); + bool operator=(const SearchResult& rsr); + + /** + * @return LinphoneFriend associed + **/ + const LinphoneFriend* getFriend() const; + + /** + * @return LinphoneAddress associed + **/ + const LinphoneAddress* getAddress() const; + + /** + * @return the result weight + **/ + unsigned int getWeight() const; + +private: + L_DECLARE_PRIVATE(SearchResult); +}; + +LINPHONE_END_NAMESPACE + +#endif //_L_SEARCH_RESULT_H_ diff --git a/src/utils/utils.cpp b/src/utils/utils.cpp index b7fb58925..c9d1b8442 100644 --- a/src/utils/utils.cpp +++ b/src/utils/utils.cpp @@ -19,6 +19,7 @@ #include #include +#include #include #include diff --git a/tester/setup_tester.c b/tester/setup_tester.c index 16209aeda..202aaab1a 100644 --- a/tester/setup_tester.c +++ b/tester/setup_tester.c @@ -23,6 +23,21 @@ #include "linphone/lpconfig.h" #include "tester_utils.h" +static const char *sFriends[5] = { + "sip:test@sip.example.org", + "sip:test2@sip.example.org", + "sip:allo@sip.example.org", + "sip:hello@sip.example.org", + "sip:hello@sip.test.org" +}; + +static void _create_friend_from_tab(LinphoneCore *lc, LinphoneFriendList *list, const char *friends[], const unsigned int size) { + for (unsigned int i = 0 ; i <= size ; i++) { + LinphoneFriend *fr = linphone_core_create_friend_with_address(lc, friends[i]); + linphone_friend_list_add_friend(list, fr); + } +} + static void linphone_version_test(void){ const char *version=linphone_core_get_version(); /*make sure the git version is always included in the version number*/ @@ -393,6 +408,17 @@ static void custom_tones_setup(void){ linphone_core_manager_destroy(mgr); } +static void search_friend_all_domains(void) { + LinphoneCoreManager* manager = linphone_core_manager_new2("empty_rc", FALSE); + LinphoneFriendList *lfl = linphone_core_get_default_friend_list(manager->lc); + LinphoneFriend *lf = linphone_core_create_friend_with_address(manager->lc, "sip:toto@sip.linphone.org"); + + _create_friend_from_tab(manager->lc, lfl, sFriends, 5); + + linphone_friend_unref(lf); + linphone_core_manager_destroy(manager); +} + test_t setup_tests[] = { TEST_NO_TAG("Version check", linphone_version_test), TEST_NO_TAG("Linphone Address", linphone_address_test), @@ -409,7 +435,8 @@ test_t setup_tests[] = { TEST_NO_TAG("Devices reload", devices_reload_test), TEST_NO_TAG("Codec usability", codec_usability_test), TEST_NO_TAG("Codec setup", codec_setup), - TEST_NO_TAG("Custom tones setup", custom_tones_setup) + TEST_NO_TAG("Custom tones setup", custom_tones_setup), + TEST_NO_TAG("Search friend from all domains", search_friend_all_domains) }; test_suite_t setup_test_suite = {"Setup", NULL, NULL, liblinphone_tester_before_each, liblinphone_tester_after_each, From 87921f737651b51d1b72e59fb94d0e691ecb6a80 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 14 Feb 2018 17:46:33 +0100 Subject: [PATCH 058/281] Fix invalid cast when using MySQL as database backend. --- src/db/main-db.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 0015c1947..83b903aaf 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -2466,10 +2466,7 @@ list> MainDb::getChatRooms () const { soci::rowset rows = (session->prepare << query, soci::use(participantId)); for (const auto &row : rows) { shared_ptr device = dParticipant->addDevice(IdentityAddress(row.get(0))); - device->setState(ParticipantDevice::State(getBackend() == Backend::Mysql - ? row.get(1, 0) - : static_cast(row.get(1, 0)) - )); + device->setState(ParticipantDevice::State(static_cast(row.get(1, 0)))); } } From 91bce6e69561a03831d9ecfc77f647e2e67f6cb4 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 14 Feb 2018 18:10:38 +0100 Subject: [PATCH 059/281] Correctly handle IMDN for group chat. --- coreapi/callbacks.c | 3 +- coreapi/private_functions.h | 1 - src/c-wrapper/api/c-chat-message.cpp | 4 - src/chat/chat-message/chat-message-p.h | 5 +- src/chat/chat-message/chat-message.cpp | 91 ++++++++++++++----- src/chat/chat-message/chat-message.h | 2 +- src/chat/chat-room/chat-room-p.h | 2 +- src/chat/chat-room/chat-room.cpp | 7 +- .../file-transfer-chat-message-modifier.cpp | 16 ++-- src/chat/notification/imdn.cpp | 22 +++-- src/chat/notification/imdn.h | 4 +- src/db/main-db.cpp | 87 ++++++++++++++++-- src/db/main-db.h | 12 +++ tester/group_chat_tester.c | 73 ++++++++++++++- 14 files changed, 264 insertions(+), 65 deletions(-) diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index f3554763d..535883882 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -39,6 +39,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "c-wrapper/c-wrapper.h" #include "call/call-p.h" +#include "chat/chat-message/chat-message-p.h" #include "chat/chat-room/chat-room.h" #include "chat/chat-room/server-group-chat-room-p.h" #include "conference/participant.h" @@ -565,7 +566,7 @@ static void message_delivery_update(SalOp *op, SalMessageDeliveryStatus status) // Check that the message does not belong to an already destroyed chat room - if so, do not invoke callbacks if (msg->getChatRoom()) - msg->updateState((LinphonePrivate::ChatMessage::State)chatStatusSal2Linphone(status)); + L_GET_PRIVATE(msg)->setState((LinphonePrivate::ChatMessage::State)chatStatusSal2Linphone(status)); } static void info_received(SalOp *op, SalBodyHandler *body_handler) { diff --git a/coreapi/private_functions.h b/coreapi/private_functions.h index e0e48308f..0908f70ea 100644 --- a/coreapi/private_functions.h +++ b/coreapi/private_functions.h @@ -355,7 +355,6 @@ LinphoneChatMessageStateChangedCb linphone_chat_message_get_message_state_change void linphone_chat_message_set_message_state_changed_cb(LinphoneChatMessage* msg, LinphoneChatMessageStateChangedCb cb); void linphone_chat_message_set_message_state_changed_cb_user_data(LinphoneChatMessage* msg, void *user_data); void * linphone_chat_message_get_message_state_changed_cb_user_data(LinphoneChatMessage* msg); -void linphone_chat_message_update_state(LinphoneChatMessage *msg, LinphoneChatMessageState new_state); LinphoneChatRoom *_linphone_core_create_chat_room_from_call(LinphoneCall *call); void linphone_core_play_named_tone(LinphoneCore *lc, LinphoneToneID id); diff --git a/src/c-wrapper/api/c-chat-message.cpp b/src/c-wrapper/api/c-chat-message.cpp index da453b39c..04218bfeb 100644 --- a/src/c-wrapper/api/c-chat-message.cpp +++ b/src/c-wrapper/api/c-chat-message.cpp @@ -209,10 +209,6 @@ void linphone_chat_message_resend_2(LinphoneChatMessage *msg) { L_GET_CPP_PTR_FROM_C_OBJECT(msg)->send(); } -void linphone_chat_message_update_state(LinphoneChatMessage *msg, LinphoneChatMessageState new_state) { - L_GET_CPP_PTR_FROM_C_OBJECT(msg)->updateState((LinphonePrivate::ChatMessage::State) new_state); -} - LinphoneStatus linphone_chat_message_put_char(LinphoneChatMessage *msg, uint32_t character) { return ((LinphoneStatus)L_GET_CPP_PTR_FROM_C_OBJECT(msg)->putCharacter(character)); } diff --git a/src/chat/chat-message/chat-message-p.h b/src/chat/chat-message/chat-message-p.h index 0eae6c24e..fd374a39e 100644 --- a/src/chat/chat-message/chat-message-p.h +++ b/src/chat/chat-message/chat-message-p.h @@ -60,7 +60,8 @@ public: void setDirection (ChatMessage::Direction dir); - void setState (ChatMessage::State state, bool force = false); + void setParticipantState (const IdentityAddress &participantAddress, ChatMessage::State newState); + void setState (ChatMessage::State newState, bool force = false); void setTime (time_t time); @@ -134,6 +135,8 @@ public: void updateInDb (); private: + static bool validStateTransition (ChatMessage::State currentState, ChatMessage::State newState); + // TODO: Clean attributes. time_t time = ::ms_time(0); // TODO: Change me in all files. std::string imdnId; diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index 40a80054e..a9f0e5ccc 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -63,28 +63,65 @@ void ChatMessagePrivate::setIsReadOnly (bool readOnly) { isReadOnly = readOnly; } -void ChatMessagePrivate::setState (ChatMessage::State s, bool force) { +void ChatMessagePrivate::setParticipantState (const IdentityAddress &participantAddress, ChatMessage::State newState) { + L_Q(); + + if (!(q->getChatRoom()->getCapabilities() & AbstractChatRoom::Capabilities::Conference)) { + setState(newState); + return; + } + + if (!dbKey.isValid()) + return; + + unique_ptr &mainDb = q->getChatRoom()->getCore()->getPrivate()->mainDb; + shared_ptr eventLog = mainDb->getEventFromKey(dbKey); + ChatMessage::State currentState = mainDb->getChatMessageParticipantState(eventLog, participantAddress); + if (!validStateTransition(currentState, newState)) + return; + + mainDb->setChatMessageParticipantState(eventLog, participantAddress, newState); + + list states = mainDb->getChatMessageParticipantStates(eventLog); + size_t nbDisplayedStates = 0; + size_t nbDeliveredToUserStates = 0; + size_t nbNotDeliveredStates = 0; + for (const auto &state : states) { + switch (state) { + case ChatMessage::State::Displayed: + nbDisplayedStates++; + break; + case ChatMessage::State::DeliveredToUser: + nbDeliveredToUserStates++; + break; + case ChatMessage::State::NotDelivered: + nbNotDeliveredStates++; + break; + default: + break; + } + } + + if (nbNotDeliveredStates > 0) + setState(ChatMessage::State::NotDelivered); + else if (nbDisplayedStates == states.size()) + setState(ChatMessage::State::Displayed); + else if ((nbDisplayedStates + nbDeliveredToUserStates) == states.size()) + setState(ChatMessage::State::DeliveredToUser); +} + +void ChatMessagePrivate::setState (ChatMessage::State newState, bool force) { L_Q(); if (force) - state = s; + state = newState; - if (s == state) - return; - - if ( - (state == ChatMessage::State::Displayed || state == ChatMessage::State::DeliveredToUser) && - ( - s == ChatMessage::State::DeliveredToUser || - s == ChatMessage::State::Delivered || - s == ChatMessage::State::NotDelivered - ) - ) + if (!validStateTransition(state, newState)) return; lInfo() << "Chat message " << this << ": moving from " << Utils::toString(state) << - " to " << Utils::toString(s); - state = s; + " to " << Utils::toString(newState); + state = newState; LinphoneChatMessage *msg = L_GET_C_BACK_PTR(q); if (linphone_chat_message_get_message_state_changed_cb(msg)) @@ -756,6 +793,24 @@ void ChatMessagePrivate::updateInDb () { // ----------------------------------------------------------------------------- +bool ChatMessagePrivate::validStateTransition (ChatMessage::State currentState, ChatMessage::State newState) { + if (newState == currentState) + return false; + + if ( + (currentState == ChatMessage::State::Displayed || currentState == ChatMessage::State::DeliveredToUser) && + ( + newState == ChatMessage::State::DeliveredToUser || + newState == ChatMessage::State::Delivered || + newState == ChatMessage::State::NotDelivered + ) + ) + return false; + return true; +} + +// ----------------------------------------------------------------------------- + ChatMessage::ChatMessage (const shared_ptr &chatRoom, ChatMessage::Direction direction) : Object(*new ChatMessagePrivate), CoreAccessor(chatRoom->getCore()) { L_D(); @@ -931,12 +986,6 @@ void ChatMessage::removeCustomHeader (const string &headerName) { d->customHeaders.erase(headerName); } -void ChatMessage::updateState (State state) { - L_D(); - - d->setState(state); -} - void ChatMessage::send () { L_D(); diff --git a/src/chat/chat-message/chat-message.h b/src/chat/chat-message/chat-message.h index af7623b77..1108bcb70 100644 --- a/src/chat/chat-message/chat-message.h +++ b/src/chat/chat-message/chat-message.h @@ -47,6 +47,7 @@ class LINPHONE_PUBLIC ChatMessage : public Object, public CoreAccessor { friend class ChatRoomPrivate; friend class CpimChatMessageModifier; friend class FileTransferChatMessageModifier; + friend class Imdn; friend class MainDb; friend class MainDbPrivate; friend class RealTimeTextChatRoomPrivate; @@ -63,7 +64,6 @@ public: // ----- TODO: Remove me. void cancelFileTransfer (); int putCharacter (uint32_t character); - void updateState (State state); void sendDeliveryNotification (LinphoneReason reason); void sendDisplayNotification (); void setIsSecured (bool isSecured); diff --git a/src/chat/chat-room/chat-room-p.h b/src/chat/chat-room/chat-room-p.h index 7b45cc6c0..2deeec842 100644 --- a/src/chat/chat-room/chat-room-p.h +++ b/src/chat/chat-room/chat-room-p.h @@ -61,7 +61,7 @@ public: LinphoneReason onSipMessageReceived (SalOp *op, const SalMessage *message) override; void onChatMessageReceived (const std::shared_ptr &chatMessage) override; - void onImdnReceived (const std::string &text); + void onImdnReceived (const std::shared_ptr &chatMessage); void onIsComposingReceived (const Address &remoteAddress, const std::string &text); void onIsComposingRefreshNeeded () override; void onIsComposingStateChanged (bool isComposing) override; diff --git a/src/chat/chat-room/chat-room.cpp b/src/chat/chat-room/chat-room.cpp index 6a9fa970c..b3c1f6dce 100644 --- a/src/chat/chat-room/chat-room.cpp +++ b/src/chat/chat-room/chat-room.cpp @@ -227,7 +227,7 @@ LinphoneReason ChatRoomPrivate::onSipMessageReceived (SalOp *op, const SalMessag goto end; } } else if (msg->getPrivate()->getContentType() == ContentType::Imdn) { - onImdnReceived(msg->getPrivate()->getText()); + onImdnReceived(msg); if (lp_config_get_int(linphone_core_get_config(cCore), "sip", "deliver_imdn", 0) != 1) { goto end; } @@ -246,9 +246,8 @@ void ChatRoomPrivate::onChatMessageReceived (const shared_ptr &chat chatMessage->getPrivate()->notifyReceiving(); } -void ChatRoomPrivate::onImdnReceived (const string &text) { - L_Q(); - Imdn::parse(*q, text); +void ChatRoomPrivate::onImdnReceived (const shared_ptr &chatMessage) { + Imdn::parse(chatMessage); } void ChatRoomPrivate::onIsComposingReceived (const Address &remoteAddress, const string &text) { diff --git a/src/chat/modifier/file-transfer-chat-message-modifier.cpp b/src/chat/modifier/file-transfer-chat-message-modifier.cpp index 951efa582..41ffa66c8 100644 --- a/src/chat/modifier/file-transfer-chat-message-modifier.cpp +++ b/src/chat/modifier/file-transfer-chat-message-modifier.cpp @@ -364,24 +364,24 @@ void FileTransferChatMessageModifier::processResponseFromPostFile (const belle_h message->removeContent(*fileContent); message->addContent(*fileTransferContent); - message->updateState(ChatMessage::State::FileTransferDone); + message->getPrivate()->setState(ChatMessage::State::FileTransferDone); releaseHttpRequest(); message->getPrivate()->send(); fileUploadEndBackgroundTask(); } else { lWarning() << "Received empty response from server, file transfer failed"; - message->updateState(ChatMessage::State::NotDelivered); + message->getPrivate()->setState(ChatMessage::State::NotDelivered); releaseHttpRequest(); fileUploadEndBackgroundTask(); } } else if (code == 400) { lWarning() << "Received HTTP code response " << code << " for file transfer, probably meaning file is too large"; - message->updateState(ChatMessage::State::FileTransferError); + message->getPrivate()->setState(ChatMessage::State::FileTransferError); releaseHttpRequest(); fileUploadEndBackgroundTask(); } else { lWarning() << "Unhandled HTTP code response " << code << " for file transfer"; - message->updateState(ChatMessage::State::NotDelivered); + message->getPrivate()->setState(ChatMessage::State::NotDelivered); releaseHttpRequest(); fileUploadEndBackgroundTask(); } @@ -398,7 +398,7 @@ void FileTransferChatMessageModifier::processIoErrorUpload (const belle_sip_io_e shared_ptr message = chatMessage.lock(); if (!message) return; - message->updateState(ChatMessage::State::NotDelivered); + message->getPrivate()->setState(ChatMessage::State::NotDelivered); releaseHttpRequest(); } @@ -412,7 +412,7 @@ void FileTransferChatMessageModifier::processAuthRequestedUpload (const belle_si shared_ptr message = chatMessage.lock(); if (!message) return; - message->updateState(ChatMessage::State::NotDelivered); + message->getPrivate()->setState(ChatMessage::State::NotDelivered); releaseHttpRequest(); } @@ -844,7 +844,7 @@ void FileTransferChatMessageModifier::processAuthRequestedDownload (const belle_ shared_ptr message = chatMessage.lock(); if (!message) return; - message->updateState(ChatMessage::State::FileTransferError); + message->getPrivate()->setState(ChatMessage::State::FileTransferError); releaseHttpRequest(); } @@ -858,7 +858,7 @@ void FileTransferChatMessageModifier::processIoErrorDownload (const belle_sip_io shared_ptr message = chatMessage.lock(); if (!message) return; - message->updateState(ChatMessage::State::FileTransferError); + message->getPrivate()->setState(ChatMessage::State::FileTransferError); releaseHttpRequest(); } diff --git a/src/chat/notification/imdn.cpp b/src/chat/notification/imdn.cpp index eceda4c11..817ae3a2a 100644 --- a/src/chat/notification/imdn.cpp +++ b/src/chat/notification/imdn.cpp @@ -17,7 +17,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#include "chat/chat-message/chat-message.h" +#include "chat/chat-message/chat-message-p.h" #include "chat/chat-room/chat-room.h" #include "core/core.h" #include "logger/logger.h" @@ -133,18 +133,18 @@ string Imdn::createXml (const string &id, time_t time, Imdn::Type imdnType, Linp return content; } -void Imdn::parse (ChatRoom &cr, const string &text) { +void Imdn::parse (const shared_ptr &chatMessage) { xmlparsing_context_t *xmlCtx = linphone_xmlparsing_context_new(); xmlSetGenericErrorFunc(xmlCtx, linphone_xmlparsing_genericxml_error); - xmlCtx->doc = xmlReadDoc((const unsigned char *)text.c_str(), 0, nullptr, 0); + xmlCtx->doc = xmlReadDoc((const unsigned char *)chatMessage->getPrivate()->getText().c_str(), 0, nullptr, 0); if (xmlCtx->doc) - parse(cr, xmlCtx); + parse(chatMessage, xmlCtx); else lWarning() << "Wrongly formatted IMDN XML: " << xmlCtx->errorBuffer; linphone_xmlparsing_context_destroy(xmlCtx); } -void Imdn::parse (ChatRoom &cr, xmlparsing_context_t *xmlCtx) { +void Imdn::parse (const shared_ptr &imdnMessage, xmlparsing_context_t *xmlCtx) { char xpathStr[MAX_XPATH_LENGTH]; char *messageIdStr = nullptr; char *datetimeStr = nullptr; @@ -164,11 +164,13 @@ void Imdn::parse (ChatRoom &cr, xmlparsing_context_t *xmlCtx) { } if (messageIdStr && datetimeStr) { - shared_ptr cm = cr.findChatMessage(messageIdStr, ChatMessage::Direction::Outgoing); + shared_ptr cr = imdnMessage->getChatRoom(); + shared_ptr cm = cr->findChatMessage(messageIdStr, ChatMessage::Direction::Outgoing); + const IdentityAddress &participantAddress = imdnMessage->getFromAddress().getAddressWithoutGruu(); if (!cm) { lWarning() << "Received IMDN for unknown message " << messageIdStr; } else { - LinphoneImNotifPolicy *policy = linphone_core_get_im_notif_policy(cr.getCore()->getCCore()); + LinphoneImNotifPolicy *policy = linphone_core_get_im_notif_policy(cr->getCore()->getCCore()); snprintf(xpathStr, sizeof(xpathStr), "%s[1]/imdn:delivery-notification/imdn:status", imdnPrefix.c_str()); xmlXPathObjectPtr deliveryStatusObject = linphone_get_xml_xpath_object_for_node_list(xmlCtx, xpathStr); snprintf(xpathStr, sizeof(xpathStr), "%s[1]/imdn:display-notification/imdn:status", imdnPrefix.c_str()); @@ -178,9 +180,9 @@ void Imdn::parse (ChatRoom &cr, xmlparsing_context_t *xmlCtx) { xmlNodePtr node = deliveryStatusObject->nodesetval->nodeTab[0]; if (node->children && node->children->name) { if (strcmp((const char *)node->children->name, "delivered") == 0) { - cm->updateState(ChatMessage::State::DeliveredToUser); + cm->getPrivate()->setParticipantState(participantAddress, ChatMessage::State::DeliveredToUser); } else if (strcmp((const char *)node->children->name, "error") == 0) { - cm->updateState(ChatMessage::State::NotDelivered); + cm->getPrivate()->setParticipantState(participantAddress, ChatMessage::State::NotDelivered); } } } @@ -191,7 +193,7 @@ void Imdn::parse (ChatRoom &cr, xmlparsing_context_t *xmlCtx) { xmlNodePtr node = displayStatusObject->nodesetval->nodeTab[0]; if (node->children && node->children->name) { if (strcmp((const char *)node->children->name, "displayed") == 0) { - cm->updateState(ChatMessage::State::Displayed); + cm->getPrivate()->setParticipantState(participantAddress, ChatMessage::State::Displayed); } } } diff --git a/src/chat/notification/imdn.h b/src/chat/notification/imdn.h index ed51696b0..e6eea4766 100644 --- a/src/chat/notification/imdn.h +++ b/src/chat/notification/imdn.h @@ -38,10 +38,10 @@ public: }; static std::string createXml (const std::string &id, time_t time, Imdn::Type imdnType, LinphoneReason reason); - static void parse (ChatRoom &cr, const std::string &content); + static void parse (const std::shared_ptr &chatMessage); private: - static void parse (ChatRoom &cr, xmlparsing_context_t *xmlCtx); + static void parse (const std::shared_ptr &chatMessage, xmlparsing_context_t *xmlCtx); private: static const std::string imdnPrefix; diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 83b903aaf..248c681a9 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -516,19 +516,12 @@ void MainDbPrivate::insertChatRoomParticipantDevice ( } void MainDbPrivate::insertChatMessageParticipant (long long eventId, long long sipAddressId, int state) { - // TODO: Deal with read messages. - // Remove if displayed? Think a good alorithm for mark as read. - soci::session *session = dbSession.getBackendSession(); - soci::statement statement = ( - session->prepare << "UPDATE chat_message_participant SET state = :state" - " WHERE event_id = :eventId AND participant_sip_address_id = :sipAddressId", - soci::use(state), soci::use(eventId), soci::use(sipAddressId) - ); - statement.execute(); - if (statement.get_affected_rows() == 0 && state != int(ChatMessage::State::Displayed)) + if (state != static_cast(ChatMessage::State::Displayed)) { + soci::session *session = dbSession.getBackendSession(); *session << "INSERT INTO chat_message_participant (event_id, participant_sip_address_id, state)" " VALUES (:eventId, :sipAddressId, :state)", soci::use(eventId), soci::use(sipAddressId), soci::use(state); + } } // ----------------------------------------------------------------------------- @@ -992,6 +985,11 @@ long long MainDbPrivate::insertConferenceChatMessageEvent (const shared_ptrgetContents()) insertContent(eventId, *content); + for (const auto &participant : chatRoom->getParticipants()) { + const long long &participantSipAddressId = selectSipAddressId(participant->getAddress().asString()); + insertChatMessageParticipant(eventId, participantSipAddressId, state); + } + return eventId; } @@ -2216,6 +2214,75 @@ list> MainDb::getUnreadChatMessages (const ChatRoomId &c }; } +list MainDb::getChatMessageParticipantStates (const shared_ptr &eventLog) const { + return L_SAFE_TRANSACTION { + L_D(); + + soci::session *session = d->dbSession.getBackendSession(); + + const EventLogPrivate *dEventLog = eventLog->getPrivate(); + MainDbKeyPrivate *dEventKey = static_cast(dEventLog->dbKey).getPrivate(); + const long long &eventId = dEventKey->storageId; + list states; + unsigned int state; + + soci::statement statement = (session->prepare + << "SELECT state FROM chat_message_participant WHERE event_id = :eventId", + soci::into(state), soci::use(eventId) + ); + statement.execute(); + while (statement.fetch()) + states.push_back(static_cast(state)); + + return states; + }; +} + +ChatMessage::State MainDb::getChatMessageParticipantState ( + const shared_ptr &eventLog, + const IdentityAddress &participantAddress +) const { + return L_SAFE_TRANSACTION { + L_D(); + + soci::session *session = d->dbSession.getBackendSession(); + + const EventLogPrivate *dEventLog = eventLog->getPrivate(); + MainDbKeyPrivate *dEventKey = static_cast(dEventLog->dbKey).getPrivate(); + const long long &eventId = dEventKey->storageId; + const long long &participantSipAddressId = d->selectSipAddressId(participantAddress.asString()); + unsigned int state; + + *session << "SELECT state FROM chat_message_participant" + " WHERE event_id = :eventId AND participant_sip_address_id = :participantSipAddressId", + soci::into(state), soci::use(eventId), soci::use(participantSipAddressId); + + return static_cast(state); + }; +} + +void MainDb::setChatMessageParticipantState ( + const shared_ptr &eventLog, + const IdentityAddress &participantAddress, + ChatMessage::State state +) { + L_SAFE_TRANSACTION { + L_D(); + + soci::session *session = d->dbSession.getBackendSession(); + + const EventLogPrivate *dEventLog = eventLog->getPrivate(); + MainDbKeyPrivate *dEventKey = static_cast(dEventLog->dbKey).getPrivate(); + const long long &eventId = dEventKey->storageId; + const long long &participantSipAddressId = d->selectSipAddressId(participantAddress.asString()); + int stateInt = static_cast(state); + + *session << "UPDATE chat_message_participant SET state = :state" + " WHERE event_id = :eventId AND participant_sip_address_id = :participantSipAddressId", + soci::use(stateInt), soci::use(eventId), soci::use(participantSipAddressId); + }; +} + shared_ptr MainDb::getLastChatMessage (const ChatRoomId &chatRoomId) const { list> chatList = getHistory(chatRoomId, 1, Filter::ConferenceChatMessageFilter); if (chatList.empty()) diff --git a/src/db/main-db.h b/src/db/main-db.h index c22041597..ee8145962 100644 --- a/src/db/main-db.h +++ b/src/db/main-db.h @@ -25,6 +25,7 @@ #include "linphone/utils/enum-mask.h" #include "abstract/abstract-db.h" +#include "chat/chat-message/chat-message.h" #include "chat/chat-room/chat-room-id.h" #include "core/core-accessor.h" @@ -85,6 +86,17 @@ public: void markChatMessagesAsRead (const ChatRoomId &chatRoomId = ChatRoomId()) const; std::list> getUnreadChatMessages (const ChatRoomId &chatRoomId = ChatRoomId()) const; + std::list getChatMessageParticipantStates (const std::shared_ptr &eventLog) const; + ChatMessage::State getChatMessageParticipantState ( + const std::shared_ptr &eventLog, + const IdentityAddress &participantAddress + ) const; + void setChatMessageParticipantState ( + const std::shared_ptr &eventLog, + const IdentityAddress &participantAddress, + ChatMessage::State state + ); + std::shared_ptr getLastChatMessage (const ChatRoomId &chatRoomId) const; std::list> findChatMessages ( diff --git a/tester/group_chat_tester.c b/tester/group_chat_tester.c index 56f5f22fd..6c6371e8d 100644 --- a/tester/group_chat_tester.c +++ b/tester/group_chat_tester.c @@ -2614,6 +2614,76 @@ static void group_chat_room_new_unique_one_to_one_chat_room_after_both_participa linphone_core_manager_destroy(pauline); } +static void imdn_for_group_chat_room (void) { + LinphoneCoreManager *marie = linphone_core_manager_create("marie_rc"); + LinphoneCoreManager *pauline = linphone_core_manager_create("pauline_rc"); + LinphoneCoreManager *chloe = linphone_core_manager_create("chloe_rc"); + bctbx_list_t *coresManagerList = NULL; + bctbx_list_t *participantsAddresses = NULL; + coresManagerList = bctbx_list_append(coresManagerList, marie); + coresManagerList = bctbx_list_append(coresManagerList, pauline); + coresManagerList = bctbx_list_append(coresManagerList, chloe); + bctbx_list_t *coresList = init_core_for_conference(coresManagerList); + start_core_for_conference(coresManagerList); + participantsAddresses = bctbx_list_append(participantsAddresses, linphone_address_new(linphone_core_get_identity(pauline->lc))); + participantsAddresses = bctbx_list_append(participantsAddresses, linphone_address_new(linphone_core_get_identity(chloe->lc))); + stats initialMarieStats = marie->stat; + stats initialPaulineStats = pauline->stat; + stats initialChloeStats = chloe->stat; + + // Enable IMDN + linphone_im_notif_policy_enable_all(linphone_core_get_im_notif_policy(marie->lc)); + linphone_im_notif_policy_enable_all(linphone_core_get_im_notif_policy(pauline->lc)); + linphone_im_notif_policy_enable_all(linphone_core_get_im_notif_policy(chloe->lc)); + + // Marie creates a new group chat room + const char *initialSubject = "Colleagues"; + LinphoneChatRoom *marieCr = create_chat_room_client_side(coresList, marie, &initialMarieStats, participantsAddresses, initialSubject, -1); + 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, 2, 0); + + // Check that the chat room is correctly created on Chloe's side and that the participants are added + LinphoneChatRoom *chloeCr = check_creation_chat_room_client_side(coresList, chloe, &initialChloeStats, confAddr, initialSubject, 2, 0); + + // Chloe begins composing a message + const char *chloeMessage = "Hello"; + _send_message(chloeCr, chloeMessage); + BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneMessageReceived, initialMarieStats.number_of_LinphoneMessageReceived + 1, 10000)); + BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneMessageReceived, initialPaulineStats.number_of_LinphoneMessageReceived + 1, 10000)); + LinphoneChatMessage *marieLastMsg = marie->stat.last_received_chat_message; + if (!BC_ASSERT_PTR_NOT_NULL(marieLastMsg)) + goto end; + BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(marieLastMsg), chloeMessage); + LinphoneAddress *chloeAddr = linphone_address_new(linphone_core_get_identity(chloe->lc)); + BC_ASSERT_TRUE(linphone_address_weak_equal(chloeAddr, linphone_chat_message_get_from_address(marieLastMsg))); + linphone_address_unref(chloeAddr); + + // Check that the message has been delivered to Marie and Pauline + BC_ASSERT_TRUE(wait_for_list(coresList, &chloe->stat.number_of_LinphoneMessageDeliveredToUser, initialChloeStats.number_of_LinphoneMessageDeliveredToUser + 1, 10000)); + + // Marie marks the message as read, check that the state is not yet displayed on Chloe's side + linphone_chat_room_mark_as_read(marieCr); + BC_ASSERT_FALSE(wait_for_list(coresList, &chloe->stat.number_of_LinphoneMessageDisplayed, initialChloeStats.number_of_LinphoneMessageDisplayed + 1, 1000)); + + // Pauline also marks the message as read, check that the state is now displayed on Chloe's side + linphone_chat_room_mark_as_read(paulineCr); + BC_ASSERT_TRUE(wait_for_list(coresList, &chloe->stat.number_of_LinphoneMessageDisplayed, initialChloeStats.number_of_LinphoneMessageDisplayed + 1, 1000)); + +end: + // Clean db from chat room + linphone_core_manager_delete_chat_room(marie, marieCr, coresList); + linphone_core_manager_delete_chat_room(chloe, chloeCr, 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); + linphone_core_manager_destroy(chloe); +} + test_t group_chat_tests[] = { TEST_TWO_TAGS("Group chat room creation server", group_chat_room_creation_server, "Server", "LeaksMemory"), TEST_TWO_TAGS("Send message", group_chat_room_send_message, "Server", "LeaksMemory"), @@ -2651,7 +2721,8 @@ test_t group_chat_tests[] = { TEST_TWO_TAGS("Unique one-to-one chatroom", group_chat_room_unique_one_to_one_chat_room, "Server", "LeaksMemory"), TEST_TWO_TAGS("Unique one-to-one chatroom recreated from message", group_chat_room_unique_one_to_one_chat_room_recreated_from_message, "Server", "LeaksMemory"), TEST_TWO_TAGS("Unique one-to-one chatroom recreated from message with app restart", group_chat_room_unique_one_to_one_chat_room_recreated_from_message_with_app_restart, "Server", "LeaksMemory"), - TEST_TWO_TAGS("New unique one-to-one chatroom after both participants left", group_chat_room_new_unique_one_to_one_chat_room_after_both_participants_left, "Server", "LeaksMemory") + TEST_TWO_TAGS("New unique one-to-one chatroom after both participants left", group_chat_room_new_unique_one_to_one_chat_room_after_both_participants_left, "Server", "LeaksMemory"), + TEST_TWO_TAGS("IMDN for group chat room", imdn_for_group_chat_room, "Server", "LeaksMemory") }; test_suite_t group_chat_test_suite = { From 04fd9ec2da104f24c40cf592273cbf191677a0a8 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Thu, 15 Feb 2018 08:28:12 +0100 Subject: [PATCH 060/281] feat(logger): DurationLogger use by default Info flag --- src/logger/logger.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/logger/logger.h b/src/logger/logger.h index c25438c24..d3729b582 100644 --- a/src/logger/logger.h +++ b/src/logger/logger.h @@ -54,7 +54,7 @@ class DurationLoggerPrivate; class DurationLogger : public BaseObject { public: - DurationLogger (const std::string &label, Logger::Level level = Logger::Debug); + DurationLogger (const std::string &label, Logger::Level level = Logger::Info); ~DurationLogger (); private: From 1cfd80573168ed46153cd3eba854c268159323e9 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Thu, 15 Feb 2018 10:45:00 +0100 Subject: [PATCH 061/281] Terminate ClientGroupChatRoom when termination fails with reason "Not Found". --- src/chat/chat-room/client-group-chat-room.cpp | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/chat/chat-room/client-group-chat-room.cpp b/src/chat/chat-room/client-group-chat-room.cpp index 8064e8499..9a7ee7725 100644 --- a/src/chat/chat-room/client-group-chat-room.cpp +++ b/src/chat/chat-room/client-group-chat-room.cpp @@ -149,9 +149,14 @@ void ClientGroupChatRoomPrivate::onCallSessionStateChanged ( if (q->getState() == ChatRoom::State::CreationPending) setState(ChatRoom::State::CreationFailed); else if (q->getState() == ChatRoom::State::TerminationPending) { - // Go to state TerminationFailed and then back to Created since it has not been terminated - setState(ChatRoom::State::TerminationFailed); - setState(ChatRoom::State::Created); + if (session->getReason() == LinphoneReasonNotFound) { + // Somehow the chat room is no longer know on the server, so terminate it + q->onConferenceTerminated(q->getConferenceAddress()); + } else { + // Go to state TerminationFailed and then back to Created since it has not been terminated + setState(ChatRoom::State::TerminationFailed); + setState(ChatRoom::State::Created); + } } } } From 7137ca85dc8978c00613488160ec97d307fb90ba Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Thu, 15 Feb 2018 11:11:58 +0100 Subject: [PATCH 062/281] Add option to deactivate handling of chat message state by participant in group chat. --- src/chat/chat-message/chat-message.cpp | 6 +++++- tester/group_chat_tester.c | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index a9f0e5ccc..a254ff42d 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -66,7 +66,11 @@ void ChatMessagePrivate::setIsReadOnly (bool readOnly) { void ChatMessagePrivate::setParticipantState (const IdentityAddress &participantAddress, ChatMessage::State newState) { L_Q(); - if (!(q->getChatRoom()->getCapabilities() & AbstractChatRoom::Capabilities::Conference)) { + if (!(q->getChatRoom()->getCapabilities() & AbstractChatRoom::Capabilities::Conference) + || (linphone_config_get_bool(linphone_core_get_config(q->getChatRoom()->getCore()->getCCore()), + "misc", "enable_simple_group_chat_message_state", TRUE + )) + ) { setState(newState); return; } diff --git a/tester/group_chat_tester.c b/tester/group_chat_tester.c index 6c6371e8d..211494d10 100644 --- a/tester/group_chat_tester.c +++ b/tester/group_chat_tester.c @@ -2635,6 +2635,9 @@ static void imdn_for_group_chat_room (void) { linphone_im_notif_policy_enable_all(linphone_core_get_im_notif_policy(marie->lc)); linphone_im_notif_policy_enable_all(linphone_core_get_im_notif_policy(pauline->lc)); linphone_im_notif_policy_enable_all(linphone_core_get_im_notif_policy(chloe->lc)); + linphone_config_set_bool(linphone_core_get_config(marie->lc), "misc", "enable_simple_group_chat_message_state", FALSE); + linphone_config_set_bool(linphone_core_get_config(pauline->lc), "misc", "enable_simple_group_chat_message_state", FALSE); + linphone_config_set_bool(linphone_core_get_config(chloe->lc), "misc", "enable_simple_group_chat_message_state", FALSE); // Marie creates a new group chat room const char *initialSubject = "Colleagues"; From 9fead7189904f002b8ccb9eb3934be9505038c1b Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Thu, 15 Feb 2018 12:50:26 +0100 Subject: [PATCH 063/281] Fix crash during migration on Android by avoiding to throw exceptions. Apparently exceptions do not work reliabily on android, at least not with our current toolchain and compilation options. --- src/db/main-db.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 248c681a9..dbb36717a 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -1256,13 +1256,11 @@ template static T getValueFromRow (const soci::row &row, int index, bool &isNull) { isNull = false; - try { - return row.get(size_t(index)); - } catch (const exception &) { + if (row.get_indicator(size_t(index)) == soci::i_null){ isNull = true; + return T(); } - - return T(); + return row.get(size_t(index)); } // ----------------------------------------------------------------------------- From 4a5d2e4cb56b669e3547087e250027f51caa6a1a Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 15 Feb 2018 12:55:08 +0100 Subject: [PATCH 064/281] Fixed leak in Java wrapper --- wrappers/java/jni.mustache | 1 + 1 file changed, 1 insertion(+) diff --git a/wrappers/java/jni.mustache b/wrappers/java/jni.mustache index 52152d754..c712d5fa7 100644 --- a/wrappers/java/jni.mustache +++ b/wrappers/java/jni.mustache @@ -375,6 +375,7 @@ void Java_{{jniPackage}}{{className}}Impl_addListener(JNIEnv* env, jobject thiz, {{/callbacksList}} {{#isMultiListener}} {{cPrefix}}_add_callbacks(cptr, cbs); + {{cPrefix}}_cbs_unref(cbs); {{/isMultiListener}} } {{#isMultiListener}} From a573636c6b89a04e7cb82198589141feb4410ca0 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 15 Feb 2018 13:12:23 +0100 Subject: [PATCH 065/281] Fixed issue with removeListener in Java wrapper --- wrappers/java/jni.mustache | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/wrappers/java/jni.mustache b/wrappers/java/jni.mustache index c712d5fa7..7c5220708 100644 --- a/wrappers/java/jni.mustache +++ b/wrappers/java/jni.mustache @@ -386,8 +386,10 @@ void Java_{{jniPackage}}{{className}}Impl_removeListener(JNIEnv* env, jobject th bctbx_list_t *it; for (it = (bctbx_list_t *)cbs_list; it != NULL; it = it->next) { {{classCName}}Cbs *cbs = ({{classCName}}Cbs *)it->data; - if ({{cPrefix}}_cbs_get_user_data(cbs) == jlistener) { + jobject listener = (jobject) {{cPrefix}}_cbs_get_user_data(cbs); + if (env->IsSameObject(listener, jlistener)) { {{cPrefix}}_remove_callbacks(cptr, cbs); + env->DeleteGlobalRef(listener); break; } } From c444c4c59ca0805814e25d939582f9fc98c96ddf Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 15 Feb 2018 13:23:40 +0100 Subject: [PATCH 066/281] Fixed remaining issue with removeListener in Java wrapper --- wrappers/java/jni.mustache | 1 + 1 file changed, 1 insertion(+) diff --git a/wrappers/java/jni.mustache b/wrappers/java/jni.mustache index 7c5220708..26c8a55cc 100644 --- a/wrappers/java/jni.mustache +++ b/wrappers/java/jni.mustache @@ -388,6 +388,7 @@ void Java_{{jniPackage}}{{className}}Impl_removeListener(JNIEnv* env, jobject th {{classCName}}Cbs *cbs = ({{classCName}}Cbs *)it->data; jobject listener = (jobject) {{cPrefix}}_cbs_get_user_data(cbs); if (env->IsSameObject(listener, jlistener)) { + {{cPrefix}}_cbs_set_user_data(cbs, NULL); {{cPrefix}}_remove_callbacks(cptr, cbs); env->DeleteGlobalRef(listener); break; From 068cd9ce45aec5f40f4c1c538f3a14d33d787776 Mon Sep 17 00:00:00 2001 From: Benjamin Reis Date: Thu, 15 Feb 2018 13:38:51 +0100 Subject: [PATCH 067/281] do not fetch device event in chat room history --- src/chat/chat-room/chat-room.cpp | 4 ++-- src/db/main-db.cpp | 11 ++++++----- src/db/main-db.h | 3 ++- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/chat/chat-room/chat-room.cpp b/src/chat/chat-room/chat-room.cpp index b3c1f6dce..3d2ea95a4 100644 --- a/src/chat/chat-room/chat-room.cpp +++ b/src/chat/chat-room/chat-room.cpp @@ -324,11 +324,11 @@ list> ChatRoom::getMessageHistoryRange (int begin, int end) } list> ChatRoom::getHistory (int nLast) const { - return getCore()->getPrivate()->mainDb->getHistory(getChatRoomId(), nLast); + return getCore()->getPrivate()->mainDb->getHistory(getChatRoomId(), nLast, MainDb::Filter::ConferenceInfoNoDeviceFilter); } list> ChatRoom::getHistoryRange (int begin, int end) const { - return getCore()->getPrivate()->mainDb->getHistoryRange(getChatRoomId(), begin, end); + return getCore()->getPrivate()->mainDb->getHistoryRange(getChatRoomId(), begin, end, MainDb::Filter::ConferenceInfoNoDeviceFilter); } int ChatRoom::getHistorySize () const { diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index dbb36717a..41ece4212 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -220,7 +220,8 @@ static constexpr const char *mapEnumToSql (const EnumToSql enumToSql[], size_ static constexpr EnumToSql eventFilterToSql[] = { { MainDb::ConferenceCallFilter, "3, 4" }, { MainDb::ConferenceChatMessageFilter, "5" }, - { MainDb::ConferenceInfoFilter, "1, 2, 6, 7, 8, 9, 10, 11, 12" } + { MainDb::ConferenceInfoFilter, "1, 2, 6, 7, 8, 9, 10, 11, 12" }, + { MainDb::ConferenceInfoNoDeviceFilter, "1, 2, 6, 7, 8, 9, 12" } }; static constexpr const char *mapEventFilterToSql (MainDb::Filter filter) { @@ -1958,7 +1959,7 @@ bool MainDb::deleteEvent (const shared_ptr &eventLog) { int MainDb::getEventCount (FilterMask mask) const { string query = "SELECT COUNT(*) FROM event" + - buildSqlEventFilter({ ConferenceCallFilter, ConferenceChatMessageFilter, ConferenceInfoFilter }, mask); + buildSqlEventFilter({ ConferenceCallFilter, ConferenceChatMessageFilter, ConferenceInfoFilter, ConferenceInfoNoDeviceFilter }, mask); DurationLogger durationLogger( "Get events count with mask=" + Utils::toString(mask) + "." @@ -2364,7 +2365,7 @@ list> MainDb::getHistoryRange ( " SELECT event_id FROM conference_event WHERE chat_room_id = :chatRoomId" " )"; query += buildSqlEventFilter({ - ConferenceCallFilter, ConferenceChatMessageFilter, ConferenceInfoFilter + ConferenceCallFilter, ConferenceChatMessageFilter, ConferenceInfoFilter, ConferenceInfoNoDeviceFilter }, mask, "AND"); query += " ORDER BY creation_time DESC"; @@ -2416,7 +2417,7 @@ int MainDb::getHistorySize (const ChatRoomId &chatRoomId, FilterMask mask) const const string query = "SELECT COUNT(*) FROM event, conference_event" " WHERE chat_room_id = :chatRoomId" " AND event_id = event.id" + buildSqlEventFilter({ - ConferenceCallFilter, ConferenceChatMessageFilter, ConferenceInfoFilter + ConferenceCallFilter, ConferenceChatMessageFilter, ConferenceInfoFilter, ConferenceInfoNoDeviceFilter }, mask, "AND"); return L_SAFE_TRANSACTION { @@ -2436,7 +2437,7 @@ int MainDb::getHistorySize (const ChatRoomId &chatRoomId, FilterMask mask) const void MainDb::cleanHistory (const ChatRoomId &chatRoomId, FilterMask mask) { const string query = "SELECT event_id FROM conference_event WHERE chat_room_id = :chatRoomId" + buildSqlEventFilter({ - ConferenceCallFilter, ConferenceChatMessageFilter, ConferenceInfoFilter + ConferenceCallFilter, ConferenceChatMessageFilter, ConferenceInfoFilter, ConferenceInfoNoDeviceFilter }, mask); DurationLogger durationLogger( diff --git a/src/db/main-db.h b/src/db/main-db.h index ee8145962..6b6c1ee90 100644 --- a/src/db/main-db.h +++ b/src/db/main-db.h @@ -50,7 +50,8 @@ public: NoFilter = 0x0, ConferenceCallFilter = 0x1, ConferenceChatMessageFilter = 0x2, - ConferenceInfoFilter = 0x4 + ConferenceInfoFilter = 0x4, + ConferenceInfoNoDeviceFilter = 0x6 }; typedef EnumMask FilterMask; From b87dd9f1a0e92bfe71380ab9c9949e537f2be08e Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 15 Feb 2018 13:39:13 +0100 Subject: [PATCH 068/281] Fixed another leak in Java wrapper caused by listeners --- wrappers/java/jni.mustache | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/wrappers/java/jni.mustache b/wrappers/java/jni.mustache index 26c8a55cc..851aa0236 100644 --- a/wrappers/java/jni.mustache +++ b/wrappers/java/jni.mustache @@ -357,28 +357,36 @@ static {{return}} {{callbackName}}({{params}}) { {{#interfaces}} {{#isSingleListener}} void Java_{{jniPackage}}{{className}}Impl_setListener(JNIEnv* env, jobject thiz, jlong ptr, jobject jlistener) { + {{classCName}} *cptr = ({{classCName}}*)ptr; + {{classCName}}Cbs *cbs = {{cPrefix}}_get_callbacks(cptr); + if (jlistener == NULL) { + jobject listener = (jobject) {{cPrefix}}_cbs_get_user_data(cbs); + {{cPrefix}}_cbs_set_user_data(cbs, NULL); + if (listener != NULL) { + env->DeleteGlobalRef(listener); + } + } else { + jobject listener = env->NewGlobalRef(jlistener); + {{cPrefix}}_cbs_set_user_data(cbs, listener); + {{#callbacksList}} + {{cPrefix}}_cbs_set_{{callback}}(cbs, {{callbackName}}); + {{/callbacksList}} + } +} {{/isSingleListener}} + {{#isMultiListener}} void Java_{{jniPackage}}{{className}}Impl_addListener(JNIEnv* env, jobject thiz, jlong ptr, jobject jlistener) { -{{/isMultiListener}} {{classCName}} *cptr = ({{classCName}}*)ptr; jobject listener = env->NewGlobalRef(jlistener); - {{#isSingleListener}} - {{classCName}}Cbs *cbs = {{cPrefix}}_get_callbacks(cptr); - {{/isSingleListener}} - {{#isMultiListener}} {{classCName}}Cbs *cbs = linphone_factory_create_{{factoryName}}_cbs(NULL); - {{/isMultiListener}} {{cPrefix}}_cbs_set_user_data(cbs, listener); {{#callbacksList}} {{cPrefix}}_cbs_set_{{callback}}(cbs, {{callbackName}}); {{/callbacksList}} - {{#isMultiListener}} {{cPrefix}}_add_callbacks(cptr, cbs); {{cPrefix}}_cbs_unref(cbs); - {{/isMultiListener}} } -{{#isMultiListener}} void Java_{{jniPackage}}{{className}}Impl_removeListener(JNIEnv* env, jobject thiz, jlong ptr, jobject jlistener) { {{classCName}} *cptr = ({{classCName}}*)ptr; @@ -396,7 +404,6 @@ void Java_{{jniPackage}}{{className}}Impl_removeListener(JNIEnv* env, jobject th } } {{/isMultiListener}} - {{/interfaces}} ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// From b9c2b8c9a9153a2f0d896c62444d617de6d065d8 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 15 Feb 2018 13:56:48 +0100 Subject: [PATCH 069/281] Do not create a JNI listener if Java one is null --- wrappers/java/jni.mustache | 1 + 1 file changed, 1 insertion(+) diff --git a/wrappers/java/jni.mustache b/wrappers/java/jni.mustache index 851aa0236..c1da6d769 100644 --- a/wrappers/java/jni.mustache +++ b/wrappers/java/jni.mustache @@ -377,6 +377,7 @@ void Java_{{jniPackage}}{{className}}Impl_setListener(JNIEnv* env, jobject thiz, {{#isMultiListener}} void Java_{{jniPackage}}{{className}}Impl_addListener(JNIEnv* env, jobject thiz, jlong ptr, jobject jlistener) { + if (jlistener == NULL) return; {{classCName}} *cptr = ({{classCName}}*)ptr; jobject listener = env->NewGlobalRef(jlistener); {{classCName}}Cbs *cbs = linphone_factory_create_{{factoryName}}_cbs(NULL); From e8da88c5435eb3a9e00101463057387ec81804ac Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Thu, 15 Feb 2018 13:59:21 +0100 Subject: [PATCH 070/281] Remove call session listener when destroying client group chat room. --- src/chat/chat-room/client-group-chat-room.cpp | 5 +++++ src/chat/chat-room/client-group-chat-room.h | 2 ++ 2 files changed, 7 insertions(+) diff --git a/src/chat/chat-room/client-group-chat-room.cpp b/src/chat/chat-room/client-group-chat-room.cpp index 9a7ee7725..89240f441 100644 --- a/src/chat/chat-room/client-group-chat-room.cpp +++ b/src/chat/chat-room/client-group-chat-room.cpp @@ -208,6 +208,11 @@ RemoteConference(core, me->getAddress(), nullptr) { dConference->eventHandler->subscribe(getChatRoomId()); } +ClientGroupChatRoom::~ClientGroupChatRoom () { + L_D(); + d->setCallSessionListener(nullptr); +} + shared_ptr ClientGroupChatRoom::getCore () const { return ChatRoom::getCore(); } diff --git a/src/chat/chat-room/client-group-chat-room.h b/src/chat/chat-room/client-group-chat-room.h index 37423a6bb..3569dd2d2 100644 --- a/src/chat/chat-room/client-group-chat-room.h +++ b/src/chat/chat-room/client-group-chat-room.h @@ -55,6 +55,8 @@ public: unsigned int lastNotifyId ); + ~ClientGroupChatRoom (); + std::shared_ptr getCore () const; void allowCpim (bool value) override; From ecf6024bbf23ae751110e0169093c516e4e5c199 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Thu, 15 Feb 2018 16:20:49 +0100 Subject: [PATCH 071/281] Simplify addParticipants() method of Conference. --- src/conference/conference.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/conference/conference.cpp b/src/conference/conference.cpp index 1aa3459e6..efba1bad8 100644 --- a/src/conference/conference.cpp +++ b/src/conference/conference.cpp @@ -61,11 +61,8 @@ void Conference::addParticipants (const list &addresses, const list sortedAddresses(addresses); sortedAddresses.sort(); sortedAddresses.unique(); - for (const auto &addr: sortedAddresses) { - shared_ptr participant = findParticipant(addr); - if (!participant) - addParticipant(addr, params, hasMedia); - } + for (const auto &addr: sortedAddresses) + addParticipant(addr, params, hasMedia); } bool Conference::canHandleParticipants () const { From 373dafd993a4c41fb7f4c8c314c8a31a6af7620c Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Thu, 15 Feb 2018 16:21:14 +0100 Subject: [PATCH 072/281] Renaming in server group chat room. --- src/chat/chat-room/server-group-chat-room-p.h | 2 +- src/chat/chat-room/server-group-chat-room-stub.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/chat/chat-room/server-group-chat-room-p.h b/src/chat/chat-room/server-group-chat-room-p.h index 724d32fb4..bfb58f200 100644 --- a/src/chat/chat-room/server-group-chat-room-p.h +++ b/src/chat/chat-room/server-group-chat-room-p.h @@ -84,7 +84,7 @@ private: bool isAdminLeft () const; void queueMessage (const std::shared_ptr &message); void queueMessage (const std::shared_ptr &msg, const IdentityAddress &deviceAddress); - void removeLeftParticipants (const std::list &compatibleParticipants); + void removeNonPresentParticipants (const std::list &compatibleParticipants); void onParticipantDeviceLeft (const std::shared_ptr &session); diff --git a/src/chat/chat-room/server-group-chat-room-stub.cpp b/src/chat/chat-room/server-group-chat-room-stub.cpp index 9f30159bd..90950be2f 100644 --- a/src/chat/chat-room/server-group-chat-room-stub.cpp +++ b/src/chat/chat-room/server-group-chat-room-stub.cpp @@ -104,7 +104,7 @@ void ServerGroupChatRoomPrivate::queueMessage (const shared_ptr &messag void ServerGroupChatRoomPrivate::queueMessage (const shared_ptr &msg, const IdentityAddress &deviceAddress) {} -void ServerGroupChatRoomPrivate::removeLeftParticipants (const list &compatibleParticipants) {} +void ServerGroupChatRoomPrivate::removeNonPresentParticipants (const list &compatibleParticipants) {} // ----------------------------------------------------------------------------- From 539f7b0fbe25c4e1e0411956a2fe505510f61980 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 15 Feb 2018 16:23:07 +0100 Subject: [PATCH 073/281] Do not set the same listener twice and clear the previous one if it exists in Java wrapper --- wrappers/java/jni.mustache | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/wrappers/java/jni.mustache b/wrappers/java/jni.mustache index c1da6d769..e226d5c68 100644 --- a/wrappers/java/jni.mustache +++ b/wrappers/java/jni.mustache @@ -366,7 +366,17 @@ void Java_{{jniPackage}}{{className}}Impl_setListener(JNIEnv* env, jobject thiz, env->DeleteGlobalRef(listener); } } else { - jobject listener = env->NewGlobalRef(jlistener); + jobject listener = (jobject) {{cPrefix}}_cbs_get_user_data(cbs); + if (listener == NULL) { + listener = env->NewGlobalRef(jlistener); + } else { + if (env->IsSameObject(listener, jlistener)) { + return; + } else { + env->DeleteGlobalRef(listener); + listener = env->NewGlobalRef(jlistener); + } + } {{cPrefix}}_cbs_set_user_data(cbs, listener); {{#callbacksList}} {{cPrefix}}_cbs_set_{{callback}}(cbs, {{callbackName}}); From 5574b7ec7381dfa6cfef8b316dfc2a6473ed3371 Mon Sep 17 00:00:00 2001 From: Erwan Croze Date: Fri, 16 Feb 2018 15:16:56 +0100 Subject: [PATCH 074/281] Finishing search api --- coreapi/friend.c | 2 +- include/linphone/api/c-magic-search.h | 18 ++- include/linphone/api/c-search-result.h | 6 +- include/linphone/friend.h | 2 +- src/c-wrapper/api/c-magic-search.cpp | 14 +- src/c-wrapper/api/c-search-result.cpp | 6 +- src/search/magic-search-p.h | 2 + src/search/magic-search.cpp | 188 ++++++++++++++++++------- src/search/magic-search.h | 63 ++++++++- src/search/search-result.cpp | 12 +- src/search/search-result.h | 6 +- tester/setup_tester.c | 139 ++++++++++++++++-- 12 files changed, 380 insertions(+), 78 deletions(-) diff --git a/coreapi/friend.c b/coreapi/friend.c index f5d915a4a..a427db250 100644 --- a/coreapi/friend.c +++ b/coreapi/friend.c @@ -413,7 +413,7 @@ void linphone_friend_add_phone_number(LinphoneFriend *lf, const char *phone) { } } -bctbx_list_t* linphone_friend_get_phone_numbers(LinphoneFriend *lf) { +bctbx_list_t* linphone_friend_get_phone_numbers(const LinphoneFriend *lf) { if (!lf || !lf->vcard) return NULL; if (linphone_core_vcard_supported()) { diff --git a/include/linphone/api/c-magic-search.h b/include/linphone/api/c-magic-search.h index 6637b64e8..a26f6e7fc 100644 --- a/include/linphone/api/c-magic-search.h +++ b/include/linphone/api/c-magic-search.h @@ -79,6 +79,17 @@ LINPHONE_PUBLIC const char *linphone_magic_search_get_delimiter(const LinphoneMa **/ LINPHONE_PUBLIC void linphone_magic_search_set_delimiter(LinphoneMagicSearch *magicSearch, const char *delimiter); +/** + * @return if the delimiter search is used + **/ +LINPHONE_PUBLIC bool_t linphone_magic_search_get_use_delimiter(LinphoneMagicSearch *magicSearch); + +/** + * Enable or disable the delimiter in search + * @param[in] enable + **/ +LINPHONE_PUBLIC void linphone_magic_search_set_use_delimiter(LinphoneMagicSearch *magicSearch, bool_t enable); + /** * @return the number of the maximum SearchResult which will be return **/ @@ -101,6 +112,11 @@ LINPHONE_PUBLIC bool_t linphone_magic_search_get_limited_search(const LinphoneMa **/ LINPHONE_PUBLIC void linphone_magic_search_set_limited_search(LinphoneMagicSearch *magicSearch, const bool_t limited); +/** + * Reset the cache to begin a new search + **/ +LINPHONE_PUBLIC void linphone_magic_search_reset_search_cache(LinphoneMagicSearch *magicSearch); + /** * Create a sorted list of SearchResult from SipUri, Contact name, * Contact displayname, Contact phone number, which match with a filter word @@ -108,7 +124,7 @@ LINPHONE_PUBLIC void linphone_magic_search_set_limited_search(LinphoneMagicSearc * @param[in] withDomain domain which we want to search only * @return sorted list of \bctbx_list{LinphoneSearchResult} **/ -LINPHONE_PUBLIC bctbx_list_t* linphone_magic_search_get_contact_list_from_filter(const LinphoneMagicSearch *magicSearch, const char *filter, const char *withDomain); +LINPHONE_PUBLIC bctbx_list_t* linphone_magic_search_get_contact_list_from_filter(LinphoneMagicSearch *magicSearch, const char *filter, const char *withDomain); /** * @} diff --git a/include/linphone/api/c-search-result.h b/include/linphone/api/c-search-result.h index 98b858993..7a4a62485 100644 --- a/include/linphone/api/c-search-result.h +++ b/include/linphone/api/c-search-result.h @@ -44,17 +44,17 @@ LINPHONE_PUBLIC void linphone_search_result_unref(LinphoneSearchResult *searchRe /** * @return LinphoneFriend associed **/ -LINPHONE_PUBLIC const LinphoneFriend* linphone_search_result_get_friend(LinphoneSearchResult *searchResult); +LINPHONE_PUBLIC const LinphoneFriend* linphone_search_result_get_friend(const LinphoneSearchResult *searchResult); /** * @return LinphoneAddress associed **/ -LINPHONE_PUBLIC const LinphoneAddress* linphone_search_result_get_address(LinphoneSearchResult *searchResult); +LINPHONE_PUBLIC const LinphoneAddress* linphone_search_result_get_address(const LinphoneSearchResult *searchResult); /** * @return the result weight **/ -LINPHONE_PUBLIC unsigned int linphone_search_result_get_weight(LinphoneSearchResult *searchResult); +LINPHONE_PUBLIC unsigned int linphone_search_result_get_weight(const LinphoneSearchResult *searchResult); /** * @} diff --git a/include/linphone/friend.h b/include/linphone/friend.h index b4edf3835..6daca4a15 100644 --- a/include/linphone/friend.h +++ b/include/linphone/friend.h @@ -116,7 +116,7 @@ LINPHONE_PUBLIC void linphone_friend_add_phone_number(LinphoneFriend *lf, const * @param lf #LinphoneFriend object * @return \bctbx_list{const char *} */ -LINPHONE_PUBLIC bctbx_list_t* linphone_friend_get_phone_numbers(LinphoneFriend *lf); +LINPHONE_PUBLIC bctbx_list_t* linphone_friend_get_phone_numbers(const LinphoneFriend *lf); /** * Removes a phone number in this friend diff --git a/src/c-wrapper/api/c-magic-search.cpp b/src/c-wrapper/api/c-magic-search.cpp index 0a01e99fc..7716080dc 100644 --- a/src/c-wrapper/api/c-magic-search.cpp +++ b/src/c-wrapper/api/c-magic-search.cpp @@ -65,6 +65,14 @@ void linphone_magic_search_set_delimiter(LinphoneMagicSearch *magicSearch, const L_GET_CPP_PTR_FROM_C_OBJECT(magicSearch)->setDelimiter(L_C_TO_STRING(delimiter)); } +bool_t linphone_magic_search_get_use_delimiter(LinphoneMagicSearch *magicSearch) { + return L_GET_CPP_PTR_FROM_C_OBJECT(magicSearch)->getUseDelimiter(); +} + +void linphone_magic_search_set_use_delimiter(LinphoneMagicSearch *magicSearch, bool_t enable) { + L_GET_CPP_PTR_FROM_C_OBJECT(magicSearch)->setUseDelimiter(enable); +} + unsigned int linphone_magic_search_get_search_limit(const LinphoneMagicSearch *magicSearch) { return L_GET_CPP_PTR_FROM_C_OBJECT(magicSearch)->getSearchLimit(); } @@ -81,6 +89,10 @@ void linphone_magic_search_set_limited_search(LinphoneMagicSearch *magicSearch, L_GET_CPP_PTR_FROM_C_OBJECT(magicSearch)->setLimitedSearch(limited); } -bctbx_list_t* linphone_magic_search_get_contact_list_from_filter(const LinphoneMagicSearch *magicSearch, const char *filter, const char *withDomain) { +void linphone_magic_search_reset_search_cache(LinphoneMagicSearch *magicSearch) { + L_GET_CPP_PTR_FROM_C_OBJECT(magicSearch)->resetSearchCache(); +} + +bctbx_list_t* linphone_magic_search_get_contact_list_from_filter(LinphoneMagicSearch *magicSearch, const char *filter, const char *withDomain) { return L_GET_RESOLVED_C_LIST_FROM_CPP_LIST(L_GET_CPP_PTR_FROM_C_OBJECT(magicSearch)->getContactListFromFilter(L_C_TO_STRING(filter), L_C_TO_STRING(withDomain))); } diff --git a/src/c-wrapper/api/c-search-result.cpp b/src/c-wrapper/api/c-search-result.cpp index 5fb8ed578..77cd38c13 100644 --- a/src/c-wrapper/api/c-search-result.cpp +++ b/src/c-wrapper/api/c-search-result.cpp @@ -31,14 +31,14 @@ void linphone_search_result_unref(LinphoneSearchResult *searchResult) { belle_sip_object_unref(searchResult); } -const LinphoneFriend* linphone_search_result_get_friend(LinphoneSearchResult *searchResult) { +const LinphoneFriend* linphone_search_result_get_friend(const LinphoneSearchResult *searchResult) { return L_GET_CPP_PTR_FROM_C_OBJECT(searchResult)->getFriend(); } -const LinphoneAddress* linphone_search_result_get_address(LinphoneSearchResult *searchResult) { +const LinphoneAddress* linphone_search_result_get_address(const LinphoneSearchResult *searchResult) { return L_GET_CPP_PTR_FROM_C_OBJECT(searchResult)->getAddress(); } -unsigned int linphone_search_result_get_weight(LinphoneSearchResult *searchResult) { +unsigned int linphone_search_result_get_weight(const LinphoneSearchResult *searchResult) { return L_GET_CPP_PTR_FROM_C_OBJECT(searchResult)->getWeight(); } diff --git a/src/search/magic-search-p.h b/src/search/magic-search-p.h index b22bda379..0a75e5cab 100644 --- a/src/search/magic-search-p.h +++ b/src/search/magic-search-p.h @@ -32,6 +32,8 @@ private: unsigned int mSearchLimit; // Number of ResultSearch maximum when the search is limited bool mLimitedSearch; // Limit the search std::string mDelimiter; // Delimiter use for the search + bool mUseDelimiter; + std::list *mCacheResult; L_DECLARE_PUBLIC(MagicSearch); }; diff --git a/src/search/magic-search.cpp b/src/search/magic-search.cpp index 67932583a..663877665 100644 --- a/src/search/magic-search.cpp +++ b/src/search/magic-search.cpp @@ -38,6 +38,12 @@ MagicSearch::MagicSearch(const std::shared_ptr &core) : CoreAccessor(core) d->mSearchLimit = 10; d->mLimitedSearch = true; d->mDelimiter = "+_-"; + d->mUseDelimiter = true; + d->mCacheResult = nullptr; +} + +MagicSearch::~MagicSearch() { + resetSearchCache(); } void MagicSearch::setMinWeight(const unsigned int weight) { @@ -70,6 +76,16 @@ void MagicSearch::setDelimiter(const string &delimiter) { d->mDelimiter = delimiter; } +bool MagicSearch::getUseDelimiter() const { + L_D(); + return d->mUseDelimiter; +} + +void MagicSearch::setUseDelimiter(bool enable) { + L_D(); + d->mUseDelimiter = enable; +} + unsigned int MagicSearch::getSearchLimit() const { L_D(); return d->mSearchLimit; @@ -90,85 +106,153 @@ void MagicSearch::setLimitedSearch(const bool limited) { d->mLimitedSearch = limited; } -list MagicSearch::getContactListFromFilter(const string &filter, const string &withDomain) const { - list resultList = list(); +void MagicSearch::resetSearchCache() { + L_D(); + if (d->mCacheResult) { + delete d->mCacheResult; + d->mCacheResult = nullptr; + } +} + +list MagicSearch::getContactListFromFilter(const string &filter, const string &withDomain) { + list *resultList; + + if (filter.empty()) return list(); + + if (getSearchCache() != nullptr) { + resultList = continueSearch(filter, withDomain); + } else { + resultList = beginNewSearch(filter, withDomain); + } + + resultList->sort([](const SearchResult& lsr, const SearchResult& rsr){ + return lsr >= rsr; + }); + + setSearchCache(resultList); + + return *resultList; +} + +///////////////////// +// Private Methods // +///////////////////// + +list *MagicSearch::getSearchCache() const { + L_D(); + return d->mCacheResult; +} + +void MagicSearch::setSearchCache(list *cache) { + L_D(); + if (d->mCacheResult != cache) resetSearchCache(); + d->mCacheResult = cache; +} + +list *MagicSearch::beginNewSearch(const string &filter, const string &withDomain) { + list *resultList = new list(); LinphoneFriendList* list = linphone_core_get_default_friend_list(this->getCore()->getCCore()); // For all friends or when we reach the search limit - for (bctbx_list_t *f = list->friends ; - f != nullptr && (!getLimitedSearch() || resultList.size() < getSearchLimit()); - f = bctbx_list_next(f) - ) { - unsigned int weight = getMinWeight(); - LinphoneFriend* lFriend = reinterpret_cast(f->data); - const LinphoneAddress* lAddress = linphone_friend_get_address(lFriend); - - if (lAddress == nullptr) break; - - // Check domain - if (!withDomain.empty() && - withDomain.compare(linphone_address_get_domain(lAddress)) != 0 - ) break; - - // NAME - if (linphone_friend_get_name(lFriend) != nullptr) { - weight += getWeight(linphone_friend_get_name(lFriend), filter); + for (bctbx_list_t *f = list->friends; + f != nullptr && (!getLimitedSearch() || resultList->size() < getSearchLimit()); + f = bctbx_list_next(f) + ) { + SearchResult result = search(reinterpret_cast(f->data), filter, withDomain); + if (result.getWeight() > getMinWeight()) { + resultList->push_back(result); } - - // PHONE NUMBER - bctbx_list_t *phoneNumbers = linphone_friend_get_phone_numbers(lFriend); - while (phoneNumbers != nullptr && phoneNumbers->data != nullptr) { - string number = static_cast(phoneNumbers->data); - weight += getWeight(number, filter); - phoneNumbers = phoneNumbers->next; - } - - // SIPURI - if (linphone_address_get_username(lAddress) != nullptr) { - weight += getWeight(linphone_address_get_username(lAddress), filter); - } - - - // DISPLAYNAME - if (linphone_address_get_display_name(lAddress) != nullptr) { - weight += getWeight(linphone_address_get_display_name(lAddress), filter); - } - - resultList.push_back(SearchResult(weight, lAddress, lFriend)); } - resultList.sort(); + return resultList; +} + +list *MagicSearch::continueSearch(const string &filter, const string &withDomain) { + list *resultList = new list(); + const list *cacheList = getSearchCache(); + + for (const auto sr : *cacheList) { + if (sr.getFriend()) { + SearchResult result = search(sr.getFriend(), filter, withDomain); + if (result.getWeight() > getMinWeight()) { + resultList->push_back(result); + } + } + } return resultList; } +SearchResult MagicSearch::search(const LinphoneFriend* lFriend, const string &filter, const string &withDomain) { + unsigned int weight = getMinWeight(); + const LinphoneAddress* lAddress = linphone_friend_get_address(lFriend); + + if (lAddress == nullptr) return SearchResult(weight, nullptr); + + // Check domain + if (!withDomain.empty() && + withDomain.compare(linphone_address_get_domain(lAddress)) != 0 + ) return SearchResult(weight, nullptr); + + // NAME + if (linphone_friend_get_name(lFriend) != nullptr) { + weight += getWeight(linphone_friend_get_name(lFriend), filter); + } + + // PHONE NUMBER + bctbx_list_t *phoneNumbers = linphone_friend_get_phone_numbers(lFriend); + while (phoneNumbers != nullptr && phoneNumbers->data != nullptr) { + string number = static_cast(phoneNumbers->data); + weight += getWeight(number, filter); + phoneNumbers = phoneNumbers->next; + } + + // SIPURI + if (linphone_address_get_username(lAddress) != nullptr) { + weight += getWeight(linphone_address_get_username(lAddress), filter); + } + + // DISPLAYNAME + if (linphone_address_get_display_name(lAddress) != nullptr) { + weight += getWeight(linphone_address_get_display_name(lAddress), filter); + } + + return SearchResult(weight, lAddress, lFriend); +} + unsigned int MagicSearch::getWeight(const string &stringWords, const string &filter) const { size_t weight = string::npos; // Finding all occurrences of "filter" in "stringWords" - for (size_t w = stringWords.find(filter) ; w != string::npos ; w = stringWords.find(filter, w)) { + for (size_t w = stringWords.find(filter); + w != string::npos; + w = stringWords.find(filter, w + filter.length()) + ) { // weight max if occurence find at beginning if (w == 0) { weight = getMaxWeight(); } else { bool isDelimiter = false; - // get the char before the matched filter - const char l = stringWords.at(w - 1); - // Check if it's a delimiter - for (const char d : getDelimiter()) { - if (l == d) { - isDelimiter = true; - break; + if (getUseDelimiter()) { + // get the char before the matched filter + const char l = stringWords.at(w - 1); + // Check if it's a delimiter + for (const char d : getDelimiter()) { + if (l == d) { + isDelimiter = true; + break; + } } } unsigned int newWeight = getMaxWeight() - (unsigned int)((isDelimiter) ? 1 : w + 1); weight = (weight != string::npos) ? weight + newWeight : newWeight; } + // Only one search on the stringWords for the moment + // due to weight calcul which dos not take into the case of multiple occurence + break; } return (weight != string::npos) ? (unsigned int)(weight) : getMinWeight(); } -MagicSearch::~MagicSearch() {} - LINPHONE_END_NAMESPACE diff --git a/src/search/magic-search.h b/src/search/magic-search.h index 5b6caa262..c3f901ffc 100644 --- a/src/search/magic-search.h +++ b/src/search/magic-search.h @@ -36,6 +36,7 @@ class LINPHONE_PUBLIC MagicSearch : public CoreAccessor, public Object{ public: MagicSearch(const std::shared_ptr &core); + MagicSearch(const MagicSearch &ms) = delete; ~MagicSearch(); /** @@ -71,6 +72,17 @@ public: **/ void setDelimiter(const std::string &delimiter); + /** + * @return if the delimiter search is used + **/ + bool getUseDelimiter() const; + + /** + * Enable or disable the delimiter in search + * @param[in] enable + **/ + void setUseDelimiter(bool enable); + /** * @return the number of the maximum SearchResult which will be return **/ @@ -93,21 +105,68 @@ public: **/ void setLimitedSearch(const bool limited); + /** + * Reset the cache to begin a new search + **/ + void resetSearchCache(); + /** * Create a sorted list of SearchResult from SipUri, Contact name, * Contact displayname, Contact phone number, which match with a filter word + * During the first search, a cache is created and used for the next search and so on + * Use resetSearchCache() to begin a new search * @param[in] filter word we search * @param[in] withDomain domain which we want to search only - * @return sorted list of SearchResult with "filter" + * @return sorted list of SearchResult with "filter" or an empty list if "filter" is empty **/ - std::list getContactListFromFilter(const std::string &filter, const std::string &withDomain = "") const; + std::list getContactListFromFilter(const std::string &filter, const std::string &withDomain = ""); private: + + /** + * @return the cache of precedent result + * @private + **/ + std::list *getSearchCache() const; + + /** + * Save a result for future search + * @param[in] cache result we want to save + * @private + **/ + void setSearchCache(std::list *cache); + + /** + * Begin the search from friend list + * @param[in] filter word we search + * @param[in] withDomain domain which we want to search only + * @private + **/ + std::list *beginNewSearch(const std::string &filter, const std::string &withDomain); + + /** + * Continue the search from the cache of precedent search + * @param[in] filter word we search + * @param[in] withDomain domain which we want to search only + * @private + **/ + std::list *continueSearch(const std::string &filter, const std::string &withDomain); + + /** + * Continue the search from the cache of precedent search + * @param[in] lFriend friend whose informations will be check + * @param[in] filter word we search + * @param[in] withDomain domain which we want to search only + * @private + **/ + SearchResult search(const LinphoneFriend* lFriend, const std::string &filter, const std::string &withDomain); + /** * Return a weight for a searched in with a filter * @param[in] stringWords which where we are searching * @param[in] filter what we are searching * @return calculate weight + * @private **/ unsigned int getWeight(const std::string &stringWords, const std::string &filter) const; diff --git a/src/search/search-result.cpp b/src/search/search-result.cpp index d60cd4a2b..2c032e76b 100644 --- a/src/search/search-result.cpp +++ b/src/search/search-result.cpp @@ -40,11 +40,19 @@ SearchResult::SearchResult(const SearchResult &sr) : ClonableObject(*new SearchR SearchResult::~SearchResult() {}; -bool SearchResult::operator<(const SearchResult& rsr) { +bool SearchResult::operator<(const SearchResult& rsr) const{ return this->getWeight() < rsr.getWeight(); } -bool SearchResult::operator=(const SearchResult& rsr) { +bool SearchResult::operator>(const SearchResult& rsr) const{ + return this->getWeight() > rsr.getWeight(); +} + +bool SearchResult::operator>=(const SearchResult& rsr) const{ + return this->getWeight() >= rsr.getWeight(); +} + +bool SearchResult::operator=(const SearchResult& rsr) const{ return this->getWeight() == rsr.getWeight(); } diff --git a/src/search/search-result.h b/src/search/search-result.h index 8c5b87522..d453a273a 100644 --- a/src/search/search-result.h +++ b/src/search/search-result.h @@ -36,8 +36,10 @@ public: SearchResult(const SearchResult &sr); ~SearchResult(); - bool operator<(const SearchResult& rsr); - bool operator=(const SearchResult& rsr); + bool operator<(const SearchResult& rsr) const; + bool operator>(const SearchResult& rsr) const; + bool operator>=(const SearchResult& rsr) const; + bool operator=(const SearchResult& rsr) const; /** * @return LinphoneFriend associed diff --git a/tester/setup_tester.c b/tester/setup_tester.c index 202aaab1a..bb95bd70b 100644 --- a/tester/setup_tester.c +++ b/tester/setup_tester.c @@ -17,27 +17,56 @@ */ -#include "linphone/core.h" #include "liblinphone_tester.h" -#include "tester_utils.h" +#include "linphone/core.h" +#include "linphone/friend.h" +#include "linphone/friendlist.h" #include "linphone/lpconfig.h" +#include "linphone/api/c-magic-search.h" #include "tester_utils.h" -static const char *sFriends[5] = { +#define S_SIZE_FRIEND 10 +static const unsigned int sSizeFriend = S_SIZE_FRIEND; +static const char *sFriends[S_SIZE_FRIEND] = { "sip:test@sip.example.org", "sip:test2@sip.example.org", "sip:allo@sip.example.org", "sip:hello@sip.example.org", - "sip:hello@sip.test.org" + "sip:hello@sip.test.org", + "sip:marie@sip.example.org", + "sip:laura@sip.example.org", + "sip:loic@sip.example.org", + "sip:laure@sip.test.org", + "sip:loic@sip.test.org" }; -static void _create_friend_from_tab(LinphoneCore *lc, LinphoneFriendList *list, const char *friends[], const unsigned int size) { - for (unsigned int i = 0 ; i <= size ; i++) { +static void _create_friends_from_tab(LinphoneCore *lc, LinphoneFriendList *list, const char *friends[], const unsigned int size) { + for (unsigned int i = 0 ; i < size ; i++) { LinphoneFriend *fr = linphone_core_create_friend_with_address(lc, friends[i]); linphone_friend_list_add_friend(list, fr); } } +static void _remove_friends_from_list(LinphoneFriendList *list, const char *friends[], const unsigned int size) { + for (unsigned int i = 0 ; i < size ; i++) { + LinphoneFriend *fr = linphone_friend_list_find_friend_by_uri(list, friends[i]); + if (fr != NULL) linphone_friend_list_remove_friend(list, fr); + } +} + +static void _check_friend_result_list(const bctbx_list_t *resultList, const unsigned int index, const char* uri) { + const LinphoneSearchResult *sr = bctbx_list_nth_data(resultList, index); + const LinphoneFriend *lf = linphone_search_result_get_friend(sr); + BC_ASSERT_PTR_NOT_NULL(lf); + if (lf != NULL) { + const LinphoneAddress *la = linphone_friend_get_address(lf); + BC_ASSERT_PTR_NOT_NULL(la); + if (la != NULL) { + BC_ASSERT_STRING_EQUAL(linphone_address_as_string(la) , uri); + } + } +} + static void linphone_version_test(void){ const char *version=linphone_core_get_version(); /*make sure the git version is always included in the version number*/ @@ -409,13 +438,101 @@ static void custom_tones_setup(void){ } static void search_friend_all_domains(void) { + LinphoneMagicSearch *magicSearch = NULL; + bctbx_list_t *resultList = NULL; LinphoneCoreManager* manager = linphone_core_manager_new2("empty_rc", FALSE); LinphoneFriendList *lfl = linphone_core_get_default_friend_list(manager->lc); - LinphoneFriend *lf = linphone_core_create_friend_with_address(manager->lc, "sip:toto@sip.linphone.org"); - _create_friend_from_tab(manager->lc, lfl, sFriends, 5); + _create_friends_from_tab(manager->lc, lfl, sFriends, sSizeFriend); + + magicSearch = linphone_magic_search_new(manager->lc); + + resultList = linphone_magic_search_get_contact_list_from_filter(magicSearch, "llo", ""); + + BC_ASSERT_PTR_NOT_NULL(resultList); + + if (resultList != NULL) { + BC_ASSERT_EQUAL(bctbx_list_size(resultList), 3, int, "%d"); + _check_friend_result_list(resultList, 0, sFriends[2]);//"sip:allo@sip.example.org" + _check_friend_result_list(resultList, 1, sFriends[3]);//"sip:hello@sip.example.org" + _check_friend_result_list(resultList, 2, sFriends[4]);//"sip:hello@sip.test.org" + } + + free(resultList); + + _remove_friends_from_list(lfl, sFriends, sSizeFriend); + + linphone_core_manager_destroy(manager); +} + +static void search_friend_one_domain(void) { + LinphoneMagicSearch *magicSearch = NULL; + bctbx_list_t *resultList = NULL; + LinphoneCoreManager* manager = linphone_core_manager_new2("empty_rc", FALSE); + LinphoneFriendList *lfl = linphone_core_get_default_friend_list(manager->lc); + + _create_friends_from_tab(manager->lc, lfl, sFriends, sSizeFriend); + + magicSearch = linphone_magic_search_new(manager->lc); + + resultList = linphone_magic_search_get_contact_list_from_filter(magicSearch, "llo", "sip.example.org"); + + BC_ASSERT_PTR_NOT_NULL(resultList); + + if (resultList != NULL) { + BC_ASSERT_EQUAL(bctbx_list_size(resultList), 2, int, "%d"); + _check_friend_result_list(resultList, 0, sFriends[2]);//"sip:allo@sip.example.org" + _check_friend_result_list(resultList, 1, sFriends[3]);//"sip:hello@sip.example.org" + } + + free(resultList); + + _remove_friends_from_list(lfl, sFriends, sSizeFriend); + + linphone_core_manager_destroy(manager); +} + +static void search_friend_research_estate(void) { + LinphoneMagicSearch *magicSearch = NULL; + bctbx_list_t *resultList = NULL; + LinphoneCoreManager* manager = linphone_core_manager_new2("empty_rc", FALSE); + LinphoneFriendList *lfl = linphone_core_get_default_friend_list(manager->lc); + + _create_friends_from_tab(manager->lc, lfl, sFriends, sSizeFriend); + + magicSearch = linphone_magic_search_new(manager->lc); + + resultList = linphone_magic_search_get_contact_list_from_filter(magicSearch, "l", ""); + + BC_ASSERT_PTR_NOT_NULL(resultList); + + if (resultList != NULL) { + BC_ASSERT_EQUAL(bctbx_list_size(resultList), 7, int, "%d"); + _check_friend_result_list(resultList, 0, sFriends[6]);//"sip:laura@sip.example.org" + _check_friend_result_list(resultList, 1, sFriends[7]);//"sip:loic@sip.example.org" + _check_friend_result_list(resultList, 2, sFriends[8]);//"sip:laure@sip.test.org" + _check_friend_result_list(resultList, 3, sFriends[9]);//"sip:loic@sip.test.org" + _check_friend_result_list(resultList, 4, sFriends[2]);//"sip:allo@sip.example.org" + _check_friend_result_list(resultList, 5, sFriends[3]);//"sip:hello@sip.example.org" + _check_friend_result_list(resultList, 6, sFriends[4]);//"sip:hello@sip.test.org" + } + + free(resultList); + + resultList = linphone_magic_search_get_contact_list_from_filter(magicSearch, "la", ""); + + BC_ASSERT_PTR_NOT_NULL(resultList); + + if (resultList != NULL) { + BC_ASSERT_EQUAL(bctbx_list_size(resultList), 2, int, "%d"); + _check_friend_result_list(resultList, 0, sFriends[8]);//"sip:laure@sip.test.org" + _check_friend_result_list(resultList, 1, sFriends[6]);//"sip:laura@sip.example.org" + } + + free(resultList); + + _remove_friends_from_list(lfl, sFriends, sSizeFriend); - linphone_friend_unref(lf); linphone_core_manager_destroy(manager); } @@ -436,7 +553,9 @@ test_t setup_tests[] = { TEST_NO_TAG("Codec usability", codec_usability_test), TEST_NO_TAG("Codec setup", codec_setup), TEST_NO_TAG("Custom tones setup", custom_tones_setup), - TEST_NO_TAG("Search friend from all domains", search_friend_all_domains) + TEST_TWO_TAGS("Search friend from all domains", search_friend_all_domains, "MagicSearch", "LeaksMemory"), + TEST_TWO_TAGS("Search friend from one domain", search_friend_one_domain, "MagicSearch", "LeaksMemory"), + TEST_TWO_TAGS("Multiple looking for friends", search_friend_research_estate, "MagicSearch", "LeaksMemory") }; test_suite_t setup_test_suite = {"Setup", NULL, NULL, liblinphone_tester_before_each, liblinphone_tester_after_each, From babe09e560df95ad9f68c45d56b69a12853d7a86 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 16 Feb 2018 15:29:00 +0100 Subject: [PATCH 075/281] Add tester for migration of messages database + load chat rooms from DB after migration + fix duplicated sip addresses in database during migration. --- coreapi/linphonecore.c | 8 +++++--- src/core/core-chat-room.cpp | 5 +++++ src/core/core-p.h | 1 + src/core/core.cpp | 3 +-- src/db/main-db.cpp | 8 ++++++-- tester/db/messages.db | Bin 3587072 -> 3588096 bytes tester/message_tester.c | 25 +++++++++++++++++++++++-- 7 files changed, 41 insertions(+), 9 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 114749d3a..d82ac82ad 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -6709,11 +6709,13 @@ int linphone_core_get_video_dscp(const LinphoneCore *lc){ void linphone_core_set_chat_database_path (LinphoneCore *lc, const char *path) { if (!linphone_core_conference_server_enabled(lc)) { - auto &mainDb = L_GET_PRIVATE(lc->cppPtr)->mainDb; - if (mainDb) + auto &mainDb = L_GET_PRIVATE_FROM_C_OBJECT(lc)->mainDb; + if (mainDb) { mainDb->import(LinphonePrivate::MainDb::Sqlite3, path); - else + L_GET_PRIVATE_FROM_C_OBJECT(lc)->loadChatRooms(); + } else { ms_warning("linphone_core_set_chat_database_path() needs to be called once linphone_core_start() has been called"); + } } } diff --git a/src/core/core-chat-room.cpp b/src/core/core-chat-room.cpp index 511963e3b..ee9cd8a6c 100644 --- a/src/core/core-chat-room.cpp +++ b/src/core/core-chat-room.cpp @@ -118,6 +118,11 @@ void CorePrivate::insertChatRoomWithDb (const shared_ptr &chat mainDb->insertChatRoom(chatRoom); } +void CorePrivate::loadChatRooms () { + for (auto &chatRoom : mainDb->getChatRooms()) + insertChatRoom(chatRoom); +} + void CorePrivate::replaceChatRoom (const shared_ptr &replacedChatRoom, const shared_ptr &newChatRoom) { const ChatRoomId &replacedChatRoomId = replacedChatRoom->getChatRoomId(); const ChatRoomId &newChatRoomId = newChatRoom->getChatRoomId(); diff --git a/src/core/core-p.h b/src/core/core-p.h index 71feb8492..1f47779c6 100644 --- a/src/core/core-p.h +++ b/src/core/core-p.h @@ -57,6 +57,7 @@ public: void postConfigureAudioStream (AudioStream *stream, bool muted); void setPlaybackGainDb (AudioStream *stream, float gain); + void loadChatRooms (); void insertChatRoom (const std::shared_ptr &chatRoom); void insertChatRoomWithDb (const std::shared_ptr &chatRoom); std::shared_ptr createBasicChatRoom (const ChatRoomId &chatRoomId, AbstractChatRoom::CapabilitiesMask capabilities); diff --git a/src/core/core.cpp b/src/core/core.cpp index c09784f5c..eebb785de 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -57,8 +57,7 @@ void CorePrivate::init () { if (!mainDb->connect(backend, uri)) lFatal() << "Unable to open linphone database."; - for (auto &chatRoom : mainDb->getChatRooms()) - insertChatRoom(chatRoom); + loadChatRooms(); } void CorePrivate::registerListener (CoreListener *listener) { diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 41ece4212..5868ba477 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -1423,8 +1423,12 @@ void MainDbPrivate::importLegacyHistory (DbSession &inDbSession) { soci::use(eventType), soci::use(creationTime); const long long &eventId = dbSession.getLastInsertId(); - const long long &localSipAddressId = insertSipAddress(message.get(LegacyMessageColLocalAddress)); - const long long &remoteSipAddressId = insertSipAddress(message.get(LegacyMessageColRemoteAddress)); + const long long &localSipAddressId = insertSipAddress( + IdentityAddress(message.get(LegacyMessageColLocalAddress)).asString() + ); + const long long &remoteSipAddressId = insertSipAddress( + IdentityAddress(message.get(LegacyMessageColRemoteAddress)).asString() + ); const long long &chatRoomId = insertOrUpdateImportedBasicChatRoom( remoteSipAddressId, localSipAddressId, diff --git a/tester/db/messages.db b/tester/db/messages.db index 01ad041d35d35d3ab01dc5b43e87b97ea02cd93f..2eb6138103f25df9658d5e38ee90b28a66481221 100644 GIT binary patch literal 3588096 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

-5Yb9 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 PS4eM7YWMxD`$TA*iXp^J7}HMkWtjn1CZDaiSD| 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%0DhS{ulLr9rPbNvi*Z{#jUGT&72cI!9Y!e_{r$ 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�X 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≪x}1ewdXCf<>FFX9&; zPCStKY~o9a|42NN_(9^)#IF*+O%xMS?@uHAtgesbLoU?3!WcN~D% zz8%PiB>Q(9gV)TCeV*pbHT<{dz9PHx#TfY+@%hVZ&=#}>S9&pUX1Lq3UDHxHqo z9LevC*BkQ(;q|8c5qP~he=J_#m_G@xx8zU5>#g~-@%pAbiVKsshSum0#|=`fvewD zI0UcnEi~fweTC!j`u@Vnc)h!D243$epbjPZZv~$1zZZD6A1Lr_?=5ik4;HS(>wSf5 z@%o`c3a=k7aP^NA`tbVE0$2Z7VG~~OFKox_$BQ8K&)Dsm71QCyGLuNQ~$`i&xQ;o*{n*Kd}14&N&A93Cn09KK!REqtfMTlj8i z7GA$sLKj~0`=wLy`hyZ`a+CjA;!b{8YR2o2N&t^b{S+(0 z>nqr%-!R{*RPM1;r@y*JTELLA~YNrRL`bi zv%mPe>l6gztKPLEmkv~S&6sA0EFJVi7n1sz3r@=jx?Ult1#Q-gSyb}F(i@-( z;)g@q3J1zDN2kRDj~Q?iOh_^9v@TbZD~znf!1;guzd&TSsqZjZ?`aoM9Cq^1w}%V+ z<0x8U^hyQUXe@ga-Hl{8On2m_wb+w79je+NrT^JaEm~37PgXuPk`RK7R-e9jJk#9| zG+^N83~Qm4xG%BTTIf9C8~_ZU34XZ;77kajaFXnAQewdXLTF|i_8H3d(>>jAq54@Q zGl*J1sk?-oh|nM6L~wLa#xH_HuvO`H0@oC=)Jj$SvpYZP9#v=r@wC;u(ev8EqT~~r zUtzLB+FzA8oQ|k~C63>@mlckb8#OzMxY1WEe0rQy4w93VQYM73q+3S3z~`9bgS=<%JS6U5av8emX`H7n%aV&TxtFz7sadA^P<{pv_lUE z9a)ekNwt%p(Af-HFz7<^Cz$!&PwT{#$>i8Dn962hm*^9p{18s}Dph}(Nec%&r8@d3 z73o399}=L$eSP6L725i_lVowfkH!NKbVdiLA^id%Y&JMC1R-$}#3Y$vtd!QP;ekyN z`ALo?6xQvz_B-8%!m&6MR4_%S`vc9Ai_|IsiD?C{M++iQOmrlRF7z%Ajl}K%?TtpT zo*VcSX#8Y`SlYr1PifjGo1_0f`LLi+!?BMxt{ zZv_8eYb8G5JPRLvcfbL`quMoJZnAJPNDT3|`l$$mv`@bY*U$=fRa5R8xTO3 zztvb408YyVP4G?e}U{r5HX`(h_`p$%SZsWhZ#}?mO8J{a;K?x2d=~@H_q?SoAz_aDtC+cYY^$-eJA!r~;Jd9ZQ zX)M&x>RgGH!;mMYZ8ww{lWpD`MW;~&p-EU%5xM|{k^q{}w7`5eX)l2#TLXsw+-Dzm zk1U){C0}ofC&I4TUx7dXjLwfCp3oRB|t*-rJ@>$! z{e{!Ou5AV?If7loNO9RvI}2WL=*&+tOXdR!_uR)DHx^C>;kU-~w*BKfNLPwQNAUm! zE_KxSfA!Xwgg^m$ZV<^l4_*Dad)KZloPuX_u)Kfw7v-*V2g@3jW(*|9ly5^r?RES#e@ftHCy z5K@r7yM&fB9Bg#tqy8K{=>)IRjx-N%C)FrY0I-J$3m9hPRg)sf2@$;jHJvxl{o#O( zg>$D$jF*mwXAq14YzJk8bQ8Li6Sz6ppemvNVZm}a8z+VmLX8eYoLCs^h1KA2)yiOB zuRI8Q({s>>Eg%tUys@9X4iQR%KO-Kj5z2_I`Ev@CDDDF*jW1*$7simdu{cQ{P{ecJ zJJ+38c%3=}YD$C&&p_n?Q9&C*5|QbRDNJAYQ~~67CJPYsip7~5%+RAr_fh_f{{yj( z4h`y)3N{S8sTk5lnWS1H_yb0(P=ud>qp1~s;K1*^adUxK$j$Z90apL0!SbjP(MEZB z{blKm9PzHy_263?0Qg^LwR8T*G0p?dLi^9~0NN+P*nxinBAG9S-u5`!JxIna7PM`g zumsF?;7tx`enN9F(B=Ul;sSZ@eb8~ZCxdhR{OMP3DG*?^H6CbfAeB^VF6goACIA9Y z=L3zLuoDPVLpKr{RBJNC{dj)P12~-#n)rGKVHElb9Dp+q2XIy4Jdt40E@a@-`^Kl9 zKkEE+p-Ij*ZoQVjvW_U&dVb&g2MYuqZcV1*5K^Gq&$?~$vH(9xJ0o)w-Q?g(d=xxo zT4bKz_rn_tb45W%Cx8OARY2I^)CM)Ca~-JxP!z$Q5fRF1z1H)IhpsCq{BS(5JKr+( zAbdTxZ9Z?`-C(~L_&-Q9e$qNMu>knrGzfyfwiFZ&SdA6DFN~D^<<%tHJh0oPr@Ctj z=Zp0)qFKL)4FvHLR8F7B5g7Y@#t!aG3*rh3*r*C&I-_%dgO;Ha#7b2G&Tp%&!{*JZ zAS9kenV*t*V2Tk}gWD?RXLK8%ii``83%1y$2jx21pwePE!N$B-G+aKIF^VwAcTIn$ zH`5JChSUn)iC>~%WufZxSOn*<&nLWUA5fpn4CTt`O0%K9#$0dDKw}DVSUr}GQ`|iY z3xovR{o{y%AQD)tU10G3q~sW?*~4-WJq~Or40hCNNLvWcEMEO;qk*1dM z{xq7cX@&Wm6y5sTSq=L9{Y7WU+D64ZdGBix(CN_3%JeNW1UW!9b$X?l0<62HM>>&e zWd&A;QoeiOnu1~qM=Rwpv%aRgqZ5fn_IBXY?>NWZzi^Qn#B{qh=CKkey0P283^LlAlC5H|Z!26ZCSokL62#Jzya*_ky9aJ4v|SSUawb%b=O6S+@&hERjZ@EWzF|{=IMywu zK_O!Cpr^kyouSWy#)$z07hn(bW-{3UWM0w`Aj3VKnPKB04`eb~rT@%L4c3Ri|LFf+ zWgY9h(>c!mv5l&z(O=sNi+928M0COnq+Nz{{)C-@3*BcV>}OuWcG#s2RoD?p$o@)c zqTurgQ(UT=P*=nb!YE?bEQ-*SYC;KYF56P)ZW4pd~VE+m_YvlqC{O_&+esACL=I7 zw+5k6UG6^*a2FQZvbcZK3HtOT`UUKf6!*oBjvioT zLslD$p%(!LwBM!>=2SxiMSR_Yjb_4e%;@9FrTCkFB;vzVhs!;`u*bFToWgQFLBSN&wK}r%4#xg&9oq z!ps(T&w>FIJ}}OPgVf>@7Iwg$W2-|KV2@zEbOM84a0j_r6npd%-fI{;gE-alvwoa- z78^E1qGIXAd6~lH5~+(;LjG5M5ibe_9~j5M0H7(#VlF@hAbK)tCm%fj#1+>SE|V2C zvJ$3&{8uzafj*T40CCtXK+*W$^MATn_}|{m!t}3`P>FxBy_@~j(c1t2H{ZD@7p?(| zAP*mlMS>`($Zd>MU+})&w2N_yA_Cji6WSNg+s!~Baoj1F#f8DhuEvwV%T|R2yD#2Hgc(w zL?*k_igo6_aOtAWg{vh@7VSx4GrldG<1{v~kk&CZi+MmS0Hx#*d?e*hP6<*ve&M8! z>kA4AtYw}N=31bI;=2Pq?-M?@vT&6!<2jM1?az!Y0txDYgmNj-BRITc58hB%fzNKM zPe*=sn4J)o2n0|?nnf}SEN{;3s6RGXKSuoTWGgXfo$PG3S0Vl%_~jl^Sgktb%s3)B zkmgWK%aA?QM@=jZ(jQRAz*nycoB<>)wa(aDeOds_zm&ACrrI%+5g(&hv}&Eb!+IN8 zA`aX}AQ41QTu@R}uv`e#PVi>GPVm!Qi?YPV|K47>URYxCQUB4U^Hf+;orZt-0@2hK z7J#m@PvS0T(gID6Aa0h@%TsAFSr*wPr&BlYg^mC14i&D$j>Z6868A`%=mbpn<%8k+mDs74HTm* z)@+*J=(!6};`DN2PNso)_}G2x3xpDGO~w)qfxB3)8G7<$wfK2}`0DJJ1$r@#Uf`Or z=KCJ*FAzhxH955w<4a>sR(#>EeYO?aMMG?jB%&arN%|l*^mGhn5Dx&U4#RMy^(G{w zmYWB!lJ4(LNyYn`9%HrLerd)3e^+9j^JDw(){S=VRc3y-x6mt^X+#T8v3!^*8+g@= zq9Tl$p>`x#$tj|yPv)q}R6A66MrPu9&KGTRL{izUCecXDVqgY{e>c^ZYYsYuacm69G~@%{C`+^Y)f#BGQnxdP8R+6tH; z?@Ns&oFj&+C*=}BbnW=g+5+K$TkDs_VJH7Ggjj`pSnTI#UR6-Q;ON+%|2^t7MxSWS zPiJ-)hz8t}oKlvXg$`95j2fL%fxdj<;kS|h>j3!=|9^kP|M#;Wvc7A#yvh<_>dS2| zY=op~?r z-?6Q*UOqNjKn0!Ts5uIJERG732U0TR0Nctlb+ISe>)ONy_Bv>5fymRXCO;T`oBo_! zO^eP!!~&vRO0}|^Xy$dR^`u!8u>@EKuJ^ge*E0nIP&X%6$$dtw@6X)JE0y7lb@rg_ zRHz6wju6i{5!_{WCdJ{db@N`FvCoD=zdW(}{}C$&I@UF%fCvVoT0v)ji{VnnBobqsH7p7NO?=u@Vh?!ED`t z5#1PCNKz6@#>-TR#?K7b&P)QS19)4DU9`Ln_70@X5W>#n1Hh7}#LV%GL_{AEE6>TV z_}1E5igC>YrnHn#f`Mdc{Hbk;@QiDEPlf|kaGlV)y)Y~crV=KC-2IcQepC5Wq?jSY z-grJf1TR@LV#;u{A3``}1B_0jlnpMNoRQu6cn3#{ zL2n4a5)kLpy=V%>#$aUXj%K}_D-iOxIT=d?_@BuVzY*&pwFfUA{3*5nvsU5?O#fMC zWq|-*zA1YykI(wNU7?_!deNkpNk zegER{e%lJ$puOAbha$yObARWi6+QhO>w44U>Rc|A)I9buzAC>`2#+Q!wm-pY66L1M zy=L}cVGB0UTpx|M>90B`j${d=;fm|ry257hYhqyP1)5iazOGdLiA%1^PX&8T)}X5=3wx_lZtE3~ zzIgMc&bO=~%AV*nOORy?;AS=8$fcw3AH~%YO@r_pQagqkzPM_*I8FE=7s-$T&(9Hb zwROdyH8jo1L$XemT3>0BC90fItDN}R!rEd&40#P_g-X5vxQlq9Eb!lbXKW}EPkpK> zti@xe*aH*^jrVXH%xq@-pEA;Gkb3bR09jf4knxiS88Fu~RGcm<9j3XN=`YcrZcsQX3mQiu_n<;Bq1ulQe3bXpZvT#v&fttI@dLm7e-=1 z_ET8jyn)#U?0-emclSzk86^n-ThNhzDq|kM+dZjRkKLfgtu69^!VC`aiPZ5z?gfQy zjD5fhK}QT^9ES`chtN4Ri1KQlAh`m+g{#D*Hm8)LDNkH%f$YRF_IZDlGkF_Gsp5(5 zQAHx}qF_r^bJ*eei{oV+3hhmj=5em2K1Qkn*(u-ffH-Sx2ffZ23V{M zef4r$hq7o#=wqrGEN( z;eUG%D{*7uAm>BQ!9e@m5c48)f!TWA?cn5*MZ+u%Di;&nQpRZ z@OCvxjf)H8l|Wq<0MxAJT6D?+55MQUf#M#b&ts(mCo1v~*p((N`c$3ly2g?-&t6j` zIDB(`Gz3^xuNcRpFyjwUyJk<><78=JIUU|%iIN~>)HMX3 zR=ep44b_2}hzvVn*NmFn0J*Lq9ERH=>(Mr$mvi-X?h(cP)Pjgr?&Z%BKIs>ffHHx~ za36JwT1vt(($lArfAzbmasUe@Ek&Ys6h2RP*xG;{9;iBcUi7U7*xq5?`cNBm%vsvX z8t^KjMKz3I3cXQjNM(>6LIeyQAUs27-b<_Q#~r=}JA|#OcRDHN-USzm&0KxmK#|Cr z%`wW~{8?b4g>Nq{xwE6VuPk{<^!@log;v5UL7qq`7Zj`cA`k?fHJOQq2RnP7dw7wM z^El zb*zfqkwnCmqMiE1E-Q~f3bvkI_w6uG(HG^)j6$l;e-WuD2JOwvm?18~{8 z7la*S_Kd%=X$rW}p%S;N3uO0xU|*xH3(H0epT)z)!zJt-Yx>Nt+9dAl{e!EEhsnyi zNo+Yx1o_Kwe>X;H`%P#SE*`A5{*jSP?*C*LQNl}+AMah%EMjM{+?4^LSxvrHr%u#b z+SF_)_Gf}X`m=B^Ls{(TAXQwkvJU>6s>$-fYv@8qn6!uHUKUUApQ*;&I&7EvRSIYk zpQT;{Y!#xptR2&V?YM;W6AkuPkpFw1l^AwDZM_fue{=}`IleN*Mxl>bSy=z0x`=g9 zp&b{1_ZncN4u|oTdl8v9nmV!G)yPB`K?a79Uxmm7Xz9^AaY?F%`R2`Uk^q$WbU z1RcE8#Y)H;oWVpPNFP(Vazh;iJd;DuHFnAfCrq7U=z$$%9!BuX2Y$*uu6T+HWv#o6 zxPAYsvqe-_vl~&(M|%r9@x&7DQ=!-9H_8MtUcR`G#=<0J_Gv~l+>U&C$(&SCF(YI2 zg$4u{#znC)=vN#4gfd>fVm#UG(15yItQ=K}ee(h9(W=I9wkIK)j)7-J&OFa6%hxfdhO+#f8jP1&rr#xp^-^Rwxz`EMYLQ3ifS;B zm)cCa(saIgDNRXR_xQq2zr5jly~Wcd`Zn2`tQBiA(xb0MIi^6ekMtn{8aNGN{^$*@ zA)?iuydhKVx3%~>aGOUh_~oR|V^RbIZU@2C6;D-y**lV8{Fx^to;KW*Lw~j!1`#c) zFJCpi!M-2-|7I((EpdeNcI!#&&6ol3+I)2t33k|;oLbG4BAs)>G-hB!QZPW9>Vw|T zt^+mT_#ge8dq(kGwKrmg7J}@JNdVo+s53APYyp<(u3?F&-c)VS)`%NGj1K`iUw8fR zZ*VE?)QejqNhU}u1NTE~oet zx4w9eimEB(B`$X!)-CbOhbTM99CmJrX&LB?l>Rc?IhtX0LcMJ>ll zGx?_`Dov(TVv=L5P~t}q+g?0Nd@OBZ4UVZ$J{J7{9_Ih| zx8CD?*uL4h;I(1@(W@f;e4g^C#(5@5j3Ie@eD+lFeDH{OIuZ9Y@dK*k0reIYy;*k=u|{C9b5vK-7`#`B z8S%oKEc>x_#U`;%t_ghTQ$QfRC4Zi8t{`vHBw+|>9Wq4HozaV!AgUQn3!XFY<-gY5 zP@E^LMd$zh@BR|MQYa`u*oj(YAtn(T5Kya4jG1a0_~r838|*8<{})+_h1Nxw+gq|f zZB45F7h?MY@GDU2V?~I==wP|DybTh9SuB4En_$#=59V{F7|Y0}tJuvFViliGD?)L9 zXI!?mc%htVH13A~iPqwbQah-Li!dYla@e3sct!CDXj}|4T! zG(HG7Ri``RV0#J1HII=K{FDllHvky@Y(MVbl>IhYXC8tlKLLkap}0Vyxw^Pel=u|# zjLTU*0TBVu3jIFZ6#GC`T%5boJ-67b;yd~r`~^l>{Q`%gWl$n0bjGtlPJzTXUq>J+ z@|*bD0(hmlXdG`-3y8riMSkz6YEHaM-SbLMEPBLu?gA0;nkT zAMK7XYMaPBS2guy7J%ip&a2HgnnC3TM6qT{sR=e|3=@ornl23jpc$I;JSBCy$&7YE z#*E50Ej7_i)~AnjmlhYx4o41;^bCTIV1d!etitm|0?FFLnCTNm&ssmIkq*Xs#cvQE z0kjWxkA7kS{UIaNSR2IZu@@x38A~~y54N!R@M?)Ni#vCX9!AO#_3)At} zWc{(;onO2XSBCaqRRCc`6MW{Q+23sd(Sdk3mbH9Lg; zxWYSZ@~I=iNVB*}Z#b?mVP02UCW>DV3V-7JuFzOS@L56Ey!b=f|8>a!C*A@J;6I!L ztefoZ_QCPEd{@28-MdKOU3hZZ&=&EW%^~F`rte;Qf5o-{kFi9EHdSVT?dl@o)h+T; zMc|2zYfug|$T_lNPS}@}I*O}=>!Rz!{iPQan>esYL`Y!<2?X3=hK^$ua6(5Jju0_? zQ35k7nim38Jp+s4&3JQ%XhmlQP)8jNDihimQaZi~sYd7;QYy?8h$^k1f~$mJhHh)+ zv+l9Qt94t^)lfl-PIMGPC6Wj<$-zpzL~MD=bhxNeEFqH_p{$Hb)C_@|d62oD>4c|1 zMpVn|o9y!*=`F65OIj6qc>b3(Dk2!3ENimo{&-c92*7RiXGSg;Mx#2xx^}R<9{ch4 z3>1k1+)_XJ(uWDPc{SO`ryHDY(Eq4_7*4Epp0WRIcUaHwD!vZ+9M>wYhGc6^YS1%+ z;{#QVDUTnGZ;muQCIP7_r$tdhXqbh>>SyV2t822mPEQv*gm|KBef{<73h_|aRrRP( z5~<0)?Ge{0wyQdd_T~M_bgWg&>=_h`mujz?MC|i{6(k!moUOEV(^C+#Dcwc1r19TH za95*-oXEZO(>%XM0QI%pQnaEG#Wc@#Q|>g}`wgUm6_E@T7}WPW8-V)5te2iAylAs) zlfCgFEVmVB07bKZrg**3pROE1e^Xr?UYX9Z;LlXPg<$7DlzeX*$!V*2j4GXK*-(nAm0pY))a> zvGl~#6K#cmz=!t^6rsEhf;&^OVsgje8r{i56rQ>2^S{y$46(!}1P!;ze*fX9|LvrJs2^Dtd6r?cJMr<< zn(i`|8qnSvJ76}p!-`|EBFGEzY$;>UrRmr+HD=z6RDc;csRN>Ns4_*%%Z5}pXRHJA zP{#d=R3Itym#8W;68Nr18|*WzY1V8jffxI|&Rw`)zps(H;yN+WM>MB~_k>+Q*xBs5 zzFUUrQ05CK8o`aoDqppQL14^^i0ch*9)PorCIYW>iYH_$aZHF2zef)hBHB`F*ku3c zCi?|z4TE#hjzLgt?$Ys-z*!AsMl+~xeEfsg6?;MMt@Y7Pa-ey%-1LOw0lE;pKmbKj zNxH)C_s1pPE$Yx*>Oa+ut||6GpnJz0L2r{jY3RVmKj>~Ot`*a0Bp1o`{-)qE83~Tq z6BHB>6H8FVrNjqt^wRwR%G!JCzGf4!%k8_dsT zvZdw|B*-^PAL1jrfo3Bi^R0xKuBZcC+e?p)ksbZ4s+Cs z3|)iKB1w+i$7(}*UMKXHbg*WmqCLH**|NL7# ztJJi+lZ|^$<@6n%{>bUY0b#2f(~)fDudyrR)3Op zhQn?p{BJnH!vMv%Yrr)qG?ZZ+UTP9DUb>*Fd^694?MxD#?8c#HSV6KjxbbcViF7|3 zV4X5E#E=T~3S+urx1_qVsU9Gw!ZPGMONlsDOY^Ick1)HkQbvM2qR3sunVC#^z8zXJg>H3 zxNoQvLREJGX7568zvh9QRi|$(Zon2=>eokJQc!RVZEMIAV?4Ks^+RZY)WlcwdebC{ z4A>Jmu%I%fkHvp*uPqLNsaoqtqN@=DpZ`@;S88*Ox2i-m!fL~BYUWWkIT!yQP*Ju@ zQ(+d#E+8m~sd@9V#hhGbw2%tA%yGR`7<-7ghs0d7EVv+0Y8J9Xa3Qeh>F1&US0>ul zyA6>v^qVF-`BEV zpE%6=hI1bNi7xmpqBUJj0!1)(nAW5v0>LRI95Uen)eync9mWQXxO=*2m~(1oOCm#N zu(`nxbxn@DeM9jE$e`AEsL6qb@~B=U@Z=z@W#suG!M!ftT&fpCIWd(_7tY?gqPS6n z-<&wY&)@HEhE&E99yptRa{5WD}6IZFXwJY&4l&Dp1IqX1o(G}zIvbUn9b(0t{CSn)1uKx{B01EbF>6pTu56W_{sV#710pJe`Tnw7EaC+trA?*)AON`B!; zx2s>E6?RxF>{0y5=7Nf@WG0)HXT*pw33WnM_H?1bgFo)=3TicJavm5;mn@O|llSB= zq|PR}rVw~FGPerLuhjdAHaAh+COX^HMu$CdF#Q@MltPiUomHDv%{v_qK#-+D%qGWy+8f6Gyk{2Js?F9Te-MwBb{S+WyoxggX5IKkrG!uss1!dLa1 z0$)Ckj5g*oAxSH3o}*ASS?$6Zsf_mUxLL)?%!kyr!-_NW3RuVkku6JUq17(?Lr;C{ zEOr#AW%{WcCbHP*KOs2i*xij?#P7M{{N4DKDlnut!J&R5YLzzccv|!Sw^)fcBo1*N zwEt#rwP#qjypkfo_p`T@>Ll8u0hkD>5M+n>wVR9U0~;EuMFwubTpH6p+~oZEvBA;| zNP@N)iPunt%gQnxSt{Hq*$Vparb=scxY_x`H`kXGr&`n35l4k9V#|RU?d!ag(yOcq^CcO5?IpsCg%-C4S1`;V7uY z{9}#5Iy+XUN(44+?l!#~ES|6Qm2wbBYzo__m;%%aQOjr5d zGh0g-zKvBh4?Zc)u%Ma&0EhF)V&Z=`IbS`i!G0Y6|C_ADM-pc{Uw1CIp2jz?#n-x0 zgV@swxEjF={#1E+8gp%^pBSiv?~cxS>gHh%rZIj4j=ioaap-|=Z)taMK}&K(ZP$qP zf+WtX;Yf4X529Wo$S6#Z74rrHRa!#mXCYPAXI!lg%y|HmswUd;y!(6@&$o`&V>F!Y zRF2l+(XK7+CKMf=K?}5XLZc&?YbAMKEVf(oU}+{6YpIV0DG3sv0YsyAgcqHW!`IRg zENkD@U#bVOwk5T6B!YOtR7OaDs+Wd^)PC|~SC*1^&gS~lBL$v+w7{DgnPLwLGY%?$ z{`RH@>%YMNr&!i0&bOR(iHyD44w?Vs&MNHzwm~*nC2z!&2MWgJ9Do%c>>ZVP26EjC znW~&)m{3Y_huRs8MNDfw~zDOJbeJut?h#+|| zWYJE;$`^Pc0vZBUCa0TN@%1gGeQ<4UF#?5QL{d>BNDi6ObQxub$Tx7Fvk>>a8<>|s znVb@=F2C@_#MRa`cSdPn)%UU5BK-Z>sU8Mo(2B2LQ6hwSTm3PSG#qvq%SO%rXiCiO zclRv`xJSKvLgXh0aR=st3mShv;$tbKkvv#s=u(oZakexy9H%xhF}n@Cu|K^&k5@#u zyA34*%!4iul)XkUkpFEg)D}d}Zv)-+=#)r$P92QwV_pK#KiJRCmMSzX4uM`7|6`3P ztSW?7w9*roa^BIj|EF66tp9QC5&IDQ)935ynX>0a=K&uHO()&$J?G>9rvR#K0RBcg zyc>EHOrd*R$snLEn*0Hb`b5NvU>f$~>4;}f7BL|E5DoBz)v1(-o>&6{ZYf@8I>URW z41v8VRjLvjRT1*BJJO{CMYTjn2ZF2v6a6F>Nl*!J;$3sx&7}hTKX)q zz!GxUgjpaPjqY?z-1L}RUlKNn({mZ9PcUoTtIQ(4HDn=_HAWnA_~CMTWyS-OhOP|e zWTTWU*MZo458Pq68!9kw_^sPt+D}3xG4TI_3<|7=V{O-2Abj>p;6sx4f*5bIg?da< ztj_v$yqRUIQqS!Tqps=TCp$Cuh__ZRiwnpfGCsm@067Z0NhJAk*rqoamIS)3%uUol zpEV`coZVoRq5sdetg{nuPwZzu;k?Q2@eu%He&n85Iv8RMg_PnBR!N zTDM?{Qr7f=qC~pjx^R~vMXre#Td@4CyIb2!M@WQ2HxY4QyLuluh8J60t8|zMniye7 ze=mTP$+9yRDA3^Gzr|2SSp>!^ji%MHT@^5#|8ypv`w*&<@r5>SUFmSujJr)4W&cH6^#{)@)yaMr~6QYEJhi!a}@)^ zt6nkG$`W4j;qY@+JHPr}Z|M*$?g6eu&`F>`jFVXbQ9SYyjsJbwO1w8Q%lV*FZ@<@` zV|^LRPUfpbE?X60Bm~iR+&I<>1hA4pO%@0J#BOg>0^jb)gHFTEqMobe1~a-lUSIX=j|h zy>ygr%#Jkg{Wlg=aSBE1b=?|c$D|;nFC z!wMTz354ShwL?_raN|RkD!O0Ow2x=pvr9y?0sCblsodX*^@@GDek7c#TArrVS)yBN z!%!UpvIL1!F`OH>L9C50Bh=m?5~BAk8VnYsFVW zk-9YTz^4O31mm7SG()bJ#eM?cqDTt}cytco%ElyJr`@&LwM(<1Ali~cap)s#V>no^ z?F6#3hvFNcg_y~n%>cW?jB2mEW&Kc3n$dkIj9V^uk0=rB9Rnp^A9*&xx;$oS`&d6B zy8nM#?(fR~k64NKIX|}^aoX&2UwvMl>Wb@2bHrXt#kpyJ=2-&M9>y3kyTy${(P!|0 zucm3g`s&EuC53RkaaQEb`U{`s86v|FOr*a9$;nUoleREYvX+XH_=<)?yR4A_r^ zp2vBs(lj9;68KwK4&pmg+!-60aqu8f9!^}OtbQbK7$|qulFpC+~9^*qt=PlI|9-D%i-zXSkLRJWM${-rH zdw4C9Qr)1xl{=n(%DwL4rPpb+=A<|hGE5gvyz|s+l$64IP4g=d>Y5(Pjk>1k$6wH1 zIukU|lAIrBdqFI_z(6YqW0@)!R!Zq22ObQA;0&zNn%o>`mB0&w%?3#-$^k*O>WxLV z+u%ue---DD>9`6&JM9~D7rv;8@a+`2i1BUMd+ksph#gWnw8M=;rwb=)Y6nFGUj`8q+kK?%!yllG zb|_Ls6fu>?*nQQbg12z>|^9esYrP#OI8nw69}PW|qN(p)&3 zt@Z1KDkmk$E~ptPG>p!us`B%yw~GfE+CEmimyf6yG1O5rv zQvmni1i==EUNGR^P_HNz)ODBso0}}13ylDOOBpfjk^Ob+1#HxyxP)l5(-*&MQ|TP>^oJu4-+w1d1nU=+#+oWcF)`{v;AS+& z$XKmJThOM4UF$i#{=^2S8Tdb2twb(ysPhSHtNnd@jrG5;5)b#5b_J~Sa&i7B)RbkV zUz%)|GMuMG-amI!sac48edIX@O8?2F;-|mq-qoe^W$jqdcK)WqqJF>jGrh>ItwW{x zvOsi0Jx1C@BhfbUf7GEWH#TtRX#&^#Xo{-c;w8k@1|TqDMnlVQ1$5$-BS` z)6J|})_`%pb=HX%x__U<{LhSaqJ6u4tRMgPmo9|)v zKz400F!4f7=l-?GJkwem=tXEt-1Z!FhjCn|fA`>QsTJ$A#F&B&7WUPJ%YnT+Y_OkE z*Z|8ymXYqpG-^YnHx{4=Fc*~ozH%#0wZD3;VYC?ba53%_9E>})OD#(K(<6D<|3VkQ ztf4op0m4e479J1-h4Q3cWm%>JNY}8=ypX0o@`LBP2bC6J6Np&Oj@(4pLr)NXnrV1w zUa`_mW*$n)Ae-yn-hXXh=>idPYQ2VChrcZl3HFFQ3yRi^9dvtJgZ%{j|NE`PyAzf@ z-MPnEfN%aOzpg4Rf&6JssyL1i2LAHjMtmAO>1&Q)pNv$2P?8TWsTzt z-{~3DAi7j>`e3|r=s0}2N_!KFNmBi$-4lKSYad|OLWRNL78GF`n0N~(LRJz=c*@@s zR`{yw0fv!Q?9&5J|KqW%N^Kz7*7|5Y8EARIj7>C4q$=(c`5t*f+1 zVimEHW5qh^0W33y5ko@k&J{ibX|p??MqEdg+G*a?UaG=KSx1mr5!T%&(on?u7j z^Fu;gmuDPt$Y6<3yHlxM#|-35Kf(cuD3TdMqYSbD!)zdB4VpX)!pac&*+G@~Gmgox zE?q7>743-x($#X7)Co!n9+e>lgd=2%y3;gc-$zj#M)2odQ5-e~Die)@1lw2N4px+g zSNw|)5qFeX3yqlYia?!|*$C_aI+Qq_K^S1hUSC;Nx>VGPCg>(bN}~oN_Gfh7gMNPU z6!*~5QauedHX>FCvp1SqM zCEnruU*|~cgVtR8qIk^TRaz+rr}YUDkL7R6A)?MeT5$VpUDJ$9A9If?T_x=9#)}X8 zmS99z7a^6*wtpm_xTF3dP>Hw+{4Nw47MpDA>Mvalu4<0aLFg}zCX#>zm#ugN2i`?( z9$g+X$+O2QIQzw=6*znJN$o8vIO3Xv{F24QoWR5mWF~viMa#%^#VViQ=$Z7p1`>Zv zoq%?kC^uesHE4-&@W@a`w+;ryh9^*NU0W^n{(r^a<*q4RFML1J7Kiry$=nwvC5By1gIjasi0RU3f?PNANl^OH0WCy9fnsY( z_7axtC{&uGIHdyn&gyrl#~6hoGu|=7J*-4kXwF*=JmRGBfW4pV zEnR~LY)LBfPg35-YM_MPx@JWAf18!qo|x_&Y~OBevv$7XoLyO9sFaq6O~<*-AYtbp z7Z1v~;HiIjlDki-OUXGp0_4wYUbYK{J}m5N8h9A~cn)qJ3VUR3VGl@ZktFrRQipji ziDC#3C_vL|rdR)8-$r1V=(EU4MF)occQpaL8Nt$EvjrmvR7oI221s=?-*X^+J492C zES1X%^RR+$##GV36o;|CN$WBIKby*l0gE+j3lMQMVJ28rHnBaAVJ%d9S*b0U< z*)E0!jf*cHkpa%d6;-@AanrC85W2h}crzY4W4P2VWT?552%ZZv3nrR90U>^A+O|>( zD>uihN$|h(fcS&-qYh?^_D(HgNM!^xxcMQYmaQg{eN_4!j|db2$lw!gq!L0pN}iJB%D zn1T92;Sz6>srOw4J&95a<#ZA-z|p7>>q`q?c`=dkj;7(Y(5AY&eP)24Rx`L7OOE)b zK10$A>q=|ELEfiF@Gb<^gcpz?s?ciPv=`mBQa5N7k>XhXP@n;FsWzX646ZPh*EwMJ z%|)R&qCB8i79JsIUe{~HJZ5d7q>e7q@VEU|#O|G|*7Auit~>wT z?vwY8I5We$Vw{K$rf^RdS)ko7DQZ!Guu)c5CyB(79k#X>CM$O@#YRM z^t{eQESaGgIp z*V~WU?dX+#wZGhzrD2gZBe4opgJjK0Q)ErgoAa54-bi?$ILy1MornknK(#4JTaZaf zKpnKr)ie)lg7L2-Fv3>^F*9-^Ve9U^d|ioP!EN=?>MzW)Sn3%0VmdFiZo`jfFU1-`tOD+0hw6?8o>+w({ zgSwySz=8jMLXueUv~aQGMlcFojEAGCgg$VwyI&~>8bgFd8#W?Df&X4EF$nO(bSV(r zLFj#;5zQJ<9yM(WtSG|$1h+Q=e_svoy6X?wQp$?`vR}R0=QUCLv#6i}HPA|Iu@AGH>;S!N{o0G93FaBD{SUoTp2heT}QAEU_n{gmZ5ZKa?e1=+Ey@T7M>3|r9=b4%B(mlwy&>J+kQf4lnHq1!e}rFv1E#qs zt`3J_A*bne?bZG4c-%4h5>8iiAUyO;&FFR3FK{UddURn517@=F5b-n7MvRc4XJRv0 zu(DFIV?Nyj2rUU5U!1zEuK|PHu;X|@L0Bj-`BN(rFGW^n@wAVfHd-s5{qZ^E_QVBF8 zm%?7}Co+tQx{+Nw(FxGgfmj-~S@%#+Cw7JkcA1Jn(+E(WI*^NT1$IaxjxfOSMM^(U zd=XS}4ev(PS6GlR>|&a+5Spuudx|PaNb217vMtvhOEXUR(?u$-on|!1dg&GW#`jJ%9C|D@)rT3!3YrT?l`*>o*fb@9*dLH&~xU{OM~#oP?69EP*A%sCtsC^sU?)-ke}I+fa~{Y1uiNdSb%4DwSKdQJ@5(q%NtoyzeQt2C5!J`Hh=#|TTFv?o>@;M#4IB#`A`-aaN<1{4|# zg}XfpCBPV?np?@%XZcW6mn*x=d&;xwdXswA=p}Kgt

KH$Zz#v9*szGD%LLH?*Wi z9o|~5?N0X(d2MaUGxl_o<=vFl_l-PMf5o*(y&b9agRzdV6`hPe`nY|mYzKy7g2p-I zj$3Qb_Rv|wNHEy;{6RN*Awwo3$zA)nF{T2_Vm7C)YjmAy21$AU?1?W&Wz-~V1tU?v~-^kal|2E%w`6d2clh-=+Q=o@qX26CK?B@ z6=34yv`h?`>KUF4f#SP4vKiaE?8$ZIy~Tpn2yFyK2kviqMnPn$f;pB}Vq0CfqqV3i z#fFtu+MaM{miJN)(uiopdO^YN7yy}`;`+Qm9!RG*22UciPM~io#p5No^Eo0*c!jebUs>wVg0TtA0WCcR*`@|8;&XT zCZ438*G(r}Up`#CA8myQBVqrKUVu`|K{mhnf*^wczIXjl`7lwDTK^HYM6gL)yNX&Z;JJDi#%vHN{Uex7DKc!6bcZ_-SwsG$_I(8P+uGu7janrysjl zmX8pTI}$7R6C`pkKwbyyLdn3oUk8uf6xCG9XsY^{NBh-;|Y;#(#9g(f~C+`)$J zQl*8dlr==V{pgT~?yq>Vocn!9K9>W@H z1hISTPuzM%`8YYJ=%ONj%gVQFxBjpBBKEY;PB2=)x}N65ruXtXrPN$`zlr%#TeGDJc3(GMlS%{s~xCCIRA^xt4S zY6Q(R{MkLEd<>1ediV6HIX^Jo8E{0Fgw{MC6j5u5jY!aO5VL9|_^Htk67L$yRvl%| zZz*BD*$;XU(>~UKcHbG+eip3%vz>>nA33L6`?+V8Pf=4c6^CB~O-aP`tAKgc5_!gE z6nk3zwo%RRY!mac+8n@>8bp+be<5h5^u8s!szo|{s0wg7ocE6;=fGX>0yHxv;OoDUEuRD-HWkp6E2Q=lS{CiZW=J*z)es!SRYc7r zqL47f;A9)|u`;`|e4jv?5n?gx)@}!LMUMd zSyXCB_kG7_(W~4^0p1!(g#J4I@-*6eB}Ri=_8Ptnn77`*SV)BG>R&5@UiI zH0Oqpic2wKUDetEYvdd;q>fM)rb~bREO%P@OmGlv%iSedKjh}=Pq;L0i#A(B7d(g_23D4OaZ<4$JrA~~KvFZoDiOP!8aL}+-qOBnR zMK3Vr66%Q3-D6XzA|O(6RR+aSTY1i$G4L?oTdg|;0XRAqVn$O%_5XTWNBLBtzG(N# zpZcJEASoqesx?d-%@|Nj&3Ms#d0ECW=3s^K0%#r`L{ ztPf(_O9Igpft!VNeHClLL*vCw`@&O$;{Ny{6dMu#EmpBnpaQL_1?w<(1MR6om*@|Kz^iWkPZ`$7nzIX9%4UuI#{_v;#EXp#S2uD$Zwpz7JVB z1Hu_C<^0#0a(1HrH;!9hK1W4Bv_%s@81WmgD+OVG?Z5Ru{(E2fY*D1KVy9t>6meW; zPbGxp-{uKw{MrG^|F>G`{=dty?Tyy0_F=CDN4tBK&sWp^z$y70O9UN-u@HpOpjjne zH&=^%NQ{WIpvr`1mrU+jLohrhkl{gA5GlmQm^pX#%Ch2xM*D4nd|H8H0|$sRAPRow z+*{n~<@u`MW0aO{>fL|<(fQE3qed<+!}CmSMCr`aKIQIL{ukZI>_{^w$kJGfldUxK zN~sclfc#{41}-~2bnSDiLMW_39Y_lGE4^L(Z3@5&P*r^}fU@iKfEw#S5a+4H)=HTO ziS2J^FUFuUaoGfQ1R|1YUS@G|-6nWzs)0cb#^4VEQlGiUU)-hTCONB-=<1!Iv%07f z+FwK)mLs2+bmW+kiU#v!HR!OwU7)tHIhThoJL9NeiC%}I;u5Yn(5kC8Ld8u|4uNCWhN&u{dMI9!6Z z*{p$?&MRS-9o>N_*F$>{3QBlkV%233Uu_4y;s+9!MU7RaQt2*8-a2<&J`u)(9{84* zx0El0c5SU6j^wtG@C1^X_*`!~51vv^kJWQhx$7_Qou--V8*#CHw1e~}!z}rLbB%e8 zSPa)Vr@TJ>mm1) zF0S5duuS03*81+qlM1AZ8lzBiPta(B04`Dnr!{&i0s9*qP@2FqPa|U&M_)FW$ zmw+f+>bFKda$q2eg~ej@!XaQ;45*(dNznJuWeQo(*i>eiWluoK*4x(;c@I&}vekK6ZI|5gxg@KDyDu-y>P5Q>QguqmS|SzaYwRkr)o{Ns%WR#6SxwrB7aN z3RW!p)CnubL{NO{)CFFK zdxx)oOys=>K1)FRH@n4TX9z-2reM>w2_ok0fX08a(7mvHsgUD{Mnl5*Du}Ts;d$ef z0+N#~p64O+|E8jtC5@=D7;Rhe6H+LO&>-2&hwpALFBL_gG8vQ`_9);ifAo)Fv5Z^% zk59W-m6wPsGBQVQF=82ixe#!RHBJ1O2S>!xTIYnujAzv0a-q&STcpy5N+XqUia0rF zRi^i~Hj)AYN0}wIKD=8QAv5M&l|n!Lz6SdO#Q#@XiMtX9S`RrNu~s@q*mv&&5s)gc zkU+*+agHp^n!1Ah6;KOZkX$k}N1EO1nsz(%53XIl0*kaHRX;`COORlVh?7@lC*?3q zhBDQlROt!6_*1MZ9dMaQ4i9@u-+|HF%7j>LOX^2QJl=#q-Rl$q^+FNniG zfut=R_9?2bO#d8_5Vhz!Gk>#P<9~0p5?4Cgo&D`M*!x*;#Vx-^UkC_aCr`b7Do@R0 zhb9LaHsoL~1<2&iM&N%S+@zw?=xv%o)ZBvvz5?=qR%q|mR_-aU7OOX!*n*Vf64(TC zsnzje#2DiJ8kBw|wASCcdzV*-Q{a>3#}%( z3R;+)Rvp)lU4HZHQEtb7Zl1VddGLvSKwgC#B6n9h< zH(Wructvr=i-P;Yz1RJ66}f*E6}7X3>w5LNAbS7b@AJH8GLxJwNkRS1htH6$^S_BO(rKJ}+X*`kcHqHU>$E^F;=#hm zV*^5(kn7!WosrgHQ5f#HAw8%r$kdyD=uSN-Ez@xZ-36ZDM(HzYOA~&df(>KlD$O?% zU+-thE=y6?aKV4KL+=yMH{ty|f7+pf_AJ}g+1V?}j=>kmWm zS_-}m68b%nwnD(w#i;(`A@@R-A$$e16x;=Gv+8FIc&J?-s}m0-an%p=2X7FH+cm*$ zUxg?m+*77f3`$H`C{&N@(y!NJS{h}F;EuoD1Irj{9( zlkSxnBSKy(b#kl|H{>U|AY_#$q1wT3bzOo5wab62xCa}dcJm{ z+W$9Ni5n9$oqf)ccHa7#b>s6P0y+=w1z|MDb~1fyT*C&-2o+3QdH@ycdq4%y`qBIl zWOR-xBq3yv9H$7m{+R`Q@1qLLXY?1;IJmF86DDUbUq^-xk3RVLc z12m76n&^dqHeD}iKxpXnzKkcIrp-Qa*TH_#me)+s8rcT5f(~=;1>qOK{hNH$6Zb2X;)8GFjYc&7*vg$T#*FXwe0 zBpzo>vJ4`Zt&yRRKb(SCm%+8x*lL(?@|TMfhG>9RQxT`d!Z5toLs*4s+O91(M2E+UYRp&?Kc(>#7=Z zoW^OLF92f_XLM319v4=X;8bco0VK-cpADw#c0X#u6lA(bQK1au9+e67RN|JqK@<+l^i@^x2s5 zf^4B+4UGSTn)({*tslVu-)=eoYi)O$?ElZc7)N^OUV{aKgH8(4Zz7C>yZgk~@D#mD zNYN$sf!gW{Mio(ImFWQ!!YP(}(_&IqvsKRyagzn2yMb_ZJ**!l77oRdUQ=hyxDq`4 zqcb}Tb)p?L+7PjoK-#UY&1V>s@l2wO0u@K);OAfFo>m|xC_ueqab#F*BX$l`CjTm$ zDbsS@2+tu2W>OHygD8k7^1IAaplAaysO=dbKDh4d>b0K(cdz@ z4#YENY{B6H!x3*jQ|Iz4}gsbhVf@zgtfx5RwV9m?sX2gUu7Q|#Qp8%p+bdy;~vSOIx)yF;$Eoq+i*H;e~2)WuEZ@dDQ_cilH$yUjJWPro~gr%vV zothUJ$ZFzP`Qg|1y9)~S%EMZw81e97JY3W1OZB6XLk0t+76QR*lu?31rBMN8!1;l; z9(d>A9ZeKUjXYquHEufX7n|L|!Zd6SBZxIK7O}Y?wdi9N8z?-gWiMD^Y!U`Au*-;v zXoP_5ZV>j@$w&g&q!zati%RFv9l$mx26Kaa2?oVeqm~W0j%fsOkSBs{t;t{M&HOZZ zePODw+?qHn=Wl5GkH^#n{_9^E|2x9^0OtQWpK#XOC3^+F`MZ4GT9_+Gp}Cd_D)5&+ z7wW(fVxh5ZN(rtq5HPG5eM)2fx-YqB7v`uV9-Uea;!s@^P|P(Q2bJixX$=A6Af#Op zltI`hYKI^=EG>wk5)DgaL2a&AWG6YYlC=8Kg^{pSquHR1mt=kME@j%PFxdQAASS4}40kY2B z8d5(%9J+Tw1OP|i)cC}nE+`&mtOK0b=0KbWwnB|B5aKkO!)C*d!JirZh?9U8ASBYA zDKHlhro0-LdjMaDiRdfvT|0FgFI5~*nQ^Jtvv=4{6o{PJS~nO+m4%rY>j7-W2EMpc zg{7E5x3Tk)p=pJAaz+QV*+1fp{8eg=6{E_gs`MG>8)Oiw4IFLe=D`FasKZoh0nuKA`GBc=n>4(tsmF z&3urh5U-=cuXEM@3gf0Ay-B;XigUy|)SR+3x{#6y(b&*7(ANQdjuKO}a-fWp(P2|z zh9)ljq{CfSSgMjZmNod?ZwR-_He0D}SN?k7o$jo{5(>zqyF5}r`fJCEtENoBJ}fwe z6exQk{gKJmZ^Z02Auh}v%mB*?J;9Vc#{D;~o4ClkZ^;xC;8{ZyVb>Tae#NyC*a}Ko%cB>+xL+FpWhdx&9O?_ljG~6Mk}#1JkeG`N zZp*OC6h;vwr#haB!zLsKNu-qg@KT(>%W#hf=SAmd1F2?P*Wd`a03;1-Y9hij13hi& zzMa5?;1#)bg%fZvl}%t%6QbTp?gOggdtHNts-P|>QKS&gQ#$y{X9o+%iQS@Anh_Te#?Zc%{2WrEWy2vi5JyH&tnkbZQ6M*x1x=JjLN3;xdRC4o^{8rsm!#eVX{}))+g2YWu!P#yX?X>W}yP~iX8$@0w7R!gp zpDJ7uz>(wxomotnPE1bbuscYBtaMeVbzhi(!Ym^kbG3q+gPu(G^R2o?2 zL8dQl#HQcL>C|anJmFWwU~eUwryDbo{@mmsJrgH zrJ&H3x;Omo=s&1VpdaGxfrYni+fyJs>m=i4V=Z8R0E)`+mg$!~<~oJbWaU_e*CAdc zZ$Wwx*!UAPWEeIt;JyaBJ7Ezss;{(h{-bb8PF3|4tJu)r>91%}Aw|V@t<*1(7U)1i zf#XqyFz)D{+f;Zeo%BW&3)Yq#XSEHl4es z^OEg_7h&^Fb+Ho6{xp4gx;>2wdI(Y+PKr))b?qC@sC&!x1;wJAX#I9rdmPm3{cEo& zoFfV%R$x3pfmdd2O8|zjJ|H}N`kNcu3TKP`7HuAc$()shX@cm52x{Wn_NVKb=DKYM91Il~` zjPMjpt1RX+AxMUZ2fwQp{gnSgrO57k1H4dxmEM=C#A2u4JOwm*1C5_^BPD*|Q;(Vr zrS;o-c{jcFh5~Vqz0Z%3+T&gVM%$QusR{NFdMM7#4lXUP7weS`IlVCMh({tcoCYgNoIiDOgw z3nhqoEtFtBCEuIIXh*cNVt!nukq=SZ4wJPJlpu!1k;rEjxn^(;Zun3AC|e}FCgNd> zBJbGWXNKE^+k@$AoF3k!(LQjQ@~hzm8HA%qvvhj-jqdbW%ULA!CTWg4}f&~P&WgE7r6%rW{keVKQ(hZr2Nj<{WBK6 z2X_C3*f*l5DtvK7VW$$P!^fMvmdo)gxu4QFW9q9>C)$KvA*(bs4y6aV{=t(nQh5bE zM%WL|bEZSHvox}}F*US=8)i&BL;L^kuoAZ?j&nW-1VGn%#=4`5{huVSYzZFzDMjD@ zoU)CY!Ps@UDQYq4%$F81B>w@5iz%iJ>(lKG4QDl+{-V`qp0#>M;S%A_XzZN{uSwf{ zMt>_3(ie-_>?R^5L7?@uwL-G=IRR0M2vrxrA2ent!{RvtNtg@K_*58NE1cqWJtq6?&J8l7frKGJP2Y{a8CCx?=89z9m6VN{);_(rHoX-82Vykzwd zJmLrp{eou2na!zW0QpMIlOEoS6K#cyaCj}r=$enf8yw|?jvmA@W8+|Fp+!hCI(g`C zD~z7S;~_Ls!g{p{pvVm!y9`(iZ?20&4Vw)P5u_kjmQW!R)@z3P{!>n&x ziDv8D&JFgTt2qB3^vj{+3q)&dtvj$Lj(82z#b!*EjM;-$GCq~TSI|5n&_1Qgf;kB9 z4{*U!b4}N_;{Fmzq6+_uT8@pURU$b!146MK)LSf|t|*y8>4FL!-`asOsrniF|I}94 z9Futh6=Ouf)QsES?WPKw#P}W3Kv9_f^=F^Sbp=!n1oWSwC@DWFO-3n(Kp5d>bPlNr zOlw)59J3y39k>sLp{=S)G(Q>kkb#0oT#BmN?Gb@G${Gu^mt=qdXGD^| zFe4CMM@G`J97+9Hp=90q{!iE2(-8kV(Mq&9KXEqLpSE}4n^%za|My67TMsv?|C+)} zBpRZ1Z}|O$9&+>)0Bi#`(dU*U7P?Ky#63JxBl(jF;vmfRivbCC0nn@j$(S>0#{se* zid=-+!2ubrAb^Nk6t8FTjqC7GK=N#4G%|Ok{qBv7Nz%NUJ8X+s*l5onMWFP za_@hIJFl=sw{m*qR{XE8#_d6KgtYiTK_YQIfa3X134&09G7pG&hp{EuH0*IEoCSCf zD1;fHtE89u-v0K&<)T!hi*funhVToX8g@wV7_Av^d%|5+AkcFx)G_~cg3Wm&b2`%9 z14PVcWiJZpVB5^0UG$^ZW#uf2uqMJ`P)Hw_ODRnZvk!?C45VjK_Cn{*dI6t^d0CSPRgK}ud-oVh^MXWsh)Re!lSr{g=)2I0 z58=dHX+yjm04W3g2GtGbq?DcL9n{aex^M$dsM#2b5mbm1@(rLgwPS9?ptdp)Zw()g z<98m~RoE_~>6%C)^H(cdIc3&^!W3F!%dx-B`|PfI`!dA;7h8$9IZs-55T)`(7e~VQmA%eFuu$jbPF?WKfkTD#%)cCbwadw}ips#cF(835gka?ch6LT7my79~Hg`J?f=433r>r2n;JqJSCW~G~} zwkYnX?zw}7jA(Zi-(g1+cqx@2*EmXu@r2h7p)Q|josclmvE?8MQ>nEvle7@aZOiCD zID~v)vzc<6n#T5ul#zLjfB-`DpdbIT7xG2KRThG(mreRAgt6P!ThawZzShWQw21L9 zO$m+9K-#Rnt=@T;^8e-5V&`=GBlbDg;}!mYQK3iqfBU5PXd7HMg{j+1u<~j?2JkGp z#{i$H<%tG1PQ${;@*uNAVE~}bZghn6pP~!|O**cZAm;HhE|KZl{ zR^nvm1NQr@+y9p6U$6lQj0x2ltK>NF@FswZNKhstUi>FPR0AhMa6Wp%uEHMS#494r zv_Ju{nWMx|xspMUdWR_`MV}wAYVyQEslY-V_0^PnYoQ-R)s#G7N3Q4ZdqfyB>UAI; z1+M@Wu$d_aD~m%BR1&LYO>Jh%Ni-;z$&Yk6;g=I1pGs?rwjhN&5*odLP-kFEDfP?y zZYktp(|HBn5gO57_MmiQ1SLq!#>yxyuWlX{j2YOKc|11~ItW0@L>}Du7cBR(LZ2}9 z(9*~|2)y&H1~`bCuqIq!>{wz-OTF z(nHp1!!?=+siIoQp)x?gI~yUa&z@Irm!bbZXaW7_x6TdL2kkrU<(~fkd;9;s0-+dN z>S9^-fj4j=D@{PeX3R3pd#~IC{smlO{1R41e}==xKzz9S-~1|5xEb8uoQyUdv97Oq zT+@2oj+?>_g1oqs5l9AzVJ>HUG5t>yD&w1$PNw<^P69}GYW&M z4WsKH0|ojatG~gPes+QT!oogm2@Sf@&Q4RdV{lt0%K_aN;LvKvuczBJB2QU|A3WP<;jx z&irIr#mMEzq`wGm5f?L$xv95k%e7qBk0ZF z7;P7?x)1bFDj5A&29Xo=(aFdF9#DRihabEg{0Ct3;A1G-4O3*h;& z-QQqD0O2r={4A=}`w%wfQXS~6=@MU(lR$ei`H`p~j$0`8sAqpn{y)OH*-D)6eAGGL ze#|}t-#kw*_lzQ;Bf-#dL(RULbt{b|lMJbp#tVRwpr_<<78-rPp-JtN25BU8U<&n2 z`6zB6--BX-H4PHz5s`qO=_Fd^?dx9VE-W6Q8twE*k_=?Diz_HsseJnYO5>5FVYEYS zY>_3ZO>mPiMnDy4Ym>0G7=ub5##?RxG?$j5%-r_dUB$zNT_zem-X?+AT~cErWE2E~ z>@?179>^6B6PrBN{rT4*R4OLWR=vETUx}J`CcSeY^9nxhl*XBjKXi{QCUE*lv_}tf z@aISriU1lUPmu%pPHPxE4__LSozvZn%t83DDV4$>=}_*85)uYa?E!^~N$QPPLnx>!uMY$g_=ylFAX*3y2ooTo;LEXw$bdYr zIu}yCuGD3{)d`KVBYgvpcC6n^a4{sl2J-E=YVmdfVFTlh{O9E)()spO zFMi9v+`)-odS17?c>ey8(+IOa4#`n~%WxD|6sHNzoB7jWtNPP?Q0qPV>P_~A0VkL` z;&qbys9*q3$}55d#P}OTpsLFmjakIF6ocToZu}Cms&=BN_*H_k*-r#a5UL7Y93~#@ z%`4p%#UquOqs5iK^w^kXky}4|0XP>`ceVMV!M`U;_Ao& zj8kn9+1?7m@#3L5B4vP3UE0n$^T6tBi%Ai8v2w5e=14R9qfA?4eq=TxNPgf0yNkqZ zZZ^{nA~-F`&kXDbG~M(FFHzknJ!dXc{hzlI{fUH?ciw5YTR*R1|3m-Hp5jsRm>N2d zc+4Ox-tXeIAI(b(qQa#MV2CiSH^|}MT&_>4{5#W!RuyN7!Ej&_$$}cooaS8{r|DE!7Oce|l8X_?M{pSX zKysNsL-z+}zM(vXF+I^15?szUNDhk@u(aU{1N5kAl+6)>8dfNz06)UN&%Xki83!wO zJlS16xJO^rQJg9F)f#DM`3r}wUN=~8PT)oJfWoJ$#}mOV(Gr-M59hK)1%B2@ZUj9B z>Y2)7%;W7LxFvG%sq7Ahm$)ECvntQM_ZhdYI2{Cm0K}BYCkxXelbovq5q$4w>h0G; z|D)jd6^XYe>YaDn2cOpopq_MTFU}Fkszu@vci?~9KKW;_rd1FAzm9Vk7Z>2*kpfl; z9;Qfx1kc#{pOt7&L{i4DRiNTpIE}OBT!QCj6*LkclaLg(aP#b*anC8vS5qpM$PIK_ z#(uJZOzeTZnIC8u>`!RU&Qzuw#pa`u0yJzD36p&(YZ?IJDGe$nR8XmAL;e8nu&Lyj zm3Yn0;yfV?4ZKDWMu6B3tL+?FY~~-YbCX44-2$^mM~_4-=TC>52ndt{%#PRG#8e#v z^cr7awbdGwwWLt3OozXr!*8&{%%{(9FB0#%)xaA>Y$Z%gjGgA#o!YA`QFy4{-Vgqt z3;l1s%9@)v3_U;vYj<(6EFDWChAq7b))R41r1`5ehX{lS!&b4gXnLBN46~N6a(j!5 zgh+?BP0HS9cwammH1Fqj!5}rNQ58@HR~hLg+WZXIGS>tU_WYU=%Q5`7Z8_SK`nhn< zM;Vp4YY2N(nHkA%C|uBCyErA(WRzx|umzXe6)z|ssCHQ23UiLo@~UWRYQ0V8$iCuI z+-Jf&uT84$bW}VaQHWY~?3y~JfXbxQ5w>%zRGQd*v1APEMN68x^Ylz#j{ualK zc$(Tj3X;xJ3g*8M-c7*_+F^<+rZmnv?JqsWC2~BmWK5uR3@sra5i_$+`z-YTLKQRh zaY)@?%xp0dmyTK<=?7REI0gBpB7rXg^C@f^>tl>%3OokH81;VUeWc!c0{uT1TGoY$ zY0d$sK5@W)z8}%r`H0{Twgo^ROGFR;|sGc z#O;#ccT%UfP#IVzdzA#LKZYimH z(5ea$Rrk^LiMycxG4$)=L=)!!&a<=DL$O)E_78Uym&H2PgYXbLkin?;7wPTknoz-vY~in{;V&JD4d#EUagA+^QrvA zE|T!pUWV!*Mv>ARL>SbNiMXhs)6aeC`r=7oh34dWkq&B*pt(xJ=Msn$qQl8S>?k8V z_yf1Oc%q!d(3Hp}0%;{WK`LjXO-6wY)R}(7{8@zspT%^1qb^G@+EG%DDj>u_dCnMo zrh|+n^r8>)p5<2*i7?t4qq8&2P#)FYIqNNC!X1S;F^Vh^-i6aw7C5}!kP8^$fVd9j; zixR677bG?$E=gRTxH55lq9d_0(VN(lxH&PDcxB>si8mp7@$SSwCq9^XF!6BWbBRY2 zUrRiecp~v+;-`sn;+KivC7ucYt%|a`9~@j_S#?hyL=L3xhX-GX_a7ZR1@AvTxC-x2 z9YjfL-A@iS;r*uvTk!s~gROW!c<^$(7Y<&9_u|3rcrP8qk=B(D?!x=s!VJ9ssxTMtzb-7q`)>*jc>kXQ;GXM#TUdej-xbcl z`~Ma&^R@2xg|&G9L!lY(e=HyvQTM09X1qUB0K944p9|OH{n-N0Ve9@<;B)=8up96H zSJ(sEu?olx($sgwCGO$a z68CUiX+7RwP=XblJic@p-cKlT_2nhpZ1ROAoIvu#5?4Q|#MMtO@dQ?sxcbU6&Odod zc`DvdEziRHY2|r%KfR0!tmGNx7vTNO^2vCAQTa5yuPTGCl4q4cSIM)>eD-t7eD-t8 zeD>94&{c9xnX5OJ`RwPFx%&C#ZoIE8_u>75GM~Mvd<)($9OkpH8^-M?*AL_Nlg-1p z{p5z>MR;!+=CfZkyd3WvhgahL#lvUTJ2ve9W-D=DVuN#yb+6TI4`L+1_+D2R2`}4J zcV-;T@1LPkM7zq+c$hA#?0@&vK=Cv&d(&|~9J0_?+i%5;Ea0rOzd-6O%Reom|CjoC9VcMmI`p*Bpk0u0izoBJ3~Fts$9 z{^bpD1hwkJGd{c=9v+SMA7lC(wFXxAk$`Zst{%C&FoR?q7YEhyyQkb8#Z&QwP069? zLU?~4SNdI{bR~5N6+Dh$3*v|pbkgZ0@D*Vb<-6FqrO-nJajVJgM_~@6y4e(HJ{7js z2oBM#AN}N-B9VNX>a_sHePCrV#{njuGp#y zpS?*4X6Df}gMcUE5#7Me(CU&rs=InAT~DaJQ0Ld7B!%XXqCpSVnyJBw917w1rsCUWCVFbQmu$mW&zl|Bg29U z3ZnEL_?3Iqot-`BxWOW!v?n?Gl{jYVjCNu;8=}%!hnQ20b)qN&{p1D?6A@C7oXD2h zvrnwI?*;$A$+F&*$R}nxE9{g0_U!M@DxQnm!RUdxaX2;1uNnhsNk@*CVyevmlWtlM zO}56=wXpcC9c3dh4fLeW+Br}>Ph8^Y;8+m3Z0$oEw)o(TlCjJy60vu7>K@$3tLZ7% z4b{dQ!5cN@=;W2an1Qb==-+(loe)HgVs4_^G}}pNc{f#TR0*m(!Op@M^ts)P$rysP zIqq^K2ZO-B)b~=qvkP8If<{J3GIYF)48eGbX&@&t7-qcmJ===}2aXwK4Z3Mh-6CeS zOVcu*K|6chc4Qe>D|sg-OWr2vM_$*$BHBt7AaLpFLJ|bDOoY@LNLQum^M6whz|X_1 z<1Od6*6~gQhJpIM++{@qYl9(US@>ZLDVU%jG44|a)iRWiG8XAel#ZsJ91AD1-Sak_9A%xZ?HpDHEGWx1sC(|8T1eY^iWS} zoZbJyp=6Pe>@CRyn&pomlz${Eu$vHVbeLAkSY3oH3E#$pVN6)9LUa%UHXi&B@@xN> zdi&*w|Mysl*E>IQw%H}?Kk?0T^-2|6#F1%=Blr9r85!sSR>KXWSrtaGKAmyfXFq(8 zdwOw$%BooD+%Q?y1PF1NtPORcu>rC#;FGeM&J6SiEOf747+lR$)`3PicFrv`0;?h% zFc<`Ou$L6_kY7QP_dkgPPm#&=V8RG;{HKCze)yiAqJo}B_tE=vFa#ra zAK130V0ZRg&vRE6*HO48O@~R?$@+&kqEieIr|A^NLx8(Xv%P#>m2QxtYW$kTsr?TPP4AHe`#N7{qj(;zdOD7Vr9ixURD?@9*Sy*+248Bj$$ipc;K0f01Bgq05+g8 zLQZFk6^K)qnEXJ$TROA!BA?v=ALbIJyycN=O_cH&fdG`FDZGb}l8tmDOob4FDg3BJ zdmsjW^Lck_k(lS;2d&i@{|RhB9jiXOSlL>6R3rRov`L^58)CVY8XCxub_ib}L8;mB z**~SL`Fd;zcBK+X*mj;<>cHuI=UwUIM)B~Xp+bY~#|_b7p|ijCGt~cFq_;3Tk~aM5 zaHF2Mpro=biRQEcSL{jkwF~AiaMm^KiTE&0Kx8e^8Azj!Ge?z9A33w$`Z)L>DT;Z{ zkDZs;pH19lBU@s*^NR%0MkVCRIJ(+@m+Kg}szNl*VsOr2r9lz;LMf0b zm(c4~n8*^X3Tg}()h9qJ6Wyj@b`^&?qDu=^%{gTwN_sXcg-0{Czx2C=C5Hs>H z2Hcv73v*`v1ti35PlcbNZ>pnsxx^vX#o@o81W_oC)s)6Lr+-Z2{|{P;A!n2QS^F&O zL2UK!`sG^1E5(brHO|TSQ`aWYELy^}pGWdU?EmbMDW6>#sCY9tNJHFYJ%EY#nTYM2 z>zZKR8o2Ugqy+ch0s3rv&@|W3-i?%`G(e_6(-H*{=r3;2l;yz2g{h&Ff8b}}7s_Ur zycq`8OH@#)I>)_*5thI2Fo`4^wpCrxJZIfuL#Gz6z>b>h4#cYB4$`B4pE(u-JV)^Z ziogvqn2S3^p)o=_W9$BCj*SJklYi%R1I@Xx_om`jG5K?G$QcLbACDNDKX2H{&^9C^ z7p$$r^n#Id*4$q2G(!I)|NoZ6D(gR;e?|WPiE*<(44Uh3>#*bOI1dqK%3Ye?N6bHh zm2uxy_5i;HqInigJyIrMVxKrJykYr7cXzQ3N6=cQJ}WM6qD&a+y5hMX z`|kc?3WV8|RNE_TEq}A8g^)FH8u|y|=rM7}m{?zq@Ha4RJZL+w3mNS?`!GuhVGiZI zFFZ0(ROIbR6@yW8)bvc{(+H4B)kH5RMKXhiEplw0YLyS40|X4h(J%oJ>UjBD|{V>J`S48SjNc?8&C=8eII+A^9^&>QOaG9qHM?%d;h-II!4 zFmTXO7mMcurOzd~oQ{cPu7ZXR%vcyDsCdW5mZAUOS%aSaE2t3sh;Ox~OZYvW0`?(wn zIrqAUoitl_TkDRGysIz~wo#v?av^iCXu${X;s+}Pa{j7fuSiQ>XA=6ob}1ax6)l}b zh4PLr&kbOMu<>D)B=g+XZ)4jHN8K`A!|TZtC7oC^Ch}`?&c4= z3yOrbuk0pbJ^yDPk0Fz4$nSzR4g@z2l!s>Oqac%fCcCvbxI+7J=dRz@Q`{v6R&=7) ze_t1y8F(s-7`H;Ts`xT83WfXyNiC5q2Ws%1daDHc9|iv}OU!UyV}Ht8XkUT@!KknhVCtQ*R})diq3*xO?J4HPxH3Hp5wsX+Ts2ocA$7lGRzmRn8EQe)D`xlR zNE50U7G`ROS!YGV7A)8iJ!b?D+;hJA|ASWI8t0%j=-g=k8qEOD$17VTn0IqstT=Jd zWnVPFLUXYXs?ueMs2kHC<3NpMeR$Q7Q`|3R-+^eC-9M$b0j3_vh370KeBLS^!j{Hh z0f)bleyzA@`BbK3b;DNt3o-m*0va=wf>^8=0J9SEl^@yz4C!SJV{;SoPhs4m!+=ZU z|M0D!KASDIAScRTm-gnLBsW}E`Br?mJqjD5o_mq`vjpZo8R z>?kVC`Iboe<$oK|B_U$t&i(AU{l!5@%I0Krvv?4lAvn?_iAdO?J*J|;1c7}E#-Umt zyc<=s`yfjWMb&ITRGjFG8Y>4)D9#BC3+zZLj*P{JU!~d@HYXMj_(DhEsxkCox85Fr z{@-LJ_Bu~Gd+Z-upTRd1f9)(Kz|}2vt#YaOoG|(d^kPJMqH6?9A!CxrP4JXEyWyXr z09W>YblpqcRV7D+wW}Ue#BzbcdOWtA$p{MT;$#)W3NfQmkii(zDqZ+FZP&qUr~wU} zPiZ{5t^pg}IdV$R(GfXV>80-MlC4KHITY16sSw}@fF7f*sUq8*Uzt>l9NdZ!?i6dQt&a9~x1J=ylksMDq8n;jZL{K4>F)ti; zPbp2&U{SP3=5NwZraa&181di6W}kfkDULq&MebRpBS2bkZ&lynGQ%W{zj77yPp|qx ziXPE6j1mdiiQtMjNzvYiV#R<0dDIkzbmn~B!P-pF3e;0d93S&IO~)Cc zauT4|yg#TDMXC(W!ssORL9o#H-;>M8{8!<^On)Z=>r&dxz;$=J14!p^&&!8DlBJ5^=gt05-=Bu} zpyb0)D$7}Kq7%GZe*bXdN-IOb5gqCGw_z@g73n|v-VbF;vqVDaLLj2BYnb?2kXHA8 z2)gMgWu{e;hv`q5A&>bIimN7vGhoMYMVeZZqu+{# zdh1+n&dbtNt@r~c>=F&phmxh}o_7x(Z;RjVkU)3=o;4_UwS_5PsbSkRmy#3m6j07u`v-|M z#>CUz{W*){xS5w09g9DtCj$wNlew%!bZ>O%s!oZxni^v3_0j}LoM~edl?5}gqR^Nz z?jex9(R@6TV2d6{s?)wuNZ{dt<7YTrKXlrW8XwjSh@SFtbVvX4RacefK}s~H>6SM;WeFb;HgvIrsvBtkXtMUI2ScyBGkJvv2_SY=y1AgrPxBpqX z)F1*#Pa}fLL)dIo?N=5-eGkiNO5?m$Z|x{8#i_R@Cr2D%eacSbyyc(hEFB{h9<7r7 zIo7YzW329?R+>h4Pq{E26)* zJ0rDqBk^_q8m+|&p)JFaQHWyV?D&=ULEx}~en#Xe^(5C0rempIWhx&dh4h4|?!4jM zCQ~EIWZqG!oux%$Luq0p;=25w@Y0}CW|mue_9%>~|GQ85|3=_{B@TD)vcHS@-#0!# zyzZ_koq(%EbT(G`ZXicrk%f5&XWDEU1x3(vRNa$bZQF=v#7lzZk9(#m!pbtW z@pPJy_=93aDR9!f>|^fy((&qVL|2go?wy%h@B>x_ornR{-79rkBZAtK+1|7riK}6c z>R4iv_?H7&JV<|+_SMeYIm5l6^a8PrhcvnzW_eJsZ_*bYYQJH_Lb`r?6XZ;q&B zX#GO1rkUdclK(rDekKu}o|K`>OcZ zv{kigbOqs!U`%&%(sUkvwwM8)53a&yZD+lG9_;^hR^lCrqnsnH`|W%1&G=qzr4@2h zu_SWfO@$Tk%)7hKomo0b1iw28D>tgCG}YI~AS9yGRRmcB@}U}55AO{>#5uK5g6Wfo zaoGeO8(eUAUsvg5u@a)|mi!gLMvnJ_w5aHxT8USw1e^DkEkjO;h}_M|12Kd~zz_#I z%RPgfPLEItJY*naNRbWZk@X=gR@sHrYmy$()SGVSAU=f9Sr>~+PLp0o{j?PE!XKpa zWp1&XAPZe4=8cT%4(W48Bpk!mK;zY>v`Lm23xd*2V)QD_cd#xPu{=SulPlEDxivf4_^UEl+aI^S_naXBWlCp4QZ&b_4hZsT zDxyxFMiTG{(UC?3%~yHz*YmTbGq6@`owiU#Tw|D6ud4dVcc(yfl&8?o5+Ou{MHhUM zHPeW(c@GyxG!uU^$b?_dzpivT=%P8fCYmk+*mNuFDm-j{xta zbc$F+?u287eQd%J38wLoD(E+$NFp{&Ldi?eKxx~pW7Ey`HNJF2Ty{QFej}d1tV?+B0kcv&_*;y%w>mOlZFQV8u*$z zX|^HnE-js-c8=}?R}m^op2MxM`x&CH(*G=iZvL!kZ6$^1)j&+x?gD9*V70xH@CC=F zpp3H!8KR6}K!^y;W_kV9~j zW3<@u+>Vqq_}%1t42~{bNOOtiu8}CB>(7LdhSw0xU=tNB3Pw^<{NTlw98lS_xXr`d zBTI@y?Z%DA_{+cA{w*r@QSIt^6j;NkQfWmpBW@;y03N$f6R-2@&!GQ*xb>)&xYB6@ z`q$a`@*nQiTRIQ&v#Cxibg=y}n)J7meT)jt?r=^tGLZ<5%eg5Jto*urW~ot(Wj7tE zg@bIw=Ob55$**b<^taO9T_U(`OT1a`f!sTe3aa@hJnHt9R?AThwMQORkgWG)D+PGP zqi*j4TOw))O$wiZPwL|cPz=XIWd%ezah9~fj4GNP|J2y9T@*J95DkzICf<=nU;$$u z1p}VAG5ABKMntF2U-B3C1tnrwBf7OVj*<(E5LGJN0WXL3Ad(0!sos?-Hp0f)>VmV8 z3M(E&b=3^ws6p7{^XJ}MZ(jua|1>LcQ{rgnUC!~=L)K~bzXgi`*DkFS61pkQV+E4X z7~xf0>m&`Ya;GweN#%2!mUGSTy~dqUx=;^y?&Nl%fawSZVHmtf@Xl^@oO>|s5a#GO z6clA9W)x+%4Ovyri=r#l(Wln`{BB~V-NNfWJ(9))&!lqIASDmd1YDc{K0e#!XX}ys z3AbxY>*Z2(^#}<#t_{FA%71^L)Fhs0F7o00JyCROi@OmT{-eB2_e<4;GEu6$r*we` z_E?5-fMDl56dJxGYttqh$%=Qd505{pRDI6B>Z@&~wOF{-%#VyX&rtKD9T=s9Y7FZ0 z36=p)b@O>(CE^gHHTv)go@<<(j9*nY`b_kQ&y)J!Bdh@{vB?^6*4zJSr)*4bdX8Tx zgW90{J9|?6%NlU0!qDj$n8s1T4zKdgOe{!b3e6xX^{uYRpMT^2ZKW53!dsKeBX1(? zwoTN$ih1vUV^4{ol1)i9PW+hHYt!>DhZ%=u0%7syQ+i7m$&;va9kyQBlUxNSMvP*q zB$t30K~GKVJ)GSxR0Jsvz2WOaQ%Wsjs~?Ca6rK>Vc$L*iFd(v_xA&Ab#grocn}DXk zSRi9$(N%>RgGgp=vra`VJn@&SOP9)e(bdoXYPV+aJDQ;c;z#AhV=r^3mRglb)O-s& z(;(srsBEd}`PZ@|3Ws)vGMHbWq9>l2Ia~1TqtD=0=aGyCYN;q)+AKDehB+dxKG3Gx ztoTw|RxCy4Ri^#4A zPtv>ie}wjEDS}HuOD0#P!$LS=mwADd={a6-+DSd7ZD6C8WVA8}bO2lWQu$s9D+^8! zybhCUm&6WB#^CG;XDv862Z2REP_&h)CXS${APppV%o3S1mCiN8arZ(l@gyqlr`S89 zqYU7}f`*@GN>_-6h}8%hw2y793q=G*Tr=_H`v750=_~;}q2UFKp4w4T1kIK>+9;4y zea4362ihnp3=G(UnI~>9Z4u)tx-2ow&hZ<@q&HZX>nUB16`GUR)C!|fv1UrlAjudz zIs@VN%(8mtOW^;VR^k})%N%8)z)K&ko}*e@w?@`q}^V+M&w*`oLlnOVj;m? zrG-s*?kH^+#Wm5c@@>FpQBeE5j3E!m+AP?;-CbO|p5{j~M#jKjYzM5x0FP&1LT?#K zVX|o?zxKR+Y%mfj1Dp^{dX7M2T0 z@oP|XjOJ*JMgqEF1`R8)3v}Ugzf^C31NA>YvJ!7joM!#VdDuC}-f{@J|8M+JeWf;$ zIU0G!X2MR^U*@2agVhCsRRhff*Ne4!a7$9mSka#BgzE^;L|ZBr+;Z-o5@Fn$lUmjo zx?*5{9_)nwsOeagiUlOz*u!qxO65qkb^;OI@m@S%H{*o)NRAIAB0tr{Ca5tu*859@ zUiH?BIN8ZBr$~+v2%y_3jSF6X$v~-HZZqU#QQw5>z{)JcKMg@W?qB5y2pm2SWyP01@FFVdf8n0Jt}=T=$uh0E=guqm9xSmy%&K_bdfMCNgqU4{_x|too~{u_An(TB6+9` zc?;YEqGp;56XZA;{5Vq%lT@C)>z~#Ce=YHU{^-2HIo^J+^;#R_fc_>gxUao9 z>qa2b3xeL<>or)A^sub0aILW<`=79E)GC}-~-*ViL`0%X65z1!ygdWQ;T@-2T zCKV@L%}`8)iZ|-#PIgGsf?uuLU&@Kni8kc}HEk2%XIX-))jXgd*z3qwb1gBAZrl`V*DyzRv@wQ7TUBT!gDBa(G+|-8(Vot-T zitARjVEG%Zm>~tQ14HOv{dm2z4f_8!D{-mwT^nE6pMU;2|CZ8#*mAK-3jB{^Buj=W zGMIA!MUf~sEob&V(4WR!C=m-fr=Eqw!tD!>BVoWHhXO`oR^+kj zqO)$PVPUyRN@hWdsP9UTv;ldlmmp9epHj9;aUQN>>_|>TJiz6eFI<@2+g92Ss%T9{M{&Y9CAd!sq__W*?qKOA zFeC;=j7lf@L~#8d=psl8)XNz6zXOxF5paO-L#EuzWR9dC=_W1gsRIO-Gs z6nfk%y2lUJHe8By7g}uLJ3-d$lAvZM{*eD71^}sFuF&gWMe;$d2POa1yemt@bZv^) zIpCj(X&Nb*>BvFQsEEG)qAN?p@N7v&I~9S_c_ULL%Nt~9FtcL1>rGdrO8dkV&_rLD zr59vzM0oTIFTK;9TiUDoUMox@NZtQz*3mbvnx|P^<<|+s94I;CrKzf^R7&pX&cRB6 zotr|PbuVULdQ5TN+InXL;{O)`|HHZ{vC#RX{V6mAerf#tzqfR&Tz#xwUjL}Ym}(wT zmDQ#cY6JFl0o$~nC3;F3@95uGK1{ApyC=i0FG$>0jE8YFPlDOMe%_7cge)D+>Oo6y z^=sN-XAatXrNV@^t1trZPV}>q?dSi)tt&f_GypuRk5v7EJQ39qX>xqkV>V#`p#6cs z@+R-N@Z;BlUUt)dIyZ7Bfey+#1Qz3Ps z3vtSTB&Rf(r2fL+zqYeHRjwsEu@%U6)yRXr;BYL7rK<3aoyJA;9_=q5DGTkGI9IKY zDt`q46U}*3{EB6d_=M|}>%@eKG26^vl8aR1A$l$aod=p|T08GQtq0ZwaH;5+Lbm?y z>%HYEB3o0D4<963o4Q9lV2qNHxsn{^SQY$eOT*(Ko+Oq$_`X}qM;scC4}!bo%pcq~ zw6hGm!HJ-`0DZvPjkEA4cjwBAfO?fYG*~c9odsDV)T3NR8U?fxFuzOSfMu*EECq#% zfQ1?s;K1EJK8cA;0$V-B6%jk%1MN-hzSw1ruttaXUygx89{^sTCOtwSQvHDd6`ss zI@WGVwnUzQzaf3OU?fTyBiEqm8x#=3r9x_4*J%92-ZJrDTVnt-GFp~9W6Txma?qm4Ou|+2v{O@;LiMyS>PM!7c z=b`@>JQ4rpc9)M9$7v{5M8*HUWyG}t=D>@FGGZJM*N+Moh!hhZCJ&4w^SC#SGE4MU z)2JHA3S1OaIP0^ObHV^Cq?(0}%_!qy(M#VwP*&i(==7ogqiz$Pf@Z9=T}pkh58!`kseJoDFDM1yR$Of`Gcrme z#s7wm7+dhH9W`>sfnO4!ofqvpVS8E8Vzq}b?1X}h0VJUqVg|7zX*{}5aZ$(P^$E`Z z1OCsQ);dUl1@NOGUVlffOq@I{7)h8xb|CZ}F0f6zpJ{Vx?}$XSC0vG;87fiQd@$cvULq@|BUcPM z^f4=HJjUZcSh|44!AMQ7T5i#O7r6E1#W1>&a9l9qWevA!tvMbv3;dnT4iYaqn1K(5 z2w(>J@*+8f=qibzQ}C-LGN0b*o>yL| zKF0pY$Mq)}zfbqARH~E?c_UXDDi$aPcJPQjPQY2_G(1SYDqn>FwfqI?20asme}nn+ zCPqB2q3NeYAI6#f+xMq7#E~bCpX&)cT{oXGJ%aaBzyNEJ(++e_q9$|rEFQY%3B55b^ zgf3xu1Z6)^63`jbk%m)>aCUX0KhEbz#Bt6~+f{x6B%HS%e+093+~#hKB_Z*C^d>i3 zK2A-ZSZ<&{eQn{~N0yAJ@& zVV)qHkn1D*@d~kPa@ov{=I5C#lE}c4$)iR{&2?Hc^x$()t(CxKX9~)AZNoY!Q2yQ& zGmR);FcY5mv9{jwv7$j##z&m5|MU6*{_4(52s51p^oQ?;7=g7R@X7*kHo}ab{A_QT(6dd+XwBnq z{B7;(0~iUhoPyyR8#oO(W$eCBJY8@76#Bo~C?L<_tEYUtTy`wt z_J7VzAk8+MVtbV#2Rc_{yeh&8;wnyap0TbV^F~L}0`Hmii=qK4W0v-oPZo&~E1EHm z&o$^1T3XL4;|}1|p)1uS!WJ)htgC#I9G}X*2ww5G)yK||korOzVEZxv;1jl7JoOuc z4*!?1VdtlN56@cPa;hJ?A3T$quJ`QXUjL`wkQQ&rhj<@LRTDp2b}`6H{NgO2+(E+?syn~3%UTppb%KNHl?1oDP7RN(&l%V6#{K# zMl3SmqH_jdmg9H*slKd)F7*R2dxhA(tYQYR80`Bztvo?5&Y{YRzE=;h@IV?`{ogJg zJ<1}aI1E38OQfjatiu2x5Uqa{&B+Ce^}qP4#&r1YYQYs~6V=-LayOJ$32jFA!}*{5Rs(@f=?GCqp$(?#g3YKA>cy|mgFfCuA?Dq1 zm^^JKZH^cwmYgu~}Gn{*!2KyoFuajf{SpV8hl+RKbk%%KB{O#B+8J5MtY$YE8ypa%H zqCYBaK{z~Or67+aJuKADh`jC5+M&g7`m1|pc@1tC<+IUo?=W$&2@6#KsHvcQP?w-W zMqni&8q)g+#Xt|50nhlcxy4_2WmkE%Q2G^-B3 z$D#D`@Ugd+WsFtQwIkQ^=k%>L(RNZZ-BXY-zhue0Tu(X$+)bcW0E|m4MBJ3_;C+od z%je)>n`1P?1(_ys+u;`9eg4k!*;wrPh`lX-3z2qjQ!%Pc5GF>S0}g7$v1OKnK66>wEJ5O7yo&CW7i1oUz+$<*+%a#s0u@>f{B}nQ4O>5$B$%3D`i_7cO zM2NM5|5-)HpU8Po#O(|YqZ|O{6Ty-~@L%O3mmFcc=`vC8nv+8lZ&eE!K)EN=-p{IS zFDk)EyFqkTB)lq)q6r8y9f4?0)R9^QeC;&|H*{ryU)x4D=fk$8VM7wQR+Mn22blo= z*f$C7G%i`S71VGwrDd8*!Qb<1FABQ&cZ00|Jpwtv#G9PoJDv8It%vLv#A5%y zC3nJQp|_9704HnlOWX>Wc(3-Sq&ktD zm*F%WgCH~EPy7}tQb7AyBwxuIE!l0kOUoBydq`zPyQqOiRU9bUHtD8ByiMSVYTGI4 z%g{xoPa%4hPhh;Q#@%i}S37Gz9<4`O^79 zSXeps`j@*4%NwCv(C~S(>}R5)Cq#ZD;+T^u4-%B_O!Z{w-q00g2$F~+9`n}bU6x#O zai)BcXx3O_F-Wrpgcv(e`)`N`QgKbb-ueaNe+`z^ka(RvoS1L3b+hW_ZY*CaCpDCe zb5eoywQi)k&P2^BdPwLyD~)Nied*7m9-{|QVT9swdX;c{t`~xh$4OhC$7d27DEvi# zDksb!2A~;j`3oF$TVHOMbb8@o-FGr|lDn8=k{B6(6QBQ@+qKbfrydOJFT1U>QP5DpH z~-uZde|6j2ZuJe?0gZ%-!)nd*3Kitc;%U6m`5DP>gP{#y! z@H5RY2(m`DjSaU3O;s^~^e`Xabak0Cpq{QDyJjPgrVho&aZz#3zy z#NRMa4;cx_T-cnbsOa!YBk2MWYM_T{4s@t!vW|kA6;f$*6`Ks`7?DhNM{ZK<gE{?m3gGIxk7U^UJO$_57p zKLar!)~i2-7~7@pqa<~ZYo-Rni2y~cHWjJ{ICRn@TW&6I5xR|4WD%%d8E2`;F7Y1} zn~}Dq(UK|6L{;ONE%|U#`M&`BKk-7V015EB=cN1RZ!1qSWrZHSERG4|&zh*KS3e3@ zS2bH;B%Q7@;5QG$8aJ?@O_6NsFTtyFW3m`I3d1m2MS!3gEFT2Vy|BF`#!*zkzBYC* zw;`HF_d=46FgPWDh)IPRj^V@>oyKEk-;yaSGN>L$7&`>g+gR*&gSC_b6e!9kw2kkW z8PnYLCjRS!cB*#Kqfl_^5>GhKTJ~dOm3L?RqBpD&Gg6#jTp8eFDlV(Gl z5~r+FKBIaS+`^FlbHV#cLXM6;YDerTL=Ks(a_9Z5Y+|qr_}>TVTyHf0{ed{j)Fo?<;rWa$D*$aV|GdmS0i@Lr0AjJ*DuNOSYuTiq;n0avvmpw=%!Y z(1J9jix@O5X_aW`F?YTa&y5+rO?B;&#N^K#Tfyq0dKoF(13txgdju@JlE4wY(pTOk zjG_xg2%kx=r5TlDUUj6qth^JpFfcVWP#Cdn&{0-bz2^t|Ftrn7(h#l$bs@SXD8AV~bU?Nx_ zkjmF_=2l<13s2r0Z;WM-+K+s8#Gm_-WDs-pnBKv9`v-{sf5u9@&H1bI4*OW=e0=i{ z@@g;l;lNrA>P!SRhuxZ*50s7BTy`b1?@*k2LQl?hSCtJYX)FW9pIJi!#U?aNw1yR4 z1kA*Vr4%Nc-qDQC`4_^n0hPY>+(j9Qpm)OJ!V0`a*CQ8vkX9KEza_-gT z-C|2b2R!_h{brX zYU6kaGqp-WoYfASsmnJ$IkVsJ($rCbxn?TUj`{F6)8!t}_GC+CuHXPm=%Ne)In4M< zF2b8g3?jMb^m@Skv;Nn4(z(Tc3Saze(#(%!&mL7XGh-cU01S3;M^|w5cw2@w4zzgt z(njt5c}7opFX-rb8mY3>&f)-H3%d?#R-ZqN^8&>sOT}fk9U?L!>^JoPD*pKA91cX-Q_ehIzr9^661szCi zilXq6i&7o}bs@2z9pHBKw9pZR7clajp3zhPR`1xb|4+57Qxms3k2`t$P4?;5hXQ55 zP33)}a${L%VJdg*SSwPEUxvg(-dcLZ*{F%TMLniOKfZYUE)G>%sC*A`5NO|wF0P+`Du>Ba{6N8uxNg^%ZxTCKSHxdTL_h{C zI;C;xsgJtL%Qvc4*F~e2@I^`5l5X!FpkG51i*|#C5i6LQz&|85NVe3~Bx0DCvEcQ-DQ*J>f9Eni_N?aLHr>O|zetLpf zoKmk3dg;;cueVD&+dhHk{#A1u7=)|gFln@wEsOiNS8-@l+ zyz~xt$#6m?hqf|?E#z;(*H#^SW;e?z1$`NWGP+p<$s&munS5bBx4NOZ2MvbkS;$vV zot04@{2d-XMO{_ro*v2dL3$dI!K}o3dFR^F%e}sfE#-EeeTj>8~Z~^PONfI?9V?@7lH>( z+&Ba*1hgAF^|Wn|*Omp;_%xv6nPs8%g=+6gOOYm5H3hKgwlcXD6Zx>|w zUZTjLNMdI}o)mN*$iGG%V3(!)1muEIaOg?=1v3Brz;9BW*{2D|rG=T>hmR10X59o2 zHUeLJ>G!5&hYyz(qDv$E8S^6TO@M5o6-`%JtiZ8j81#g{Tj#DHK1{_`tp1EZ-3PNoJ42nyu|FlG@Mq5$wB+$L>d;tdoB2sDUN5ReBIyI-zT{@-H({iEz`wf5L| z+h;wO+^?VQHV)V0^iUW#X-8tL(j$ur$9JHJmKIpLW1yXt7g zTl^iK3r!YF>83?Si&euM^RUcJFHj8CH5B6j2Ib^6ScHTXFeAjZ^l%jTPt;Rlxu)q4 zu1q0rSo$OPsNre2UDz@U;z;DfG)`R$K;dbT! zoRygByu+!pJFJ||A3awuci}K`AK?$ivO@iZ^`(mC+yhIE6i~rtg!G2K3>@T*m>|Mf zQUx$}d^Y!7+EReyCGhG#1mPgDU$0v=Ux0s#1d8fdSr zpbFWSo6w#_%k)7?wmT>7a*it{Rm}7dQf2xHc4yyi^{B zk-DZ%W5e3pdxmG?Hd$0_wZ4m&6c_$4ZMH{B1pjB1KGf~j_L_L zV>FIL{J@wgH1MvBCciSgESIj@L&vg^S^HgML&@bXz{6&Uu0~&-!*2~hH;Hd;sSxi@50EUCw^UeNY z;$b$$nCj~ z7>gU+kuf8^8}8e7?eGFQgXkEFf9z9piImskmQi>c4-C)x)*r%dn6ENuY2>p8sp#tB z1n`XvYnH4Rqi$7@e6$mUxr7&4E(LuKba#x%?yZD-8(u*y%-B8p&jIP-T=snPs^O#M z*rP+V{-n2|8xTuOzhI8KqyaPS8vbqQ{u7n`;ntU}M2qts=URIWzWhgf4GcF(6tO*y zaTUlT^dk&{AfiNsgYLqijlz$Xa$7a)zP@&7$?#Gk*8|b%?;w@=e86-{4q6Rl-@pi? zg+}~U8q-D$hfxCojMAb(^?m+8Zb(rr1>jcvRd{IIxXw+j8XeN`@Bw$#@M5tYTwN7BG$GqT z9kiH@!03TuKOx)s*EFop$rr|~^Q?cISUVtM7T9+M% zvBQ=e8zX?L;04AjLF*I~J-LB4Y=opH`jOETe#1aEj5>Y^kT!<6Mk@aqErLDWB^aR< zA+mcQlh!J$hNmyVac21_(RguTj}hbKoJO2n`|t^(FGf;sL0HB9YC1-2Vp-zeYln}= zD$OyPoq~iPDv8_JCM+JD7pPT-!z)^VIo!hL4qJjV>|{vP-r}7bB>thi#)COoMm^&@{O$tPlJr zmP)0dy5UEwt{*1KwwIlakSalIj~cDEV*nLFDlGqFL%n?;?EgIG{{j8;E6#;h-kvj- z`48z&kc(R(j2*A}I*cP^)QMakeWWyOI%x(sp?-kxaSA%_vI==ia4@`}4M8yl3cf$r zke7n zXz9t3cJcFiT97t4Eob;-JuQ{fVR|p{w6@kd9cVISzmp2woeq4`szay;6t;A02a_1@g_X^1v~V8+-WCdYm>n^3w?B7tyLXFgH$j$S(WhmvfdB7D~1V4iR9k4$j1v( zy<@8xnC&*~MS&`PaNeL_WGC`WE#(2;ETTyxTJ)i%_(8;1Z>FC)O9_MvII%KI579#D z)+6Sdtl4kd@EM>J@1&yWWc-IUrICkq#PDevJ<`P^mhpF>;|3KxFG@%g@=FweXxe3| z@42&vPoWe~x{GR#0VFbJWLlUMAM2oKHF1tuNZ&!?%a*b^Y*ax#UfWMY|T#E+esN2~~pt#cqM6WjfuIygvMkD~A_}-Z z$g-FH@!DZxE4L=2YqY{RxB_H^^OSSbM;iQd@9>N8NG)}-@(+QUYaPTgV>&4Pfv`50 zg>-073W*;CxFtcPL^xp8+pkCb?>@`AFLA)>vVU*SJ7lbX$Udldc#X)A?Qw3}-=!U0 zFGQp$(;bgnM*)TQ{1^k`6R#f_UMmJ(v;pD2UbV)E(<7%8@Z-PW%y!Vyzbukp!U(L^ zj3rqsd!i{ZkBL6Hy}4ncU3$wz@Xn-GQabz2_lD*TpC@Aafch{IYx;|6ub6?JI&)=J z1BUx@QezA6UVw(Q$i9Jv&Mb?C^o5K9511+fey3o^TC_`cNx=r^|3$W$_$I%{pYjBa z$)0M%-ywqm+%}l&D0kwtz>bC*U^Y|Kg@1)?vwU0+C$5QAfD{8Fa3c+7%O0!0akx>q zK2~W$pqPxVmY^?8{WC!8Oz-832Q~ixpp{q&@Bb`&v-RL1W83HGgHS@S9+VUpyDd;m zN-F?w*5K|MNof?GM2I{SPA?RHYY^OEM9Gi=Vo#tok7Og~dF+hWxoyMiXzV73qG4+N ziF_19kHpq1cspK(*aY&$lr#8go^Nc>RJEfQDW#MyH_1(M+ax!=$!(faT2H_Q zMMNDHSwwNeU56Q5M?oA%h0z(reRudf<}Mv|6qj-I|2*$|&RvqTB`J!NpT8?@(wy&n z-}}Am^FFU6F;V0I4o}2|6E!u}*kqkNyhhJJv62C|+4Bt6DW{4|c)(Q= zs|(-^`@*q^R!l5JH8Ra9tGHt==_DBy(4CLF&cEn@CQ~{7?R#2=>qTL&3sju$yWWVL zIPW=rGdvyC%9sLl*fiy}FaFO@SR0405+ydIE_}diyPJl}OkhzT8~_fWFVot}I18CT zlCVR0t*&)+o+37&*EB=a#Rf6pU;rnF8g#gQT2rK^!qy0QS!vb4et}#xMAbF|$ao=~ z(|!Aooi))55dYt47!z-#woV$pR@77oW^ecC zLu>h>A@$x?q6!5=$g&8o5|ykH73m+KPXI$g;!D-Zq7{IIE0wZ6F=kwzJT5S_1BJg2 z6*0-GrZX7OC$&N@0aJ#U3x=Mzt2w|*!5mWIvpWtyu@(cJfgiKg-2ADK*e+(@wX!^( zRW&oM0u_#~RJh{|#^u7N&<24g6K#Mp1JX!cgZ;zgLUx`NpjjXxu3Ty1A1C*J>IKsj z|A+pc0rQtY|2$zlZ`|g8QIF$y4-9V-&nFbgqUWvHoag}s1-fd8Zbp^P9uYK<>}yNe z(@@G7u&U~&re|A?!yDB~pEgc=0n#5ej`)N`!GaRjLdO7dB!GSX0YXqzYW73*t9d@HQHmV67MM(9Ukey4m@f5EDrpe3 z(GJz^9`xDjj`k75NM=nsDa=Baim|f)oG_v#6j1}EQtZ^`Gm#e|d31w4xnZ0aZJh_s z6qTo-b}#JY`lqc)!`F)^VO50*YTZ?E7*=T*{n4bOP7-SBWe@88zsmsk&#%p0kvByq z8+RSY8$PCAb$Iwj5#{}1w!~8%xcC5yPobbt14A3b3@Fqc%3ocfsh@rnsp74ACZSTr z?%v%xy{d%Gvw9^%<{Ug-xJI+7AAGyjFs!7N;h+zm_iP&oclg$D{($_Yf6X1Rkqw~S zC0!axC#b=QgM;=uZnV4*^ZS=0=e$VTJqzE>7d_HBAc6ayNdKE3o7u7%P%V^}3UGzcY* z2vez$zCj$sj(i5F>N-j*BR7=O&$Q2sZ%6kj$#I^rpF+c?F3p$j864h$eQb*D3lzEf zp0>el7$UZ>D{&R}yP^y;l8cuaLuupdiVq+PLjW%9a9j!gM$a&JskM6eW)=8b1E21B zZ8zvtH}rJ%)wY8iK>Wwc_4@L89f%DX26G+2J>VAfVP3%Ha3ElPXvmo#<9(K_m*&nH zNkbg@9sIn*KR>D>H1&sT(3`bgZ-*LrUqSTXZgEo35~bRS2cDo-3m9cH8ODhuXolq| z4Yli%n^0f8dvz^bEKOt!4jF1p*~DzZIPs-Z>OJG#63RF{^*hf4ICK-%9|}0+o(l-e za$ebMF_L=**Xya9aX;R{#Z+6tnCZXtWx)c!bWcs>i-`ZH7{-+7{pJtMDv}p?u4(}2Doe8}8?k6oZ3Km4-9G~2dZtp%x4?^4Rb0DrzmyoSa1#(TRe#E+bco)`( zM#NCLbuR&OX&wm(<{-v`@v|*hR{~KLi4jY71L}*Og1BdpIr0?Szf+-kQ=flz%kWNI zzb2cRC17v;OqmD%9~bQTP3r%@!HC{sX3c)%4dxkP=YL^AFUXfQeK?^)rNnP|h_4B9 z1%`~-^F{I%qbO-Qg}B0=sziSolUs03_TM{^)3kNH*4E(;u`@&3)#nHk#+wg$Kn5KRF_RTXU*n-42I;i{MJ|K63V%#8%2o$xn z9HMs6lWa$!twh{3ZRJl>!^*oHoXm4~ubXjSE7?`J&CGgIK47}i2~O{FsG_DVdoP^j z7WG8d25zOhZrp~UC`gb%E|I|^?*q_g@Q)ycgbl(7=vX)KLJ*R!@tr!40*aOSDM&+k zu|ZE;GNmRm1NfgyOyhpzlIRxmnaJ-VL#7V{Narx=S)0O*@bptkzR<*~x@n!?MLgaK zMSwzIRJJcb5qQc<#T*vRLu&vThASRniJhdir7ySPrBYI~vVhlxc=0h)N|3CI(Sj zHRhnPoAFj~sOWAjnltGZyU`PEEa=-sT>&{h{q5%-filg;I^ZVV)TuiA1|OY+5@hg7BgTG!1~gaNw5qmE)IUIwv&cd} zz{6L$Yab?2rt{1IN$_+9{U2LZhsPcsCR_AG=K$0T>mDo8{W6tQQ{0#bB9e~_z_JX% z69gp|n>(ic>2uw~2gC#gi<7&y8w3A8)K1}x8vlRRh`!SNt~qE{8=sB57rXm6@?|B4 zk3vH!NH}+yny;m|sDlMW1%6S=-xYgPeb?0y1)4Qp*ozcW`sLQvhMx$QOPk6{0w zHKOm2ZZw`X_eFjdY5W_x{GQ9~%|^vmgn|-!+KPG|FSVuM4USvc+wh5Hwl&=b2>FESmr=UG~=K^yE5G^iS*uh zEAIj<_FFEnBH2lFwqw?$K-b?r-XBd{URIpwVQw3ng|aS*swC^D&Vwy#Sj6id*`GZ@ zR7^0Hp}T-fJe(wP8FX1MoL!hvY)2c?q`+VkX;sn6jb|SI17xI^Zi9+~pIV!+9N>8a zt8U7gc*n+AaKDph*k3mOQE)4IhWoc~$pV{$0AW_}33^mz?G^^{_4K#){FmB)@c%9` zzigzz0Q7i-MaviP%WBIi|L;(!{Jy*DA9+`{_TY}PVSEi|w_zH1M%?|Y2MN(ft|MWf2&&GPLgumfFq zGazvR&6dj6C*QF*dy+`(*1#R`a?CcR;W85~EHxO_EpePzD{7#~#FezmKSbKI)pGNK zx7+jPZO~E=oR@eheZk5McENF6KJZ`Gb=fM(R}Cq46j#Mhuehtztv!l7o)73EIRNQB z3YeplX<9Zs!1@$7bakx*sDO)z<>1>0%;-9Db(B&5Exk<9jVvOSwX87I;LqBLLbM43 zB&$+-?~nEV_Z!hSnvWs(e;e38`d`4yFTdJ4KYP0DU^uFG_v>*zz`k^5r079QDEX-F zBW8;lmuF8=y%7TC<62@Z zzb(9oNPDIGa4BJpL6Qq6pvXxoX3X{sDh6UvaGkm)|66g>NI38h6|>3hKd5GTy3yL6 zRbJ$w5bl=i>bLe$c!)kiNZtj&uu$XzrVmj7;0!4t_Ig!bE`j(F(8t(DuwZdCOhIr^ z)`vSnaFhGL2W6D>6(r+b`lBMN;;k?T(1ig6SdG5ilONrit(lF1{nf_ zbAe(UW2HPC^heYuTycq>(NrKU8+@ixJkK~gX3fqD$3@KA5^U^T1+rNj4Q*QBi?k#L zG1eL_UZ_w|R7Yw2Q9`9%1KO=h0Tq87zp0`XX~x1YS?6WX(O4zeW$-f0_2L}at$LbX zM437c2(Db+M2f)7a<2$3Su&0MBFk#@DCj3RKOk)OB9JrYTxnHh&sN1W-qsA?(xmDl zERyLrz$oQns8d+ZKxfv?I5(Ndo{5WCAA(cJ-Lq<@rN;lr497$WaGS8~=ybr@u-!pl z`P7!d>=_dLhr+$PKWaR4N2}^)Og_2B_&xBytBvS8jn&apBK_v;$7KDj71{G}ol&E2 z4Rf8njU{78Y}Eh&53HOCIuJe!E*+e)BEiopXkCY`pBDn>h->c@5yB2W!;4?}A#;au zD;FNz;qMt4vgk}UAh-ADTDM9(s#N9Dl( z7C#*>QCn(28)HJma!`HIY9d|96pL+!lSa`H$vy{L-rp}-pMyRk+pqat$la4y@?e#^J5bFvp=w}H>pq(;DQdpW^QBOP5cO175hfOYFk zb|F<}vjNg1ibn_ULCuuf0^VTKLXa9sqC9MR_iwG1Ea@j3Vs>T0?~Zz{tGVQqNO%T4 zCQbGdd`M{?ixXZ*ag}L*I1R)p@5v(VD20n8gpTird;~^DkrNNEh!%LqJ7`NG07M52 zHG=$GU$z2RxQCv=hVS4F4fdkPa<=%@Z~6B2?8Op~FAkJiPov<@lQZLur&~L-wW>ga zp%NZ@G+^VR#6s(?FXtRVWnXaw56l(&e^Z*@>Ry~FL&-m_6=*>Bh ze~<~x3-d^K)Pd`KWe6%V?DW9sScyw9f;eBiib`lp3%b}T%CYS~yDefl@nZO@YVxG@Ajm#5Ncg4UFNeOePzYwPd+>e5@a+4*X{)iViLt(T@^an-@O;6S^u`BaH<94`_W^zsGM${C5!)^W5~ zBVnhC73k}9tF$+YCMa!~CQ_le6K%8L zL`y;|(Zjh^vqV&8R{t^@C0@9`dRyS_bhl1y)-3k@@YPx{kw72>xRG7iOT;D9UmmpS zuDJ%^-%orIZoll{%oE?dFS}57P$hC)VjoT%&AOS!p8eSccv^idxJKyikgO-f0eK;) zFwKA~)Mi#~KN7rjlqA=nH(W3FZ>D1lucWJ2ZH4f#N0rw0WXX10U%gt+I^a0mQ`u{6 z-d|B@=*Z5b<48={eAF{fII=xEPc~&`pg6g23P;bNkqmwZ)H{mAHvcyi&VOcVFm&}q z<4uO~rs&n?SIw@-e?$iG5`W#Vfh?I}8>$rxiM9BNotGW)83bFzrZOHVx&1TG;A?j> zD=>j7Qi!_U%o~!~m7?eMIRS6zshR>GRaH0hhMYAiyFz2ysxUI@u96UA?Q=R2oqQHl zl7o6Gn-_xA78+B;Uxq;A&MCpd%(b1nv&-eBRgTB|(i_qCr?VE&)L-$0OF!9{C4pvr zwW|AoC%9k6YoI)^Y>efF@kcp>>ept7vwtZXCmC zV2CVpi4x~&j}JP7@E6Y5x3Wohk`yKnfkYxYc^P1hxT^P;ezeBig8P5IVZ0%_-29?( ze&mVB0_>Z7^<|ZJa{{~RS7yodAiIYR#>_WVKW!;Vp8@BVguY>u0-kP#&8{=ja--!P zRWW#vFr~`XGI|QAow#N|E)-I_S=(NN?9dgG6tFG|RK;Fu2|zhbQ{WR)h9Hu61Y$<- zR&b#-R$Xz-;FN+ei$m~ykl+LRh4y(#UPG+c%sanfot&-HH7O_EcvR(BWREVfzy-i* z44(%sG7#MkCK@*U$a^3=eWgq2w;uN!I5wHVBhzPeWiJ;C861JRTS#Pb1&qtKPsH{v zqedNu2|TXz!&YOK+{z$%9B+*RPH&0Y4=M&*I=&1K#XH`PW=L_G+X!Koz(|8wYA^lO zcCrE^*c0R%Q(n56owu|8H_5o$h`z$O+x$E8rJw`}t`ZLz?-ZD50^#YkbXk z50g3_S-@3x_Ko!`I!5ptNg}IZCZKknlSFAAfYQJxPmQHr6zYgV3*X;8^W8b?-0T`i z5eVVu1ZtCdAEuH<$upt1g6*ex4@iXc?)RlI%zo4eGr7OWJONmP#!xJrs068-5;>)m zd^7*?(ZMYFG>CIt^?}cE{ed z;Po)%bwIlG!@x*&iLwHpu&GoqXKyn{01SwsI0Oj$8?l=Cc(C+E73Z zRGak3&@``;8`RVK`Xjg$J&X+}kO>JVd^p@^?rzJjl}&C6v<>c7u$e~6yI`v?^~4#p z|5e5zBf87{1?K-Qj68`M;D`Pa_up#IZWKR191hsa&)uG_hZjgut_jel%6*SQZ*M8Q;=kCZVcV^f(aqX@5c#%_n9?xD61>Y2o z8Ng4aZH3W;K25Yksj!L%rVKp`^T~Z#l0MhRb_8B4cimOrN~m-fVB?H_NK;PVQO>*z zWE_yhlBWFgE36B%>mcLkU{#KofV1~|r-~^!ML>+0cx6c&1KdMN2a&t@-N$Q;-x?SI zUElT9w+Bbf?t-v}Jt%3(Da+|g54=1F6qHzwik*YR89F7qMFJc9c>#iOJRS)zSEr@H zsFv3c)U_>PmSF2v*Mk0@Hc#u)R0OscBH<)toZn=!lt3e=Lz5l?MJ7Tz`eNPf z%+st*uL00+v*`bD6u6%G6t_H&jS}M%i4~Qrkw9Z}8ktFS!AZ9iPED0U(=V-o>?RF3 z_64d1PyIYb*2eO@4m!FVpe_?V>G%Nj3JeSkf%ru<<^9yg3D88Zldg5)cT@;tF@?mS z4u_*G1PFaR0hg&RjsIs|ei!Zk3C5=k^N;3bkwf^8znL$qE=wv>=+;nW0zcjA$xP4{ z3Oxr%hyx&jP$Bph`RdE`5(FzH7yJbf<;WBeA;!|=tixGrRrW?v309v7U4Tk(_wwA5 z;jlopalx8u&KHq2uOEwkcF5m=0Uw}YD6;3ar&0i>cjLz>WVq`rwaQC~Uo0IH$SJpS z2B$8+=O@%C%*ZBE&c*h09f48B>-A95d-8hArrd&7teKO zTSUcbmjQOiFYn-aiAzlP#i*0YLOYdo>vNBzG8$K{c5awA@zQGL1ZrW%CKh9oL{CSY zqqA`twI^%VbLXQnx?68uh!}4au1BH#*KsNdtgQ43vDh=BRfvuiQ~3%;B(a_tCthCzuy2)djuCA&?v6&xw;AU|9x+!M{aK~?)HF$e=+yfZr-IXSY*`U8n!V(8 z){<`f@iIE=9l! z;-lFM|9f|~1CMBm1%vDS#N2~o+pL>CGl4oU39SKWQM7izZh7g(v4AubNP;Aebp3l& z9 zJEY0d@~s!?Wo=zqQo}m9S**eD#N8j~hEsFtyTrTi`k;9w$GbU?8~d|Dz8Zw!Wo_2x ztRx&`L)z*z_NR@IW$q-#f$2;;{y{xi&3x%bGw`=7Y4%uL&;??Kicr@gFLpWgoOGyG z9E+V(w&#h8tBZ_+?Gh=Ixax#~*W!qhl~Z~N9#d%&__(wJG@ zpG}Fr(FX-c#sr_G(%5?}o+UAJeXKE1<+>{$cKg_Q2hKqOXdRJ5FQ7WkSjgGC<{rtC zhPg3zYv40H{WI@YY^D_lk?|mHFdY-6IZz4F6Wn-RjqzjPe|8yQ%-UssAo4Gf8||xq zT>kH9R_R-B3!^{Wcd=M4!hl+VIHFaHReLF^LqG;mvIpjZ4O^mJ>;O*>@lF4L*EqmC zu8xe~t#g0;80tNgl;u=%re;wUbtDLu-+Z{CybmrV_oH*w!ojP29ui+0_P zdasE1nEl>aKpv4IxhXajOyl6Uhb~|o0G#YbJUkS52mY}SDHw4zxw~8oTwxSq+A`z` z!Jqwd_}a*TG_5m+3cnM|oIH!LxCsncB}0;EZ(^HR4Pr7I4+0Im-TycHjW5ys-$C$y zn}0Ij3D5sv*cbEjVLFB3 z@Zs?7VR$`>0qOV@oUmlek^W*F(~1iU(6!#svYTjU0b4lbTT+COA>43q9`cIn;2|A? zq-Nu{E0WnmVviM_g2VRHte*aVMH!+!E&R*Mo3L@N1}vAfzhIr|HL>dy{fNA2+Hgn%9OTT5t* z1^NHNcHaL<#;=U%>&+jTb0T-(KmU(^StsYv^Tfi{8DTUJgx9_F(2Oz-FN>7RV($oF(WU7#cgp9*;ox$$!r-;UG_sg|*Ap`02| zch#4PofWVOkH7_)01yK9osKoLIz-!esrNY-|I}KTJ)*Ikq1^}A~#y~6(k_MZpL zht0E$UySMcTMKfgn(ZMhR+Od3K2Twby; zfp}}qz9H=HyLs2Et;vCR-7AjW0->S&m&f{qxxl_8(3I0g;z$aX4w^;aj?qzM^_MOk zEkw>~`y5vCh^%Bt`@704xE0Gy(p#g843NSXY@Il~)TFF(c9^am3=9 zC1crG*vMLe+Ja{eJhojsx0N;gX`r$b(2A{09rItdXW&n>2tub$y(et=xSM$FF|3&$ z21_{P3fkytMr|6&lr&yw9oDv~Ku`#yB!eL^s!*c)<9$LdZ(CY~ zn@I(%xcT15leoK3$)12 zFsj2LP6U2WkxY1G#lP&g@_8P!R@F0l!=#&XF-ebUdDL&4J^c-r;;30SXK-I5ybbq%mJv-O{y*86h3fxHTrPiq?o_O$p}IAU%j{(jM$t}Sa5mD`nJ!o?8CXP> z+M7nmuIK-epJ63Eyv4f%ZKeAy9@8|GIlZ~lWyAGpXdI9lf&t^=fT z8rD7Z&YH+8aR1K)|95ni`JA~M{{NZQO}Uqo22ZPw|zbL8D@2*$W> z`C2>O)1GR@`{Ch=yBG;f^#`*OsiAuA*xRv+??5K%t3%8Z{#)5@2s^erlC#--HO=cM z?Cvkt5JaXKz;!<7x%V~a&XNS8O0(Y*+^uN+DAyV9_N@mlvbzs=B$SpM86M?p!hGFAs|;ch4@86^$h#Mm>-X z)X_kVMp6(|#&D8dDR5NUoGwJ~BV8`oW7`?8EG8U}21wXx7-*>9@WWAn^p(H?!KVXq zmu?&arRBxC6|Kf^@|`%gf;mb&L|cp`a8*x%^|2(vaK_wmG{KZ$18lwL4-RTUrRYw; zD)e#AQzPy(_@R%}Aycp$nYWe}`xr&}0lyHwily_&oJ^zIy4UYlYQt2O(! zKgw-Y5xc4iCo6zhr}8nLS0B+j1VDXvFVGmRz`GaY5=;3}sRSXvm4;KUk`phs7(-3Qf!zUBL4O7V)etft++EjM zXXU1AG@__L?7Xj#y5{s;=_9cZBYOaC-+;It%rN0jQ2=RiMSweCu37DamfZG?bz*KB zPOPaq)QR~8#~aga7?%Plft^%moWD1PCo*r2MY7;$&u&A63Wzl?iZh^c?$)1JYjRT= z8pVc`y>RUNLvL983MP;T;K6hWn=<34u-(ON()yjevq0({5QaZy3nbl^saL^ z{cla=dc^<0|J{iW;5uVhVq$=$L?rE+M493(pXLQsde>rXn?MbNX>r^& zT*cg)k-#7sV<5{_tI?vgWu;@bkhX7h=U!7RkZtv}d1fs1Tic^xOOci6uovqk_ zx`AV@Qt|i+t+`7?7_T4a5;w7kQ;WnifltZ)S+&So0NP_yz3NjwHSKV25uVZ*q7mD( zx;GL5O8qQ}U=Qk(HVpdH$A4&JDz{KHXQ*T1C#snerp|L|1nl-vSU zm=^?YtXJ%bW@g%Nn{v>Nsx<5vEEui3AFVMTh5dinh`ua(k@2v(D)QyXX)mtp-<2b4 z^l<=0UBlpkY7sndHg=|x;tEFXn?u&J+@&}puySe{(9bCNdn^u2O-mJY$_7&1EzH`D znPw+(uovJHs&a?y1(rmIaHur@vNx4miObXw3tqKXs9S5n+HsH-Fp<2|21X~6aP=FqO(GEsyI z!SQ>RyRN>5_?uP`fJgz3Oc9iW#GtKdpB%g`w^WWTxBvP9s`u%07b`WGSC9*RFk=npHPExzx4mc&Ci)Fk)Io{i&$s}&g53((lvx5QukWf zSe^EHGe3SPcZKNWKGBckGV7ytvKU1Kdq@&67*ZAt_-mxPYt7hLh{d>tE#m zpZojs6#ozYpS#SvBi}Us0REr9%-50J)ne8|#jSn@WSd<+BB3=+2J8sZ@u?JM(bA+y z+C#DjEZ3pLBnLCE{&Aoj*2=-y9k~Ib<9RT}Vt_rl1-OHjq|K%&TsE53wX0qrlYs?D zYf%c6O>jxHcLz>8G&VZ!`EA>8bShVj6bVyh^yWDA`1wQ+Z-XR6;cC+D)pxt_MuUMNnwH)+~88z%Ev*EA$R2^H6Qo(YUQ0~@y?9({-aF2^K3EQlT%VAS}r zcI+KlA=mNkA>tQzBe#TG zie?M@?UygupSwz&jgCM~=^oH-NF0Pg6A&j~qF5*qT(jNa!EY4jf6kk8(jZ`k*-KOaxiiva!2IVk$WO9r;pqzcPPk{waDw^rYyi(X*rHN2f+- zM;AtyMK6zD6}=|9KDs%2Q*>9fExI?_8$A#`936_jDtdSH@1plb-yVHW^n=mAkA5Qh z+2|LdUy1%(^qbM|M}HdqdGuKH*U>-te-|6TJy<`y8lO$Wn1C4DFnk?8Hx6&Y=cZxw zMaOO!-ht1}!*P6W83tEsta-QxpIe9f@pviv08Qd^e~xQN z=ceGZFIS7t{@hG_W^(iKc_6n0p98r|@p&-E9Ujbahi}bYkI%!o8}NBsj%zrQ+l9}g zInG|KS*S;2)38z~^Jfxc?tN#;1Sc82A5^ z$F9WZr;at?^V7%H*F>&_|G&nFW}>FC#(aI`J?2c~vk>9XUxT?u2^BPPiGMa8$9e3& zWmVn0>sQ{EyIwS=R;m0R?5;7lbfX$qUYXM3$ST0!m5e{$Z4)PI-v`ny?JV8GUcq@! zX3Z%&E=(D={GRXWd5!>=u_nfnAz}JLS%~Mf-IdO*!+SP`m@w++DK()cBr|(h8!Fj} z?l_FQ-7F(+nCzBu+ffaGhe0Fs^`2pL7Q*n-m$ikcwZ$rtv&rP#Tb9!eEKX zfu`Qm$61G-%@){rt?c!ofrj&vmR#w)O&QJ9lAI@95bDQ8d z0zbPdOya;jR}<2a?`uVC5CPSUEO@fgf(lGWyai4o4x|k@V3{B*lE9y8NyIb#Ni>bg zzmXyo)CytRJQ}*mcsnJMOCcp+bVF@N4Ptul5uC{(di257#pAfSP(Bam`*Isa$*N24 zr{vuCb#uHeS@NObfMV|?D(Ft279lTNhMv+p^2Vq3<~TH=sao?QczeGG`)R!q1J`6i z4{_Yp(TcPQBnVw-w$1wYZlvcyKi&IrXlAe@5g2ZOfq6d=5b4!;G@)KZ&>O#>|%At}N zLh2p0NX|avdD#WY+Bi(N?bLl?cXw`!cp%%uh@`t;37tcpofIj+?RQrzA&uGHNJJxX zq9^i+>O;BBas@&;(4OvqgEOSPDP~|`m0Hqhl$j6MF&2UpPJ35|r~_r(ocEEJ^8QyD zZ#1I!M(3FyGp|8}zZie~Ykpbh<#y?13B_gQuKb#L0_6!C2cOvvWr$pE41>P$da#YM`Vdo^Ng+vkQ+vK$7FMNx2PHv~9sH_=bgG>r?9A;DCAx9^O0?OgA{;>D12crk$f4l@h7tFaRVy)A^Ur(pK<;L|WK(sh#HOEL zu!X=(=m-3M;y5%~@OUy_@|1`6=C;dAZV7xz&qE*GF$`bVKH>%FY!i>ftebCsDv`Sh z4{L~BALe1M{>Y|a492|QpH>sO6Ziip`9IG@J}zz?Gmb|7avVTiIr3{ChvNQdVq_i5 z31-`FJHtA^ZxJqUD=shc;ohvv6zfxMy>&MQ)Aa zUdQEaRJ6$9b|i1!k&ELU8mkwDIYmz|=Gs#JACbFl6X)Mp-I*g(eM2}39xpw5O)%PI z{?#8plG`nhQUGPZVR${tn?eH?4wEg#U=RexwuCfrhgv|z@zgJ@F%O{sXQdIn##kBo zf06#kNmxYim$fn1Ay#lmp_BL*en;!65ZB{EFh=3!fUi`lwF;8I4`Yolm%*!2D050* zEE;Ktm|~qVhYJ=|pwO`DaC0hVeA9AD{fVA%Ev7o6G{||mUK{$gC7fGn4VD+chrP^_RBrFB%ah13vTfAvtOIiaAV=ZveTi%PLag% zVy)UeO@C7#_~{5bb2{PkgLgg{cjkWM1B2U2tYifoQl_oqU~odZp!XwBZ~PmBkZN0e z{)S}-`sktatQEO-%^!qFl6YW8pfFt0h7(OL!J$DA=&;ezgG?vj8r!0A_Zc;juOR-v z%ZOfKe%zd8+=X_4eDL*uVSZv~j`ZJ+)uEsqo+_nDy6uY0*G^;g{2%PUCD$uAT>A_C zWX?SR_wFo&5DZU0oJ)zN3kJh`TBQ0e8%&O4i}wOUj#OE)r!U#jlf=wgNuoIcK_vii z{?AaKG*Y139v2H--ZtdfurpbTsy5gL$f|TQK>Ub$KqM(jI)5-KAZXIW(`L z@WjQ@(?eYk8K~mq`1S-ri46Q%N+|xdHa7C#mj=p*$S0X~3(U7Aa^%TwsMh`hYUct2=* zMKy(njuUw7^?f3lOJg7Et8WMsB)A_VnHKR|Ia!uY7VC+UmJyz9aun&a{_sI-d2YWt z07^OGx8+_@CBhu((jkzSny-jdWrPVx7P~nGux#;M2#EZ=0P6tJ^ z6ZV5iE{?h9KXUAbBvx8%Ppq&)^MC(tME6HeHQ!=R2jb@nxXa1R+8+0RJnBEnq@io_~IsBn?j zU1yz;yA|)!RISz};3oUoxv@4a7iUC39j?BlH>YIZJHlKf*g02)QeW(94;Y+{N3MAI zKyFapT)P=2@aCi4j{bNHI%DI=&M;TwkRQrLUa%msD|b+o#;P#y>aH|sj2UgqoC@_C z94B!U(UZ}L4xN&Igg;%Gk^94KRS!d* z?{_L*`r8G5SqU$tPRCl>6XYi7Nn9>w-!2cuwYgcq0Cuu_!Rx+>V;JP_1iK;bqEad{ zU~(nf9k7H0Nn~130@4(_vZ*0w(ht5ksI~#E3?I&e46^uOEW>X@j_b2={g3=ElaI*b z)tCl6-s2Xc42C(^Xm`gHB(;Q0%&@>HGxBf}$QqTbA)ecJ|L(kj=QdWa3?q!5#)Cb{ z@EUm5(sR?3=vIvHg6`iTkRpvbrdG$oJi||^Z|%V_RhWw;W`&D)Lg2gPl%)VjXGq(B zrSMtVJ8ujA&U0%bFGc6ihv(TaJ%;ke6&&Xj~r#Wp#) zi8i3Nkh4ycddDkm2;OwNXlh19O?+DA^-h7reR0JjJ+`PV{~`B|qu+ zQU?IfGf_$Scv%w`E}(C0yWmrI4d$yPj}ZK5PYLwp1hO?we+p76ZSly9s>|{5m*X_| zP&zdQzltj-(9HAoqPWnL<%|}kt7Vu)Ml0n!s zIYEC92&?)#56rGHzJ>e0--upqe%{z`?g`2Mjn^9IS8IN$*H2({} zRlwqQ!k#x(-yYn#>37gBzFco&Xm-9vbh!P?@v!mU6xZKR*oZbS$=o(oS!}$)brp@T zcoq6KqT1P7UuryqDe#?|A>AM}PWXjN5?uDI(StxW6cA$uy9ORYw(cM=kpY5+@(G28 zic&uUb&U9;$!izVJ(aKL@7tXxS9(LWf{g-p$}4s#PI>2LkUWXPlyT$!-*=DZPZD(* zoC)+y!L0$%10i)9r7~VG9YLgk5mM@+Q9sw) zyaiAEr{@2DZbV-looseT@{!w(pO5oqzo`G2bx!^a)ywn3C?5AfBM=*73x-IMWUP20 z?9-y311yoWxF-%`(xqIHg|kj<&z~+?1kF?VX%hEUX%+$bYqWpEiQ@f`hrqp(=g`+P z>lU8<@R9s!xQq4S(h2UCsRH=`m{bp7?NVyFR-j0DcqUESHRPtWU$-p3_FUj@g$wl56O9XnHo;t)k0(Boiy5LWD z>iz$|VSGP&N7OLiZqAK7@}j=TV_2MZZT?J%8>-AzVZ_aITcx_f(kW=iB$tX?jr;;s zEmMMoC3-V)KqYV+g(kqWBV@{)i{xb|t& zamdBY07R?}Hnr?|4PaU|#vj$D8FTj>s(^2*u&g zb{n(fHOcUL3ZteY@%~HdYK*6W|4RaV7JW-}hWTl8W8~uzbP*n(ugFO!(fPCHT@l-p zCna}dI7iUa@0Y%9I7b*_mqe!wrqm&*N`SRB$wnney+ zoS*30mRlV~(QN4i00+QKDOc%ymFYe}n)++WWeT#9t}fhJ{sdas(cNQ*lMCOyAep~V zY^eG&0jqMiq0ke!N6u&`INP{4qf;~sA6(gyCtY-XbyFDS?*1&mny8*f@b`gB68b37 z)vki|+TW$}=i^CD;VOxKd)@4eHSfk#QTov~1-ve~L(}~k4a*lEJ<^_^BJZZ~-*N5Z zwWu76PGwAx>P7jGvbAGyrPbgfMyBV){V*rA{d@YgAPs4jPgmatSWu>Cli{nD*f-pv#bS|!y z>JrbbXf?m`NN0YkZ05QNISq}04SEZ|^qX7q7t7{_DoJ=~IdM)L=Roznir*){q5l83 zjp&=eyYU)K0KNtT0sjwt?aME~wl#!P*%3WX=9Sj& z{Cs#GAgK;cH@XY>Hl%GCO_cI@@*GC>Ftt+0v<)?lBhrB2-%;;@@xC2o*uXWJ3Z=cp z!VlREHP|o7Ib?_`b&=DTfL}@xr_*RxOi{f?*Nx2vu&C zG8eN%6cqL_ifoY8U?MqR#wm*@;m0)_t$nr{JK`2r127 zTLMwmX#4;3Gi%IejT4O58^-ISH$~nP0e{P1`O7*nzYqt5VTsW&a^M*$H0wBdrl)Cw z*dFjd z)-9U##i6;Xkxm z)ANf|j6)T=UZ`cn)5!O9)E-DN?@2hIXnAc7sj6Fa-X&`PKV(EtGl$FzB99s$ihzIU zMfzpU%dfzuqPRK%8-YgCG^p77dQ97*nLjxL%;42g5!@>fnTMV`-A0I=VDEShV(RYjS?6s@d@Z;x<5OvjvQ@ zO`07^aN?DuIErYCjvES;5|7#7hrUcNd-FvRqOOMmroQv4uUq@_%FjNuJy7d=I3b9G z@TMrgK&8>AgXtx_yB0fu#1bxHyuUw=NhesZ4&>y*oxCyDjdo;YAZic9(W|egA}DbD zJnph8OLpjJG(@=A=AxxKFsQ3SuMzjwa;11)L=6R71tjy3gFcI)bofOj|Yln4m{tB`1c0zAlm+g3^@*o)x zOzOy!F}NWXtY*BzC)egq8*ztnimd@&b)OZ>U#=QJn@RoN-QCdw){0@!2y$Gc*<0z? z)pjJnl*0Twqksd28Es7z-H_Lz^ZF0)@vU)SN_*0(xYM2CAtusf`PZc7gxv0^oli zGNS#_bIeVsTOrjl;2g^@;W$ObjW#tiWj!o_5~yd z!rY~k;9K<3IXCB5LkrZ$E*qy0PytdXo3f5$f9Kb%>im_uFJ}b)dUt)dPK(OoP_UVd zQ08&W|6cUKpVj_<%ZT1!K4Y$pd^3^)An#Dj-s=w2gzgDbE#f`rT7h@qR zYQ31;l318ZckrTkY83XQX+;8ZrL`-;_1oTrS$D|^=kLuoirNg7K=M+Xp;AbT{%0~A z_-i1}7y}k;zP+9$bzNsyADXsxav<*{ZlyzwYD1AAXwmRj z59b@iZy5}}TOKvwV#Xh*4cwnQ*}jBisC;yzn`ke*dG#NDIvX+S)sQ??WG4{&`G$olQ-DP7eIMe3o znIR1=GhcaRJRTyzDjYEpmP^*Z--_mmSO77Hx`KZ1=pKn|onR9P)J5a5gZU=0cA3B{ z<8G##5z^K^UY$yLP0@YYuY1$sMJJyIVhKoc`xGsX@>ELF%1}?Gt7%4Xa=tMvLg9y(0YyGaO0k$vC*c$ zBfY_x=9Iy4eovdVC4VDSPeb)kD2LuF^SzcRUMAomdfYyz0fzUmoGr9H-kpT!&K7PE zgesA1S>}r9UQA?{tS-7Q*;Gn6Fp}r!u_f$>_f2R-)6;9aRnVV7GN)eh0-p z7NS(;uG~jPnyu*Lh51tmlTA6ou{*qX(EULEc58z)@dJG+#=%;-!*(Da)+cmpI4jjf z-~MWU{$?>g!L2Rs_O9~Sx#xCG1LY`?(-k3Ei39OI{@8tPlsSiSg#WD#67p< zZxWYd0{9;f`;U9|$#ZLrr*Qul7_k0dGp~xi74v?W_HzG1|Hduqtj!aBhM)4=8Bb^J z1?Z!>WO!>dfjQ=|92znBEzDg~*I;m0g63gv02q@J_33#-h9T|ydva<($S}6mj3EE3;LZTbA(X3Tr12hOOSAIp3 zoyF7Mhv0vgDzM<{ox1`XPl{y}sko?(#Z_tR^gR1Mk&Dpkj-M2G*@)wZlTc;$YhI{j zSQP*XdT;zz^b4p8(vAWE&=5uexeHvg+CiFV8)e>!@Tjr^z)TB_0f*qOszr5)|KS+W z77a9TH>fb|Y@bZ;P*(NDnfA_nJB(&yxZ0U}=5Zs)99m!!TgxDUV!yd=STU9OzTTsG zrSsMHSDc%laJgH`azYuYTH^^?J4b<1&^RD<2uB-kUH&3AEg*19a; zsv0Udz2Pn}h*-N(MMDM{|6xz@>+eKeQM^1RK1LTA)bnzo>TAZE6_Mra^Tlg1%fPP5 zifQp?-QsmW+?8*E)oBPvNP?Yp4F=unuzGlxHr1FnsQ*9Bd^CDLCj4D(ymQ3mzb)S> zmQNF^e-MPXwp_Xv~CzSOHiTltKV%+WtSY4+vgFHl?>uuiz6$j^@cl*%*S0(la;;pG1&L z=+KDk3jY2pfGXNVl#>GkP0#y>H58j+c>n09kF237y$qcrg8I zK(cFfZBvGQkuaj|aFAdp5Qf{;NB+g?+6~ZCK>ndJ0m7Yq5(u{A2l+2LF`oguB>hEH z7X3(xq980KQysy*_zllbvmzB7=0L~r7%$(daXENT|0r`9pj)=B&3ueLM&-91E9o9i?d(9Dc>(jV^N?C zdtTUUwIU9UMnSZv5-vIasXh5V3E9<0^79AWpG$kUQp%k47 zH)e&Zx+Och2J(Y)Mf%2hMZC!zc=R&egySZWQ6zKOfn>iLlqH*ff|&fEs7>pXiKxvn zkdfQj0abXCRznU&L~P0GS6Y+u1G=1OnB{oIvLPBeWZ*b7vt-GUleNct=|Wa~q9cDm zPDH`uetOZ%ZQzUwy6o)JvZ4O~e*nshQy5TGy;-+p-nXoo`3zneIh#=JQhvtU&3V@( zO}tMjYGIpdJ5b?cozq4Kr!xc;v!NKd&P1OS*O2~?qh%gC0|%sLXvysRYa$P#{}%6~T03ff7+E z#+!EocpDyw{v(Wg*Yodvi?twslxdilwJq>YdMcOF&F72P*Mo0j!4RXnF2?rVOV3bqKz;)2ZYcu5_e+Lq@r3)sW~NG~ z)sjCV)-qgfD%qXt85QjNE)Du~s1}{zhq1J#*ibMM!~X(}pmMewjc`6)Xp+O_!8x>| zp%USDsbqujMlw5&X5(QGBzsU=(JRJ;8jlf$Oax6pCiSO!YkN>NB0?XMr&rWA#XX6R zF7So%0T2w#ft4O9sPOJ?m>)guu53DgE7a3OI+?fjaY^u75zN?BBgNse8AK>tDhM+G zfwdpHXNTJVdyHtxd>-t7ABs#v|Nmd{%Q~e%{zR~DoD;@a;F`L+{7yS9l%8htirN8D zeRl>uD4>GHHpqeSZ0#7|J}^m>s@iz^OV)`6GM9`HhGKjIvF`(80!)}s%7APMw zWGePGK!rViz&gEP>Umx;k@LL9B?SlGTM+h1MoIn?nK=y6#i;`8pBPMGiLB?9@|CJs zp<6z@<3J&TtJV~PG{8@@xK0pcN{_q3B8l`HNC8Rj_&dL7)f5apLER3&6Lb$VDu>OA zS|UnO>%E+91%*~#u;yCYlF$dxPQbDP4j`l>x}ev;Qt!Xa|M(a4#>kH&m%VuAe^}=h zChNru8~(ee(#PS*%D$GVd;VE>RkXs=$&Xmm3Mc7Ft_yS~-0$MZ%Du3*@&*AA23dwG zk_n&$G(mOi_+}I(nC5mA7h7%xP=m_78WpGUR?qj(Gx`cKG1Uqsf?^+!#BoXi%77() zL5Yvh*9TlmiQEoMSF$-v{%}f9p;}DY&cLnl^7e7z(T!;vWExxLYNp~DNK0>f2{yFk z_lesI7)d|cl5Ft-kOm)qCq5BByn8i@G8%TWZ!HpFPx~Ns+u`qqf4&Th#Cl9 zdt}2yYoaTGYAgsGSRhvK163La3rDxU7kw?vQQ73#>~d1?UqR`@URtC8WjnlG9a-}2 z@6{MzMgG6hh`uj6-|ROUBj1gzABXw3q6LyCHrYwcfYg zH{!WRcqywxphnzX<~8D+O9%_s4(S6Xz+~DI%pckS97QXTAQ&86PHAX|H`!{PR5%Sn zP<(p8E*$>_AP1OK`hum4EbHt7$u{A(Obcmw-L>baQ7A<^Bmwm)<`$d7)Eb)Xl3g~2 zpeS(VlLe~kmd^c(wXATms?PC3HP)#&LQ<V^K<(WkiTe&--C>;U#!@eN1btej3i*ZzwV6b)c(Q%g0MkK8yB$ zl7Z>71JOG3smSLdG5o~~|7D$AI32m7bGT#0@tYWmEi9bpcGOcAIaA`OYE653LMDs=2SG8HB7 zVgxS>o_3dW_uG(EL)&n7rxR8E_LyYSJgygrS@&(I7 z$6w75x0C*5kyuh7MEX4mjG+~!R0i)vD2s%B1e+n<>Ij<=f^)uE7g_`CqL|~mO680{ zpiPF7oweyn?BbgQ-Qc%S$l%g+Ur*soxt=z`!tTgV2@g!Ja^}^d0|f%`8k&>AHU0(zS)Hh`go6G9El9dNG=*m%W9k zrPHYay|p8$?^{stZ^xaNpG4_eZo0#KsCMzbC)0)V#QD}3!|&w1^tgAe!>zmm!F}VU zIEl09YpKN94~-W{)LCC$FFO`+SngtYjii-RT^MtK#!dy^!+{voa>mlP?`$uS2e~1p zw4;7+>viXgz0;tek)!WTkv51I73XA|=Ak=V3Zy=6hy|B%y&kj{j!{4T2_-r~LKCT2 zrYdcC_tK*SHO9Ze|G&bBUTHpVULN_3aYbY&_AT5Ol66zn#SCS|J=JbyPJ=em!^fnt z0rju+g~D#C{Pq@mrItSR5-j|+lz?FPiThpkz)C~pevrfOz6UoF9<{!1z}Y7gw-ly{ zIO<~X&;9waXqZ6z~{Ta+jx+_&|jte)zXiB_13~g*n`GcFt*QA`bJMH zLeh{tEr|Py*bbfKMPm($A+5A7{n#w)%EE<|h?q4Jyi*BnFB%0&xC{*=Ia*{^^c3GUqb70$_y0yCdXM>M^KLU{JcmC__zRIR*%iY^!tR>5 zc@$0;E*}bhI0E?6l9;Y-&5%qUf20c~&J+9`WT$$;No_j_&wm1u@a*Fe35R8wVflyd zzAjP9kf;kuO_H@*ow0`-{2L;zU&A{TCSUQwZ4#6lHYrk=CE6r7h32PCHjcN;3yb(w zbx&a?)=(cCZ+QdWbP>YH)QmsAc4>AF^6@h?4%PT6Ku3G|FXhk0B?FHnfqw{Tv<)0* z4{D-BR~zCc`8MYHYR436P5+tRr759lR zrm7B$xv4N;1axumo_Nq}R8S(Zu|jOovXkG2B=S7v{jj`3+d#OGIrcu znV&LxU{{8TBSE9c z^mu}mkrfvpV{x4ekPk)7*;&?%VQ0UIa~m~fWm&@{>x6<$i>xS3zw6QL2XKev$>z2Lov*wnG&HE_M!n8@}NvA+a8Oyp%jq1U^{96MBk`LF1C|0=(z5~Iur`WT^=ICBq zL4au>ok2q$^EGUp*C+R{g81Ocjn&E1Vx5IccSZoN>6^gyz$B{_KLFp60zzn(K{Q=xYaO5Z$etX9jWEGxzltuH@B-1-H$3O6VqL zJ6XgOE|30MwSb$&yJ6(NqiDTlVL+i8bYim0TSBM_i8mJ`QUuSJ`?x9mm>K=r& z$-sot&??B%m!gn{xoVMvqSsprt3@w_N{qU%%VV3N3!b?TwcI*&wR9m^n2UE1OtrWT zZG24RAOOt})W05)C_fFqhAUSP)wWeDG*66O#x3II` z>D8vP0x1+01&g1?#5*zh{M#li93yy_YB$dHzt6XBEvyk`F{CN)faiNjh-F( zxiJu_#`(VRU&y;&i<^v$);S`~c%q+%b`O-stezdhD@06W8X%NK^x*R8J=QISb>hPf zEegC{em>mh;{4D`%xbbv{4u&GaeEL1gbtZG*W-K6!pE zeR7N_0yP;BVAe4Dsh%EpK{;x%Ke${#G@P*JA=^Caqr$mCM{sM=I7T03Rzb`@l8 zL@C;;R}RYl7CJJK@zH;YTcrPt`-F%9FJA1hX4J;sYi8DgNaTVVWi*j(Q5@VAQ4QEL zRQZ{B;6@8}(yUuP^({vW*NBf^DWfV5bwXmm+ zjYA1Z8V09~+X2Jbg+cFZEJE_E#lEKao|t>hP0BDBAu!de*>*BEfOQ67Awwk8JaXz2 z-VF#t{JKnmJitw{;Dm~w3S3jxxDcXAX!)jPI|}RZ+=f_i$mQi-xOK_u{%-u*ZH4Q_ zg$ORudzy0_6)qUYE*lb_D6t13Q-w(!kT)4a!VFOnVz<0uHQHFNQyE(xsCwO9=55G; zq`*XuPAm3Y;4##9LOV%YP6Yz#b6OR}NkHB}uv*FiN=v}imHwogbLG04$TxBSml>dK zS!R9=)4%r^j|JWTqlFuw9UH3$!e~d&J@so=1ST3tC6wl9@bGpRhXe!IqoLCBSKbb6 z9Ep38aakL3dqIU(g091Yf%%`HJ|qG4 zRNwvsoZui&DAa{=hy9Phj+H>;%U}Bo{Cc+LqC%!s^ODxwUDzU`p%2E-mA*9^5#uQu z9?!0-!?Udo1#(aqpB?ZF&&;n4=0N`v=r#w{FDDUdANU=lL{i>FXJ^jBu)c~%(h8bA zGz_V;0{NvR!x!0SC-@M2!1KUi;f-GXr9*{HqWv_c4%jf)?3a6lLl;027MV23#USaG zMQ*74{@>O_&H?^+iV=MsG5{YmmqcETVW2t%w6AcBoTVnK0`}SSEK4O>x`e``hb$ym z)kibEU^jmFE5OQj;IR$Wp{itF-T|D|QIu^sJ%Y`P!FQJcF9^tKr&ApV*RNJ_mj7@w z-gPRp*kq|&_rafKYLDty3~?)2U@d z{_86~_R^lhjk39+@|NzK8@h)9*X_NJ))>#g{GED3=sBHsO~%HB_zP7v}n>I8sNboFejD1*pt(dwR-E|9BL!t5zBSAu+#O0c^~g3?L1M8{ge^hzY0+B8U>^iCPQ%3t z+=Dx@$Bi9+jn!BxBXg|2QqJ1fp(PyM}WmGowed~BwGL{M>20k_{v>y2$) zRdraG@_(d^=o<6WWXh?hbW`>TSu*74yeqBoSM2=+)M|g3U%8jPG*4=zzbq;4br$U6HqJsffFA~+3v;yyLZhA(K5A{bCrP2Ar=};bv-%>nUU?~}HrDDQ7K!#0_;n&WDWjJgFEMSS~Z!o~e zT^+dvR=x2q63%pR6VYj|cm1RPJ`^kLhY@Rt-LBwuzbogZPAUUqsS=i`#Ne@my3S^< zOu?ZZZA)Q9QVT8?{z44KAd0l4t49L1cyn-`Z`*9GDWt^L9g2ieeeQ?4 z4ahuuJQrUDUB}Akinm1DE*B*HASvdlq3BT$WnM%n0zgjBsR06|p^3x4XXVwYZ{p8F zs*Lh-IwkyU=;4GXts}4W3cPlb+W#RV`f~F}=HAFZ8AFk?1FiUR{Q>LL!l1?s7mR-& z!;Y|^2mN3-75hbsjT zCTb2u?zJ(yuVseOdEVCA&`wdNFTqTlPoY@JuKv>EjzC8QA&?zprGu#AofnNAAt z2J|VFxZWl;M({o`)ia62a&f#Yd$stZqfoLdC*PJX3`l&Wj)I@+aNp69z~^)VDZI7} zsV;F%G(+Eq@(X;WRz*RtG@rGm77pMb0TQp59rAmur(wB{a1lg%?YM1@Ho(XjSXzds zZA|KmON4xX1w9HVq#*@5A3dGepOHp3M~wm7YddMb_{hORMtmqO65)0QEYsD8a_#%W znGxcE7_vCN2EYSIpWgo;9IS~hK>mM;5q;QLVm@WAj(jV!&v?Jz1x(0P1~62u2rTWt-i} zZ^(0_#{evAd%LdXnugtl+a%Ok9pTtv-sH^1*HWJuH|~^cQ+`KZrb#lYmBb}|2xBowwnjds4*kb=W_S0na4=ViW*ekE~HhhO{2677ogQDFrmGQF~A{ zBxT%_B0dlL!W~Jv^6_RY=DoU@ifd@Szde|j<_qcPg)P1BDwr3QqeBc^u?=eytPYh*?fh=(ZDMeN&EP!4C`y2_E)T1IU zOV%d%Yb-{p@J?^Ot@Bxuw*4M)556`PJU{#3GXU(bG|dy4AaiX^SPogMKc1dVk5BN zQ%buUtrg!8lgwe$kb1I_jw^@k`5$*0(Fe`XnVTbT0RHz*7Y)F_`f&^wD|Xuzv54R0 zcb5?~Civ5w4IVzG{Dum-d?B7d0tULWV%41u)D!yIZ>1)2cgm5>^6Mxq(1g@$z#v2oXImWSqV@83Q3G64FwH$J)r^ z;8xP)!9v^(MnlCcE17(498tBhWUl<_|L#2&6W1fSEaB;TY)ZqmLMuqIMql*RWaCgr z(_{NywRQ8cYT2xzrQ_Z#X5Dy;Y=urVn4{^LT$L+^bb&J}x|BPnAI5)JWY@#Dz%CE( z8f_w(LCRV=(jTW$*5~1uywkUPX2zal%4!@cc5(G+n#-Lm&Li3zRQ3G@wJ57B3rtur9V6wBSx=T-}v(7(ev(;*T4Eo0J3VMo;TMCtD zR3u5n@k*zUIJLA*9T{p*{>=Uia9RBfXiMo790k^gCP~AHQ$K`Z>T&mfwh@7Yv{Xkr z-bd0R$<~PZpp>Ppla8ICUO^~gh;cnb#Z__e5Jo5?qHUNUrY#|dlD_Ua8`H;5myE0y zGsk-v+YqGC_Kd)~!=rX~SPCBc(9`ex|Lna7d>vPrK0GrwjwL5bAx<%giIU(r#ZE6S za*<_OZn7O)#_7(LbR}O~EozSJm@qOSA%T!kveX5_vY{=oz{0{p2yLkw2yG$MrG$Q) zsk@Z_^Stkwt1D?{&RBB7vfroQFE^I1bkCV{-d>&;hSBjVgHN|IbNKVG>tO7wCWd-&{fMZsXqbdx>l)`~CNVJ95W~Lt)P^L|NX`$}L>|yD#p{ z)yOp@DyNLB2#c`)Vf-D+)wmx7|6k&yUY@$ld)T`I(|<2^#gL;g|57HUV0(ZKi`$hM+{FGfeB4O57+hg(JF|IBB(5-Os(L{j9 z*8m_&WRPYja>rP?!J@UhaP<4fF2W)!kJv4Eb&Klv_T^3m4K!D&hPTi_oH?6F&qMsy zZSiO33_7zt^AIi?AbzzPi2eZVA|w}3EP|u~PI^i0It3K(0=5j~0^X!BkhwqrIDj^2 z61Z7B{l$Gdb0^Ck+bhq*?>Khy5mq>VSvEIYcr20DjS@YuxcL+!^a3a}7IHD6f+|F% z*i-*SDb8eIKVboOh|BNe9wwItYNHUX&Q@To;tBEVL^#$e zwMExm)ss6N$Jmqr{x4Fug`-rqW3(-G3gcDSAq$QnYc^v32l4+ObyCBrQ@u^@efa0! z)R(_LrvQ$l(_;0OUC05~rfHeN=_KMc{bb~7f|)9VyYTNIL%{0Tv9TE(-S|pr$uH?lq~+c75N$e371WF*@+?Y0jVl=~5BiL(E0d%ZN`lJGM~m(_w#J(c z`@hpk?Mb;#r#Irh$GzP7@{tt*Uv`%5%AF_YxjD(>hKp}op{iOmpZmv~a|%#7^@_JG z6CrlWmBe1%V)x10a~F!Lvqvh!38P^w)(nOuqqZWGj(CuG#inZuG>vgvtbWG(ftL&( zD_*rTcY&w~`}0Mz*EqW20vf+oo$$kd!0k(+Zk4ap87GAz?rQQ-5qeulp-Tdj@FV_F zIRg=$hy|v+4kU$$c8GJB!IXw_=FDJ%6`!c<%n|muzSLv$8*R(W5ujIKKh^pY5dHlB)6E0U)rm z-9MlQpyKO>+@)aMrm939cVt{{3v=t(0Zt#u6PZ6Wvu^RZKkv_7f=_QWjdoZz?o^`W z;AD;(Ot(_)p^29otzsx17M*twmSOuaf_YQD^^jzye_@XJp5+gjE&r42jhhFL`Co|KJ5Yj)SSUtPSm~R=P8$o?0S)A$FjR~4$>j8yy#LSIdJs3RGiKyrTp;Nrst=q-FAiD|RI@VINc<441 zW?YRuO&bRxVVoL1c>tnLEOy$HeUdx_SuyFYGdk6p?q`{m7}PMD+BsG3RVs3iv7TPI z@~byfE_rnn6XiUdk#Y%!Y%kvVM(pFY6w>Kn7l7YM#4E@GXd?5k!1)?R7Y49GuGVtU=6~3N2Aw0)r9>2Mb3cxN%tbG{8WDJ%+-lO zk;u1-PFcyjKQ!M`1_xLrrrR3ryGBBJ|wr1K;^NeVO z#!I_^T#F14Mvxh#*045NqM9M!GO77y@f+@j7qNslU7f&HiM)*_^fr@e28RHj%8?k3*%5{R?cR;|I znIf=iVHU2a9ZT?=Q-l%&JWW>yljJl6qGhVAZyiJdaxjHPO`f~<)p(0w|1WV;4>(Iw z7kH1jkGfYlpH0I4{xP|g$_q&&Z{d&(A+z6tK|WePOTEnF#*{SFgh*VN-y_hPL3Nh$ z{ErUo$|+#lR8wzJzkO)t6dXMR;~HHZ!sI>!fEWJzahb|pl?MR2+LDm%}j?B>m! z`bU>P=w3mixy&2vXYLP%M^ER{age@4uvSTcLp`Xg8zdNjSGVMu)kC=k*oBP=@P(oh zMOK8Nc24%ie#X*|ORD#QLS8_>O>fYhnaatfj9kF z9oZ|azGUI%)IO)3cG89^9?@EWX$UVNI*(#DC>O}`GLofoR!43lZaY}R@~GiAVO?fs z-I9@;I&&Ljp+qDcZuG?rklQshut$$A^K}$Ytk?UyQV!1YP~mGG;f6Kjq;yQ%l50OS zm|G_&p&Hb(yKw3Xi@DR#fXe{VXJDb7;+1e%X4y4AAIddJRKZ@BOZ|r27O{9o6@)16nIcJq z`7tmA>?t<9F#aUA?J&kfvv8i1%fT{b@J`7nN#h!uO@n;qxO#fdnAI}cZd9h1>-)-y zxPe}<0YZf;UElsD|FRr`S7AeG(|6osL|HD|hT5bmA5Q`vZ^xr#P>?L&u*(}jek(A( z6c(dGnk&7OBa5)2SoO$3O<+<+6J%(gsS{*v7|LbgO%t|9cm4V|;ck!Gl_UCPbCuTr zSZ+Jc+p33V>qhcl3i>M`M5Q<%cl|HVy(PB^OVw9tN0Vi#a3zG4fdop3tPk!mv65hk z2m7@C=POR?6{%X!cfR7C;l2wC{Vjj_*XEuBJ=a_{dR7uW7k5Q0U}a#76@e0~lZtPc zsD%EhMRQ2Dhu~3gPAY0zLGufw`JDPDgAP@;(yN)TKBPD=lAZ=*;jfi(#vmJj3x{9n zX8jrb02C#6DK6oXul{*=ju3c_NeT=jkb;wz7%qA8C#|_1Vv3IIUJCVc!fCGs)`wBO z(xC$SW2mM-1BNq#;0GE1^c-_B5Cm$K#0i2Z3w{&ET!Y)?B3M@+w8Vq*6V>DEbRBvg zyvnf%>ypQw=+CtX3#ya?Tg2@z++?b(#M7&1C1T`IjwK&|_O9GEF-a0>t#Chs!i9oQ zXo&*SBvvxFAvKF9Rf+boFV&=8iuiwn<20nM_TKGY33uRdzj|^6glwu(&)afDkt%7c zU?|HSsJma*=tvp@h9c9axsWBrmgnYf5+*ocwg00CW^%%?k2CO$Ezyyojo6b}BBy3V zCdVzyp)IXFX>@PyMw)Kb&%f2Wg>XZ4`k4yga_pgKhru}p3f3;crvD5e=LnL9%w6(!B0z|)VxqH#MjPtXn>3_G&C zR75-?I)8Z;7^r8Ao#MpJG zedP8KfP=z<%B5&5LnoN}P_f0eG^3pNmwdF$s_pB~(pCg|I5MZ^?yh*``W%5l8xt4c zgu0iZ^*2k;e`gIEerGt>J6_JY-n+{?&VAdFVt@aFTszJaMfizATT!Z7GMeKsFVG%z zL~;7T`Q7Y!c!>N_Z>7s{twMXNqS8q7Hl}z5q<`;!Vu3f)DcNaVAi^O@=Q_m_)g9vF z;#9-oZxW|)?|%;GI;h1ss^C4aw>_7U zg|)P2dJ7}s)~WzRbeY@l89gr72KfU3Gkani|C z1QkFhDHJ$Kv}%8SCzq9b91tp>#y##(m;xTNOw56u#A!_;?rCU}l3+;o48XM1vDSLW z553kuKG%giMorAgQ)M+F;i$YM8q-sBM?nUryq+{iGEtf(c}xzA ziTTgBP~8W&NP0;6GrM80C<8;heUKUB1C*Z``vZnT`&Kky2;v-rxb)kvK-#KXy#sZ&u(c^@K4Xmsm^1AOO+B*a+CZ zJcXWe5P3xOjV%=gfPOQe{opso%E1_3RdsM!b(u@Qa;L`sU*e?hOI_l<+j)um7q=5< z`PcgLTXMs4t;rnlsB7I8J`Q|*ybHVyT}o$-jI9x|$|f=s(l?Tr4xKdEN&}iks#qa-yz(tk0*eXIGbr=1QKRb7u=n8+nl|Z5m&u}!2ilMfqd5FY;Av(rFz|LiI z86wW@r~rf7HsRm8<>&hgb9=EbION&|5GPq9Jzi7~_XtQRtqBblGQ1Z|(=vg<3e-aJ z;6%TN1N@cotSEaCu||SY1YX^u^#^i85_q#?a)gI5HjDf=cPchDd0C8dy;BrC(snkz zD!6hWAorUnLEYTTZpaOav{zj;rQ?c<{nZ`&+TI*7qMNGi#Xpgkv6l1VKM?)IU2--p9O~-R~g(pQ!$CoQSw1w+|{I;Yh&9 zz0<}e6OoPpQcBnsMtTCQHtavs109GEEp8Ep4g)*NVHDzkLF z^tm}AVm4LpPa<<7@<;;60?2q;rwWT@8j?6KXawfCOiM)QvJ3K(4SsY+bOSfP<(Ay- zaw+zxO4Oya2#Pft4QL7lefcC~UE;de_2dYTSzn#DK4bXN)6t~A&K_tWJ>n3d$9V-~QJcD# zTXbvj2--+w7$F8aVKNE?hJVlpj^laTEu&ukC}Hh`HF6SrCbG)~X@&0uF<=5n^)H^###FRyFL_Nnk z?X!@qEK6{tZbDU2ce=k#=Ct*4@G^-X#yFKxYgaF#qx=E;zHyD9pU?bh^z!^n2_hU! zRLBv|%B$&sf^r~7=na4~6%&%*8Dz)S41XmsTA9#hTB?1R@PllU?L&N*ztM{MbHb3K zdIsc=XxL1yy_4#D){x@q(Z@?9`Zn<}P{hj0F=W^Iu*M`XsV;z6)7l%(B9bKVBwEzc z1qGKB%M-`;firP$_tI^tng$l>HbM*1BVqVZiqOOFH(8fh}_2O{A zA$!@EBWH`B`z!L*N>Y2LLsCa*Hylid10I549l*3D4rbx*d5^=roIApINg;d&CBnxa z^iRkit#;x$R^=T|fixWCVwxIUfG*XkPI17FI$-Fv8x!#z%N76U zP6yLJPIljjVZe7zhwrEOxBhYYLE`GD3$@AXC$aEFcPq%YhgWE9V=k z*u<z9;jWaB|%Yd&%~3g=`#zxFcdf`9nG}HV4ynkyFEz3p`6uuv_=7-;d7C&jMvN zRUN!E31vlkrf9pq(W(nO^V&mmL>xP4i}hkYl15(Gn2g6VgWR83L^ zy)mMxp06&L1SQL>TekG&`|?ByZmiOvH)tl#JB%{&B4V||>yeXdmR)huo;UP+Z4jjjFM!;dILXAevt{SZ>B=9E$EvSN zgvt`(bA$*hDOG1j17c@H0arzL67WBMg#7L2Y4=+3T3IBrpX?jN2SS{H|S-BY{9E8qq8?TwvN@2Kf0EKWU zqBI_kiO5UL9ug6uU#STQ0v+t6F^UvJF`;rzx%RSKe-C2mAWPYKcZzfaVF*00vT(C>?GuCm4+Hz1Wu0Osbfx#=7=o-nXh+9+p_(I@C6Vrc;UnGs?SwQIc|JA* zeXO|zfethO3%lNNtmgmT?xZdU{%^heG512}?eUEGS9|wBzE%W&qS~TJs@nleoXF2e ztJ7wL=|y-6Q#Q|NBs$5Y*B*3;Y72ydRaAcF9sV=&XDZR3WhMGZ!7vs43&A4d#&Fpz z?+^@8>W6H7DVi2ult~1oj*g5-tLe@-uzb7k0C%L?gN}4O`$W&AC%7Ee8tTWp4y9G zg<97r^OIDXp7;YV^4H~0$7brQM^CmsbGRG7L;4(O>C+?_PInE_k&sF)DMCR4Qo0RL zgd$~Ki0<^G!-8EGSym64KLmO#bUE_5?AZ)_1^h`!^CLlqbwrT*N7{b1?4H-C|KH)H z{w_7cTi|rK4?h+BJ-RIaY<0slfNLSsNbZU6?@CPeuHz96-s1A-4k;FaX?RB87n|~o$g-<(sG468#Ks?l*&S36`BrdySBJmP~#z#x74=`I)_WbyrzMG$?%Eh(PTojWh zrhhuOV?jofPF(hzclg`$ME7m18rArf6nva;$Q#YAq zJW#E0z7+#>*>}H>_|w@qU6hP!xH`_{i*q{za2|$PNFS{rC?j5&E$zt=44SUEiPo0q zrXn&RZKOI^aoN{T?Z}@cQoTuTdx{4QRo9V5yqSqE191eMrrlafSYKMI{Qp_j|IG7V z;U1Vm?tdBr!$q)x(dFwbL&c&%gr1P#6QxNFH!100R)K^} z@JecRN$iECBoY{s!(V>o*GFgP&lgQ{@IotBhsW8*D+J&OQa4j^L0q9sv6lnir>R6% zRhF6_nP$FNPiFbNzxR*LpQqC9RO`7!U1THfOH^ez7&~JgbQdPUh~sC>w2T$WEPuvZ zI`YH_ZmPCB5ZFz4oWbgQdUeZZT-uvI7Yj93+nYq9GTqxyqXu;*bDQ~mh%8h8al8(o z++jHg7OtS5zKuvoowqAuqW=?c!R#`-;B2g4f!wHro1;hC(f2W;sq-eFS5-O@3Jn)#W>0 z>(9zx1U5oM^F%8fMJ{@H4hze*IIt+qIhb0vWp;Be0+tKKe;Y}n(<1j{t=L8Hb^vl$ zF6dT)yY>Ekd1AviS9e>_BUa5@gF7g6zik%^2?xuii_2GHa$NpGF@lq2xgt-XWvrM* z92S@w6}1c!c7h*kA4)y5Zu!y=)wri4{(qhW^xyf;i@eWy3*FoC?WC`C{%SEuw1LIK zR8hjILS0uXSG}Fj9P*FJ8wBk{RRiI^6{4)fI@E?1M*bC)mWo%~(E@|AvIJ@3ec@ela_ffIEa@fcaeMj*IIR zjm@+CpSE3}ze04Uy)rlIx}ZC`tjUUq+n~bhwX0h5m*KC9&`(Y4%?K(1?#Q}E{ zKV~bu=0B{N#mFV>7%?58=b&E;rVkK<+tAjk%v0RFBfmu0|6;3Zj}oOJE%G>$?>%r^ zez6!0c7VV*qXBxUTQc+vJeZV5P=6Tc>_HT>!D8RbwrDK{1`64O0|3KgH|HNDC@!{;a+Y*re0z( z6~ls(VX2IfnHCcBE7GdQauiWva@H%(_{#1)pVvqd*U`8LE-6l~Je@b>@rDi_onIzG?@oI>KU~UG*gf!iLI<{?^bPtCxZU)} zT44b8O80ViFFNU@;MSC9YRzUV`n86Mn~mVf_&*5Z|K`^ThKTE@IHKvIix?A1;x3V+ z8+NgKUrD(Vp&*3pMQ=;Ye~cBvepXrc2e|^8Fk=Z3^3$L;5W{Is1<#-xgbYwJan7%C z-Uj>s95>bCoa6o6{Vieuce`helLCG!ze*f8?YY8xakLc4P%XQ%{pd$R378bALk#Uk zJ+0U&FxVM$0lS4my@RXIU4(V_GK;Gr(YP&y%R);u6m+@vS6E};SWStn(VlO@!w1V+ z9)3zIdUVdNo4ms;v|tVlqJAM>g4y@ zjL?d!7C1Fiue9Q#E1d)RMm%A2mD&}SgN$2ti+U?&cA|z^z_NW9+bbYqS!hs@6&N12 zZ!a5#aKe|4cIF$feq*vps8KdTE-|nB6uczp(_VqU7XfqX!T2dEQc4WwD{P+kgntmgS z8P@74B!at(RH)l|`A8fht;v>dP5Hoz=^l{^V&W%aY)bHkPz=+I$ed=xZNg@5Jh#Ss z1oeMQ9cO83v3Iun_s)kCGyik*%{aXJD(x<{++{d>(Ke9|n6c(dEkT8mC1ufIt8N;( zd<+V7WYC11u=iKJ+`l=0jmX*2rB;hN%ES$=D3Cx{dSH(jU$jh!x`GxS)C7oDnH(-- zXDTAz6{DY(BRFl2{35_Sh{|H@^PWtP6lVe82GTpm8(;CoKOttmMHIEh%;T6PPGg2O zE}^fN#DFvH?!`Yw*cHN4HqC)%a@UGSpYNZRCsH?L$U^HWM{=xSY(t%;J8&+fR~V>p zUj)(#(gLP5fqo9BKMD5QJBix1AA5t0Pg(aC9+<1|A_Za|1O+&v_JmHw*kkq+AXnBU zqalERBENtrJAO+`>2~=I`Aw=`bZHCyAK}$eSirrY8Vqxah+)CRp7y@*N{OF?+Dd8q zF~p|h>rraSFsqqH6BR()+;=CI0O7y5KmQz&3yI)i!p|kT z&j~cspY7x2kdTZ_ppaGL>n|T^&l8M4p}igXu_pm=q&{m0qzK#p@OO*g(N_3W}KF*RaX>$;?Kyps4SXk<@ZQgv<;jN&z*gv=&>2v1O5LqC$+`-nfJK2&Mk&B_22wYM~}*1C-VB>3?UsnP@FmqC*aj6 z$wpy1?g>4~BWiI4FgK_o9iK_#Z=!G$eY)CZFF1`s2{(-739d4U3{9`pLvWaD+-R}xA2J?5)#3+@{~E-^EZNW z>#OZ?^6(=Fjgqgt><0g+yaDDu#>$%ELO)4JZ(JSwmID`if0;7Nx8ME@luPFcDnn{m|HU6{nH-Va)tNg`Ds5x%?k}_5}U{D6`v|Jg%r~~gAT-_(=MI77& z6)~~PI=n#|XMA-n`TuCA-$^~!`@NTTe+2Zu{-;&~__yXeaWbePPg>^?3TTcrGh9f~ zmuUKCC%c55&}!F~5rPIs(BVdcOs}}T7cJ2$w$c_xti4(7KJ)>J!Cjr6`*{v{4oNH^3m{LK0x*@~o|uulUNo zJi)c=0hC+qBH0^n_=GdGEN6m2djs%j&}?hpOMq;p zNZ`Ibau5|eN-)HQ9EvS61_}@&@w(oo9=o!JXXmK#jW&{GS2-m-iy?0_V%_d-2VY{@R`Ip03u|(vKnuh-M^v z!HeD0kwy|CAcLZ7@tS7V)jR3I{2p0Mb;gva-5T{DZ}>rw{``6@w3|$3Hv_^sEYSmc z`hZ>Hd#affCrjeAN>J7xX5vgNhXkb*FW8yiEsle|7A5=vEnR*qpZL^hDxVeG`JkOA zBjtoiN=DW9tF$sW2lVZceK*ZS3lIqnN&_^tAtsaH!V$1zAqp*k(t+q8D(NX_fXPcC zDApB_pop-+w|Jt-tf~;mv6Y`~-JRbB0-okLNeQ)ZlL{?~a^O~gycoX)XQbl!15Gul ze?d_0!m2ubSd*o5n*|hLtl;*3)U>pQ$ z#PKdeK-V98zrQ0tDC9C~@1BVa1|>4Cfbvw^mg&mi2%&7cvK=N7FkyNWfa`mqX~a5b z7be<9Sr|0ezlM&Dk@qvona5OQ(ab1Nn( za7G}qk{GyR;wnJu#7~S5&%kln_wGdRZ=Zhu|f_W)@)zZX)fqp-rV12G#gEq?*dd`vy{2Q~H8KL^Djn;&>McD3q(B(Xd?E zrp3DWIKi~iaU((1ZaHd|9zxa)m%AFe$OsTo-_i z;`OmE{-Vc$%Qq~F#JDJNG9%LNSS84hdbZJV6yurkbi`}`(kOgS#+3lsNP5ye4Sge% z9}>;kn9yko^^qs%ebIspvjrsrN{oA|)c@b-r1qxH@Lulz%FUnx?rHh*JM(vF96<9M zSk!Xxq0iU?5|*w!hQAmkC!B(~ssso}pb6zMfbXDiOhX?L_|e2mujJiNb_~f z=AtOC9AayrX+a)LENTBae`lA%4(l_%=~Xq(k6`}~IjJ`9&(4r{f%|dqP442SSO9bt zJP5a@DzykL&mJjplURgczh8HFFLfkwUFFZTnxNsnYsfrLe@5YGB~txR%Tpx&+{$TC ztVw5SyQIhAONj3flyb`ru9}n16pj)qU1xo^NGhrag^0B>AU>@z4B9h*9PH9e(W>f` zGKG|=XnRd-__Ic13=wxFuyy~$+Vc~~hyyC&+5(Zs>yypD3{P5)u}OKYnRTnGhg%Co z_f7&{6iJ0VJ7SLsxZA`cOxQL*-S5vSI502JGG=d03_m)l6JXm3%bL-j06x}|fv#+K zR>lV-LM<3Y@}8!L#Gg=@OGYoGmW`r7FB;T?&HbRR#`zQCe+Qk^t5U~$tDS>D0O)y& zxqsrv?=8#{X^<#j7kLj810EK1SX}?g0yjqtjG+H@9kWb z{sor8psqcIW93nGLHx{O@q{at1Z(2)(!a(Qn$gfY8fX#_L7)z(r8 zbj<;Ob)i}u8s8qrj&o>a)GLY^#4k|-hqgwvg)tTCE)B34i>GX3U?O=IZZpz7BW%5q zT392^294(dQxIi+bh&AuOPP;)+RUgL33u7|{pv!MK8F_O#$8U_bF5>H0E$658NCye zxyZGeYtli`W7!Ig%F#{asW8nYgPU^UkS!xE3Wi7v zb*LuxkJFI!w-!zi$H9EAU2-MA0{Lh#f z42K}ZD!+@$2o%sE6N$X!(ptg#58|&~8KCaM3QSeYkLn@VLgJEoT(R<3UxEN_Y-d z>+Qp6WT;A%UNUK7u1c@xGqe5k3$xY2PNXiw#bEtm&adLtWP41-07m+;M%8E^72Ybz zp-_-bMzBdY`_Bt@6;6{2w3`x<(jr1)k1xny_5CWpp>Qgg9Qc!VH5D!uHCDw?^N7|C z(m_U4K`LK@S_g3%6|u}HCq_2~D^tx#Dc~K@I2OE0^yA9~noN^$Y~>(2@W9w;rBz?e zgOY}+JM1}*BSci7cM#Q?g_Gs*{CX>^h5HgntdPYRZmiARmgcNSv8~G*92H|wHWc@4 z6;|hsQJbaafccB#z4Ho_eANeDw7WoH_ayUwq9jsO!PEF=B%H_V=hV2D!vA0BAPu!h7GV&zy>fNGO)v-(CI1=;5S&%a^%xm zb0*i!7Up8PCi8rjL=S`6m>Jq>I)fySWl6HtmVdK%$Kmd=dj6hJ$ud zR&w7TUy3K@o`9R6G+tps?Jb-kH=!1xxZanyN-MGlo4>9REe= zzv+X>$XtYeOa45PBw|8MGM+MUxM)I-tCEsdcCFu_kIdT#=Sru>i_SV8*t28LIe^{}lss)x@cVmJ0 zy!BOAPyMvlbfKw~c0_ju)%gekWKHFB!}&Fxg<9FW-I|Q@;x@7jla#7RNvv&#^)DAJ zUX(t_yz6S*y|Di=|1a%*$Gg=#-YMdnX@B{r78VF2`}2|9mu%-L#0>3utVuW%u*uCYpERTdEwMH=EH3rKsAi;L?Ofnkj*GO8ivg%|w* z%f6DDugV-yoS1u>P6rmpeLHp*E)c?7Vdc>%!h>Z)0ZQx&F@d|#t;va`N^qmE&KAxW z&PkN}2^R!0a;l=&sp0kk-zgAB7?F2-L1Fk(tIAcTR043AU=ofW%S>%;GBY4K_=Q@j zuR+Czz5nB%UYM_YuoonSI~?2SlEM!~{t~q&W>#87nT1Sr1dUVtQlkX{6ni6M!=7x7 z`x@x~txoFRRE_g_@0HG0?>Kk)bOgX~fhdN7UuWU3I4db&Y(7WXrHX20X!y`WeT9pK zvJwR?%arGOFDJ-H75T8^7`W*B34ql{VF@odB+j(uJ;!;grX} z%%daaRQYy4Km2jV)y$JTbhKtbATVg?-i#%Y`uw8{m#G<{OImL42(1baFDvOQ1ZnkT zKRTzsaEY93)+&g?88^ZOre_(1dQD3gs(4j4z3a>S3m1v>+iP7kN-rQ&2cHf{jaL{> zkbqJICgv1Hq85y>myl%k>DksHgf=viW{N=t{6s=$ zbTi1t5;HKRwo)e=ya6{shgz(zzR6!yFzCX)R&tJ_rZDxl7bdH~4l0%N+X2W+C3F)i z9qK_`mtb7i!9RlalSWq%VJC;!4UO;(PYpsAp)=0J)Nmq$i^7Pj-RnmRSArFqsx%xv z<%Ln>1|_IX(WE8^HP+5;vGh4Zm*ocNeY@g+02%dT!w^TMHK&kMO6E zBCJ3PfwhD;hkOP7OXzp#9W7zgj3IEo5P_D%Rnoy}V)N|pF=)u339$gs1X7rujrprSfu*ue7P$N zrG#JCTB(R41Da|~6a7aN*Yr_!A$^0YSITUR@YYs401=_dj3I*gth<8b7|afI&lml* z`o!C@lY6PV?S^#trX&|W2L2|Fc6-)T$*ewynZEl#rO5PISGc86Cw7tk;*^dkW;ZkI zup7UvuoU-D-i>9ENO6OB3sRm)0t!l`gj^tANYk2pL3SpSMy)dC2Y-s`fSrUfVhb~b zbq9mTgS!wK0bY+9Q<5!}4}kDNt`WCf8AAw6p~z$-1lo`qC99v+u)DBCG<2eTRFsL3 zz%$30p7ETv!eT7eT&1?9bR3Kl`ecNPRXRQC=oQt*IS-g8$(TOPFOyRs zKqQo};c1hA6!SmRGt9Xk{wIgjWtzA&bn!6kTB32(0bPHf9puz$a zB5neR2d9gl>R^KGKJ#-F>Vsr7HB5~@mMCQuPfLEJ4FL+BL})ZH{)uvs@>D@uN|9P$ ziWL-b1Y_F!GX(UPBqIz2>>a4XBVwHj_F}pVZmJd)1exnfQ-?upJc?o#V>=y0dNY>R zynAT>&v4$w{+|oH51{w&T@%^=f7SO;G;2gWjA|PyHW$YqQQ`rHl0-qF3?wAF4hFR8 zz>*&<0s0PPCJQ@sh>fJVIZg(n8I?^WcSPNTz%XXo(06e z*b8vd;8}nig|3-C7)P@!YVnJtU4`wXay6#9@=sc5hm|9wB|QYz?yH@I&sQwA3K^n@ zBM^0_Xb}4@Y0%yW(SD&&G#d2z0&yBaXAr>njkzxUpJOaj_&2aW|>)8yhLToPq!M!0iRw6ysC(2>aF5uJc&xzPfR%BU!tK(_yNZOqIu;DQw`3m zsXT+birewic2U^b{a^L3Ev&=NnyW|WTb=4STebyhal{rtN|0!%^8-#N{9nL!vKOC? z*_0fV!{c@DxDc|`o#BAHmj(={^GGuh|B)>g_*)NqF**x86?WOZb7VBR5diMS{Yyl5CBYGRh?Mp z=bP`+x+!C#y|x}vaMjFf{4uw{`Ck#2JZ1SNV+*q|;u zkRWUZ(E#-lxhW|#M^O+p!(M0)WD4|~${x%~x#7%hfM6L|Q7iE@M$Icj`HVi$3Li|j z?Lkc`KUtu;#Z4sr18{&?qI@F=ZXtffPico91dUD^3V-#_{(vJxIc~iPxyOlxa9yJ~ zGv%DkY5V4*p(0_y$2J`+ggZ9noBMCQ+ji0WZ zXGyy(Y*;j)`kCMXS)p=V<=FSXb9-T%$gxB+Bues6WEm;|LmEhHu|ip>V|=^?=kWMr zGjQ*{ZUd{_bZyAQgrbsuuy;=a>;pZg*AQTN~7FSuWJzu|rt zIDtQR3+`{-KYE^5HPxAwr@o!~LF%WeTm#|F@cPkQD_$SXb>j77 zxh}kZJO^yV>QCfu!|Nw=kd)P*%Hsg5|2zDE?@%nha39nzyZ^Y|Y^4H+?tN9&x{aXG; zyna2O#_NCP`HbJlcjNV&`9Zusksrb9xAJ_(Zx@cn>vsyr;`O_QXW;dFh12l*{lb}e z{jb8gc>O_P0bYMtxE!xPDsT@!E^rS|7V7c(lfoLj{QgWC;Yo2`h}~1UxdY4 z{fFX3c>V9<6?pxh;u5_6vA6=Se=4rV>z|A3@%oqI7EroV+>Tebh!dFQ6>$QyQbn-9 ztfPv1@H(T|hu5Qv!+4!pJb>4#5{&#=)g|m<)~wPAcs-_c3SN&boq^Yy6813bxDw7` z*72na@p?k(QoNp6x(ct)C?R${>!eZxUT2rq;q~Ma_i#!Hb#}8(EpZR0l|X5;=9G5f z^_eBy!mQIvz~Py7MhUktYi*Ru}c7G|A&Xf9sQIdnE& zpMB_jyv{p>?9i-p4_%4Z`G=O`^}Iv4g<0nxYQ*aWhj0tCE<6NEn6=>0jvDuP>Hl>O zf|pMA{>?kZy_=lyG=BM2g=;0)W$Ik8bgcS`uoFE{f^WkpTpTRDwV+P6V>{XBCJSTVB|52uE~nf|zJ7Uc9Zw75)BM zg&Xxsbh3(NH<4*lM{KgQ4fzwoN}KKV4BkX(xTke+orj< z#&f=k^2F<~PE%Di3#5LLRVN=vmZ#1 z2Seuq;79Tk8~|%uCgaF~u(KOl3u%dBteg5NC|FWt*HYt7C^Y8=N-}#DU3i>k^B6d| zj3wvs?(T)07+7$7;T8}|@X?ktKI~7Yq+(J)rvZ&0KZ4`C<`RE%fq>+V)zfINo)mI` z4?zfYW)k7m!Z{2yh=ee+i2X`7Md9A*zQdoQtEWG0)`*(oYWfUGVkr~+r8y3?3K7Lw3=j;(x=gCG8vhy746DWZYK&N zNsekv!&X+u;G%Aw;ng^u6e#xWNu)GMP^RJSDP%=%C8`IR&PsTwS030|=u8-b40n`c z6%vTyE*QVgrKImF-yWqGwYR%KsM-MZ7=IpTxP{BS38h7SByV)WFo?ep;Wkac;rZ`+ z7)>P|YLw{iEXzgd4R?Ll-wI8^}CirGN%M z0TzPPwcyHo_t&^X;QxD_)C1lpyzS1tsQ>#*9QQwk@7-GH1~D}z8^#!A&uMEr$MNAf zk!vqAk2DW^>tQ3 z5=D{M1s+vz4||+rCJ;3K!#vji9PRwlK{Uz)1aWJ;C!K?oXrF2E~)vUu{Fp!qOfdCl@^S>EMybH02ndYg_77}( z=9KU5E)2@e+Y8^KRNIz*xB>WZpu!=KpgY4*Feu_@>^$Nb&CLchp;Rh<_36!qvkWKbH;S&FuB5AXq{ z)=tbx;XuN`%6F_2P|f|9`??DRCvQw3s-jlrq;AZJTBjLTo&qzLya33m{><(S?3vyk zwYT$E`^Ogg)KWOz%HZLaLU>VEH*5#MV+@UO;h;o|DO4PZjz*b}iY6&qL^imcb?VR! z|8-{#fWL_UZ@**XR%yexU8QFLKoO&-lzT60%yNM z?Av|%Xt947^TI@&NA~2f^HP4Joq1xC0Ww`MK*;(*gM2JNovCVpwLMSoH)ZN4uGT^aKJ6C08_)dIY$V1I8FykyhtYQsMreDH>gdTwHhTkxA?y-Ah&pJBvSenjjDG)Eb zu{u$SbSM_t#K50dw`S2dhYNf0u}#&}fZ34@@;K7f6y&$9?A z7iVOQk>c#oBgaK};(4ED{eKnn|8K(lk53{0-|7C@eS!17SQ+r!YFc-lH9onqqAIXKAk-Og|4Jyov8|Rb$Nl#{|=!uE0pKg((Q(1ui zkN_Hqg{nP*YwmnbN6{74+mu9pN7fCI78HLIWKl{LhFSH&IY2#VEfPUK9?W%3=EOaP1G3&!{hJnTGpBqD z>_L?Iqn-zHm-YS{0#VYtrSba0?XucpE9r$F+$0pry*e!m{D0$*)&2+m_p5>bJLo#XwA8)`S~~Ph0nkhM<_T zlfj+jm2TAH_R->n6>19inUPY+3?=Bdtnp_TkH#aSuzJ3gq@!-1jm3&JWJ`{MXpR>Gy2+K`p`;5!!!PjMc`z2=@S@-jlbq6+x(j1@k(iPrc7xQ3fo9SGBy^Q zC4p&Ua1fU=jf950P{)Y&ezdn~yH%4rFIzkgm)cZ)jdeSbT7IJ3LwOfShfM?MVq!Ow zuvwFPjQ1ZH<$`!>f{=7XNriO|Vqdz8jdh&_b4{C?wl#lTF;qNONH@XCSvan=9>?`9 zS=X)bT*iVLrJF#4&*pUpLwCc(`@Uk0=$>gs8>}0gd@#^Ie_Y`oSDb|nVxsX$Rsx9C zKbds7KAJ=b)M&J^iV|XTAg25PZItTB(4*-*!$b$hQt=m>|6B7_zsC6;>VHR^)PC=S z&WPLLp<3)|`PyH62JWHBP$!lQyDTfx-;^$*=~TyC?)1{%nlcvM5Jt~Z-)K>~iUNiJ zXwQ$~fha4Ux7=?jo`ib`WbcL6dk>f9^}ss~GSj%<+mPl*-y!>7Acq9DFwJY1ra6Qg zx`-?;!;M6cqQRvH;$Li%!);&XQw3peCc_|TjW|086@d<1L0n>Qakkj^dY+cs3^&5p zCO*=cbxkwUolBf@afGPno> zScX-j5++d5kc5cI$oYqihBieL_+{v8L7Nv7tSQqqP@E&WA}vg7q3WnBY7U0OFxtid zg9;1g10}IF)XFwK^abduEhvC>?xnCuQiJ%^9e`Jd1GuTEsOEOpGcxG68OL4*SfIzt zVQtC+%?rDWr-~BTmgImVEuz>I?AUDRruC29SUg3{udA(6IC3$KP6c9Lv19acu6~by zaq(nOFA_|e!?93In9jfhJtv0d6i z|9__QJSWxS{oK1ARsCt__xSc{`x+`LkZLvw1%xY((D>7?bRUZ3Wb_|ehO#{!7zzj` zW55;ay)nGjsl!M}7DpM@uWnlfEYx8Ls{Tb!%RaD0*nk38mW09~#eiYB_09puKgrA#s9 zfzstdaDz$JwoUuzcNU4>-B_iyk09_keH-Piu92i?MP)a=&w;^mQxj-w_l_Nlq7)5M5o9dHSTHdS0dQoPZiHmT23Xo(r{XC>6aWO$dfaUYf;!gWOjHn;22a5{)q zq+eKhbMe_CtF*#2_Ut1<7h5L6rc1A$roEd!@;MOrDQaUWCF>GZ=lI@9?Ke zR)T>8{K79`|DVl0RGTrUagQ0U`5I6}LUz}|RuDz$o?8JQ2?2;s!&-$7)b7jL-ZoT( zA;$}Uagc?LO6PBUw8r@Z?0+;`?e`w{8r;vOUg++Q;Qk~1GP$5MB4jz@st9(VTP>>Xxx$f2%1_B4DphW#~H zjmr<+SiDGxOZf$ddBoP7S%)?E78ihJ>Z|SEaQO2~Dk~`utirKIVe!C8_~SPCY!`x# zQ5!Ig`nwj0-$8iVl}Nb=j<-WTW|3-X)%gb$(rlyRmE&^ZO$mf(8Q!4jr{C}|DPEvl zrODL8Kjk&7m5_Z%iM_%Dm`-mg=@1KqYir+q1u!f$itG=CIPmUJX9Fx74B#CX@+YAJ zd~{d3*Mw1i{8;WAdi4%EaVXv(6ASKn2;&R=IBQ>|MwavHROHE>vq58u6AB? zq#1pRpXbjjUZG}GLlSEv%49=;ryqejL6p?0lid&*j0g0hHj>UMt^-%J3v`8oPG(`t zk%I)HWbMXJ_$L)F2gxCjqnL%UBp0Et)^UzV0FMiI1!d-hrX{_h%#>qBu&Z)k2N2=< zd)tRlCeOf*W*Y!sdK>a?ZR%XFUG^A)%>?rXK1EHE^NXb^7;5A<_Peu^kjWO1F^C;f zwm;J`gp`}vBP)qu=wMhG`{?B9XH!%$49wY?*Dqp*c#5--O(t)SgLfm~t(g!_d zY6n3;q-|853n|bWN{NHT1H~m`VD7h4M%3Yl>3=4|(f~5+(IiV{6d8GFOdVB;zjpNe zoyA3>tyQwcJ!v>)#`aW##se#(*zZAV^W^PRoQ;rWuIzi!urjYqzHF1wBKQ@q|DseowEp^Vr?R ztHj1i6i*DdgEj%Zk(K{sdIII@iUv9{m;?vadHvOXeep__uWEByPB>1!nu>Cm1}Hx3 zN<*&WER9^%SbpUhNhPF6eyNU3*o6Q=hMd)ie!k)V?JulByASbyQ};OMc#pWdJzx_| z`0}qU*5NrZl}pPtEYBIqn%jF&;0fMbAP{cwiV?>YtUqJ7x1+ujRRD<6L8A@s&A=%i zfqza7hsF!B#h|R)vjZrpz(1sfUb|88GxYc%H-pv<{(4zYvL^$g0Dnz@w{l#}fW5DM z^<4L-&K^G6W~&^C3~(nxT3q|lHT#RpMda+YE)~U#2n*};mZLZl+A$!o1HDUX8@pRk zJcb+{exobf2JTds|i)~mpSMI{k} zD^fOZ#w{R?Kq7~2r#JSSkNew-4Py6?+U@=*?__-686(~05Y0F`qDW(L6fJHrxXD?9 zqSTy&5@w3IyO)KlG|^QM65N&|bb|S=`Dw;mA&yZ!RDrCw_UErp7gxz)CW;@1n(u@~ z_b?t_?e%iUVq61Ixm$VNsdu&(39_6J-!)vg#=0vr>(-t04*!^969fXvdF=K{eN6L+ zh{4L(T%|}P3kXYS$tWwAC4wPhH-pPm|7_ifZ{Jm1Bd2YTRD>&I%W0R37T5meyZeic zINru&J#AlPS2nGU8{%S976dGunI>(IRF0^Jk zQG`a`VNA&cLO}&*ztUe*+yK^u(>f!`LQ$tNp$7YK>f(mARaU5kBg!&W}TUXT z@-!ub6^`Vk(Be`=sbMn*(eoih?aCv1*R}b0>TZf6yFV6X+qcjJ5G4aS$LL13jdSQg zC5U_gRsyLlR&p`je_L_8C;?r}LM2CFJ!n3qfRVX9#TG2xY(gNGrQ--RHgXo=_O0uD zpMO?yoAU6|BtkywX_J=6XpfJ`5KMFe7P@J~Dd*~>dRlIwd@Ai5{r2KDB3ef`Oi{ER zStTTOsZvKwrte6DkXF=AH~+uxy8o_mKact!)c;?P`rj8jKlCm`7XT1ipYpHHBGDV0 zsuEcgkuk+hI?izrlQT6|EIFr)l)5W{zvI!aB2g9_tC9tUBl2^b;Cf3=I5UjW3Na6) zpB9=AB9|tvPn7GD&LVFMuLs%kBiY_f&y-Z%MY<4tz&RK zw3K_@KYapMCZK0}qH!+GRF4x1{vD5ATfAPL@6sthpKz|25dcd^C|AKT*1h3vHy5uJ zt6L)vaZeC#b&K&&|B7N4s*;I(j1!c*!QStCPqw&2NFh;MxvMNWj4LV#e9 z4Sz5;AOGRL;w{3Ny8AfxiL#4ZOjBh5(1=~VLjVlX!AX^|6A<~w z-s(TQNS_431?#ZXC2s)Lg#TpWA46-|v=Gt1N`n`HWj1Vc$3L3~$^f0q+| z6R@?rWok0U!AeDqKI^ydysg+F>c!3<;W592l|+gqjlc%F@Z@IKAG;>C!?}wTST%Z# zl{@0j2r40qnqe8?Nm^^ojPydu0YwK%VFn}djTp9=rWRr!`prdRx0bhIA+e`$C&?>S z#~uSHTYNS~@#RX_&-f0Y1lm;UTxdPl@Jro{1Rm968^Z3e6vSu7NoszR%Z0bwn4$#f zLf5EJ2aepR)hB<0gFQp;+n;R9_|?UB^?#HWESC@^tD`X}7*z`@wMZkq{W3`z4@2CM zib0C&e(h@h?|V*aA7*bXaX;#O58L^_^X1=I+=H`5?Sj^T;mP7;YNTPjHCb{M<}9jz z$cPA_qq7~2`GMw^vmZcnD5#im=XL}OHTVorAlUL+ddR*Onyv(c!CwqW01y@c@(ZFd zDzIT@)~!GPZMPK_E%H_?^+#E=vCVTD8-Y)S7T9r+VCzq9@GmN6v2VL-FVa)HeAu=46?A?y6H=j9Wu+`J=ER~vw@YSL=sY!aMH(ouh@y*plsT; z?k4i^HnUnLYIu2N;}5B=OpBVs_UhKx+*RYf75e`Y$GIf+eD7lS-(5@=iTmE+d72Swv@1^REm(+JP!5{gi=Y9DtWcQ;^On~Fj#_jqGSdWT#I@Mbq$0(| zYSmOki{@+zlL_pDCCi!Oz+{E`V5KqkgxnKql;E3BQ8d75|RzY-HWNN zALvTMo@Z?rG?)}%1cfT=pR*H0`7P3&UD8E(7jXfcbZb`7gK+v3+&p>>tE^x9H7xvH z5JZ{cPEoQ$y8rF+j;>bN6$bIeCH2;6AlbY?l+5M&4ji#6<;`o2s?{yT1 zzLYOg}hXN#MMMzi*UQ{As`Z@KYs329J7)pmU z8N56EQo0N8a~2}rCy2(Rs~q}iSFvBtZAX%e47V~+qpYR8Sdk!%RLoMTO(|zYol4W8 zXZX8{w~7iF)i_}sJ4UL2tt{=Jc4iDkEjT)76!aAtAa=l_Di#yi89XpHBDyOef_j-6 z2L_=Uet`8+_cy8xdTb^@QgsKK7`VH}y#(?9E1cA@_k{CiOaQ;aeT~aukTG99#r?v< zi3-cZsi?k9q7sN8F)jhrW+{-A!|6(cl|efi7lDv^=ojdh7*WDalJRHj&CKIl)l46VnSq>tZF%sejkVT~5N6GO0SKm-1?qg%M z8d`Bg7-ie9=^8?)36Iqc8*jQXsyuhFC$y7f8D1Lki3n0yV|!0B*TexT?aW5&IzKd64-;l z%c6@E0a?=()P*6m0NG;2KFSnm(J}Texp(BCxW!%Bb~FM8P=$K<4=(nPF78!=u1+F} z!*zZHungc55b&3R5v@lSO~n{#rl&KF${RSRSz0%^n3tcR{{Od~)XQK2ycYPM-;QDY zr}!;*<}5Y5#{&zGgN7rOMk>b%hJk-+$rCxAz?4t=nbc79;&9!J&GR&I&4|gh!kfry zc{pU5)?v#V>F!pk{4;edpd9KQ{NVz{oCSf=T~*Tf-2R(()QpyJpvEm zx4v|H@eZt8UwyzTtit6+J(M~{6(T)MMpDO9I7y5;a0Y=|3YjI!eB4Cf^^d)Lcadnu z&DD0}Bkumon8tm*0&j-!3iA+@NeHeRa{J7?Yf$(%)42fszp0ttE8L$u7XSh1XJd^1 zB%!{mvf#*cX{KoXL~;J`gK3gz2?5b2RHTbE+Hf_dvg+tK`;CW-#B%bjJ3W9}8+gbn zmC*z^RH~Nk>qlduIL12cPp6mP0RR!Co{0Dg?$$?Y_?17SRHdSR=F~;~W?WktL`ymv z#~MlS)`)bH&}3}Sw6fhJ(1)~bbt6mL{Q0G$RT`@675Ds+{1jW`W1m4G@m!LbadjJJKjhCWrPMSz(JErXjoFDqNARQ=xr6_d( zc$*e3`?plaZkVy0`hTYLVJ9`{ebXEAPITXo`F|fCMPZLgh0DW1nr&<_eDJ2I-@BFNPYUvo|u}i1OWA=u}O4|lQBczr| zLK+irL0gfH8yM8&;D#-y_*JD@Pzfjs*2ur*kmDpyi)xw-e{G9aK!)Ed#I(Dpn1}t5E^9!W@q>&ch8jwd~mQ zPl+e34-d-5!yjFm4a!CuOQRuiOGQb&mR@PXM#m^DF+!;0zg_}}AQ+{l4D<*eTn+cy z?E$3TDl@X9*f$^woF^sP&;UriixIyX7Xt8NDL9(&B)F3O{od$ zKv-x&kYcOMh>VkvullrqPU#uS{_Ct;OQvEWmeV7_d4M=@`7&b{F<+*TEaADZIYt{^ z_KN40P83VWjzba2G4<#}MvZ8HH@r{OMljceNmS{65Gmm1Mws1#qltW|nLt<3?788t z5sm-9*+~s}zxVDyJN%p7%~Rw5r|_@*b4vtNL}8v@CYFjL`tbYQ!LbX7HU{^`nqiuT zK~))i_>5qLtkB7I3`tkUtU-}*)We2Rf*4ese(MDPP*0EpVJ=N!D8~=eY&A~FSFRf_%}HoMgYIsu`go*GDJ+m~n)JRTGk5mNjO!jK#k z3Z5m#&g2VG5(i+-4{#=?n(`Y@eHY?_x+{B7o|JU%#{_wFmtFZcxAXa&NBtA$Kik z>3{K;Kf83clI2-R^jK8lD!f34Rvqq@^K=-rEklP9)rDdf&bYMQtkbs)jw*<4`Dc1d z=ZYa`4_QUZkFXRq@chU#P%X$CXxXpa+{T{o-BMEg-A1d#3J*TCn1*8X`7&cgAsU#n zy2OoF50(hSTc4nnDSV0bVs-+UkUdj0O~zWLA}ek-Zh6w*R>Eiz)Jcrmy*tRAaMg^* zQwIVM#U1T)9)SfwmR!E{rAzSGXFq{aK4RIi4=d7x?ljGm&NMrK zqMXecw2Xo8?!BqIbfNIwbyhBjeBxO(=Z-4)2b!onA@ZiZ-q6xPP zc8nV~PH&7JkJ#OU^nxQ1<8s`@aT&-2C}Zf6&>7{GL%U%fX`v9Jdc8dp|FYZ?GmJF{ zhT2ekfF`JZbOmR-U|p@KU1jtX&PI{sDcq&K!C(RyxQ31Wudi`_i1=S8T1Qj&cq>zL z+{X|QJn~;7r3DZULG>m+|M00|73*ao7JAq{Psconc8DH>zl=BG!%L&|7}EE~_gt8o z&A!3YpRt zRuKnB5}6}vSMq7a%>v;vzo|cli2!c@)|390(nYGP=UR_9QaAzF5E1H3pVTM?GDa>` z)8vYJ$cbxxLmW5=7dHY{yBsqSX|WVD(BR;R(Iy|qG#CQ|oDH+WfaHlu+(;-0HG4i; zi*uXd^pq}^qfAuf7Ji!(%28N4(vF8j$Ks^??8Yy=aGrfz(Hzt;ae-$~sB?4R#A&v#G2(?88$@P`bLs+&Z|)yKd;O=2L44YWap z!3EL+%5Y3Pq37mv-{-F@T}30UdeokpjWW`(2{c@_D%>&;9a<~`PDTqu4hPaNT|2M` z&Pm5m7a+}1)C%nf#+=m4;MFxRdWOHLbOj!!xq8&@Xj)EH987QzCkoZ>&R{(<6qsur z%2ZLyJFsg>g|bFz(*z_!^gaM+2!8`iqfDl+957^E8gmRdu>pdXju1mxylg3`z^?}_ z&Um6Z&-O1UT@G^yk>G2RkV-gTO06wI5Q9VL&S1+BJB9jtd+`b{D*%`^-KMxc!FMA_ zAIewo2neAuT!FE!7_bZF-<27W=i*HdAi^XymNV;`s}K2SmWaTPXqbkTz*lj4FOsPb z7o~|iv3DUse*f;Rn*ZPLq+XXg&U?Lgru$B3zgz#b2mpUoiMYZDiXBLDmoeNnX5^sc z3J*V4?NBiW%$StaZs;x1evfdQQv5y{M1*h~E0d*y1VzdChX&!HfK_0$&)QvDCO)#= z0f{hn5pw_o3-M&&> z2&^EKEDnU8@2Vg8$CMT+Ngki%fx)n$H6;^a6uL4HEyk`1a3Nu;0x^;_rC}ym=6rC8 zJn88#KmL}|)#BW)kj=zBeWY_+#*8jE04g-FKJnr|)VNDv|DS<&W$!iK74DZ(oer_0 z<;$N}TCU=&KH+JEhhla}Ce9^rBrTwJ_p%P8z#GO+(iLS%-w2DU|MVY-QJz$)4gt2GJ z3l#_u{)_?Z$$j?d)b-ATRIXM2>DKFsQ?3yS@Ct=VpO+_tqDDC*>KP8jBXF!Vdc*0{ zU47s+=~6w8qA?lnU?}l6fGP(wY*UmRBy4gHPl2}65~1dI%xN#J6tc9J??h^})d8}; zG^dNcN8b-E(?Hn0>IQ#lX@yuXe)qHvcq3%0(T15GObS$4OJf7}Or~vDPj6Rmr<87k zPx)rI3Vr+wObXyKU}jTFz2Py0XeHwfRmX}#uhE-|BBKYWz?P4=Z~Z8&FoRv20=<(O5VYA+aBE#JPL?A6a2wUE#zn5H^)FgE%Mr402FnxE!3-gGNFG>jhjKRp_vYa1K0IGyF~4O zANb$iAH2WwE_8hNZg5z!SM-8>;4i)0MvO(yPOL>m*I@gek15{FgvxC}z1 zM&qq0RqJ)2Z?zq5C+OxOEr}(l1p%8Dy`-x|0N?uRsal?EY0a2{jNFKJWx`R$Js|{z zccIMtw0dw;%foOL4V16iT5;MT+|=D639LP1`e9g8YyA^#IgqntWP84*Cv}87t(?LS84e$@``W`^Aof9}&hhqx3 z(eX@sLrf}-8Q@W8)@?fV%>AYHaIvO||1Cm*EC7;b&LlG^J!fjUq85eX5|Rf#C9q{s zPfPiO)sKH^jaPvEzsPakklOAn@;cpbB#ZxNO53pO<|@^A7N(68`s#*3C+!AIF;3Fx zB;8;3F_ivYqu11sL_9>w>891qZLPy?3ZpJT|x+U#kj%!xXz6witOK{Ts0CAP-A)uo+w-*Q%vZwRz{-bdqw}tDE<>*XrDn$HHcrY; zjcBn5h<1Kys~SZ1;*7Xu4tK_h8X@7OaCB1?C{g+W^Fw;v?h_-G2AIFozgKqv6pYo3_T?>{4?32AHAd)y%joIPl89tRj zWi&Oly#cigL^Q<@7>OMd`*z}___Lf@Z zWCyH@DBM@y!FUhV@8Q%KgOdMra$6~#kdh-A#1=N&lshnbbmghsLZk$;FP(C_VNF20u zQlv^HP=E`kJo)6(Z0RPU6T71oMJKUs+QJ~Z*4MvKMZR7r%o5Ge+^py_49IgOWJ=9wl+&ERIRy zkj)B?;wXw^%bR4&yFD6>q_HK9tdV3Zc4Drag?-~1DP=7w`&I&kQc7uo0Hu^4 zQ1C1=X`%o3J?FbKBk69E>;TX6*8>w-8qNKdvoG&ySaa`d-SiQnqXKSC1wNJ%rb_&! zUqDP9Iv@+g+;rzsW9EY@lQJ9yS?J)t5hI{MYo4#Yn2V${#2f|fo_R<5o zW^wvR3NoN2Mjj_jhBuY-9SGZE(-gQl$$aQ@p0S(y|3nPBN%SY4Vehc#;M?Q(g)B%P zcpDl2%Y+v3q?w$t%+&$kauR)qXL5-R)y?#|R+MxOb2K$KEb2quWd42#?fjxJ;Ml9s z+54>xM|#C3i0-HN_uPG(>DTn%e)#Gm3P1c%tgh%l{tFzPOt29+<=Aqvs^?sOFqqs2 z`w|I5u(TAv(?$|4lpbV7soKQT{4>*p2sJEyI9{2qxCi8@a$Zsbh)A&WjzVJdWLNnl zNsBXF4s2g?t{MN0cp2M%WfbbvC^u5bh>t`-D)(kbQAIBO8=`ymk!paL0x^K7c?xu+ zRM36u&Lg|U`@A&{aR#a0sR?(j9*4}|`GkA&k&M`8F%XEu_vobSZ2D3N6v5uj$}nsjA>ofOf?10UfKm1o$=ZXnPWsKUb}rDU{KSArbHwnfd4Oz z4vb=oDDq(RCiR{21H3S&!gk`*CSn6X)S~?p&OY}QonHY_9DZ`}NWbugCQ)a+W162+ z21Ky&m3aZeT_Y=*<;W#G)ZJW%fq!EEw>qD(7CI-`7g~?{@IO+eBUoHZje5-yiwhH7 zG4myp6D4b&cwhF&s4z_`lJ5MOX0=um0nDR3!VB4wUKCw{(uSU zglLrIhezD*F@OGyx>rEG-+vNr#PF=$2o`uoS(B9!n~40BjTVG6OaKoCkmgC(eEu8m zRY!)fC?tY5L{h51@@Zn51q=4ne-WJ`*432CG@?PUC`}7UDBIsC|CQWhJ6 z)=7a%;vYf%--+P=`$2w*HzaO$KH=PAAMoM-x!N@h8}Rh1G%MnU8YfzN@!)|Y#4m2C(VEYQ1%xW3X=8Y-t$Tm+$U)h@+CULc z_h<6eexoZ1Dwb33&n1Wf+ z4=f_g0tK&iqV-M8GA#y>oR}dzaiZh!$t5SxajNq9Uj<;0C`x%?c6yjkLBtmsDzMR$fB^1Sl& z2?1>TC4fWMpIn9$&>AT<4V9S>f5E*x{|sC|N)MvTmI9Y>&oI4J z7O~4%NnHD6Twf}%0GT-7fd{Ic1-Ab*xpcdT;2FzQ}jfstVntXc(mWvi@? zM2^@5&gh4s#D|I5bf1zx|H>!utHQsnS4UT4Lp{NTNr{AqY>qnR-k!EZs71shEBQex~#Ut>Myq+&W-FBKS$ z5JddwXq|l)^8aU9)_W5D&MWM{;kT9r(!Nm5@C)Pcy#E?z-*@RD*v@TOch>)8^5=@p z&=O}wfv%d@WJ(*b(tFC5_sR|Y{*gqD^)j+{jjQ_)Bdz1Td54>Kd-5_*y4F-hg)JzI zvuA%NJ&ZQ1_77|gBz33IvP^G)tW43_g9;phr&jsP+CYRl@Ea&5#{W!P-n!HNelUN& zSZo^E3)`u`#Www!KkIA&U|K9lf+L8F8yKi2dkct~>WTZd3kJ zu?WVZiO64UAoBxg0~wZOY7Nmf)(;a9^)x_q1+W}^xnws$oP@DDvdJM$G61qv;piFN z+C!yD+YnYN)6hl}pu~)E5ppAEQBmEpOb50R9B07R%3u?So9mu(FU((pjlg`3u22Xx zU*Vrk!3yusR+kma0{Z-BWgE{V0{ik zlzpSP=$_GmYzp5?HIul4fEyMZA}>dX7?aMPPHF$Nbed4aGV(`~$f5B71x=a49 z&VCH`{~cE1t%+6E*PU-W&DI_Ew)p(-&dpz`JQ@qk+&@%16@P<4G8tQtf~=CJKp@N` z7RoqvAC!ga7KBq!(I=+Ny6w+#>++XlDd^~o6*~;1TLg{~lVe#g>Z?Z8`DQs9k*ft~ zaiY^A7CA$|0K0{MFw~>aKU!lt_N`mwbLvQrKwIsiNUZlKb-t#2lT;4J3dm^<_xOzE^zNi1W0b^icRo{4Xo%0al zf6oOOB_2#%>@2k3W?vJZ`;Xl_5z4w6%!?Y7SQ`zp?-{K#;0vngCWo3?1UqSBH$uUj zdV@%ggs(g&sr;8JU-mQ%<)0~bX|$i~f4wtta@W1%t*)IX!X{Lm9m!fja-E8`PM#+emlcLV;O)52)t?02#fW zLTskN^$n=pgKQpxF(weAdXGeHS2g$WckzV3B6UUI-9*aj$SZEGt_+_teeMfg9C+~I z?~dlL5zkf^7x9pZ>+2st)k}IY^k8(bu#Y_uGzoznsa@;qa);~eFM|K?vaAm!ZnExj z-sxOrZ^jCy^|d>HgRFmz&?o*h?2v-iAKJ165GLiqkAKcxkiSk14(+Xuc$~k|JEm?h zSp@+qrWupHUAoS94rTJs66GIVI~a5#YYA3^Y@HXf#nr*!5z~h$Ojv|U-A`n22A!nt zXq^}Ith>=t*QvOhD8Waq>tJDukTiQL46JBwTH!lh@*}yYPpBnOP@NjTbti&0_L?_7` zBmXxjW5p5KO|n=)!sXO@s4tZ3Twn8WE`OUyo$ff>@rC~jl{zM;K9rT|TAJ)!@4O3D z8wNI0;~t=%FpdbaQV=kJU*}B)nqd^?KYt8^>1H9P;n~WHz8az=9h`-plgYEdXR9K;*?i4eXU=3vwKGVc1Us*-Cq-Vk^b(PgkCiZOlF^M_|@>> za6gA0N;|vLu>PFSAc@_e>smU)bwMh!Z8h1!2sJ67H{IE-g)idgl+8oUR`;V>QUJ~+ zsEUz<0DYtUnp*#e^_{Yi`u_y$Z>+>U&ikytK{Mc==hxW6{9PhW5680l19de@HIdhk zS(gd#m{Q-o8_lMR>Kpr#g!}<07fU)jA&HSaIA%h5_7Z*l)+gQee3MYz*!7VV=P!2F zr-4HzrUvLn>z@RwrjscVh|&~x45g@%gRb86eyKOp`bvdq#t~s8=`g1EA;-|cT%Z?r zz%*ZG`8n}Gk#MSk#C-Lu2a2=4#&jK3{OrYH z{bHrv2AWp}{i&$G_fq%9{GA|B#IKUFv>8gdJ14-2PC@cw45w1CiV~kxnw^w1abZI; zpRLI(PX0CgkCq`;SmHvZGae@|^#-E<*WY#Jd?#_DTqm^OL_P|al6fWgbU+*evpsZ&gyG=N;)@6T%Z04F~6xuT=c!* zMWgA35gr->yOQ7vSo;F?#oI{2e88P*ZX={wom&E| zqm-^gbid>ETl4qAa%ryB+X&O>f#Pt37C)!Eun>SxSx<5oQq(tFh+rOrvuC zP-$bA5C&SnzjC1|cQ{~=D z%on29Dm~*GY609UbK5`=NJ1Kk4JL)?)F=QZOtJ+KLK_Hx01@aeGxd{K?9LN*xTUsb zRtm1V3Wan@2li>*o{($NQ@<-!2!V!SRSA z3e;Y$Q;PW@!cDyNTGVJrJtm?PV@6ykEIEQKp#=%j-uMS}aVQMM9v~~4#(YiQlw~9>4zJ=J z@;ILw$gdZ+h=q9)NT-`&1Bqym4tRmQVj-p}wn8qW2LoP||9{h|{GYQDZ*xW+$9^Rc zz;ef#``uIW+d=WD(>Zf?@;M_ov=nZT%VL*#z9`Qe7YA{;R4#(uZt{)_LIUFEU7DFu(#3Jjf36o&w*$cG4Sqi4EHBxxC|+RWKc=LXt=g4w;73GXAR!SUK6p&TJPPk zC%;t~OZzRtw5I=B8V3*)N^;aJ)fDC!c?40VD>^iJ*xGpWP<{)Z)>Io^ZX4ur`Gr71 z`y8^lh;wQ2*i3&HOlr8Rnlos<>BOxa<+)s=Eb-)<~qD8e{_dW9eiPm8&k+lvxpS6omBl?FYX569tPLT&=v+FURAk$?G zu$=J(PzC3}5n`)!8_CYamhB|1AN?VvZ9wKW(gTAe=D7yFLlMr_pa(YUnn-RqHXq@pn zbo3;clK>JbG#cv%U?@{%;;f}o!C;5$JDI1-LFTbqCkqkb)%~IntBl43agAN{c2$1M zs3RpBkJ$5JT3_}b?$vq19iu!-jma=^8MK#aW|LI3LFHgU<%F6*6xQqbovD+4RkS~R zGHO(JV6})~YK>~xY8yl5+)l4z7N-V@#DnX{Scyv9vUT^bRsa9aN<5S}*Lj6=gY~=P zivQ>F{GaZ>$PRalk#%5J#)m{1ajwV%FnFWmt8v6I{XiIU*eudPP+$_eD_H+y^W9tW zJ!)^{A{o%%Llg{D!eNUM=|T2aYK11E9f181?-JD0&QUDUShTb|NEX_B50rvV7`XHn z)h6+p_@zN#o9pyCEFL?^})Ix&?~-+5jp-w85_*@Wls;Dp&>UJ(w+;dQ6) z&lBvou{JtS?7v^gVpGQHjXRN!f7u~@KLp!x%Y8(EKmZvU&xCnfUz@437eN0D{@2SA zu>YNxJdLdBUY5_O?>me7$~C|>=>W_@3Tn`ce<&A%xW)5DxudY6*RWlApU6as_L7bI zv;Egf=Do0G1SLJ)b0H{h*2Purl0=+;* z0HIqkiUC463dJW?RWP}#9+mAF;=?&;5N13xnCxBf67h%B=V&?UU~w?AVUTw^o>d46 zg02l(Wew6}-Rvvr09HP_{Id8d3JR5#{_|a+sB5V7YN8o>Am0bB^Nt#S7`FFWpEj5e zr+reM7|rF?&ElZ}Rg_hd2CRo#5n3^raxU<#LV{|~U^zekL~ouT#Le-Ve*AJ*Q5dS}9SwFE3C2n;-jv1gocp4?Zu6!1|ZK~1Yh=`*PGJ`>al?mXv z-pqis)C>2vop8_{&iAW(5i2tbrR5(EZlxk;P|>rc2Xzkg3xo*=_bF;WRZidr2<&&ll?r0Jj#-vHdnk%pXxwuO)E%@5*1 z&9!>IVH_JsulHzv-B_tn1I5}dxaxuYUfJCJktRaW=I+E*pw;@VYVkg&52 zdQ2d9@beGWS?@;w-z`?6H!}UI3^A=0Kw(D_rWkM>P=+8hSh^lCGm=(Bv0=0>34fB9q~+&CY;87= zVt+0!BYsED}ID++}g_CV77jMcB3tvYUPX!$(tsxc*fyVe`6Y^|Z z`ZJ(v7+~PbB87&(*B2%K>55K7rSE{Z-^E^91}k9WdIOX7jIVt`o&9<6f4ybB)2dIr z*?EDpIB`8@fR(@Cj1lRyrDmTjc^2HT8Y6K)>{^ec^LLHAEIDwTnTckx`FRkU74KI1 zd$7m7Gk-uFg)!}ci&%y~Iq+VLf+_d*@km(wp~16Wn9IGDlsyXY*;}o@8<;xL55y#x z!%)$ZUF*hK12%xwJ5b^>@pS&G6W zL)lfjx3i3vK+A1mJum~4a>X#ot1uZ&e|+0ZP6VaRr#W8U@t%Su5?4<DsCsN7bZI4>HZ17h6)MU zY%DuHaI=lQl_GA$JNE+#LyWpA%!H0K;&h56-S*)Rk8LkFB3vHS6idV@`%C7#5m;qz z0je9~EbFBZ7^#MqPbJ}T^Orj9QJ`@&JZKcZL6m^l7|G;7ixp+)32xjU^2_^B|5+X7 zK&`iCLDlo7UIiWmdIK4V#N4^0Ouz6XtEmB(U-7M6@GL6d%&d82x&TMQopX~As3RHV zLg5xEjeYQZ_oTv!U~GiwqvIJta$_2!aLdWw4jri_<~=~yu^gDZpZY59cQ2Py6f_2P&7`;#dBUsNx02)S2eGZ=z$&ncV$0xLf-g1~}=|FoVdG=MA&uUU<( zA^r=?R;8r6 zg_CfjDDOEjQU~I6{r&qjgPj<6kHWm^bq5$sdQjF=PdK+(V-;Izre^X=Z=eBU_(QNv zMme-hl8xXm^lp1G2*&A>m|N40`Uj=$qvJgVA_q6uMi)B7>G06Hz?rf_@P3LEMo7htyCN;^&?GH5#|WdprTF^XcPJ#Ah_ih z%1A%B-d$3dqcoVBISmG!Jr|;7tx{zK4$dvB_gV$;OHn22JCHqEb=ZWf=dwZ=N#!*31b5eIMM8&D9i=vZD zF+Z{lvP?#;ZfDUjmfnle|C&YHu<%pvHHA}@T%xlIfvmbZgjjj&L&**TKBAMQ+Vv|t zT0O@|66W3@=hss9yr5&rhklw#Ux#oIQV^RRnj zp-z{eJ;u{t!c^xOX9WMhI|~T6N}Yip`dB9dxq1|}Z*}i2D75d`{76O*G*Y7*7{X@E zmYE!yy)sk0n)GOPdYymRWgmNkDAH&SKx~;gqZ<-mt+U?`{oi6)|7Nu$-sHSEaieqE zjCmY}-f3bPVk&l_K(gqlL4eO1)>y z=*;3gMjKwRc{BAMH`eh}H&Hl4rE@Gp&KJPIb9QIe6z?=_*zieg`eGhIK#4Lp z?a`Rg2~}4p;JOX20^@Xp!@XuM?S{?Ub`}Ug>@8$QPYN!!z=_{8TxVYlGwxz+II+Wd zMZ&WG#U8R=gD2_NaN%rOfEI`1XJItwFZu5*qt>ua4f$v|iKYXOJ4aRpJcKAMyV!Mx z=Z5|Zpr$WWX@63rkoA9TbdP5{5OiSd529O0TRT`v2ltf$R2BBGd%yE5YXf~9%}<7H zK2S+dGC*K0BnubdP`wY0IMiu;E=N76qwN==K2=60%nNAO0Hc=sSuw2Y2tkj+qyGzeH#UHbDru(5D1e3-`C>mzU8UxBE^ z#^+w{q|g?nQ-j^cM7q z5ufjW3$h=UYU%0Xn3ozrSDJ0~%vejQ8c9x7y0gJsyp+(+)(yGS>Jse#1zf~;t*z(* zdYd!PejiqOEWY*?E*3J6)&CVp=AmUXMs8N&(Lks@`dqiIpuoXn8cD`(!dTb;*c%~- z;b6;rSVZKcoK;jg%TlGSU{W>zB;chS=SmvZ(2xQOXmBH(^rY3vTKrE2@Q_;V=7 z1S0-ZsV`7+dfO9Q3YQ6IRLHlxBXb9~wiqZ?Wh6Lm)nEO$5&aPV+t(wr1GF }e#L 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 vqIeFta3S0~m1Crn8sF%5nj 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 a+O#LfX#Y_F_~X|fSKyB;@c+XV`2PTJ^-iJy literal 3587072 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

40c*S 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%0Dd18>65 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�Hrh9_c5gQJX#`R*RDMsLTgUdGMbeBXYD4u_HjFI+3@&5nKtoEhq4_9xh z{Dtf{FW~V1cKuHp2fJ6eRZO7dM9db9-cn$r^ea?Mv=>|hS{ zrg{$NVi8{I5_GuI=>RpxWAm}gcK32KF^`Ns8^81eb-I6R->aztI0{Ec^Zp z?EMH>|F`n(+v01dt3CqL;|WV1pShmbo5O!Pjw)|2&ItPcqP&F*=(4Ul3mhF!fFg&+ zXM2Prdn?3vlqd?^^Y?evZvft40vHpY3x)rdS{9|nmH7{1*bZnTU>WSv`6Ts<{}t$z zjSqI!MgWRe!Zwe3UjqPGU-cYSk;Bxxxm4YNbIb*%kjt&O7_?F?p0ma zHsG}c{(gK8_lgvl)}alZOM5*Ebqofm@1HPL0Z(=X=CVpmMU4tR``WZyo13k*Z7Rv_ z0QdHCIG&7o?}B-~dMo zd-;ci$cR8t+^7e>nLvR`Tqy9?^OSvzf`>h{qOhl!(0B`XUXDB7lx>Ef=nj(_9$6*DVoAsvDz zX2yk>KZ$n zX|*Q{UdQio7pRA5n=R)qhS?=#)kPF~QW#;uLQ$noUMFm=i@It9Fqx7Ch)ni{T1tW| zz_SAWe{ptgR{H|y|MtpXuRM_bd441ZcxCqn8(>1YLu7!*AY&>Ei0@*$(WX_JOHMfw zI@b_0hnHtw9T-U2jT5yT!e+?ay`yU_0>%?MIz*QK0^2zh)=}c=J^W<5`ypm2si`Hd zZ-hDbuuz`4wdFPB#b@z#oiSGzvf^`v?BzV(?e6ud&yBlAf$q)&C#g%eHusiK>U%C_ zjbRC1=}O;!ay&uvHgdu18uQK-=U)|;7zvU|n<{RQ+t zPiFs;A5y*=H*_W8OqpfEbrJQk4lgfI4=*F2q8F?zuBo}-LM;zzXE?W7@1*>&c{x&0 zm7k6ewz2Rvq&6uBIQTfex>fevYq^1*s6?aE{iu#gJz>knkLaWB*~}~>(Pcn`Xo~e! z%_RiS)!&x}0mqth```iI*R@6o^+tlCVf?^GI0xLBG_0OSR@k<)q1jf6&zxvCQ#QpI z%L2+hr%{@+5JorqMz4fc82t@h^-(xlZzL3b4|Rkzjfv!Hc}A9Nm`A4JtQEz{&E<&p z4OE%JfR)_TRUZU4WrA^tLJ{e+T$U6!4zc%Rtn3a}M{!$%x)BqEyR6o=HU=rxun{x% zsJ0&xNzZLtlHdCu()*G7p@q-$|HWZ2U4W||8FBo-Ggc6Od3YPDc*_o8%zrWvU zT-Ck9*~Z#FY~%3_CyR)*JN9})WtB9QkUiIr#tw2pKA9)e!_aiCZBvF(S{Bx%;9}g^ zz1{7g5A9=Qk0~|hqzXbQU+?(oQlVuOI=EYCAUGNU=4{jO0}h9d@2Z6DbuX4iirYc( z<~Pu*-P`OYPDpu1_7DCUk5HFUhX+cs2PHxirIk!As-*pMMKL?EW7xvibq~6^N-zu2 zE8qzM4W@+%H*U4fpjNVw06Bw7Nb_M#{|EH`bwRAg!zv~$K5bku>sbwdW z&P0acRO|CS+`naUV}M1%TVLG0+w4w4p=~5CJi&#&Mv>gyGQg?9iZigGJVnwQz#iyU zIz0>pwNmKi-2w-CY|5;7IOLJ&#F#_4$ z;r~CM)jm~iRi`SynEm|Q^6)1OYPZ^zOg3Fh6Ie(?-P9)tL3JtV{7Ih3Xjp_B7Mh?w zS-^zZDP(F~6`q5B{vHO6Xt^^Ac@z_Wrk5X$bKAlpHp1;_5plfQ<<=6eN7D8f>7M# zfecwu{kkLFbKsr45o{y^sfC%%vxg=gLW7uZydA*rC9z@#k}6;4150d<+Z-DOoLQPd z;HE;3@NoAtW~Cbmt;dF1=|pUdl_lE=7$*E4BOahTbJ&&lW%+gb`MrMFthf*qJ>A^{ z_a?ia<|Wejf02dQE1Q7e=ae{@+RD5M&Is*3b*VX9#%u?V(74ZK9*{bS) zeiH@IPUT(v@TPq=uJ1mgX-iWB8ho4wcH!a8*^Ssl9}^mLpFcFt#K{e|wqZx`N1#2{{p<&4=A66Huhc;vSKJhkCHGtF$b>&W{lmx-`hOuz`VZF)k@ZQ^SPo zVXuNYTEsY&FeEtnIKUx%Y&_JJ)HQI|zQh-R;CO(O#p3wCx8a^D~-k9~Rjkf3KmsoMrUoJgVDzdrT(zvAipuO#L z7kr~V4)ND2{Cfmo?J+elkXg|8IR;@8My1hkpY@pY^8YW+o&*1{U0&U-{7Pjh`xpH9 z=6$VnpU|Aw6Qb4loa?mf{>gc42aj`R1pgD)m}pz>;507kO452dCCcJ~kqq6F%xSK; zDo0{YYONcGkO`TgRF=DC#kv#sjRQw35Uofri;5$yq-#FJs9=l6Ix`@KWi0-N38=& zLy_V4fWlH&?JK6n6Ka{Gd$Sxo^*^hS9;|gAQtnVh^_R+-~5P$j78dE!Ok&V5qma~gPV+4o3&*XaB*r3Y+>>y9`V0kmy3Mr>{FTzi z;Q;qC|1Wo+woRH~N22ffpzlm5aLZDLGHDo8JI+ST=zBhlk#K1?F6|z*jk_}X{u;J% z_a)RLC=_3j<3!gYZUi`V9ZSqoDsami@D= z_WtT0K>zy%zWp8a)wrfBEoiv&W209jj?g?!Zz#&`h!JNv@;+r}O{9!lYhDNkS|W4- zXxLu$I9*}pRc8SB;+@`?x+mDTM^j2_hF-;Bj~0hJY6?3*i%yfjWdycMcO6*+7zyF= zq+ma%%{rc<%ohoAV7M8^DJ%-4pcn0su0zc(Y)wvj(9>r7g*@h`_=z zI?z>jhshKzn8?5$QMy-nj@Tg%`LUjcn`=bN)^ZI`nK2p6Q5uO;iU_XBSGum}!)`)l zL)15k&U$#a5^5}yZ0n!qpAZzJSJb{2Xu*pLH=*sSw7{gTk z?C3E>S2r>W)G8GfimZSA|iav7mp>ejWP6(up4v*dkLrw9Xs|-PhfTATTyi85j z4ze|*b^;iK(hWw6UszFD4=Drh7TXFvP@QhcxbFvisAV~~qe7iZrv^sFEG)Y*< zUO#GF-dP!n@wL$#B)Zd$dLV!~s$tH3DS3%OYsR(2o(+Zl@9EC4VS)WF9X+0?;d-*% zIMsHWngfGtIR5c)P_nqAK$N(_eg5&4?pK+s>3Ujx62V(WcR47nmLNUKs9Z_QMpr!x zj@A>Z#)h8e0l{G3LotXsvT}D<%?ro{CV+`?Pt)}R$UCN3C}yE#SQy|vnn+p;bzd21 zta{7<04&(QO1<1t`aH9lgVMN3{sBw*)pFQ?3duAIq!Ap6Lmv-wIoN4^!z@7{)0xhAo(nNDyas@LNw~^ITy+o0C@+8r`BDxvzg#@#Y6XD zX}4luq~b6jEK!Xc?AKM@1=f`;P=Y9UBu+l;yc+1QG|eL5;XagC!_Chh&7Jo8e=uMc zE#E_nbrqq^u(A}Glt)ILZ~y=stKE4!#k+Tm-f{7Leq8XI@M*2f;7SAM*R!ik*4!mb zhRGY^%jMi|T!0zhG0UkIZ&BPTA!9-vhx@Y=aDOCgJiz(kb=eXn|No~||J$ivUU@M4 z=|QLeZT)92btR;{pI(Fmt*$Gh$h!%h;8uJbzS_hc6OvD-zSGC?jYqmG>=|z36dqu# z&SUh2cRy+!d9=N@3?bH%)@-msi!C8Sp2AkF?_GsgYXw%Yna&<8zlu_E;Z<(wE^GUb zr>JbjxBsZ#S>Dfq9i@ibi%T2qU3Eq#to6-rJfVQ_P0EPH@d`ibAq5}qs@DP-Mgr&? zi6RFEARJo`FQ+r4lkE=Bj^Gaz#?7L(vq($sdHw(l7;W*saXOJrf5;kFchz;_X#LgE zR%PftcKj6CVJfoeZ7LQyWBl40?!B_i+&2P#)GkHRa;{-H(T^E~(iEbbPerA_5_JDx zMAPr;PgSq4%<;|dl&{8t?uN~I!d*9X&L0(qI<(4yO}f5Wnqn*U%w=E>b)R#mYI^kY z$4^zf=h*$UM+eIC%vpjNg235@8G0rHS0Czqt2k%Xq&M*^iH)^?w4b5uEc6Xu>de6? zytBKmLsoB8Mh`!7$Yho{O{As<^61s!V(?8?8WzqW4!19_+da}%%Ye!HYYFf}#ECf0 zi@SP*FnPv=TG~?kJnIC&pf^w9+N}ZM zIK3$!{nPnJ)DxJD)RUH1msC!#L5uVMr?T4h)o)hcS6R(k8LH(M@U_-;0^SKqTG0^s zylm#?!c1ug7<(fZ#<{KQb-ELRlE}u?q2k<7$U&*p49u#NnqYPFbDeGcf+5l=2@F?d z>FQO?8#83aOs@Y8!`(|mhWmlF4bb*SyJy(6_zL?;F&CQLi6ew-sO>|EQ&9>+ZC}a# z=$_Da!(DK#WqqWh=x|20cqdDvr7=7RpTD-A?{1r8mB6l#OfR7V)5#X?ah<~{InU^j zMD2$mOE^b*|F~@!}Em~y+?BvUypWg_$w8kc

%oKEB$}< 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

>T{iA%ve!_%BhCH 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�t1)7RTo=#Cu{9V?Z^mUl5P=;Upiyq&vHF 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 o)xrva_ks*5}=G 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%0Ag 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%0DRWD;|` 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೒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

G0-jEQ7ugV_f-E&d*$u^{J*W}Jly_)_D!vC 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 -6o)u~2sywrtn(1D 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

M$!K8%_^5%E@lJLZUQMDG+bk*SeRb{yLGZSFOJN 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 diff --git a/tester/message_tester.c b/tester/message_tester.c index bdcafa835..6aaea5cb7 100644 --- a/tester/message_tester.c +++ b/tester/message_tester.c @@ -1467,7 +1467,7 @@ static void lime_unit(void) { * Destination file is truncated if existing. * Return 0 on success, positive value on error. */ -int message_tester_copy_file(const char *from, const char *to) +static int message_tester_copy_file(const char *from, const char *to) { FILE *in, *out; char buf[256]; @@ -2309,7 +2309,7 @@ static void message_received_callback(LinphoneCore *lc, LinphoneChatRoom *room, } BC_ASSERT_EQUAL(0, linphone_chat_room_get_unread_messages_count(room), int, "%d"); } - + void unread_message_count_callback(void) { LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc"); @@ -2328,6 +2328,26 @@ void unread_message_count_callback(void) { linphone_core_manager_destroy(pauline); } +static void migration_from_messages_db (void) { + LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc"); + char *src_db = bc_tester_res("db/messages.db"); + char *tmp_db = bc_tester_file("tmp.db"); + + BC_ASSERT_EQUAL(message_tester_copy_file(src_db, tmp_db), 0, int, "%d"); + + // The messages.db has 10000 dummy messages with the very first DB scheme. + // This will test the migration procedure + linphone_core_set_chat_database_path(marie->lc, tmp_db); + + const bctbx_list_t *chatrooms = linphone_core_get_chat_rooms(marie->lc); + BC_ASSERT(bctbx_list_size(chatrooms) > 0); + + linphone_core_manager_destroy(marie); + remove(tmp_db); + bctbx_free(src_db); + bctbx_free(tmp_db); +} + test_t message_tests[] = { TEST_NO_TAG("Text message", text_message), TEST_NO_TAG("Text message with credentials from auth callback", text_message_with_credential_from_auth_callback), @@ -2404,6 +2424,7 @@ test_t message_tests[] = { TEST_NO_TAG("Crash during file transfer", crash_during_file_transfer), TEST_NO_TAG("Text status after destroying chat room", text_status_after_destroying_chat_room), TEST_NO_TAG("Transfer io error after destroying chatroom", file_transfer_io_error_after_destroying_chatroom), + TEST_NO_TAG("Migration from messages db", migration_from_messages_db) }; static int message_tester_before_suite(void) { From 573e8468c40714ff3496198d2ebff96d66c1597a Mon Sep 17 00:00:00 2001 From: Erwan Croze Date: Fri, 16 Feb 2018 15:34:44 +0100 Subject: [PATCH 076/281] Adding magic search test concerning cache resetting --- tester/setup_tester.c | 50 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) diff --git a/tester/setup_tester.c b/tester/setup_tester.c index bb95bd70b..8316f86fe 100644 --- a/tester/setup_tester.c +++ b/tester/setup_tester.c @@ -536,6 +536,53 @@ static void search_friend_research_estate(void) { linphone_core_manager_destroy(manager); } +static void search_friend_research_estate_reset(void) { + LinphoneMagicSearch *magicSearch = NULL; + bctbx_list_t *resultList = NULL; + LinphoneCoreManager* manager = linphone_core_manager_new2("empty_rc", FALSE); + LinphoneFriendList *lfl = linphone_core_get_default_friend_list(manager->lc); + + _create_friends_from_tab(manager->lc, lfl, sFriends, sSizeFriend); + + magicSearch = linphone_magic_search_new(manager->lc); + + resultList = linphone_magic_search_get_contact_list_from_filter(magicSearch, "la", ""); + + BC_ASSERT_PTR_NOT_NULL(resultList); + + if (resultList != NULL) { + BC_ASSERT_EQUAL(bctbx_list_size(resultList), 2, int, "%d"); + _check_friend_result_list(resultList, 0, sFriends[6]);//"sip:laura@sip.example.org" + _check_friend_result_list(resultList, 1, sFriends[8]);//"sip:laure@sip.test.org" + } + + free(resultList); + + linphone_magic_search_reset_search_cache(magicSearch); + + resultList = linphone_magic_search_get_contact_list_from_filter(magicSearch, "l", ""); + + BC_ASSERT_PTR_NOT_NULL(resultList); + + if (resultList != NULL) { + BC_ASSERT_EQUAL(bctbx_list_size(resultList), 7, int, "%d"); + _check_friend_result_list(resultList, 0, sFriends[6]);//"sip:laura@sip.example.org" + _check_friend_result_list(resultList, 1, sFriends[7]);//"sip:loic@sip.example.org" + _check_friend_result_list(resultList, 2, sFriends[8]);//"sip:laure@sip.test.org" + _check_friend_result_list(resultList, 3, sFriends[9]);//"sip:loic@sip.test.org" + _check_friend_result_list(resultList, 4, sFriends[2]);//"sip:allo@sip.example.org" + _check_friend_result_list(resultList, 5, sFriends[3]);//"sip:hello@sip.example.org" + _check_friend_result_list(resultList, 6, sFriends[4]);//"sip:hello@sip.test.org" + } + + free(resultList); + + + _remove_friends_from_list(lfl, sFriends, sSizeFriend); + + linphone_core_manager_destroy(manager); +} + test_t setup_tests[] = { TEST_NO_TAG("Version check", linphone_version_test), TEST_NO_TAG("Linphone Address", linphone_address_test), @@ -555,7 +602,8 @@ test_t setup_tests[] = { TEST_NO_TAG("Custom tones setup", custom_tones_setup), TEST_TWO_TAGS("Search friend from all domains", search_friend_all_domains, "MagicSearch", "LeaksMemory"), TEST_TWO_TAGS("Search friend from one domain", search_friend_one_domain, "MagicSearch", "LeaksMemory"), - TEST_TWO_TAGS("Multiple looking for friends", search_friend_research_estate, "MagicSearch", "LeaksMemory") + TEST_TWO_TAGS("Multiple looking for friends with the same cache", search_friend_research_estate, "MagicSearch", "LeaksMemory"), + TEST_TWO_TAGS("Multiple looking for friends with cache resetting", search_friend_research_estate_reset, "MagicSearch", "LeaksMemory") }; test_suite_t setup_test_suite = {"Setup", NULL, NULL, liblinphone_tester_before_each, liblinphone_tester_after_each, From 7c397eef3d219d4e84b3bb2d9c5a9112a9b97d7c Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 16 Feb 2018 15:42:39 +0100 Subject: [PATCH 077/281] Fix wifi, multicast and cpu locks being acquired instead of being released. --- src/conference/session/call-session.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/conference/session/call-session.cpp b/src/conference/session/call-session.cpp index 1e640f584..b2b7a7703 100644 --- a/src/conference/session/call-session.cpp +++ b/src/conference/session/call-session.cpp @@ -130,9 +130,9 @@ void CallSessionPrivate::setState (CallSession::State newState, const string &me log->connected_date_time = ms_time(nullptr); break; case CallSession::State::Released: - getPlatformHelpers(q->getCore()->getCCore())->acquireWifiLock(); - getPlatformHelpers(q->getCore()->getCCore())->acquireMcastLock(); - getPlatformHelpers(q->getCore()->getCCore())->acquireCpuLock(); + getPlatformHelpers(q->getCore()->getCCore())->releaseWifiLock(); + getPlatformHelpers(q->getCore()->getCCore())->releaseMcastLock(); + getPlatformHelpers(q->getCore()->getCCore())->releaseCpuLock(); break; default: break; From 8a336839b5c3bd6820d05cc21dcaa9be5d78bd66 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 16 Feb 2018 16:04:44 +0100 Subject: [PATCH 078/281] fix table overflow --- src/nat/ice-agent.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/nat/ice-agent.cpp b/src/nat/ice-agent.cpp index bca4f7cdb..51874850f 100644 --- a/src/nat/ice-agent.cpp +++ b/src/nat/ice-agent.cpp @@ -539,7 +539,7 @@ void IceAgent::createIceCheckListsAndParseIceAttributes (const SalMediaDescripti } if (!iceRestarted) { bool_t losingPairsAdded = false; - for (int j = 0; j < SAL_MEDIA_DESCRIPTION_MAX_ICE_CANDIDATES; j++) { + for (int j = 0; j < SAL_MEDIA_DESCRIPTION_MAX_ICE_REMOTE_CANDIDATES; j++) { const SalIceRemoteCandidate *remoteCandidate = &stream->ice_remote_candidates[j]; const char *addr = nullptr; int port = 0; From a2efa12ca2da824ecf0fdc4896ffebd02c7153cc Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 16 Feb 2018 16:05:24 +0100 Subject: [PATCH 079/281] fix bad reading of quality_reporting_interval. No reason to have '!!', it is not a boolean but an interval in seconds. --- coreapi/proxy.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coreapi/proxy.c b/coreapi/proxy.c index d5f3ea5ad..4741b355b 100644 --- a/coreapi/proxy.c +++ b/coreapi/proxy.c @@ -133,7 +133,7 @@ static void linphone_proxy_config_init(LinphoneCore* lc, LinphoneProxyConfig *cf cfg->realm = realm ? ms_strdup(realm) : NULL; cfg->quality_reporting_enabled = lc ? !!lp_config_get_default_int(lc->config, "proxy", "quality_reporting_enabled", 0) : 0; cfg->quality_reporting_collector = quality_reporting_collector ? ms_strdup(quality_reporting_collector) : NULL; - cfg->quality_reporting_interval = lc ? !!lp_config_get_default_int(lc->config, "proxy", "quality_reporting_interval", 0) : 0; + cfg->quality_reporting_interval = lc ? lp_config_get_default_int(lc->config, "proxy", "quality_reporting_interval", 0) : 0; cfg->contact_params = contact_params ? ms_strdup(contact_params) : NULL; cfg->contact_uri_params = contact_uri_params ? ms_strdup(contact_uri_params) : NULL; cfg->avpf_mode = lc ? static_cast(lp_config_get_default_int(lc->config, "proxy", "avpf", LinphoneAVPFDefault)) : LinphoneAVPFDefault; @@ -565,7 +565,7 @@ bool_t linphone_proxy_config_quality_reporting_enabled(LinphoneProxyConfig *cfg) } void linphone_proxy_config_set_quality_reporting_interval(LinphoneProxyConfig *cfg, int interval) { - cfg->quality_reporting_interval = !!interval; + cfg->quality_reporting_interval = interval; } int linphone_proxy_config_get_quality_reporting_interval(LinphoneProxyConfig *cfg) { From a237baffae59025ed88f7eaf2408758401d0eec5 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 16 Feb 2018 16:20:18 +0100 Subject: [PATCH 080/281] fix previous commit (was generating cast error) --- coreapi/private_structs.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/coreapi/private_structs.h b/coreapi/private_structs.h index 993e5f983..d064fca03 100644 --- a/coreapi/private_structs.h +++ b/coreapi/private_structs.h @@ -106,6 +106,7 @@ struct _LinphoneProxyConfig LinphoneRegistrationState state; LinphoneAVPFMode avpf_mode; LinphoneNatPolicy *nat_policy; + int quality_reporting_interval; bool_t commit; bool_t reg_sendregister; @@ -115,15 +116,14 @@ struct _LinphoneProxyConfig bool_t send_publish; bool_t quality_reporting_enabled; uint8_t avpf_rr_interval; - uint8_t quality_reporting_interval; + bool_t register_changed; time_t deletion_date; LinphonePrivacyMask privacy; /*use to check if server config has changed between edit() and done()*/ LinphoneAddress *saved_proxy; LinphoneAddress *saved_identity; - bool_t register_changed; - bool_t unused[3]; + /*---*/ LinphoneAddress *pending_contact; /*use to store previous contact in case of network failure*/ LinphoneEvent *presence_publish_event; From 9ca30446d5864fa0b1c64ecd3893912134aecfae Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 16 Feb 2018 16:23:09 +0100 Subject: [PATCH 081/281] Improved AndroidPlatformHelper --- .../classes/tools/AndroidPlatformHelper.java | 29 ++++++++++++------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/wrappers/java/classes/tools/AndroidPlatformHelper.java b/wrappers/java/classes/tools/AndroidPlatformHelper.java index 7e07f009b..1c20b94c6 100644 --- a/wrappers/java/classes/tools/AndroidPlatformHelper.java +++ b/wrappers/java/classes/tools/AndroidPlatformHelper.java @@ -171,19 +171,28 @@ public class AndroidPlatformHelper { mWakeLock.acquire(); } - public void releaseCpuLock(){ + public void releaseCpuLock() { Log.i("releaseCpuLock()"); mWakeLock.release(); } + private int getResourceIdentifierFromName(String name) { + int resId = mResources.getIdentifier(name, "raw", mContext.getPackageName()); + if (resId == 0) { + Log.d("App doesn't seem to embed resource " + name + "in it's res/raw/ directory, use linphone's instead"); + resId = mResources.getIdentifier(name, "raw", "org.linphone"); + } + return resId; + } + private void copyAssetsFromPackage() throws IOException { - copyIfNotExist(mResources.getIdentifier("org.linphone:raw/notes_of_the_optimistic", null, null), mRingSoundFile); - copyIfNotExist(mResources.getIdentifier("org.linphone:raw/ringback", null, null), mRingbackSoundFile); - copyIfNotExist(mResources.getIdentifier("org.linphone:raw/hold", null, null), mPauseSoundFile); - copyIfNotExist(mResources.getIdentifier("org.linphone:raw/incoming_chat", null, null), mErrorToneFile); - copyIfNotExist(mResources.getIdentifier("org.linphone:raw/cpim_grammar", null, null), mGrammarCpimFile); - copyIfNotExist(mResources.getIdentifier("org.linphone:raw/vcard_grammar", null, null), mGrammarVcardFile); - copyIfNotExist(mResources.getIdentifier("org.linphone:raw/rootca", null, null), mLinphoneRootCaFile); + copyIfNotExist(getResourceIdentifierFromName("notes_of_the_optimistic"), mRingSoundFile); + copyIfNotExist(getResourceIdentifierFromName("ringback"), mRingbackSoundFile); + copyIfNotExist(getResourceIdentifierFromName("hold"), mPauseSoundFile); + copyIfNotExist(getResourceIdentifierFromName("incoming_chat"), mErrorToneFile); + copyIfNotExist(getResourceIdentifierFromName("cpim_grammar"), mGrammarCpimFile); + copyIfNotExist(getResourceIdentifierFromName("vcard_grammar"), mGrammarVcardFile); + copyIfNotExist(getResourceIdentifierFromName("rootca"), mLinphoneRootCaFile); } public void copyIfNotExist(int ressourceId, String target) throws IOException { @@ -193,9 +202,9 @@ public class AndroidPlatformHelper { } } - public void copyFromPackage(int ressourceId, String target) throws IOException{ - FileOutputStream lOutputStream = mContext.openFileOutput (target, 0); + public void copyFromPackage(int ressourceId, String target) throws IOException { InputStream lInputStream = mResources.openRawResource(ressourceId); + FileOutputStream lOutputStream = mContext.openFileOutput (target, 0); int readByte; byte[] buff = new byte[8048]; while (( readByte = lInputStream.read(buff)) != -1) { From d64310cd0c0143f5e6d965a5353ff832b6515922 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 16 Feb 2018 16:54:31 +0100 Subject: [PATCH 082/281] Do not notify is-composing received false state when receiving an is-composing or imdn message. --- src/chat/chat-room/chat-room.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/chat/chat-room/chat-room.cpp b/src/chat/chat-room/chat-room.cpp index 3d2ea95a4..7785774c3 100644 --- a/src/chat/chat-room/chat-room.cpp +++ b/src/chat/chat-room/chat-room.cpp @@ -241,8 +241,12 @@ end: void ChatRoomPrivate::onChatMessageReceived (const shared_ptr &chatMessage) { const IdentityAddress &fromAddress = chatMessage->getFromAddress(); - isComposingHandler->stopRemoteRefreshTimer(fromAddress.asString()); - notifyIsComposingReceived(fromAddress, false); + if ((chatMessage->getPrivate()->getContentType() != ContentType::ImIsComposing) + && (chatMessage->getPrivate()->getContentType() != ContentType::Imdn) + ) { + isComposingHandler->stopRemoteRefreshTimer(fromAddress.asString()); + notifyIsComposingReceived(fromAddress, false); + } chatMessage->getPrivate()->notifyReceiving(); } From 9fa36be4bf2151316153a5ac4e4b43760aeb2f91 Mon Sep 17 00:00:00 2001 From: Erwan Croze Date: Fri, 16 Feb 2018 17:12:41 +0100 Subject: [PATCH 083/281] Adding new search friend test -search friend with phone number --- tester/setup_tester.c | 59 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 47 insertions(+), 12 deletions(-) diff --git a/tester/setup_tester.c b/tester/setup_tester.c index 8316f86fe..5f1d04835 100644 --- a/tester/setup_tester.c +++ b/tester/setup_tester.c @@ -25,19 +25,21 @@ #include "linphone/api/c-magic-search.h" #include "tester_utils.h" -#define S_SIZE_FRIEND 10 +#define S_SIZE_FRIEND 12 static const unsigned int sSizeFriend = S_SIZE_FRIEND; static const char *sFriends[S_SIZE_FRIEND] = { - "sip:test@sip.example.org", - "sip:test2@sip.example.org", - "sip:allo@sip.example.org", - "sip:hello@sip.example.org", - "sip:hello@sip.test.org", - "sip:marie@sip.example.org", - "sip:laura@sip.example.org", - "sip:loic@sip.example.org", - "sip:laure@sip.test.org", - "sip:loic@sip.test.org" + "sip:test@sip.example.org",//0 + "sip:test2@sip.example.org",//1 + "sip:allo@sip.example.org",//2 + "sip:hello@sip.example.org",//3 + "sip:hello@sip.test.org",//4 + "sip:marie@sip.example.org",//5 + "sip:laura@sip.example.org",//6 + "sip:loic@sip.example.org",//7 + "sip:laure@sip.test.org",//8 + "sip:loic@sip.test.org",//9 + "sip:+111223344@sip.example.org",//10 + "sip:+33655667788@sip.example.org"//11 }; static void _create_friends_from_tab(LinphoneCore *lc, LinphoneFriendList *list, const char *friends[], const unsigned int size) { @@ -583,6 +585,38 @@ static void search_friend_research_estate_reset(void) { linphone_core_manager_destroy(manager); } +static void search_friend_with_phone_number(void) { + LinphoneMagicSearch *magicSearch = NULL; + bctbx_list_t *resultList = NULL; + LinphoneCoreManager* manager = linphone_core_manager_new2("empty_rc", FALSE); + LinphoneFriendList *lfl = linphone_core_get_default_friend_list(manager->lc); + const char* mariePhoneNumber = {"0633556644"}; + + _create_friends_from_tab(manager->lc, lfl, sFriends, sSizeFriend); + + linphone_friend_add_phone_number(linphone_friend_list_find_friend_by_uri(lfl, sFriends[5]), mariePhoneNumber); + + magicSearch = linphone_magic_search_new(manager->lc); + + resultList = linphone_magic_search_get_contact_list_from_filter(magicSearch, "33", ""); + + BC_ASSERT_PTR_NOT_NULL(resultList); + + if (resultList != NULL) { + BC_ASSERT_EQUAL(bctbx_list_size(resultList), 3, int, "%d"); + _check_friend_result_list(resultList, 0, sFriends[11]);//"sip:+111223344@sip.example.org" + _check_friend_result_list(resultList, 1, sFriends[10]);//"sip:+33655667788@sip.example.org" + _check_friend_result_list(resultList, 2, sFriends[5]);//"sip:marie@sip.example.org" + } + + free(resultList); + + + _remove_friends_from_list(lfl, sFriends, sSizeFriend); + + linphone_core_manager_destroy(manager); +} + test_t setup_tests[] = { TEST_NO_TAG("Version check", linphone_version_test), TEST_NO_TAG("Linphone Address", linphone_address_test), @@ -603,7 +637,8 @@ test_t setup_tests[] = { TEST_TWO_TAGS("Search friend from all domains", search_friend_all_domains, "MagicSearch", "LeaksMemory"), TEST_TWO_TAGS("Search friend from one domain", search_friend_one_domain, "MagicSearch", "LeaksMemory"), TEST_TWO_TAGS("Multiple looking for friends with the same cache", search_friend_research_estate, "MagicSearch", "LeaksMemory"), - TEST_TWO_TAGS("Multiple looking for friends with cache resetting", search_friend_research_estate_reset, "MagicSearch", "LeaksMemory") + TEST_TWO_TAGS("Multiple looking for friends with cache resetting", search_friend_research_estate_reset, "MagicSearch", "LeaksMemory"), + TEST_TWO_TAGS("Search friend with phone number", search_friend_with_phone_number, "MagicSearch", "LeaksMemory") }; test_suite_t setup_test_suite = {"Setup", NULL, NULL, liblinphone_tester_before_each, liblinphone_tester_after_each, From 07443b1f603df693ce6215039d1970bd0f096fd5 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Thu, 15 Feb 2018 08:28:12 +0100 Subject: [PATCH 084/281] feat(MainDb): increase performance of get history range --- src/CMakeLists.txt | 12 +- src/chat/chat-message/chat-message-p.h | 13 +- src/chat/chat-message/chat-message.cpp | 32 ++- src/db/internal/safe-transaction.h | 141 ++++++++++ src/db/internal/statements.cpp | 76 ++++++ src/db/internal/statements.h | 46 ++++ src/db/main-db-p.h | 15 ++ src/db/main-db.cpp | 350 ++++++++++++------------- src/db/main-db.h | 6 + 9 files changed, 494 insertions(+), 197 deletions(-) create mode 100644 src/db/internal/safe-transaction.h create mode 100644 src/db/internal/statements.cpp create mode 100644 src/db/internal/statements.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index bb174d7eb..fec6de2bf 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -272,15 +272,12 @@ set(LINPHONE_OBJC_SOURCE_FILES) if (APPLE) list(APPEND LINPHONE_OBJC_SOURCE_FILES core/paths/paths-apple.mm) list(APPEND LINPHONE_CXX_OBJECTS_PRIVATE_HEADER_FILES core/paths/paths-apple.h) - elseif (ANDROID) list(APPEND LINPHONE_CXX_OBJECTS_SOURCE_FILES core/paths/paths-android.cpp core/platform-helpers/android-platform-helpers.cpp) list(APPEND LINPHONE_CXX_OBJECTS_PRIVATE_HEADER_FILES core/paths/paths-android.h) - elseif (WIN32) list(APPEND LINPHONE_CXX_OBJECTS_SOURCE_FILES core/paths/paths-windows.cpp) list(APPEND LINPHONE_CXX_OBJECTS_PRIVATE_HEADER_FILES core/paths/paths-windows.h) - elseif (UNIX) list(APPEND LINPHONE_CXX_OBJECTS_SOURCE_FILES core/paths/paths-linux.cpp) list(APPEND LINPHONE_CXX_OBJECTS_PRIVATE_HEADER_FILES core/paths/paths-linux.h) @@ -293,6 +290,15 @@ set(LINPHONE_CXX_OBJECTS_INCLUDE_DIRS ${BELR_INCLUDE_DIRS}) if (SOCI_FOUND) list(APPEND LINPHONE_CXX_OBJECTS_INCLUDE_DIRS ${SOCI_INCLUDE_DIRS} ${SOCI_MYSQL_INCLUDES}) add_definitions(-DSOCI_ENABLED) + + list(APPEND LINPHONE_CXX_OBJECTS_PRIVATE_HEADER_FILES + db/internal/safe-transaction.h + db/internal/statements.h + ) + + list(APPEND LINPHONE_CXX_OBJECTS_SOURCE_FILES + db/internal/statements.cpp + ) endif () set(LINPHONE_PRIVATE_HEADER_FILES) diff --git a/src/chat/chat-message/chat-message-p.h b/src/chat/chat-message/chat-message-p.h index fd374a39e..b6182c94f 100644 --- a/src/chat/chat-message/chat-message-p.h +++ b/src/chat/chat-message/chat-message-p.h @@ -69,14 +69,20 @@ public: void setImdnMessageId (const std::string &imdnMessageId); - inline void forceFromAddress (const IdentityAddress &fromAddress) { + void forceFromAddress (const IdentityAddress &fromAddress) { this->fromAddress = fromAddress; } - inline void forceToAddress (const IdentityAddress &toAddress) { + void forceToAddress (const IdentityAddress &toAddress) { this->toAddress = toAddress; } + void markContentsAsNotLoaded () { + contentsNotLoadedFromDatabase = true; + } + + void loadContentsFromDatabase () const; + belle_http_request_t *getHttpRequest () const; void setHttpRequest (belle_http_request_t *request); @@ -142,7 +148,7 @@ private: std::string imdnId; std::string rttMessage; bool isSecured = false; - bool isReadOnly = false; + mutable bool isReadOnly = false; std::list contents; Content internalContent; std::unordered_map customHeaders; @@ -176,6 +182,7 @@ private: bool encryptionPrevented = false; bool toBeStored = true; + mutable bool contentsNotLoadedFromDatabase = false; L_DECLARE_PUBLIC(ChatMessage); }; diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index a254ff42d..2436bcbb5 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -183,6 +183,7 @@ string ChatMessagePrivate::getSalCustomHeaderValue (const string &name) { // ----------------------------------------------------------------------------- bool ChatMessagePrivate::hasTextContent() const { + loadContentsFromDatabase(); for (const Content *c : contents) { if (c->getContentType() == ContentType::PlainText) { return true; @@ -192,6 +193,7 @@ bool ChatMessagePrivate::hasTextContent() const { } const Content* ChatMessagePrivate::getTextContent() const { + loadContentsFromDatabase(); for (const Content *c : contents) { if (c->getContentType() == ContentType::PlainText) { return c; @@ -201,6 +203,7 @@ const Content* ChatMessagePrivate::getTextContent() const { } bool ChatMessagePrivate::hasFileTransferContent() const { + loadContentsFromDatabase(); for (const Content *c : contents) { if (c->getContentType() == ContentType::FileTransfer) { return true; @@ -227,6 +230,7 @@ void ChatMessagePrivate::setFileTransferFilepath (const string &path) { } const string &ChatMessagePrivate::getAppdata () const { + loadContentsFromDatabase(); for (const Content *c : contents) { if (c->isFile()) { FileContent *fileContent = (FileContent *)c; @@ -237,6 +241,7 @@ const string &ChatMessagePrivate::getAppdata () const { } void ChatMessagePrivate::setAppdata (const string &data) { + loadContentsFromDatabase(); for (const Content *c : contents) { if (c->isFile()) { FileContent *fileContent = (FileContent *)c; @@ -256,6 +261,7 @@ const string &ChatMessagePrivate::getExternalBodyUrl () const { } const ContentType &ChatMessagePrivate::getContentType () { + loadContentsFromDatabase(); if (direction == ChatMessage::Direction::Incoming) { if (contents.size() > 0) { Content *content = contents.front(); @@ -277,6 +283,7 @@ const ContentType &ChatMessagePrivate::getContentType () { } void ChatMessagePrivate::setContentType (const ContentType &contentType) { + loadContentsFromDatabase(); if (contents.size() > 0 && internalContent.getContentType().isEmpty() && internalContent.isEmpty()) { internalContent.setBody(contents.front()->getBody()); } @@ -290,6 +297,7 @@ void ChatMessagePrivate::setContentType (const ContentType &contentType) { } const string &ChatMessagePrivate::getText () { + loadContentsFromDatabase(); if (direction == ChatMessage::Direction::Incoming) { if (hasTextContent()) { cText = getTextContent()->getBodyAsString(); @@ -313,6 +321,7 @@ const string &ChatMessagePrivate::getText () { } void ChatMessagePrivate::setText (const string &text) { + loadContentsFromDatabase(); if (contents.size() > 0 && internalContent.getContentType().isEmpty() && internalContent.isEmpty()) { internalContent.setContentType(contents.front()->getContentType()); } @@ -356,6 +365,7 @@ void ChatMessagePrivate::setFileTransferInformation (const LinphoneContent *c_co bool ChatMessagePrivate::downloadFile () { L_Q(); + loadContentsFromDatabase(); for (auto &content : contents) if (content->getContentType() == ContentType::FileTransfer) @@ -887,6 +897,18 @@ void ChatMessagePrivate::setImdnMessageId (const string &id) { imdnId = id; } +void ChatMessagePrivate::loadContentsFromDatabase () const { + L_Q(); + if (contentsNotLoadedFromDatabase) { + isReadOnly = false; + contentsNotLoadedFromDatabase = false; + q->getChatRoom()->getCore()->getPrivate()->mainDb->loadChatMessageContents( + const_pointer_cast(q->getSharedFromThis()) + ); + isReadOnly = true; + } +} + bool ChatMessage::isRead () const { L_D(); @@ -939,6 +961,7 @@ bool ChatMessage::isReadOnly () const { const list &ChatMessage::getContents () const { L_D(); + d->loadContentsFromDatabase(); return d->contents; } @@ -1000,6 +1023,7 @@ void ChatMessage::send () { return; } + d->loadContentsFromDatabase(); getChatRoom()->getPrivate()->sendChatMessage(getSharedFromThis()); } @@ -1039,9 +1063,9 @@ void ChatMessage::cancelFileTransfer () { int ChatMessage::putCharacter (uint32_t character) { L_D(); - static const uint32_t new_line = 0x2028; - static const uint32_t crlf = 0x0D0A; - static const uint32_t lf = 0x0A; + constexpr uint32_t newLine = 0x2028; + constexpr uint32_t crlf = 0x0D0A; + constexpr uint32_t lf = 0x0A; shared_ptr chatRoom = getChatRoom(); if (!(chatRoom->getCapabilities() & LinphonePrivate::ChatRoom::Capabilities::RealTimeText)) @@ -1056,7 +1080,7 @@ int ChatMessage::putCharacter (uint32_t character) { if (!call || !call->getPrivate()->getMediaStream(LinphoneStreamTypeText)) return -1; - if (character == new_line || character == crlf || character == lf) { + if (character == newLine || character == crlf || character == lf) { shared_ptr core = getCore(); if (lp_config_get_int(core->getCCore()->config, "misc", "store_rtt_messages", 1) == 1) { // TODO: History. diff --git a/src/db/internal/safe-transaction.h b/src/db/internal/safe-transaction.h new file mode 100644 index 000000000..865867110 --- /dev/null +++ b/src/db/internal/safe-transaction.h @@ -0,0 +1,141 @@ +/* + * safe-transaction.h + * Copyright (C) 2010-2018 Belledonne Communications SARL + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _L_SAFE_TRANSACTION_H_ +#define _L_SAFE_TRANSACTION_H_ + +#include + +#include "db/main-db.h" +#include "logger/logger.h" + +// ============================================================================= + +#define L_SAFE_TRANSACTION_C(CONTEXT) \ + LinphonePrivate::SafeTransactionInfo().set(__func__, CONTEXT) * [&]() + +#define L_SAFE_TRANSACTION L_SAFE_TRANSACTION_C(this) + +LINPHONE_BEGIN_NAMESPACE + +struct SafeTransactionInfo { + SafeTransactionInfo &set (const char *_name, const MainDb *_mainDb) { + name = _name; + mainDb = const_cast(_mainDb); + return *this; + } + + const char *name = nullptr; + MainDb *mainDb = nullptr; +}; + +template +class SafeTransaction { + using InternalReturnType = typename std::remove_reference()())>::type; + +public: + using ReturnType = typename std::conditional< + std::is_same::value, + bool, + InternalReturnType + >::type; + + SafeTransaction (SafeTransactionInfo &info, Function function) : mFunction(std::move(function)) { + try { + mResult= exec(); + } catch (const soci::soci_error &e) { + lWarning() << "Catched exception in MainDb::" << info.name << "(" << e.what() << ")."; + soci::soci_error::error_category category = e.get_error_category(); + if ( + (category == soci::soci_error::connection_error || category == soci::soci_error::unknown) && + info.mainDb->forceReconnect() + ) { + try { + mResult = exec(); + } catch (const std::exception &e) { + lError() << "Unable to execute query after reconnect in MainDb::" << info.name << "(" << e.what() << ")."; + } + return; + } + lError() << "Unhandled [" << getErrorCategoryAsString(category) << "] exception in MainDb::" << + info.name << ": `" << e.what() << "`."; + } catch (const std::exception &e) { + lError() << "Unhandled generic exception in MainDb::" << info.name << ": `" << e.what() << "`."; + } + } + + SafeTransaction (SafeTransaction &&safeTransaction) : mFunction(std::move(safeTransaction.mFunction)) {} + + operator ReturnType () const { + return mResult; + } + +private: + // Exec function with no return type. + template + typename std::enable_if::value, bool>::type exec () const { + mFunction(); + return true; + } + + // Exec function with return type. + template + typename std::enable_if::value, T>::type exec () const { + return mFunction(); + } + + static const char *getErrorCategoryAsString (soci::soci_error::error_category category) { + switch (category) { + case soci::soci_error::connection_error: + return "CONNECTION ERROR"; + case soci::soci_error::invalid_statement: + return "INVALID STATEMENT"; + case soci::soci_error::no_privilege: + return "NO PRIVILEGE"; + case soci::soci_error::no_data: + return "NO DATA"; + case soci::soci_error::constraint_violation: + return "CONSTRAINT VIOLATION"; + case soci::soci_error::unknown_transaction_state: + return "UNKNOWN TRANSACTION STATE"; + case soci::soci_error::system_error: + return "SYSTEM ERROR"; + case soci::soci_error::unknown: + return "UNKNOWN"; + } + + // Unreachable. + L_ASSERT(false); + return nullptr; + } + + Function mFunction; + ReturnType mResult{}; + + L_DISABLE_COPY(SafeTransaction); +}; + +template +typename SafeTransaction::ReturnType operator* (SafeTransactionInfo &info, Function &&function) { + return SafeTransaction(info, std::forward(function)); +} + +LINPHONE_END_NAMESPACE + +#endif // ifndef _L_SAFE_TRANSACTION_H_ diff --git a/src/db/internal/statements.cpp b/src/db/internal/statements.cpp new file mode 100644 index 000000000..900c6a927 --- /dev/null +++ b/src/db/internal/statements.cpp @@ -0,0 +1,76 @@ +/* + * statements.cpp + * Copyright (C) 2010-2018 Belledonne Communications SARL + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "statements.h" + +// ============================================================================= + +LINPHONE_BEGIN_NAMESPACE + +namespace Statements { + // --------------------------------------------------------------------------- + // Create statements. + // --------------------------------------------------------------------------- + + constexpr const char *create[CreateCount] = { + [CreateConferenceEventView] = R"( + CREATE TEMP VIEW conference_event_view AS + SELECT id, type, creation_time, chat_room_id, from_sip_address_id, to_sip_address_id, time, imdn_message_id, state, direction, is_secured, notify_id, device_sip_address_id, participant_sip_address_id, subject + FROM event + LEFT JOIN conference_event ON conference_event.event_id = event.id + LEFT JOIN conference_chat_message_event ON conference_chat_message_event.event_id = event.id + LEFT JOIN conference_notified_event ON conference_notified_event.event_id = event.id + LEFT JOIN conference_participant_device_event ON conference_participant_device_event.event_id = event.id + LEFT JOIN conference_participant_event ON conference_participant_event.event_id = event.id + LEFT JOIN conference_subject_event ON conference_subject_event.event_id = event.id + )" + }; + + // --------------------------------------------------------------------------- + // Select statements. + // --------------------------------------------------------------------------- + + constexpr const char *select[SelectCount] = { + [SelectConferenceEvents] = R"( + SELECT conference_event_view.id AS event_id, type, creation_time, from_sip_address.value, to_sip_address.value, time, imdn_message_id, state, direction, is_secured, notify_id, device_sip_address.value, participant_sip_address.value, subject + FROM conference_event_view + LEFT JOIN sip_address AS from_sip_address ON from_sip_address.id = from_sip_address_id + LEFT JOIN sip_address AS to_sip_address ON to_sip_address.id = to_sip_address_id + LEFT JOIN sip_address AS device_sip_address ON device_sip_address.id = device_sip_address_id + LEFT JOIN sip_address AS participant_sip_address ON participant_sip_address.id = participant_sip_address_id + WHERE chat_room_id = :chatRoomId + )" + }; + + // --------------------------------------------------------------------------- + // Getters. + // --------------------------------------------------------------------------- + + const char *get (Create createStmt, AbstractDb::Backend backend) { + (void)backend; + return createStmt >= Create::CreateCount ? nullptr : create[createStmt]; + } + + const char *get (Select selectStmt, AbstractDb::Backend backend) { + (void)backend; + return selectStmt >= Select::SelectCount ? nullptr : select[selectStmt]; + } +} + +LINPHONE_END_NAMESPACE diff --git a/src/db/internal/statements.h b/src/db/internal/statements.h new file mode 100644 index 000000000..e76a4eeea --- /dev/null +++ b/src/db/internal/statements.h @@ -0,0 +1,46 @@ +/* + * statements.h + * Copyright (C) 2010-2018 Belledonne Communications SARL + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _L_STATEMENTS_H_ +#define _L_STATEMENTS_H_ + +#include "db/abstract/abstract-db.h" + +// ============================================================================= + +LINPHONE_BEGIN_NAMESPACE + +namespace Statements { + enum Create { + CreateConferenceEventView, + CreateCount + }; + + enum Select { + SelectConferenceEvents, + SelectCount + }; + + const char *get (Create createStmt, AbstractDb::Backend backend); + const char *get (Select selectStmt, AbstractDb::Backend backend); +} + +LINPHONE_END_NAMESPACE + +#endif // ifndef _L_STATEMENTS_H_ diff --git a/src/db/main-db-p.h b/src/db/main-db-p.h index 81e5535b4..08067eb73 100644 --- a/src/db/main-db-p.h +++ b/src/db/main-db-p.h @@ -103,6 +103,21 @@ private: const ChatRoomId &chatRoomId ) const; + // TODO: Remove me. Workaround to increase fetch performance. + std::shared_ptr selectConferenceChatMessageEvent ( + long long eventId, + EventLog::Type type, + time_t creationTime, + std::shared_ptr &chatRoom, + const std::string &fromSipAddress, + const std::string &toSipAddress, + const tm &messageTime, + const std::string &imdnMessageId, + int state, + int direction, + int isSecured + ) const; + std::shared_ptr selectConferenceParticipantEvent ( long long eventId, EventLog::Type type, diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 5868ba477..38cc9808c 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -36,6 +36,11 @@ #include "main-db-key-p.h" #include "main-db-p.h" +#ifdef SOCI_ENABLED + #include "internal/safe-transaction.h" + #include "internal/statements.h" +#endif // ifdef SOCI_ENABLED + // ============================================================================= // See: http://soci.sourceforge.net/doc/3.2/exchange.html @@ -88,117 +93,6 @@ MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), #ifdef SOCI_ENABLED -// ----------------------------------------------------------------------------- -// Errors handling. -// ----------------------------------------------------------------------------- - -#define L_SAFE_TRANSACTION_C(CONTEXT) \ - LinphonePrivate::SafeTransactionInfo().set(__func__, CONTEXT) * [&]() - -#define L_SAFE_TRANSACTION L_SAFE_TRANSACTION_C(this) - -struct SafeTransactionInfo { - SafeTransactionInfo &set (const char *_name, const MainDb *_mainDb) { - name = _name; - mainDb = const_cast(_mainDb); - return *this; - } - - const char *name = nullptr; - MainDb *mainDb = nullptr; -}; - -template -class SafeTransaction { - using InternalReturnType = typename remove_reference()())>::type; - -public: - using ReturnType = typename std::conditional< - std::is_same::value, - bool, - InternalReturnType - >::type; - - SafeTransaction (SafeTransactionInfo &info, Function function) : mFunction(move(function)) { - try { - mResult= exec(); - } catch (const soci::soci_error &e) { - lWarning() << "Catched exception in MainDb::" << info.name << "(" << e.what() << ")."; - soci::soci_error::error_category category = e.get_error_category(); - if ( - (category == soci::soci_error::connection_error || category == soci::soci_error::unknown) && - info.mainDb->forceReconnect() - ) { - try { - mResult = exec(); - } catch (const exception &e) { - lError() << "Unable to execute query after reconnect in MainDb::" << info.name << "(" << e.what() << ")."; - } - return; - } - lError() << "Unhandled [" << getErrorCategoryAsString(category) << "] exception in MainDb::" << - info.name << ": `" << e.what() << "`."; - } catch (const exception &e) { - lError() << "Unhandled generic exception in MainDb::" << info.name << ": `" << e.what() << "`."; - } - } - - SafeTransaction (SafeTransaction &&safeTransaction) : mFunction(move(safeTransaction.mFunction)) {} - - operator ReturnType () const { - return mResult; - } - -private: - // Exec function with no return type. - template - typename std::enable_if::value, bool>::type exec () const { - mFunction(); - return true; - } - - // Exec function with return type. - template - typename std::enable_if::value, T>::type exec () const { - return mFunction(); - } - - static const char *getErrorCategoryAsString (soci::soci_error::error_category category) { - switch (category) { - case soci::soci_error::connection_error: - return "CONNECTION ERROR"; - case soci::soci_error::invalid_statement: - return "INVALID STATEMENT"; - case soci::soci_error::no_privilege: - return "NO PRIVILEGE"; - case soci::soci_error::no_data: - return "NO DATA"; - case soci::soci_error::constraint_violation: - return "CONSTRAINT VIOLATION"; - case soci::soci_error::unknown_transaction_state: - return "UNKNOWN TRANSACTION STATE"; - case soci::soci_error::system_error: - return "SYSTEM ERROR"; - case soci::soci_error::unknown: - return "UNKNOWN"; - } - - // Unreachable. - L_ASSERT(false); - return nullptr; - } - - Function mFunction; - ReturnType mResult{}; - - L_DISABLE_COPY(SafeTransaction); -}; - -template -typename SafeTransaction::ReturnType operator* (SafeTransactionInfo &info, Function &&function) { - return SafeTransaction(info, forward(function)); -} - // ----------------------------------------------------------------------------- // Soci backend. // ----------------------------------------------------------------------------- @@ -709,13 +603,8 @@ shared_ptr MainDbPrivate::selectConferenceChatMessageEvent ( return nullptr; } - bool hasFileTransferContent = false; - - // 1 - Fetch chat message. shared_ptr chatMessage = getChatMessageFromCache(eventId); - if (chatMessage) - goto end; - { + if (!chatMessage) { string fromSipAddress; string toSipAddress; @@ -737,6 +626,42 @@ shared_ptr MainDbPrivate::selectConferenceChatMessageEvent ( soci::into(messageTime), soci::into(imdnMessageId), soci::into(state), soci::into(direction), soci::into(isSecured), soci::use(eventId); + return selectConferenceChatMessageEvent ( + eventId, + type, + creationTime, + chatRoom, + fromSipAddress, + toSipAddress, + messageTime, + imdnMessageId, + state, + direction, + isSecured + ); + } + + return make_shared( + creationTime, + chatMessage + ); +} + +shared_ptr MainDbPrivate::selectConferenceChatMessageEvent ( + long long eventId, + EventLog::Type type, + time_t creationTime, + shared_ptr &chatRoom, + const string &fromSipAddress, + const string &toSipAddress, + const tm &messageTime, + const string &imdnMessageId, + int state, + int direction, + int isSecured +) const { + shared_ptr chatMessage = getChatMessageFromCache(eventId); + if (!chatMessage) { chatMessage = shared_ptr(new ChatMessage( chatRoom, ChatMessage::Direction(direction) @@ -751,66 +676,13 @@ shared_ptr MainDbPrivate::selectConferenceChatMessageEvent ( dChatMessage->setTime(Utils::getTmAsTimeT(messageTime)); dChatMessage->setImdnMessageId(imdnMessageId); + + dChatMessage->markContentsAsNotLoaded(); + dChatMessage->setIsReadOnly(true); + + cache(chatMessage, eventId); } - // 2 - Fetch contents. - { - soci::session *session = dbSession.getBackendSession(); - static const string query = "SELECT chat_message_content.id, content_type.id, content_type.value, body" - " FROM chat_message_content, content_type" - " WHERE event_id = :eventId AND content_type_id = content_type.id"; - soci::rowset rows = (session->prepare << query, soci::use(eventId)); - for (const auto &row : rows) { - ContentType contentType(row.get(2)); - const long long &contentId = dbSession.resolveId(row, 0); - Content *content; - - if (contentType == ContentType::FileTransfer) { - hasFileTransferContent = true; - content = new FileTransferContent(); - } - else if (contentType.isFile()) { - // 2.1 - Fetch contents' file informations. - string name; - int size; - string path; - - *session << "SELECT name, size, path FROM chat_message_file_content" - " WHERE chat_message_content_id = :contentId", - soci::into(name), soci::into(size), soci::into(path), soci::use(contentId); - - FileContent *fileContent = new FileContent(); - fileContent->setFileName(name); - fileContent->setFileSize(size_t(size)); - fileContent->setFilePath(path); - - content = fileContent; - } else - content = new Content(); - - content->setContentType(contentType); - content->setBody(row.get(3)); - - // 2.2 - Fetch contents' app data. - // TODO: Do not test backend, encapsulate!!! - if (q->getBackend() == MainDb::Backend::Sqlite3) { - soci::blob data(*session); - fetchContentAppData(session, *content, contentId, data); - } else { - string data; - fetchContentAppData(session, *content, contentId, data); - } - chatMessage->addContent(*content); - } - } - - // 3 - Load external body url from body into FileTransferContent if needed. - if (hasFileTransferContent) - chatMessage->getPrivate()->loadFileTransferUrlFromBodyToContent(); - - cache(chatMessage, eventId); - -end: return make_shared( creationTime, chatMessage @@ -1470,7 +1342,9 @@ void MainDbPrivate::importLegacyHistory (DbSession &inDbSession) { void MainDb::init () { L_D(); - const string charset = getBackend() == Mysql ? "DEFAULT CHARSET=utf8" : ""; + Backend backend = getBackend(); + + const string charset = backend == Mysql ? "DEFAULT CHARSET=utf8" : ""; soci::session *session = d->dbSession.getBackendSession(); using namespace placeholders; @@ -1479,6 +1353,13 @@ void MainDb::init () { auto timestampType = bind(&DbSession::timestampType, d->dbSession); auto varcharPrimaryKeyStr = bind(&DbSession::varcharPrimaryKeyStr, d->dbSession, _1); + auto createTableSanitizer = [this](const char *statement) { + // TODO. + string sanitized = statement; + return sanitized; + }; + + // TODO: Migrate all statements in statements.cpp. *session << "CREATE TABLE IF NOT EXISTS sip_address (" " id" + primaryKeyStr("BIGINT UNSIGNED") + "," @@ -1797,6 +1678,9 @@ void MainDb::init () { " ON DELETE CASCADE" ") " + charset; + for (int i = 0; i < int(Statements::CreateCount); ++i) + *session << createTableSanitizer(Statements::get(static_cast(i), backend)); + *session << "CREATE TABLE IF NOT EXISTS db_module_version (" " name" + varcharPrimaryKeyStr(255) + "," @@ -2364,10 +2248,7 @@ list> MainDb::getHistoryRange ( return events; } - string query = "SELECT id, type, creation_time FROM event" - " WHERE id IN (" - " SELECT event_id FROM conference_event WHERE chat_room_id = :chatRoomId" - " )"; + string query = Statements::get(Statements::SelectConferenceEvents, Backend::Sqlite3); query += buildSqlEventFilter({ ConferenceCallFilter, ConferenceChatMessageFilter, ConferenceInfoFilter, ConferenceInfoNoDeviceFilter }, mask, "AND"); @@ -2393,19 +2274,47 @@ list> MainDb::getHistoryRange ( soci::session *session = d->dbSession.getBackendSession(); soci::transaction tr(*session); + shared_ptr core = getCore(); + shared_ptr chatRoom = core->findChatRoom(chatRoomId); + if (!chatRoom) { + lError() << "Unable to find chat room storage id of (peer=" + + chatRoomId.getPeerAddress().asString() + + ", local=" + chatRoomId.getLocalAddress().asString() + "`)."; + return events; + } + const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId); soci::rowset rows = (session->prepare << query, soci::use(dbChatRoomId)); for (const auto &row : rows) { long long eventId = d->dbSession.resolveId(row, 0); shared_ptr event = d->getEventFromCache(eventId); - if (!event) - event = d->selectGenericConferenceEvent( - eventId, - EventLog::Type(row.get(1)), - Utils::getTmAsTimeT(row.get(2)), - chatRoomId - ); + if (!event) { + EventLog::Type type = EventLog::Type(row.get(1)); + + // TODO: Remove me. Performance workaround. + if (type == EventLog::Type::ConferenceChatMessage) + event = d->selectConferenceChatMessageEvent( + eventId, + type, + Utils::getTmAsTimeT(row.get(2)), + chatRoom, + row.get(3), + row.get(4), + row.get(5), + row.get(6), + row.get(7), + row.get(8), + row.get(9) + ); + else + event = d->selectGenericConferenceEvent( + eventId, + type, + Utils::getTmAsTimeT(row.get(2)), + chatRoomId + ); + } if (event) events.push_front(event); @@ -2438,6 +2347,71 @@ int MainDb::getHistorySize (const ChatRoomId &chatRoomId, FilterMask mask) const }; } +void MainDb::loadChatMessageContents (const shared_ptr &chatMessage) { + L_SAFE_TRANSACTION { + L_D(); + + soci::session *session = d->dbSession.getBackendSession(); + soci::transaction tr(*session); + + bool hasFileTransferContent = false; + + ChatMessagePrivate *dChatMessage = chatMessage->getPrivate(); + MainDbKeyPrivate *dEventKey = static_cast(dChatMessage->dbKey).getPrivate(); + const long long &eventId = dEventKey->storageId; + + static const string query = "SELECT chat_message_content.id, content_type.id, content_type.value, body" + " FROM chat_message_content, content_type" + " WHERE event_id = :eventId AND content_type_id = content_type.id"; + soci::rowset rows = (session->prepare << query, soci::use(eventId)); + for (const auto &row : rows) { + ContentType contentType(row.get(2)); + const long long &contentId = d->dbSession.resolveId(row, 0); + Content *content; + + if (contentType == ContentType::FileTransfer) { + hasFileTransferContent = true; + content = new FileTransferContent(); + } else if (contentType.isFile()) { + // 1.1 - Fetch contents' file informations. + string name; + int size; + string path; + + *session << "SELECT name, size, path FROM chat_message_file_content" + " WHERE chat_message_content_id = :contentId", + soci::into(name), soci::into(size), soci::into(path), soci::use(contentId); + + FileContent *fileContent = new FileContent(); + fileContent->setFileName(name); + fileContent->setFileSize(size_t(size)); + fileContent->setFilePath(path); + + content = fileContent; + } else + content = new Content(); + + content->setContentType(contentType); + content->setBody(row.get(3)); + + // 1.2 - Fetch contents' app data. + // TODO: Do not test backend, encapsulate!!! + if (getBackend() == MainDb::Backend::Sqlite3) { + soci::blob data(*session); + fetchContentAppData(session, *content, contentId, data); + } else { + string data; + fetchContentAppData(session, *content, contentId, data); + } + chatMessage->addContent(*content); + } + + // 2 - Load external body url from body into FileTransferContent if needed. + if (hasFileTransferContent) + dChatMessage->loadFileTransferUrlFromBodyToContent(); + }; +} + void MainDb::cleanHistory (const ChatRoomId &chatRoomId, FilterMask mask) { const string query = "SELECT event_id FROM conference_event WHERE chat_room_id = :chatRoomId" + buildSqlEventFilter({ @@ -2949,6 +2923,8 @@ IdentityAddress MainDb::findOneToOneConferenceChatRoomAddress ( return IdentityAddress(); } +void MainDb::loadChatMessageContents (const shared_ptr &) {} + void MainDb::cleanHistory (const ChatRoomId &, FilterMask) {} bool MainDb::import (Backend, const string &) { diff --git a/src/db/main-db.h b/src/db/main-db.h index 6b6c1ee90..a3e7574b1 100644 --- a/src/db/main-db.h +++ b/src/db/main-db.h @@ -125,6 +125,12 @@ public: void cleanHistory (const ChatRoomId &chatRoomId, FilterMask mask = NoFilter); + // --------------------------------------------------------------------------- + // Chat messages. + // --------------------------------------------------------------------------- + + void loadChatMessageContents (const std::shared_ptr &chatMessage); + // --------------------------------------------------------------------------- // Chat rooms. // --------------------------------------------------------------------------- From c7454fa89eb6ff9d7b11920e6e1be6cb989f069a Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 16 Feb 2018 17:38:06 +0100 Subject: [PATCH 085/281] Fix Core::insertChatRoom(). --- src/core/core-chat-room.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/core/core-chat-room.cpp b/src/core/core-chat-room.cpp index ee9cd8a6c..08f5526a9 100644 --- a/src/core/core-chat-room.cpp +++ b/src/core/core-chat-room.cpp @@ -106,11 +106,11 @@ shared_ptr CorePrivate::createClientGroupChatRoom (const strin void CorePrivate::insertChatRoom (const shared_ptr &chatRoom) { L_ASSERT(chatRoom); - L_Q(); - q->deleteChatRoom(chatRoom); - chatRooms.push_back(chatRoom); - chatRoomsById[chatRoom->getChatRoomId()] = chatRoom; + if (!chatRoomsById[chatRoom->getChatRoomId()]) { + chatRooms.push_back(chatRoom); + chatRoomsById[chatRoom->getChatRoomId()] = chatRoom; + } } void CorePrivate::insertChatRoomWithDb (const shared_ptr &chatRoom) { From cb45d54d1af48202019f2ea47a326938d9596b58 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 16 Feb 2018 18:27:39 +0100 Subject: [PATCH 086/281] fix compilation issue (unused parameter this) --- src/db/main-db.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 38cc9808c..7ee859596 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -1353,7 +1353,7 @@ void MainDb::init () { auto timestampType = bind(&DbSession::timestampType, d->dbSession); auto varcharPrimaryKeyStr = bind(&DbSession::varcharPrimaryKeyStr, d->dbSession, _1); - auto createTableSanitizer = [this](const char *statement) { + auto createTableSanitizer = [](const char *statement) { // TODO. string sanitized = statement; return sanitized; From 709dceac26ed3db2a319e2c9e4b3baeac35e6c1e Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Mon, 19 Feb 2018 09:57:59 +0100 Subject: [PATCH 087/281] feat(core): use `other` instead of `src`/obj name on operators and copy constructors (uniform syntax) --- src/address/address.cpp | 22 +++---- src/address/address.h | 10 +-- src/address/identity-address.cpp | 34 +++++----- src/address/identity-address.h | 10 +-- src/chat/chat-room/chat-room-id.cpp | 12 ++-- src/chat/chat-room/chat-room-id.h | 10 +-- src/conference/params/call-session-params.cpp | 10 +-- src/conference/params/call-session-params.h | 4 +- .../params/media-session-params.cpp | 10 +-- src/conference/params/media-session-params.h | 4 +- src/content/content-type.cpp | 24 +++---- src/content/content-type.h | 12 ++-- src/content/content.cpp | 46 ++++++------- src/content/content.h | 10 +-- src/content/file-content.cpp | 58 ++++++++-------- src/content/file-content.h | 10 +-- src/content/file-transfer-content.cpp | 66 +++++++++---------- src/content/file-transfer-content.h | 10 +-- src/db/main-db-key.cpp | 18 ++--- src/db/main-db-key.h | 4 +- src/db/session/db-session.h | 4 +- src/dial-plan/dial-plan.cpp | 26 ++++---- src/dial-plan/dial-plan.h | 4 +- src/object/app-data-container.cpp | 10 +-- src/object/app-data-container.h | 4 +- src/object/clonable-object.h | 10 +-- src/object/property-container.h | 4 +- src/variant/variant.cpp | 36 +++++----- src/variant/variant.h | 20 +++--- 29 files changed, 251 insertions(+), 251 deletions(-) diff --git a/src/address/address.cpp b/src/address/address.cpp index d7e276123..f35893b62 100644 --- a/src/address/address.cpp +++ b/src/address/address.cpp @@ -68,9 +68,9 @@ Address::Address (const IdentityAddress &identityAddress) : ClonableObject(*new d->internalAddress = sal_address_new(L_STRING_TO_C(uri)); } -Address::Address (const Address &src) : ClonableObject(*new AddressPrivate) { +Address::Address (const Address &other) : ClonableObject(*new AddressPrivate) { L_D(); - SalAddress *salAddress = src.getPrivate()->internalAddress; + SalAddress *salAddress = other.getPrivate()->internalAddress; if (salAddress) d->internalAddress = sal_address_clone(salAddress); } @@ -81,28 +81,28 @@ Address::~Address () { sal_address_destroy(d->internalAddress); } -Address &Address::operator= (const Address &src) { +Address &Address::operator= (const Address &other) { L_D(); - if (this != &src) { + if (this != &other) { if (d->internalAddress) sal_address_destroy(d->internalAddress); - SalAddress *salAddress = src.getPrivate()->internalAddress; + SalAddress *salAddress = other.getPrivate()->internalAddress; d->internalAddress = salAddress ? sal_address_clone(salAddress) : nullptr; } return *this; } -bool Address::operator== (const Address &address) const { - return asString() == address.asString(); +bool Address::operator== (const Address &other) const { + return asString() == other.asString(); } -bool Address::operator!= (const Address &address) const { - return !(*this == address); +bool Address::operator!= (const Address &other) const { + return !(*this == other); } -bool Address::operator< (const Address &address) const { - return asString() < address.asString(); +bool Address::operator< (const Address &other) const { + return asString() < other.asString(); } bool Address::isValid () const { diff --git a/src/address/address.h b/src/address/address.h index 875bc2ee9..cccca9ac8 100644 --- a/src/address/address.h +++ b/src/address/address.h @@ -42,15 +42,15 @@ class LINPHONE_PUBLIC Address : public ClonableObject { public: explicit Address (const std::string &address = ""); Address (const IdentityAddress &identityAddress); - Address (const Address &src); + Address (const Address &other); ~Address (); - Address &operator= (const Address &src); + Address &operator= (const Address &other); - bool operator== (const Address &address) const; - bool operator!= (const Address &address) const; + bool operator== (const Address &other) const; + bool operator!= (const Address &other) const; - bool operator< (const Address &address) const; + bool operator< (const Address &other) const; bool isValid () const; diff --git a/src/address/identity-address.cpp b/src/address/identity-address.cpp index 40c6d5511..7dcc480c2 100644 --- a/src/address/identity-address.cpp +++ b/src/address/identity-address.cpp @@ -53,35 +53,35 @@ IdentityAddress::IdentityAddress (const Address &address) : ClonableObject(*new d->gruu = address.getUriParamValue("gr"); } -IdentityAddress::IdentityAddress (const IdentityAddress &src) : ClonableObject(*new IdentityAddressPrivate) { +IdentityAddress::IdentityAddress (const IdentityAddress &other) : ClonableObject(*new IdentityAddressPrivate) { L_D(); - d->scheme = src.getScheme(); - d->username = src.getUsername(); - d->domain = src.getDomain(); - d->gruu = src.getGruu(); + d->scheme = other.getScheme(); + d->username = other.getUsername(); + d->domain = other.getDomain(); + d->gruu = other.getGruu(); } -IdentityAddress &IdentityAddress::operator= (const IdentityAddress &src) { +IdentityAddress &IdentityAddress::operator= (const IdentityAddress &other) { L_D(); - if (this != &src) { - d->scheme = src.getScheme(); - d->username = src.getUsername(); - d->domain = src.getDomain(); - d->gruu = src.getGruu(); + if (this != &other) { + d->scheme = other.getScheme(); + d->username = other.getUsername(); + d->domain = other.getDomain(); + d->gruu = other.getGruu(); } return *this; } -bool IdentityAddress::operator== (const IdentityAddress &address) const { - return asString() == address.asString(); +bool IdentityAddress::operator== (const IdentityAddress &other) const { + return asString() == other.asString(); } -bool IdentityAddress::operator!= (const IdentityAddress &address) const { - return !(*this == address); +bool IdentityAddress::operator!= (const IdentityAddress &other) const { + return !(*this == other); } -bool IdentityAddress::operator< (const IdentityAddress &address) const { - return asString() < address.asString(); +bool IdentityAddress::operator< (const IdentityAddress &other) const { + return asString() < other.asString(); } bool IdentityAddress::isValid () const { diff --git a/src/address/identity-address.h b/src/address/identity-address.h index aefa87c58..58afd9ff4 100644 --- a/src/address/identity-address.h +++ b/src/address/identity-address.h @@ -33,15 +33,15 @@ class LINPHONE_PUBLIC IdentityAddress : public ClonableObject { public: explicit IdentityAddress (const std::string &address = ""); IdentityAddress (const Address &address); - IdentityAddress (const IdentityAddress &src); + IdentityAddress (const IdentityAddress &other); ~IdentityAddress () = default; - IdentityAddress &operator= (const IdentityAddress &src); + IdentityAddress &operator= (const IdentityAddress &other); - bool operator== (const IdentityAddress &address) const; - bool operator!= (const IdentityAddress &address) const; + bool operator== (const IdentityAddress &other) const; + bool operator!= (const IdentityAddress &other) const; - bool operator< (const IdentityAddress &address) const; + bool operator< (const IdentityAddress &other) const; bool isValid () const; diff --git a/src/chat/chat-room/chat-room-id.cpp b/src/chat/chat-room/chat-room-id.cpp index 8ff0b8d35..7b11fd77d 100644 --- a/src/chat/chat-room/chat-room-id.cpp +++ b/src/chat/chat-room/chat-room-id.cpp @@ -48,19 +48,19 @@ ChatRoomId::ChatRoomId ( L_USE_DEFAULT_CLONABLE_OBJECT_SHARED_IMPL(ChatRoomId); -bool ChatRoomId::operator== (const ChatRoomId &chatRoomId) const { +bool ChatRoomId::operator== (const ChatRoomId &other) const { L_D(); - const ChatRoomIdPrivate *dChatRoomId = chatRoomId.getPrivate(); + const ChatRoomIdPrivate *dChatRoomId = other.getPrivate(); return d->peerAddress == dChatRoomId->peerAddress && d->localAddress == dChatRoomId->localAddress; } -bool ChatRoomId::operator!= (const ChatRoomId &chatRoomId) const { - return !(*this == chatRoomId); +bool ChatRoomId::operator!= (const ChatRoomId &other) const { + return !(*this == other); } -bool ChatRoomId::operator< (const ChatRoomId &chatRoomId) const { +bool ChatRoomId::operator< (const ChatRoomId &other) const { L_D(); - const ChatRoomIdPrivate *dChatRoomId = chatRoomId.getPrivate(); + const ChatRoomIdPrivate *dChatRoomId = other.getPrivate(); return d->peerAddress < dChatRoomId->peerAddress || (d->peerAddress == dChatRoomId->peerAddress && d->localAddress < dChatRoomId->localAddress); } diff --git a/src/chat/chat-room/chat-room-id.h b/src/chat/chat-room/chat-room-id.h index e8954b85f..c82dd0da4 100644 --- a/src/chat/chat-room/chat-room-id.h +++ b/src/chat/chat-room/chat-room-id.h @@ -32,14 +32,14 @@ class LINPHONE_PUBLIC ChatRoomId : public ClonableObject { public: ChatRoomId (); ChatRoomId (const IdentityAddress &peerAddress, const IdentityAddress &localAddress); - ChatRoomId (const ChatRoomId &src); + ChatRoomId (const ChatRoomId &other); - ChatRoomId &operator= (const ChatRoomId &src); + ChatRoomId &operator= (const ChatRoomId &other); - bool operator== (const ChatRoomId &chatRoomId) const; - bool operator!= (const ChatRoomId &chatRoomId) const; + bool operator== (const ChatRoomId &other) const; + bool operator!= (const ChatRoomId &other) const; - bool operator< (const ChatRoomId &chatRoomId) const; + bool operator< (const ChatRoomId &other) const; const IdentityAddress &getPeerAddress () const; const IdentityAddress &getLocalAddress () const; diff --git a/src/conference/params/call-session-params.cpp b/src/conference/params/call-session-params.cpp index 2b65ed6a7..4b8a11912 100644 --- a/src/conference/params/call-session-params.cpp +++ b/src/conference/params/call-session-params.cpp @@ -65,10 +65,10 @@ CallSessionParams::CallSessionParams () : ClonableObject(*new CallSessionParamsP CallSessionParams::CallSessionParams (CallSessionParamsPrivate &p) : ClonableObject(p) {} -CallSessionParams::CallSessionParams (const CallSessionParams &src) +CallSessionParams::CallSessionParams (const CallSessionParams &other) : ClonableObject(*new CallSessionParamsPrivate) { L_D(); - d->clone(src.getPrivate()); + d->clone(other.getPrivate()); } CallSessionParams::~CallSessionParams () { @@ -77,10 +77,10 @@ CallSessionParams::~CallSessionParams () { sal_custom_header_free(d->customHeaders); } -CallSessionParams &CallSessionParams::operator= (const CallSessionParams &src) { +CallSessionParams &CallSessionParams::operator= (const CallSessionParams &other) { L_D(); - if (this != &src) - d->clone(src.getPrivate()); + if (this != &other) + d->clone(other.getPrivate()); return *this; } diff --git a/src/conference/params/call-session-params.h b/src/conference/params/call-session-params.h index fd6fb569d..687b77b17 100644 --- a/src/conference/params/call-session-params.h +++ b/src/conference/params/call-session-params.h @@ -40,10 +40,10 @@ class CallSessionParams : public ClonableObject { public: CallSessionParams (); - CallSessionParams (const CallSessionParams &src); + CallSessionParams (const CallSessionParams &other); virtual ~CallSessionParams (); - CallSessionParams &operator= (const CallSessionParams &src); + CallSessionParams &operator= (const CallSessionParams &other); virtual void initDefault (const std::shared_ptr &core); diff --git a/src/conference/params/media-session-params.cpp b/src/conference/params/media-session-params.cpp index 892210de4..680e8385b 100644 --- a/src/conference/params/media-session-params.cpp +++ b/src/conference/params/media-session-params.cpp @@ -203,11 +203,11 @@ MediaSessionParams::MediaSessionParams () : CallSessionParams(*new MediaSessionP memset(d->customSdpMediaAttributes, 0, sizeof(d->customSdpMediaAttributes)); } -MediaSessionParams::MediaSessionParams (const MediaSessionParams &src) +MediaSessionParams::MediaSessionParams (const MediaSessionParams &other) : CallSessionParams(*new MediaSessionParamsPrivate) { L_D(); memset(d->customSdpMediaAttributes, 0, sizeof(d->customSdpMediaAttributes)); - d->clone(src.getPrivate()); + d->clone(other.getPrivate()); } MediaSessionParams::~MediaSessionParams () { @@ -215,10 +215,10 @@ MediaSessionParams::~MediaSessionParams () { d->clean(); } -MediaSessionParams &MediaSessionParams::operator= (const MediaSessionParams &src) { +MediaSessionParams &MediaSessionParams::operator= (const MediaSessionParams &other) { L_D(); - if (this != &src) - d->clone(src.getPrivate()); + if (this != &other) + d->clone(other.getPrivate()); return *this; } diff --git a/src/conference/params/media-session-params.h b/src/conference/params/media-session-params.h index 3f1df29df..80ceff38f 100644 --- a/src/conference/params/media-session-params.h +++ b/src/conference/params/media-session-params.h @@ -38,10 +38,10 @@ class MediaSessionParams : public CallSessionParams { public: MediaSessionParams (); - MediaSessionParams (const MediaSessionParams &src); + MediaSessionParams (const MediaSessionParams &other); virtual ~MediaSessionParams (); - MediaSessionParams &operator= (const MediaSessionParams &src); + MediaSessionParams &operator= (const MediaSessionParams &other); void initDefault (const std::shared_ptr &core) override; diff --git a/src/content/content-type.cpp b/src/content/content-type.cpp index 66b22e7f9..97a0ad488 100644 --- a/src/content/content-type.cpp +++ b/src/content/content-type.cpp @@ -91,26 +91,26 @@ ContentType::ContentType ( setParameter(parameter); } -ContentType::ContentType (const ContentType &src) : ContentType(src.getType(), src.getSubType(), src.getParameter()) {} +ContentType::ContentType (const ContentType &other) : ContentType(other.getType(), other.getSubType(), other.getParameter()) {} -ContentType &ContentType::operator= (const ContentType &src) { - if (this != &src) { - setType(src.getType()); - setSubType(src.getSubType()); - setParameter(src.getParameter()); +ContentType &ContentType::operator= (const ContentType &other) { + if (this != &other) { + setType(other.getType()); + setSubType(other.getSubType()); + setParameter(other.getParameter()); } return *this; } -bool ContentType::operator== (const ContentType &contentType) const { - return getType() == contentType.getType() && - getSubType() == contentType.getSubType() && - getParameter() == contentType.getParameter(); +bool ContentType::operator== (const ContentType &other) const { + return getType() == other.getType() && + getSubType() == other.getSubType() && + getParameter() == other.getParameter(); } -bool ContentType::operator!= (const ContentType &contentType) const { - return !(*this == contentType); +bool ContentType::operator!= (const ContentType &other) const { + return !(*this == other); } const string &ContentType::getType () const { diff --git a/src/content/content-type.h b/src/content/content-type.h index d37168f08..b13063115 100644 --- a/src/content/content-type.h +++ b/src/content/content-type.h @@ -33,17 +33,17 @@ public: explicit ContentType (const std::string &contentType = ""); ContentType (const std::string &type, const std::string &subType); ContentType (const std::string &type, const std::string &subType, const std::string ¶meter); - ContentType (const ContentType &src); + ContentType (const ContentType &other); - ContentType &operator= (const ContentType &src); + ContentType &operator= (const ContentType &other); - bool operator== (const ContentType &contentType) const; - bool operator!= (const ContentType &contentType) const; + bool operator== (const ContentType &other) const; + bool operator!= (const ContentType &other) const; // Delete these operators to prevent putting complicated content-type strings // in the code. Instead define static const ContentType objects below. - bool operator== (const std::string &contentType) const = delete; - bool operator!= (const std::string &contentType) const = delete; + bool operator== (const std::string &other) const = delete; + bool operator!= (const std::string &other) const = delete; bool isEmpty () const; bool isValid () const; diff --git a/src/content/content.cpp b/src/content/content.cpp index 732996494..d1cc14628 100644 --- a/src/content/content.cpp +++ b/src/content/content.cpp @@ -34,18 +34,18 @@ LINPHONE_BEGIN_NAMESPACE Content::Content () : ClonableObject(*new ContentPrivate) {} -Content::Content (const Content &src) : ClonableObject(*new ContentPrivate), AppDataContainer(src) { +Content::Content (const Content &other) : ClonableObject(*new ContentPrivate), AppDataContainer(other) { L_D(); - d->body = src.getBody(); - d->contentType = src.getContentType(); - d->contentDisposition = src.getContentDisposition(); + d->body = other.getBody(); + d->contentType = other.getContentType(); + d->contentDisposition = other.getContentDisposition(); } -Content::Content (Content &&src) : ClonableObject(*new ContentPrivate), AppDataContainer(move(src)) { +Content::Content (Content &&other) : ClonableObject(*new ContentPrivate), AppDataContainer(move(other)) { L_D(); - d->body = move(src.getPrivate()->body); - d->contentType = move(src.getPrivate()->contentType); - d->contentDisposition = move(src.getPrivate()->contentDisposition); + d->body = move(other.getPrivate()->body); + d->contentType = move(other.getPrivate()->contentType); + d->contentDisposition = move(other.getPrivate()->contentDisposition); } Content::Content (ContentPrivate &p) : ClonableObject(p) {} @@ -59,32 +59,32 @@ Content::~Content () { d->body.assign(d->body.size(), 0); } -Content &Content::operator= (const Content &src) { +Content &Content::operator= (const Content &other) { L_D(); - if (this != &src) { - d->body = src.getBody(); - d->contentType = src.getContentType(); - d->contentDisposition = src.getContentDisposition(); - AppDataContainer::operator=(src); + if (this != &other) { + d->body = other.getBody(); + d->contentType = other.getContentType(); + d->contentDisposition = other.getContentDisposition(); + AppDataContainer::operator=(other); } return *this; } -Content &Content::operator= (Content &&src) { +Content &Content::operator= (Content &&other) { L_D(); - d->body = move(src.getPrivate()->body); - d->contentType = move(src.getPrivate()->contentType); - d->contentDisposition = move(src.getPrivate()->contentDisposition); - AppDataContainer::operator=(move(src)); + d->body = move(other.getPrivate()->body); + d->contentType = move(other.getPrivate()->contentType); + d->contentDisposition = move(other.getPrivate()->contentDisposition); + AppDataContainer::operator=(move(other)); return *this; } -bool Content::operator== (const Content &content) const { +bool Content::operator== (const Content &other) const { L_D(); - return d->contentType == content.getContentType() && - d->body == content.getBody() && - d->contentDisposition == content.getContentDisposition(); + return d->contentType == other.getContentType() && + d->body == other.getBody() && + d->contentDisposition == other.getContentDisposition(); } const ContentType &Content::getContentType () const { diff --git a/src/content/content.h b/src/content/content.h index 4885feadf..d639ffe15 100644 --- a/src/content/content.h +++ b/src/content/content.h @@ -37,14 +37,14 @@ class ContentPrivate; class LINPHONE_PUBLIC Content : public ClonableObject, public AppDataContainer { public: Content (); - Content (const Content &src); - Content (Content &&src); + Content (const Content &other); + Content (Content &&other); ~Content (); - Content &operator= (const Content &src); - Content &operator= (Content &&src); + Content &operator= (const Content &other); + Content &operator= (Content &&other); - bool operator== (const Content &content) const; + bool operator== (const Content &other) const; const ContentType &getContentType () const; void setContentType (const ContentType &contentType); diff --git a/src/content/file-content.cpp b/src/content/file-content.cpp index 09de486b6..851d935d3 100644 --- a/src/content/file-content.cpp +++ b/src/content/file-content.cpp @@ -43,52 +43,52 @@ public: FileContent::FileContent () : Content(*new FileContentPrivate) {} -FileContent::FileContent (const FileContent &src) : Content(*new FileContentPrivate) { +FileContent::FileContent (const FileContent &other) : Content(*new FileContentPrivate) { L_D(); - d->fileName = src.getFileName(); - d->filePath = src.getFilePath(); - d->fileSize = src.getFileSize(); - d->fileKey = src.getFileKey(); + d->fileName = other.getFileName(); + d->filePath = other.getFilePath(); + d->fileSize = other.getFileSize(); + d->fileKey = other.getFileKey(); } -FileContent::FileContent (FileContent &&src) : Content(*new FileContentPrivate) { +FileContent::FileContent (FileContent &&other) : Content(*new FileContentPrivate) { L_D(); - d->fileName = move(src.getPrivate()->fileName); - d->filePath = move(src.getPrivate()->filePath); - d->fileSize = move(src.getPrivate()->fileSize); - d->fileKey = move(src.getPrivate()->fileKey); + d->fileName = move(other.getPrivate()->fileName); + d->filePath = move(other.getPrivate()->filePath); + d->fileSize = move(other.getPrivate()->fileSize); + d->fileKey = move(other.getPrivate()->fileKey); } -FileContent &FileContent::operator= (const FileContent &src) { +FileContent &FileContent::operator= (const FileContent &other) { L_D(); - if (this != &src) { - Content::operator=(src); - d->fileName = src.getFileName(); - d->filePath = src.getFilePath(); - d->fileSize = src.getFileSize(); - d->fileKey = src.getFileKey(); + if (this != &other) { + Content::operator=(other); + d->fileName = other.getFileName(); + d->filePath = other.getFilePath(); + d->fileSize = other.getFileSize(); + d->fileKey = other.getFileKey(); } return *this; } -FileContent &FileContent::operator= (FileContent &&src) { +FileContent &FileContent::operator= (FileContent &&other) { L_D(); - Content::operator=(move(src)); - d->fileName = move(src.getPrivate()->fileName); - d->filePath = move(src.getPrivate()->filePath); - d->fileSize = move(src.getPrivate()->fileSize); - d->fileKey = move(src.getPrivate()->fileKey); + Content::operator=(move(other)); + d->fileName = move(other.getPrivate()->fileName); + d->filePath = move(other.getPrivate()->filePath); + d->fileSize = move(other.getPrivate()->fileSize); + d->fileKey = move(other.getPrivate()->fileKey); return *this; } -bool FileContent::operator== (const FileContent &content) const { +bool FileContent::operator== (const FileContent &other) const { L_D(); - return Content::operator==(content) && - d->fileName == content.getFileName() && - d->filePath == content.getFilePath() && - d->fileSize == content.getFileSize() && - d->fileKey == content.getFileKey(); + return Content::operator==(other) && + d->fileName == other.getFileName() && + d->filePath == other.getFilePath() && + d->fileSize == other.getFileSize() && + d->fileKey == other.getFileKey(); } void FileContent::setFileSize (size_t size) { diff --git a/src/content/file-content.h b/src/content/file-content.h index 4876370fb..645fc6312 100644 --- a/src/content/file-content.h +++ b/src/content/file-content.h @@ -31,13 +31,13 @@ class FileContentPrivate; class LINPHONE_PUBLIC FileContent : public Content { public: FileContent (); - FileContent (const FileContent &src); - FileContent (FileContent &&src); + FileContent (const FileContent &other); + FileContent (FileContent &&other); - FileContent &operator= (const FileContent &src); - FileContent &operator= (FileContent &&src); + FileContent &operator= (const FileContent &other); + FileContent &operator= (FileContent &&other); - bool operator== (const FileContent &content) const; + bool operator== (const FileContent &other) const; void setFileSize (size_t size); size_t getFileSize () const; diff --git a/src/content/file-transfer-content.cpp b/src/content/file-transfer-content.cpp index 4ce62bc19..4bc5ed691 100644 --- a/src/content/file-transfer-content.cpp +++ b/src/content/file-transfer-content.cpp @@ -44,56 +44,56 @@ public: FileTransferContent::FileTransferContent () : Content(*new FileTransferContentPrivate) {} -FileTransferContent::FileTransferContent (const FileTransferContent &src) : Content(*new FileTransferContentPrivate) { +FileTransferContent::FileTransferContent (const FileTransferContent &other) : Content(*new FileTransferContentPrivate) { L_D(); - d->fileName = src.getFileName(); - d->fileUrl = src.getFileUrl(); - d->filePath = src.getFilePath(); - d->fileContent = src.getFileContent(); - d->fileSize = src.getFileSize(); + d->fileName = other.getFileName(); + d->fileUrl = other.getFileUrl(); + d->filePath = other.getFilePath(); + d->fileContent = other.getFileContent(); + d->fileSize = other.getFileSize(); } -FileTransferContent::FileTransferContent (FileTransferContent &&src) : Content(*new FileTransferContentPrivate) { +FileTransferContent::FileTransferContent (FileTransferContent &&other) : Content(*new FileTransferContentPrivate) { L_D(); - d->fileName = move(src.getPrivate()->fileName); - d->fileUrl = move(src.getPrivate()->fileUrl); - d->filePath = move(src.getPrivate()->filePath); - d->fileContent = move(src.getPrivate()->fileContent); - d->fileSize = move(src.getPrivate()->fileSize); + d->fileName = move(other.getPrivate()->fileName); + d->fileUrl = move(other.getPrivate()->fileUrl); + d->filePath = move(other.getPrivate()->filePath); + d->fileContent = move(other.getPrivate()->fileContent); + d->fileSize = move(other.getPrivate()->fileSize); } -FileTransferContent &FileTransferContent::operator= (const FileTransferContent &src) { +FileTransferContent &FileTransferContent::operator= (const FileTransferContent &other) { L_D(); - if (this != &src) { - Content::operator=(src); - d->fileName = src.getFileName(); - d->fileUrl = src.getFileUrl(); - d->filePath = src.getFilePath(); - d->fileContent = src.getFileContent(); - d->fileSize = src.getFileSize(); + if (this != &other) { + Content::operator=(other); + d->fileName = other.getFileName(); + d->fileUrl = other.getFileUrl(); + d->filePath = other.getFilePath(); + d->fileContent = other.getFileContent(); + d->fileSize = other.getFileSize(); } return *this; } -FileTransferContent &FileTransferContent::operator= (FileTransferContent &&src) { +FileTransferContent &FileTransferContent::operator= (FileTransferContent &&other) { L_D(); - Content::operator=(move(src)); - d->fileName = move(src.getPrivate()->fileName); - d->fileUrl = move(src.getPrivate()->fileUrl); - d->filePath = move(src.getPrivate()->filePath); - d->fileContent = move(src.getPrivate()->fileContent); - d->fileSize = move(src.getPrivate()->fileSize); + Content::operator=(move(other)); + d->fileName = move(other.getPrivate()->fileName); + d->fileUrl = move(other.getPrivate()->fileUrl); + d->filePath = move(other.getPrivate()->filePath); + d->fileContent = move(other.getPrivate()->fileContent); + d->fileSize = move(other.getPrivate()->fileSize); return *this; } -bool FileTransferContent::operator== (const FileTransferContent &content) const { +bool FileTransferContent::operator== (const FileTransferContent &other) const { L_D(); - return Content::operator==(content) && - d->fileName == content.getFileName() && - d->fileUrl == content.getFileUrl() && - d->filePath == content.getFilePath() && - d->fileSize == content.getFileSize(); + return Content::operator==(other) && + d->fileName == other.getFileName() && + d->fileUrl == other.getFileUrl() && + d->filePath == other.getFilePath() && + d->fileSize == other.getFileSize(); } void FileTransferContent::setFileName (const string &name) { diff --git a/src/content/file-transfer-content.h b/src/content/file-transfer-content.h index 4b668a0ac..59b4cc125 100644 --- a/src/content/file-transfer-content.h +++ b/src/content/file-transfer-content.h @@ -32,13 +32,13 @@ class FileTransferContentPrivate; class LINPHONE_PUBLIC FileTransferContent : public Content { public: FileTransferContent (); - FileTransferContent (const FileTransferContent &src); - FileTransferContent (FileTransferContent &&src); + FileTransferContent (const FileTransferContent &other); + FileTransferContent (FileTransferContent &&other); - FileTransferContent &operator= (const FileTransferContent &src); - FileTransferContent &operator= (FileTransferContent &&src); + FileTransferContent &operator= (const FileTransferContent &other); + FileTransferContent &operator= (FileTransferContent &&other); - bool operator== (const FileTransferContent &content) const; + bool operator== (const FileTransferContent &other) const; void setFileName (const std::string &name); const std::string &getFileName () const; diff --git a/src/db/main-db-key.cpp b/src/db/main-db-key.cpp index 68c0e4451..11557b04b 100644 --- a/src/db/main-db-key.cpp +++ b/src/db/main-db-key.cpp @@ -37,23 +37,23 @@ MainDbKey::MainDbKey (const shared_ptr &core, long long storageId) : MainD d->storageId = storageId; } -MainDbKey::MainDbKey (const MainDbKey &src) : MainDbKey() { +MainDbKey::MainDbKey (const MainDbKey &other) : MainDbKey() { L_D(); - const MainDbKeyPrivate *dSrc = src.getPrivate(); + const MainDbKeyPrivate *dOther = other.getPrivate(); - d->core = dSrc->core; - d->storageId = dSrc->storageId; + d->core = dOther->core; + d->storageId = dOther->storageId; } MainDbKey::~MainDbKey () {} -MainDbKey &MainDbKey::operator= (const MainDbKey &src) { +MainDbKey &MainDbKey::operator= (const MainDbKey &other) { L_D(); - if (this != &src) { - const MainDbKeyPrivate *dSrc = src.getPrivate(); - d->core = dSrc->core; - d->storageId = dSrc->storageId; + if (this != &other) { + const MainDbKeyPrivate *dOther = other.getPrivate(); + d->core = dOther->core; + d->storageId = dOther->storageId; } return *this; diff --git a/src/db/main-db-key.h b/src/db/main-db-key.h index 04b69efc7..bd94582ab 100644 --- a/src/db/main-db-key.h +++ b/src/db/main-db-key.h @@ -36,10 +36,10 @@ class MainDbKey : public ClonableObject { public: MainDbKey (); MainDbKey (const std::shared_ptr &core, long long storageId); - MainDbKey (const MainDbKey &src); + MainDbKey (const MainDbKey &other); virtual ~MainDbKey () = 0; - MainDbKey &operator= (const MainDbKey &src); + MainDbKey &operator= (const MainDbKey &other); bool isValid () const; diff --git a/src/db/session/db-session.h b/src/db/session/db-session.h index 1b27635f6..a94fa7abb 100644 --- a/src/db/session/db-session.h +++ b/src/db/session/db-session.h @@ -45,9 +45,9 @@ class DbSession : public ClonableObject { public: DbSession (); explicit DbSession (const std::string &uri); - DbSession (const DbSession &src); + DbSession (const DbSession &other); - DbSession &operator= (const DbSession &src); + DbSession &operator= (const DbSession &other); operator bool () const; diff --git a/src/dial-plan/dial-plan.cpp b/src/dial-plan/dial-plan.cpp index 5802b7f46..c3b20a49d 100644 --- a/src/dial-plan/dial-plan.cpp +++ b/src/dial-plan/dial-plan.cpp @@ -283,24 +283,24 @@ DialPlan::DialPlan ( d->internationalCallPrefix = icp; } -DialPlan::DialPlan (const DialPlan &src) : ClonableObject(*new DialPlanPrivate) { +DialPlan::DialPlan (const DialPlan &other) : ClonableObject(*new DialPlanPrivate) { L_D(); - d->country = src.getCountry(); - d->isoCountryCode = src.getIsoCountryCode(); - d->countryCallingCode = src.getCountryCallingCode(); - d->nationalNumberLength = src.getNationalNumberLength(); - d->internationalCallPrefix = src.getInternationalCallPrefix(); + d->country = other.getCountry(); + d->isoCountryCode = other.getIsoCountryCode(); + d->countryCallingCode = other.getCountryCallingCode(); + d->nationalNumberLength = other.getNationalNumberLength(); + d->internationalCallPrefix = other.getInternationalCallPrefix(); } -DialPlan &DialPlan::operator= (const DialPlan &src) { +DialPlan &DialPlan::operator= (const DialPlan &other) { L_D(); - if (this != &src) { - d->country = src.getCountry(); - d->isoCountryCode = src.getIsoCountryCode(); - d->countryCallingCode = src.getCountryCallingCode(); - d->nationalNumberLength = src.getNationalNumberLength(); - d->internationalCallPrefix = src.getInternationalCallPrefix(); + if (this != &other) { + d->country = other.getCountry(); + d->isoCountryCode = other.getIsoCountryCode(); + d->countryCallingCode = other.getCountryCallingCode(); + d->nationalNumberLength = other.getNationalNumberLength(); + d->internationalCallPrefix = other.getInternationalCallPrefix(); } return *this; diff --git a/src/dial-plan/dial-plan.h b/src/dial-plan/dial-plan.h index 7ea380251..d944f2e98 100644 --- a/src/dial-plan/dial-plan.h +++ b/src/dial-plan/dial-plan.h @@ -39,9 +39,9 @@ public: int nnl = 0, const std::string &icp = "" ); - DialPlan (const DialPlan &src); + DialPlan (const DialPlan &other); - DialPlan &operator= (const DialPlan &src); + DialPlan &operator= (const DialPlan &other); const std::string &getCountry () const; const std::string &getIsoCountryCode () const; diff --git a/src/object/app-data-container.cpp b/src/object/app-data-container.cpp index 644bbfc0d..b55a5e180 100644 --- a/src/object/app-data-container.cpp +++ b/src/object/app-data-container.cpp @@ -41,19 +41,19 @@ AppDataContainer::AppDataContainer () : mPrivate(new AppDataContainerPrivate) { d->appData = make_shared>(); } -AppDataContainer::AppDataContainer (const AppDataContainer &src) : mPrivate(new AppDataContainerPrivate) { +AppDataContainer::AppDataContainer (const AppDataContainer &other) : mPrivate(new AppDataContainerPrivate) { L_D(); - d->appData = src.getPrivate()->appData; + d->appData = other.getPrivate()->appData; } AppDataContainer::~AppDataContainer () { delete mPrivate; } -AppDataContainer &AppDataContainer::operator= (const AppDataContainer &src) { +AppDataContainer &AppDataContainer::operator= (const AppDataContainer &other) { L_D(); - if (this != &src) - d->appData = src.getPrivate()->appData; + if (this != &other) + d->appData = other.getPrivate()->appData; return *this; } diff --git a/src/object/app-data-container.h b/src/object/app-data-container.h index 7dc87ca6f..05641a004 100644 --- a/src/object/app-data-container.h +++ b/src/object/app-data-container.h @@ -34,10 +34,10 @@ class AppDataContainerPrivate; class LINPHONE_PUBLIC AppDataContainer { public: AppDataContainer (); - AppDataContainer (const AppDataContainer &src); + AppDataContainer (const AppDataContainer &other); virtual ~AppDataContainer (); - AppDataContainer &operator= (const AppDataContainer &src); + AppDataContainer &operator= (const AppDataContainer &other); const std::unordered_map &getAppDataMap () const; diff --git a/src/object/clonable-object.h b/src/object/clonable-object.h index b1951cb7b..0352ce3dd 100644 --- a/src/object/clonable-object.h +++ b/src/object/clonable-object.h @@ -26,12 +26,12 @@ // ============================================================================= #define L_USE_DEFAULT_CLONABLE_OBJECT_SHARED_IMPL(CLASS) \ - CLASS::CLASS (const CLASS &src) : ClonableObject( \ - const_cast::type &>(*src.getPrivate()) \ + CLASS::CLASS (const CLASS &other) : ClonableObject( \ + const_cast::type &>(*other.getPrivate()) \ ) {} \ - CLASS &CLASS::operator= (const CLASS &src) { \ - if (this != &src) \ - setRef(*src.getPrivate()); \ + CLASS &CLASS::operator= (const CLASS &other) { \ + if (this != &other) \ + setRef(*other.getPrivate()); \ return *this; \ } diff --git a/src/object/property-container.h b/src/object/property-container.h index 50e0abc47..53a885ddd 100644 --- a/src/object/property-container.h +++ b/src/object/property-container.h @@ -31,10 +31,10 @@ class PropertyContainerPrivate; class LINPHONE_PUBLIC PropertyContainer { public: PropertyContainer (); - PropertyContainer (const PropertyContainer &src); + PropertyContainer (const PropertyContainer &other); virtual ~PropertyContainer (); - PropertyContainer &operator= (const PropertyContainer &src); + PropertyContainer &operator= (const PropertyContainer &other); Variant getProperty (const std::string &name) const; void setProperty (const std::string &name, const Variant &value); diff --git a/src/variant/variant.cpp b/src/variant/variant.cpp index 75aa69953..6ef1f5992 100644 --- a/src/variant/variant.cpp +++ b/src/variant/variant.cpp @@ -92,27 +92,27 @@ Variant::Variant (Type type) : Variant() { d->setType(type); } -Variant::Variant (const Variant &src) { +Variant::Variant (const Variant &other) { // Don't call placement new. L_ASSERT(!mPrivate); mPrivate = new VariantPrivate(); L_D(); - int type = src.getPrivate()->getType(); + int type = other.getPrivate()->getType(); d->setType(type); - const VariantPrivate::Value &value = src.getPrivate()->value; + const VariantPrivate::Value &value = other.getPrivate()->value; if (type == String) *d->value.str = *value.str; else d->value = value; } -Variant::Variant (Variant &&src) { +Variant::Variant (Variant &&other) { // Don't call placement new. L_ASSERT(!mPrivate); - ::swap(mPrivate, src.mPrivate); + ::swap(mPrivate, other.mPrivate); } Variant::Variant (int value) : Variant(Int) { @@ -188,31 +188,31 @@ Variant::~Variant () { delete d; } -bool Variant::operator!= (const Variant &variant) const { +bool Variant::operator!= (const Variant &other) const { // TODO. return false; } -bool Variant::operator< (const Variant &variant) const { +bool Variant::operator< (const Variant &other) const { // TODO. return false; } -bool Variant::operator<= (const Variant &variant) const { +bool Variant::operator<= (const Variant &other) const { // TODO. return false; } -Variant &Variant::operator= (const Variant &variant) { +Variant &Variant::operator= (const Variant &other) { L_D(); - if (this != &variant) { + if (this != &other) { // Update type. - int type = variant.getPrivate()->getType(); + int type = other.getPrivate()->getType(); d->setType(type); // Update value. - const VariantPrivate::Value &value = variant.getPrivate()->value; + const VariantPrivate::Value &value = other.getPrivate()->value; if (type == String) *d->value.str = *value.str; else @@ -222,22 +222,22 @@ Variant &Variant::operator= (const Variant &variant) { return *this; } -Variant &Variant::operator= (Variant &&variant) { - ::swap(mPrivate, variant.mPrivate); +Variant &Variant::operator= (Variant &&other) { + ::swap(mPrivate, other.mPrivate); return *this; } -bool Variant::operator== (const Variant &variant) const { +bool Variant::operator== (const Variant &other) const { // TODO. return false; } -bool Variant::operator> (const Variant &variant) const { +bool Variant::operator> (const Variant &other) const { // TODO. return false; } -bool Variant::operator>= (const Variant &variant) const { +bool Variant::operator>= (const Variant &other) const { // TODO. return false; } @@ -252,7 +252,7 @@ void Variant::clear () { d->setType(Invalid); } -void Variant::swap (const Variant &variant) { +void Variant::swap (const Variant &other) { // TODO. } diff --git a/src/variant/variant.h b/src/variant/variant.h index 17fb51a35..f22cf8f12 100644 --- a/src/variant/variant.h +++ b/src/variant/variant.h @@ -64,8 +64,8 @@ public: Variant (); Variant (Type type); - Variant (const Variant &src); - Variant (Variant &&src); + Variant (const Variant &other); + Variant (Variant &&other); Variant (int value); Variant (unsigned int value); @@ -87,14 +87,14 @@ public: ~Variant (); - bool operator!= (const Variant &variant) const; - bool operator< (const Variant &variant) const; - bool operator<= (const Variant &variant) const; - Variant &operator= (const Variant &variant); - Variant &operator= (Variant &&variant); - bool operator== (const Variant &variant) const; - bool operator> (const Variant &variant) const; - bool operator>= (const Variant &variant) const; + bool operator!= (const Variant &other) const; + bool operator< (const Variant &other) const; + bool operator<= (const Variant &other) const; + Variant &operator= (const Variant &other); + Variant &operator= (Variant &&other); + bool operator== (const Variant &other) const; + bool operator> (const Variant &other) const; + bool operator>= (const Variant &other) const; template void setValue (const T &value) { From 4383a3dccfa632656ceb049699f93b4396eb0b7f Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Mon, 19 Feb 2018 11:21:47 +0100 Subject: [PATCH 088/281] feat(IdentityAddress): remove useless private file (used only in identity address unit) --- src/CMakeLists.txt | 7 +++--- src/address/identity-address-p.h | 42 -------------------------------- src/address/identity-address.cpp | 14 +++++++++-- 3 files changed, 15 insertions(+), 48 deletions(-) delete mode 100644 src/address/identity-address-p.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fec6de2bf..7af91b837 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -23,7 +23,6 @@ set(LINPHONE_CXX_OBJECTS_PRIVATE_HEADER_FILES address/address-p.h address/address.h - address/identity-address-p.h address/identity-address.h c-wrapper/c-wrapper.h c-wrapper/internal/c-sal.h @@ -93,9 +92,9 @@ set(LINPHONE_CXX_OBJECTS_PRIVATE_HEADER_FILES conference/session/media-session.h conference/session/port-config.h content/content-manager.h + content/content-p.h content/content-type.h content/content.h - content/content-p.h content/file-content.h content/file-transfer-content.h core/core-accessor.h @@ -144,10 +143,10 @@ set(LINPHONE_CXX_OBJECTS_PRIVATE_HEADER_FILES object/property-container.h object/singleton.h sal/sal.h - search/magic-search.h search/magic-search-p.h - search/search-result.h + search/magic-search.h search/search-result-p.h + search/search-result.h utils/background-task.h utils/payload-type-handler.h variant/variant.h diff --git a/src/address/identity-address-p.h b/src/address/identity-address-p.h deleted file mode 100644 index 052bd7965..000000000 --- a/src/address/identity-address-p.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * identity-address-p.h - * Copyright (C) 2010-2018 Belledonne Communications SARL - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef _L_IDENTITY_ADDRESS_P_H_ -#define _L_IDENTITY_ADDRESS_P_H_ - -#include "identity-address.h" -#include "object/clonable-object-p.h" - -// ============================================================================= - -LINPHONE_BEGIN_NAMESPACE - -class IdentityAddressPrivate : public ClonableObjectPrivate { -private: - std::string scheme; - std::string username; - std::string domain; - std::string gruu; - - L_DECLARE_PUBLIC(IdentityAddress); -}; - -LINPHONE_END_NAMESPACE - -#endif // ifndef _L_IDENTITY_ADDRESS_P_H_ diff --git a/src/address/identity-address.cpp b/src/address/identity-address.cpp index 7dcc480c2..f20590e16 100644 --- a/src/address/identity-address.cpp +++ b/src/address/identity-address.cpp @@ -20,10 +20,10 @@ #include "linphone/utils/utils.h" #include "address.h" -#include "identity-address-p.h" #include "c-wrapper/c-wrapper.h" -#include "identity-address-p.h" +#include "identity-address.h" #include "logger/logger.h" +#include "object/clonable-object-p.h" // ============================================================================= @@ -33,6 +33,16 @@ LINPHONE_BEGIN_NAMESPACE // ----------------------------------------------------------------------------- +class IdentityAddressPrivate : public ClonableObjectPrivate { +public: + std::string scheme; + std::string username; + std::string domain; + std::string gruu; +}; + +// ----------------------------------------------------------------------------- + IdentityAddress::IdentityAddress (const string &address) : ClonableObject(*new IdentityAddressPrivate) { L_D(); Address tmpAddress(address); From 12a4259bb92f381c186e1c5203bf859836e305e4 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Mon, 19 Feb 2018 11:48:10 +0100 Subject: [PATCH 089/281] fix(PortConfig): include general --- src/conference/session/port-config.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/conference/session/port-config.h b/src/conference/session/port-config.h index 44da9a6bb..1bebccf13 100644 --- a/src/conference/session/port-config.h +++ b/src/conference/session/port-config.h @@ -22,6 +22,8 @@ #include +#include "linphone/utils/general.h" + // ============================================================================= LINPHONE_BEGIN_NAMESPACE From e12f146b843cbd6dd3e8853a2481b3f3a1f13c9d Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Mon, 19 Feb 2018 12:16:44 +0100 Subject: [PATCH 090/281] fix(MainDb): ConferenceInfoNoDeviceFilter must be equals to a 2-power --- src/db/main-db.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/db/main-db.h b/src/db/main-db.h index a3e7574b1..bace3edec 100644 --- a/src/db/main-db.h +++ b/src/db/main-db.h @@ -51,7 +51,7 @@ public: ConferenceCallFilter = 0x1, ConferenceChatMessageFilter = 0x2, ConferenceInfoFilter = 0x4, - ConferenceInfoNoDeviceFilter = 0x6 + ConferenceInfoNoDeviceFilter = 0x8 }; typedef EnumMask FilterMask; From c300e10f142cb3e8e70a99dc3c94aff584a7ea26 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Mon, 19 Feb 2018 13:55:11 +0100 Subject: [PATCH 091/281] fix(ChatRoom): return chat messages in chat room history --- src/chat/chat-room/chat-room.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/chat/chat-room/chat-room.cpp b/src/chat/chat-room/chat-room.cpp index 7785774c3..f5251497d 100644 --- a/src/chat/chat-room/chat-room.cpp +++ b/src/chat/chat-room/chat-room.cpp @@ -328,11 +328,20 @@ list> ChatRoom::getMessageHistoryRange (int begin, int end) } list> ChatRoom::getHistory (int nLast) const { - return getCore()->getPrivate()->mainDb->getHistory(getChatRoomId(), nLast, MainDb::Filter::ConferenceInfoNoDeviceFilter); + return getCore()->getPrivate()->mainDb->getHistory( + getChatRoomId(), + nLast, + MainDb::FilterMask({ MainDb::Filter::ConferenceChatMessageFilter, MainDb::Filter::ConferenceInfoNoDeviceFilter }) + ); } list> ChatRoom::getHistoryRange (int begin, int end) const { - return getCore()->getPrivate()->mainDb->getHistoryRange(getChatRoomId(), begin, end, MainDb::Filter::ConferenceInfoNoDeviceFilter); + return getCore()->getPrivate()->mainDb->getHistoryRange( + getChatRoomId(), + begin, + end, + MainDb::FilterMask({ MainDb::Filter::ConferenceChatMessageFilter, MainDb::Filter::ConferenceInfoNoDeviceFilter }) + ); } int ChatRoom::getHistorySize () const { From 7eb344cabdde6d82d47e4a17cb429ad6426632ca Mon Sep 17 00:00:00 2001 From: Matthieu Tanon Date: Mon, 19 Feb 2018 16:17:17 +0100 Subject: [PATCH 092/281] Add header to Content and Multipart --- src/content/content-manager.cpp | 12 +++++++++++ src/content/content-p.h | 2 ++ src/content/content.cpp | 37 ++++++++++++++++++++++++++++++--- src/content/content.h | 6 ++++++ 4 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/content/content-manager.cpp b/src/content/content-manager.cpp index fea82b66c..600f57a48 100644 --- a/src/content/content-manager.cpp +++ b/src/content/content-manager.cpp @@ -90,6 +90,18 @@ Content ContentManager::contentListToMultipart (const list &contents) { (void *)body.c_str(), body.length(), nullptr, nullptr ); belle_sip_body_handler_add_header(BELLE_SIP_BODY_HANDLER(mbh), cContentType); + + const list> headers = content.getHeaders(); + for (const auto &header : headers) { + belle_sip_header_t *additionalHeader = BELLE_SIP_HEADER( + belle_sip_header_create( + header.first.c_str(), + header.second.c_str() + ) + ); + belle_sip_body_handler_add_header(BELLE_SIP_BODY_HANDLER(mbh), additionalHeader); + } + belle_sip_multipart_body_handler_add_part(mpbh, BELLE_SIP_BODY_HANDLER(mbh)); } char *desc = belle_sip_object_to_string(mpbh); diff --git a/src/content/content-p.h b/src/content/content-p.h index e67dce5d6..65bdfc439 100644 --- a/src/content/content-p.h +++ b/src/content/content-p.h @@ -21,6 +21,7 @@ #define _L_CONTENT_P_H_ #include +#include #include "content-type.h" #include "content.h" @@ -35,6 +36,7 @@ private: std::vector body; ContentType contentType; std::string contentDisposition; + std::list> headers; L_DECLARE_PUBLIC(Content); }; diff --git a/src/content/content.cpp b/src/content/content.cpp index d1cc14628..bfbbe0511 100644 --- a/src/content/content.cpp +++ b/src/content/content.cpp @@ -21,6 +21,8 @@ #include "linphone/core.h" #include "linphone/utils/utils.h" +#include + #include "content-p.h" #include "content-type.h" @@ -38,7 +40,8 @@ Content::Content (const Content &other) : ClonableObject(*new ContentPrivate), A L_D(); d->body = other.getBody(); d->contentType = other.getContentType(); - d->contentDisposition = other.getContentDisposition(); + d->contentDisposition = other.getContentDisposition();; + d->headers = other.getHeaders(); } Content::Content (Content &&other) : ClonableObject(*new ContentPrivate), AppDataContainer(move(other)) { @@ -46,6 +49,7 @@ Content::Content (Content &&other) : ClonableObject(*new ContentPrivate), AppDat d->body = move(other.getPrivate()->body); d->contentType = move(other.getPrivate()->contentType); d->contentDisposition = move(other.getPrivate()->contentDisposition); + d->headers = other.getHeaders(); } Content::Content (ContentPrivate &p) : ClonableObject(p) {} @@ -66,8 +70,8 @@ Content &Content::operator= (const Content &other) { d->contentType = other.getContentType(); d->contentDisposition = other.getContentDisposition(); AppDataContainer::operator=(other); + d->headers = other.getHeaders(); } - return *this; } @@ -76,6 +80,7 @@ Content &Content::operator= (Content &&other) { d->body = move(other.getPrivate()->body); d->contentType = move(other.getPrivate()->contentType); d->contentDisposition = move(other.getPrivate()->contentDisposition); + d->headers = other.getHeaders(); AppDataContainer::operator=(move(other)); return *this; } @@ -84,7 +89,8 @@ bool Content::operator== (const Content &other) const { L_D(); return d->contentType == other.getContentType() && d->body == other.getBody() && - d->contentDisposition == other.getContentDisposition(); + d->contentDisposition == other.getContentDisposition() && + d->headers == other.getHeaders(); } const ContentType &Content::getContentType () const { @@ -172,6 +178,31 @@ bool Content::isFile () const { return false; } +void Content::addHeader (const string &headerName, const string &headerValue) { + L_D(); + removeHeader(headerName); + d->headers.push_back(make_pair(headerName, headerValue)); +} + +const list> &Content::getHeaders () const { + L_D(); + return d->headers; +} + +void Content::removeHeader (const string &headerName) { + L_D(); + auto it = findHeader(headerName); + if (it != d->headers.cend()) + d->headers.remove(*it); +} + +list>::const_iterator Content::findHeader (const string &headerName) { + L_D(); + return find_if(d->headers.cbegin(), d->headers.cend(), [&headerName](const pair &pair) { + return pair.first == headerName; + }); +} + LinphoneContent *Content::toLinphoneContent () const { LinphoneContent *content = linphone_core_create_content(nullptr); linphone_content_set_type(content, getContentType().getType().c_str()); diff --git a/src/content/content.h b/src/content/content.h index d639ffe15..582589f00 100644 --- a/src/content/content.h +++ b/src/content/content.h @@ -21,6 +21,7 @@ #define _L_CONTENT_H_ #include +#include #include "object/app-data-container.h" #include "object/clonable-object.h" @@ -71,6 +72,11 @@ public: virtual bool isFile () const; + void addHeader (const std::string &headerName, const std::string &headerValue); + const std::list> &getHeaders () const; + void removeHeader (const std::string &headerName); + std::list>::const_iterator findHeader (const std::string &headerName); + // TODO: Remove me later. virtual LinphoneContent *toLinphoneContent () const; From 3ba718de5f92fa2d3d5bb034e28229f92796a675 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 19 Feb 2018 18:05:04 +0100 Subject: [PATCH 093/281] Allow account creator to configure proxy config if no default value was loaded but set by API --- coreapi/account_creator.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/coreapi/account_creator.c b/coreapi/account_creator.c index f114c51cd..5dcbd0c6b 100644 --- a/coreapi/account_creator.c +++ b/coreapi/account_creator.c @@ -91,7 +91,18 @@ static char* _get_identity(const LinphoneAccountCreator *creator) { LinphoneAddress* addr; addr = linphone_proxy_config_normalize_sip_uri(proxy, creator->username ? creator->username : creator->phone_number); - if (addr == NULL) goto end; + if (addr == NULL) { + if (creator->username && creator->domain) { + char *url = ms_strdup_printf("sip:%s@%s", creator->username, creator->domain); + addr = linphone_address_new(url); + ms_free(url); + if (addr == NULL) { + goto end; + } + } else { + goto end; + } + } identity = linphone_address_as_string(addr); linphone_address_unref(addr); From 607c7d92d12aade683e8fed2b45dbea209849e9d Mon Sep 17 00:00:00 2001 From: Wescoeur Date: Tue, 20 Feb 2018 00:39:33 +0100 Subject: [PATCH 094/281] feat(object): add a ClonableSharedPointer component to deal with shared PImpl (main usage: ClonableObject) --- src/CMakeLists.txt | 1 + src/object/clonable-shared-pointer.h | 156 +++++++++++++++++++++++++++ 2 files changed, 157 insertions(+) create mode 100644 src/object/clonable-shared-pointer.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7af91b837..e8736b6ff 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -136,6 +136,7 @@ set(LINPHONE_CXX_OBJECTS_PRIVATE_HEADER_FILES object/base-object.h object/clonable-object-p.h object/clonable-object.h + object/clonable-shared-pointer.h object/object-head-p.h object/object-head.h object/object-p.h diff --git a/src/object/clonable-shared-pointer.h b/src/object/clonable-shared-pointer.h new file mode 100644 index 000000000..52c640d5c --- /dev/null +++ b/src/object/clonable-shared-pointer.h @@ -0,0 +1,156 @@ +/* + * clonable-shared-pointer.h + * Copyright (C) 2010-2018 Belledonne Communications SARL + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _L_CLONABLE_SHARED_POINTER_H_ +#define _L_CLONABLE_SHARED_POINTER_H_ + +#include "linphone/utils/general.h" + +// ============================================================================= + +LINPHONE_BEGIN_NAMESPACE + +class SharedObject { +template +friend class ClonableSharedPointer; + +public: + int getRefCount () { + return mRefCounter; + } + +protected: + SharedObject () : mRefCounter(1) {} + + // Do not use virtual here. Avoid extra storage (little bonus). + ~SharedObject () = default; + +private: + int mRefCounter; + + L_DISABLE_COPY(SharedObject); +}; + +// ----------------------------------------------------------------------------- + +template +class ClonableSharedPointer { + static_assert(std::is_base_of::value, "T must be a inherited class of SharedObject."); + +public: + explicit ClonableSharedPointer (T *pointer = nullptr) : mPointer(pointer) {} + + ClonableSharedPointer (const ClonableSharedPointer &other) : mPointer(other.mPointer) { + ref(); + } + + ClonableSharedPointer (ClonableSharedPointer &&other) : mPointer(other.mPointer) { + other.mPointer = nullptr; + } + + ~ClonableSharedPointer () { + unref(); + } + + ClonableSharedPointer &operator= (const ClonableSharedPointer &other) { + if (mPointer != other.mPointer) { + unref(); + mPointer = other.mPointer; + ref(); + } + return *this; + } + + ClonableSharedPointer &operator= (ClonableSharedPointer &&other) { + std::swap(mPointer, other.mPointer); + return *this; + } + + bool operator== (const ClonableSharedPointer &other) const { + return mPointer == other.mPointer; + } + + bool operator!= (const ClonableSharedPointer &other) const { + return mPointer != other.mPointer; + } + + T &operator* () { + N_ASSERT(mPointer); + tryClone(); + return *mPointer; + } + + const T &operator* () const { + N_ASSERT(mPointer); + return *mPointer; + } + + T *operator-> () { + tryClone(); + return mPointer; + } + + const T *operator-> () const { + return mPointer; + } + + explicit operator bool () const { + return mPointer; + } + + bool operator! () const { + return !mPointer; + } + + T *get () { + return mPointer; + } + + const T *get () const { + return mPointer; + } + +private: + void ref () { + if (mPointer) + ++mPointer->mRefCounter; + } + + void unref () { + if (mPointer && --mPointer->mRefCounter == 0) { + delete mPointer; + mPointer = nullptr; + } + } + + void tryClone () { + if (mPointer && mPointer->mRefCounter > 1) { + T *newPointer = new T(*mPointer); + if (--mPointer->mRefCounter == 0) + delete mPointer; + mPointer = newPointer; + } + } + + T *mPointer; +}; + +LINPHONE_END_NAMESPACE + +#endif // _L_CLONABLE_SHARED_POINTER_H_ From 16558276c068d4363334d20f8ffa83b007632d51 Mon Sep 17 00:00:00 2001 From: Wescoeur Date: Tue, 20 Feb 2018 01:06:26 +0100 Subject: [PATCH 095/281] fix(Content): use move function on headers (copy constructor) --- src/content/content-p.h | 5 +---- src/content/content.cpp | 20 +++++++++++--------- src/content/content.h | 6 +++--- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/content/content-p.h b/src/content/content-p.h index 65bdfc439..bb4daced3 100644 --- a/src/content/content-p.h +++ b/src/content/content-p.h @@ -20,9 +20,6 @@ #ifndef _L_CONTENT_P_H_ #define _L_CONTENT_P_H_ -#include -#include - #include "content-type.h" #include "content.h" #include "object/clonable-object-p.h" @@ -36,7 +33,7 @@ private: std::vector body; ContentType contentType; std::string contentDisposition; - std::list> headers; + std::list> headers; L_DECLARE_PUBLIC(Content); }; diff --git a/src/content/content.cpp b/src/content/content.cpp index bfbbe0511..ffabea95a 100644 --- a/src/content/content.cpp +++ b/src/content/content.cpp @@ -46,10 +46,11 @@ Content::Content (const Content &other) : ClonableObject(*new ContentPrivate), A Content::Content (Content &&other) : ClonableObject(*new ContentPrivate), AppDataContainer(move(other)) { L_D(); - d->body = move(other.getPrivate()->body); - d->contentType = move(other.getPrivate()->contentType); - d->contentDisposition = move(other.getPrivate()->contentDisposition); - d->headers = other.getHeaders(); + ContentPrivate *dOther = other.getPrivate(); + d->body = move(dOther->body); + d->contentType = move(dOther->contentType); + d->contentDisposition = move(dOther->contentDisposition); + d->headers = move(dOther->headers); } Content::Content (ContentPrivate &p) : ClonableObject(p) {} @@ -66,10 +67,10 @@ Content::~Content () { Content &Content::operator= (const Content &other) { L_D(); if (this != &other) { + AppDataContainer::operator=(other); d->body = other.getBody(); d->contentType = other.getContentType(); d->contentDisposition = other.getContentDisposition(); - AppDataContainer::operator=(other); d->headers = other.getHeaders(); } return *this; @@ -77,11 +78,12 @@ Content &Content::operator= (const Content &other) { Content &Content::operator= (Content &&other) { L_D(); - d->body = move(other.getPrivate()->body); - d->contentType = move(other.getPrivate()->contentType); - d->contentDisposition = move(other.getPrivate()->contentDisposition); - d->headers = other.getHeaders(); AppDataContainer::operator=(move(other)); + ContentPrivate *dOther = other.getPrivate(); + d->body = move(dOther->body); + d->contentType = move(dOther->contentType); + d->contentDisposition = move(dOther->contentDisposition); + d->headers = move(dOther->headers); return *this; } diff --git a/src/content/content.h b/src/content/content.h index 582589f00..03fddd7f2 100644 --- a/src/content/content.h +++ b/src/content/content.h @@ -20,8 +20,8 @@ #ifndef _L_CONTENT_H_ #define _L_CONTENT_H_ -#include #include +#include #include "object/app-data-container.h" #include "object/clonable-object.h" @@ -72,10 +72,10 @@ public: virtual bool isFile () const; + const std::list> &getHeaders () const; void addHeader (const std::string &headerName, const std::string &headerValue); - const std::list> &getHeaders () const; void removeHeader (const std::string &headerName); - std::list>::const_iterator findHeader (const std::string &headerName); + std::list>::const_iterator findHeader (const std::string &headerName); // TODO: Remove me later. virtual LinphoneContent *toLinphoneContent () const; From e61718f658e04bf25a132218a0b5b748967cc2cc Mon Sep 17 00:00:00 2001 From: Wescoeur Date: Tue, 20 Feb 2018 01:11:23 +0100 Subject: [PATCH 096/281] fix(Content): findHeader must be const (it is a getter) --- src/content/content.cpp | 10 +++++----- src/content/content.h | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/content/content.cpp b/src/content/content.cpp index ffabea95a..c6c218ea3 100644 --- a/src/content/content.cpp +++ b/src/content/content.cpp @@ -19,9 +19,9 @@ // TODO: Remove me later. #include "linphone/core.h" -#include "linphone/utils/utils.h" -#include +#include "linphone/utils/algorithm.h" +#include "linphone/utils/utils.h" #include "content-p.h" #include "content-type.h" @@ -186,7 +186,7 @@ void Content::addHeader (const string &headerName, const string &headerValue) { d->headers.push_back(make_pair(headerName, headerValue)); } -const list> &Content::getHeaders () const { +const list> &Content::getHeaders () const { L_D(); return d->headers; } @@ -198,9 +198,9 @@ void Content::removeHeader (const string &headerName) { d->headers.remove(*it); } -list>::const_iterator Content::findHeader (const string &headerName) { +list>::const_iterator Content::findHeader (const string &headerName) const { L_D(); - return find_if(d->headers.cbegin(), d->headers.cend(), [&headerName](const pair &pair) { + return findIf(d->headers, [&headerName](const pair &pair) { return pair.first == headerName; }); } diff --git a/src/content/content.h b/src/content/content.h index 03fddd7f2..a74bdd147 100644 --- a/src/content/content.h +++ b/src/content/content.h @@ -75,7 +75,7 @@ public: const std::list> &getHeaders () const; void addHeader (const std::string &headerName, const std::string &headerValue); void removeHeader (const std::string &headerName); - std::list>::const_iterator findHeader (const std::string &headerName); + std::list>::const_iterator findHeader (const std::string &headerName) const; // TODO: Remove me later. virtual LinphoneContent *toLinphoneContent () const; From 28d0c79a81746a3d4506290e5e535f28fae681ea Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 20 Feb 2018 08:37:30 +0100 Subject: [PATCH 097/281] feat(wrapper): add noreturn tog on abort --- src/c-wrapper/internal/c-tools.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/c-wrapper/internal/c-tools.h b/src/c-wrapper/internal/c-tools.h index a54e98c3b..f7d39519a 100644 --- a/src/c-wrapper/internal/c-tools.h +++ b/src/c-wrapper/internal/c-tools.h @@ -155,7 +155,7 @@ private: // Runtime checker. // --------------------------------------------------------------------------- - static inline void abort (const char *message) { + [[noreturn]] static inline void abort (const char *message) { std::cerr << "[FATAL C-WRAPPER]" << message << std::endl; std::terminate(); } From 5cfa0913b7a968494a0906a8ffcc39c190fe00d9 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 20 Feb 2018 08:37:54 +0100 Subject: [PATCH 098/281] feat(Variant): remove other operators --- src/variant/variant.cpp | 30 ------------------------------ src/variant/variant.h | 6 ------ 2 files changed, 36 deletions(-) diff --git a/src/variant/variant.cpp b/src/variant/variant.cpp index 6ef1f5992..a3342c863 100644 --- a/src/variant/variant.cpp +++ b/src/variant/variant.cpp @@ -188,21 +188,6 @@ Variant::~Variant () { delete d; } -bool Variant::operator!= (const Variant &other) const { - // TODO. - return false; -} - -bool Variant::operator< (const Variant &other) const { - // TODO. - return false; -} - -bool Variant::operator<= (const Variant &other) const { - // TODO. - return false; -} - Variant &Variant::operator= (const Variant &other) { L_D(); @@ -227,21 +212,6 @@ Variant &Variant::operator= (Variant &&other) { return *this; } -bool Variant::operator== (const Variant &other) const { - // TODO. - return false; -} - -bool Variant::operator> (const Variant &other) const { - // TODO. - return false; -} - -bool Variant::operator>= (const Variant &other) const { - // TODO. - return false; -} - bool Variant::isValid () const { L_D(); return d->getType() != Invalid; diff --git a/src/variant/variant.h b/src/variant/variant.h index f22cf8f12..5036712d9 100644 --- a/src/variant/variant.h +++ b/src/variant/variant.h @@ -87,14 +87,8 @@ public: ~Variant (); - bool operator!= (const Variant &other) const; - bool operator< (const Variant &other) const; - bool operator<= (const Variant &other) const; Variant &operator= (const Variant &other); Variant &operator= (Variant &&other); - bool operator== (const Variant &other) const; - bool operator> (const Variant &other) const; - bool operator>= (const Variant &other) const; template void setValue (const T &value) { From a124bbef586b5d2951137a56b4221f5e89139567 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 20 Feb 2018 09:34:46 +0100 Subject: [PATCH 099/281] Allow account creator to configure proxy config if no default value was loaded but set by API (2/2) --- coreapi/account_creator.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/coreapi/account_creator.c b/coreapi/account_creator.c index 5dcbd0c6b..d624aaef0 100644 --- a/coreapi/account_creator.c +++ b/coreapi/account_creator.c @@ -150,6 +150,9 @@ LinphoneProxyConfig * linphone_account_creator_create_proxy_config(const Linphon snprintf(buff, sizeof(buff), "%d", dial_prefix_number); linphone_proxy_config_set_dial_prefix(cfg, buff); } + if (linphone_proxy_config_get_server_addr(cfg) == NULL && creator->domain != NULL) { + linphone_proxy_config_set_server_addr(cfg, creator->domain); + } linphone_proxy_config_enable_register(cfg, TRUE); From 25d8ff142d7368f1673a2d854b4c5bf691acb431 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 20 Feb 2018 10:32:49 +0100 Subject: [PATCH 100/281] Improve loading of chat rooms. --- src/core/core-chat-room.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/core/core-chat-room.cpp b/src/core/core-chat-room.cpp index 08f5526a9..745a3944d 100644 --- a/src/core/core-chat-room.cpp +++ b/src/core/core-chat-room.cpp @@ -106,11 +106,9 @@ shared_ptr CorePrivate::createClientGroupChatRoom (const strin void CorePrivate::insertChatRoom (const shared_ptr &chatRoom) { L_ASSERT(chatRoom); - - if (!chatRoomsById[chatRoom->getChatRoomId()]) { - chatRooms.push_back(chatRoom); - chatRoomsById[chatRoom->getChatRoomId()] = chatRoom; - } + L_ASSERT(!chatRoomsById[chatRoom->getChatRoomId()]); + chatRooms.push_back(chatRoom); + chatRoomsById[chatRoom->getChatRoomId()] = chatRoom; } void CorePrivate::insertChatRoomWithDb (const shared_ptr &chatRoom) { @@ -119,6 +117,8 @@ void CorePrivate::insertChatRoomWithDb (const shared_ptr &chat } void CorePrivate::loadChatRooms () { + chatRooms.clear(); + chatRoomsById.clear(); for (auto &chatRoom : mainDb->getChatRooms()) insertChatRoom(chatRoom); } From 1b5e00e705ba332403f451c3aa425a952e5fd3fd Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 20 Feb 2018 12:05:59 +0100 Subject: [PATCH 101/281] Fix assert when inserting a chat room in DB. --- src/core/core-chat-room.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/core/core-chat-room.cpp b/src/core/core-chat-room.cpp index 745a3944d..e9bc24996 100644 --- a/src/core/core-chat-room.cpp +++ b/src/core/core-chat-room.cpp @@ -106,9 +106,13 @@ shared_ptr CorePrivate::createClientGroupChatRoom (const strin void CorePrivate::insertChatRoom (const shared_ptr &chatRoom) { L_ASSERT(chatRoom); - L_ASSERT(!chatRoomsById[chatRoom->getChatRoomId()]); - chatRooms.push_back(chatRoom); - chatRoomsById[chatRoom->getChatRoomId()] = chatRoom; + L_ASSERT(!chatRoomsById[chatRoom->getChatRoomId()] + || (chatRoomsById[chatRoom->getChatRoomId()] == chatRoom) + ); + if (!chatRoomsById[chatRoom->getChatRoomId()]) { + chatRooms.push_back(chatRoom); + chatRoomsById[chatRoom->getChatRoomId()] = chatRoom; + } } void CorePrivate::insertChatRoomWithDb (const shared_ptr &chatRoom) { From 3d0c30e568d1524d9ee5663366852e4d4bff700a Mon Sep 17 00:00:00 2001 From: Erwan Croze Date: Tue, 20 Feb 2018 12:00:25 +0100 Subject: [PATCH 102/281] Fixing searching cache --- include/linphone/api/c-magic-search.h | 5 +++ src/search/magic-search.cpp | 46 ++++++++++++++++++--------- src/search/magic-search.h | 5 ++- 3 files changed, 40 insertions(+), 16 deletions(-) diff --git a/include/linphone/api/c-magic-search.h b/include/linphone/api/c-magic-search.h index a26f6e7fc..72d68029c 100644 --- a/include/linphone/api/c-magic-search.h +++ b/include/linphone/api/c-magic-search.h @@ -120,8 +120,13 @@ LINPHONE_PUBLIC void linphone_magic_search_reset_search_cache(LinphoneMagicSearc /** * Create a sorted list of SearchResult from SipUri, Contact name, * Contact displayname, Contact phone number, which match with a filter word + * During the first search, a cache is created and used for the next search and so on + * Use linphone_magic_search_reset_search_cache() to begin a new search * @param[in] filter word we search * @param[in] withDomain domain which we want to search only + * - "" for searching in all contact + * - "*" for searching in contact with sip SipUri + * - "yourdomain" for searching in contact from "yourdomain" domain * @return sorted list of \bctbx_list{LinphoneSearchResult} **/ LINPHONE_PUBLIC bctbx_list_t* linphone_magic_search_get_contact_list_from_filter(LinphoneMagicSearch *magicSearch, const char *filter, const char *withDomain); diff --git a/src/search/magic-search.cpp b/src/search/magic-search.cpp index 663877665..df23ef61c 100644 --- a/src/search/magic-search.cpp +++ b/src/search/magic-search.cpp @@ -35,7 +35,7 @@ MagicSearch::MagicSearch(const std::shared_ptr &core) : CoreAccessor(core) L_D(); d->mMinWeight = 0; d->mMaxWeight = 1000; - d->mSearchLimit = 10; + d->mSearchLimit = 30; d->mLimitedSearch = true; d->mDelimiter = "+_-"; d->mUseDelimiter = true; @@ -119,7 +119,10 @@ list MagicSearch::getContactListFromFilter(const string &filter, c if (filter.empty()) return list(); - if (getSearchCache() != nullptr) { + // We begin a new search if the last result size is superior or equal of the search limit size + if (getSearchCache() != nullptr && + (getLimitedSearch() && getSearchLimit() > getSearchCache()->size()) + ) { resultList = continueSearch(filter, withDomain); } else { resultList = beginNewSearch(filter, withDomain); @@ -186,36 +189,49 @@ list *MagicSearch::continueSearch(const string &filter, const stri SearchResult MagicSearch::search(const LinphoneFriend* lFriend, const string &filter, const string &withDomain) { unsigned int weight = getMinWeight(); const LinphoneAddress* lAddress = linphone_friend_get_address(lFriend); + bool allDomain = !withDomain.empty() && withDomain.compare("*") == 0; - if (lAddress == nullptr) return SearchResult(weight, nullptr); + if (allDomain && + lAddress == nullptr && + linphone_friend_get_presence_model(lFriend) == nullptr + ) return SearchResult(weight, nullptr); // Check domain - if (!withDomain.empty() && + if (!allDomain && + !withDomain.empty() && + lAddress != nullptr && withDomain.compare(linphone_address_get_domain(lAddress)) != 0 ) return SearchResult(weight, nullptr); + if (lAddress != nullptr) { + // SIPURI + if (linphone_address_get_username(lAddress) != nullptr) { + weight += getWeight(linphone_address_get_username(lAddress), filter); + } + // DISPLAYNAME + if (linphone_address_get_display_name(lAddress) != nullptr) { + weight += getWeight(linphone_address_get_display_name(lAddress), filter); + } + } + // NAME if (linphone_friend_get_name(lFriend) != nullptr) { weight += getWeight(linphone_friend_get_name(lFriend), filter); } // PHONE NUMBER - bctbx_list_t *phoneNumbers = linphone_friend_get_phone_numbers(lFriend); + bctbx_list_t *begin, *phoneNumbers = linphone_friend_get_phone_numbers(lFriend); + begin = phoneNumbers; while (phoneNumbers != nullptr && phoneNumbers->data != nullptr) { string number = static_cast(phoneNumbers->data); + const LinphonePresenceModel *presence = linphone_friend_get_presence_model_for_uri_or_tel(lFriend, number.c_str()); weight += getWeight(number, filter); + if (presence != nullptr) { + weight += getWeight(linphone_presence_model_get_contact(presence), filter); + } phoneNumbers = phoneNumbers->next; } - - // SIPURI - if (linphone_address_get_username(lAddress) != nullptr) { - weight += getWeight(linphone_address_get_username(lAddress), filter); - } - - // DISPLAYNAME - if (linphone_address_get_display_name(lAddress) != nullptr) { - weight += getWeight(linphone_address_get_display_name(lAddress), filter); - } + if (begin) bctbx_list_free(begin); return SearchResult(weight, lAddress, lFriend); } diff --git a/src/search/magic-search.h b/src/search/magic-search.h index c3f901ffc..e360ea249 100644 --- a/src/search/magic-search.h +++ b/src/search/magic-search.h @@ -116,7 +116,10 @@ public: * During the first search, a cache is created and used for the next search and so on * Use resetSearchCache() to begin a new search * @param[in] filter word we search - * @param[in] withDomain domain which we want to search only + * @param[in] withDomain + * - "" for searching in all contact + * - "*" for searching in contact with sip SipUri + * - "yourdomain" for searching in contact from "yourdomain" domain * @return sorted list of SearchResult with "filter" or an empty list if "filter" is empty **/ std::list getContactListFromFilter(const std::string &filter, const std::string &withDomain = ""); From af5f102e3ee1a4d179480281edcfebb781380429 Mon Sep 17 00:00:00 2001 From: Erwan Croze Date: Tue, 20 Feb 2018 12:09:11 +0100 Subject: [PATCH 103/281] Adding new tests for magic search --- tester/db/friends.db | Bin 0 -> 5749760 bytes tester/setup_tester.c | 161 ++++++++++++++++++++++++++++++++++-------- 2 files changed, 131 insertions(+), 30 deletions(-) create mode 100644 tester/db/friends.db diff --git a/tester/db/friends.db b/tester/db/friends.db new file mode 100644 index 0000000000000000000000000000000000000000..20fd191ea6cf396b0b6f8b7e7470a07fdc917971 GIT binary patch literal 5749760 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 z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNA}q6=);&=9{H3^x3!{#<{lzYYc)`|-ve+t`0>+*Etip0!u)UHjBY>ZG-~ zw$#3LvO0O4qE1<-s#Di#>a=yb+OJMuXQ(sQnd;1SmO5*lt@f|8*E#B(b*?&hou|%Q z=d1JA1?qxzp<1g0>cTawQH^U-)0)-17PYKZU8F8r7psfcCF+uOV12PJRhO>I)Me|S zx?Ekpu25I3E7g_jDs|PmT3x-aQP-?%)wS#3x=vlUu2Ah`N0pSv%{fI=b#qcdR?ro$D@j*ScHXz3x%> ztb5flb?>@Q-M8*n_pb-k1M5Nc;Ce_sv>sN+*2C)&^~icuJ-QxKkFCemx_t*6z~>lyXTdR9HVo>R}Q=hgG;1@*#uQN6fcQZKES)ywM@^~!oxy}DjgudUbB z>+22m#(Gn|x!zK5t+x#Zo7S)6+v^?m&U#n9yWUgpt@qXY>$v(reXu@MAFhwo@%7RA zSbe-cQJ<_&)u-z-_1XGdeZIa>U#c(HSL&bv#5`hNYOepo-M zAJ2E(oxd(n7px1_S{+aqu3?R8 zT$7sCTWePHTGX;ub&hg7kx?)|au3T5GtJT%( z8gw0zlx(L+YXRusXILUXQ3p)}!jt^_Y5WJ+2;KPpBu>lj_O!lzM7Ct)5=bsAtx*>e=<2 zdTu?hon-)R zdV9U2-dXRech`IBz4g9&e;rpJs1MeM>cjPsI=((yAFGeoC+d^+srqz%raoJrtIyXL z>WlTI`f`1xzFJ?auh%!~o6UFKHq^%2 zRQ+I&J!`MpyY{J*)Jbb|ZK-|hWOed7MV+!vRj01g)M@Ks)p2I!~Rq&R6HJ3)BVcLbX;Gu3?R8T$7sCtmd_-Wv%KWb{{o>k4(nx>8-au2NU6tJT%(8gw0zlxmGH_x>p@j_pbZYed~U8|9U_@upU$ou7}h^>tS_lJ-i-K zkE}=4qw6vC*m_(&zMfD|tS8lz>nZirdRjfBo>|YTXV-J;x%Iqye!ZYxSTCv<*GuZ9 z^|E?-y`o-Ouc}wqYwET2x_W)Rq25?;syEkL>aF#*dV9U2-dXRech`IBz4g9&e;rpJ zs1MeM>cjPsI=((yAFGeoC+d^+srqz%raoJrtIyXL>WlTI`f`1xzFJ?auh%!~oAs^w z_P_@L0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1Wt5;O+RXg-wg(Pe7C+=->)Ck539%a_;LNDep)}P zpVu$ymxIBc$Mp4A_3Qdg{kGPR_51om{jvU3f3CmOUwci%?YW^g)~4E{`r)2?)!wyF zoup1$n`=w$TPLfN*D32%b?Q1zowiO_`_<{|40XmjQ=PfaQfIBR)&6z%I!B$e&Q<5G z^VE6ke0Bc1KwYpdRBLrWUATrds&P$fTCoRrO zI;bvJm#-_-73)fM<+@5;wXRlIuWQsb>soc~I=HS=*RAW-_3H+8!@5!3xNcH6twZW& zb!gqZZc&HT*1Bcgs%~A|s_VPwZR)mlc-^kH*N!@(ZeK^%&N`}&t~=Bn>rQp&x=Y=) z?pAlNd(=JaUUl!fPu;ifSNE?6)C225_27C)J+vNH$JWE^5%tJ=R6V*LQ;)63)#K|4 z^~8EoJ-MDzPpzlb)9V@a%z9QmyPi|et>@MA>jm|~dQrW&UQ#cum(|Pb74^z`RlT}i zQ?ISp)$8jG^~QQry}8~}Z>_i0+v^?m&U#n9yWUgpt@qXY>$v(reXu@MAFhwo@%7RA zSbe-cQJ<_&)u-z-_1XGdeZIa>U#u?;27BG2uU{VcAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfWUvdz#iXe$lnbH zdw#XPR$s4g)Hmx}_3i38dw#dRSKqH6)DP=N_2c?U{j`2oKd)cbuj<$JoBD07kMaBZ zL;bP-RDZ6&)L#dKy*iD(Hq^%2RD0B()dPF&UHjBY>ZG-~w$#3LvO0O4qE1<-s#Di# z>a=yb+OJMupQ+4)~YU27p;rc#p@Dv$vUtuRhO>I)Me|Sx?Ekpu25I3E7g_jDs|Pm zT3x-aQP-?%)wS#3x=vlUu2Ah`N0pSv%{fI=b#qcdR?ro$D@j*ScHXz3x%>tb5flb?>@Q-M8*n_pb-k z1M5Nc;Ce_sv>sN+*2C)&^~icuJ-QxKkFCemx_t*6z~>lyXTdR9HV zo>R}Q=hgG;1@*#uQN4ID*n9o@yrf=QFRPc=E9#Z?s(N+3re0gGtJl{X>W%fLdUL&{ z-db;~x7R!Bo%ODIcfF_HTkos)*KzfM`e1#iK3pHE7fa zx9Z#Vo%(KlufAVDs2|pk>c{ny`f2^FeqO(*U)Hbc*Y%tFZ8iR0zpp>kAL~!`=lVWD{>1w|^eVw7s zSZAs;*IDYUb++2S&R*xJbJn@)+;yHh?_jW{*KX+;TRPU3j=7~{Z)uDzjkTpQw>0*a z&S6XEvZZs{(z$Kv9Jh3?TRP`0jk~3JY-wIwn$wo%xuyB_l);wfyE%s~&3|()oAcP5 z)8>3O=e9Yo%{gw)Z*#Vr^W2>E=8QLIzd7^GU5m|KgUwx=&0UktU8~Jqqs`x~uG!|U z<>s#8=C1AL?^M@%bJuut*M4)?d~<7Ib8BF8Yh!b3V)N&#HM04$^@aL$eXc%PpQ(@6 zr|P5iiTX%=tUgr7*9Ypu_5Q)&q%Uu7UAxU6tmEo^_1=0$UZodUd_3URkfG^>JD!n_pTls+ZIY>c#cEdSN}Mo?p+Z=hido+4Zz~ zW<8~zUQep0))VT<^|*RsJ*FOCkE+Mk!|T!YuzEy2q>ilz)kEt6_29Z+J+SUm_pf8> zzID&Kcip}2Rd=m>)Sc^Yb;r6(9aVR#BkSloqITByx_uo!`2YCWx1aAl_~u~Kv764a z@x>cg8{WU+I(^$~PP~s!^1t(A$ML-#>~qYX`|NY0hTUi9wj(Ywo{h%K)p9XkjA!%d zcrjfJ*G7}kWVskl7vuSSwVX|-i^YLG_khEnVliH4GW7iQU^Vwq5Y?hM~PINL|OxD(i8_y@R&So*~P}9+Jw-M*_P{*C_XtUxjyN67C)3$zwV16Y^F?R19IbVAro+{EI`5(3aP{wA z$H^+r=F;Qijy_*ZS8J2WYPnp_Cd=_;IqG^2hl}mUZ(JX7(?6}8<$OGyjE3XYY?b}8 zr7}*ZX*W)`39LH8Zc|(?mYru$pSA2-G0W+At&>=-W{Y{#Ukr0<_B)Q>uSux>wz&?or3o-Rhoom+E=@ z+^Ozbcc?qpQFX^UvW~7DwX<$lN7QX=du^-3>sED}+FG}+ThuM<&^oLRshihL>SlGL zx@p~@Zd})^8`i;f{km3Nr>;@guB+8G>ne5Kx^i8;u2@&C%h#3apt?d`W-vI-`TP3t zx?EkhE?t+Z1M8A?iMn`QtS(v?sZ}j&QS+MBv?evKQ4QFZ2&x;jIhruM5-)oJS#b?Q1+EjbhhT3B=*!!=2-PqSZ_jSudGR`pRH%+I61`_TOKxuhy6AOZCP2LVdnISD&rV z)TirH^~w4~eXKrO$Ja+X)&=_dp}yX}uOF=U*9YpobzHr>-dFFe_te|#UG>&_N4>e; zR&T7g)a&a__1bzvy}DjkudLV9%j;G3(t1U`xL#H-te4dD>P7XOdODm^_Y5m^V-ta$JQh3(RFM+svcU8s0Y`>20jQ7AV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72>c)R?mgbqx#0Kz_j`RE##x$?F_v^F9to8kTuIqUn{nJf=009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PJ`g1U7tErhc+g+2GXlzH~}@Z_3|q@Sb#1dUu+dPEJ!QmGyt0?=#Xn z({MU5osiy$?4d1OgcIpmEN9?Om9n*(p%FJ=`HE-bXfXuIy4=UCZ;#1H>Cs9 zLFs_>#UV3Tj zq<(6pZfc}<+ATHHP^zbwq+QdC(=O>nY3KC9G%md$eJSmbc1qi)9n-ey`RRFSyY$?& zO?pn+I*mzNrDvxt)3eg(v{~9BZIU)m8|8R>J>L&bo2HG^hG~N|Dy^T^OY5d}QY{s! znsVqz{WU$4{*s5=qkdN}m41@$NIy=ur#sUR(vQ;j({1VIbZc6jZb>WCni!Nn zUzL`oDl zpRP&QrEjEbQ;x;@pU(Hk($(pzbY=Qlx*~lwU7o&@E=yldm!>bJOVSt9#pw&_qV)N6 zVftLUAbmESpFWe$ODoc+(%I>pbXNLgIx~GDeKdVM2ig|_0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkL{KS*GsQ?l@rmCAW`WG$p+=osfpp@#(}gIlUttla5PoPsgUWrK8eY(~;>dX;L~Y9gz-6ho?8E zL(`km#Pr5=aC$>JD7`)%m|m9-NUu%%r`M$Y(yP3M0(^xQN$Jtu9E#-z>Dv(u*OS!v_6S=umdl18PC(t2rw zv`$(-6=~h<+h6m&mhXSb_Z;30{+ymke@aiMKc=VBA5xC}2ER{Fq~E2-({Iyb={M=o z^y~CU`c-;3{W3k2?oSV<`_eDcz3J!ap7gVHcX}ZGIQ=x;nSPRflAUIr^qq8F`gXcDeJfp^zL~B{*Q6`cH_{d9>*@0JwRBnfYPvLi zC4Dh{Iej5rl0KgC@@_^r>`S`eZsceIlKcKAz4_A4_MYkEAox z8R?_x1L;HQ^z^}WTE!Ou0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF{D%sxTijbYvU*ImVayS=r)rPa9;rQ8yRUY4 z?e^L&wH38RwK=tEwHs>J)~>8wT)UulZtbkvhij+TPN_|;9bY@Dc0_Gr?ZDc8wS9`a zirb1c#j;{SF{`+#xW2f$xT3hUxTrY4IHx$XIHNeNcvmr{m|PrL99|q;98m0A>|N|x z^owS(OR-Ziw%EEDU2Iy6DvIjU)hDWtRv)U~U%jV#NA=d~s_K&Jyy}eVjn(U_S5+^s zUQ)fVdS3PH>PM>|sGeFqsd_^7nA-T-?zMJp*V?$+4z+D+Th=zOZCG2Uc&2!=c&vE1 zc%Znqc3E{&_0Z};)%~jzs(V%UsCKLM>dw_2tJ_t#s%}x;`0oed(0|pz7&CFvsWE=@ zqNy1VUNkx5L5n73eB+{t84p}^K*l#Lnvn5;MdLHReo;T;{)_4vU$pL(dHRnvuISt35&APV_v{=!Pe-hy)e?t*gu&Vq9O_JVT$ z=?lvFTMNqhn+wYM8w0%-)%uT|E>$l`G*#a&A7{ga{iYrDCggKK{@}p1(l31 znqSVp)BJM&7tSx|-*Nt=j4zm9&cDO_a{lMfFXtaSznp*j`Q`lE%`fNQc78ekHuJ}3 zeBS(W{;lVi^FMd~sM=+feCB`0*O<2~F6TddaXJ5Ci_7^BT|6q|A&WEpn62iQ<8$Vn zTB(fw)V!(r^Oo}_XB;zcQpVBqCT4v0yaO_BF)v#*=2`Q`XWV>VKjUWe>KQkkH!kDG z^TuY}XkNL>hV!yYWxZ4xv%$P_tx@yJKd(PGtBhH1Zn?_3bIVoMnL88qUYYhxuSk2Om#5v+%ThnRGR*nnm_NG@_oan>B>g5moPM1-x5)R0(y!8k>6hsj>ArM-x;Oni-IIQn z?oK~Vccq`CJJOHS?di^RTl!JDHT^K%l75iZr0=Iy>E^T|txikR%CtBwOAFJIG(Rm$ zbJKz}JI$+9HYopYPMV%(rthU0>APuK`cC#~DBo{LH>K;-jp>`|+v%EgUHV44Hhn!^ zoxYZ?N?%P^rmv(c(wEca=}YOd^u=t$*nEE=U79XQ7pE_zi_+)Qh3RwYg7n#Re)>#0 zFMT?ln?9A!NuNw-r%$A_(#O-8>0{}mX;%7B`an7(ot{3JPD}4kr>6I%Q__1Yz6cN? zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72>cTQo8))as~%jb9$Y)OwoP$OF{m!9JWzS}Kk?E3m0zj8 z@qgvh|LH$Fyk^wKl~EsBchsoEvaO>|K5pvny?(#j8ng$UL9^W+G&yM?eY2DT~9b}%GAljQ;yzs_@rZ-gF&y;Z#R1VcE8i^4eIsYP_H}a4m$Z< zr`M==2lZyNGiA*t<%+fc&x-v{zuWEB8=XP7-|n^hgH~&(-Rd+O?R;v`YG;yc(TD}x zoo>I`YxEo4Mz22TGzZ=0P^;N(WsX+A)onEg&3?V!9bU8X+Pjz)n%zNvFc|dvjaIwf zYV?O%^-j0l?bln`;X%DOX!n}`&WeM2Cm(3_>-|Btv(al0wd?g}uifbOTFrW=-5Cs8 z^(kvM`umE9{5RBQz1h#EwelPNR;$ryb~{7e=AhH4x9ZuJc4IKe93%I!QLi`J^=|$z z3pV?mMt7*!>(%?+PS&sY`kh{<)o%>1*>LS$%#msh;+mf~JKcIdGZ^X(2Fi=IH!C)CP+IL?uhng5gZqPi{XhMs zWCIBhAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBoLrv=t6?yVeIy)eH&WiyMws&`axt*)vrsm`m;sNPt;u6kAV^6Dkk3)kNA;<4i4;(_Ac z+GW*A)kCWXRrjw>sP0wWquQ<3t2RiU{%@@)=f7^nxQyRiQO%WiziN3o|JRq7^Iy4qa>lPMFXz8vc{%@AmzVQjzI;N)uPiU;zifFq|Cg7S z^Iy8Woc~M9%lR)^Ue5o;<>mZeSUxJ_Ma#?iKfkP;|H5VE{GVGkIpYP(%K1OLtepS+ zW##;zSvDc#dCSWAKfSD+|J-He{GVDjF5@}N%K1OJEb~{+T9)}MA73`Ac3GwT_kZVW z%sZCkcg7sQq}+z%mgF~{RV+R=f1bQ}YQ|$0m)mgk;z=2gT0Al1+ZP{@@yNyHHoR@| z_>7Yl_cOkAaXsVN%QC~5Pb@8GIBRJ+!^fAFGn~1!oZ(|j%Nahpw4C81OUoHPyfib6 zzGP`R!-tlZGkjp_xQy>#IyU3!OSj7SzNMRI()Chh%xOzUWqj|_^3SI(DOY*Vl5&+( zmXxc!dX?^;r>a`KXLl@Bf{S2<(J_>99#vdZXFmXxbZSyHZY;*zl$Pgs&wd=Vf( zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfWZHq0-Jm^+x^Z;W#dnzv(m@YndxIGKil{t>BH$m>5TNj^nvvL zbb5MUIxT%Qy*Hhj-jhyA@2*rf`a{0IE1jH9O66Kp({P%SPE04HcckOfacOcoHXW0W zPDiD;rz6wb(xmj(bVPbfIy@bg4owr&o72JRP3fTY#&lqMLpmV6KJA}gm-b7qP5Y+T zqzUQOX`l3}w0D}FUYYhvuSnz5p6O+2kMz>Cdm5yE>ZNY#q;_hhW@@B*+AZyxhSDzS zC28mM;xsP3DD9M9n08DrNIRtGr?F}Kv|ZXZZIhl?sjQ#R`XWGp009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RsO~0-L@+D?eGOZ1R!x;q;+&M*3j-K+4ZIIX%5EotEC4PEGGgr=)kMccqil zN$H(wY8p;c(uwJW^p13VIxbC4$EIV_(dnr4_H<-=Tbh*KnvO_sNr$Jy(xK^)G%>w7 z9h}~j4oYuK2c|cq1Jdi${^@mTzx3L)Z+cCdkY1hkNv}$Kr&p%E(ks&V^zyW4dRf{d zy)^Bf2C1KVshc{fom#1x8mXRkOS`6_v`czP+Bv;AjY}^|JEa$<9n%Za$I=dIY}!6; zm$psYr01or({s~S={af3G$xHs&rVyUXQj>4W@*#3N!mDVlr~Hoq)}E86ybWi$8x;yNwd<-G$Tz<)6)0SP3gPo#`K+ZL;7~Q zK4#C)_iv@^(l^t!>6&zP`bN4ceLY>7zLu^?m#43!%hH$ArRhuQlJv!Nar#2KD1AO% zm_C;-NS{sTr_ZGG(x=n8=~L;P^vN7lUjzscAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB=F2Ljs$`a^m={XRXG zewQ9izfF&%-=v4ruhT>6!Su`YK>9_xKm9!2mwuM+O+QWdq@Sd_(~r|#=~wB_bVvG8 zx;_0c-IjikZcX1$x1^iXnzTBtN-NWfv^*_KOVg6HI4w#G(}FZV%}aCBoHRSlN;A`p zG(AmA-%B^8@1`5mchU{%+v)oBt#n=bX1X?AldewRNLQt=rz_LfDwT~7$@eSLSJUO` zE9tWI<#cKKQo1C4FAdvmbZ+`oIwyTHot-|B&PpFo zXXar0B0zuu0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfWZG@fz5}r;FFcgX75TTr<2k<)6|roZ8jyHm`+IVNXMt+(&Th( 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

Lws!mo$qO4SYg!+SfI$tla$ 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%0DhpoW|l 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

va|9cbh)V2O5g!$6AH2IgjN|{WZKEqJcme)Z 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�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�Fm3nV_UMMLh2z) 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%0DjLVO9CWT0=s@4wG+4-a4O?TO0DjN!QZ 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 F`pjTK}e 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�#gED1P61pB9;YQSy<=;f+2vhpdT+? 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 =JY>Ev4d` z;~mpYrBA%F>_NeR|4WSdB+yX&vub3OIsDHJs)|H9Z6QkBXgpiDci~6i01n3O#3OvW zx*vCvBEfFMAMtV`90o+#+uGP1{!fb}WoFWa^mts7CD!j5N;bUW$qms3?~UVFOTS`x zvJI&aMg-*&=sYcN+{6FJEv#-vMos6FxC3R118YtBt$LXS*LgVJ(1WEk#oife+Va(C z1P#(NftG)Ru*;hB|1wmcfK#P-wk|&|9Y{{8)uN*6$uYGk13py;SQ!v|)^W(j3jA@w zvR8I=jQ>~v|GS_6`JWfh9sfVoUyVhE#G_7MO-2*wPDbtn>H8EQwJj@d4P5aGEJFC>`vqkn+0 zdRllo2FJGL9HpS}BH1Y%L&wJf03Ock*QM%35qiYNA>L)Y6a#qUDHMeb0|@Up8-n9B{QB;l8YaX2Q zLXrOWvoF5C_WyqW;*a-#fBXdCi{JkE*L+;@b6SC?54X|rJBkx}F`G1kN_oHrK%(ofLntZ_4)f-hPapQ+_z_gAH5M#tkN_E|7sa6i zkFb6qi4^$$)Hi`mnVW1C;9zX-QGa{9R^lVmg2kfH=VU&QcYUnDV+9^7@K}Mz3OrWe Yu>y}3c&xx<1s*H#Sb@h1e6B0-KQ!^zmjD0& literal 0 HcmV?d00001 diff --git a/tester/setup_tester.c b/tester/setup_tester.c index 5f1d04835..692e1b5a8 100644 --- a/tester/setup_tester.c +++ b/tester/setup_tester.c @@ -56,17 +56,29 @@ static void _remove_friends_from_list(LinphoneFriendList *list, const char *frie } } -static void _check_friend_result_list(const bctbx_list_t *resultList, const unsigned int index, const char* uri) { +static void _check_friend_result_list(const bctbx_list_t *resultList, const unsigned int index, const char* uri, const char* phone) { const LinphoneSearchResult *sr = bctbx_list_nth_data(resultList, index); const LinphoneFriend *lf = linphone_search_result_get_friend(sr); BC_ASSERT_PTR_NOT_NULL(lf); if (lf != NULL) { const LinphoneAddress *la = linphone_friend_get_address(lf); - BC_ASSERT_PTR_NOT_NULL(la); if (la != NULL) { - BC_ASSERT_STRING_EQUAL(linphone_address_as_string(la) , uri); + char* fa = linphone_address_as_string(la); + BC_ASSERT_STRING_EQUAL(fa , uri); + free(fa); + return; + } else if (phone != NULL) { + const LinphonePresenceModel *presence = linphone_friend_get_presence_model_for_uri_or_tel(lf, phone); + BC_ASSERT_PTR_NOT_NULL(presence); + if (presence != NULL) { + char *contact = linphone_presence_model_get_contact(presence); + BC_ASSERT_STRING_EQUAL(contact, uri); + free(contact); + return; + } } } + ms_error("Address NULL and Presence NULL"); } static void linphone_version_test(void){ @@ -455,9 +467,9 @@ static void search_friend_all_domains(void) { if (resultList != NULL) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 3, int, "%d"); - _check_friend_result_list(resultList, 0, sFriends[2]);//"sip:allo@sip.example.org" - _check_friend_result_list(resultList, 1, sFriends[3]);//"sip:hello@sip.example.org" - _check_friend_result_list(resultList, 2, sFriends[4]);//"sip:hello@sip.test.org" + _check_friend_result_list(resultList, 0, sFriends[2], NULL);//"sip:allo@sip.example.org" + _check_friend_result_list(resultList, 1, sFriends[3], NULL);//"sip:hello@sip.example.org" + _check_friend_result_list(resultList, 2, sFriends[4], NULL);//"sip:hello@sip.test.org" } free(resultList); @@ -483,8 +495,8 @@ static void search_friend_one_domain(void) { if (resultList != NULL) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 2, int, "%d"); - _check_friend_result_list(resultList, 0, sFriends[2]);//"sip:allo@sip.example.org" - _check_friend_result_list(resultList, 1, sFriends[3]);//"sip:hello@sip.example.org" + _check_friend_result_list(resultList, 0, sFriends[2], NULL);//"sip:allo@sip.example.org" + _check_friend_result_list(resultList, 1, sFriends[3], NULL);//"sip:hello@sip.example.org" } free(resultList); @@ -510,13 +522,13 @@ static void search_friend_research_estate(void) { if (resultList != NULL) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 7, int, "%d"); - _check_friend_result_list(resultList, 0, sFriends[6]);//"sip:laura@sip.example.org" - _check_friend_result_list(resultList, 1, sFriends[7]);//"sip:loic@sip.example.org" - _check_friend_result_list(resultList, 2, sFriends[8]);//"sip:laure@sip.test.org" - _check_friend_result_list(resultList, 3, sFriends[9]);//"sip:loic@sip.test.org" - _check_friend_result_list(resultList, 4, sFriends[2]);//"sip:allo@sip.example.org" - _check_friend_result_list(resultList, 5, sFriends[3]);//"sip:hello@sip.example.org" - _check_friend_result_list(resultList, 6, sFriends[4]);//"sip:hello@sip.test.org" + _check_friend_result_list(resultList, 0, sFriends[6], NULL);//"sip:laura@sip.example.org" + _check_friend_result_list(resultList, 1, sFriends[7], NULL);//"sip:loic@sip.example.org" + _check_friend_result_list(resultList, 2, sFriends[8], NULL);//"sip:laure@sip.test.org" + _check_friend_result_list(resultList, 3, sFriends[9], NULL);//"sip:loic@sip.test.org" + _check_friend_result_list(resultList, 4, sFriends[2], NULL);//"sip:allo@sip.example.org" + _check_friend_result_list(resultList, 5, sFriends[3], NULL);//"sip:hello@sip.example.org" + _check_friend_result_list(resultList, 6, sFriends[4], NULL);//"sip:hello@sip.test.org" } free(resultList); @@ -527,8 +539,8 @@ static void search_friend_research_estate(void) { if (resultList != NULL) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 2, int, "%d"); - _check_friend_result_list(resultList, 0, sFriends[8]);//"sip:laure@sip.test.org" - _check_friend_result_list(resultList, 1, sFriends[6]);//"sip:laura@sip.example.org" + _check_friend_result_list(resultList, 0, sFriends[8], NULL);//"sip:laure@sip.test.org" + _check_friend_result_list(resultList, 1, sFriends[6], NULL);//"sip:laura@sip.example.org" } free(resultList); @@ -554,8 +566,8 @@ static void search_friend_research_estate_reset(void) { if (resultList != NULL) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 2, int, "%d"); - _check_friend_result_list(resultList, 0, sFriends[6]);//"sip:laura@sip.example.org" - _check_friend_result_list(resultList, 1, sFriends[8]);//"sip:laure@sip.test.org" + _check_friend_result_list(resultList, 0, sFriends[6], NULL);//"sip:laura@sip.example.org" + _check_friend_result_list(resultList, 1, sFriends[8], NULL);//"sip:laure@sip.test.org" } free(resultList); @@ -568,13 +580,13 @@ static void search_friend_research_estate_reset(void) { if (resultList != NULL) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 7, int, "%d"); - _check_friend_result_list(resultList, 0, sFriends[6]);//"sip:laura@sip.example.org" - _check_friend_result_list(resultList, 1, sFriends[7]);//"sip:loic@sip.example.org" - _check_friend_result_list(resultList, 2, sFriends[8]);//"sip:laure@sip.test.org" - _check_friend_result_list(resultList, 3, sFriends[9]);//"sip:loic@sip.test.org" - _check_friend_result_list(resultList, 4, sFriends[2]);//"sip:allo@sip.example.org" - _check_friend_result_list(resultList, 5, sFriends[3]);//"sip:hello@sip.example.org" - _check_friend_result_list(resultList, 6, sFriends[4]);//"sip:hello@sip.test.org" + _check_friend_result_list(resultList, 0, sFriends[6], NULL);//"sip:laura@sip.example.org" + _check_friend_result_list(resultList, 1, sFriends[7], NULL);//"sip:loic@sip.example.org" + _check_friend_result_list(resultList, 2, sFriends[8], NULL);//"sip:laure@sip.test.org" + _check_friend_result_list(resultList, 3, sFriends[9], NULL);//"sip:loic@sip.test.org" + _check_friend_result_list(resultList, 4, sFriends[2], NULL);//"sip:allo@sip.example.org" + _check_friend_result_list(resultList, 5, sFriends[3], NULL);//"sip:hello@sip.example.org" + _check_friend_result_list(resultList, 6, sFriends[4], NULL);//"sip:hello@sip.test.org" } free(resultList); @@ -604,15 +616,102 @@ static void search_friend_with_phone_number(void) { if (resultList != NULL) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 3, int, "%d"); - _check_friend_result_list(resultList, 0, sFriends[11]);//"sip:+111223344@sip.example.org" - _check_friend_result_list(resultList, 1, sFriends[10]);//"sip:+33655667788@sip.example.org" - _check_friend_result_list(resultList, 2, sFriends[5]);//"sip:marie@sip.example.org" + _check_friend_result_list(resultList, 0, sFriends[11], NULL);//"sip:+111223344@sip.example.org" + _check_friend_result_list(resultList, 1, sFriends[10], NULL);//"sip:+33655667788@sip.example.org" + _check_friend_result_list(resultList, 2, sFriends[5], NULL);//"sip:marie@sip.example.org" } free(resultList); + _remove_friends_from_list(lfl, sFriends, sSizeFriend); + + linphone_core_manager_destroy(manager); +} + +static void search_friend_with_presence(void) { + LinphoneMagicSearch *magicSearch = NULL; + bctbx_list_t *resultList = NULL; + LinphoneCoreManager* manager = linphone_core_manager_create("marie_rc"); + LinphoneFriendList *lfl = linphone_core_get_default_friend_list(manager->lc); + const char* chloeSipUri = {"sip:chloe@sip.example.org"}; + const char* chloePhoneNumber = {"0633556644"}; + LinphoneFriend *chloeFriend = linphone_core_create_friend(manager->lc); + LinphonePresenceModel *chloePresence = linphone_core_create_presence_model(manager->lc); + LinphoneProxyConfig *proxy = linphone_core_get_default_proxy_config(manager->lc); + + linphone_proxy_config_edit(proxy); + linphone_proxy_config_set_dial_prefix(proxy, "33"); + linphone_proxy_config_done(proxy); + linphone_core_set_default_proxy(manager->lc, proxy); + + _create_friends_from_tab(manager->lc, lfl, sFriends, sSizeFriend); + linphone_presence_model_set_contact(chloePresence, chloeSipUri); + linphone_friend_add_phone_number(chloeFriend, chloePhoneNumber); + linphone_friend_set_presence_model_for_uri_or_tel(chloeFriend, chloePhoneNumber, chloePresence); + linphone_friend_list_add_friend(lfl, chloeFriend); + + magicSearch = linphone_magic_search_new(manager->lc); + + resultList = linphone_magic_search_get_contact_list_from_filter(magicSearch, "33", ""); + + BC_ASSERT_PTR_NOT_NULL(resultList); + + if (resultList != NULL) { + BC_ASSERT_EQUAL(bctbx_list_size(resultList), 3, int, "%d"); + _check_friend_result_list(resultList, 0, sFriends[11], NULL);//"sip:+111223344@sip.example.org" + _check_friend_result_list(resultList, 1, chloeSipUri, chloePhoneNumber);//"sip:chloe@sip.example.org" + _check_friend_result_list(resultList, 2, sFriends[10], NULL);//"sip:+33655667788@sip.example.org" + } + + free(resultList); + + linphone_magic_search_reset_search_cache(magicSearch); + + resultList = linphone_magic_search_get_contact_list_from_filter(magicSearch, "chloe", ""); + + BC_ASSERT_PTR_NOT_NULL(resultList); + + if (resultList != NULL) { + BC_ASSERT_EQUAL(bctbx_list_size(resultList), 1, int, "%d"); + _check_friend_result_list(resultList, 0, chloeSipUri, chloePhoneNumber);//"sip:chloe@sip.example.org" + } + + free(resultList); _remove_friends_from_list(lfl, sFriends, sSizeFriend); + { + LinphoneFriend *fr = linphone_friend_list_find_friend_by_uri(lfl, chloeSipUri); + if (fr != NULL) linphone_friend_list_remove_friend(lfl, fr); + } + + linphone_core_manager_destroy(manager); +} + +static void search_friend_large_database(void) { + MSTimeSpec start, current; + LinphoneMagicSearch *magicSearch = NULL; + bctbx_list_t *resultList = NULL; + char *dbPath = bc_tester_res("db/friends.db"); + char searchedFriend[] = {"6295103032641994169"}; + char subBuff[30]; + LinphoneCoreManager* manager = linphone_core_manager_new2("empty_rc", FALSE); + linphone_core_set_friends_database_path(manager->lc, dbPath); + + magicSearch = linphone_magic_search_new(manager->lc); + + for (unsigned int i = 1; i < sizeof(searchedFriend) ; i++) { + memcpy(subBuff, &searchedFriend, i); + subBuff[i] = '\0'; + liblinphone_tester_clock_start(&start); + resultList = linphone_magic_search_get_contact_list_from_filter(magicSearch, subBuff, ""); + ms_get_cur_time(¤t); + ms_message("Searching time: %lld ms" ,((current.tv_sec - start.tv_sec)*1000LL) + ((current.tv_nsec - start.tv_nsec)/1000000LL)); + BC_ASSERT_PTR_NOT_NULL(resultList); + + if (resultList != NULL) ms_message("List size: %zu", bctbx_list_size(resultList)); + + free(resultList); + } linphone_core_manager_destroy(manager); } @@ -638,7 +737,9 @@ test_t setup_tests[] = { TEST_TWO_TAGS("Search friend from one domain", search_friend_one_domain, "MagicSearch", "LeaksMemory"), TEST_TWO_TAGS("Multiple looking for friends with the same cache", search_friend_research_estate, "MagicSearch", "LeaksMemory"), TEST_TWO_TAGS("Multiple looking for friends with cache resetting", search_friend_research_estate_reset, "MagicSearch", "LeaksMemory"), - TEST_TWO_TAGS("Search friend with phone number", search_friend_with_phone_number, "MagicSearch", "LeaksMemory") + TEST_TWO_TAGS("Search friend with phone number", search_friend_with_phone_number, "MagicSearch", "LeaksMemory"), + TEST_TWO_TAGS("Search friend and find it with its presence", search_friend_with_presence, "MagicSearch", "LeaksMemory"), + TEST_TWO_TAGS("search friend in large friends database", search_friend_large_database, "MagicSearch", "LeaksMemory") }; test_suite_t setup_test_suite = {"Setup", NULL, NULL, liblinphone_tester_before_each, liblinphone_tester_after_each, From 43a62dc84a0898ab794b6c90a7781ef2541c55c6 Mon Sep 17 00:00:00 2001 From: Erwan Croze Date: Tue, 20 Feb 2018 12:09:46 +0100 Subject: [PATCH 104/281] Fixing memory leaks in friendlist --- coreapi/friendlist.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/coreapi/friendlist.c b/coreapi/friendlist.c index b92c13a02..5e9ca2abf 100644 --- a/coreapi/friendlist.c +++ b/coreapi/friendlist.c @@ -634,10 +634,13 @@ static LinphoneFriendListStatus _linphone_friend_list_remove_friend(LinphoneFrie list->friends = bctbx_list_erase_link(list->friends, elem); if(lf->refkey) { bctbx_iterator_t * it = bctbx_map_cchar_find_key(list->friends_map, lf->refkey); - if (!bctbx_iterator_cchar_equals(it, bctbx_map_cchar_end(list->friends_map))){ + bctbx_iterator_t * end = bctbx_map_cchar_end(list->friends_map); + if (!bctbx_iterator_cchar_equals(it, end)){ linphone_friend_unref((LinphoneFriend*)bctbx_pair_cchar_get_second(bctbx_iterator_cchar_get_pair(it))); bctbx_map_cchar_erase(list->friends_map, it); } + if (it) bctbx_iterator_cchar_delete(it); + if (end) bctbx_iterator_cchar_delete(end); } phone_numbers = linphone_friend_get_phone_numbers(lf); @@ -647,14 +650,17 @@ static LinphoneFriendListStatus _linphone_friend_list_remove_friend(LinphoneFrie const char *uri = linphone_friend_phone_number_to_sip_uri(lf, number); if(uri) { bctbx_iterator_t * it = bctbx_map_cchar_find_key(list->friends_map_uri, uri); - if (!bctbx_iterator_cchar_equals(it, bctbx_map_cchar_end(list->friends_map_uri))){ + bctbx_iterator_t * end = bctbx_map_cchar_end(list->friends_map_uri); + if (!bctbx_iterator_cchar_equals(it, end)){ linphone_friend_unref((LinphoneFriend*)bctbx_pair_cchar_get_second(bctbx_iterator_cchar_get_pair(it))); bctbx_map_cchar_erase(list->friends_map_uri, it); } - bctbx_iterator_cchar_delete(it); + if (it) bctbx_iterator_cchar_delete(it); + if (end) bctbx_iterator_cchar_delete(end); } iterator = bctbx_list_next(iterator); } + if (phone_numbers) bctbx_list_free(phone_numbers); addresses = linphone_friend_get_addresses(lf); iterator = (bctbx_list_t *)addresses; @@ -663,13 +669,16 @@ static LinphoneFriendListStatus _linphone_friend_list_remove_friend(LinphoneFrie char *uri = linphone_address_as_string_uri_only(lfaddr); if(uri) { bctbx_iterator_t * it = bctbx_map_cchar_find_key(list->friends_map_uri, uri); - if (!bctbx_iterator_cchar_equals(it, bctbx_map_cchar_end(list->friends_map_uri))){ + bctbx_iterator_t * end = bctbx_map_cchar_end(list->friends_map_uri); + if (!bctbx_iterator_cchar_equals(it, end)){ linphone_friend_unref((LinphoneFriend*)bctbx_pair_cchar_get_second(bctbx_iterator_cchar_get_pair(it))); bctbx_map_cchar_erase(list->friends_map_uri, it); } - bctbx_iterator_cchar_delete(it); + if (it) bctbx_iterator_cchar_delete(it); + if (end) bctbx_iterator_cchar_delete(end); ms_free(uri); } + iterator = bctbx_list_next(iterator); } From 13182409bff36ce0325d0c6506e4212ee712f9b6 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 20 Feb 2018 14:15:47 +0100 Subject: [PATCH 105/281] fix(Core): do not use map[] to test presence of element, [] create an item if not exist --- src/core/core-chat-room.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/core/core-chat-room.cpp b/src/core/core-chat-room.cpp index e9bc24996..8e8eeed9d 100644 --- a/src/core/core-chat-room.cpp +++ b/src/core/core-chat-room.cpp @@ -106,12 +106,14 @@ shared_ptr CorePrivate::createClientGroupChatRoom (const strin void CorePrivate::insertChatRoom (const shared_ptr &chatRoom) { L_ASSERT(chatRoom); - L_ASSERT(!chatRoomsById[chatRoom->getChatRoomId()] - || (chatRoomsById[chatRoom->getChatRoomId()] == chatRoom) - ); - if (!chatRoomsById[chatRoom->getChatRoomId()]) { + + const ChatRoomId &chatRoomId = chatRoom->getChatRoomId(); + auto it = chatRoomsById.find(chatRoomId); + // Chat room not exist or yes but with the same pointer! + L_ASSERT(it == chatRoomsById.end() || it->second == chatRoom); + if (it == chatRoomsById.end()) { chatRooms.push_back(chatRoom); - chatRoomsById[chatRoom->getChatRoomId()] = chatRoom; + chatRoomsById[chatRoomId] = chatRoom; } } From 81eac8777e6ac486b29093c2a3b7a974723fc57c Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 20 Feb 2018 14:26:23 +0100 Subject: [PATCH 106/281] Add logging facilities in participant device and server group chat room. --- src/chat/chat-room/server-group-chat-room-stub.cpp | 6 ++++++ src/chat/chat-room/server-group-chat-room.h | 2 ++ src/conference/participant-device.cpp | 14 ++++++++++++++ src/conference/participant-device.h | 2 ++ 4 files changed, 24 insertions(+) diff --git a/src/chat/chat-room/server-group-chat-room-stub.cpp b/src/chat/chat-room/server-group-chat-room-stub.cpp index 90950be2f..03d88eea3 100644 --- a/src/chat/chat-room/server-group-chat-room-stub.cpp +++ b/src/chat/chat-room/server-group-chat-room-stub.cpp @@ -215,4 +215,10 @@ void ServerGroupChatRoom::leave () {} void ServerGroupChatRoom::onFirstNotifyReceived (const IdentityAddress &addr) {} +// ----------------------------------------------------------------------------- + +ostream &operator<< (ostream &stream, const ServerGroupChatRoom *chatRoom) { + return stream << "ServerGroupChatRoom [" << chatRoom << "]"; +} + LINPHONE_END_NAMESPACE diff --git a/src/chat/chat-room/server-group-chat-room.h b/src/chat/chat-room/server-group-chat-room.h index fa4fd0ab4..57d49dcfc 100644 --- a/src/chat/chat-room/server-group-chat-room.h +++ b/src/chat/chat-room/server-group-chat-room.h @@ -93,6 +93,8 @@ private: L_DISABLE_COPY(ServerGroupChatRoom); }; +std::ostream &operator<< (std::ostream &stream, const ServerGroupChatRoom *chatRoom); + LINPHONE_END_NAMESPACE #endif // ifndef _L_SERVER_GROUP_CHAT_ROOM_H_ diff --git a/src/conference/participant-device.cpp b/src/conference/participant-device.cpp index e04ecef3f..4c147a38d 100644 --- a/src/conference/participant-device.cpp +++ b/src/conference/participant-device.cpp @@ -47,4 +47,18 @@ void ParticipantDevice::setConferenceSubscribeEvent (LinphoneEvent *ev) { mConferenceSubscribeEvent = linphone_event_ref(ev); } +ostream &operator<< (ostream &stream, ParticipantDevice::State state) { + switch (state) { + case ParticipantDevice::State::Joining: + return stream << "Joining"; + case ParticipantDevice::State::Present: + return stream << "Present"; + case ParticipantDevice::State::Leaving: + return stream << "Leaving"; + case ParticipantDevice::State::Left: + return stream << "Left"; + } + return stream; +} + LINPHONE_END_NAMESPACE diff --git a/src/conference/participant-device.h b/src/conference/participant-device.h index f1abe8e1e..e10da6394 100644 --- a/src/conference/participant-device.h +++ b/src/conference/participant-device.h @@ -72,6 +72,8 @@ private: L_DISABLE_COPY(ParticipantDevice); }; +std::ostream &operator<< (std::ostream &stream, ParticipantDevice::State state); + LINPHONE_END_NAMESPACE #endif // ifndef _L_PARTICIPANT_DEVICE_H_ From 885611ff4c58e6ce76e3b14233b3a94fd6e8cada Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 20 Feb 2018 14:26:41 +0100 Subject: [PATCH 107/281] Add a multi-devices group chat tester. --- tester/group_chat_tester.c | 192 +++++++++++++++++++++++++++---------- 1 file changed, 141 insertions(+), 51 deletions(-) diff --git a/tester/group_chat_tester.c b/tester/group_chat_tester.c index 211494d10..7f92fceba 100644 --- a/tester/group_chat_tester.c +++ b/tester/group_chat_tester.c @@ -326,10 +326,10 @@ static void group_chat_room_creation_server (void) { 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, 2, 0); + LinphoneChatRoom *paulineCr = check_creation_chat_room_client_side(coresList, pauline, &initialPaulineStats, confAddr, initialSubject, 2, FALSE); // Check that the chat room is correctly created on Laure's side and that the participants are added - LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, 0); + LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, FALSE); // Pauline tries to change the subject but is not admin so it fails const char *newSubject = "Let's go drink a beer"; @@ -367,7 +367,7 @@ static void group_chat_room_creation_server (void) { participantsAddresses = NULL; // Check that the chat room is correctly created on Chloe's side and that she was added everywhere - LinphoneChatRoom *chloeCr = check_creation_chat_room_client_side(coresList, chloe, &initialChloeStats, confAddr, newSubject, 3, 0); + LinphoneChatRoom *chloeCr = check_creation_chat_room_client_side(coresList, chloe, &initialChloeStats, confAddr, newSubject, 3, FALSE); BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_participants_added, initialMarieStats.number_of_participants_added + 1, 10000)); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_participants_added, initialPaulineStats.number_of_participants_added + 1, 10000)); BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_participants_added, initialLaureStats.number_of_participants_added + 1, 10000)); @@ -547,10 +547,10 @@ static void group_chat_room_message (bool_t encrypt) { 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, 2, 0); + LinphoneChatRoom *paulineCr = check_creation_chat_room_client_side(coresList, pauline, &initialPaulineStats, confAddr, initialSubject, 2, FALSE); // Check that the chat room is correctly created on Chloe's side and that the participants are added - LinphoneChatRoom *chloeCr = check_creation_chat_room_client_side(coresList, chloe, &initialChloeStats, confAddr, initialSubject, 2, 0); + LinphoneChatRoom *chloeCr = check_creation_chat_room_client_side(coresList, chloe, &initialChloeStats, confAddr, initialSubject, 2, FALSE); // Chloe begins composing a message linphone_chat_room_compose(chloeCr); @@ -641,13 +641,13 @@ static void group_chat_room_invite_multi_register_account (void) { const LinphoneAddress *confAddr = linphone_chat_room_get_conference_address(marieCr); // Check that the chat room is correctly created on Pauline1's side and that the participants are added - LinphoneChatRoom *paulineCr = check_creation_chat_room_client_side(coresList, pauline1, &initialPauline1Stats, confAddr, initialSubject, 2, 0); + LinphoneChatRoom *paulineCr = check_creation_chat_room_client_side(coresList, pauline1, &initialPauline1Stats, confAddr, initialSubject, 2, FALSE); // Check that the chat room is correctly created on Pauline2's side and that the participants are added - LinphoneChatRoom *paulineCr2 = check_creation_chat_room_client_side(coresList, pauline2, &initialPauline2Stats, confAddr, initialSubject, 2, 0); + LinphoneChatRoom *paulineCr2 = check_creation_chat_room_client_side(coresList, pauline2, &initialPauline2Stats, confAddr, initialSubject, 2, FALSE); // Check that the chat room is correctly created on Laure's side and that the participants are added - LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, 0); + LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, FALSE); // Clean db from chat room linphone_core_manager_delete_chat_room(marie, marieCr, coresList); @@ -687,10 +687,10 @@ static void group_chat_room_add_admin (void) { 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, 2, 0); + LinphoneChatRoom *paulineCr = check_creation_chat_room_client_side(coresList, pauline, &initialPaulineStats, confAddr, initialSubject, 2, FALSE); // Check that the chat room is correctly created on Laure's side and that the participants are added - LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, 0); + LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, FALSE); // Marie designates Pauline as admin LinphoneAddress *paulineAddr = linphone_address_new(linphone_core_get_identity(pauline->lc)); @@ -739,10 +739,10 @@ static void group_chat_room_add_admin_lately_notified (void) { 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, 2, 0); + LinphoneChatRoom *paulineCr = check_creation_chat_room_client_side(coresList, pauline, &initialPaulineStats, confAddr, initialSubject, 2, FALSE); // Check that the chat room is correctly created on Laure's side and that the participants are added - LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, 0); + LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, FALSE); //simulate pauline has disapeared linphone_core_set_network_reachable(pauline->lc, FALSE); @@ -800,10 +800,10 @@ static void group_chat_room_add_admin_non_admin (void) { 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, 2, 0); + LinphoneChatRoom *paulineCr = check_creation_chat_room_client_side(coresList, pauline, &initialPaulineStats, confAddr, initialSubject, 2, FALSE); // Check that the chat room is correctly created on Laure's side and that the participants are added - LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, 0); + LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, FALSE); // Pauline designates Laure as admin LinphoneAddress *laureAddr = linphone_address_new(linphone_core_get_identity(laure->lc)); @@ -849,10 +849,10 @@ static void group_chat_room_remove_admin (void) { 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, 2, 0); + LinphoneChatRoom *paulineCr = check_creation_chat_room_client_side(coresList, pauline, &initialPaulineStats, confAddr, initialSubject, 2, FALSE); // Check that the chat room is correctly created on Laure's side and that the participants are added - LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, 0); + LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, FALSE); // Marie designates Pauline as admin LinphoneAddress *paulineAddr = linphone_address_new(linphone_core_get_identity(pauline->lc)); @@ -912,10 +912,10 @@ static void group_chat_room_admin_creator_leaves_the_room (void) { 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, 2, 0); + LinphoneChatRoom *paulineCr = check_creation_chat_room_client_side(coresList, pauline, &initialPaulineStats, confAddr, initialSubject, 2, FALSE); // Check that the chat room is correctly created on Laure's side and that the participants are added - LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, 0); + LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, FALSE); // Marie leaves the room linphone_chat_room_leave(marieCr); @@ -963,10 +963,10 @@ static void group_chat_room_change_subject (void) { 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, 2, 0); + LinphoneChatRoom *paulineCr = check_creation_chat_room_client_side(coresList, pauline, &initialPaulineStats, confAddr, initialSubject, 2, FALSE); // Check that the chat room is correctly created on Laure's side and that the participants are added - LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, 0); + LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, FALSE); // Marie now changes the subject linphone_chat_room_set_subject(marieCr, newSubject); @@ -1014,10 +1014,10 @@ static void group_chat_room_change_subject_non_admin (void) { 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, 2, 0); + LinphoneChatRoom *paulineCr = check_creation_chat_room_client_side(coresList, pauline, &initialPaulineStats, confAddr, initialSubject, 2, FALSE); // Check that the chat room is correctly created on Laure's side and that the participants are added - LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, 0); + LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, FALSE); // Marie now changes the subject linphone_chat_room_set_subject(paulineCr, newSubject); @@ -1064,10 +1064,10 @@ static void group_chat_room_remove_participant (void) { 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, 2, 0); + LinphoneChatRoom *paulineCr = check_creation_chat_room_client_side(coresList, pauline, &initialPaulineStats, confAddr, initialSubject, 2, FALSE); // Check that the chat room is correctly created on Laure's side and that the participants are added - LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, 0); + LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, FALSE); // Marie removes Laure from the chat room LinphoneAddress *laureAddr = linphone_address_new(linphone_core_get_identity(laure->lc)); @@ -1115,10 +1115,10 @@ static void group_chat_room_send_message_with_participant_removed (void) { 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, 2, 0); + LinphoneChatRoom *paulineCr = check_creation_chat_room_client_side(coresList, pauline, &initialPaulineStats, confAddr, initialSubject, 2, FALSE); // Check that the chat room is correctly created on Laure's side and that the participants are added - LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, 0); + LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, FALSE); // Marie removes Laure from the chat room LinphoneAddress *laureAddr = linphone_address_new(linphone_core_get_identity(laure->lc)); @@ -1179,10 +1179,10 @@ static void group_chat_room_leave (void) { 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, 2, 0); + LinphoneChatRoom *paulineCr = check_creation_chat_room_client_side(coresList, pauline, &initialPaulineStats, confAddr, initialSubject, 2, FALSE); // Check that the chat room is correctly created on Laure's side and that the participants are added - LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, 0); + LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, FALSE); linphone_chat_room_leave(paulineCr); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneChatRoomStateTerminated, initialPaulineStats.number_of_LinphoneChatRoomStateTerminated + 1, 3000)); @@ -1227,10 +1227,10 @@ static void group_chat_room_come_back_after_disconnection (void) { 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, 2, 0); + LinphoneChatRoom *paulineCr = check_creation_chat_room_client_side(coresList, pauline, &initialPaulineStats, confAddr, initialSubject, 2, FALSE); // Check that the chat room is correctly created on Laure's side and that the participants are added - LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, 0); + LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, FALSE); linphone_core_set_network_reachable(marie->lc, FALSE); @@ -1311,11 +1311,11 @@ static void group_chat_room_create_room_with_disconnected_friends_base (bool_t i linphone_core_set_network_reachable(laure->lc, TRUE); // Check that the chat room is correctly created on Pauline's side and that the participants are added - paulineCr = check_creation_chat_room_client_side(coresList, pauline, &initialPaulineStats, confAddr, initialSubject, 2, 0); + paulineCr = check_creation_chat_room_client_side(coresList, pauline, &initialPaulineStats, confAddr, initialSubject, 2, FALSE); if (!BC_ASSERT_PTR_NOT_NULL(paulineCr)) goto end; // Check that the chat room is correctly created on Laure's side and that the participants are added - laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, 0); + laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, FALSE); if (!BC_ASSERT_PTR_NOT_NULL(laureCr)) goto end; @@ -1378,10 +1378,10 @@ static void group_chat_room_reinvited_after_removed_base (bool_t offline_when_re 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, 2, 0); + LinphoneChatRoom *paulineCr = check_creation_chat_room_client_side(coresList, pauline, &initialPaulineStats, confAddr, initialSubject, 2, FALSE); // Check that the chat room is correctly created on Laure's side and that the participants are added - LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, 0); + LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, FALSE); LinphoneAddress *laureAddr = linphone_address_new(linphone_core_get_identity(laure->lc)); if (offline_when_removed) { @@ -1472,6 +1472,95 @@ static void group_chat_room_reinvited_after_removed_while_offline_2 (void) { group_chat_room_reinvited_after_removed_base(TRUE, TRUE); } +static void group_chat_room_reinvited_after_removed_with_several_devices (void) { + LinphoneCoreManager *marie1 = linphone_core_manager_create("marie_rc"); + LinphoneCoreManager *marie2 = linphone_core_manager_create("marie_rc"); + LinphoneCoreManager *pauline1 = linphone_core_manager_create("pauline_rc"); + LinphoneCoreManager *pauline2 = linphone_core_manager_create("pauline_rc"); + LinphoneCoreManager *laure = linphone_core_manager_create("laure_tcp_rc"); + bctbx_list_t *coresManagerList = NULL; + bctbx_list_t *participantsAddresses = NULL; + coresManagerList = bctbx_list_append(coresManagerList, marie1); + coresManagerList = bctbx_list_append(coresManagerList, marie2); + coresManagerList = bctbx_list_append(coresManagerList, pauline1); + coresManagerList = bctbx_list_append(coresManagerList, pauline2); + coresManagerList = bctbx_list_append(coresManagerList, laure); + bctbx_list_t *coresList = init_core_for_conference(coresManagerList); + start_core_for_conference(coresManagerList); + participantsAddresses = bctbx_list_append(participantsAddresses, linphone_address_new(linphone_core_get_identity(pauline1->lc))); + participantsAddresses = bctbx_list_append(participantsAddresses, linphone_address_new(linphone_core_get_identity(laure->lc))); + stats initialMarie1Stats = marie1->stat; + stats initialMarie2Stats = marie2->stat; + stats initialPauline1Stats = pauline1->stat; + stats initialPauline2Stats = pauline2->stat; + stats initialLaureStats = laure->stat; + + // Marie2 is initially offline + linphone_core_set_network_reachable(marie2->lc, FALSE); + + // Marie creates a new group chat room + const char *initialSubject = "Colleagues"; + LinphoneChatRoom *marie1Cr = create_chat_room_client_side(coresList, marie1, &initialMarie1Stats, participantsAddresses, initialSubject, -1); + participantsAddresses = NULL; + const LinphoneAddress *confAddr = linphone_chat_room_get_conference_address(marie1Cr); + + // Check that the chat room is correctly created on Pauline1 and Pauline2's sides and that the participants are added + LinphoneChatRoom *pauline1Cr = check_creation_chat_room_client_side(coresList, pauline1, &initialPauline1Stats, confAddr, initialSubject, 2, FALSE); + LinphoneChatRoom *pauline2Cr = check_creation_chat_room_client_side(coresList, pauline2, &initialPauline2Stats, confAddr, initialSubject, 2, FALSE); + + // Check that the chat room is correctly created on Laure's side and that the participants are added + LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, FALSE); + + // Marie1 removes Pauline from the chat room while Pauline2 is offline + linphone_core_set_network_reachable(pauline2->lc, FALSE); + LinphoneAddress *paulineAddr = linphone_address_new(linphone_core_get_identity(pauline1->lc)); + LinphoneParticipant *paulineParticipant = linphone_chat_room_find_participant(marie1Cr, paulineAddr); + BC_ASSERT_PTR_NOT_NULL(paulineParticipant); + linphone_chat_room_remove_participant(marie1Cr, paulineParticipant); + BC_ASSERT_TRUE(wait_for_list(coresList, &marie1->stat.number_of_participants_removed, initialMarie1Stats.number_of_participants_removed + 1, 1000)); + BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_participants_removed, initialLaureStats.number_of_participants_removed + 1, 1000)); + BC_ASSERT_TRUE(wait_for_list(coresList, &pauline1->stat.number_of_LinphoneChatRoomStateTerminated, initialPauline1Stats.number_of_LinphoneChatRoomStateTerminated + 1, 3000)); + + // Marie2 comes online, check that pauline is not notified as still being in the chat room + linphone_core_set_network_reachable(marie2->lc, TRUE); + LinphoneChatRoom *marie2Cr = check_creation_chat_room_client_side(coresList, marie2, &initialMarie2Stats, confAddr, initialSubject, 1, TRUE); + + // Marie2 adds Pauline back to the chat room + participantsAddresses = bctbx_list_append(participantsAddresses, paulineAddr); + linphone_chat_room_add_participants(marie2Cr, participantsAddresses); + bctbx_list_free_with_data(participantsAddresses, (bctbx_list_free_func)linphone_address_unref); + participantsAddresses = NULL; + BC_ASSERT_TRUE(wait_for_list(coresList, &marie1->stat.number_of_participants_added, initialMarie1Stats.number_of_participants_added + 1, 1000)); + BC_ASSERT_TRUE(wait_for_list(coresList, &marie2->stat.number_of_participants_added, initialMarie2Stats.number_of_participants_added + 1, 1000)); + BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_participants_added, initialLaureStats.number_of_participants_added + 1, 1000)); + BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_LinphoneChatRoomStateCreationPending, initialLaureStats.number_of_LinphoneChatRoomStateCreationPending + 1, 5000)); + BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_LinphoneChatRoomStateCreated, initialLaureStats.number_of_LinphoneChatRoomStateCreated + 1, 5000)); + BC_ASSERT_EQUAL(linphone_chat_room_get_nb_participants(marie1Cr), 2, int, "%d"); + BC_ASSERT_EQUAL(linphone_chat_room_get_nb_participants(marie2Cr), 2, int, "%d"); + BC_ASSERT_EQUAL(linphone_chat_room_get_nb_participants(laureCr), 2, int, "%d"); + paulineAddr = linphone_address_new(linphone_core_get_device_identity(pauline1->lc)); + LinphoneChatRoom *newPauline1Cr = linphone_core_find_chat_room(pauline1->lc, confAddr, paulineAddr); + linphone_address_unref(paulineAddr); + BC_ASSERT_PTR_EQUAL(newPauline1Cr, pauline1Cr); + BC_ASSERT_EQUAL(linphone_chat_room_get_nb_participants(newPauline1Cr), 2, int, "%d"); + BC_ASSERT_STRING_EQUAL(linphone_chat_room_get_subject(newPauline1Cr), initialSubject); + + // Clean db from chat room + linphone_core_manager_delete_chat_room(marie1, marie1Cr, coresList); + linphone_core_delete_chat_room(marie2->lc, marie2Cr); + linphone_core_manager_delete_chat_room(pauline1, newPauline1Cr, coresList); + linphone_core_delete_chat_room(pauline2->lc, pauline2Cr); + linphone_core_manager_delete_chat_room(laure, laureCr, coresList); + + bctbx_list_free(coresList); + bctbx_list_free(coresManagerList); + linphone_core_manager_destroy(marie1); + linphone_core_manager_destroy(marie2); + linphone_core_manager_destroy(pauline1); + linphone_core_manager_destroy(pauline2); + linphone_core_manager_destroy(laure); +} + static void group_chat_room_notify_after_disconnection (void) { LinphoneCoreManager *marie = linphone_core_manager_create("marie_rc"); LinphoneCoreManager *pauline = linphone_core_manager_create("pauline_rc"); @@ -1610,14 +1699,14 @@ static void group_chat_room_send_refer_to_all_devices (void) { const LinphoneAddress *confAddr = linphone_chat_room_get_conference_address(marieCr); // Check that the chat room is correctly created on second Marie's device - LinphoneChatRoom *marieCr2 = check_creation_chat_room_client_side(coresList, marie2, &initialMarie2Stats, confAddr, initialSubject, 2, 1); + LinphoneChatRoom *marieCr2 = check_creation_chat_room_client_side(coresList, marie2, &initialMarie2Stats, confAddr, initialSubject, 2, TRUE); // 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, pauline1, &initialPauline1Stats, confAddr, initialSubject, 2, 0); - LinphoneChatRoom *paulineCr2 = check_creation_chat_room_client_side(coresList, pauline2, &initialPauline2Stats, confAddr, initialSubject, 2, 0); + LinphoneChatRoom *paulineCr = check_creation_chat_room_client_side(coresList, pauline1, &initialPauline1Stats, confAddr, initialSubject, 2, FALSE); + LinphoneChatRoom *paulineCr2 = check_creation_chat_room_client_side(coresList, pauline2, &initialPauline2Stats, confAddr, initialSubject, 2, FALSE); // Check that the chat room is correctly created on Laure's side and that the participants are added - LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, 0); + LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, FALSE); // Check that added Marie's device didn't change her admin status LinphoneAddress *marieAddr = linphone_address_new(linphone_core_get_identity(marie1->lc)); @@ -1703,11 +1792,11 @@ static void group_chat_room_add_device (void) { 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, pauline1, &initialPauline1Stats, confAddr, initialSubject, 2, 0); - LinphoneChatRoom *paulineCr2 = check_creation_chat_room_client_side(coresList, pauline2, &initialPauline2Stats, confAddr, initialSubject, 2, 0); + LinphoneChatRoom *paulineCr = check_creation_chat_room_client_side(coresList, pauline1, &initialPauline1Stats, confAddr, initialSubject, 2, FALSE); + LinphoneChatRoom *paulineCr2 = check_creation_chat_room_client_side(coresList, pauline2, &initialPauline2Stats, confAddr, initialSubject, 2, FALSE); // Check that the chat room is correctly created on Laure's side and that the participants are added - LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, 0); + LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, FALSE); // Marie adds a new device LinphoneCoreManager *marie2 = linphone_core_manager_create("marie_rc"); @@ -1723,7 +1812,7 @@ static void group_chat_room_add_device (void) { _start_core(marie2); stats initialMarie2Stats = marie2->stat; // Check that the chat room is correctly created on second Marie's device - LinphoneChatRoom *marieCr2 = check_creation_chat_room_client_side(coresList, marie2, &initialMarie2Stats, confAddr, initialSubject, 2, 1); + LinphoneChatRoom *marieCr2 = check_creation_chat_room_client_side(coresList, marie2, &initialMarie2Stats, confAddr, initialSubject, 2, TRUE); BC_ASSERT_TRUE(wait_for_list(coresList, &marie1->stat.number_of_participant_devices_added, initialMarie1Stats.number_of_participant_devices_added + 1, 1000)); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline1->stat.number_of_participant_devices_added, initialMarie1Stats.number_of_participant_devices_added + 1, 1000)); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline2->stat.number_of_participant_devices_added, initialMarie1Stats.number_of_participant_devices_added + 1, 1000)); @@ -2356,10 +2445,10 @@ static void group_chat_room_send_file_with_or_without_text (bool_t with_text) { 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, 2, 0); + LinphoneChatRoom *paulineCr = check_creation_chat_room_client_side(coresList, pauline, &initialPaulineStats, confAddr, initialSubject, 2, FALSE); // Check that the chat room is correctly created on Chloe's side and that the participants are added - LinphoneChatRoom *chloeCr = check_creation_chat_room_client_side(coresList, chloe, &initialChloeStats, confAddr, initialSubject, 2, 0); + LinphoneChatRoom *chloeCr = check_creation_chat_room_client_side(coresList, chloe, &initialChloeStats, confAddr, initialSubject, 2, FALSE); // Sending file if (with_text) { @@ -2423,7 +2512,7 @@ static void group_chat_room_unique_one_to_one_chat_room (void) { LinphoneAddress *confAddr = linphone_address_clone(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, 0); + LinphoneChatRoom *paulineCr = check_creation_chat_room_client_side(coresList, pauline, &initialPaulineStats, confAddr, initialSubject, 1, FALSE); BC_ASSERT_TRUE(linphone_chat_room_get_capabilities(paulineCr) & LinphoneChatRoomCapabilitiesOneToOne); // Marie sends a message @@ -2487,7 +2576,7 @@ static void group_chat_room_unique_one_to_one_chat_room_recreated_from_message_b LinphoneAddress *confAddr = linphone_address_clone(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, 0); + LinphoneChatRoom *paulineCr = check_creation_chat_room_client_side(coresList, pauline, &initialPaulineStats, confAddr, initialSubject, 1, FALSE); BC_ASSERT_TRUE(linphone_chat_room_get_capabilities(paulineCr) & LinphoneChatRoomCapabilitiesOneToOne); // Marie sends a message @@ -2530,7 +2619,7 @@ static void group_chat_room_unique_one_to_one_chat_room_recreated_from_message_b BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(marie->stat.last_received_chat_message), message); // Check that the chat room has been correctly recreated on Marie's side - marieCr = check_creation_chat_room_client_side(coresList, marie, &initialMarieStats, confAddr, initialSubject, 1, 0); + marieCr = check_creation_chat_room_client_side(coresList, marie, &initialMarieStats, confAddr, initialSubject, 1, FALSE); BC_ASSERT_TRUE(linphone_chat_room_get_capabilities(paulineCr) & LinphoneChatRoomCapabilitiesOneToOne); // Clean db from chat room @@ -2579,7 +2668,7 @@ static void group_chat_room_new_unique_one_to_one_chat_room_after_both_participa LinphoneAddress *firstConfAddr = linphone_address_clone(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, firstConfAddr, initialSubject, 1, 0); + LinphoneChatRoom *paulineCr = check_creation_chat_room_client_side(coresList, pauline, &initialPaulineStats, firstConfAddr, initialSubject, 1, FALSE); BC_ASSERT_TRUE(linphone_chat_room_get_capabilities(paulineCr) & LinphoneChatRoomCapabilitiesOneToOne); // Both participants delete the chat room @@ -2597,7 +2686,7 @@ static void group_chat_room_new_unique_one_to_one_chat_room_after_both_participa LinphoneAddress *secondConfAddr = linphone_address_clone(linphone_chat_room_get_conference_address(marieCr)); // Check that the chat room has been correctly recreated on Marie's side - paulineCr = check_creation_chat_room_client_side(coresList, pauline, &initialPaulineStats, secondConfAddr, initialSubject, 1, 0); + paulineCr = check_creation_chat_room_client_side(coresList, pauline, &initialPaulineStats, secondConfAddr, initialSubject, 1, FALSE); BC_ASSERT_TRUE(linphone_chat_room_get_capabilities(paulineCr) & LinphoneChatRoomCapabilitiesOneToOne); BC_ASSERT_FALSE(linphone_address_equal(firstConfAddr, secondConfAddr)); @@ -2645,10 +2734,10 @@ static void imdn_for_group_chat_room (void) { 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, 2, 0); + LinphoneChatRoom *paulineCr = check_creation_chat_room_client_side(coresList, pauline, &initialPaulineStats, confAddr, initialSubject, 2, FALSE); // Check that the chat room is correctly created on Chloe's side and that the participants are added - LinphoneChatRoom *chloeCr = check_creation_chat_room_client_side(coresList, chloe, &initialChloeStats, confAddr, initialSubject, 2, 0); + LinphoneChatRoom *chloeCr = check_creation_chat_room_client_side(coresList, chloe, &initialChloeStats, confAddr, initialSubject, 2, FALSE); // Chloe begins composing a message const char *chloeMessage = "Hello"; @@ -2708,6 +2797,7 @@ test_t group_chat_tests[] = { TEST_TWO_TAGS("Reinvited after removed from group chat room", group_chat_room_reinvited_after_removed, "Server", "LeaksMemory"), TEST_TWO_TAGS("Reinvited after removed from group chat room while offline", group_chat_room_reinvited_after_removed_while_offline, "Server", "LeaksMemory"), TEST_TWO_TAGS("Reinvited after removed from group chat room while offline 2", group_chat_room_reinvited_after_removed_while_offline_2, "Server", "LeaksMemory"), + TEST_TWO_TAGS("Reinvited after removed from group chat room with several devices", group_chat_room_reinvited_after_removed_with_several_devices, "Server", "LeaksMemory"), TEST_TWO_TAGS("Notify after disconnection", group_chat_room_notify_after_disconnection, "Server", "LeaksMemory"), TEST_TWO_TAGS("Send refer to all participants devices", group_chat_room_send_refer_to_all_devices, "Server", "LeaksMemory"), // TODO: Use when we support adding a new device in created conf From e7aadda4fa21d5f0afecfc6ec3ca6afd53caf326 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 20 Feb 2018 15:32:40 +0100 Subject: [PATCH 108/281] Fix build. --- src/chat/chat-room/server-group-chat-room-stub.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chat/chat-room/server-group-chat-room-stub.cpp b/src/chat/chat-room/server-group-chat-room-stub.cpp index 03d88eea3..93532904a 100644 --- a/src/chat/chat-room/server-group-chat-room-stub.cpp +++ b/src/chat/chat-room/server-group-chat-room-stub.cpp @@ -218,7 +218,7 @@ void ServerGroupChatRoom::onFirstNotifyReceived (const IdentityAddress &addr) {} // ----------------------------------------------------------------------------- ostream &operator<< (ostream &stream, const ServerGroupChatRoom *chatRoom) { - return stream << "ServerGroupChatRoom [" << chatRoom << "]"; + return stream << "ServerGroupChatRoom [" << reinterpret_cast(chatRoom) << "]"; } LINPHONE_END_NAMESPACE From b61cc2bdb904d81e12f52b5cfd2a6bb5c9a01b23 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 20 Feb 2018 16:34:16 +0100 Subject: [PATCH 109/281] feat(address): add a sip addresses cache to increase performance (+50%) --- src/CMakeLists.txt | 1 + src/address/address-p.h | 2 + src/address/address.cpp | 53 +++++++++++++++++- src/containers/lru-cache.h | 107 +++++++++++++++++++++++++++++++++++++ src/core/core.cpp | 3 ++ 5 files changed, 164 insertions(+), 2 deletions(-) create mode 100644 src/containers/lru-cache.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e8736b6ff..d6dd47a28 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -91,6 +91,7 @@ set(LINPHONE_CXX_OBJECTS_PRIVATE_HEADER_FILES conference/session/call-session.h conference/session/media-session.h conference/session/port-config.h + containers/lru-cache.h content/content-manager.h content/content-p.h content/content-type.h diff --git a/src/address/address-p.h b/src/address/address-p.h index a0c10d9a5..64d7d1ccf 100644 --- a/src/address/address-p.h +++ b/src/address/address-p.h @@ -38,6 +38,8 @@ public: } void setInternalAddress (const SalAddress *value); + static void clearSipAddressesCache (); + private: struct AddressCache { std::string scheme; diff --git a/src/address/address.cpp b/src/address/address.cpp index f35893b62..4d263aa73 100644 --- a/src/address/address.cpp +++ b/src/address/address.cpp @@ -23,6 +23,7 @@ #include "address/identity-address.h" #include "c-wrapper/c-wrapper.h" #include "c-wrapper/internal/c-sal.h" +#include "containers/lru-cache.h" #include "logger/logger.h" // ============================================================================= @@ -31,6 +32,49 @@ using namespace std; LINPHONE_BEGIN_NAMESPACE +namespace { + class SalAddressWrap { + public: + explicit SalAddressWrap (SalAddress *salAddress = nullptr) : mSalAddress(salAddress) {} + + SalAddressWrap (const SalAddressWrap &other) : mSalAddress(other.mSalAddress) { + if (mSalAddress) + sal_address_ref(mSalAddress); + } + + SalAddressWrap (SalAddressWrap &&other) : mSalAddress(other.mSalAddress) { + other.mSalAddress = nullptr; + } + + ~SalAddressWrap () { + if (mSalAddress) + sal_address_unref(mSalAddress); + } + + const SalAddress *get () { + return mSalAddress; + } + + private: + SalAddress *mSalAddress; + }; + LruCache addressesCache; +} + +static SalAddress *getSalAddressFromCache (const string &uri) { + SalAddressWrap *wrap = addressesCache[uri]; + if (wrap) + return sal_address_clone(wrap->get()); + + SalAddress *address = sal_address_new(L_STRING_TO_C(uri)); + if (address) { + addressesCache.insert(uri, SalAddressWrap(address)); + return sal_address_clone(address); + } + + return nullptr; +} + // ----------------------------------------------------------------------------- void AddressPrivate::setInternalAddress (const SalAddress *addr) { @@ -39,11 +83,16 @@ void AddressPrivate::setInternalAddress (const SalAddress *addr) { internalAddress = sal_address_clone(addr); } +void AddressPrivate::clearSipAddressesCache () { + addressesCache.clear(); +} + // ----------------------------------------------------------------------------- Address::Address (const string &address) : ClonableObject(*new AddressPrivate) { L_D(); - if (!(d->internalAddress = sal_address_new(L_STRING_TO_C(address)))) { + + if (!(d->internalAddress = getSalAddressFromCache(address))) { lWarning() << "Cannot create Address, bad uri [" << address << "]"; } } @@ -65,7 +114,7 @@ Address::Address (const IdentityAddress &identityAddress) : ClonableObject(*new if (identityAddress.hasGruu()) uri += ";gr=" + identityAddress.getGruu(); - d->internalAddress = sal_address_new(L_STRING_TO_C(uri)); + d->internalAddress = getSalAddressFromCache(uri); } Address::Address (const Address &other) : ClonableObject(*new AddressPrivate) { diff --git a/src/containers/lru-cache.h b/src/containers/lru-cache.h new file mode 100644 index 000000000..5bab2c5f1 --- /dev/null +++ b/src/containers/lru-cache.h @@ -0,0 +1,107 @@ +/* + * lru-cache.h + * Copyright (C) 2010-2018 Belledonne Communications SARL + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _L_LRU_CACHE_H_ +#define _L_LRU_CACHE_H_ + +#include +#include + +#include "linphone/utils/general.h" + +// ============================================================================= + +LINPHONE_BEGIN_NAMESPACE + +template +class LruCache { +public: + LruCache (int capacity = DefaultCapacity) : mCapacity(capacity) { + if (capacity < MinCapacity) + capacity = MinCapacity; + } + + int getCapacity () const { + return mCapacity; + } + + int getSize () const { + return int(mKeyToPair.size()); + } + + Value *operator[] (const Key &key) { + auto it = mKeyToPair.find(key); + return it == mKeyToPair.end() ? nullptr : &it->second.second; + } + + const Value *operator[] (const Key &key) const { + auto it = mKeyToPair.find(key); + return it == mKeyToPair.cend() ? nullptr : &it->second.second; + } + + void insert (const Key &key, const Value &value) { + auto it = mKeyToPair.find(key); + if (it != mKeyToPair.end()) + mKeys.erase(it->second.first); + else if (int(mKeyToPair.size()) == mCapacity) { + Key lastKey = mKeys.back(); + mKeys.pop_back(); + mKeyToPair.erase(lastKey); + } + + mKeys.push_front(key); + mKeyToPair.insert({ key, { mKeys.begin(), value } }); + } + + void insert (const Key &key, Value &&value) { + auto it = mKeyToPair.find(key); + if (it != mKeyToPair.end()) + mKeys.erase(it->second.first); + else if (int(mKeyToPair.size()) == mCapacity) { + Key lastKey = mKeys.back(); + mKeys.pop_back(); + mKeyToPair.erase(lastKey); + } + + mKeys.push_front(key); + mKeyToPair.insert({ key, std::make_pair(mKeys.begin(), std::move(value)) }); + } + + void clear () { + mKeyToPair.clear(); + mKeys.clear(); + } + + static constexpr int MinCapacity = 10; + static constexpr int DefaultCapacity = 1000; + +private: + using Pair = std::pair::iterator, Value>; + + const int mCapacity; + + // See: https://stackoverflow.com/questions/16781886/can-we-store-unordered-maptiterator + // Do not store iterator key. + std::list mKeys; + std::unordered_map mKeyToPair; +}; + +LINPHONE_END_NAMESPACE + +#endif // ifndef _L_LRU_CACHE_H_ diff --git a/src/core/core.cpp b/src/core/core.cpp index eebb785de..d339db5cf 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -20,6 +20,7 @@ #include #include +#include "address/address-p.h" #include "call/call.h" #include "core/core-listener.h" #include "core/core-p.h" @@ -75,6 +76,8 @@ void CorePrivate::uninit () { linphone_core_iterate(L_GET_C_BACK_PTR(q)); ms_usleep(10000); } + + AddressPrivate::clearSipAddressesCache(); } // ----------------------------------------------------------------------------- From 7d1ead14b1842f705025a9cec25b2f406b9f9e3f Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 14 Nov 2017 14:08:14 +0100 Subject: [PATCH 110/281] Added API to create and store a fake LinphoneCallLog --- coreapi/call_log.c | 17 +++++++++++++++++ coreapi/linphonecore_jni.cc | 12 ++++++++++++ include/linphone/call_log.h | 17 +++++++++++++++++ java/common/org/linphone/core/LinphoneCore.java | 6 ++++++ .../org/linphone/core/LinphoneCoreImpl.java | 8 ++++++++ 5 files changed, 60 insertions(+) diff --git a/coreapi/call_log.c b/coreapi/call_log.c index abdcf98b5..a4f52c67f 100644 --- a/coreapi/call_log.c +++ b/coreapi/call_log.c @@ -170,6 +170,23 @@ bctbx_list_t * linphone_core_read_call_logs_from_config_file(LinphoneCore *lc){ * Public functions * ******************************************************************************/ +LinphoneCallLog *linphone_core_create_call_log(LinphoneCore *lc, LinphoneAddress *from, LinphoneAddress *to, LinphoneCallDir dir, + int duration, time_t start_time, time_t connected_time, LinphoneCallStatus status, bool_t video_enabled, float quality) { + LinphoneCallLog *log = linphone_call_log_new(dir, linphone_address_ref(from), linphone_address_ref(to)); + + log->duration = duration; + log->start_date_time = start_time; + set_call_log_date(log,log->start_date_time); + log->connected_date_time = connected_time; + log->status = status; + log->video_enabled = video_enabled; + log->quality = quality; + + linphone_core_store_call_log(lc, log); + + return log; +} + const char *linphone_call_log_get_call_id(const LinphoneCallLog *cl){ return cl->call_id; } diff --git a/coreapi/linphonecore_jni.cc b/coreapi/linphonecore_jni.cc index 473407d2e..707d229f3 100644 --- a/coreapi/linphonecore_jni.cc +++ b/coreapi/linphonecore_jni.cc @@ -8913,3 +8913,15 @@ extern "C" jstring Java_org_linphone_core_LinphoneCoreImpl_getTlsKeyPath(JNIEnv return NULL; } } + +extern "C" jlong Java_org_linphone_core_LinphoneCoreImpl_createCallLog(JNIEnv *env, jobject, jlong jcore, jlong jfrom, jlong jto, jint jdir, jint duration, jlong start_time, jlong connected_time, jint jstatus, jboolean video_enabled, jfloat quality) { + LinphoneCore *core = (LinphoneCore*)jcore; + LinphoneAddress *from = (LinphoneAddress *)jfrom; + LinphoneAddress *to = (LinphoneAddress *)jto; + LinphoneCallDir dir = (LinphoneCallDir)jdir; + time_t start = (time_t) start_time; + time_t connected = (time_t) connected_time; + LinphoneCallStatus status = (LinphoneCallStatus)jstatus; + LinphoneCallLog *log = linphone_core_create_call_log(core, from, to, dir, duration, start, connected, status, video_enabled, quality); + return (jlong) log; +} diff --git a/include/linphone/call_log.h b/include/linphone/call_log.h index 004377e55..187811bab 100644 --- a/include/linphone/call_log.h +++ b/include/linphone/call_log.h @@ -206,6 +206,23 @@ LINPHONE_PUBLIC LinphoneCallLog * linphone_call_log_ref(LinphoneCallLog *cl); **/ LINPHONE_PUBLIC void linphone_call_log_unref(LinphoneCallLog *cl); +/** + * Creates a fake LinphoneCallLog. + * @param[in] lc LinphoneCore object + * @param[in] from LinphoneAddress of caller + * @param[in] to LinphoneAddress of callee + * @param[in] dir LinphoneCallDir of call + * @param[in] duration call length in seconds + * @param[in] start_time timestamp of call start time + * @param[in] connected_time timestamp of call connection + * @param[in] status LinphoneCallStatus of call + * @param[in] video_enabled whether video was enabled or not for this call + * @param[in] quality call quality + * @return LinphoneCallLog object +**/ +LINPHONE_PUBLIC LinphoneCallLog *linphone_core_create_call_log(LinphoneCore *lc, LinphoneAddress *from, LinphoneAddress *to, LinphoneCallDir dir, + int duration, time_t start_time, time_t connected_time, LinphoneCallStatus status, bool_t video_enabled, float quality); + /******************************************************************************* * DEPRECATED * diff --git a/java/common/org/linphone/core/LinphoneCore.java b/java/common/org/linphone/core/LinphoneCore.java index c7abd5303..a8c56dcfd 100644 --- a/java/common/org/linphone/core/LinphoneCore.java +++ b/java/common/org/linphone/core/LinphoneCore.java @@ -2557,4 +2557,10 @@ public interface LinphoneCore { * @return a new LinphoneFriend with the given address link with this LinphoneCore */ public LinphoneFriend createFriendWithAddress(String address); + + /** + * Creates and stores a fake LinphoneCallLog + * @return the LinphoneCallLog created and stored + */ + public LinphoneCallLog createCallLog(LinphoneAddress from, LinphoneAddress to, CallDirection dir, int duration, long start, long connected, LinphoneCallLog.CallStatus status, boolean videoEnabled, float quality); } diff --git a/java/impl/org/linphone/core/LinphoneCoreImpl.java b/java/impl/org/linphone/core/LinphoneCoreImpl.java index b300a7fc0..6ec98b7e7 100644 --- a/java/impl/org/linphone/core/LinphoneCoreImpl.java +++ b/java/impl/org/linphone/core/LinphoneCoreImpl.java @@ -1828,4 +1828,12 @@ class LinphoneCoreImpl implements LinphoneCore { public LinphoneFriend createFriendWithAddress(String address) { return (LinphoneFriend) createFriendWithAddress(nativePtr, address); } + + private native long createCallLog(long ptr, long from, long to, int dir, int duration, long start, long connected, int status, boolean videoEnabled, float quality); + @Override + public LinphoneCallLog createCallLog(LinphoneAddress from, LinphoneAddress to, CallDirection dir, int duration, long start, long connected, LinphoneCallLog.CallStatus status, boolean videoEnabled, float quality) { + long logPtr = createCallLog(nativePtr, ((LinphoneAddressImpl) from).nativePtr, ((LinphoneAddressImpl) to).nativePtr, dir == CallDirection.Incoming ? 1 : 0, duration, start, connected, status.toInt(), videoEnabled, quality); + LinphoneCallLog log = new LinphoneCallLogImpl(logPtr); + return log; + } } From 02662051ceab53661c96a28c05e5b2bba0bd3ff5 Mon Sep 17 00:00:00 2001 From: Erwan Croze Date: Wed, 21 Feb 2018 13:42:48 +0100 Subject: [PATCH 111/281] Adding call log in the magic search --- src/search/magic-search.cpp | 87 ++++++++++++++------- src/search/magic-search.h | 22 +++++- tester/setup_tester.c | 148 +++++++++++++++++++++++++++--------- 3 files changed, 192 insertions(+), 65 deletions(-) diff --git a/src/search/magic-search.cpp b/src/search/magic-search.cpp index df23ef61c..951bbcc6b 100644 --- a/src/search/magic-search.cpp +++ b/src/search/magic-search.cpp @@ -154,19 +154,36 @@ void MagicSearch::setSearchCache(list *cache) { list *MagicSearch::beginNewSearch(const string &filter, const string &withDomain) { list *resultList = new list(); - LinphoneFriendList* list = linphone_core_get_default_friend_list(this->getCore()->getCCore()); + LinphoneFriendList *list = linphone_core_get_default_friend_list(this->getCore()->getCCore()); + const bctbx_list_t *callLog = linphone_core_get_call_logs(this->getCore()->getCCore()); // For all friends or when we reach the search limit for (bctbx_list_t *f = list->friends; f != nullptr && (!getLimitedSearch() || resultList->size() < getSearchLimit()); - f = bctbx_list_next(f) + f = bctbx_list_next(f) ) { - SearchResult result = search(reinterpret_cast(f->data), filter, withDomain); + SearchResult result = searchInFriend(reinterpret_cast(f->data), filter, withDomain); if (result.getWeight() > getMinWeight()) { resultList->push_back(result); } } + // For all call log or when we reach the search limit + for (const bctbx_list_t *f = callLog; + f != nullptr && (!getLimitedSearch() || resultList->size() < getSearchLimit()); + f = bctbx_list_next(f) + ) { + LinphoneCallLog *log = reinterpret_cast(f->data); + const LinphoneAddress *addr = (linphone_call_log_get_dir(log) == LinphoneCallDir::LinphoneCallIncoming) ? + linphone_call_log_get_from_address(log) : linphone_call_log_get_to_address(log); + if (addr) { + unsigned int weight = searchInAddress(addr, filter, withDomain); + if (weight > getMinWeight()) { + resultList->push_back(SearchResult(weight, addr, nullptr)); + } + } + } + return resultList; } @@ -176,7 +193,7 @@ list *MagicSearch::continueSearch(const string &filter, const stri for (const auto sr : *cacheList) { if (sr.getFriend()) { - SearchResult result = search(sr.getFriend(), filter, withDomain); + SearchResult result = searchInFriend(sr.getFriend(), filter, withDomain); if (result.getWeight() > getMinWeight()) { resultList->push_back(result); } @@ -186,39 +203,20 @@ list *MagicSearch::continueSearch(const string &filter, const stri return resultList; } -SearchResult MagicSearch::search(const LinphoneFriend* lFriend, const string &filter, const string &withDomain) { +SearchResult MagicSearch::searchInFriend(const LinphoneFriend *lFriend, const string &filter, const string &withDomain) { unsigned int weight = getMinWeight(); const LinphoneAddress* lAddress = linphone_friend_get_address(lFriend); - bool allDomain = !withDomain.empty() && withDomain.compare("*") == 0; - if (allDomain && - lAddress == nullptr && - linphone_friend_get_presence_model(lFriend) == nullptr - ) return SearchResult(weight, nullptr); - - // Check domain - if (!allDomain && - !withDomain.empty() && - lAddress != nullptr && - withDomain.compare(linphone_address_get_domain(lAddress)) != 0 - ) return SearchResult(weight, nullptr); - - if (lAddress != nullptr) { - // SIPURI - if (linphone_address_get_username(lAddress) != nullptr) { - weight += getWeight(linphone_address_get_username(lAddress), filter); - } - // DISPLAYNAME - if (linphone_address_get_display_name(lAddress) != nullptr) { - weight += getWeight(linphone_address_get_display_name(lAddress), filter); - } - } + if (!checkDomain(lFriend, lAddress, withDomain)) return SearchResult(weight, nullptr); // NAME if (linphone_friend_get_name(lFriend) != nullptr) { weight += getWeight(linphone_friend_get_name(lFriend), filter); } + //SIP URI + weight += searchInAddress(lAddress, filter, withDomain); + // PHONE NUMBER bctbx_list_t *begin, *phoneNumbers = linphone_friend_get_phone_numbers(lFriend); begin = phoneNumbers; @@ -236,6 +234,21 @@ SearchResult MagicSearch::search(const LinphoneFriend* lFriend, const string &fi return SearchResult(weight, lAddress, lFriend); } +unsigned int MagicSearch::searchInAddress(const LinphoneAddress *lAddress, const string &filter, const string &withDomain) { + unsigned int weight = getMinWeight(); + if (lAddress != nullptr && checkDomain(nullptr, lAddress, withDomain)) { + // SIPURI + if (linphone_address_get_username(lAddress) != nullptr) { + weight += getWeight(linphone_address_get_username(lAddress), filter); + } + // DISPLAYNAME + if (linphone_address_get_display_name(lAddress) != nullptr) { + weight += getWeight(linphone_address_get_display_name(lAddress), filter); + } + } + return weight; +} + unsigned int MagicSearch::getWeight(const string &stringWords, const string &filter) const { size_t weight = string::npos; @@ -271,4 +284,22 @@ unsigned int MagicSearch::getWeight(const string &stringWords, const string &fil return (weight != string::npos) ? (unsigned int)(weight) : getMinWeight(); } +bool MagicSearch::checkDomain(const LinphoneFriend *lFriend, const LinphoneAddress *lAddress, const string &withDomain) const { + bool onlySipUri = !withDomain.empty() && withDomain.compare("*") != 0; + const LinphonePresenceModel *presenceModel = (lFriend) ? linphone_friend_get_presence_model(lFriend) : nullptr; + const char *contactPresence = (presenceModel) ? linphone_presence_model_get_contact(presenceModel) : nullptr; + const LinphoneAddress *addrPresence = (contactPresence) ? + linphone_core_create_address(this->getCore()->getCCore(), contactPresence) : nullptr; + + return ( + // If we don't want Sip URI only or Address or Presence model + (!onlySipUri || lAddress != nullptr || presenceModel != nullptr) && + // And If we don't want Sip URI only or Address match or Address presence match + (!onlySipUri || + (lAddress != nullptr && withDomain.compare(linphone_address_get_domain(lAddress)) == 0) || + (addrPresence != nullptr && withDomain.compare(linphone_address_get_domain(addrPresence)) == 0) + ) + ); +} + LINPHONE_END_NAMESPACE diff --git a/src/search/magic-search.h b/src/search/magic-search.h index e360ea249..3776af288 100644 --- a/src/search/magic-search.h +++ b/src/search/magic-search.h @@ -156,13 +156,22 @@ private: std::list *continueSearch(const std::string &filter, const std::string &withDomain); /** - * Continue the search from the cache of precedent search + * Search informations in friend given * @param[in] lFriend friend whose informations will be check * @param[in] filter word we search * @param[in] withDomain domain which we want to search only * @private **/ - SearchResult search(const LinphoneFriend* lFriend, const std::string &filter, const std::string &withDomain); + SearchResult searchInFriend(const LinphoneFriend* lFriend, const std::string &filter, const std::string &withDomain); + + /** + * Search informations in address given + * @param[in] lAddress address whose informations will be check + * @param[in] filter word we search + * @param[in] withDomain domain which we want to search only + * @private + **/ + unsigned int searchInAddress(const LinphoneAddress *lAddress, const std::string &filter, const std::string &withDomain); /** * Return a weight for a searched in with a filter @@ -173,6 +182,15 @@ private: **/ unsigned int getWeight(const std::string &stringWords, const std::string &filter) const; + /** + * Return if the given address match domain policy + * @param[in] lFriend friend whose domain will be check + * @param[in] lAddress address whose domain will be check + * @param[in] withDomain domain policy + * @private + **/ + bool checkDomain(const LinphoneFriend* lFriend, const LinphoneAddress *lAddress, const std::string &withDomain) const; + L_DECLARE_PRIVATE(MagicSearch); }; diff --git a/tester/setup_tester.c b/tester/setup_tester.c index 692e1b5a8..7e1e90adc 100644 --- a/tester/setup_tester.c +++ b/tester/setup_tester.c @@ -28,8 +28,8 @@ #define S_SIZE_FRIEND 12 static const unsigned int sSizeFriend = S_SIZE_FRIEND; static const char *sFriends[S_SIZE_FRIEND] = { - "sip:test@sip.example.org",//0 - "sip:test2@sip.example.org",//1 + "sip:charu@sip.test.org",//0 + "sip:charette@sip.example.org",//1 "sip:allo@sip.example.org",//2 "sip:hello@sip.example.org",//3 "sip:hello@sip.test.org",//4 @@ -56,10 +56,13 @@ static void _remove_friends_from_list(LinphoneFriendList *list, const char *frie } } -static void _check_friend_result_list(const bctbx_list_t *resultList, const unsigned int index, const char* uri, const char* phone) { +static void _check_friend_result_list(LinphoneCore *lc, const bctbx_list_t *resultList, const unsigned int index, const char* uri, const char* phone) { + if (index >= bctbx_list_size(resultList)) { + ms_error("Attempt to access result to an outbound index"); + return; + } const LinphoneSearchResult *sr = bctbx_list_nth_data(resultList, index); const LinphoneFriend *lf = linphone_search_result_get_friend(sr); - BC_ASSERT_PTR_NOT_NULL(lf); if (lf != NULL) { const LinphoneAddress *la = linphone_friend_get_address(lf); if (la != NULL) { @@ -77,10 +80,29 @@ static void _check_friend_result_list(const bctbx_list_t *resultList, const unsi return; } } + } else { + const bctbx_list_t *callLog = linphone_core_get_call_logs(lc); + for (const bctbx_list_t *f = callLog ; f != NULL ; f = bctbx_list_next(f)) { + LinphoneCallLog *log = (LinphoneCallLog*)(f->data); + const LinphoneAddress *addr = (linphone_call_log_get_dir(log) == LinphoneCallIncoming) ? + linphone_call_log_get_from_address(log) : linphone_call_log_get_to_address(log); + if (addr) { + char *addrUri = linphone_address_as_string_uri_only(addr); + if (addrUri && strcmp(addrUri, uri) == 0) { + return; + } + if (addrUri) free(addrUri); + } + } } + BC_ASSERT(FALSE); ms_error("Address NULL and Presence NULL"); } +static void _create_call_log(LinphoneCore *lc, LinphoneAddress *addrFrom, LinphoneAddress *addrTo) { + linphone_core_create_call_log(lc, addrFrom, addrTo, LinphoneCallOutgoing, 100, time(NULL), time(NULL), LinphoneCallSuccess, FALSE, 1.0); +} + static void linphone_version_test(void){ const char *version=linphone_core_get_version(); /*make sure the git version is always included in the version number*/ @@ -467,9 +489,9 @@ static void search_friend_all_domains(void) { if (resultList != NULL) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 3, int, "%d"); - _check_friend_result_list(resultList, 0, sFriends[2], NULL);//"sip:allo@sip.example.org" - _check_friend_result_list(resultList, 1, sFriends[3], NULL);//"sip:hello@sip.example.org" - _check_friend_result_list(resultList, 2, sFriends[4], NULL);//"sip:hello@sip.test.org" + _check_friend_result_list(manager->lc, resultList, 0, sFriends[2], NULL);//"sip:allo@sip.example.org" + _check_friend_result_list(manager->lc, resultList, 1, sFriends[3], NULL);//"sip:hello@sip.example.org" + _check_friend_result_list(manager->lc, resultList, 2, sFriends[4], NULL);//"sip:hello@sip.test.org" } free(resultList); @@ -495,8 +517,8 @@ static void search_friend_one_domain(void) { if (resultList != NULL) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 2, int, "%d"); - _check_friend_result_list(resultList, 0, sFriends[2], NULL);//"sip:allo@sip.example.org" - _check_friend_result_list(resultList, 1, sFriends[3], NULL);//"sip:hello@sip.example.org" + _check_friend_result_list(manager->lc, resultList, 0, sFriends[2], NULL);//"sip:allo@sip.example.org" + _check_friend_result_list(manager->lc, resultList, 1, sFriends[3], NULL);//"sip:hello@sip.example.org" } free(resultList); @@ -522,13 +544,13 @@ static void search_friend_research_estate(void) { if (resultList != NULL) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 7, int, "%d"); - _check_friend_result_list(resultList, 0, sFriends[6], NULL);//"sip:laura@sip.example.org" - _check_friend_result_list(resultList, 1, sFriends[7], NULL);//"sip:loic@sip.example.org" - _check_friend_result_list(resultList, 2, sFriends[8], NULL);//"sip:laure@sip.test.org" - _check_friend_result_list(resultList, 3, sFriends[9], NULL);//"sip:loic@sip.test.org" - _check_friend_result_list(resultList, 4, sFriends[2], NULL);//"sip:allo@sip.example.org" - _check_friend_result_list(resultList, 5, sFriends[3], NULL);//"sip:hello@sip.example.org" - _check_friend_result_list(resultList, 6, sFriends[4], NULL);//"sip:hello@sip.test.org" + _check_friend_result_list(manager->lc, resultList, 0, sFriends[6], NULL);//"sip:laura@sip.example.org" + _check_friend_result_list(manager->lc, resultList, 1, sFriends[7], NULL);//"sip:loic@sip.example.org" + _check_friend_result_list(manager->lc, resultList, 2, sFriends[8], NULL);//"sip:laure@sip.test.org" + _check_friend_result_list(manager->lc, resultList, 3, sFriends[9], NULL);//"sip:loic@sip.test.org" + _check_friend_result_list(manager->lc, resultList, 4, sFriends[2], NULL);//"sip:allo@sip.example.org" + _check_friend_result_list(manager->lc, resultList, 5, sFriends[3], NULL);//"sip:hello@sip.example.org" + _check_friend_result_list(manager->lc, resultList, 6, sFriends[4], NULL);//"sip:hello@sip.test.org" } free(resultList); @@ -539,8 +561,8 @@ static void search_friend_research_estate(void) { if (resultList != NULL) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 2, int, "%d"); - _check_friend_result_list(resultList, 0, sFriends[8], NULL);//"sip:laure@sip.test.org" - _check_friend_result_list(resultList, 1, sFriends[6], NULL);//"sip:laura@sip.example.org" + _check_friend_result_list(manager->lc, resultList, 0, sFriends[8], NULL);//"sip:laure@sip.test.org" + _check_friend_result_list(manager->lc, resultList, 1, sFriends[6], NULL);//"sip:laura@sip.example.org" } free(resultList); @@ -566,8 +588,8 @@ static void search_friend_research_estate_reset(void) { if (resultList != NULL) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 2, int, "%d"); - _check_friend_result_list(resultList, 0, sFriends[6], NULL);//"sip:laura@sip.example.org" - _check_friend_result_list(resultList, 1, sFriends[8], NULL);//"sip:laure@sip.test.org" + _check_friend_result_list(manager->lc, resultList, 0, sFriends[6], NULL);//"sip:laura@sip.example.org" + _check_friend_result_list(manager->lc, resultList, 1, sFriends[8], NULL);//"sip:laure@sip.test.org" } free(resultList); @@ -580,13 +602,13 @@ static void search_friend_research_estate_reset(void) { if (resultList != NULL) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 7, int, "%d"); - _check_friend_result_list(resultList, 0, sFriends[6], NULL);//"sip:laura@sip.example.org" - _check_friend_result_list(resultList, 1, sFriends[7], NULL);//"sip:loic@sip.example.org" - _check_friend_result_list(resultList, 2, sFriends[8], NULL);//"sip:laure@sip.test.org" - _check_friend_result_list(resultList, 3, sFriends[9], NULL);//"sip:loic@sip.test.org" - _check_friend_result_list(resultList, 4, sFriends[2], NULL);//"sip:allo@sip.example.org" - _check_friend_result_list(resultList, 5, sFriends[3], NULL);//"sip:hello@sip.example.org" - _check_friend_result_list(resultList, 6, sFriends[4], NULL);//"sip:hello@sip.test.org" + _check_friend_result_list(manager->lc, resultList, 0, sFriends[6], NULL);//"sip:laura@sip.example.org" + _check_friend_result_list(manager->lc, resultList, 1, sFriends[7], NULL);//"sip:loic@sip.example.org" + _check_friend_result_list(manager->lc, resultList, 2, sFriends[8], NULL);//"sip:laure@sip.test.org" + _check_friend_result_list(manager->lc, resultList, 3, sFriends[9], NULL);//"sip:loic@sip.test.org" + _check_friend_result_list(manager->lc, resultList, 4, sFriends[2], NULL);//"sip:allo@sip.example.org" + _check_friend_result_list(manager->lc, resultList, 5, sFriends[3], NULL);//"sip:hello@sip.example.org" + _check_friend_result_list(manager->lc, resultList, 6, sFriends[4], NULL);//"sip:hello@sip.test.org" } free(resultList); @@ -616,9 +638,9 @@ static void search_friend_with_phone_number(void) { if (resultList != NULL) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 3, int, "%d"); - _check_friend_result_list(resultList, 0, sFriends[11], NULL);//"sip:+111223344@sip.example.org" - _check_friend_result_list(resultList, 1, sFriends[10], NULL);//"sip:+33655667788@sip.example.org" - _check_friend_result_list(resultList, 2, sFriends[5], NULL);//"sip:marie@sip.example.org" + _check_friend_result_list(manager->lc, resultList, 0, sFriends[11], NULL);//"sip:+111223344@sip.example.org" + _check_friend_result_list(manager->lc, resultList, 1, sFriends[10], NULL);//"sip:+33655667788@sip.example.org" + _check_friend_result_list(manager->lc, resultList, 2, sFriends[5], NULL);//"sip:marie@sip.example.org" } free(resultList); @@ -658,9 +680,9 @@ static void search_friend_with_presence(void) { if (resultList != NULL) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 3, int, "%d"); - _check_friend_result_list(resultList, 0, sFriends[11], NULL);//"sip:+111223344@sip.example.org" - _check_friend_result_list(resultList, 1, chloeSipUri, chloePhoneNumber);//"sip:chloe@sip.example.org" - _check_friend_result_list(resultList, 2, sFriends[10], NULL);//"sip:+33655667788@sip.example.org" + _check_friend_result_list(manager->lc, resultList, 0, sFriends[11], NULL);//"sip:+111223344@sip.example.org" + _check_friend_result_list(manager->lc, resultList, 1, chloeSipUri, chloePhoneNumber);//"sip:chloe@sip.example.org" + _check_friend_result_list(manager->lc, resultList, 2, sFriends[10], NULL);//"sip:+33655667788@sip.example.org" } free(resultList); @@ -673,7 +695,7 @@ static void search_friend_with_presence(void) { if (resultList != NULL) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 1, int, "%d"); - _check_friend_result_list(resultList, 0, chloeSipUri, chloePhoneNumber);//"sip:chloe@sip.example.org" + _check_friend_result_list(manager->lc, resultList, 0, chloeSipUri, chloePhoneNumber);//"sip:chloe@sip.example.org" } free(resultList); @@ -687,6 +709,61 @@ static void search_friend_with_presence(void) { linphone_core_manager_destroy(manager); } +static void search_friend_in_call_log(void) { + LinphoneMagicSearch *magicSearch = NULL; + bctbx_list_t *resultList = NULL; + LinphoneCoreManager* manager = linphone_core_manager_new2("empty_rc", FALSE); + LinphoneFriendList *lfl = linphone_core_get_default_friend_list(manager->lc); + const char *chloeSipUri = {"sip:chloe@sip.example.org"}; + const char *benjaminSipUri = {"sip:benjamin@sip.example.org"}; + const char *charlesSipUri = {"sip:charles@sip.test.org"}; + const char *ronanSipUri = {"sip:ronan@sip.example.org"}; + LinphoneAddress *chloeAddress = linphone_address_new(chloeSipUri); + LinphoneAddress *benjaminAddress = linphone_address_new(benjaminSipUri); + LinphoneAddress *charlesAddress = linphone_address_new(charlesSipUri); + LinphoneAddress *ronanAddress = linphone_address_new(ronanSipUri); + + _create_call_log(manager->lc, ronanAddress, chloeAddress); + _create_call_log(manager->lc, ronanAddress, charlesAddress); + _create_call_log(manager->lc, ronanAddress, benjaminAddress); + + _create_friends_from_tab(manager->lc, lfl, sFriends, sSizeFriend); + + magicSearch = linphone_magic_search_new(manager->lc); + + resultList = linphone_magic_search_get_contact_list_from_filter(magicSearch, "ch", ""); + + BC_ASSERT_PTR_NOT_NULL(resultList); + + if (resultList != NULL) { + BC_ASSERT_EQUAL(bctbx_list_size(resultList), 4, int, "%d"); + _check_friend_result_list(manager->lc, resultList, 0, sFriends[0], NULL);//"sip:charu@sip.test.org" + _check_friend_result_list(manager->lc, resultList, 1, sFriends[1], NULL);//"sip:charette@sip.example.org" + _check_friend_result_list(manager->lc, resultList, 2, chloeSipUri, NULL);//"sip:chloe@sip.example.org" + _check_friend_result_list(manager->lc, resultList, 3, charlesSipUri, NULL);//"sip:charles@sip.test.org" + } + + free(resultList); + + linphone_magic_search_reset_search_cache(magicSearch); + + resultList = linphone_magic_search_get_contact_list_from_filter(magicSearch, "ch", "sip.test.org"); + + BC_ASSERT_PTR_NOT_NULL(resultList); + + if (resultList != NULL) { + BC_ASSERT_EQUAL(bctbx_list_size(resultList), 2, int, "%d"); + _check_friend_result_list(manager->lc, resultList, 0, sFriends[0], NULL);//"sip:charu@sip.test.org" + _check_friend_result_list(manager->lc, resultList, 1, charlesSipUri, NULL);//"sip:charles@sip.test.org" + } + + free(resultList); + + _remove_friends_from_list(lfl, sFriends, sSizeFriend); + + linphone_core_manager_destroy(manager); +} + static void search_friend_large_database(void) { MSTimeSpec start, current; LinphoneMagicSearch *magicSearch = NULL; @@ -739,7 +816,8 @@ test_t setup_tests[] = { TEST_TWO_TAGS("Multiple looking for friends with cache resetting", search_friend_research_estate_reset, "MagicSearch", "LeaksMemory"), TEST_TWO_TAGS("Search friend with phone number", search_friend_with_phone_number, "MagicSearch", "LeaksMemory"), TEST_TWO_TAGS("Search friend and find it with its presence", search_friend_with_presence, "MagicSearch", "LeaksMemory"), - TEST_TWO_TAGS("search friend in large friends database", search_friend_large_database, "MagicSearch", "LeaksMemory") + TEST_TWO_TAGS("Search friend in call log", search_friend_in_call_log, "MagicSearch", "LeaksMemory"), + TEST_TWO_TAGS("Search friend in large friends database", search_friend_large_database, "MagicSearch", "LeaksMemory") }; test_suite_t setup_test_suite = {"Setup", NULL, NULL, liblinphone_tester_before_each, liblinphone_tester_after_each, From a38031e1820e2c01544073382ebae5245c96fae8 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Wed, 21 Feb 2018 13:47:19 +0100 Subject: [PATCH 112/281] fix(MainDb): conference_event_view is compatible with mysql --- include/linphone/utils/enum-mask.h | 8 ++--- src/db/internal/statements.cpp | 52 +++++++++++++++++++++-------- tester/db/linphone.db | Bin 4382720 -> 4382720 bytes 3 files changed, 43 insertions(+), 17 deletions(-) diff --git a/include/linphone/utils/enum-mask.h b/include/linphone/utils/enum-mask.h index a385401f3..53eac2c5f 100644 --- a/include/linphone/utils/enum-mask.h +++ b/include/linphone/utils/enum-mask.h @@ -138,10 +138,10 @@ private: return (mMask & value) == value && (value || mMask == 0); } -// On CentOs 7 GCC 4.8.5 have issue with array-bounds +// On CentOs 7 GCC 4.8.5 have issue with array-bounds. #if __GNUC__ == 4 && __GNUC_MINOR__ == 8 && __GNUC_PATCHLEVEL__ == 5 -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Warray-bounds" + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Warray-bounds" #endif static constexpr StorageType init ( @@ -152,7 +152,7 @@ private: } #if __GNUC__ == 4 && __GNUC_MINOR__ == 8 && __GNUC_PATCHLEVEL__ == 5 -#pragma GCC diagnostic pop + #pragma GCC diagnostic pop #endif StorageType mMask; diff --git a/src/db/internal/statements.cpp b/src/db/internal/statements.cpp index 900c6a927..866159d0c 100644 --- a/src/db/internal/statements.cpp +++ b/src/db/internal/statements.cpp @@ -24,22 +24,48 @@ LINPHONE_BEGIN_NAMESPACE namespace Statements { + using Backend = AbstractDb::Backend; + + struct Statement { + template + constexpr Statement (Backend _backend, const char (&_sql)[N]) : backend(_backend), sql(_sql) {} + + Backend backend; + const char *sql; + }; + + struct AbstractStatement { + public: + template + constexpr AbstractStatement (const char (&_sql)[N]) : mSql{ _sql, nullptr } {} + + constexpr AbstractStatement (const Statement &a, const Statement &b) : mSql{ a.sql, b.sql } {} + + const char *getSql (Backend backend) const { + return backend == Backend::Mysql && mSql[1] ? mSql[1] : mSql[0]; + } + + private: + const char *mSql[2]; + }; + // --------------------------------------------------------------------------- // Create statements. // --------------------------------------------------------------------------- - constexpr const char *create[CreateCount] = { - [CreateConferenceEventView] = R"( - CREATE TEMP VIEW conference_event_view AS - SELECT id, type, creation_time, chat_room_id, from_sip_address_id, to_sip_address_id, time, imdn_message_id, state, direction, is_secured, notify_id, device_sip_address_id, participant_sip_address_id, subject - FROM event - LEFT JOIN conference_event ON conference_event.event_id = event.id - LEFT JOIN conference_chat_message_event ON conference_chat_message_event.event_id = event.id - LEFT JOIN conference_notified_event ON conference_notified_event.event_id = event.id - LEFT JOIN conference_participant_device_event ON conference_participant_device_event.event_id = event.id - LEFT JOIN conference_participant_event ON conference_participant_event.event_id = event.id - LEFT JOIN conference_subject_event ON conference_subject_event.event_id = event.id - )" + constexpr AbstractStatement create[CreateCount] = { + [CreateConferenceEventView] = + R"( + CREATE VIEW IF NOT EXISTS conference_event_view AS + SELECT id, type, creation_time, chat_room_id, from_sip_address_id, to_sip_address_id, time, imdn_message_id, state, direction, is_secured, notify_id, device_sip_address_id, participant_sip_address_id, subject + FROM event + LEFT JOIN conference_event ON conference_event.event_id = event.id + LEFT JOIN conference_chat_message_event ON conference_chat_message_event.event_id = event.id + LEFT JOIN conference_notified_event ON conference_notified_event.event_id = event.id + LEFT JOIN conference_participant_device_event ON conference_participant_device_event.event_id = event.id + LEFT JOIN conference_participant_event ON conference_participant_event.event_id = event.id + LEFT JOIN conference_subject_event ON conference_subject_event.event_id = event.id + )" }; // --------------------------------------------------------------------------- @@ -64,7 +90,7 @@ namespace Statements { const char *get (Create createStmt, AbstractDb::Backend backend) { (void)backend; - return createStmt >= Create::CreateCount ? nullptr : create[createStmt]; + return createStmt >= Create::CreateCount ? nullptr : create[createStmt].getSql(backend); } const char *get (Select selectStmt, AbstractDb::Backend backend) { diff --git a/tester/db/linphone.db b/tester/db/linphone.db index ae7fe37abfda8ce2a6e080f37dbc361e3f3df2f2..d41b202f16b13cd7a991988a27276463babeabf3 100644 GIT binary patch delta 978 zcma*lJ#W)M7zc1WPV?3z5TMYP6s~Q;Thc&DOQ2BNP`Of2X{0uS4WEfGaG=KpV1F-WgK!U#=255>}OF!M+R?H52YDl_D?M8fQ=HhTdQ%)9XxOYfQJ5{|4um z<#J6XcPjE-vS$@3uf(EwR^&x_zDBr~C-!=ac8WY}CcY~EP+ z6E)lyw{+i3iAi^ET1+F=TD|`WW&UR`ELU$6zX$$uQC_H#Th+=^*JVkyJ67m4k85P6 zvqynzyS8yt6XLMD)teX@J4p81ad9B%9p!qn(fv!@_mg5aP+juI%mMTJ-JOEiBjFgY zs1K@ z3J8qAD2zb{vTz#Cz*#s4=OG7q7>5E}fQv8zm!JrfFa?*P1XtiHOv5#}4l{5AW?>G> K+wIWJ;D@hRIExu#ZyVDq*T&x z;=lZr(>5}m>)j=v{hB}ae=?t0*G7p+>UZ>U|7r)3%^-^$W|7An3YbR`3s}SwN+_d( zWvpNoYp7x!8`#7aYS=~{4Kxv82Q9SGK^ME&!#+YB;1EYR#tBYwhI3rt5?AQq8aLy} H-iF`*Srl>w From b5ed8c1f778aeccfc52947e05c2e75719a95bc11 Mon Sep 17 00:00:00 2001 From: Erwan Croze Date: Wed, 21 Feb 2018 15:23:30 +0100 Subject: [PATCH 113/281] Adding a last item in magic search searching when we have a proxy config --- include/linphone/api/c-magic-search.h | 1 + src/search/magic-search.cpp | 11 +++++++++++ src/search/magic-search.h | 1 + 3 files changed, 13 insertions(+) diff --git a/include/linphone/api/c-magic-search.h b/include/linphone/api/c-magic-search.h index 72d68029c..1bd04a72f 100644 --- a/include/linphone/api/c-magic-search.h +++ b/include/linphone/api/c-magic-search.h @@ -120,6 +120,7 @@ LINPHONE_PUBLIC void linphone_magic_search_reset_search_cache(LinphoneMagicSearc /** * Create a sorted list of SearchResult from SipUri, Contact name, * Contact displayname, Contact phone number, which match with a filter word + * The last item list will be an address formed with "filter" if a proxy config exist * During the first search, a cache is created and used for the next search and so on * Use linphone_magic_search_reset_search_cache() to begin a new search * @param[in] filter word we search diff --git a/src/search/magic-search.cpp b/src/search/magic-search.cpp index 951bbcc6b..110c5165d 100644 --- a/src/search/magic-search.cpp +++ b/src/search/magic-search.cpp @@ -116,6 +116,7 @@ void MagicSearch::resetSearchCache() { list MagicSearch::getContactListFromFilter(const string &filter, const string &withDomain) { list *resultList; + LinphoneProxyConfig *proxy = nullptr; if (filter.empty()) return list(); @@ -132,6 +133,16 @@ list MagicSearch::getContactListFromFilter(const string &filter, c return lsr >= rsr; }); + proxy = linphone_core_get_default_proxy_config(this->getCore()->getCCore()); + // Adding last item if proxy exist + if (proxy) { + const char *domain = linphone_proxy_config_get_domain(proxy); + if (domain) { + string filterAddress = "sip:" + filter + "@" + domain; + LinphoneAddress *lastResult = linphone_core_create_address(this->getCore()->getCCore(), filterAddress.c_str()); + if (lastResult) resultList->push_back(SearchResult(0, lastResult, nullptr)); + } + } setSearchCache(resultList); return *resultList; diff --git a/src/search/magic-search.h b/src/search/magic-search.h index 3776af288..3c7331fef 100644 --- a/src/search/magic-search.h +++ b/src/search/magic-search.h @@ -113,6 +113,7 @@ public: /** * Create a sorted list of SearchResult from SipUri, Contact name, * Contact displayname, Contact phone number, which match with a filter word + * The last item list will be an address formed with "filter" if a proxy config exist * During the first search, a cache is created and used for the next search and so on * Use resetSearchCache() to begin a new search * @param[in] filter word we search From f2cbcee34f85dd4f09a29d1257afd90d6226f8b6 Mon Sep 17 00:00:00 2001 From: Erwan Croze Date: Wed, 21 Feb 2018 15:26:03 +0100 Subject: [PATCH 114/281] Updating magic search tests --- tester/setup_tester.c | 125 +++++++++++++++++++++--------------------- 1 file changed, 61 insertions(+), 64 deletions(-) diff --git a/tester/setup_tester.c b/tester/setup_tester.c index 7e1e90adc..32253af20 100644 --- a/tester/setup_tester.c +++ b/tester/setup_tester.c @@ -72,8 +72,7 @@ static void _check_friend_result_list(LinphoneCore *lc, const bctbx_list_t *resu return; } else if (phone != NULL) { const LinphonePresenceModel *presence = linphone_friend_get_presence_model_for_uri_or_tel(lf, phone); - BC_ASSERT_PTR_NOT_NULL(presence); - if (presence != NULL) { + if (BC_ASSERT_PTR_NOT_NULL(presence)) { char *contact = linphone_presence_model_get_contact(presence); BC_ASSERT_STRING_EQUAL(contact, uri); free(contact); @@ -485,17 +484,14 @@ static void search_friend_all_domains(void) { resultList = linphone_magic_search_get_contact_list_from_filter(magicSearch, "llo", ""); - BC_ASSERT_PTR_NOT_NULL(resultList); - - if (resultList != NULL) { + if (BC_ASSERT_PTR_NOT_NULL(resultList)) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 3, int, "%d"); _check_friend_result_list(manager->lc, resultList, 0, sFriends[2], NULL);//"sip:allo@sip.example.org" _check_friend_result_list(manager->lc, resultList, 1, sFriends[3], NULL);//"sip:hello@sip.example.org" _check_friend_result_list(manager->lc, resultList, 2, sFriends[4], NULL);//"sip:hello@sip.test.org" + free(resultList); } - free(resultList); - _remove_friends_from_list(lfl, sFriends, sSizeFriend); linphone_core_manager_destroy(manager); @@ -513,15 +509,13 @@ static void search_friend_one_domain(void) { resultList = linphone_magic_search_get_contact_list_from_filter(magicSearch, "llo", "sip.example.org"); - BC_ASSERT_PTR_NOT_NULL(resultList); - - if (resultList != NULL) { + if (BC_ASSERT_PTR_NOT_NULL(resultList)) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 2, int, "%d"); _check_friend_result_list(manager->lc, resultList, 0, sFriends[2], NULL);//"sip:allo@sip.example.org" _check_friend_result_list(manager->lc, resultList, 1, sFriends[3], NULL);//"sip:hello@sip.example.org" + free(resultList); } - free(resultList); _remove_friends_from_list(lfl, sFriends, sSizeFriend); @@ -540,9 +534,7 @@ static void search_friend_research_estate(void) { resultList = linphone_magic_search_get_contact_list_from_filter(magicSearch, "l", ""); - BC_ASSERT_PTR_NOT_NULL(resultList); - - if (resultList != NULL) { + if (BC_ASSERT_PTR_NOT_NULL(resultList)) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 7, int, "%d"); _check_friend_result_list(manager->lc, resultList, 0, sFriends[6], NULL);//"sip:laura@sip.example.org" _check_friend_result_list(manager->lc, resultList, 1, sFriends[7], NULL);//"sip:loic@sip.example.org" @@ -551,22 +543,18 @@ static void search_friend_research_estate(void) { _check_friend_result_list(manager->lc, resultList, 4, sFriends[2], NULL);//"sip:allo@sip.example.org" _check_friend_result_list(manager->lc, resultList, 5, sFriends[3], NULL);//"sip:hello@sip.example.org" _check_friend_result_list(manager->lc, resultList, 6, sFriends[4], NULL);//"sip:hello@sip.test.org" + free(resultList); } - free(resultList); - resultList = linphone_magic_search_get_contact_list_from_filter(magicSearch, "la", ""); - BC_ASSERT_PTR_NOT_NULL(resultList); - - if (resultList != NULL) { + if (BC_ASSERT_PTR_NOT_NULL(resultList)) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 2, int, "%d"); _check_friend_result_list(manager->lc, resultList, 0, sFriends[8], NULL);//"sip:laure@sip.test.org" _check_friend_result_list(manager->lc, resultList, 1, sFriends[6], NULL);//"sip:laura@sip.example.org" + free(resultList); } - free(resultList); - _remove_friends_from_list(lfl, sFriends, sSizeFriend); linphone_core_manager_destroy(manager); @@ -584,23 +572,18 @@ static void search_friend_research_estate_reset(void) { resultList = linphone_magic_search_get_contact_list_from_filter(magicSearch, "la", ""); - BC_ASSERT_PTR_NOT_NULL(resultList); - - if (resultList != NULL) { + if (BC_ASSERT_PTR_NOT_NULL(resultList)) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 2, int, "%d"); _check_friend_result_list(manager->lc, resultList, 0, sFriends[6], NULL);//"sip:laura@sip.example.org" _check_friend_result_list(manager->lc, resultList, 1, sFriends[8], NULL);//"sip:laure@sip.test.org" + free(resultList); } - free(resultList); - linphone_magic_search_reset_search_cache(magicSearch); resultList = linphone_magic_search_get_contact_list_from_filter(magicSearch, "l", ""); - BC_ASSERT_PTR_NOT_NULL(resultList); - - if (resultList != NULL) { + if (BC_ASSERT_PTR_NOT_NULL(resultList)) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 7, int, "%d"); _check_friend_result_list(manager->lc, resultList, 0, sFriends[6], NULL);//"sip:laura@sip.example.org" _check_friend_result_list(manager->lc, resultList, 1, sFriends[7], NULL);//"sip:loic@sip.example.org" @@ -609,11 +592,9 @@ static void search_friend_research_estate_reset(void) { _check_friend_result_list(manager->lc, resultList, 4, sFriends[2], NULL);//"sip:allo@sip.example.org" _check_friend_result_list(manager->lc, resultList, 5, sFriends[3], NULL);//"sip:hello@sip.example.org" _check_friend_result_list(manager->lc, resultList, 6, sFriends[4], NULL);//"sip:hello@sip.test.org" + free(resultList); } - free(resultList); - - _remove_friends_from_list(lfl, sFriends, sSizeFriend); linphone_core_manager_destroy(manager); @@ -634,17 +615,14 @@ static void search_friend_with_phone_number(void) { resultList = linphone_magic_search_get_contact_list_from_filter(magicSearch, "33", ""); - BC_ASSERT_PTR_NOT_NULL(resultList); - - if (resultList != NULL) { + if (BC_ASSERT_PTR_NOT_NULL(resultList)) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 3, int, "%d"); _check_friend_result_list(manager->lc, resultList, 0, sFriends[11], NULL);//"sip:+111223344@sip.example.org" _check_friend_result_list(manager->lc, resultList, 1, sFriends[10], NULL);//"sip:+33655667788@sip.example.org" _check_friend_result_list(manager->lc, resultList, 2, sFriends[5], NULL);//"sip:marie@sip.example.org" + free(resultList); } - free(resultList); - _remove_friends_from_list(lfl, sFriends, sSizeFriend); linphone_core_manager_destroy(manager); @@ -676,30 +654,26 @@ static void search_friend_with_presence(void) { resultList = linphone_magic_search_get_contact_list_from_filter(magicSearch, "33", ""); - BC_ASSERT_PTR_NOT_NULL(resultList); - - if (resultList != NULL) { - BC_ASSERT_EQUAL(bctbx_list_size(resultList), 3, int, "%d"); + if (BC_ASSERT_PTR_NOT_NULL(resultList)) { + // 3 + last address from filter "sip:33@sip.example.org" + BC_ASSERT_EQUAL(bctbx_list_size(resultList), 4, int, "%d"); _check_friend_result_list(manager->lc, resultList, 0, sFriends[11], NULL);//"sip:+111223344@sip.example.org" _check_friend_result_list(manager->lc, resultList, 1, chloeSipUri, chloePhoneNumber);//"sip:chloe@sip.example.org" _check_friend_result_list(manager->lc, resultList, 2, sFriends[10], NULL);//"sip:+33655667788@sip.example.org" + free(resultList); } - free(resultList); - linphone_magic_search_reset_search_cache(magicSearch); resultList = linphone_magic_search_get_contact_list_from_filter(magicSearch, "chloe", ""); - BC_ASSERT_PTR_NOT_NULL(resultList); - - if (resultList != NULL) { - BC_ASSERT_EQUAL(bctbx_list_size(resultList), 1, int, "%d"); + if (BC_ASSERT_PTR_NOT_NULL(resultList)) { + // 1 + last address from filter "sip:33@sip.example.org" + BC_ASSERT_EQUAL(bctbx_list_size(resultList), 2, int, "%d"); _check_friend_result_list(manager->lc, resultList, 0, chloeSipUri, chloePhoneNumber);//"sip:chloe@sip.example.org" + free(resultList); } - free(resultList); - _remove_friends_from_list(lfl, sFriends, sSizeFriend); { LinphoneFriend *fr = linphone_friend_list_find_friend_by_uri(lfl, chloeSipUri); @@ -733,37 +707,58 @@ static void search_friend_in_call_log(void) { resultList = linphone_magic_search_get_contact_list_from_filter(magicSearch, "ch", ""); - BC_ASSERT_PTR_NOT_NULL(resultList); - - if (resultList != NULL) { + if (BC_ASSERT_PTR_NOT_NULL(resultList)) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 4, int, "%d"); _check_friend_result_list(manager->lc, resultList, 0, sFriends[0], NULL);//"sip:charu@sip.test.org" _check_friend_result_list(manager->lc, resultList, 1, sFriends[1], NULL);//"sip:charette@sip.example.org" _check_friend_result_list(manager->lc, resultList, 2, chloeSipUri, NULL);//"sip:chloe@sip.example.org" _check_friend_result_list(manager->lc, resultList, 3, charlesSipUri, NULL);//"sip:charles@sip.test.org" + free(resultList); } - free(resultList); - linphone_magic_search_reset_search_cache(magicSearch); resultList = linphone_magic_search_get_contact_list_from_filter(magicSearch, "ch", "sip.test.org"); - BC_ASSERT_PTR_NOT_NULL(resultList); - - if (resultList != NULL) { + if (BC_ASSERT_PTR_NOT_NULL(resultList)) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 2, int, "%d"); _check_friend_result_list(manager->lc, resultList, 0, sFriends[0], NULL);//"sip:charu@sip.test.org" _check_friend_result_list(manager->lc, resultList, 1, charlesSipUri, NULL);//"sip:charles@sip.test.org" + free(resultList); } - free(resultList); - _remove_friends_from_list(lfl, sFriends, sSizeFriend); linphone_core_manager_destroy(manager); } +static void search_friend_last_item_is_filter(void) { + LinphoneMagicSearch *magicSearch = NULL; + bctbx_list_t *resultList = NULL; + LinphoneCoreManager* manager = linphone_core_manager_create("marie_rc"); + LinphoneFriendList *lfl = linphone_core_get_default_friend_list(manager->lc); + + _create_friends_from_tab(manager->lc, lfl, sFriends, sSizeFriend); + + magicSearch = linphone_magic_search_new(manager->lc); + + resultList = linphone_magic_search_get_contact_list_from_filter(magicSearch, "newaddress", ""); + + if (BC_ASSERT_PTR_NOT_NULL(resultList)) { + BC_ASSERT_EQUAL(bctbx_list_size(resultList), 1, int, "%d"); + const LinphoneSearchResult *sr = bctbx_list_nth_data(resultList, 0); + if (BC_ASSERT_PTR_NOT_NULL(sr)) { + const LinphoneAddress *srAddress = linphone_search_result_get_address(sr); + if (BC_ASSERT_PTR_NOT_NULL(srAddress)) { + BC_ASSERT_STRING_EQUAL(linphone_address_get_username(srAddress), "newaddress"); + } + } + free(resultList); + } + + linphone_core_manager_destroy(manager); +} + static void search_friend_large_database(void) { MSTimeSpec start, current; LinphoneMagicSearch *magicSearch = NULL; @@ -781,13 +776,14 @@ static void search_friend_large_database(void) { subBuff[i] = '\0'; liblinphone_tester_clock_start(&start); resultList = linphone_magic_search_get_contact_list_from_filter(magicSearch, subBuff, ""); - ms_get_cur_time(¤t); - ms_message("Searching time: %lld ms" ,((current.tv_sec - start.tv_sec)*1000LL) + ((current.tv_nsec - start.tv_nsec)/1000000LL)); - BC_ASSERT_PTR_NOT_NULL(resultList); + if (BC_ASSERT_PTR_NOT_NULL(resultList)) { + ms_get_cur_time(¤t); + ms_message("Searching time: %lld ms" ,((current.tv_sec - start.tv_sec)*1000LL) + ((current.tv_nsec - start.tv_nsec)/1000000LL)); - if (resultList != NULL) ms_message("List size: %zu", bctbx_list_size(resultList)); + if (BC_ASSERT_PTR_NOT_NULL(resultList)) ms_message("List size: %zu", bctbx_list_size(resultList)); - free(resultList); + free(resultList); + } } linphone_core_manager_destroy(manager); @@ -817,6 +813,7 @@ test_t setup_tests[] = { TEST_TWO_TAGS("Search friend with phone number", search_friend_with_phone_number, "MagicSearch", "LeaksMemory"), TEST_TWO_TAGS("Search friend and find it with its presence", search_friend_with_presence, "MagicSearch", "LeaksMemory"), TEST_TWO_TAGS("Search friend in call log", search_friend_in_call_log, "MagicSearch", "LeaksMemory"), + TEST_TWO_TAGS("Search friend last item is the filter", search_friend_last_item_is_filter, "MagicSearch", "LeaksMemory"), TEST_TWO_TAGS("Search friend in large friends database", search_friend_large_database, "MagicSearch", "LeaksMemory") }; From 52861017e28db18a3b6e46eb01d3cc23e62b1bf5 Mon Sep 17 00:00:00 2001 From: Erwan Croze Date: Wed, 21 Feb 2018 15:52:49 +0100 Subject: [PATCH 115/281] Changing magic search sort function --- src/search/magic-search.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/search/magic-search.cpp b/src/search/magic-search.cpp index 110c5165d..ad8b7cf22 100644 --- a/src/search/magic-search.cpp +++ b/src/search/magic-search.cpp @@ -130,7 +130,7 @@ list MagicSearch::getContactListFromFilter(const string &filter, c } resultList->sort([](const SearchResult& lsr, const SearchResult& rsr){ - return lsr >= rsr; + return (!rsr.getFriend() && lsr.getFriend()) || lsr >= rsr; }); proxy = linphone_core_get_default_proxy_config(this->getCore()->getCCore()); From 963811044bcf6159f81f17d5cf2be754bbdeb258 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Wed, 21 Feb 2018 16:42:15 +0100 Subject: [PATCH 116/281] feat(MainDb): use prepared statements for some functions --- src/db/internal/statements.cpp | 50 +++++++++++++++++------- src/db/internal/statements.h | 4 ++ src/db/main-db-p.h | 6 +-- src/db/main-db.cpp | 68 ++++++++++++++++----------------- tester/db/linphone.db | Bin 4382720 -> 4382720 bytes 5 files changed, 78 insertions(+), 50 deletions(-) diff --git a/src/db/internal/statements.cpp b/src/db/internal/statements.cpp index 866159d0c..a8c11937c 100644 --- a/src/db/internal/statements.cpp +++ b/src/db/internal/statements.cpp @@ -54,18 +54,17 @@ namespace Statements { // --------------------------------------------------------------------------- constexpr AbstractStatement create[CreateCount] = { - [CreateConferenceEventView] = - R"( - CREATE VIEW IF NOT EXISTS conference_event_view AS - SELECT id, type, creation_time, chat_room_id, from_sip_address_id, to_sip_address_id, time, imdn_message_id, state, direction, is_secured, notify_id, device_sip_address_id, participant_sip_address_id, subject - FROM event - LEFT JOIN conference_event ON conference_event.event_id = event.id - LEFT JOIN conference_chat_message_event ON conference_chat_message_event.event_id = event.id - LEFT JOIN conference_notified_event ON conference_notified_event.event_id = event.id - LEFT JOIN conference_participant_device_event ON conference_participant_device_event.event_id = event.id - LEFT JOIN conference_participant_event ON conference_participant_event.event_id = event.id - LEFT JOIN conference_subject_event ON conference_subject_event.event_id = event.id - )" + [CreateConferenceEventView] = R"( + CREATE VIEW IF NOT EXISTS conference_event_view AS + SELECT id, type, creation_time, chat_room_id, from_sip_address_id, to_sip_address_id, time, imdn_message_id, state, direction, is_secured, notify_id, device_sip_address_id, participant_sip_address_id, subject + FROM event + LEFT JOIN conference_event ON conference_event.event_id = event.id + LEFT JOIN conference_chat_message_event ON conference_chat_message_event.event_id = event.id + LEFT JOIN conference_notified_event ON conference_notified_event.event_id = event.id + LEFT JOIN conference_participant_device_event ON conference_participant_device_event.event_id = event.id + LEFT JOIN conference_participant_event ON conference_participant_event.event_id = event.id + LEFT JOIN conference_subject_event ON conference_subject_event.event_id = event.id + )" }; // --------------------------------------------------------------------------- @@ -73,6 +72,31 @@ namespace Statements { // --------------------------------------------------------------------------- constexpr const char *select[SelectCount] = { + [SelectSipAddressId] = R"( + SELECT id + FROM sip_address + WHERE value = :1 + )", + + [SelectChatRoomId] = R"( + SELECT id + FROM chat_room + WHERE peer_sip_address_id = :1 AND local_sip_address_id = :2 + )", + + [SelectChatRoomParticipantId] = R"( + SELECT id + FROM chat_room_participant + WHERE chat_room_id = :1 AND participant_sip_address_id = :2 + )", + + [SelectOneToOneChatRoomId] = R"( + SELECT chat_room_id + FROM one_to_one_chat_room + WHERE participant_a_sip_address_id IN (:1, :2) + AND participant_b_sip_address_id IN (:3, :4) + )", + [SelectConferenceEvents] = R"( SELECT conference_event_view.id AS event_id, type, creation_time, from_sip_address.value, to_sip_address.value, time, imdn_message_id, state, direction, is_secured, notify_id, device_sip_address.value, participant_sip_address.value, subject FROM conference_event_view @@ -80,7 +104,7 @@ namespace Statements { LEFT JOIN sip_address AS to_sip_address ON to_sip_address.id = to_sip_address_id LEFT JOIN sip_address AS device_sip_address ON device_sip_address.id = device_sip_address_id LEFT JOIN sip_address AS participant_sip_address ON participant_sip_address.id = participant_sip_address_id - WHERE chat_room_id = :chatRoomId + WHERE chat_room_id = :1 )" }; diff --git a/src/db/internal/statements.h b/src/db/internal/statements.h index e76a4eeea..ca7e3dbd7 100644 --- a/src/db/internal/statements.h +++ b/src/db/internal/statements.h @@ -33,6 +33,10 @@ namespace Statements { }; enum Select { + SelectSipAddressId, + SelectChatRoomId, + SelectChatRoomParticipantId, + SelectOneToOneChatRoomId, SelectConferenceEvents, SelectCount }; diff --git a/src/db/main-db-p.h b/src/db/main-db-p.h index 08067eb73..bb6d7abe5 100644 --- a/src/db/main-db-p.h +++ b/src/db/main-db-p.h @@ -34,15 +34,15 @@ class Content; class MainDbPrivate : public AbstractDbPrivate { public: - struct Statements; + struct PreparedStatements; mutable std::unordered_map> storageIdToEvent; mutable std::unordered_map> storageIdToChatMessage; private: - std::unique_ptr statements; + std::unique_ptr preparedStatements; - void initStatements (); + void initPreparedStatements (); // --------------------------------------------------------------------------- // Low level API. diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 7ee859596..87e3f5047 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -189,8 +189,8 @@ public: } template - void bind (const T &var, const char *name) { - mStmt.exchange(soci::use(var, name)); + void bind (const T &var) { + mStmt.exchange(soci::use(var)); } template @@ -211,22 +211,21 @@ static inline unique_ptr makeStatement (soci::session &session, return makeUnique(session.prepare << stmt); } -struct MainDbPrivate::Statements { +struct MainDbPrivate::PreparedStatements { typedef unique_ptr Statement; - Statement selectSipAddressId; - Statement selectChatRoomId; + Statement select[Statements::SelectCount]; }; -void MainDbPrivate::initStatements () { - soci::session *session = dbSession.getBackendSession(); - statements = makeUnique(); +void MainDbPrivate::initPreparedStatements () { + L_Q(); - statements->selectSipAddressId = makeStatement(*session, "SELECT id FROM sip_address WHERE value = :sipAddress"); - statements->selectChatRoomId = makeStatement( - *session, - "SELECT id FROM chat_room WHERE peer_sip_address_id = :peerSipAddressId AND local_sip_address_id = :localSipAddressId" - ); + soci::session *session = dbSession.getBackendSession(); + AbstractDb::Backend backend = q->getBackend(); + + preparedStatements = makeUnique(); + for (int i = 0; i < int(Statements::SelectCount); ++i) + preparedStatements->select[i] = makeStatement(*session, Statements::get(Statements::Select(i), backend)); } // ----------------------------------------------------------------------------- @@ -424,8 +423,8 @@ void MainDbPrivate::insertChatMessageParticipant (long long eventId, long long s long long MainDbPrivate::selectSipAddressId (const string &sipAddress) const { long long id; - StatementBind stmt(*statements->selectSipAddressId); - stmt.bind(sipAddress, "sipAddress"); + StatementBind stmt(*preparedStatements->select[Statements::SelectSipAddressId]); + stmt.bind(sipAddress); stmt.bindResult(id); return stmt.exec() ? id : -1; @@ -434,9 +433,9 @@ long long MainDbPrivate::selectSipAddressId (const string &sipAddress) const { long long MainDbPrivate::selectChatRoomId (long long peerSipAddressId, long long localSipAddressId) const { long long id; - StatementBind stmt(*statements->selectChatRoomId); - stmt.bind(peerSipAddressId, "peerSipAddressId"); - stmt.bind(localSipAddressId, "localSipAddressId"); + StatementBind stmt(*preparedStatements->select[Statements::SelectChatRoomId]); + stmt.bind(peerSipAddressId); + stmt.bind(localSipAddressId); stmt.bindResult(id); return stmt.exec() ? id : -1; @@ -456,23 +455,26 @@ long long MainDbPrivate::selectChatRoomId (const ChatRoomId &chatRoomId) const { long long MainDbPrivate::selectChatRoomParticipantId (long long chatRoomId, long long participantSipAddressId) const { long long id; - soci::session *session = dbSession.getBackendSession(); - *session << "SELECT id from chat_room_participant" - " WHERE chat_room_id = :chatRoomId AND participant_sip_address_id = :participantSipAddressId", - soci::into(id), soci::use(chatRoomId), soci::use(participantSipAddressId); - return session->got_data() ? id : -1; + + StatementBind stmt(*preparedStatements->select[Statements::SelectChatRoomParticipantId]); + stmt.bind(chatRoomId); + stmt.bind(participantSipAddressId); + stmt.bindResult(id); + + return stmt.exec() ? id : -1; } long long MainDbPrivate::selectOneToOneChatRoomId (long long sipAddressIdA, long long sipAddressIdB) const { long long id; - soci::session *session = dbSession.getBackendSession(); - *session << "SELECT chat_room_id" - " FROM one_to_one_chat_room" - " WHERE participant_a_sip_address_id IN (:sipAddressIdA, :sipAddressIdB)" - " AND participant_b_sip_address_id IN (:sipAddressIdABis, :sipAddressIdBBis)", - soci::into(id), - soci::use(sipAddressIdA), soci::use(sipAddressIdB), soci::use(sipAddressIdA), soci::use(sipAddressIdB); - return session->got_data() ? id : -1; + + StatementBind stmt(*preparedStatements->select[Statements::SelectOneToOneChatRoomId]); + stmt.bind(sipAddressIdA); + stmt.bind(sipAddressIdB); + stmt.bind(sipAddressIdA); + stmt.bind(sipAddressIdB); + stmt.bindResult(id); + + return stmt.exec() ? id : -1; } // ----------------------------------------------------------------------------- @@ -1414,7 +1416,6 @@ void MainDb::init () { " ON DELETE CASCADE" ") " + charset; - if (linphone_core_conference_server_enabled(getCore()->getCCore())) { *session << "CREATE TABLE IF NOT EXISTS one_to_one_chat_room (" " chat_room_id" + primaryKeyStr("BIGINT UNSIGNED") + "," @@ -1432,7 +1433,6 @@ void MainDb::init () { " REFERENCES sip_address(id)" " ON DELETE CASCADE" ") " + charset; - } *session << "CREATE TABLE IF NOT EXISTS chat_room_participant (" @@ -1710,7 +1710,7 @@ void MainDb::init () { d->updateModuleVersion("events", ModuleVersionEvents); d->updateModuleVersion("friends", ModuleVersionFriends); - d->initStatements(); + d->initPreparedStatements(); } bool MainDb::addEvent (const shared_ptr &eventLog) { diff --git a/tester/db/linphone.db b/tester/db/linphone.db index d41b202f16b13cd7a991988a27276463babeabf3..a3be0fcebdb22794f17bded8a13b167fdfcb4a87 100644 GIT binary patch delta 495 zcmZw9J5L)?6a?UVcL_GmE|~BNF^>hu1j6#hNqA!%7m=tCO3BU|Az_Kw7TSU)k|T7d zp@D{5LIpnnAr~nEC5q@MsFOcHPYUb?5sBhxq)#)abg^fYDz_hNbcLuH7DD_M!uVUs z*nvAC-5*ep3WkEIP^0idp;jTJ5LT#Dh$y@~hjn@+|LE|s)oYj+W%t;+^}1}iBf@5Q zt?tlDSY_+pzN$BCuS35g|ID1+IlC-=m7BZyM5ry9H26L6vs)X5{Dv14ylSj(`hmAy zD13X)#7%l7lUmI35vRAD&LxcBftRw}aezuIT3j&(}R8GX5WBt2C^B^rrWL=(|W zv=FUC8}XWGC*BY-qJ!upx`=L~vh5*yi8%3=NDzI*JEET$Al?&$gi8z&!^8+NN{kWX i!~`)(B#95iN8%GPMNAVj#4IsK%o7X5B9S`5Qt1KV$D@$| delta 314 zcmYktxiUjx07vmJ_eOFPHzIaP5FxfiEV1u&UV_u6%Ogbb{TmHqMoOu80Ap^6(ik%- z6iPF^1%;G~^E>sYbEn?!B9kf_6D}KLUX5|S+fQGXDxu;TmXO7Y1VhE#&f-s*tK8q1OF%S(&a|pqL1-kw|f6vJ9dMr zn`o4RT+9DV{`aa?LnK6(NQ!Qe5J7QPtiG6V(4sSWC{{iqM BYA*l) From a12a2297204f32f6628677c991da30a7666acf2c Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Wed, 21 Feb 2018 18:05:42 +0100 Subject: [PATCH 117/281] feat(MainDb): use prepared statements --- src/db/internal/statements.cpp | 17 +++++++++++++++++ src/db/internal/statements.h | 6 ++++++ src/db/main-db.cpp | 19 ++++++++++--------- 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/db/internal/statements.cpp b/src/db/internal/statements.cpp index a8c11937c..2290823e6 100644 --- a/src/db/internal/statements.cpp +++ b/src/db/internal/statements.cpp @@ -108,6 +108,18 @@ namespace Statements { )" }; + // --------------------------------------------------------------------------- + // Select statements. + // --------------------------------------------------------------------------- + + constexpr const char *insert[InsertCount] = { + [InsertOneToOneChatRoom] = R"( + INSERT INTO one_to_one_chat_room ( + chat_room_id, participant_a_sip_address_id, participant_b_sip_address_id + ) VALUES (:1, :2, :3) + )" + }; + // --------------------------------------------------------------------------- // Getters. // --------------------------------------------------------------------------- @@ -121,6 +133,11 @@ namespace Statements { (void)backend; return selectStmt >= Select::SelectCount ? nullptr : select[selectStmt]; } + + const char *get (Insert insertStmt, AbstractDb::Backend backend) { + (void)backend; + return insertStmt >= Insert::InsertCount ? nullptr : insert[insertStmt]; + } } LINPHONE_END_NAMESPACE diff --git a/src/db/internal/statements.h b/src/db/internal/statements.h index ca7e3dbd7..bc14a1b92 100644 --- a/src/db/internal/statements.h +++ b/src/db/internal/statements.h @@ -41,8 +41,14 @@ namespace Statements { SelectCount }; + enum Insert { + InsertOneToOneChatRoom, + InsertCount + }; + const char *get (Create createStmt, AbstractDb::Backend backend); const char *get (Select selectStmt, AbstractDb::Backend backend); + const char *get (Insert insertStmt, AbstractDb::Backend backend); } LINPHONE_END_NAMESPACE diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 87e3f5047..2714a1f72 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -215,6 +215,7 @@ struct MainDbPrivate::PreparedStatements { typedef unique_ptr Statement; Statement select[Statements::SelectCount]; + Statement insert[Statements::InsertCount]; }; void MainDbPrivate::initPreparedStatements () { @@ -226,6 +227,8 @@ void MainDbPrivate::initPreparedStatements () { preparedStatements = makeUnique(); for (int i = 0; i < int(Statements::SelectCount); ++i) preparedStatements->select[i] = makeStatement(*session, Statements::get(Statements::Select(i), backend)); + for (int i = 0; i < int(Statements::InsertCount); ++i) + preparedStatements->insert[i] = makeStatement(*session, Statements::get(Statements::Insert(i), backend)); } // ----------------------------------------------------------------------------- @@ -2587,9 +2590,7 @@ void MainDb::insertChatRoom (const shared_ptr &chatRoom) { L_D(); soci::transaction tr(*d->dbSession.getBackendSession()); - d->insertChatRoom(chatRoom); - tr.commit(); }; } @@ -2742,8 +2743,7 @@ void MainDb::insertOneToOneConferenceChatRoom (const shared_ptrdbSession.getBackendSession(); - soci::transaction tr(*session); + soci::transaction tr(*d->dbSession.getBackendSession()); const list> &participants = chatRoom->getParticipants(); const long long &participantASipAddressId = d->selectSipAddressId(participants.front()->getAddress().asString()); @@ -2753,11 +2753,12 @@ void MainDb::insertOneToOneConferenceChatRoom (const shared_ptrselectOneToOneChatRoomId(participantASipAddressId, participantBSipAddressId); if (chatRoomId == -1) { - chatRoomId = d->selectChatRoomId(chatRoom->getChatRoomId()); - *session << "INSERT INTO one_to_one_chat_room (" - " chat_room_id, participant_a_sip_address_id, participant_b_sip_address_id" - ") VALUES (:chatRoomId, :participantASipAddressId, :participantBSipAddressId)", - soci::use(chatRoomId), soci::use(participantASipAddressId), soci::use(participantBSipAddressId); + StatementBind stmt(*d->preparedStatements->insert[Statements::InsertOneToOneChatRoom]); + stmt.bind(chatRoomId); + stmt.bind(participantASipAddressId); + stmt.bind(participantBSipAddressId); + + stmt.exec(); } tr.commit(); From 35634f442ab1ac5c70814766574e590359d1ff55 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 21 Feb 2018 18:06:09 +0100 Subject: [PATCH 118/281] Add findParticipantDevice method on Conference. --- src/conference/conference.cpp | 13 +++++++++++++ src/conference/conference.h | 2 ++ 2 files changed, 15 insertions(+) diff --git a/src/conference/conference.cpp b/src/conference/conference.cpp index efba1bad8..9e22d0207 100644 --- a/src/conference/conference.cpp +++ b/src/conference/conference.cpp @@ -141,6 +141,19 @@ shared_ptr Conference::findParticipant (const shared_ptr Conference::findParticipantDevice (const shared_ptr &session) const { + L_D(); + + for (const auto &participant : d->participants) { + for (const auto &device : participant->getPrivate()->getDevices()) { + if (device->getSession() == session) + return device; + } + } + + return nullptr; +} + bool Conference::isMe (const IdentityAddress &addr) const { L_D(); IdentityAddress cleanedAddr(addr); diff --git a/src/conference/conference.h b/src/conference/conference.h index 9891240ea..ed8d93637 100644 --- a/src/conference/conference.h +++ b/src/conference/conference.h @@ -34,6 +34,7 @@ class CallSession; class CallSessionListener; class CallSessionPrivate; class ConferencePrivate; +class ParticipantDevice; class LINPHONE_PUBLIC Conference : public ConferenceInterface, @@ -47,6 +48,7 @@ public: std::shared_ptr getActiveParticipant () const; std::shared_ptr findParticipant (const std::shared_ptr &session) const; + std::shared_ptr findParticipantDevice (const std::shared_ptr &session) const; /* ConferenceInterface */ void addParticipant (const IdentityAddress &addr, const CallSessionParams *params, bool hasMedia) override; From a599ed7210c2c52784f14f7f0f5e1bc82169bfcf Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 21 Feb 2018 18:06:23 +0100 Subject: [PATCH 119/281] Add group chat tester. --- tester/group_chat_tester.c | 106 ++++++++++++++++++++++++++++++++----- 1 file changed, 93 insertions(+), 13 deletions(-) diff --git a/tester/group_chat_tester.c b/tester/group_chat_tester.c index 7f92fceba..8189dfb28 100644 --- a/tester/group_chat_tester.c +++ b/tester/group_chat_tester.c @@ -226,25 +226,19 @@ static void _receive_file_plus_text(bctbx_list_t *coresList, LinphoneCoreManager // Configure list of core manager for conference and add the listener static bctbx_list_t * init_core_for_conference(bctbx_list_t *coreManagerList) { - bctbx_list_t *coresList = NULL; LinphoneAddress *factoryAddr = linphone_address_new(sFactoryUri); - bctbx_list_for_each2(coreManagerList, (void (*)(void *, void*))_configure_core_for_conference, (void*) factoryAddr); + bctbx_list_for_each2(coreManagerList, (void (*)(void *, void *))_configure_core_for_conference, (void *) factoryAddr); linphone_address_unref(factoryAddr); LinphoneCoreCbs *cbs = linphone_factory_create_core_cbs(linphone_factory_get()); linphone_core_cbs_set_chat_room_state_changed(cbs, core_chat_room_state_changed); - bctbx_list_for_each2(coreManagerList, (void (*)(void *, void*))_configure_core_for_callbacks, (void*) cbs); + bctbx_list_for_each2(coreManagerList, (void (*)(void *, void *))_configure_core_for_callbacks, (void *) cbs); linphone_core_cbs_unref(cbs); - bctbx_list_t *iterator = coreManagerList; - while(iterator != bctbx_list_last_elem(coreManagerList)) { - if (!coresList) { - coresList = bctbx_list_new(((LinphoneCoreManager*)(bctbx_list_get_data(iterator)))->lc); - } else { - bctbx_list_append(coresList, ((LinphoneCoreManager*)(bctbx_list_get_data(iterator)))->lc); - } - iterator = bctbx_list_next(iterator); - } - bctbx_list_append(coresList, ((LinphoneCoreManager*)(bctbx_list_get_data(iterator)))->lc); + + bctbx_list_t *coresList = NULL; + bctbx_list_t *item = coreManagerList; + for (item = coreManagerList; item; item = bctbx_list_next(item)) + coresList = bctbx_list_append(coresList, ((LinphoneCoreManager *)(bctbx_list_get_data(item)))->lc); return coresList; } @@ -2647,6 +2641,91 @@ static void group_chat_room_unique_one_to_one_chat_room_recreated_from_message_w group_chat_room_unique_one_to_one_chat_room_recreated_from_message_base(TRUE); } +static void group_chat_room_join_one_to_one_chat_room_with_a_new_device (void) { + LinphoneCoreManager *marie1 = linphone_core_manager_create("marie_rc"); + LinphoneCoreManager *pauline = linphone_core_manager_create("pauline_rc"); + bctbx_list_t *coresManagerList = NULL; + coresManagerList = bctbx_list_append(coresManagerList, marie1); + coresManagerList = bctbx_list_append(coresManagerList, pauline); + bctbx_list_t *coresList = init_core_for_conference(coresManagerList); + start_core_for_conference(coresManagerList); + bctbx_list_t *participantsAddresses = bctbx_list_append(NULL, linphone_address_new(linphone_core_get_identity(pauline->lc))); + stats initialMarie1Stats = marie1->stat; + stats initialPaulineStats = pauline->stat; + + // Marie1 creates a new one-to-one chat room with Pauline + const char *initialSubject = "Pauline"; + LinphoneChatRoom *marie1Cr = create_chat_room_client_side(coresList, marie1, &initialMarie1Stats, participantsAddresses, initialSubject, -1); + BC_ASSERT_TRUE(linphone_chat_room_get_capabilities(marie1Cr) & LinphoneChatRoomCapabilitiesOneToOne); + + LinphoneAddress *confAddr = linphone_address_clone(linphone_chat_room_get_conference_address(marie1Cr)); + + // 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); + BC_ASSERT_TRUE(linphone_chat_room_get_capabilities(paulineCr) & LinphoneChatRoomCapabilitiesOneToOne); + + // Marie1 sends a message + const char *message = "Hello"; + _send_message(marie1Cr, message); + BC_ASSERT_TRUE(wait_for_list(coresList, &marie1->stat.number_of_LinphoneMessageDelivered, initialMarie1Stats.number_of_LinphoneMessageDelivered + 1, 10000)); + BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneMessageReceived, initialPaulineStats.number_of_LinphoneMessageReceived + 1, 10000)); + BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(pauline->stat.last_received_chat_message), message); + + // Pauline answers to the previous message + message = "Hey. How are you?"; + _send_message(paulineCr, message); + BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneMessageDelivered, initialPaulineStats.number_of_LinphoneMessageDelivered + 1, 10000)); + BC_ASSERT_TRUE(wait_for_list(coresList, &marie1->stat.number_of_LinphoneMessageReceived, initialMarie1Stats.number_of_LinphoneMessageReceived + 1, 10000)); + BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(marie1->stat.last_received_chat_message), message); + + // Simulate an uninstall of the application on Marie's side + linphone_core_set_network_reachable(marie1->lc, FALSE); + coresManagerList = bctbx_list_remove(coresManagerList, marie1); + coresList = bctbx_list_remove(coresList, marie1->lc); + LinphoneCoreManager *marie2 = linphone_core_manager_create("marie_rc"); + bctbx_list_t *newCoresManagerList = bctbx_list_append(NULL, marie2); + bctbx_list_t *newCoresList = init_core_for_conference(newCoresManagerList); + start_core_for_conference(newCoresManagerList); + coresManagerList = bctbx_list_concat(coresManagerList, newCoresManagerList); + coresList = bctbx_list_concat(coresList, newCoresList); + + // Marie2 creates a new one-to-one chat room with Pauline + stats initialMarie2Stats = marie2->stat; + participantsAddresses = bctbx_list_append(NULL, linphone_address_new(linphone_core_get_identity(pauline->lc))); + LinphoneChatRoom *marie2Cr = create_chat_room_client_side(coresList, marie2, &initialMarie2Stats, participantsAddresses, initialSubject, -1); + BC_ASSERT_TRUE(linphone_chat_room_get_capabilities(marie2Cr) & LinphoneChatRoomCapabilitiesOneToOne); + + // Check that the created address is the same as before + const LinphoneAddress *newConfAddr = linphone_chat_room_get_conference_address(marie2Cr); + BC_ASSERT_TRUE(linphone_address_weak_equal(confAddr, newConfAddr)); + + // Marie2 sends a new message + message = "Fine and you?"; + _send_message(marie2Cr, message); + BC_ASSERT_TRUE(wait_for_list(coresList, &marie2->stat.number_of_LinphoneMessageDelivered, initialMarie2Stats.number_of_LinphoneMessageDelivered + 1, 10000)); + BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneMessageReceived, initialPaulineStats.number_of_LinphoneMessageReceived + 2, 10000)); + BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(pauline->stat.last_received_chat_message), message); + + // Pauline answers to the previous message + message = "Perfect!"; + _send_message(paulineCr, message); + BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneMessageDelivered, initialPaulineStats.number_of_LinphoneMessageDelivered + 2, 10000)); + BC_ASSERT_TRUE(wait_for_list(coresList, &marie2->stat.number_of_LinphoneMessageReceived, initialMarie2Stats.number_of_LinphoneMessageReceived + 1, 10000)); + BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(marie2->stat.last_received_chat_message), message); + + // Clean db from chat room + linphone_core_manager_delete_chat_room(marie2, marie2Cr, coresList); + linphone_core_delete_chat_room(marie1->lc, marie1Cr); + linphone_core_manager_delete_chat_room(pauline, paulineCr, coresList); + + linphone_address_unref(confAddr); + bctbx_list_free(coresList); + bctbx_list_free(coresManagerList); + linphone_core_manager_destroy(marie2); + linphone_core_manager_destroy(marie1); + linphone_core_manager_destroy(pauline); +} + static void group_chat_room_new_unique_one_to_one_chat_room_after_both_participants_left (void) { LinphoneCoreManager *marie = linphone_core_manager_create("marie_rc"); LinphoneCoreManager *pauline = linphone_core_manager_create("pauline_rc"); @@ -2814,6 +2893,7 @@ test_t group_chat_tests[] = { TEST_TWO_TAGS("Unique one-to-one chatroom", group_chat_room_unique_one_to_one_chat_room, "Server", "LeaksMemory"), TEST_TWO_TAGS("Unique one-to-one chatroom recreated from message", group_chat_room_unique_one_to_one_chat_room_recreated_from_message, "Server", "LeaksMemory"), TEST_TWO_TAGS("Unique one-to-one chatroom recreated from message with app restart", group_chat_room_unique_one_to_one_chat_room_recreated_from_message_with_app_restart, "Server", "LeaksMemory"), + TEST_TWO_TAGS("Join one-to-one chat room with a new device", group_chat_room_join_one_to_one_chat_room_with_a_new_device, "Server", "LeaksMemory"), TEST_TWO_TAGS("New unique one-to-one chatroom after both participants left", group_chat_room_new_unique_one_to_one_chat_room_after_both_participants_left, "Server", "LeaksMemory"), TEST_TWO_TAGS("IMDN for group chat room", imdn_for_group_chat_room, "Server", "LeaksMemory") }; From 2e8f7dade9dc7ec316a656094fa8e115d99b197b Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Thu, 22 Feb 2018 10:10:02 +0100 Subject: [PATCH 120/281] Fix is-composing crash. --- src/chat/notification/is-composing.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/chat/notification/is-composing.cpp b/src/chat/notification/is-composing.cpp index f4abc6760..c567bd3b8 100644 --- a/src/chat/notification/is-composing.cpp +++ b/src/chat/notification/is-composing.cpp @@ -288,7 +288,6 @@ int IsComposing::refreshTimerExpired (void *data, unsigned int revents) { int IsComposing::remoteRefreshTimerExpired (void *data, unsigned int revents) { IsRemoteComposingData *d = reinterpret_cast(data); int result = d->isComposingHandler->remoteRefreshTimerExpired(d->uri); - delete d; return result; } From e06f10ed23d70cfeaabece1fe09d8f3df9bab0b9 Mon Sep 17 00:00:00 2001 From: Benjamin Reis Date: Thu, 22 Feb 2018 10:32:21 +0100 Subject: [PATCH 121/281] fix coding style --- .../local-conference-event-handler.cpp | 40 ++++++++++--------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/src/conference/handlers/local-conference-event-handler.cpp b/src/conference/handlers/local-conference-event-handler.cpp index d02280dc7..da786a78c 100644 --- a/src/conference/handlers/local-conference-event-handler.cpp +++ b/src/conference/handlers/local-conference-event-handler.cpp @@ -324,9 +324,9 @@ string LocalConferenceEventHandlerPrivate::createNotify (ConferenceType confInfo if (notifyId == -1) { lastNotify = lastNotify + 1; confInfo.setVersion(lastNotify); - } else { + } else confInfo.setVersion(static_cast(notifyId)); - } + confInfo.setState(isFullState ? StateType::full : StateType::partial); if (!confInfo.getConferenceDescription()) { ConferenceDescriptionType description = ConferenceDescriptionType(); @@ -359,23 +359,25 @@ void LocalConferenceEventHandlerPrivate::notifyParticipant (const string ¬ify } void LocalConferenceEventHandlerPrivate::notifyParticipantDevice (const string ¬ify, const shared_ptr &device, bool multipart) { - if (device->isSubscribedToConferenceEventPackage() && !notify.empty()) { - LinphoneEvent *ev = device->getConferenceSubscribeEvent(); - LinphoneEventCbs *cbs = linphone_event_get_callbacks(ev); - linphone_event_cbs_set_user_data(cbs, this); - linphone_event_cbs_set_notify_response(cbs, notifyResponseCb); - LinphoneContent *content = linphone_core_create_content(ev->lc); - linphone_content_set_buffer(content, (const uint8_t *)notify.c_str(), strlen(notify.c_str())); - if (multipart) { - linphone_content_set_type(content, "multipart"); - linphone_content_set_subtype(content, "mixed;boundary=---------------------------14737809831466499882746641449"); - } else { - linphone_content_set_type(content, "application"); - linphone_content_set_subtype(content, "conference-info"); - } - linphone_event_notify(ev, content); - linphone_content_unref(content); - } + if (!device->isSubscribedToConferenceEventPackage() || notify.empty()) + return; + + LinphoneEvent *ev = device->getConferenceSubscribeEvent(); + LinphoneEventCbs *cbs = linphone_event_get_callbacks(ev); + linphone_event_cbs_set_user_data(cbs, this); + linphone_event_cbs_set_notify_response(cbs, notifyResponseCb); + LinphoneContent *content = linphone_core_create_content(ev->lc); + linphone_content_set_buffer(content, (const uint8_t *)notify.c_str(), strlen(notify.c_str())); + linphone_content_set_type( + content, + multipart ? "multipart" : "application" + ); + linphone_content_set_subtype( + content, + multipart ? "mixed;boundary=---------------------------14737809831466499882746641449" : "conference-info" + ); + linphone_event_notify(ev, content); + linphone_content_unref(content); } // ============================================================================= From fbdca469c73c07fe07b4129950274120ccc5979a Mon Sep 17 00:00:00 2001 From: Benjamin Reis Date: Thu, 22 Feb 2018 10:45:58 +0100 Subject: [PATCH 122/281] refactor code --- src/conference/handlers/local-conference-event-handler.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/conference/handlers/local-conference-event-handler.cpp b/src/conference/handlers/local-conference-event-handler.cpp index da786a78c..0e3b12c72 100644 --- a/src/conference/handlers/local-conference-event-handler.cpp +++ b/src/conference/handlers/local-conference-event-handler.cpp @@ -321,11 +321,7 @@ void LocalConferenceEventHandlerPrivate::notifyResponseCb (const LinphoneEvent * // ----------------------------------------------------------------------------- string LocalConferenceEventHandlerPrivate::createNotify (ConferenceType confInfo, int notifyId, bool isFullState) { - if (notifyId == -1) { - lastNotify = lastNotify + 1; - confInfo.setVersion(lastNotify); - } else - confInfo.setVersion(static_cast(notifyId)); + confInfo.setVersion(notifyId == -1 ? ++lastNotify : static_cast(notifyId)); confInfo.setState(isFullState ? StateType::full : StateType::partial); if (!confInfo.getConferenceDescription()) { From 4ba2aa8af07c3a3ed3c20ff32fcd264561198c3a Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 21 Feb 2018 14:10:40 +0100 Subject: [PATCH 123/281] Added multi listener for ChatRoom --- coreapi/factory.c | 4 + coreapi/private_functions.h | 17 +++ include/linphone/api/c-callbacks.h | 2 +- include/linphone/api/c-chat-room.h | 24 ++++ include/linphone/factory.h | 7 ++ include/linphone/wrapper_utils.h | 8 ++ src/c-wrapper/api/c-chat-room.cpp | 107 +++++++++++++++++- src/chat/chat-message/chat-message.cpp | 10 +- src/chat/chat-room/chat-room.cpp | 34 ++---- src/chat/chat-room/client-group-chat-room.cpp | 30 +---- src/chat/chat-room/proxy-chat-room-p.h | 1 + src/chat/chat-room/proxy-chat-room.cpp | 27 +---- 12 files changed, 188 insertions(+), 83 deletions(-) diff --git a/coreapi/factory.c b/coreapi/factory.c index 0e34dd3d0..0bc33bb19 100644 --- a/coreapi/factory.c +++ b/coreapi/factory.c @@ -238,6 +238,10 @@ LinphoneCallCbs * linphone_factory_create_call_cbs(const LinphoneFactory *factor return _linphone_call_cbs_new(); } +LinphoneChatRoomCbs * linphone_factory_create_chat_room_cbs(const LinphoneFactory *factory) { + return linphone_chat_room_cbs_new(); +} + LinphoneVcard *linphone_factory_create_vcard(LinphoneFactory *factory) { return _linphone_vcard_new(); } diff --git a/coreapi/private_functions.h b/coreapi/private_functions.h index 0908f70ea..42152a736 100644 --- a/coreapi/private_functions.h +++ b/coreapi/private_functions.h @@ -48,6 +48,23 @@ void linphone_call_notify_stats_updated(LinphoneCall *call, const LinphoneCallSt void linphone_call_notify_info_message_received(LinphoneCall *call, const LinphoneInfoMessage *msg); void linphone_call_notify_ack_processing(LinphoneCall *call, LinphoneHeaders *msg, bool_t is_received); +void linphone_chat_room_notify_is_composing_received(LinphoneChatRoom *cr, const LinphoneAddress *remoteAddr, bool_t isComposing); +void linphone_chat_room_notify_message_received(LinphoneChatRoom *cr, LinphoneChatMessage *msg); +void linphone_chat_room_notify_participant_added(LinphoneChatRoom *cr, const LinphoneEventLog *event_log); +void linphone_chat_room_notify_participant_removed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log); +void linphone_chat_room_notify_participant_device_added(LinphoneChatRoom *cr, const LinphoneEventLog *event_log); +void linphone_chat_room_notify_participant_device_removed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log); +void linphone_chat_room_notify_participant_admin_status_changed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log); +void linphone_chat_room_notify_state_changed(LinphoneChatRoom *cr, LinphoneChatRoomState newState); +void linphone_chat_room_notify_subject_changed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log); +void linphone_chat_room_notify_undecryptable_message_received(LinphoneChatRoom *cr, LinphoneChatMessage *msg); +void linphone_chat_room_notify_chat_message_received(LinphoneChatRoom *cr, const LinphoneEventLog *event_log); +void linphone_chat_room_notify_chat_message_sent(LinphoneChatRoom *cr, const LinphoneEventLog *event_log); +void linphone_chat_room_notify_conference_address_generation(LinphoneChatRoom *cr); +void linphone_chat_room_notify_participant_device_fetched(LinphoneChatRoom *cr, const LinphoneAddress *participantAddr); +void linphone_chat_room_notify_participants_capabilities_checked(LinphoneChatRoom *cr, const LinphoneAddress *deviceAddr, const bctbx_list_t *participantsAddr); +void linphone_chat_room_notify_chat_message_should_be_stored(LinphoneChatRoom *cr, LinphoneChatMessage *msg); + LinphoneCall * linphone_call_new_outgoing(struct _LinphoneCore *lc, const LinphoneAddress *from, const LinphoneAddress *to, const LinphoneCallParams *params, LinphoneProxyConfig *cfg); LinphoneCall * linphone_call_new_incoming(struct _LinphoneCore *lc, const LinphoneAddress *from, const LinphoneAddress *to, LinphonePrivate::SalCallOp *op); LinphoneCallLog * linphone_call_log_new(LinphoneCallDir dir, LinphoneAddress *from, LinphoneAddress * to); diff --git a/include/linphone/api/c-callbacks.h b/include/linphone/api/c-callbacks.h index ea533f2c8..228758a61 100644 --- a/include/linphone/api/c-callbacks.h +++ b/include/linphone/api/c-callbacks.h @@ -105,7 +105,7 @@ typedef void (*LinphoneCallCbsAckProcessingCb)(LinphoneCall *call, LinphoneHeade * @deprecated Use LinphoneChatMessageCbsMsgStateChangedCb instead. * @donotwrap */ -typedef void (*LinphoneChatMessageStateChangedCb)(LinphoneChatMessage* msg,LinphoneChatMessageState state,void* ud); +typedef void (*LinphoneChatMessageStateChangedCb)(LinphoneChatMessage* msg, LinphoneChatMessageState state, void* ud); /** * Call back used to notify message delivery status diff --git a/include/linphone/api/c-chat-room.h b/include/linphone/api/c-chat-room.h index 8fc03d6c6..5e55a85a3 100644 --- a/include/linphone/api/c-chat-room.h +++ b/include/linphone/api/c-chat-room.h @@ -277,10 +277,34 @@ LINPHONE_PUBLIC bool_t linphone_chat_room_lime_available(LinphoneChatRoom *cr); */ LINPHONE_PUBLIC LinphoneCall *linphone_chat_room_get_call(const LinphoneChatRoom *room); +/** + * Add a listener in order to be notified of LinphoneChatRoom events. Once an event is received, registred LinphoneChatRoomCbs are + * invoked sequencially. + * @param[in] call LinphoneChatRoom object to monitor. + * @param[in] cbs A LinphoneChatRoomCbs object holding the callbacks you need. A reference is taken by the LinphoneChatRoom until you invoke linphone_call_remove_callbacks(). + */ +LINPHONE_PUBLIC void linphone_chat_room_add_callbacks(LinphoneChatRoom *cr, LinphoneChatRoomCbs *cbs); + +/** + * Remove a listener from a LinphoneChatRoom + * @param[in] call LinphoneChatRoom object + * @param[in] cbs LinphoneChatRoomCbs object to remove. + */ +LINPHONE_PUBLIC void linphone_chat_room_remove_callbacks(LinphoneChatRoom *cr, LinphoneChatRoomCbs *cbs); + +/** + * Gets the current LinphoneChatRoomCbs. + * This is meant only to be called from a callback to be able to get the user_data associated with the LinphoneChatRoomCbs that is calling the callback. + * @param[in] call LinphoneChatRoom object + * @return The LinphoneChatRoomCbs that has called the last callback + */ +LINPHONE_PUBLIC LinphoneChatRoomCbs *linphone_chat_room_get_current_callbacks(const LinphoneChatRoom *cr); + /** * Get the LinphoneChatRoomCbs object associated with the LinphoneChatRoom. * @param[in] cr LinphoneChatRoom object * @return The LinphoneChatRoomCbs object associated with the LinphoneChatRoom + * @deprecated, use linphone_chat_room_add_callbacks instead */ LINPHONE_PUBLIC LinphoneChatRoomCbs * linphone_chat_room_get_callbacks (const LinphoneChatRoom *cr); diff --git a/include/linphone/factory.h b/include/linphone/factory.h index 932e5d953..be26938cc 100644 --- a/include/linphone/factory.h +++ b/include/linphone/factory.h @@ -224,6 +224,13 @@ LINPHONE_PUBLIC LinphoneAuthInfo *linphone_factory_create_auth_info(const Linpho */ LINPHONE_PUBLIC LinphoneCallCbs * linphone_factory_create_call_cbs(const LinphoneFactory *factory); +/** + * Create a LinphoneChatRoomCbs object that holds callbacks for events happening on a chat room. + * @param[in] factory LinphoneFactory singletion object + * @return A new LinphoneChatRoomCbs object + */ +LINPHONE_PUBLIC LinphoneChatRoomCbs * linphone_factory_create_chat_room_cbs(const LinphoneFactory *factory); + /** * Create an empty #LinphoneVcard. * @return a new #LinphoneVcard. diff --git a/include/linphone/wrapper_utils.h b/include/linphone/wrapper_utils.h index 2a034c36a..5ab052604 100644 --- a/include/linphone/wrapper_utils.h +++ b/include/linphone/wrapper_utils.h @@ -54,6 +54,14 @@ LINPHONE_PUBLIC bctbx_list_t *linphone_core_get_callbacks_list(const LinphoneCor */ LINPHONE_PUBLIC const bctbx_list_t *linphone_call_get_callbacks_list(const LinphoneCall *call); +/** + * @brief Gets the list of listener in the chat room. + * @param[in] call #LinphoneChatRoom object. + * @return The list of #LinphoneChatRoomCbs. + * @donotwrap + */ +LINPHONE_PUBLIC const bctbx_list_t *linphone_chat_room_get_callbacks_list(const LinphoneChatRoom *cr); + /** * Send a message to peer member of this chat room. * diff --git a/src/c-wrapper/api/c-chat-room.cpp b/src/c-wrapper/api/c-chat-room.cpp index d0cd1c61f..a8ae7b5df 100644 --- a/src/c-wrapper/api/c-chat-room.cpp +++ b/src/c-wrapper/api/c-chat-room.cpp @@ -49,6 +49,8 @@ L_DECLARE_C_OBJECT_IMPL_WITH_XTORS( ChatRoom, _linphone_chat_room_constructor, _linphone_chat_room_destructor, LinphoneChatRoomCbs *cbs; + bctbx_list_t *callbacks; /* A list of LinphoneCallCbs object */ + LinphoneChatRoomCbs *currentCbs; /* The current LinphoneCallCbs object used to call a callback */ mutable LinphoneAddress *conferenceAddressCache; mutable LinphoneAddress *peerAddressCache; mutable LinphoneAddress *localAddressCache; @@ -69,6 +71,7 @@ static void _linphone_chat_room_destructor (LinphoneChatRoom *cr) { linphone_address_unref(cr->localAddressCache); if (cr->composingAddresses) bctbx_list_free_with_data(cr->composingAddresses, (bctbx_list_free_func)linphone_address_unref); + bctbx_list_free_with_data(cr->callbacks, (bctbx_list_free_func)linphone_chat_room_cbs_unref); } static list _get_identity_address_list_from_address_list(list addressList) { @@ -248,10 +251,6 @@ LinphoneChatMessage *linphone_chat_room_find_message (LinphoneChatRoom *cr, cons return L_GET_C_BACK_PTR(L_GET_CPP_PTR_FROM_C_OBJECT(cr)->findChatMessage(message_id)); } -LinphoneChatRoomCbs *linphone_chat_room_get_callbacks (const LinphoneChatRoom *cr) { - return cr->cbs; -} - LinphoneChatRoomState linphone_chat_room_get_state (const LinphoneChatRoom *cr) { return (LinphoneChatRoomState)L_GET_CPP_PTR_FROM_C_OBJECT(cr)->getState(); } @@ -402,6 +401,106 @@ void linphone_chat_room_add_compatible_participants (LinphoneChatRoom *cr, const } } +// ============================================================================= +// Callbacks +// ============================================================================= + +LinphoneChatRoomCbs *linphone_chat_room_get_callbacks (const LinphoneChatRoom *cr) { + return cr->cbs; +} + +void linphone_chat_room_add_callbacks (LinphoneChatRoom *cr, LinphoneChatRoomCbs *cbs) { + cr->callbacks = bctbx_list_append(cr->callbacks, linphone_chat_room_cbs_ref(cbs)); +} + +void linphone_chat_room_remove_callbacks (LinphoneChatRoom *cr, LinphoneChatRoomCbs *cbs) { + cr->callbacks = bctbx_list_remove(cr->callbacks, cbs); + linphone_chat_room_cbs_unref(cbs); +} + +LinphoneChatRoomCbs *linphone_chat_room_get_current_callbacks (const LinphoneChatRoom *cr) { + return cr->currentCbs; +} + +const bctbx_list_t *linphone_chat_room_get_callbacks_list(const LinphoneChatRoom *cr) { + return cr->callbacks; +} + +#define NOTIFY_IF_EXIST(cbName, functionName, ...) \ + LinphoneChatRoomCbs ## cbName ## Cb cb = linphone_chat_room_cbs_get_ ## functionName (cr->cbs); \ + if (cb) \ + cb(__VA_ARGS__); \ + for (bctbx_list_t *it = cr->callbacks; it; it = bctbx_list_next(it)) { \ + cr->currentCbs = reinterpret_cast(bctbx_list_get_data(it)); \ + cb = linphone_chat_room_cbs_get_ ## functionName (cr->currentCbs); \ + if (cb) \ + cb(__VA_ARGS__); \ + } + +void linphone_chat_room_notify_is_composing_received(LinphoneChatRoom *cr, const LinphoneAddress *remoteAddr, bool_t isComposing) { + NOTIFY_IF_EXIST(IsComposingReceived, is_composing_received, cr, remoteAddr, isComposing) +} + +void linphone_chat_room_notify_message_received(LinphoneChatRoom *cr, LinphoneChatMessage *msg) { + NOTIFY_IF_EXIST(MessageReceived, message_received, cr, msg) +} + +void linphone_chat_room_notify_participant_added(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { + NOTIFY_IF_EXIST(ParticipantAdded, participant_added, cr, event_log) +} + +void linphone_chat_room_notify_participant_removed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { + NOTIFY_IF_EXIST(ParticipantRemoved, participant_removed, cr, event_log) +} + +void linphone_chat_room_notify_participant_device_added(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { + NOTIFY_IF_EXIST(ParticipantDeviceAdded, participant_device_added, cr, event_log) +} + +void linphone_chat_room_notify_participant_device_removed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { + NOTIFY_IF_EXIST(ParticipantDeviceRemoved, participant_device_removed, cr, event_log) +} + +void linphone_chat_room_notify_participant_admin_status_changed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { + NOTIFY_IF_EXIST(ParticipantAdminStatusChanged, participant_admin_status_changed, cr, event_log) +} + +void linphone_chat_room_notify_state_changed(LinphoneChatRoom *cr, LinphoneChatRoomState newState) { + NOTIFY_IF_EXIST(StateChanged, state_changed, cr, newState) +} + +void linphone_chat_room_notify_subject_changed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { + NOTIFY_IF_EXIST(SubjectChanged, subject_changed, cr, event_log) +} + +void linphone_chat_room_notify_undecryptable_message_received(LinphoneChatRoom *cr, LinphoneChatMessage *msg) { + NOTIFY_IF_EXIST(UndecryptableMessageReceived, undecryptable_message_received, cr, msg) +} + +void linphone_chat_room_notify_chat_message_received(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { + NOTIFY_IF_EXIST(ChatMessageReceived, chat_message_received, cr, event_log) +} + +void linphone_chat_room_notify_chat_message_sent(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { + NOTIFY_IF_EXIST(ChatMessageSent, chat_message_sent, cr, event_log) +} + +void linphone_chat_room_notify_conference_address_generation(LinphoneChatRoom *cr) { + NOTIFY_IF_EXIST(ConferenceAddressGeneration, conference_address_generation, cr) +} + +void linphone_chat_room_notify_participant_device_fetched(LinphoneChatRoom *cr, const LinphoneAddress *participantAddr) { + NOTIFY_IF_EXIST(ParticipantDeviceFetched, participant_device_fetched, cr, participantAddr) +} + +void linphone_chat_room_notify_participants_capabilities_checked(LinphoneChatRoom *cr, const LinphoneAddress *deviceAddr, const bctbx_list_t *participantsAddr) { + NOTIFY_IF_EXIST(ParticipantsCapabilitiesChecked, participants_capabilities_checked, cr, deviceAddr, participantsAddr) +} + +void linphone_chat_room_notify_chat_message_should_be_stored(LinphoneChatRoom *cr, LinphoneChatMessage *msg) { + NOTIFY_IF_EXIST(ShouldChatMessageBeStored, chat_message_should_be_stored, cr, msg) +} + // ============================================================================= // Reference and user data handling functions. // ============================================================================= diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index 2436bcbb5..a65e2ca10 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -451,11 +451,7 @@ void ChatMessagePrivate::notifyReceiving () { return; LinphoneChatRoom *chatRoom = L_GET_C_BACK_PTR(q->getChatRoom()); - LinphoneChatRoomCbs *cbs = linphone_chat_room_get_callbacks(chatRoom); - - LinphoneChatRoomCbsShouldChatMessageBeStoredCb shouldMessageBeStoredCb = linphone_chat_room_cbs_get_chat_message_should_be_stored(cbs); - if (shouldMessageBeStoredCb) - shouldMessageBeStoredCb(chatRoom, L_GET_C_BACK_PTR(q->getSharedFromThis())); + linphone_chat_room_notify_chat_message_should_be_stored(chatRoom, L_GET_C_BACK_PTR(q->getSharedFromThis())); if (toBeStored) storeInDb(); @@ -463,9 +459,7 @@ void ChatMessagePrivate::notifyReceiving () { shared_ptr event = make_shared( ::time(nullptr), q->getSharedFromThis() ); - LinphoneChatRoomCbsChatMessageReceivedCb messageReceivedCb = linphone_chat_room_cbs_get_chat_message_received(cbs); - if (messageReceivedCb) - messageReceivedCb(chatRoom, L_GET_C_BACK_PTR(event)); + linphone_chat_room_notify_chat_message_received(chatRoom, L_GET_C_BACK_PTR(event)); // Legacy q->getChatRoom()->getPrivate()->notifyChatMessageReceived(q->getSharedFromThis()); diff --git a/src/chat/chat-room/chat-room.cpp b/src/chat/chat-room/chat-room.cpp index f5251497d..601d9219d 100644 --- a/src/chat/chat-room/chat-room.cpp +++ b/src/chat/chat-room/chat-room.cpp @@ -50,19 +50,16 @@ void ChatRoomPrivate::sendChatMessage (const shared_ptr &chatMessag dChatMessage->setTime(ms_time(0)); dChatMessage->send(); - LinphoneChatRoom *cr = L_GET_C_BACK_PTR(q); - LinphoneChatRoomCbs *cbs = linphone_chat_room_get_callbacks(cr); - LinphoneChatRoomCbsChatMessageSentCb cb = linphone_chat_room_cbs_get_chat_message_sent(cbs); - + LinphoneChatRoom *cr = L_GET_C_BACK_PTR(q); // TODO: server currently don't stock message, remove condition in the future. - if (cb && !linphone_core_conference_server_enabled(q->getCore()->getCCore())) { + if (!linphone_core_conference_server_enabled(q->getCore()->getCCore())) { shared_ptr event = static_pointer_cast( q->getCore()->getPrivate()->mainDb->getEventFromKey(dChatMessage->dbKey) ); if (!event) event = make_shared(time(nullptr), chatMessage); - cb(cr, L_GET_C_BACK_PTR(event)); + linphone_chat_room_notify_chat_message_sent(cr, L_GET_C_BACK_PTR(event)); } if (isComposing) @@ -137,10 +134,7 @@ void ChatRoomPrivate::notifyChatMessageReceived (const shared_ptr & ); linphone_address_unref(fromAddress); } - LinphoneChatRoomCbs *cbs = linphone_chat_room_get_callbacks(cr); - LinphoneChatRoomCbsMessageReceivedCb cb = linphone_chat_room_cbs_get_message_received(cbs); - if (cb) - cb(cr, L_GET_C_BACK_PTR(chatMessage)); + linphone_chat_room_notify_message_received(cr, L_GET_C_BACK_PTR(chatMessage)); linphone_core_notify_message_received(q->getCore()->getCCore(), cr, L_GET_C_BACK_PTR(chatMessage)); } @@ -153,13 +147,9 @@ void ChatRoomPrivate::notifyIsComposingReceived (const Address &remoteAddress, b remoteIsComposing.remove(remoteAddress); LinphoneChatRoom *cr = L_GET_C_BACK_PTR(q); - LinphoneChatRoomCbs *cbs = linphone_chat_room_get_callbacks(cr); - LinphoneChatRoomCbsIsComposingReceivedCb cb = linphone_chat_room_cbs_get_is_composing_received(cbs); - if (cb) { - LinphoneAddress *lAddr = linphone_address_new(remoteAddress.asString().c_str()); - cb(cr, lAddr, !!isComposing); - linphone_address_unref(lAddr); - } + LinphoneAddress *lAddr = linphone_address_new(remoteAddress.asString().c_str()); + linphone_chat_room_notify_is_composing_received(cr, lAddr, !!isComposing); + linphone_address_unref(lAddr); // Legacy notification linphone_core_notify_is_composing_received(q->getCore()->getCCore(), cr); } @@ -168,19 +158,13 @@ void ChatRoomPrivate::notifyStateChanged () { L_Q(); linphone_core_notify_chat_room_state_changed(q->getCore()->getCCore(), L_GET_C_BACK_PTR(q), (LinphoneChatRoomState)state); LinphoneChatRoom *cr = L_GET_C_BACK_PTR(q); - LinphoneChatRoomCbs *cbs = linphone_chat_room_get_callbacks(cr); - LinphoneChatRoomCbsStateChangedCb cb = linphone_chat_room_cbs_get_state_changed(cbs); - if (cb) - cb(cr, (LinphoneChatRoomState)state); + linphone_chat_room_notify_state_changed(cr, (LinphoneChatRoomState)state); } void ChatRoomPrivate::notifyUndecryptableChatMessageReceived (const shared_ptr &chatMessage) { L_Q(); LinphoneChatRoom *cr = L_GET_C_BACK_PTR(q); - LinphoneChatRoomCbs *cbs = linphone_chat_room_get_callbacks(cr); - LinphoneChatRoomCbsUndecryptableMessageReceivedCb cb = linphone_chat_room_cbs_get_undecryptable_message_received(cbs); - if (cb) - cb(cr, L_GET_C_BACK_PTR(chatMessage)); + linphone_chat_room_notify_undecryptable_message_received(cr, L_GET_C_BACK_PTR(chatMessage)); linphone_core_notify_message_received_unable_decrypt(q->getCore()->getCCore(), cr, L_GET_C_BACK_PTR(chatMessage)); } diff --git a/src/chat/chat-room/client-group-chat-room.cpp b/src/chat/chat-room/client-group-chat-room.cpp index 89240f441..257a9861c 100644 --- a/src/chat/chat-room/client-group-chat-room.cpp +++ b/src/chat/chat-room/client-group-chat-room.cpp @@ -513,10 +513,7 @@ void ClientGroupChatRoom::onParticipantAdded (const shared_ptraddEvent(event); LinphoneChatRoom *cr = L_GET_C_BACK_PTR(this); - LinphoneChatRoomCbs *cbs = linphone_chat_room_get_callbacks(cr); - LinphoneChatRoomCbsParticipantAddedCb cb = linphone_chat_room_cbs_get_participant_added(cbs); - if (cb) - cb(cr, L_GET_C_BACK_PTR(event)); + linphone_chat_room_notify_participant_added(cr, L_GET_C_BACK_PTR(event)); } void ClientGroupChatRoom::onParticipantRemoved (const shared_ptr &event, bool isFullState) { @@ -536,10 +533,7 @@ void ClientGroupChatRoom::onParticipantRemoved (const shared_ptraddEvent(event); LinphoneChatRoom *cr = L_GET_C_BACK_PTR(this); - LinphoneChatRoomCbs *cbs = linphone_chat_room_get_callbacks(cr); - LinphoneChatRoomCbsParticipantRemovedCb cb = linphone_chat_room_cbs_get_participant_removed(cbs); - if (cb) - cb(cr, L_GET_C_BACK_PTR(event)); + linphone_chat_room_notify_participant_removed(cr, L_GET_C_BACK_PTR(event)); } void ClientGroupChatRoom::onParticipantSetAdmin (const shared_ptr &event, bool isFullState) { @@ -567,10 +561,7 @@ void ClientGroupChatRoom::onParticipantSetAdmin (const shared_ptraddEvent(event); LinphoneChatRoom *cr = L_GET_C_BACK_PTR(this); - LinphoneChatRoomCbs *cbs = linphone_chat_room_get_callbacks(cr); - LinphoneChatRoomCbsParticipantAdminStatusChangedCb cb = linphone_chat_room_cbs_get_participant_admin_status_changed(cbs); - if (cb) - cb(cr, L_GET_C_BACK_PTR(event)); + linphone_chat_room_notify_participant_admin_status_changed(cr, L_GET_C_BACK_PTR(event)); } void ClientGroupChatRoom::onSubjectChanged (const shared_ptr &event, bool isFullState) { @@ -586,10 +577,7 @@ void ClientGroupChatRoom::onSubjectChanged (const shared_ptraddEvent(event); LinphoneChatRoom *cr = L_GET_C_BACK_PTR(this); - LinphoneChatRoomCbs *cbs = linphone_chat_room_get_callbacks(cr); - LinphoneChatRoomCbsSubjectChangedCb cb = linphone_chat_room_cbs_get_subject_changed(cbs); - if (cb) - cb(cr, L_GET_C_BACK_PTR(event)); + linphone_chat_room_notify_subject_changed(cr, L_GET_C_BACK_PTR(event)); } void ClientGroupChatRoom::onParticipantDeviceAdded (const shared_ptr &event, bool isFullState) { @@ -613,10 +601,7 @@ void ClientGroupChatRoom::onParticipantDeviceAdded (const shared_ptraddEvent(event); LinphoneChatRoom *cr = L_GET_C_BACK_PTR(this); - LinphoneChatRoomCbs *cbs = linphone_chat_room_get_callbacks(cr); - LinphoneChatRoomCbsParticipantDeviceAddedCb cb = linphone_chat_room_cbs_get_participant_device_added(cbs); - if (cb) - cb(cr, L_GET_C_BACK_PTR(event)); + linphone_chat_room_notify_participant_device_added(cr, L_GET_C_BACK_PTR(event)); } void ClientGroupChatRoom::onParticipantDeviceRemoved (const shared_ptr &event, bool isFullState) { @@ -638,10 +623,7 @@ void ClientGroupChatRoom::onParticipantDeviceRemoved (const shared_ptraddEvent(event); LinphoneChatRoom *cr = L_GET_C_BACK_PTR(this); - LinphoneChatRoomCbs *cbs = linphone_chat_room_get_callbacks(cr); - LinphoneChatRoomCbsParticipantDeviceRemovedCb cb = linphone_chat_room_cbs_get_participant_device_removed(cbs); - if (cb) - cb(cr, L_GET_C_BACK_PTR(event)); + linphone_chat_room_notify_participant_device_removed(cr, L_GET_C_BACK_PTR(event)); } LINPHONE_END_NAMESPACE diff --git a/src/chat/chat-room/proxy-chat-room-p.h b/src/chat/chat-room/proxy-chat-room-p.h index 89fb81e21..ea8a4b741 100644 --- a/src/chat/chat-room/proxy-chat-room-p.h +++ b/src/chat/chat-room/proxy-chat-room-p.h @@ -77,6 +77,7 @@ public: void teardownCallbacks (); std::shared_ptr chatRoom; + LinphoneChatRoomCbs *callbacks; L_DECLARE_PUBLIC(ProxyChatRoom); }; diff --git a/src/chat/chat-room/proxy-chat-room.cpp b/src/chat/chat-room/proxy-chat-room.cpp index 547317551..f761f2def 100644 --- a/src/chat/chat-room/proxy-chat-room.cpp +++ b/src/chat/chat-room/proxy-chat-room.cpp @@ -29,12 +29,10 @@ using namespace std; LINPHONE_BEGIN_NAMESPACE #define PROXY_CALLBACK(callback, ...) \ - LinphoneChatRoomCbs *proxiedCbs = linphone_chat_room_get_callbacks(cr); \ + LinphoneChatRoomCbs *proxiedCbs = linphone_chat_room_get_current_callbacks(cr); \ ProxyChatRoom *pcr = static_cast(linphone_chat_room_cbs_get_user_data(proxiedCbs)); \ LinphoneChatRoom *lcr = L_GET_C_BACK_PTR(pcr->getSharedFromThis()); \ - LinphoneChatRoomCbs *cbs = linphone_chat_room_get_callbacks(lcr); \ - if (linphone_chat_room_cbs_get_ ## callback(cbs)) \ - linphone_chat_room_cbs_get_ ## callback(cbs)(lcr, ##__VA_ARGS__) + linphone_chat_room_notify_ ## callback(lcr, ##__VA_ARGS__) static void chatMessageReceived (LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { PROXY_CALLBACK(chat_message_received, event_log); @@ -99,7 +97,8 @@ static void undecryptableMessageReceived (LinphoneChatRoom *cr, LinphoneChatMess void ProxyChatRoomPrivate::setupCallbacks () { L_Q(); LinphoneChatRoom *lcr = L_GET_C_BACK_PTR(chatRoom); - LinphoneChatRoomCbs *cbs = linphone_chat_room_get_callbacks(lcr); + LinphoneChatRoomCbs *cbs = linphone_chat_room_cbs_new(); + callbacks = cbs; linphone_chat_room_cbs_set_user_data(cbs, q); linphone_chat_room_cbs_set_chat_message_received(cbs, chatMessageReceived); linphone_chat_room_cbs_set_chat_message_sent(cbs, chatMessageSent); @@ -116,26 +115,12 @@ void ProxyChatRoomPrivate::setupCallbacks () { linphone_chat_room_cbs_set_state_changed(cbs, stateChanged); linphone_chat_room_cbs_set_subject_changed(cbs, subjectChanged); linphone_chat_room_cbs_set_undecryptable_message_received(cbs, undecryptableMessageReceived); + linphone_chat_room_add_callbacks(lcr, cbs); } void ProxyChatRoomPrivate::teardownCallbacks () { LinphoneChatRoom *lcr = L_GET_C_BACK_PTR(chatRoom); - LinphoneChatRoomCbs *cbs = linphone_chat_room_get_callbacks(lcr); - linphone_chat_room_cbs_set_chat_message_received(cbs, nullptr); - linphone_chat_room_cbs_set_chat_message_sent(cbs, nullptr); - linphone_chat_room_cbs_set_conference_address_generation(cbs, nullptr); - linphone_chat_room_cbs_set_is_composing_received(cbs, nullptr); - linphone_chat_room_cbs_set_message_received(cbs, nullptr); - linphone_chat_room_cbs_set_participant_added(cbs, nullptr); - linphone_chat_room_cbs_set_participant_admin_status_changed(cbs, nullptr); - linphone_chat_room_cbs_set_participant_device_added(cbs, nullptr); - linphone_chat_room_cbs_set_participant_device_fetched(cbs, nullptr); - linphone_chat_room_cbs_set_participant_device_removed(cbs, nullptr); - linphone_chat_room_cbs_set_participant_removed(cbs, nullptr); - linphone_chat_room_cbs_set_participants_capabilities_checked(cbs, nullptr); - linphone_chat_room_cbs_set_state_changed(cbs, nullptr); - linphone_chat_room_cbs_set_subject_changed(cbs, nullptr); - linphone_chat_room_cbs_set_undecryptable_message_received(cbs, nullptr); + linphone_chat_room_remove_callbacks(lcr, callbacks); } // ----------------------------------------------------------------------------- From 0a0ff9523720dd52cf03d899b1d48b221e203623 Mon Sep 17 00:00:00 2001 From: Benjamin Reis Date: Thu, 22 Feb 2018 11:35:17 +0100 Subject: [PATCH 124/281] refactor code --- src/conference/handlers/local-conference-event-handler.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/conference/handlers/local-conference-event-handler.cpp b/src/conference/handlers/local-conference-event-handler.cpp index 0e3b12c72..9e246f9b0 100644 --- a/src/conference/handlers/local-conference-event-handler.cpp +++ b/src/conference/handlers/local-conference-event-handler.cpp @@ -322,8 +322,8 @@ void LocalConferenceEventHandlerPrivate::notifyResponseCb (const LinphoneEvent * string LocalConferenceEventHandlerPrivate::createNotify (ConferenceType confInfo, int notifyId, bool isFullState) { confInfo.setVersion(notifyId == -1 ? ++lastNotify : static_cast(notifyId)); - confInfo.setState(isFullState ? StateType::full : StateType::partial); + if (!confInfo.getConferenceDescription()) { ConferenceDescriptionType description = ConferenceDescriptionType(); confInfo.setConferenceDescription(description); From 71f5e47cff1443dffa8bf95cb2e56beefe6d85e0 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Thu, 22 Feb 2018 13:18:34 +0100 Subject: [PATCH 125/281] feat(MainDb): remove order by on events fetch --- src/db/main-db.cpp | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 2714a1f72..2b4009291 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -2251,11 +2251,9 @@ list> MainDb::getHistoryRange ( return events; } - string query = Statements::get(Statements::SelectConferenceEvents, Backend::Sqlite3); - query += buildSqlEventFilter({ + string query = Statements::get(Statements::SelectConferenceEvents, Backend::Sqlite3) + buildSqlEventFilter({ ConferenceCallFilter, ConferenceChatMessageFilter, ConferenceInfoFilter, ConferenceInfoNoDeviceFilter }, mask, "AND"); - query += " ORDER BY creation_time DESC"; if (end > 0) query += " LIMIT " + Utils::toString(end - begin); @@ -2788,7 +2786,10 @@ void MainDb::enableChatRoomMigration (const ChatRoomId &chatRoomId, bool enable) }; } -void MainDb::updateChatRoomParticipantDevice (const shared_ptr &chatRoom, const shared_ptr &device) { +void MainDb::updateChatRoomParticipantDevice ( + const shared_ptr &chatRoom, + const shared_ptr &device +) { L_SAFE_TRANSACTION { L_D(); @@ -2799,10 +2800,10 @@ void MainDb::updateChatRoomParticipantDevice (const shared_ptr const long long &participantSipAddressId = d->selectSipAddressId(device->getParticipant()->getAddress().asString()); const long long &participantId = d->selectChatRoomParticipantId(dbChatRoomId, participantSipAddressId); const long long &participantSipDeviceAddressId = d->selectSipAddressId(device->getAddress().asString()); - unsigned int stateInt = static_cast(device->getState()); + unsigned int state = static_cast(device->getState()); *session << "UPDATE chat_room_participant_device SET state = :state" " WHERE chat_room_participant_id = :participantId AND participant_device_sip_address_id = :participantSipDeviceAddressId", - soci::use(stateInt), soci::use(participantId), soci::use(participantSipDeviceAddressId); + soci::use(state), soci::use(participantId), soci::use(participantSipDeviceAddressId); tr.commit(); }; From d0c1259ddacbd3de313817ddd4c4a859e84bf611 Mon Sep 17 00:00:00 2001 From: Erwan Croze Date: Thu, 22 Feb 2018 14:07:11 +0100 Subject: [PATCH 126/281] Adding different coef for weight by type in magic search --- coreapi/friend.c | 2 +- include/linphone/friend.h | 2 +- src/search/magic-search.cpp | 10 ++++++---- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/coreapi/friend.c b/coreapi/friend.c index a427db250..9c929e225 100644 --- a/coreapi/friend.c +++ b/coreapi/friend.c @@ -1134,7 +1134,7 @@ void linphone_friend_destroy(LinphoneFriend *lf) { linphone_friend_unref(lf); } -LinphoneVcard* linphone_friend_get_vcard(LinphoneFriend *fr) { +LinphoneVcard* linphone_friend_get_vcard(const LinphoneFriend *fr) { if (fr && linphone_core_vcard_supported()) return fr->vcard; return NULL; } diff --git a/include/linphone/friend.h b/include/linphone/friend.h index 6daca4a15..8514efc79 100644 --- a/include/linphone/friend.h +++ b/include/linphone/friend.h @@ -306,7 +306,7 @@ LINPHONE_PUBLIC LinphoneCore *linphone_friend_get_core(const LinphoneFriend *fr) * Returns the vCard object associated to this friend, if any * @param[in] fr LinphoneFriend object */ -LINPHONE_PUBLIC LinphoneVcard* linphone_friend_get_vcard(LinphoneFriend *fr); +LINPHONE_PUBLIC LinphoneVcard* linphone_friend_get_vcard(const LinphoneFriend *fr); /** * Binds a vCard object to a friend diff --git a/src/search/magic-search.cpp b/src/search/magic-search.cpp index ad8b7cf22..13ebc6e41 100644 --- a/src/search/magic-search.cpp +++ b/src/search/magic-search.cpp @@ -221,12 +221,14 @@ SearchResult MagicSearch::searchInFriend(const LinphoneFriend *lFriend, const st if (!checkDomain(lFriend, lAddress, withDomain)) return SearchResult(weight, nullptr); // NAME - if (linphone_friend_get_name(lFriend) != nullptr) { - weight += getWeight(linphone_friend_get_name(lFriend), filter); + if (linphone_core_vcard_supported()) { + if (linphone_friend_get_vcard(lFriend)) { + weight += getWeight(linphone_vcard_get_full_name(linphone_friend_get_vcard(lFriend)), filter) * 3; + } } //SIP URI - weight += searchInAddress(lAddress, filter, withDomain); + weight += searchInAddress(lAddress, filter, withDomain) * 1; // PHONE NUMBER bctbx_list_t *begin, *phoneNumbers = linphone_friend_get_phone_numbers(lFriend); @@ -236,7 +238,7 @@ SearchResult MagicSearch::searchInFriend(const LinphoneFriend *lFriend, const st const LinphonePresenceModel *presence = linphone_friend_get_presence_model_for_uri_or_tel(lFriend, number.c_str()); weight += getWeight(number, filter); if (presence != nullptr) { - weight += getWeight(linphone_presence_model_get_contact(presence), filter); + weight += getWeight(linphone_presence_model_get_contact(presence), filter) * 2; } phoneNumbers = phoneNumbers->next; } From ddb1719333c1fdd1e43bb70604777540c6494420 Mon Sep 17 00:00:00 2001 From: Erwan Croze Date: Thu, 22 Feb 2018 14:09:16 +0100 Subject: [PATCH 127/281] Adding new test for magic search --- tester/setup_tester.c | 68 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 63 insertions(+), 5 deletions(-) diff --git a/tester/setup_tester.c b/tester/setup_tester.c index 32253af20..97262a9d3 100644 --- a/tester/setup_tester.c +++ b/tester/setup_tester.c @@ -52,7 +52,7 @@ static void _create_friends_from_tab(LinphoneCore *lc, LinphoneFriendList *list, static void _remove_friends_from_list(LinphoneFriendList *list, const char *friends[], const unsigned int size) { for (unsigned int i = 0 ; i < size ; i++) { LinphoneFriend *fr = linphone_friend_list_find_friend_by_uri(list, friends[i]); - if (fr != NULL) linphone_friend_list_remove_friend(list, fr); + if (fr) linphone_friend_list_remove_friend(list, fr); } } @@ -63,14 +63,14 @@ static void _check_friend_result_list(LinphoneCore *lc, const bctbx_list_t *resu } const LinphoneSearchResult *sr = bctbx_list_nth_data(resultList, index); const LinphoneFriend *lf = linphone_search_result_get_friend(sr); - if (lf != NULL) { + if (lf) { const LinphoneAddress *la = linphone_friend_get_address(lf); - if (la != NULL) { + if (la) { char* fa = linphone_address_as_string(la); BC_ASSERT_STRING_EQUAL(fa , uri); free(fa); return; - } else if (phone != NULL) { + } else if (phone) { const LinphonePresenceModel *presence = linphone_friend_get_presence_model_for_uri_or_tel(lf, phone); if (BC_ASSERT_PTR_NOT_NULL(presence)) { char *contact = linphone_presence_model_get_contact(presence); @@ -668,7 +668,7 @@ static void search_friend_with_presence(void) { resultList = linphone_magic_search_get_contact_list_from_filter(magicSearch, "chloe", ""); if (BC_ASSERT_PTR_NOT_NULL(resultList)) { - // 1 + last address from filter "sip:33@sip.example.org" + // 1 + last address from filter "sip:chloe@sip.example.org" BC_ASSERT_EQUAL(bctbx_list_size(resultList), 2, int, "%d"); _check_friend_result_list(manager->lc, resultList, 0, chloeSipUri, chloePhoneNumber);//"sip:chloe@sip.example.org" free(resultList); @@ -759,6 +759,63 @@ static void search_friend_last_item_is_filter(void) { linphone_core_manager_destroy(manager); } +static void search_friend_with_name(void) { + LinphoneMagicSearch *magicSearch = NULL; + bctbx_list_t *resultList = NULL; + LinphoneCoreManager* manager = linphone_core_manager_new2("empty_rc", FALSE); + LinphoneFriendList *lfl = linphone_core_get_default_friend_list(manager->lc); + const char *stephanie1SipUri = {"sip:toto@sip.example.org"}; + const char *stephanie2SipUri = {"sip:stephanie@sip.example.org"}; + LinphoneFriend *stephanie1Friend = linphone_core_create_friend(manager->lc); + LinphoneFriend *stephanie2Friend = linphone_core_create_friend(manager->lc); + LinphoneVcard *stephanie1Vcard = linphone_factory_create_vcard(linphone_factory_get()); + LinphoneVcard *stephanie2Vcard = linphone_factory_create_vcard(linphone_factory_get()); + const char *stephanie1Name = {"stephanie delarue"}; + const char *stephanie2Name = {"alias delarue"}; + + _create_friends_from_tab(manager->lc, lfl, sFriends, sSizeFriend); + + linphone_vcard_set_full_name(stephanie1Vcard, stephanie1Name); // stephanie delarue + linphone_vcard_set_url(stephanie1Vcard, stephanie1SipUri); //sip:toto@sip.example.org + linphone_vcard_add_sip_address(stephanie1Vcard, stephanie1SipUri); + linphone_friend_set_vcard(stephanie1Friend, stephanie1Vcard); + linphone_core_add_friend(manager->lc, stephanie1Friend); + + linphone_vcard_set_full_name(stephanie2Vcard, stephanie2Name); // alias delarue + linphone_vcard_set_url(stephanie2Vcard, stephanie2SipUri); //sip:stephanie@sip.example.org + linphone_vcard_add_sip_address(stephanie2Vcard, stephanie2SipUri); + linphone_friend_set_vcard(stephanie2Friend, stephanie2Vcard); + linphone_core_add_friend(manager->lc, stephanie2Friend); + + magicSearch = linphone_magic_search_new(manager->lc); + + resultList = linphone_magic_search_get_contact_list_from_filter(magicSearch, "stephanie", ""); + + if (BC_ASSERT_PTR_NOT_NULL(resultList)) { + BC_ASSERT_EQUAL(bctbx_list_size(resultList), 2, int, "%d"); + _check_friend_result_list(manager->lc, resultList, 0, stephanie1SipUri, NULL);//"sip:toto@sip.example.org" + _check_friend_result_list(manager->lc, resultList, 1, stephanie2SipUri, NULL);//"sip:stephanie@sip.example.org" + free(resultList); + } + + linphone_magic_search_reset_search_cache(magicSearch); + + resultList = linphone_magic_search_get_contact_list_from_filter(magicSearch, "delarue", ""); + + if (BC_ASSERT_PTR_NOT_NULL(resultList)) { + BC_ASSERT_EQUAL(bctbx_list_size(resultList), 2, int, "%d"); + _check_friend_result_list(manager->lc, resultList, 0, stephanie2SipUri, NULL);//"sip:stephanie@sip.example.org" + _check_friend_result_list(manager->lc, resultList, 1, stephanie1SipUri, NULL);//"sip:toto@sip.example.org" + free(resultList); + } + + _remove_friends_from_list(lfl, sFriends, sSizeFriend); + linphone_friend_list_remove_friend(lfl, stephanie1Friend); + linphone_friend_list_remove_friend(lfl, stephanie2Friend); + + linphone_core_manager_destroy(manager); +} + static void search_friend_large_database(void) { MSTimeSpec start, current; LinphoneMagicSearch *magicSearch = NULL; @@ -814,6 +871,7 @@ test_t setup_tests[] = { TEST_TWO_TAGS("Search friend and find it with its presence", search_friend_with_presence, "MagicSearch", "LeaksMemory"), TEST_TWO_TAGS("Search friend in call log", search_friend_in_call_log, "MagicSearch", "LeaksMemory"), TEST_TWO_TAGS("Search friend last item is the filter", search_friend_last_item_is_filter, "MagicSearch", "LeaksMemory"), + TEST_TWO_TAGS("Search friend with name", search_friend_with_name, "MagicSearch", "LeaksMemory"), TEST_TWO_TAGS("Search friend in large friends database", search_friend_large_database, "MagicSearch", "LeaksMemory") }; From 6d3d535fd93f71138af0d56d64f850d8ef56fe26 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Thu, 22 Feb 2018 15:19:46 +0100 Subject: [PATCH 128/281] fix(MainDb): order by event_id in getHistoryRange --- src/db/main-db.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 2b4009291..ac5683b19 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -2254,6 +2254,7 @@ list> MainDb::getHistoryRange ( string query = Statements::get(Statements::SelectConferenceEvents, Backend::Sqlite3) + buildSqlEventFilter({ ConferenceCallFilter, ConferenceChatMessageFilter, ConferenceInfoFilter, ConferenceInfoNoDeviceFilter }, mask, "AND"); + query += " ORDER BY event_id DESC"; if (end > 0) query += " LIMIT " + Utils::toString(end - begin); From 94ff056468125f5b456d0fa648b6889aeb991ddb Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 22 Feb 2018 16:22:10 +0100 Subject: [PATCH 129/281] Improved linphone_chat_message_is_text and linphone_chat_message_is_file_transfer --- src/c-wrapper/api/c-chat-message.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/c-wrapper/api/c-chat-message.cpp b/src/c-wrapper/api/c-chat-message.cpp index 04218bfeb..1c4fb7c62 100644 --- a/src/c-wrapper/api/c-chat-message.cpp +++ b/src/c-wrapper/api/c-chat-message.cpp @@ -301,11 +301,11 @@ LinphoneReason linphone_chat_message_get_reason(LinphoneChatMessage *msg) { } bool_t linphone_chat_message_is_file_transfer(LinphoneChatMessage *msg) { - return LinphonePrivate::ContentType(linphone_chat_message_get_content_type(msg)) == LinphonePrivate::ContentType::FileTransfer; + return L_GET_PRIVATE_FROM_C_OBJECT(msg)->hasFileTransferContent(); } bool_t linphone_chat_message_is_text(LinphoneChatMessage *msg) { - return LinphonePrivate::ContentType(linphone_chat_message_get_content_type(msg)) == LinphonePrivate::ContentType::PlainText; + return L_GET_PRIVATE_FROM_C_OBJECT(msg)->hasTextContent(); } const char *linphone_chat_message_state_to_string(const LinphoneChatMessageState state) { From 4b5e950d01885e1c97f585ec10de6918fe1c3be3 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Thu, 22 Feb 2018 16:55:03 +0100 Subject: [PATCH 130/281] fix(MainDb): disable db lock for Android --- src/db/main-db.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index ac5683b19..ca2e97359 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -1364,6 +1364,11 @@ void MainDb::init () { return sanitized; }; + // Disable locking. (Issue on Android on crash.) + // See: https://stackoverflow.com/questions/17348480/how-do-i-prevent-sqlite-database-locks + if (backend == Sqlite3) + *session << "PRAGMA read_uncommitted = ON"; + // TODO: Migrate all statements in statements.cpp. *session << "CREATE TABLE IF NOT EXISTS sip_address (" From 6da095454c91f0e7bf2c67fcfda965a4f2a681cc Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Thu, 22 Feb 2018 17:34:07 +0100 Subject: [PATCH 131/281] make sure imdm are still passed to the application if deliver_imdn setting is set to 1 --- src/chat/chat-message/chat-message.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index a65e2ca10..7b7cbb054 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -447,15 +447,13 @@ static void forceUtf8Content (Content &content) { void ChatMessagePrivate::notifyReceiving () { L_Q(); - if ((getContentType() == ContentType::Imdn) || (getContentType() == ContentType::ImIsComposing)) - return; - LinphoneChatRoom *chatRoom = L_GET_C_BACK_PTR(q->getChatRoom()); - linphone_chat_room_notify_chat_message_should_be_stored(chatRoom, L_GET_C_BACK_PTR(q->getSharedFromThis())); - - if (toBeStored) - storeInDb(); - + if ((getContentType() != ContentType::Imdn) && (getContentType() != ContentType::ImIsComposing)) { + linphone_chat_room_notify_chat_message_should_be_stored(chatRoom, L_GET_C_BACK_PTR(q->getSharedFromThis())); + + if (toBeStored) + storeInDb(); + } shared_ptr event = make_shared( ::time(nullptr), q->getSharedFromThis() ); @@ -463,7 +461,9 @@ void ChatMessagePrivate::notifyReceiving () { // Legacy q->getChatRoom()->getPrivate()->notifyChatMessageReceived(q->getSharedFromThis()); - q->sendDeliveryNotification(LinphoneReasonNone); + if ((getContentType() != ContentType::Imdn) && (getContentType() != ContentType::ImIsComposing)) { + q->sendDeliveryNotification(LinphoneReasonNone); + } } LinphoneReason ChatMessagePrivate::receive () { From 7bf0554a17a8fd7fdaec6df7d2b0a6c12bd76536 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Fri, 23 Feb 2018 10:45:14 +0100 Subject: [PATCH 132/281] fix group chat imdm tester --- tester/group_chat_tester.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tester/group_chat_tester.c b/tester/group_chat_tester.c index 8189dfb28..ca731bed9 100644 --- a/tester/group_chat_tester.c +++ b/tester/group_chat_tester.c @@ -142,7 +142,11 @@ static void _configure_core_for_conference (LinphoneCoreManager *lcm, LinphoneAd configure_core_for_conference(lcm->lc, NULL, factoryAddr, FALSE); } +static void legacy_is_composing_received(LinphoneCore *lc, LinphoneChatRoom *room) { + ms_message("Legacy is composing function on core [%p] for chatroom [%p]",lc , room); +} static void _configure_core_for_callbacks(LinphoneCoreManager *lcm, LinphoneCoreCbs *cbs) { + linphone_core_cbs_set_is_composing_received(linphone_core_get_current_callbacks(lcm->lc), legacy_is_composing_received); linphone_core_add_callbacks(lcm->lc, cbs); linphone_core_set_user_data(lcm->lc, lcm); } @@ -1935,7 +1939,7 @@ static void multiple_is_composing_notification(void) { BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneIsComposingActiveReceived, 2, 1000)); // + 1 BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_LinphoneIsComposingActiveReceived, 3, 1000)); // + 2 - BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneIsComposingActiveReceived, 1, 1000)); + BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneIsComposingActiveReceived, 1, 2000)); // Laure side composing_addresses = linphone_chat_room_get_composing_addresses(laureCr); From 8e7791e3ea9f378bb328f0041cae450c2bf7b917 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Fri, 23 Feb 2018 10:48:47 +0100 Subject: [PATCH 133/281] fix(MainDb): conference_event_view supports correctly mysql and mariaDb --- src/db/internal/statements.cpp | 36 +++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/src/db/internal/statements.cpp b/src/db/internal/statements.cpp index 2290823e6..328cf0c59 100644 --- a/src/db/internal/statements.cpp +++ b/src/db/internal/statements.cpp @@ -39,6 +39,7 @@ namespace Statements { template constexpr AbstractStatement (const char (&_sql)[N]) : mSql{ _sql, nullptr } {} + // TODO: Improve, check backends. constexpr AbstractStatement (const Statement &a, const Statement &b) : mSql{ a.sql, b.sql } {} const char *getSql (Backend backend) const { @@ -54,17 +55,30 @@ namespace Statements { // --------------------------------------------------------------------------- constexpr AbstractStatement create[CreateCount] = { - [CreateConferenceEventView] = R"( - CREATE VIEW IF NOT EXISTS conference_event_view AS - SELECT id, type, creation_time, chat_room_id, from_sip_address_id, to_sip_address_id, time, imdn_message_id, state, direction, is_secured, notify_id, device_sip_address_id, participant_sip_address_id, subject - FROM event - LEFT JOIN conference_event ON conference_event.event_id = event.id - LEFT JOIN conference_chat_message_event ON conference_chat_message_event.event_id = event.id - LEFT JOIN conference_notified_event ON conference_notified_event.event_id = event.id - LEFT JOIN conference_participant_device_event ON conference_participant_device_event.event_id = event.id - LEFT JOIN conference_participant_event ON conference_participant_event.event_id = event.id - LEFT JOIN conference_subject_event ON conference_subject_event.event_id = event.id - )" + [CreateConferenceEventView] = { { + Backend::Sqlite3, R"( + CREATE VIEW IF NOT EXISTS conference_event_view AS + SELECT id, type, creation_time, chat_room_id, from_sip_address_id, to_sip_address_id, time, imdn_message_id, state, direction, is_secured, notify_id, device_sip_address_id, participant_sip_address_id, subject + FROM event + LEFT JOIN conference_event ON conference_event.event_id = event.id + LEFT JOIN conference_chat_message_event ON conference_chat_message_event.event_id = event.id + LEFT JOIN conference_notified_event ON conference_notified_event.event_id = event.id + LEFT JOIN conference_participant_device_event ON conference_participant_device_event.event_id = event.id + LEFT JOIN conference_participant_event ON conference_participant_event.event_id = event.id + LEFT JOIN conference_subject_event ON conference_subject_event.event_id = event.id + )" }, { + Backend::Mysql, R"( + CREATE OR REPLACE VIEW conference_event_view AS + SELECT id, type, creation_time, chat_room_id, from_sip_address_id, to_sip_address_id, time, imdn_message_id, state, direction, is_secured, notify_id, device_sip_address_id, participant_sip_address_id, subject + FROM event + LEFT JOIN conference_event ON conference_event.event_id = event.id + LEFT JOIN conference_chat_message_event ON conference_chat_message_event.event_id = event.id + LEFT JOIN conference_notified_event ON conference_notified_event.event_id = event.id + LEFT JOIN conference_participant_device_event ON conference_participant_device_event.event_id = event.id + LEFT JOIN conference_participant_event ON conference_participant_event.event_id = event.id + LEFT JOIN conference_subject_event ON conference_subject_event.event_id = event.id + )" + } } }; // --------------------------------------------------------------------------- From 4f96c41eea0a798543cb7df76690eabb153e7c39 Mon Sep 17 00:00:00 2001 From: Erwan Croze Date: Fri, 23 Feb 2018 10:59:02 +0100 Subject: [PATCH 134/281] Fixing magic search constructor for wrapper --- include/linphone/core.h | 8 ++++++++ src/c-wrapper/api/c-magic-search.cpp | 6 +++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/include/linphone/core.h b/include/linphone/core.h index d2efdce47..2dc9cf384 100644 --- a/include/linphone/core.h +++ b/include/linphone/core.h @@ -115,6 +115,14 @@ LINPHONE_PUBLIC LinphonePlayer *linphone_core_create_local_player(LinphoneCore * **/ LINPHONE_PUBLIC LinphoneInfoMessage *linphone_core_create_info_message(LinphoneCore*lc); +/** + * Create a #LinphoneMagicSearch object. + * @param[in] lc #LinphoneCore object + * @return The create #LinphoneMagicSearch object + * @ingroup misc + */ +LINPHONE_PUBLIC LinphoneMagicSearch *linphone_core_create_magic_search(LinphoneCore *lc); + /** * Checks if a new version of the application is available. * @param lc LinphoneCore object diff --git a/src/c-wrapper/api/c-magic-search.cpp b/src/c-wrapper/api/c-magic-search.cpp index 7716080dc..06dbe50ee 100644 --- a/src/c-wrapper/api/c-magic-search.cpp +++ b/src/c-wrapper/api/c-magic-search.cpp @@ -24,7 +24,7 @@ using namespace std; L_DECLARE_C_OBJECT_IMPL(MagicSearch); -LinphoneMagicSearch *linphone_magic_search_new(LinphoneCore *lc) { +LinphoneMagicSearch *linphone_core_create_magic_search(LinphoneCore *lc) { shared_ptr cppPtr = make_shared(L_GET_CPP_PTR_FROM_C_OBJECT(lc)); LinphoneMagicSearch *object = L_INIT(MagicSearch); @@ -32,6 +32,10 @@ LinphoneMagicSearch *linphone_magic_search_new(LinphoneCore *lc) { return object; } +LinphoneMagicSearch *linphone_new_magic_search(LinphoneCore *lc) { + return linphone_core_create_magic_search(lc); +} + LinphoneMagicSearch *linphone_magic_search_ref(LinphoneMagicSearch *magicSearch) { belle_sip_object_ref(magicSearch); return magicSearch; From f2a25777d59454580b929a832a416f76006094ed Mon Sep 17 00:00:00 2001 From: Erwan Croze Date: Fri, 23 Feb 2018 11:10:50 +0100 Subject: [PATCH 135/281] Fixing magic search --- src/c-wrapper/api/c-magic-search.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/c-wrapper/api/c-magic-search.cpp b/src/c-wrapper/api/c-magic-search.cpp index 06dbe50ee..028a64ba1 100644 --- a/src/c-wrapper/api/c-magic-search.cpp +++ b/src/c-wrapper/api/c-magic-search.cpp @@ -32,7 +32,7 @@ LinphoneMagicSearch *linphone_core_create_magic_search(LinphoneCore *lc) { return object; } -LinphoneMagicSearch *linphone_new_magic_search(LinphoneCore *lc) { +LinphoneMagicSearch *linphone_magic_search_new(LinphoneCore *lc) { return linphone_core_create_magic_search(lc); } From 1f8f765277c477652d58226ed0dcf034182d9b38 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Fri, 23 Feb 2018 11:42:26 +0100 Subject: [PATCH 136/281] fix(MainDb): add a compatible trigger char message participant deleter with mysql --- src/db/internal/statements.cpp | 15 ++++++--------- src/db/main-db.cpp | 4 +++- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/db/internal/statements.cpp b/src/db/internal/statements.cpp index 328cf0c59..b0bf05cc8 100644 --- a/src/db/internal/statements.cpp +++ b/src/db/internal/statements.cpp @@ -42,7 +42,7 @@ namespace Statements { // TODO: Improve, check backends. constexpr AbstractStatement (const Statement &a, const Statement &b) : mSql{ a.sql, b.sql } {} - const char *getSql (Backend backend) const { + const char *get (Backend backend) const { return backend == Backend::Mysql && mSql[1] ? mSql[1] : mSql[0]; } @@ -85,7 +85,7 @@ namespace Statements { // Select statements. // --------------------------------------------------------------------------- - constexpr const char *select[SelectCount] = { + constexpr AbstractStatement select[SelectCount] = { [SelectSipAddressId] = R"( SELECT id FROM sip_address @@ -126,7 +126,7 @@ namespace Statements { // Select statements. // --------------------------------------------------------------------------- - constexpr const char *insert[InsertCount] = { + constexpr AbstractStatement insert[InsertCount] = { [InsertOneToOneChatRoom] = R"( INSERT INTO one_to_one_chat_room ( chat_room_id, participant_a_sip_address_id, participant_b_sip_address_id @@ -139,18 +139,15 @@ namespace Statements { // --------------------------------------------------------------------------- const char *get (Create createStmt, AbstractDb::Backend backend) { - (void)backend; - return createStmt >= Create::CreateCount ? nullptr : create[createStmt].getSql(backend); + return createStmt >= Create::CreateCount ? nullptr : create[createStmt].get(backend); } const char *get (Select selectStmt, AbstractDb::Backend backend) { - (void)backend; - return selectStmt >= Select::SelectCount ? nullptr : select[selectStmt]; + return selectStmt >= Select::SelectCount ? nullptr : select[selectStmt].get(backend); } const char *get (Insert insertStmt, AbstractDb::Backend backend) { - (void)backend; - return insertStmt >= Insert::InsertCount ? nullptr : insert[insertStmt]; + return insertStmt >= Insert::InsertCount ? nullptr : insert[insertStmt].get(backend); } } diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index ca2e97359..2c2d7f003 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -1697,7 +1697,9 @@ void MainDb::init () { if (getBackend() == Backend::Mysql) *session << - "CREATE TRIGGER IF NOT EXISTS chat_message_participant_deleter" + "DROP TRIGGER IF EXISTS chat_message_participant_deleter"; + *session << + "CREATE TRIGGER chat_message_participant_deleter" " AFTER UPDATE ON conference_chat_message_event FOR EACH ROW" " BEGIN" " IF NEW.state = " + Utils::toString(int(ChatMessage::State::Displayed)) + " THEN" From 07b33a419e76f29fb65986b875fbec3d90254070 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Fri, 23 Feb 2018 11:57:46 +0100 Subject: [PATCH 137/281] fix(MainDb): add braces!! --- src/db/main-db.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 2c2d7f003..11186d646 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -1695,7 +1695,7 @@ void MainDb::init () { " version INT UNSIGNED NOT NULL" ") " + charset; - if (getBackend() == Backend::Mysql) + if (getBackend() == Backend::Mysql) { *session << "DROP TRIGGER IF EXISTS chat_message_participant_deleter"; *session << @@ -1706,7 +1706,7 @@ void MainDb::init () { " DELETE FROM chat_message_participant WHERE event_id = NEW.event_id;" " END IF;" " END "; - else + } else *session << "CREATE TRIGGER IF NOT EXISTS chat_message_participant_deleter" " AFTER UPDATE OF state ON conference_chat_message_event FOR EACH ROW" From e0b2b412905a60f71bf95ffa1a3fc63729a81059 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Fri, 23 Feb 2018 16:17:58 +0100 Subject: [PATCH 138/281] Many things: - Provide a StaticString object to build const char* at compile time - Use StaticString in MainDb to transforms enum in const char* automatically (events filters) - In future: Abuse of this component in MainDb to build queries easily between Mysql/Sqlite3 --- include/linphone/utils/general.h | 48 +++++-- include/linphone/utils/static-string.h | 166 +++++++++++++++++++++++++ src/db/main-db.cpp | 64 ++++++++-- 3 files changed, 260 insertions(+), 18 deletions(-) create mode 100644 include/linphone/utils/static-string.h diff --git a/include/linphone/utils/general.h b/include/linphone/utils/general.h index 5a4c3b15f..021bc7062 100644 --- a/include/linphone/utils/general.h +++ b/include/linphone/utils/general.h @@ -114,6 +114,8 @@ std::unique_ptr makeUnique(Args && ...args) { return std::unique_ptr(new T(std::forward(args)...)); } +#define L_AUTO_RETURN(VALUE) -> decltype(VALUE) { return VALUE; } + // ----------------------------------------------------------------------------- // Class tools. // ----------------------------------------------------------------------------- @@ -259,17 +261,13 @@ namespace Private { template struct ResolveMemberFunctionOverload { template - constexpr auto operator() (Ret (Obj::*func)(Args...)) const -> decltype(func) { - return func; - } + constexpr auto operator() (Ret (Obj::*func)(Args...)) const L_AUTO_RETURN(func); }; template struct ResolveConstMemberFunctionOverload { template - constexpr auto operator() (Ret (Obj::*func)(Args...) const) const -> decltype(func) { - return func; - } + constexpr auto operator() (Ret (Obj::*func)(Args...) const) L_AUTO_RETURN(func); }; template @@ -278,9 +276,7 @@ namespace Private { using ResolveConstMemberFunctionOverload::operator(); template - constexpr auto operator() (Ret (*func)(Args...)) const -> decltype(func) { - return func; - } + constexpr auto operator() (Ret (*func)(Args...)) const L_AUTO_RETURN(func); }; } @@ -288,6 +284,40 @@ namespace Private { template using resolveOverload = Private::ResolveOverload; +// ----------------------------------------------------------------------------- +// Math. +// ----------------------------------------------------------------------------- + +// Get the length of one integer. +constexpr int getIntLength (int n) { + return n < 0 ? 1 + getIntLength(-n) : (n < 10 ? 1 : 1 + getIntLength(n / 10)); +} + +namespace Private { + constexpr int pow10Impl (int n, int acc) { + return n == 0 ? acc : pow10Impl(n - 1, acc * 10); + } +} + +template +constexpr T abs (const T &value) { + return value < 0 ? -value : value; +} + +constexpr int pow10 (int n) { + return (n < 0 ? -1 : +1) * Private::pow10Impl(abs(n), 1); +} + +// Returns the sum of n elements. +constexpr int sums () { + return 0; +} + +template +constexpr int sums (T i, Args... args) { + return i + sums(args...); +} + // ----------------------------------------------------------------------------- // Wrapper public. // ----------------------------------------------------------------------------- diff --git a/include/linphone/utils/static-string.h b/include/linphone/utils/static-string.h new file mode 100644 index 000000000..222095ce7 --- /dev/null +++ b/include/linphone/utils/static-string.h @@ -0,0 +1,166 @@ +/* + * static-string.h + * Copyright (C) 2010-2018 Belledonne Communications SARL + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _L_STATIC_STRING_H_ +#define _L_STATIC_STRING_H_ + +#include "linphone/utils/general.h" + +// ============================================================================= +// Compile time strings. Useful to build const char * at compilation. +// ============================================================================= + +LINPHONE_BEGIN_NAMESPACE + +template +struct IndexSequence { + using Type = IndexSequence; +}; + +namespace Private { + template + struct ConcatIndexSequenceImpl; + + template + struct ConcatIndexSequenceImpl, IndexSequence> : + IndexSequence {}; + + template + struct MakeIndexSequenceImpl : ConcatIndexSequenceImpl< + typename MakeIndexSequenceImpl::Type, + typename MakeIndexSequenceImpl::Type + > {}; + + template<> + struct MakeIndexSequenceImpl<0> : IndexSequence<> {}; + + template<> + struct MakeIndexSequenceImpl<1> : IndexSequence<0> {}; +} + +template +using MakeIndexSequence = typename Private::MakeIndexSequenceImpl::Type; + +// ============================================================================= + +// See: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4121.pdf +template +using RawStaticString = const char [N]; + +namespace Private { + template> + struct StaticString; + + template + struct StaticString> { + constexpr StaticString (const RawStaticString &inRaw) : raw{ (inRaw[Index])... } {} + + constexpr char operator[] (std::size_t i) const { + return raw[i]; + } + + constexpr operator const char * () const { + return raw; + } + + RawStaticString raw; + }; + + template + class StaticStringConcatHelper { + public: + template + constexpr StaticStringConcatHelper( + const Private::StaticString &s1, + const Private::StaticString &s2 + ) : StaticStringConcatHelper(s1, s2, MakeIndexSequence{}, MakeIndexSequence{}) {} + + RawStaticString raw; + + private: + template + constexpr StaticStringConcatHelper( + const Private::StaticString &s1, + const Private::StaticString &s2, + IndexSequence, + IndexSequence + ) : raw{ s1[Index1]..., s2[Index2]... } {} + }; + + template + class StaticIntStringHelper { + public: + constexpr StaticIntStringHelper () : StaticIntStringHelper(MakeIndexSequence= 0 ? N - 1 : N - 2>{}) {} + + RawStaticString raw; + + private: + template= 0, int>::type* = nullptr> + constexpr StaticIntStringHelper (const IndexSequence &) : + raw{ ('0' + Value / pow10(N - Index - 2) % 10 )..., '\0' } {} + + template::type* = nullptr> + constexpr StaticIntStringHelper (const IndexSequence &) : + raw{ '-', ('0' + abs(Value) / pow10(N - Index - 3) % 10 )..., '\0' } {} + }; +}; + +// ----------------------------------------------------------------------------- + +template +constexpr Private::StaticString StaticString (const RawStaticString &raw) { + return Private::StaticString(raw); +} + +template +constexpr Private::StaticString operator+ ( + const Private::StaticString &s1, + const Private::StaticString &s2 +) { + return StaticString(Private::StaticStringConcatHelper(s1, s2).raw); +} + +template +constexpr Private::StaticString operator+ ( + const Private::StaticString &s1, + const RawStaticString &s2 +) { + return StaticString(Private::StaticStringConcatHelper(s1, StaticString(s2)).raw); +} + +template +constexpr Private::StaticString operator+ ( + const RawStaticString &s1, + const Private::StaticString &s2 +) { + return StaticString(Private::StaticStringConcatHelper(StaticString(s1), s2).raw); +} + +// ----------------------------------------------------------------------------- + +template +constexpr Private::StaticString StaticIntString () { + return StaticString(Private::StaticIntStringHelper().raw); +} + +// ----------------------------------------------------------------------------- + +LINPHONE_END_NAMESPACE + +#endif // ifndef _L_STATIC_STRING_H_ diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 11186d646..0502ab1be 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -21,6 +21,7 @@ #include "linphone/utils/algorithm.h" #include "linphone/utils/utils.h" +#include "linphone/utils/static-string.h" #include "chat/chat-message/chat-message-p.h" #include "chat/chat-room/chat-room-p.h" @@ -94,9 +95,10 @@ MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), #ifdef SOCI_ENABLED // ----------------------------------------------------------------------------- -// Soci backend. +// Event filter tools. // ----------------------------------------------------------------------------- +// Some tools to build filters at compile time. template struct EnumToSql { T first; @@ -110,17 +112,61 @@ static constexpr const char *mapEnumToSql (const EnumToSql enumToSql[], size_ ); } -// Update me event-log-enums values are changed! -static constexpr EnumToSql eventFilterToSql[] = { - { MainDb::ConferenceCallFilter, "3, 4" }, - { MainDb::ConferenceChatMessageFilter, "5" }, - { MainDb::ConferenceInfoFilter, "1, 2, 6, 7, 8, 9, 10, 11, 12" }, - { MainDb::ConferenceInfoNoDeviceFilter, "1, 2, 6, 7, 8, 9, 12" } +template +struct SqlEventFilterBuilder {}; + +template +struct SqlEventFilterBuilder { + static constexpr Private::StaticString<1 + getIntLength(int(Type)) + sums((1 + getIntLength(int(List)))...)> get () { + return StaticIntString() + "," + SqlEventFilterBuilder::get(); + } }; -static constexpr const char *mapEventFilterToSql (MainDb::Filter filter) { +template +struct SqlEventFilterBuilder { + static constexpr Private::StaticString<1 + getIntLength(int(Type))> get () { + return StaticIntString(); + } +}; + +// ----------------------------------------------------------------------------- +// Event filters. +// ----------------------------------------------------------------------------- + +namespace { + constexpr auto ConferenceCallFilter = SqlEventFilterBuilder< + EventLog::Type::ConferenceCallStart, + EventLog::Type::ConferenceCallEnd + >::get(); + + constexpr auto ConferenceChatMessageFilter = SqlEventFilterBuilder::get(); + + constexpr auto ConferenceInfoNoDeviceFilter = SqlEventFilterBuilder< + EventLog::Type::ConferenceCreated, + EventLog::Type::ConferenceTerminated, + EventLog::Type::ConferenceParticipantAdded, + EventLog::Type::ConferenceParticipantRemoved, + EventLog::Type::ConferenceParticipantSetAdmin, + EventLog::Type::ConferenceParticipantUnsetAdmin, + EventLog::Type::ConferenceSubjectChanged + >::get(); + + constexpr auto ConferenceInfoFilter = ConferenceInfoNoDeviceFilter + "," + SqlEventFilterBuilder< + EventLog::Type::ConferenceParticipantDeviceAdded, + EventLog::Type::ConferenceParticipantDeviceRemoved + >::get(); + + constexpr EnumToSql EventFilterToSql[] = { + { MainDb::ConferenceCallFilter, ConferenceCallFilter }, + { MainDb::ConferenceChatMessageFilter, ConferenceChatMessageFilter }, + { MainDb::ConferenceInfoNoDeviceFilter, ConferenceInfoNoDeviceFilter }, + { MainDb::ConferenceInfoFilter, ConferenceInfoFilter } + }; +} + +static const char *mapEventFilterToSql (MainDb::Filter filter) { return mapEnumToSql( - eventFilterToSql, sizeof eventFilterToSql / sizeof eventFilterToSql[0], filter + EventFilterToSql, sizeof EventFilterToSql / sizeof EventFilterToSql[0], filter ); } From ac482f58b7af96e0811d5a9b24b8c77babada2f4 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Fri, 23 Feb 2018 17:22:05 +0100 Subject: [PATCH 139/281] fix(MainDb): fix sql lock --- src/chat/chat-message/chat-message.cpp | 5 ++++- src/db/main-db.cpp | 5 ----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index 7b7cbb054..a966e98bf 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -450,7 +450,7 @@ void ChatMessagePrivate::notifyReceiving () { LinphoneChatRoom *chatRoom = L_GET_C_BACK_PTR(q->getChatRoom()); if ((getContentType() != ContentType::Imdn) && (getContentType() != ContentType::ImIsComposing)) { linphone_chat_room_notify_chat_message_should_be_stored(chatRoom, L_GET_C_BACK_PTR(q->getSharedFromThis())); - + if (toBeStored) storeInDb(); } @@ -784,6 +784,9 @@ void ChatMessagePrivate::updateInDb () { unique_ptr &mainDb = q->getChatRoom()->getCore()->getPrivate()->mainDb; shared_ptr eventLog = mainDb->getEventFromKey(dbKey); + + // Avoid transaction in transaction if contents are not loaded. + loadContentsFromDatabase(); mainDb->updateEvent(eventLog); if (direction == ChatMessage::Direction::Incoming) { diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 0502ab1be..584186215 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -1410,11 +1410,6 @@ void MainDb::init () { return sanitized; }; - // Disable locking. (Issue on Android on crash.) - // See: https://stackoverflow.com/questions/17348480/how-do-i-prevent-sqlite-database-locks - if (backend == Sqlite3) - *session << "PRAGMA read_uncommitted = ON"; - // TODO: Migrate all statements in statements.cpp. *session << "CREATE TABLE IF NOT EXISTS sip_address (" From 4c2e09b8f03c2215b29eb6f4713e9bcb2ecf622f Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 23 Feb 2018 17:22:38 +0100 Subject: [PATCH 140/281] Small code improvement --- src/chat/chat-message/chat-message.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index a966e98bf..f7d922056 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -137,7 +137,7 @@ void ChatMessagePrivate::setState (ChatMessage::State newState, bool force) { LinphoneChatMessageCbs *cbs = linphone_chat_message_get_callbacks(msg); if (cbs && linphone_chat_message_cbs_get_msg_state_changed(cbs)) - linphone_chat_message_cbs_get_msg_state_changed(cbs)(msg, linphone_chat_message_get_state(msg)); + linphone_chat_message_cbs_get_msg_state_changed(cbs)(msg, (LinphoneChatMessageState)state); updateInDb(); } From 5e45da89a78d33a0216c2e25a8ee7df04192a3df Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 23 Feb 2018 17:25:33 +0100 Subject: [PATCH 141/281] Fixed Android compil --- include/linphone/utils/general.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/linphone/utils/general.h b/include/linphone/utils/general.h index 021bc7062..26c99603e 100644 --- a/include/linphone/utils/general.h +++ b/include/linphone/utils/general.h @@ -267,7 +267,7 @@ namespace Private { template struct ResolveConstMemberFunctionOverload { template - constexpr auto operator() (Ret (Obj::*func)(Args...) const) L_AUTO_RETURN(func); + constexpr auto operator() (Ret (Obj::*func)(Args...) const) const L_AUTO_RETURN(func); }; template From 9767adccc85402eec802d0f50846c4acbac34895 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Fri, 23 Feb 2018 17:51:51 +0100 Subject: [PATCH 142/281] add group chat test to add participant --- tester/group_chat_tester.c | 131 +++++++++++++++++++++++++++++++++++-- 1 file changed, 127 insertions(+), 4 deletions(-) diff --git a/tester/group_chat_tester.c b/tester/group_chat_tester.c index ca731bed9..a89060899 100644 --- a/tester/group_chat_tester.c +++ b/tester/group_chat_tester.c @@ -146,7 +146,12 @@ static void legacy_is_composing_received(LinphoneCore *lc, LinphoneChatRoom *roo ms_message("Legacy is composing function on core [%p] for chatroom [%p]",lc , room); } static void _configure_core_for_callbacks(LinphoneCoreManager *lcm, LinphoneCoreCbs *cbs) { - linphone_core_cbs_set_is_composing_received(linphone_core_get_current_callbacks(lcm->lc), legacy_is_composing_received); + bctbx_list_t *it; + for (it = linphone_core_get_callbacks_list(lcm->lc);it!=NULL;it=it->next) { + if (linphone_core_cbs_get_is_composing_received((LinphoneCoreCbs*)it->data)) + linphone_core_cbs_set_is_composing_received((LinphoneCoreCbs*)it->data, legacy_is_composing_received); + } + linphone_core_add_callbacks(lcm->lc, cbs); linphone_core_set_user_data(lcm->lc, lcm); } @@ -309,6 +314,10 @@ static void group_chat_room_creation_server (void) { coresManagerList = bctbx_list_append(coresManagerList, laure); coresManagerList = bctbx_list_append(coresManagerList, chloe); bctbx_list_t *coresList = init_core_for_conference(coresManagerList); + + + + start_core_for_conference(coresManagerList); participantsAddresses = bctbx_list_append(participantsAddresses, linphone_address_new(linphone_core_get_identity(pauline->lc))); @@ -462,6 +471,119 @@ static void group_chat_room_creation_server (void) { linphone_core_manager_destroy(chloe); } +static void group_chat_room_add_participant (void) { + LinphoneCoreManager *marie = linphone_core_manager_create("marie_rc"); + LinphoneCoreManager *pauline = linphone_core_manager_create("pauline_rc"); + LinphoneCoreManager *laure = linphone_core_manager_create("laure_tcp_rc"); + LinphoneCoreManager *chloe = linphone_core_manager_create("chloe_rc"); + + bctbx_list_t *coresManagerList = NULL; + bctbx_list_t *participantsAddresses = NULL; + coresManagerList = bctbx_list_append(coresManagerList, marie); + coresManagerList = bctbx_list_append(coresManagerList, pauline); + coresManagerList = bctbx_list_append(coresManagerList, laure); + coresManagerList = bctbx_list_append(coresManagerList, chloe); + bctbx_list_t *coresList = init_core_for_conference(coresManagerList); + linphone_core_set_linphone_specs(chloe->lc, ""); //disable group chat for chloe + + start_core_for_conference(coresManagerList); + + participantsAddresses = bctbx_list_append(participantsAddresses, linphone_address_new(linphone_core_get_identity(marie->lc))); + participantsAddresses = bctbx_list_append(participantsAddresses, linphone_address_new(linphone_core_get_identity(laure->lc))); + stats initialMarieStats = marie->stat; + stats initialPaulineStats = pauline->stat; + stats initialLaureStats = laure->stat; + stats initialChloeStats = chloe->stat; + + // Pauline creates a new group chat room + const char *initialSubject = "Colleagues"; + LinphoneChatRoom *paulineCr = create_chat_room_client_side(coresList, pauline, &initialPaulineStats, participantsAddresses, initialSubject, -1); + const LinphoneAddress *confAddr = linphone_chat_room_get_conference_address(paulineCr); + + // Check that the chat room is correctly created on Pauline's side and that the participants are added + LinphoneChatRoom *marieCr = check_creation_chat_room_client_side(coresList, marie, &initialMarieStats, confAddr, initialSubject, 2, FALSE); + + // Check that the chat room is correctly created on Laure's side and that the participants are added + LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, FALSE); + + //to simulate dialog removal for pauline + linphone_core_set_network_reachable(pauline->lc, FALSE); + coresList=bctbx_list_remove(coresList, pauline->lc); + linphone_core_manager_reinit(pauline); + bctbx_list_t *tmpCoresManagerList = bctbx_list_append(NULL, pauline); + init_core_for_conference(tmpCoresManagerList); + bctbx_list_free(tmpCoresManagerList); + coresList = bctbx_list_append(coresList, pauline->lc); + linphone_core_manager_start(pauline, TRUE); + LinphoneChatRoom *olpaulineCr = paulineCr; + paulineCr = linphone_core_get_chat_room(pauline->lc, linphone_chat_room_get_peer_address(olpaulineCr)); + + // Pauline adds Chloe to the chat room + participantsAddresses = NULL; + participantsAddresses = bctbx_list_append(participantsAddresses, linphone_address_new(linphone_core_get_identity(chloe->lc))); + linphone_chat_room_add_participants(paulineCr, participantsAddresses); + bctbx_list_free_with_data(participantsAddresses, (bctbx_list_free_func)linphone_address_unref); + participantsAddresses = NULL; + + //refused by server because group chat disabled for chloe + BC_ASSERT_FALSE(wait_for_list(coresList, &marie->stat.number_of_participants_added, initialMarieStats.number_of_participants_added + 1, 1000)); + BC_ASSERT_FALSE(wait_for_list(coresList, &pauline->stat.number_of_participants_added, initialPaulineStats.number_of_participants_added + 1, 1000)); + BC_ASSERT_FALSE(wait_for_list(coresList, &laure->stat.number_of_participants_added, initialLaureStats.number_of_participants_added + 1, 1000)); + BC_ASSERT_EQUAL(linphone_chat_room_get_nb_participants(marieCr), 2, int, "%d"); + BC_ASSERT_EQUAL(linphone_chat_room_get_nb_participants(paulineCr), 2, int, "%d"); + BC_ASSERT_EQUAL(linphone_chat_room_get_nb_participants(laureCr), 2, int, "%d"); + + // Pauline begins composing a message + linphone_chat_room_compose(paulineCr); + BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneIsComposingActiveReceived, initialMarieStats.number_of_LinphoneIsComposingActiveReceived + 1, 10000)); + BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_LinphoneIsComposingActiveReceived, initialPaulineStats.number_of_LinphoneIsComposingActiveReceived + 1, 10000)); + + + //Now, chloe is upgrading to group chat client + linphone_core_set_network_reachable(chloe->lc, FALSE); + coresList=bctbx_list_remove(coresList, chloe->lc); + linphone_core_manager_reinit(chloe); + tmpCoresManagerList = bctbx_list_append(NULL, chloe); + init_core_for_conference(tmpCoresManagerList); + bctbx_list_free(tmpCoresManagerList); + coresList = bctbx_list_append(coresList, chloe->lc); + linphone_core_manager_start(chloe, TRUE); + + // Pauline adds Chloe to the chat room + participantsAddresses = NULL; + participantsAddresses = bctbx_list_append(participantsAddresses, linphone_address_new(linphone_core_get_identity(chloe->lc))); + linphone_chat_room_add_participants(paulineCr, participantsAddresses); + bctbx_list_free_with_data(participantsAddresses, (bctbx_list_free_func)linphone_address_unref); + participantsAddresses = NULL; + + // Check that the chat room is correctly created on Chloe's side and that she was added everywhere + LinphoneChatRoom *chloeCr = check_creation_chat_room_client_side(coresList, chloe, &initialChloeStats, confAddr, initialSubject, 3, FALSE); + BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_participants_added, initialMarieStats.number_of_participants_added + 1, 10000)); + BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_participants_added, initialPaulineStats.number_of_participants_added + 1, 10000)); + BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_participants_added, initialLaureStats.number_of_participants_added + 1, 10000)); + BC_ASSERT_EQUAL(linphone_chat_room_get_nb_participants(marieCr), 3, int, "%d"); + BC_ASSERT_EQUAL(linphone_chat_room_get_nb_participants(paulineCr), 3, int, "%d"); + BC_ASSERT_EQUAL(linphone_chat_room_get_nb_participants(laureCr), 3, int, "%d"); + + // Clean db from chat room + linphone_core_manager_delete_chat_room(marie, marieCr, coresList); + linphone_core_manager_delete_chat_room(laure, laureCr, coresList); + linphone_core_manager_delete_chat_room(pauline, paulineCr, coresList); + linphone_core_manager_delete_chat_room(chloe, chloeCr, coresList); + + BC_ASSERT_EQUAL(linphone_core_get_call_history_size(marie->lc), 0, int,"%i"); + BC_ASSERT_EQUAL(linphone_core_get_call_history_size(laure->lc), 0, int,"%i"); + BC_ASSERT_EQUAL(linphone_core_get_call_history_size(pauline->lc), 0, int,"%i"); + BC_ASSERT_EQUAL(linphone_core_get_call_history_size(chloe->lc), 0, int,"%i"); + + bctbx_list_free(coresList); + bctbx_list_free(coresManagerList); + linphone_core_manager_destroy(marie); + linphone_core_manager_destroy(pauline); + linphone_core_manager_destroy(laure); + linphone_core_manager_destroy(chloe); +} + static int im_encryption_engine_process_incoming_message_cb(LinphoneImEncryptionEngine *engine, LinphoneChatRoom *room, LinphoneChatMessage *msg) { if (linphone_chat_message_get_content_type(msg)) { if (strcmp(linphone_chat_message_get_content_type(msg), "cipher/b64") == 0) { @@ -1937,10 +2059,7 @@ static void multiple_is_composing_notification(void) { linphone_chat_room_compose(paulineCr); linphone_chat_room_compose(marieCr); - BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneIsComposingActiveReceived, 2, 1000)); // + 1 BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_LinphoneIsComposingActiveReceived, 3, 1000)); // + 2 - BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneIsComposingActiveReceived, 1, 2000)); - // Laure side composing_addresses = linphone_chat_room_get_composing_addresses(laureCr); BC_ASSERT_EQUAL(bctbx_list_size(composing_addresses), 2, int, "%i"); @@ -1954,7 +2073,9 @@ static void multiple_is_composing_notification(void) { } } + // Marie side + BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneIsComposingActiveReceived, 2, 1000)); // + 1 composing_addresses = linphone_chat_room_get_composing_addresses(marieCr); BC_ASSERT_EQUAL(bctbx_list_size(composing_addresses), 1, int, "%i"); if (bctbx_list_size(composing_addresses) == 1) { @@ -1963,6 +2084,7 @@ static void multiple_is_composing_notification(void) { } // Pauline side + BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneIsComposingActiveReceived, 1, 2000)); composing_addresses = linphone_chat_room_get_composing_addresses(paulineCr); BC_ASSERT_EQUAL(bctbx_list_size(composing_addresses), 1, int, "%i"); if (bctbx_list_size(composing_addresses) == 1) { @@ -2861,6 +2983,7 @@ end: test_t group_chat_tests[] = { TEST_TWO_TAGS("Group chat room creation server", group_chat_room_creation_server, "Server", "LeaksMemory"), + TEST_TWO_TAGS("Add participant", group_chat_room_add_participant, "Server", "LeaksMemory"), TEST_TWO_TAGS("Send message", group_chat_room_send_message, "Server", "LeaksMemory"), TEST_TWO_TAGS("Send encrypted message", group_chat_room_send_message_encrypted, "Server", "LeaksMemory"), TEST_TWO_TAGS("Send invite on a multi register account", group_chat_room_invite_multi_register_account, "Server", "LeaksMemory"), From de8c673f3806d4754e45de5b8ae6af8627101d23 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Mon, 26 Feb 2018 09:23:30 +0100 Subject: [PATCH 143/281] fix(MainDb): ensure contents are loaded before add event --- src/chat/chat-message/chat-message.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index f7d922056..de582fcab 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -762,6 +762,9 @@ void ChatMessagePrivate::storeInDb () { updateInDb(); } else { shared_ptr eventLog = make_shared(time, q->getSharedFromThis()); + + // Avoid transaction in transaction if contents are not loaded. + loadContentsFromDatabase(); q->getChatRoom()->getPrivate()->addEvent(eventLog); if (direction == ChatMessage::Direction::Incoming) { From 53296fb8cb01a12e0360a16c2378d6a0592688e5 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Mon, 26 Feb 2018 10:28:32 +0100 Subject: [PATCH 144/281] fix(ChatMessage): improve check of loaded contents --- src/chat/chat-message/chat-message-p.h | 13 ++++++++- src/chat/chat-message/chat-message.cpp | 39 ++++++++++---------------- 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/src/chat/chat-message/chat-message-p.h b/src/chat/chat-message/chat-message-p.h index b6182c94f..ebca8138c 100644 --- a/src/chat/chat-message/chat-message-p.h +++ b/src/chat/chat-message/chat-message-p.h @@ -83,6 +83,16 @@ public: void loadContentsFromDatabase () const; + std::list &getContents () { + loadContentsFromDatabase(); + return contents; + } + + const std::list &getContents () const { + loadContentsFromDatabase(); + return contents; + } + belle_http_request_t *getHttpRequest () const; void setHttpRequest (belle_http_request_t *request); @@ -149,7 +159,6 @@ private: std::string rttMessage; bool isSecured = false; mutable bool isReadOnly = false; - std::list contents; Content internalContent; std::unordered_map customHeaders; mutable LinphoneErrorInfo * errorInfo = nullptr; @@ -180,6 +189,8 @@ private: ChatMessage::State state = ChatMessage::State::Idle; ChatMessage::Direction direction = ChatMessage::Direction::Incoming; + std::list contents; + bool encryptionPrevented = false; bool toBeStored = true; mutable bool contentsNotLoadedFromDatabase = false; diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index de582fcab..1e3bf9e8d 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -183,8 +183,7 @@ string ChatMessagePrivate::getSalCustomHeaderValue (const string &name) { // ----------------------------------------------------------------------------- bool ChatMessagePrivate::hasTextContent() const { - loadContentsFromDatabase(); - for (const Content *c : contents) { + for (const Content *c : getContents()) { if (c->getContentType() == ContentType::PlainText) { return true; } @@ -193,8 +192,7 @@ bool ChatMessagePrivate::hasTextContent() const { } const Content* ChatMessagePrivate::getTextContent() const { - loadContentsFromDatabase(); - for (const Content *c : contents) { + for (const Content *c : getContents()) { if (c->getContentType() == ContentType::PlainText) { return c; } @@ -203,8 +201,7 @@ const Content* ChatMessagePrivate::getTextContent() const { } bool ChatMessagePrivate::hasFileTransferContent() const { - loadContentsFromDatabase(); - for (const Content *c : contents) { + for (const Content *c : getContents()) { if (c->getContentType() == ContentType::FileTransfer) { return true; } @@ -213,7 +210,7 @@ bool ChatMessagePrivate::hasFileTransferContent() const { } const Content* ChatMessagePrivate::getFileTransferContent() const { - for (const Content *c : contents) { + for (const Content *c : getContents()) { if (c->getContentType() == ContentType::FileTransfer) { return c; } @@ -230,8 +227,7 @@ void ChatMessagePrivate::setFileTransferFilepath (const string &path) { } const string &ChatMessagePrivate::getAppdata () const { - loadContentsFromDatabase(); - for (const Content *c : contents) { + for (const Content *c : getContents()) { if (c->isFile()) { FileContent *fileContent = (FileContent *)c; return fileContent->getAppData("legacy"); @@ -241,8 +237,7 @@ const string &ChatMessagePrivate::getAppdata () const { } void ChatMessagePrivate::setAppdata (const string &data) { - loadContentsFromDatabase(); - for (const Content *c : contents) { + for (const Content *c : getContents()) { if (c->isFile()) { FileContent *fileContent = (FileContent *)c; fileContent->setAppData("legacy", data); @@ -338,13 +333,13 @@ LinphoneContent *ChatMessagePrivate::getFileTransferInformation () const { if (hasFileTransferContent()) { return getFileTransferContent()->toLinphoneContent(); } - for (const Content *c : contents) { + for (const Content *c : getContents()) { if (c->isFile()) { FileContent *fileContent = (FileContent *)c; return fileContent->toLinphoneContent(); } } - return NULL; + return nullptr; } void ChatMessagePrivate::setFileTransferInformation (const LinphoneContent *c_content) { @@ -356,7 +351,7 @@ void ChatMessagePrivate::setFileTransferInformation (const LinphoneContent *c_co fileContent->setContentType(contentType); fileContent->setFileSize(linphone_content_get_size(c_content)); fileContent->setFileName(linphone_content_get_name(c_content)); - if (linphone_content_get_string_buffer(c_content) != NULL) { + if (linphone_content_get_string_buffer(c_content)) { fileContent->setBody(linphone_content_get_string_buffer(c_content)); } @@ -365,9 +360,8 @@ void ChatMessagePrivate::setFileTransferInformation (const LinphoneContent *c_co bool ChatMessagePrivate::downloadFile () { L_Q(); - loadContentsFromDatabase(); - for (auto &content : contents) + for (auto &content : getContents()) if (content->getContentType() == ContentType::FileTransfer) return q->downloadFile(*static_cast(content)); @@ -961,22 +955,19 @@ bool ChatMessage::isReadOnly () const { const list &ChatMessage::getContents () const { L_D(); - d->loadContentsFromDatabase(); - return d->contents; + return d->getContents(); } void ChatMessage::addContent (Content &content) { L_D(); - if (d->isReadOnly) return; - - d->contents.push_back(&content); + if (!d->isReadOnly) + d->getContents().push_back(&content); } void ChatMessage::removeContent (const Content &content) { L_D(); - if (d->isReadOnly) return; - - d->contents.remove(&const_cast(content)); + if (!d->isReadOnly) + d->getContents().remove(&const_cast(content)); } const Content &ChatMessage::getInternalContent () const { From c0e48a8339e4c513f663d75ddec7ba571dbc0562 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Mon, 26 Feb 2018 13:50:05 +0100 Subject: [PATCH 145/281] feat(MainDb): add a SmartTransaction component to log start/end --- src/CMakeLists.txt | 3 +- ...e-transaction.h => db-exception-handler.h} | 30 ++--- src/db/internal/smart-transaction.h | 55 ++++++++ src/db/main-db.cpp | 117 ++++++++++-------- 4 files changed, 135 insertions(+), 70 deletions(-) rename src/db/internal/{safe-transaction.h => db-exception-handler.h} (79%) create mode 100644 src/db/internal/smart-transaction.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index d6dd47a28..f68cc58d9 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -293,7 +293,8 @@ if (SOCI_FOUND) add_definitions(-DSOCI_ENABLED) list(APPEND LINPHONE_CXX_OBJECTS_PRIVATE_HEADER_FILES - db/internal/safe-transaction.h + db/internal/db-exception-handler.h + db/internal/smart-transaction.h db/internal/statements.h ) diff --git a/src/db/internal/safe-transaction.h b/src/db/internal/db-exception-handler.h similarity index 79% rename from src/db/internal/safe-transaction.h rename to src/db/internal/db-exception-handler.h index 865867110..5e8cdd646 100644 --- a/src/db/internal/safe-transaction.h +++ b/src/db/internal/db-exception-handler.h @@ -1,5 +1,5 @@ /* - * safe-transaction.h + * db-exception-handler.h * Copyright (C) 2010-2018 Belledonne Communications SARL * * This program is free software; you can redistribute it and/or @@ -17,8 +17,8 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#ifndef _L_SAFE_TRANSACTION_H_ -#define _L_SAFE_TRANSACTION_H_ +#ifndef _L_DB_EXCEPTION_HANDLER_H_ +#define _L_DB_EXCEPTION_HANDLER_H_ #include @@ -27,15 +27,15 @@ // ============================================================================= -#define L_SAFE_TRANSACTION_C(CONTEXT) \ - LinphonePrivate::SafeTransactionInfo().set(__func__, CONTEXT) * [&]() +#define L_DB_EXCEPTION_HANDLER_C(CONTEXT) \ + LinphonePrivate::DbExceptionHandlerInfo().set(__func__, CONTEXT) * [&]() -#define L_SAFE_TRANSACTION L_SAFE_TRANSACTION_C(this) +#define L_DB_EXCEPTION_HANDLER L_DB_EXCEPTION_HANDLER_C(this) LINPHONE_BEGIN_NAMESPACE -struct SafeTransactionInfo { - SafeTransactionInfo &set (const char *_name, const MainDb *_mainDb) { +struct DbExceptionHandlerInfo { + DbExceptionHandlerInfo &set (const char *_name, const MainDb *_mainDb) { name = _name; mainDb = const_cast(_mainDb); return *this; @@ -46,7 +46,7 @@ struct SafeTransactionInfo { }; template -class SafeTransaction { +class DbExceptionHandler { using InternalReturnType = typename std::remove_reference()())>::type; public: @@ -56,7 +56,7 @@ public: InternalReturnType >::type; - SafeTransaction (SafeTransactionInfo &info, Function function) : mFunction(std::move(function)) { + DbExceptionHandler (DbExceptionHandlerInfo &info, Function function) : mFunction(std::move(function)) { try { mResult= exec(); } catch (const soci::soci_error &e) { @@ -80,7 +80,7 @@ public: } } - SafeTransaction (SafeTransaction &&safeTransaction) : mFunction(std::move(safeTransaction.mFunction)) {} + DbExceptionHandler (DbExceptionHandler &&dbExceptionHandler) : mFunction(std::move(dbExceptionHandler.mFunction)) {} operator ReturnType () const { return mResult; @@ -128,14 +128,14 @@ private: Function mFunction; ReturnType mResult{}; - L_DISABLE_COPY(SafeTransaction); + L_DISABLE_COPY(DbExceptionHandler); }; template -typename SafeTransaction::ReturnType operator* (SafeTransactionInfo &info, Function &&function) { - return SafeTransaction(info, std::forward(function)); +typename DbExceptionHandler::ReturnType operator* (DbExceptionHandlerInfo &info, Function &&function) { + return DbExceptionHandler(info, std::forward(function)); } LINPHONE_END_NAMESPACE -#endif // ifndef _L_SAFE_TRANSACTION_H_ +#endif // ifndef _L_DB_EXCEPTION_HANDLER_H_ diff --git a/src/db/internal/smart-transaction.h b/src/db/internal/smart-transaction.h new file mode 100644 index 000000000..c76eadbd3 --- /dev/null +++ b/src/db/internal/smart-transaction.h @@ -0,0 +1,55 @@ +/* + * smart-transaction.h + * Copyright (C) 2010-2018 Belledonne Communications SARL + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _L_SMART_TRANSACTION_H_ +#define _L_SMART_TRANSACTION_H_ + +#include + +#include "logger/logger.h" + +// ============================================================================= + +LINPHONE_BEGIN_NAMESPACE + +class SmartTransaction { +public: + SmartTransaction (soci::session *session, const char *name) : mTransaction(*session), mName(name) { + lInfo() << "Start transaction " << this << " in `" << mName << "`."; + } + + ~SmartTransaction () { + lInfo() << "Rollback transaction " << this << " in `" << mName << "`."; + } + + void commit () { + lInfo() << "Commit transaction " << this << " in `" << mName << "`."; + mTransaction.commit(); + } + +private: + soci::transaction mTransaction; + const char *mName; + + L_DISABLE_COPY(SmartTransaction); +}; + +LINPHONE_END_NAMESPACE + +#endif // ifndef _L_SMART_TRANSACTION_H_ diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 584186215..f0f5079a8 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -38,7 +38,8 @@ #include "main-db-p.h" #ifdef SOCI_ENABLED - #include "internal/safe-transaction.h" + #include "internal/db-exception-handler.h" + #include "internal/smart-transaction.h" #include "internal/statements.h" #endif // ifdef SOCI_ENABLED @@ -222,6 +223,14 @@ static constexpr string &blobToString (string &in) { return in; } +// ----------------------------------------------------------------------------- +// Transaction. +// ----------------------------------------------------------------------------- + +class Transaction { + +}; + // ----------------------------------------------------------------------------- // Statements and helpers. // ----------------------------------------------------------------------------- @@ -1191,7 +1200,7 @@ static T getValueFromRow (const soci::row &row, int index, bool &isNull) { void MainDbPrivate::importLegacyFriends (DbSession &inDbSession) { soci::session *inSession = inDbSession.getBackendSession(); - soci::transaction tr(*dbSession.getBackendSession()); + SmartTransaction tr(dbSession.getBackendSession(), __func__); if (getModuleVersion("legacy-friends-import") >= makeVersion(1, 0, 0)) return; @@ -1272,7 +1281,7 @@ void MainDbPrivate::importLegacyFriends (DbSession &inDbSession) { void MainDbPrivate::importLegacyHistory (DbSession &inDbSession) { soci::session *inSession = inDbSession.getBackendSession(); - soci::transaction tr(*dbSession.getBackendSession()); + SmartTransaction tr(dbSession.getBackendSession(), __func__); unsigned int version = getModuleVersion("legacy-history-import"); if (version >= makeVersion(1, 0, 0)) @@ -1771,12 +1780,12 @@ bool MainDb::addEvent (const shared_ptr &eventLog) { return false; } - return L_SAFE_TRANSACTION { + return L_DB_EXCEPTION_HANDLER { L_D(); long long storageId = 0; - soci::transaction tr(*d->dbSession.getBackendSession()); + SmartTransaction tr(d->dbSession.getBackendSession(), __func__); EventLog::Type type = eventLog->getType(); switch (type) { @@ -1835,10 +1844,10 @@ bool MainDb::updateEvent (const shared_ptr &eventLog) { return false; } - return L_SAFE_TRANSACTION { + return L_DB_EXCEPTION_HANDLER { L_D(); - soci::transaction tr(*d->dbSession.getBackendSession()); + SmartTransaction tr(d->dbSession.getBackendSession(), __func__); switch (eventLog->getType()) { case EventLog::Type::None: @@ -1881,7 +1890,7 @@ bool MainDb::deleteEvent (const shared_ptr &eventLog) { MainDb &mainDb = *core->getPrivate()->mainDb.get(); - return L_SAFE_TRANSACTION_C(&mainDb) { + return L_DB_EXCEPTION_HANDLER_C(&mainDb) { soci::session *session = mainDb.getPrivate()->dbSession.getBackendSession(); *session << "DELETE FROM event WHERE id = :id", soci::use(dEventKey->storageId); @@ -1904,7 +1913,7 @@ int MainDb::getEventCount (FilterMask mask) const { "Get events count with mask=" + Utils::toString(mask) + "." ); - return L_SAFE_TRANSACTION { + return L_DB_EXCEPTION_HANDLER { L_D(); int count; @@ -1939,9 +1948,9 @@ shared_ptr MainDb::getEventFromKey (const MainDbKey &dbKey) { " AND chat_room.peer_sip_address_id = peer_sip_address.id" " AND chat_room.local_sip_address_id = local_sip_address.id"; - return L_SAFE_TRANSACTION_C(q.get()) { + return L_DB_EXCEPTION_HANDLER_C(q.get()) { soci::session *session = d->dbSession.getBackendSession(); - soci::transaction tr(*session); + SmartTransaction tr(session, __func__); string peerSipAddress; string localSipAddress; @@ -1976,11 +1985,11 @@ list> MainDb::getConferenceNotifiedEvents ( ", lastNotifyId=" + Utils::toString(lastNotifyId) + ")." ); - return L_SAFE_TRANSACTION { + return L_DB_EXCEPTION_HANDLER { L_D(); soci::session *session = d->dbSession.getBackendSession(); - soci::transaction tr(*session); + SmartTransaction tr(session, __func__); const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId); @@ -2008,7 +2017,7 @@ int MainDb::getChatMessageCount (const ChatRoomId &chatRoomId) const { ", local=" + chatRoomId.getLocalAddress().asString() + ")." ); - return L_SAFE_TRANSACTION { + return L_DB_EXCEPTION_HANDLER { L_D(); int count; @@ -2023,7 +2032,7 @@ int MainDb::getChatMessageCount (const ChatRoomId &chatRoomId) const { " SELECT event_id FROM conference_event WHERE chat_room_id = :chatRoomId" ")"; - soci::transaction tr(*session); + SmartTransaction tr(session, __func__); const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId); *session << query, soci::use(dbChatRoomId), soci::into(count); } @@ -2047,7 +2056,7 @@ int MainDb::getUnreadChatMessageCount (const ChatRoomId &chatRoomId) const { ", local=" + chatRoomId.getLocalAddress().asString() + ")." ); - return L_SAFE_TRANSACTION { + return L_DB_EXCEPTION_HANDLER { L_D(); int count = 0; @@ -2057,7 +2066,7 @@ int MainDb::getUnreadChatMessageCount (const ChatRoomId &chatRoomId) const { if (!chatRoomId.isValid()) *session << query, soci::into(count); else { - soci::transaction tr(*session); + SmartTransaction tr(session, __func__); const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId); *session << query, soci::use(dbChatRoomId), soci::into(count); } @@ -2084,7 +2093,7 @@ void MainDb::markChatMessagesAsRead (const ChatRoomId &chatRoomId) const { ", local=" + chatRoomId.getLocalAddress().asString() + ")." ); - L_SAFE_TRANSACTION { + L_DB_EXCEPTION_HANDLER { L_D(); soci::session *session = d->dbSession.getBackendSession(); @@ -2092,7 +2101,7 @@ void MainDb::markChatMessagesAsRead (const ChatRoomId &chatRoomId) const { if (!chatRoomId.isValid()) *session << query; else { - soci::transaction tr(*session); + SmartTransaction tr(session, __func__); const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId); *session << query, soci::use(dbChatRoomId); tr.commit(); @@ -2117,11 +2126,11 @@ list> MainDb::getUnreadChatMessages (const ChatRoomId &c ", local=" + chatRoomId.getLocalAddress().asString() + ")." ); - return L_SAFE_TRANSACTION { + return L_DB_EXCEPTION_HANDLER { L_D(); soci::session *session = d->dbSession.getBackendSession(); - soci::transaction tr(*session); + SmartTransaction tr(session, __func__); long long dbChatRoomId; if (chatRoomId.isValid()) @@ -2153,7 +2162,7 @@ list> MainDb::getUnreadChatMessages (const ChatRoomId &c } list MainDb::getChatMessageParticipantStates (const shared_ptr &eventLog) const { - return L_SAFE_TRANSACTION { + return L_DB_EXCEPTION_HANDLER { L_D(); soci::session *session = d->dbSession.getBackendSession(); @@ -2180,7 +2189,7 @@ ChatMessage::State MainDb::getChatMessageParticipantState ( const shared_ptr &eventLog, const IdentityAddress &participantAddress ) const { - return L_SAFE_TRANSACTION { + return L_DB_EXCEPTION_HANDLER { L_D(); soci::session *session = d->dbSession.getBackendSession(); @@ -2204,7 +2213,7 @@ void MainDb::setChatMessageParticipantState ( const IdentityAddress &participantAddress, ChatMessage::State state ) { - L_SAFE_TRANSACTION { + L_DB_EXCEPTION_HANDLER { L_D(); soci::session *session = d->dbSession.getBackendSession(); @@ -2245,11 +2254,11 @@ list> MainDb::findChatMessages ( ", local=" + chatRoomId.getLocalAddress().asString() + ")." ); - return L_SAFE_TRANSACTION { + return L_DB_EXCEPTION_HANDLER { L_D(); soci::session *session = d->dbSession.getBackendSession(); - soci::transaction tr(*session); + SmartTransaction tr(session, __func__); list> chatMessages; @@ -2318,11 +2327,11 @@ list> MainDb::getHistoryRange ( ", begin=" + Utils::toString(begin) + ", end=" + Utils::toString(end) + ")." ); - return L_SAFE_TRANSACTION { + return L_DB_EXCEPTION_HANDLER { L_D(); soci::session *session = d->dbSession.getBackendSession(); - soci::transaction tr(*session); + SmartTransaction tr(session, __func__); shared_ptr core = getCore(); shared_ptr chatRoom = core->findChatRoom(chatRoomId); @@ -2383,11 +2392,11 @@ int MainDb::getHistorySize (const ChatRoomId &chatRoomId, FilterMask mask) const ConferenceCallFilter, ConferenceChatMessageFilter, ConferenceInfoFilter, ConferenceInfoNoDeviceFilter }, mask, "AND"); - return L_SAFE_TRANSACTION { + return L_DB_EXCEPTION_HANDLER { L_D(); soci::session *session = d->dbSession.getBackendSession(); - soci::transaction tr(*session); + SmartTransaction tr(session, __func__); int count; const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId); @@ -2398,11 +2407,11 @@ int MainDb::getHistorySize (const ChatRoomId &chatRoomId, FilterMask mask) const } void MainDb::loadChatMessageContents (const shared_ptr &chatMessage) { - L_SAFE_TRANSACTION { + L_DB_EXCEPTION_HANDLER { L_D(); soci::session *session = d->dbSession.getBackendSession(); - soci::transaction tr(*session); + SmartTransaction tr(session, __func__); bool hasFileTransferContent = false; @@ -2474,11 +2483,11 @@ void MainDb::cleanHistory (const ChatRoomId &chatRoomId, FilterMask mask) { ", mask=" + Utils::toString(mask) + ")." ); - L_SAFE_TRANSACTION { + L_DB_EXCEPTION_HANDLER { L_D(); soci::session *session = d->dbSession.getBackendSession(); - soci::transaction tr(*session); + SmartTransaction tr(session, __func__); const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId); @@ -2500,14 +2509,14 @@ list> MainDb::getChatRooms () const { DurationLogger durationLogger("Get chat rooms."); - return L_SAFE_TRANSACTION { + return L_DB_EXCEPTION_HANDLER { L_D(); list> chatRooms; shared_ptr core = getCore(); soci::session *session = d->dbSession.getBackendSession(); - soci::transaction tr(*session); + SmartTransaction tr(session, __func__); soci::rowset rows = (session->prepare << query); for (const auto &row : rows) { @@ -2633,10 +2642,10 @@ void MainDb::insertChatRoom (const shared_ptr &chatRoom) { ", local=" + chatRoomId.getLocalAddress().asString() + ")." ); - L_SAFE_TRANSACTION { + L_DB_EXCEPTION_HANDLER { L_D(); - soci::transaction tr(*d->dbSession.getBackendSession()); + SmartTransaction tr(d->dbSession.getBackendSession(), __func__); d->insertChatRoom(chatRoom); tr.commit(); }; @@ -2648,10 +2657,10 @@ void MainDb::deleteChatRoom (const ChatRoomId &chatRoomId) { ", local=" + chatRoomId.getLocalAddress().asString() + "`)." ); - L_SAFE_TRANSACTION { + L_DB_EXCEPTION_HANDLER { L_D(); soci::session *session = d->dbSession.getBackendSession(); - soci::transaction tr(*session); + SmartTransaction tr(session, __func__); const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId); @@ -2673,13 +2682,13 @@ void MainDb::migrateBasicToClientGroupChatRoom ( L_ASSERT(basicChatRoom->getCapabilities().isSet(ChatRoom::Capabilities::Basic)); L_ASSERT(clientGroupChatRoom->getCapabilities().isSet(ChatRoom::Capabilities::Conference)); - L_SAFE_TRANSACTION { + L_DB_EXCEPTION_HANDLER { L_D(); // TODO: Update events and chat messages. (Or wait signals.) soci::session *session = d->dbSession.getBackendSession(); - soci::transaction tr(*session); + SmartTransaction tr(session, __func__); const long long &dbChatRoomId = d->selectChatRoomId(basicChatRoom->getChatRoomId()); @@ -2726,11 +2735,11 @@ IdentityAddress MainDb::findMissingOneToOneConferenceChatRoomParticipantAddress L_ASSERT(chatRoom->getCapabilities() & ChatRoom::Capabilities::OneToOne); L_ASSERT(chatRoom->getParticipantCount() == 1); - return L_SAFE_TRANSACTION { + return L_DB_EXCEPTION_HANDLER { L_D(); soci::session *session = d->dbSession.getBackendSession(); - soci::transaction tr(*session); + SmartTransaction tr(session, __func__); string missingParticipantAddress; string participantASipAddress; @@ -2760,11 +2769,11 @@ IdentityAddress MainDb::findOneToOneConferenceChatRoomAddress ( const IdentityAddress &participantA, const IdentityAddress &participantB ) const { - return L_SAFE_TRANSACTION { + return L_DB_EXCEPTION_HANDLER { L_D(); soci::session *session = d->dbSession.getBackendSession(); - soci::transaction tr(*session); + SmartTransaction tr(session, __func__); const long long &participantASipAddressId = d->selectSipAddressId(participantA.asString()); const long long &participantBSipAddressId = d->selectSipAddressId(participantB.asString()); @@ -2787,10 +2796,10 @@ void MainDb::insertOneToOneConferenceChatRoom (const shared_ptrgetCore()->getCCore())); L_ASSERT(chatRoom->getCapabilities() & ChatRoom::Capabilities::OneToOne); - L_SAFE_TRANSACTION { + L_DB_EXCEPTION_HANDLER { L_D(); - soci::transaction tr(*d->dbSession.getBackendSession()); + SmartTransaction tr(d->dbSession.getBackendSession(), __func__); const list> &participants = chatRoom->getParticipants(); const long long &participantASipAddressId = d->selectSipAddressId(participants.front()->getAddress().asString()); @@ -2813,11 +2822,11 @@ void MainDb::insertOneToOneConferenceChatRoom (const shared_ptrdbSession.getBackendSession(); - soci::transaction tr(*session); + SmartTransaction tr(session, __func__); const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId); @@ -2839,11 +2848,11 @@ void MainDb::updateChatRoomParticipantDevice ( const shared_ptr &chatRoom, const shared_ptr &device ) { - L_SAFE_TRANSACTION { + L_DB_EXCEPTION_HANDLER { L_D(); soci::session *session = d->dbSession.getBackendSession(); - soci::transaction tr(*session); + SmartTransaction tr(session, __func__); const long long &dbChatRoomId = d->selectChatRoomId(chatRoom->getChatRoomId()); const long long &participantSipAddressId = d->selectSipAddressId(device->getParticipant()->getAddress().asString()); @@ -2872,13 +2881,13 @@ bool MainDb::import (Backend, const string ¶meters) { return false; } - L_SAFE_TRANSACTION { + L_DB_EXCEPTION_HANDLER { // TODO: Remove condition after cpp migration in friends/friends list. if (false) d->importLegacyFriends(inDbSession); }; - L_SAFE_TRANSACTION { + L_DB_EXCEPTION_HANDLER { d->importLegacyHistory(inDbSession); }; From 89a62c4428d845d8627c01aabfc89547a270bace Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Mon, 26 Feb 2018 14:43:43 +0100 Subject: [PATCH 146/281] feat(MainDb): forward transaction in with lambda --- src/CMakeLists.txt | 1 - src/db/internal/db-exception-handler.h | 53 +++++++++++++++++++------ src/db/internal/smart-transaction.h | 55 -------------------------- src/db/main-db.cpp | 26 ------------ src/db/main-db.h | 3 ++ 5 files changed, 43 insertions(+), 95 deletions(-) delete mode 100644 src/db/internal/smart-transaction.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f68cc58d9..cf0c965bb 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -294,7 +294,6 @@ if (SOCI_FOUND) list(APPEND LINPHONE_CXX_OBJECTS_PRIVATE_HEADER_FILES db/internal/db-exception-handler.h - db/internal/smart-transaction.h db/internal/statements.h ) diff --git a/src/db/internal/db-exception-handler.h b/src/db/internal/db-exception-handler.h index 5e8cdd646..b35fbbe7f 100644 --- a/src/db/internal/db-exception-handler.h +++ b/src/db/internal/db-exception-handler.h @@ -22,18 +22,40 @@ #include -#include "db/main-db.h" +#include "db/main-db-p.h" #include "logger/logger.h" // ============================================================================= #define L_DB_EXCEPTION_HANDLER_C(CONTEXT) \ - LinphonePrivate::DbExceptionHandlerInfo().set(__func__, CONTEXT) * [&]() + LinphonePrivate::DbExceptionHandlerInfo().set(__func__, CONTEXT) * [&](SmartTransaction &tr) #define L_DB_EXCEPTION_HANDLER L_DB_EXCEPTION_HANDLER_C(this) LINPHONE_BEGIN_NAMESPACE +class SmartTransaction { +public: + SmartTransaction (soci::session *session, const char *name) : mTransaction(*session), mName(name) { + lInfo() << "Start transaction " << this << " in `" << mName << "`."; + } + + ~SmartTransaction () { + lInfo() << "Rollback transaction " << this << " in `" << mName << "`."; + } + + void commit () { + lInfo() << "Commit transaction " << this << " in `" << mName << "`."; + mTransaction.commit(); + } + +private: + soci::transaction mTransaction; + const char *mName; + + L_DISABLE_COPY(SmartTransaction); +}; + struct DbExceptionHandlerInfo { DbExceptionHandlerInfo &set (const char *_name, const MainDb *_mainDb) { name = _name; @@ -47,7 +69,9 @@ struct DbExceptionHandlerInfo { template class DbExceptionHandler { - using InternalReturnType = typename std::remove_reference()())>::type; + using InternalReturnType = typename std::remove_reference< + decltype(std::declval()(std::declval())) + >::type; public: using ReturnType = typename std::conditional< @@ -57,26 +81,29 @@ public: >::type; DbExceptionHandler (DbExceptionHandlerInfo &info, Function function) : mFunction(std::move(function)) { + const char *name = info.name; try { - mResult= exec(); + SmartTransaction tr(info.mainDb->getPrivate()->dbSession.getBackendSession(), name); + mResult = exec(tr); } catch (const soci::soci_error &e) { - lWarning() << "Catched exception in MainDb::" << info.name << "(" << e.what() << ")."; + lWarning() << "Catched exception in MainDb::" << name << "(" << e.what() << ")."; soci::soci_error::error_category category = e.get_error_category(); if ( (category == soci::soci_error::connection_error || category == soci::soci_error::unknown) && info.mainDb->forceReconnect() ) { try { - mResult = exec(); + SmartTransaction tr(info.mainDb->getPrivate()->dbSession.getBackendSession(), name); + mResult = exec(tr); } catch (const std::exception &e) { - lError() << "Unable to execute query after reconnect in MainDb::" << info.name << "(" << e.what() << ")."; + lError() << "Unable to execute query after reconnect in MainDb::" << name << "(" << e.what() << ")."; } return; } lError() << "Unhandled [" << getErrorCategoryAsString(category) << "] exception in MainDb::" << - info.name << ": `" << e.what() << "`."; + name << ": `" << e.what() << "`."; } catch (const std::exception &e) { - lError() << "Unhandled generic exception in MainDb::" << info.name << ": `" << e.what() << "`."; + lError() << "Unhandled generic exception in MainDb::" << name << ": `" << e.what() << "`."; } } @@ -89,15 +116,15 @@ public: private: // Exec function with no return type. template - typename std::enable_if::value, bool>::type exec () const { - mFunction(); + typename std::enable_if::value, bool>::type exec (SmartTransaction &tr) const { + mFunction(tr); return true; } // Exec function with return type. template - typename std::enable_if::value, T>::type exec () const { - return mFunction(); + typename std::enable_if::value, T>::type exec (SmartTransaction &tr) const { + return mFunction(tr); } static const char *getErrorCategoryAsString (soci::soci_error::error_category category) { diff --git a/src/db/internal/smart-transaction.h b/src/db/internal/smart-transaction.h deleted file mode 100644 index c76eadbd3..000000000 --- a/src/db/internal/smart-transaction.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * smart-transaction.h - * Copyright (C) 2010-2018 Belledonne Communications SARL - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef _L_SMART_TRANSACTION_H_ -#define _L_SMART_TRANSACTION_H_ - -#include - -#include "logger/logger.h" - -// ============================================================================= - -LINPHONE_BEGIN_NAMESPACE - -class SmartTransaction { -public: - SmartTransaction (soci::session *session, const char *name) : mTransaction(*session), mName(name) { - lInfo() << "Start transaction " << this << " in `" << mName << "`."; - } - - ~SmartTransaction () { - lInfo() << "Rollback transaction " << this << " in `" << mName << "`."; - } - - void commit () { - lInfo() << "Commit transaction " << this << " in `" << mName << "`."; - mTransaction.commit(); - } - -private: - soci::transaction mTransaction; - const char *mName; - - L_DISABLE_COPY(SmartTransaction); -}; - -LINPHONE_END_NAMESPACE - -#endif // ifndef _L_SMART_TRANSACTION_H_ diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index f0f5079a8..6c25becad 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -39,7 +39,6 @@ #ifdef SOCI_ENABLED #include "internal/db-exception-handler.h" - #include "internal/smart-transaction.h" #include "internal/statements.h" #endif // ifdef SOCI_ENABLED @@ -1785,8 +1784,6 @@ bool MainDb::addEvent (const shared_ptr &eventLog) { long long storageId = 0; - SmartTransaction tr(d->dbSession.getBackendSession(), __func__); - EventLog::Type type = eventLog->getType(); switch (type) { case EventLog::Type::None: @@ -1847,8 +1844,6 @@ bool MainDb::updateEvent (const shared_ptr &eventLog) { return L_DB_EXCEPTION_HANDLER { L_D(); - SmartTransaction tr(d->dbSession.getBackendSession(), __func__); - switch (eventLog->getType()) { case EventLog::Type::None: return false; @@ -1950,7 +1945,6 @@ shared_ptr MainDb::getEventFromKey (const MainDbKey &dbKey) { return L_DB_EXCEPTION_HANDLER_C(q.get()) { soci::session *session = d->dbSession.getBackendSession(); - SmartTransaction tr(session, __func__); string peerSipAddress; string localSipAddress; @@ -1989,7 +1983,6 @@ list> MainDb::getConferenceNotifiedEvents ( L_D(); soci::session *session = d->dbSession.getBackendSession(); - SmartTransaction tr(session, __func__); const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId); @@ -2032,7 +2025,6 @@ int MainDb::getChatMessageCount (const ChatRoomId &chatRoomId) const { " SELECT event_id FROM conference_event WHERE chat_room_id = :chatRoomId" ")"; - SmartTransaction tr(session, __func__); const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId); *session << query, soci::use(dbChatRoomId), soci::into(count); } @@ -2066,7 +2058,6 @@ int MainDb::getUnreadChatMessageCount (const ChatRoomId &chatRoomId) const { if (!chatRoomId.isValid()) *session << query, soci::into(count); else { - SmartTransaction tr(session, __func__); const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId); *session << query, soci::use(dbChatRoomId), soci::into(count); } @@ -2101,7 +2092,6 @@ void MainDb::markChatMessagesAsRead (const ChatRoomId &chatRoomId) const { if (!chatRoomId.isValid()) *session << query; else { - SmartTransaction tr(session, __func__); const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId); *session << query, soci::use(dbChatRoomId); tr.commit(); @@ -2130,7 +2120,6 @@ list> MainDb::getUnreadChatMessages (const ChatRoomId &c L_D(); soci::session *session = d->dbSession.getBackendSession(); - SmartTransaction tr(session, __func__); long long dbChatRoomId; if (chatRoomId.isValid()) @@ -2258,7 +2247,6 @@ list> MainDb::findChatMessages ( L_D(); soci::session *session = d->dbSession.getBackendSession(); - SmartTransaction tr(session, __func__); list> chatMessages; @@ -2331,7 +2319,6 @@ list> MainDb::getHistoryRange ( L_D(); soci::session *session = d->dbSession.getBackendSession(); - SmartTransaction tr(session, __func__); shared_ptr core = getCore(); shared_ptr chatRoom = core->findChatRoom(chatRoomId); @@ -2396,7 +2383,6 @@ int MainDb::getHistorySize (const ChatRoomId &chatRoomId, FilterMask mask) const L_D(); soci::session *session = d->dbSession.getBackendSession(); - SmartTransaction tr(session, __func__); int count; const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId); @@ -2411,7 +2397,6 @@ void MainDb::loadChatMessageContents (const shared_ptr &chatMessage L_D(); soci::session *session = d->dbSession.getBackendSession(); - SmartTransaction tr(session, __func__); bool hasFileTransferContent = false; @@ -2487,7 +2472,6 @@ void MainDb::cleanHistory (const ChatRoomId &chatRoomId, FilterMask mask) { L_D(); soci::session *session = d->dbSession.getBackendSession(); - SmartTransaction tr(session, __func__); const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId); @@ -2516,7 +2500,6 @@ list> MainDb::getChatRooms () const { shared_ptr core = getCore(); soci::session *session = d->dbSession.getBackendSession(); - SmartTransaction tr(session, __func__); soci::rowset rows = (session->prepare << query); for (const auto &row : rows) { @@ -2645,7 +2628,6 @@ void MainDb::insertChatRoom (const shared_ptr &chatRoom) { L_DB_EXCEPTION_HANDLER { L_D(); - SmartTransaction tr(d->dbSession.getBackendSession(), __func__); d->insertChatRoom(chatRoom); tr.commit(); }; @@ -2660,7 +2642,6 @@ void MainDb::deleteChatRoom (const ChatRoomId &chatRoomId) { L_DB_EXCEPTION_HANDLER { L_D(); soci::session *session = d->dbSession.getBackendSession(); - SmartTransaction tr(session, __func__); const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId); @@ -2688,7 +2669,6 @@ void MainDb::migrateBasicToClientGroupChatRoom ( // TODO: Update events and chat messages. (Or wait signals.) soci::session *session = d->dbSession.getBackendSession(); - SmartTransaction tr(session, __func__); const long long &dbChatRoomId = d->selectChatRoomId(basicChatRoom->getChatRoomId()); @@ -2739,7 +2719,6 @@ IdentityAddress MainDb::findMissingOneToOneConferenceChatRoomParticipantAddress L_D(); soci::session *session = d->dbSession.getBackendSession(); - SmartTransaction tr(session, __func__); string missingParticipantAddress; string participantASipAddress; @@ -2773,7 +2752,6 @@ IdentityAddress MainDb::findOneToOneConferenceChatRoomAddress ( L_D(); soci::session *session = d->dbSession.getBackendSession(); - SmartTransaction tr(session, __func__); const long long &participantASipAddressId = d->selectSipAddressId(participantA.asString()); const long long &participantBSipAddressId = d->selectSipAddressId(participantB.asString()); @@ -2799,8 +2777,6 @@ void MainDb::insertOneToOneConferenceChatRoom (const shared_ptrdbSession.getBackendSession(), __func__); - const list> &participants = chatRoom->getParticipants(); const long long &participantASipAddressId = d->selectSipAddressId(participants.front()->getAddress().asString()); const long long &participantBSipAddressId = d->selectSipAddressId(participants.back()->getAddress().asString()); @@ -2826,7 +2802,6 @@ void MainDb::enableChatRoomMigration (const ChatRoomId &chatRoomId, bool enable) L_D(); soci::session *session = d->dbSession.getBackendSession(); - SmartTransaction tr(session, __func__); const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId); @@ -2852,7 +2827,6 @@ void MainDb::updateChatRoomParticipantDevice ( L_D(); soci::session *session = d->dbSession.getBackendSession(); - SmartTransaction tr(session, __func__); const long long &dbChatRoomId = d->selectChatRoomId(chatRoom->getChatRoomId()); const long long &participantSipAddressId = d->selectSipAddressId(device->getParticipant()->getAddress().asString()); diff --git a/src/db/main-db.h b/src/db/main-db.h index bace3edec..14e7294c9 100644 --- a/src/db/main-db.h +++ b/src/db/main-db.h @@ -42,6 +42,9 @@ class MainDbPrivate; class ParticipantDevice; class MainDb : public AbstractDb, public CoreAccessor { + template + friend class DbExceptionHandler; + friend class MainDbChatMessageKey; friend class MainDbEventKey; From 8129b19ffca152016f96b5c1d544379629967cf4 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Mon, 26 Feb 2018 15:10:22 +0100 Subject: [PATCH 147/281] feat(MainDb): use last update time on insert chat room --- src/db/main-db.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 6c25becad..e1a21b48e 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -392,7 +392,7 @@ long long MainDbPrivate::insertChatRoom (const shared_ptr &cha *session << "INSERT INTO chat_room (" " peer_sip_address_id, local_sip_address_id, creation_time, last_update_time, capabilities, subject, flags" ") VALUES (:peerSipAddressId, :localSipAddressId, :creationTime, :lastUpdateTime, :capabilities, :subject, :flags)", - soci::use(peerSipAddressId), soci::use(localSipAddressId), soci::use(creationTime), soci::use(creationTime), + soci::use(peerSipAddressId), soci::use(localSipAddressId), soci::use(creationTime), soci::use(lastUpdateTime), soci::use(capabilities), soci::use(subject), soci::use(flags); id = dbSession.getLastInsertId(); From 86493a151c0d8af59140675a548dec0a87554491 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Mon, 26 Feb 2018 15:41:47 +0100 Subject: [PATCH 148/281] feat(MainDb): avoid usage of explicit transactions --- src/db/main-db.cpp | 86 +++++++++++++++++----------------------------- 1 file changed, 31 insertions(+), 55 deletions(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index e1a21b48e..82d0a38bb 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -222,14 +222,6 @@ static constexpr string &blobToString (string &in) { return in; } -// ----------------------------------------------------------------------------- -// Transaction. -// ----------------------------------------------------------------------------- - -class Transaction { - -}; - // ----------------------------------------------------------------------------- // Statements and helpers. // ----------------------------------------------------------------------------- @@ -384,6 +376,7 @@ long long MainDbPrivate::insertChatRoom (const shared_ptr &cha ", local=" << localSipAddressId << ")."; const tm &creationTime = Utils::getTimeTAsTm(chatRoom->getCreationTime()); + const tm &lastUpdateTime = Utils::getTimeTAsTm(chatRoom->getLastUpdateTime()); // Remove capabilities like `Proxy`. const int &capabilities = chatRoom->getCapabilities() & ~ChatRoom::CapabilitiesMask(ChatRoom::Capabilities::Proxy); @@ -1198,21 +1191,21 @@ static T getValueFromRow (const soci::row &row, int index, bool &isNull) { // ----------------------------------------------------------------------------- void MainDbPrivate::importLegacyFriends (DbSession &inDbSession) { - soci::session *inSession = inDbSession.getBackendSession(); - SmartTransaction tr(dbSession.getBackendSession(), __func__); + L_Q(); + L_DB_EXCEPTION_HANDLER_C(q) { + if (getModuleVersion("legacy-friends-import") >= makeVersion(1, 0, 0)) + return; + updateModuleVersion("legacy-friends-import", ModuleVersionLegacyFriendsImport); - if (getModuleVersion("legacy-friends-import") >= makeVersion(1, 0, 0)) - return; - updateModuleVersion("legacy-friends-import", ModuleVersionLegacyFriendsImport); + soci::session *inSession = inDbSession.getBackendSession(); + if (!checkLegacyFriendsTableExists(*inSession)) + return; - if (!checkLegacyFriendsTableExists(*inSession)) - return; + unordered_map resolvedListsIds; + soci::session *session = dbSession.getBackendSession(); - unordered_map resolvedListsIds; - soci::session *session = dbSession.getBackendSession(); + soci::rowset friendsLists = (inSession->prepare << "SELECT * FROM friends_lists"); - soci::rowset friendsLists = (inSession->prepare << "SELECT * FROM friends_lists"); - try { set names; for (const auto &friendList : friendsLists) { const string &name = friendList.get(LegacyFriendListColName, ""); @@ -1229,13 +1222,8 @@ void MainDbPrivate::importLegacyFriends (DbSession &inDbSession) { ")", soci::use(uniqueName), soci::use(rlsUri), soci::use(syncUri), soci::use(revision); resolvedListsIds[friendList.get(LegacyFriendListColId)] = dbSession.getLastInsertId(); } - } catch (const exception &e) { - lWarning() << "Failed to import legacy friends list: " << e.what() << "."; - return; - } - soci::rowset friends = (inSession->prepare << "SELECT * FROM friends"); - try { + soci::rowset friends = (inSession->prepare << "SELECT * FROM friends"); for (const auto &friendInfo : friends) { long long friendsListId; { @@ -1270,28 +1258,24 @@ void MainDbPrivate::importLegacyFriends (DbSession &inDbSession) { soci::use(dbSession.getLastInsertId()), soci::use(data); } tr.commit(); - } catch (const exception &e) { - lWarning() << "Failed to import legacy friends: " << e.what() << "."; - return; - } - - lInfo() << "Successful import of legacy friends."; + lInfo() << "Successful import of legacy friends."; + }; } void MainDbPrivate::importLegacyHistory (DbSession &inDbSession) { - soci::session *inSession = inDbSession.getBackendSession(); - SmartTransaction tr(dbSession.getBackendSession(), __func__); + L_Q(); + L_DB_EXCEPTION_HANDLER_C(q) { - unsigned int version = getModuleVersion("legacy-history-import"); - if (version >= makeVersion(1, 0, 0)) - return; - updateModuleVersion("legacy-history-import", ModuleVersionLegacyHistoryImport); + unsigned int version = getModuleVersion("legacy-history-import"); + if (version >= makeVersion(1, 0, 0)) + return; + updateModuleVersion("legacy-history-import", ModuleVersionLegacyHistoryImport); - if (!checkLegacyHistoryTableExists(*inSession)) - return; + soci::session *inSession = inDbSession.getBackendSession(); + if (!checkLegacyHistoryTableExists(*inSession)) + return; - soci::rowset messages = (inSession->prepare << "SELECT * FROM history"); - try { + soci::rowset messages = (inSession->prepare << "SELECT * FROM history"); for (const auto &message : messages) { const int direction = message.get(LegacyMessageColDirection); if (direction != 0 && direction != 1) { @@ -1388,12 +1372,8 @@ void MainDbPrivate::importLegacyHistory (DbSession &inDbSession) { } tr.commit(); - } catch (const exception &e) { - lInfo() << "Failed to import legacy messages: " << e.what() << "."; - return; - } - - lInfo() << "Successful import of legacy messages."; + lInfo() << "Successful import of legacy messages."; + }; } // ----------------------------------------------------------------------------- @@ -2855,15 +2835,11 @@ bool MainDb::import (Backend, const string ¶meters) { return false; } - L_DB_EXCEPTION_HANDLER { - // TODO: Remove condition after cpp migration in friends/friends list. - if (false) - d->importLegacyFriends(inDbSession); - }; + // TODO: Remove condition after cpp migration in friends/friends list. + if (false) + d->importLegacyFriends(inDbSession); - L_DB_EXCEPTION_HANDLER { - d->importLegacyHistory(inDbSession); - }; + d->importLegacyHistory(inDbSession); return true; } From 9c16f13ac3385513f543520e41b3b7cd1b0df87b Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Mon, 26 Feb 2018 15:53:32 +0100 Subject: [PATCH 149/281] feat(SmartTransaction): explicit class name in log --- src/db/internal/db-exception-handler.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/db/internal/db-exception-handler.h b/src/db/internal/db-exception-handler.h index b35fbbe7f..5590f4478 100644 --- a/src/db/internal/db-exception-handler.h +++ b/src/db/internal/db-exception-handler.h @@ -37,15 +37,15 @@ LINPHONE_BEGIN_NAMESPACE class SmartTransaction { public: SmartTransaction (soci::session *session, const char *name) : mTransaction(*session), mName(name) { - lInfo() << "Start transaction " << this << " in `" << mName << "`."; + lInfo() << "Start transaction " << this << " in MainDb::" << mName << "."; } ~SmartTransaction () { - lInfo() << "Rollback transaction " << this << " in `" << mName << "`."; + lInfo() << "Rollback transaction " << this << " in MainDb::" << mName << "."; } void commit () { - lInfo() << "Commit transaction " << this << " in `" << mName << "`."; + lInfo() << "Commit transaction " << this << " in MainDb::" << mName << "."; mTransaction.commit(); } From 753cb798b59af4629a9efa5a1c7dc593ef2dcc19 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 26 Feb 2018 16:50:26 +0100 Subject: [PATCH 150/281] Fixed compil --- include/linphone/utils/static-string.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/linphone/utils/static-string.h b/include/linphone/utils/static-string.h index 222095ce7..ae65f6668 100644 --- a/include/linphone/utils/static-string.h +++ b/include/linphone/utils/static-string.h @@ -113,11 +113,11 @@ namespace Private { private: template= 0, int>::type* = nullptr> constexpr StaticIntStringHelper (const IndexSequence &) : - raw{ ('0' + Value / pow10(N - Index - 2) % 10 )..., '\0' } {} + raw{ char('0' + Value / pow10(N - Index - 2) % 10 )..., '\0' } {} template::type* = nullptr> constexpr StaticIntStringHelper (const IndexSequence &) : - raw{ '-', ('0' + abs(Value) / pow10(N - Index - 3) % 10 )..., '\0' } {} + raw{ '-', char('0' + abs(Value) / pow10(N - Index - 3) % 10 )..., '\0' } {} }; }; From 247c2877a832c84de0d1af547dd5350b2bddf9f3 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 26 Feb 2018 16:53:33 +0100 Subject: [PATCH 151/281] Copy callbacks list before iterating over it and calling each callbacks so we can remove a callback inside a callback call --- src/c-wrapper/api/c-chat-room.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/c-wrapper/api/c-chat-room.cpp b/src/c-wrapper/api/c-chat-room.cpp index a8ae7b5df..12a989a58 100644 --- a/src/c-wrapper/api/c-chat-room.cpp +++ b/src/c-wrapper/api/c-chat-room.cpp @@ -430,12 +430,14 @@ const bctbx_list_t *linphone_chat_room_get_callbacks_list(const LinphoneChatRoom LinphoneChatRoomCbs ## cbName ## Cb cb = linphone_chat_room_cbs_get_ ## functionName (cr->cbs); \ if (cb) \ cb(__VA_ARGS__); \ - for (bctbx_list_t *it = cr->callbacks; it; it = bctbx_list_next(it)) { \ + bctbx_list_t *callbacks_copy = bctbx_list_copy(cr->callbacks); \ + for (bctbx_list_t *it = callbacks_copy; it; it = bctbx_list_next(it)) { \ cr->currentCbs = reinterpret_cast(bctbx_list_get_data(it)); \ cb = linphone_chat_room_cbs_get_ ## functionName (cr->currentCbs); \ if (cb) \ cb(__VA_ARGS__); \ - } + } \ + bctbx_free(callbacks_copy); void linphone_chat_room_notify_is_composing_received(LinphoneChatRoom *cr, const LinphoneAddress *remoteAddr, bool_t isComposing) { NOTIFY_IF_EXIST(IsComposingReceived, is_composing_received, cr, remoteAddr, isComposing) From 5542d4e0f0112294d6784367c9920d9bfaedb779 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Mon, 26 Feb 2018 17:07:42 +0100 Subject: [PATCH 152/281] fix(SmartTransaction): do not log rollback if transaction is committed --- src/db/internal/db-exception-handler.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/db/internal/db-exception-handler.h b/src/db/internal/db-exception-handler.h index 5590f4478..e3787a52a 100644 --- a/src/db/internal/db-exception-handler.h +++ b/src/db/internal/db-exception-handler.h @@ -36,15 +36,18 @@ LINPHONE_BEGIN_NAMESPACE class SmartTransaction { public: - SmartTransaction (soci::session *session, const char *name) : mTransaction(*session), mName(name) { + SmartTransaction (soci::session *session, const char *name) : + mTransaction(*session), mName(name), mIsCommitted(false) { lInfo() << "Start transaction " << this << " in MainDb::" << mName << "."; } ~SmartTransaction () { - lInfo() << "Rollback transaction " << this << " in MainDb::" << mName << "."; + if (!mIsCommitted) + lInfo() << "Rollback transaction " << this << " in MainDb::" << mName << "."; } void commit () { + mIsCommitted = true; lInfo() << "Commit transaction " << this << " in MainDb::" << mName << "."; mTransaction.commit(); } @@ -52,6 +55,7 @@ public: private: soci::transaction mTransaction; const char *mName; + bool mIsCommitted; L_DISABLE_COPY(SmartTransaction); }; From 1d46c117399f26b2d66e7d317b50e65d6c11e27c Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Mon, 26 Feb 2018 17:17:56 +0100 Subject: [PATCH 153/281] fix(SmartTransaction): log commit only after soci commit --- src/db/internal/db-exception-handler.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/db/internal/db-exception-handler.h b/src/db/internal/db-exception-handler.h index e3787a52a..f62ce0e60 100644 --- a/src/db/internal/db-exception-handler.h +++ b/src/db/internal/db-exception-handler.h @@ -47,9 +47,9 @@ public: } void commit () { + mTransaction.commit(); mIsCommitted = true; lInfo() << "Commit transaction " << this << " in MainDb::" << mName << "."; - mTransaction.commit(); } private: From 729a9f5cfb6157a1c14be6e25bb949d7c90bc730 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 27 Feb 2018 10:56:35 +0100 Subject: [PATCH 154/281] fix(DbExceptionHandler): use r-value reference on function --- src/db/internal/db-exception-handler.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/db/internal/db-exception-handler.h b/src/db/internal/db-exception-handler.h index f62ce0e60..a0135c6d6 100644 --- a/src/db/internal/db-exception-handler.h +++ b/src/db/internal/db-exception-handler.h @@ -84,7 +84,7 @@ public: InternalReturnType >::type; - DbExceptionHandler (DbExceptionHandlerInfo &info, Function function) : mFunction(std::move(function)) { + DbExceptionHandler (DbExceptionHandlerInfo &info, Function &&function) : mFunction(std::move(function)) { const char *name = info.name; try { SmartTransaction tr(info.mainDb->getPrivate()->dbSession.getBackendSession(), name); From 223b1244e7d737b93a8d57747a545dad22838ee9 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 27 Feb 2018 10:57:04 +0100 Subject: [PATCH 155/281] fix(setChatMessageParticipantState): use commit on setChatMessageParticipantState --- src/db/main-db.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 82d0a38bb..0017b2530 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -2196,6 +2196,8 @@ void MainDb::setChatMessageParticipantState ( *session << "UPDATE chat_message_participant SET state = :state" " WHERE event_id = :eventId AND participant_sip_address_id = :participantSipAddressId", soci::use(stateInt), soci::use(eventId), soci::use(participantSipAddressId); + + tr.commit(); }; } From e3cf0be408573885c2b444631c076a97eca11e77 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 27 Feb 2018 11:02:06 +0100 Subject: [PATCH 156/281] fix(MainDb): use commit on deleteEvent --- src/db/main-db.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 0017b2530..7acd2a09c 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -1370,7 +1370,6 @@ void MainDbPrivate::importLegacyHistory (DbSession &inDbSession) { if (state != int(ChatMessage::State::Displayed)) insertChatMessageParticipant(eventId, remoteSipAddressId, state); } - tr.commit(); lInfo() << "Successful import of legacy messages."; }; @@ -1876,6 +1875,8 @@ bool MainDb::deleteEvent (const shared_ptr &eventLog) { eventLog )->getChatMessage()->getPrivate()->dbKey = MainDbChatMessageKey(); + tr.commit(); + return true; }; } From 79da08fec1b4d8f17bf3cdef0659d6dfe22a2d14 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 27 Feb 2018 11:10:58 +0100 Subject: [PATCH 157/281] fix(MainDb): commit on markChatMessagesAsRead --- src/db/main-db.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 7acd2a09c..a86b8eccd 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -1867,6 +1867,7 @@ bool MainDb::deleteEvent (const shared_ptr &eventLog) { return L_DB_EXCEPTION_HANDLER_C(&mainDb) { soci::session *session = mainDb.getPrivate()->dbSession.getBackendSession(); *session << "DELETE FROM event WHERE id = :id", soci::use(dEventKey->storageId); + tr.commit(); dEventLog->dbKey = MainDbEventKey(); @@ -1875,8 +1876,6 @@ bool MainDb::deleteEvent (const shared_ptr &eventLog) { eventLog )->getChatMessage()->getPrivate()->dbKey = MainDbChatMessageKey(); - tr.commit(); - return true; }; } @@ -2075,8 +2074,8 @@ void MainDb::markChatMessagesAsRead (const ChatRoomId &chatRoomId) const { else { const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId); *session << query, soci::use(dbChatRoomId); - tr.commit(); } + tr.commit(); }; } From 0f551221831b84231617173ca5028ede9c7cd8f1 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 27 Feb 2018 13:43:21 +0100 Subject: [PATCH 158/281] Fix group chat testers broken because of multiple chat room listeners + fix is-composing count in group chat testers + deactivate instable group chat testers for the moment. --- coreapi/factory.c | 2 +- coreapi/private_functions.h | 37 +++++++------ include/linphone/api/c-chat-room.h | 8 --- src/c-wrapper/api/c-chat-room-cbs.cpp | 2 +- src/c-wrapper/api/c-chat-room.cpp | 52 ++++++++----------- src/chat/chat-message/chat-message.cpp | 7 +-- src/chat/chat-room/chat-room.cpp | 14 ++--- src/chat/chat-room/client-group-chat-room.cpp | 12 ++--- src/chat/chat-room/proxy-chat-room-p.h | 1 - src/chat/chat-room/proxy-chat-room.cpp | 7 ++- tester/group_chat_tester.c | 22 ++++---- 11 files changed, 74 insertions(+), 90 deletions(-) diff --git a/coreapi/factory.c b/coreapi/factory.c index 0bc33bb19..1c52181ea 100644 --- a/coreapi/factory.c +++ b/coreapi/factory.c @@ -239,7 +239,7 @@ LinphoneCallCbs * linphone_factory_create_call_cbs(const LinphoneFactory *factor } LinphoneChatRoomCbs * linphone_factory_create_chat_room_cbs(const LinphoneFactory *factory) { - return linphone_chat_room_cbs_new(); + return _linphone_chat_room_cbs_new(); } LinphoneVcard *linphone_factory_create_vcard(LinphoneFactory *factory) { diff --git a/coreapi/private_functions.h b/coreapi/private_functions.h index 42152a736..6ecc2f094 100644 --- a/coreapi/private_functions.h +++ b/coreapi/private_functions.h @@ -48,23 +48,6 @@ void linphone_call_notify_stats_updated(LinphoneCall *call, const LinphoneCallSt void linphone_call_notify_info_message_received(LinphoneCall *call, const LinphoneInfoMessage *msg); void linphone_call_notify_ack_processing(LinphoneCall *call, LinphoneHeaders *msg, bool_t is_received); -void linphone_chat_room_notify_is_composing_received(LinphoneChatRoom *cr, const LinphoneAddress *remoteAddr, bool_t isComposing); -void linphone_chat_room_notify_message_received(LinphoneChatRoom *cr, LinphoneChatMessage *msg); -void linphone_chat_room_notify_participant_added(LinphoneChatRoom *cr, const LinphoneEventLog *event_log); -void linphone_chat_room_notify_participant_removed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log); -void linphone_chat_room_notify_participant_device_added(LinphoneChatRoom *cr, const LinphoneEventLog *event_log); -void linphone_chat_room_notify_participant_device_removed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log); -void linphone_chat_room_notify_participant_admin_status_changed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log); -void linphone_chat_room_notify_state_changed(LinphoneChatRoom *cr, LinphoneChatRoomState newState); -void linphone_chat_room_notify_subject_changed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log); -void linphone_chat_room_notify_undecryptable_message_received(LinphoneChatRoom *cr, LinphoneChatMessage *msg); -void linphone_chat_room_notify_chat_message_received(LinphoneChatRoom *cr, const LinphoneEventLog *event_log); -void linphone_chat_room_notify_chat_message_sent(LinphoneChatRoom *cr, const LinphoneEventLog *event_log); -void linphone_chat_room_notify_conference_address_generation(LinphoneChatRoom *cr); -void linphone_chat_room_notify_participant_device_fetched(LinphoneChatRoom *cr, const LinphoneAddress *participantAddr); -void linphone_chat_room_notify_participants_capabilities_checked(LinphoneChatRoom *cr, const LinphoneAddress *deviceAddr, const bctbx_list_t *participantsAddr); -void linphone_chat_room_notify_chat_message_should_be_stored(LinphoneChatRoom *cr, LinphoneChatMessage *msg); - LinphoneCall * linphone_call_new_outgoing(struct _LinphoneCore *lc, const LinphoneAddress *from, const LinphoneAddress *to, const LinphoneCallParams *params, LinphoneProxyConfig *cfg); LinphoneCall * linphone_call_new_incoming(struct _LinphoneCore *lc, const LinphoneAddress *from, const LinphoneAddress *to, LinphonePrivate::SalCallOp *op); LinphoneCallLog * linphone_call_log_new(LinphoneCallDir dir, LinphoneAddress *from, LinphoneAddress * to); @@ -295,8 +278,24 @@ void _linphone_proxy_config_release_ops(LinphoneProxyConfig *obj); LinphoneChatRoom *_linphone_client_group_chat_room_new (LinphoneCore *core, const char *uri, const char *subject, bool_t fallback); LinphoneChatRoom *_linphone_server_group_chat_room_new (LinphoneCore *core, LinphonePrivate::SalCallOp *op); void linphone_chat_room_set_call(LinphoneChatRoom *cr, LinphoneCall *call); -LinphoneChatRoomCbs * linphone_chat_room_cbs_new (void); -/**/ +LinphoneChatRoomCbs * _linphone_chat_room_cbs_new (void); +void _linphone_chat_room_notify_is_composing_received(LinphoneChatRoom *cr, const LinphoneAddress *remoteAddr, bool_t isComposing); +void _linphone_chat_room_notify_message_received(LinphoneChatRoom *cr, LinphoneChatMessage *msg); +void _linphone_chat_room_notify_participant_added(LinphoneChatRoom *cr, const LinphoneEventLog *event_log); +void _linphone_chat_room_notify_participant_removed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log); +void _linphone_chat_room_notify_participant_device_added(LinphoneChatRoom *cr, const LinphoneEventLog *event_log); +void _linphone_chat_room_notify_participant_device_removed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log); +void _linphone_chat_room_notify_participant_admin_status_changed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log); +void _linphone_chat_room_notify_state_changed(LinphoneChatRoom *cr, LinphoneChatRoomState newState); +void _linphone_chat_room_notify_subject_changed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log); +void _linphone_chat_room_notify_undecryptable_message_received(LinphoneChatRoom *cr, LinphoneChatMessage *msg); +void _linphone_chat_room_notify_chat_message_received(LinphoneChatRoom *cr, const LinphoneEventLog *event_log); +void _linphone_chat_room_notify_chat_message_sent(LinphoneChatRoom *cr, const LinphoneEventLog *event_log); +void _linphone_chat_room_notify_conference_address_generation(LinphoneChatRoom *cr); +void _linphone_chat_room_notify_participant_device_fetched(LinphoneChatRoom *cr, const LinphoneAddress *participantAddr); +void _linphone_chat_room_notify_participants_capabilities_checked(LinphoneChatRoom *cr, const LinphoneAddress *deviceAddr, const bctbx_list_t *participantsAddr); +void _linphone_chat_room_notify_chat_message_should_be_stored(LinphoneChatRoom *cr, LinphoneChatMessage *msg); +void _linphone_chat_room_clear_callbacks (LinphoneChatRoom *cr); LinphoneToneDescription * linphone_tone_description_new(LinphoneReason reason, LinphoneToneID id, const char *audiofile); void linphone_tone_description_destroy(LinphoneToneDescription *obj); diff --git a/include/linphone/api/c-chat-room.h b/include/linphone/api/c-chat-room.h index 5e55a85a3..2175d0f06 100644 --- a/include/linphone/api/c-chat-room.h +++ b/include/linphone/api/c-chat-room.h @@ -300,14 +300,6 @@ LINPHONE_PUBLIC void linphone_chat_room_remove_callbacks(LinphoneChatRoom *cr, L */ LINPHONE_PUBLIC LinphoneChatRoomCbs *linphone_chat_room_get_current_callbacks(const LinphoneChatRoom *cr); -/** - * Get the LinphoneChatRoomCbs object associated with the LinphoneChatRoom. - * @param[in] cr LinphoneChatRoom object - * @return The LinphoneChatRoomCbs object associated with the LinphoneChatRoom - * @deprecated, use linphone_chat_room_add_callbacks instead - */ -LINPHONE_PUBLIC LinphoneChatRoomCbs * linphone_chat_room_get_callbacks (const LinphoneChatRoom *cr); - /** * Get the state of the chat room. * @param[in] cr LinphoneChatRoom object diff --git a/src/c-wrapper/api/c-chat-room-cbs.cpp b/src/c-wrapper/api/c-chat-room-cbs.cpp index cce0b165a..518c5b8bd 100644 --- a/src/c-wrapper/api/c-chat-room-cbs.cpp +++ b/src/c-wrapper/api/c-chat-room-cbs.cpp @@ -57,7 +57,7 @@ BELLE_SIP_INSTANCIATE_VPTR(LinphoneChatRoomCbs, belle_sip_object_t, // ============================================================================= -LinphoneChatRoomCbs * linphone_chat_room_cbs_new (void) { +LinphoneChatRoomCbs * _linphone_chat_room_cbs_new (void) { return belle_sip_object_new(LinphoneChatRoomCbs); } diff --git a/src/c-wrapper/api/c-chat-room.cpp b/src/c-wrapper/api/c-chat-room.cpp index 12a989a58..2f1b935e7 100644 --- a/src/c-wrapper/api/c-chat-room.cpp +++ b/src/c-wrapper/api/c-chat-room.cpp @@ -48,7 +48,6 @@ static void _linphone_chat_room_destructor (LinphoneChatRoom *cr); L_DECLARE_C_OBJECT_IMPL_WITH_XTORS( ChatRoom, _linphone_chat_room_constructor, _linphone_chat_room_destructor, - LinphoneChatRoomCbs *cbs; bctbx_list_t *callbacks; /* A list of LinphoneCallCbs object */ LinphoneChatRoomCbs *currentCbs; /* The current LinphoneCallCbs object used to call a callback */ mutable LinphoneAddress *conferenceAddressCache; @@ -57,12 +56,9 @@ L_DECLARE_C_OBJECT_IMPL_WITH_XTORS( mutable bctbx_list_t *composingAddresses; ) -static void _linphone_chat_room_constructor (LinphoneChatRoom *cr) { - cr->cbs = linphone_chat_room_cbs_new(); -} +static void _linphone_chat_room_constructor (LinphoneChatRoom *cr) {} static void _linphone_chat_room_destructor (LinphoneChatRoom *cr) { - linphone_chat_room_cbs_unref(cr->cbs); if (cr->conferenceAddressCache) linphone_address_unref(cr->conferenceAddressCache); if (cr->peerAddressCache) @@ -71,7 +67,7 @@ static void _linphone_chat_room_destructor (LinphoneChatRoom *cr) { linphone_address_unref(cr->localAddressCache); if (cr->composingAddresses) bctbx_list_free_with_data(cr->composingAddresses, (bctbx_list_free_func)linphone_address_unref); - bctbx_list_free_with_data(cr->callbacks, (bctbx_list_free_func)linphone_chat_room_cbs_unref); + _linphone_chat_room_clear_callbacks(cr); } static list _get_identity_address_list_from_address_list(list addressList) { @@ -405,8 +401,9 @@ void linphone_chat_room_add_compatible_participants (LinphoneChatRoom *cr, const // Callbacks // ============================================================================= -LinphoneChatRoomCbs *linphone_chat_room_get_callbacks (const LinphoneChatRoom *cr) { - return cr->cbs; +void _linphone_chat_room_clear_callbacks (LinphoneChatRoom *cr) { + bctbx_list_free_with_data(cr->callbacks, (bctbx_list_free_func)linphone_chat_room_cbs_unref); + cr->callbacks = nullptr; } void linphone_chat_room_add_callbacks (LinphoneChatRoom *cr, LinphoneChatRoomCbs *cbs) { @@ -427,79 +424,76 @@ const bctbx_list_t *linphone_chat_room_get_callbacks_list(const LinphoneChatRoom } #define NOTIFY_IF_EXIST(cbName, functionName, ...) \ - LinphoneChatRoomCbs ## cbName ## Cb cb = linphone_chat_room_cbs_get_ ## functionName (cr->cbs); \ - if (cb) \ - cb(__VA_ARGS__); \ bctbx_list_t *callbacks_copy = bctbx_list_copy(cr->callbacks); \ for (bctbx_list_t *it = callbacks_copy; it; it = bctbx_list_next(it)) { \ cr->currentCbs = reinterpret_cast(bctbx_list_get_data(it)); \ - cb = linphone_chat_room_cbs_get_ ## functionName (cr->currentCbs); \ + LinphoneChatRoomCbs ## cbName ## Cb cb = linphone_chat_room_cbs_get_ ## functionName (cr->currentCbs); \ if (cb) \ cb(__VA_ARGS__); \ } \ bctbx_free(callbacks_copy); -void linphone_chat_room_notify_is_composing_received(LinphoneChatRoom *cr, const LinphoneAddress *remoteAddr, bool_t isComposing) { +void _linphone_chat_room_notify_is_composing_received(LinphoneChatRoom *cr, const LinphoneAddress *remoteAddr, bool_t isComposing) { NOTIFY_IF_EXIST(IsComposingReceived, is_composing_received, cr, remoteAddr, isComposing) } -void linphone_chat_room_notify_message_received(LinphoneChatRoom *cr, LinphoneChatMessage *msg) { +void _linphone_chat_room_notify_message_received(LinphoneChatRoom *cr, LinphoneChatMessage *msg) { NOTIFY_IF_EXIST(MessageReceived, message_received, cr, msg) } -void linphone_chat_room_notify_participant_added(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { +void _linphone_chat_room_notify_participant_added(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { NOTIFY_IF_EXIST(ParticipantAdded, participant_added, cr, event_log) } -void linphone_chat_room_notify_participant_removed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { +void _linphone_chat_room_notify_participant_removed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { NOTIFY_IF_EXIST(ParticipantRemoved, participant_removed, cr, event_log) } -void linphone_chat_room_notify_participant_device_added(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { +void _linphone_chat_room_notify_participant_device_added(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { NOTIFY_IF_EXIST(ParticipantDeviceAdded, participant_device_added, cr, event_log) } -void linphone_chat_room_notify_participant_device_removed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { +void _linphone_chat_room_notify_participant_device_removed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { NOTIFY_IF_EXIST(ParticipantDeviceRemoved, participant_device_removed, cr, event_log) } -void linphone_chat_room_notify_participant_admin_status_changed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { +void _linphone_chat_room_notify_participant_admin_status_changed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { NOTIFY_IF_EXIST(ParticipantAdminStatusChanged, participant_admin_status_changed, cr, event_log) } -void linphone_chat_room_notify_state_changed(LinphoneChatRoom *cr, LinphoneChatRoomState newState) { +void _linphone_chat_room_notify_state_changed(LinphoneChatRoom *cr, LinphoneChatRoomState newState) { NOTIFY_IF_EXIST(StateChanged, state_changed, cr, newState) } -void linphone_chat_room_notify_subject_changed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { +void _linphone_chat_room_notify_subject_changed(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { NOTIFY_IF_EXIST(SubjectChanged, subject_changed, cr, event_log) } -void linphone_chat_room_notify_undecryptable_message_received(LinphoneChatRoom *cr, LinphoneChatMessage *msg) { +void _linphone_chat_room_notify_undecryptable_message_received(LinphoneChatRoom *cr, LinphoneChatMessage *msg) { NOTIFY_IF_EXIST(UndecryptableMessageReceived, undecryptable_message_received, cr, msg) } -void linphone_chat_room_notify_chat_message_received(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { +void _linphone_chat_room_notify_chat_message_received(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { NOTIFY_IF_EXIST(ChatMessageReceived, chat_message_received, cr, event_log) } -void linphone_chat_room_notify_chat_message_sent(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { +void _linphone_chat_room_notify_chat_message_sent(LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { NOTIFY_IF_EXIST(ChatMessageSent, chat_message_sent, cr, event_log) } -void linphone_chat_room_notify_conference_address_generation(LinphoneChatRoom *cr) { +void _linphone_chat_room_notify_conference_address_generation(LinphoneChatRoom *cr) { NOTIFY_IF_EXIST(ConferenceAddressGeneration, conference_address_generation, cr) } -void linphone_chat_room_notify_participant_device_fetched(LinphoneChatRoom *cr, const LinphoneAddress *participantAddr) { +void _linphone_chat_room_notify_participant_device_fetched(LinphoneChatRoom *cr, const LinphoneAddress *participantAddr) { NOTIFY_IF_EXIST(ParticipantDeviceFetched, participant_device_fetched, cr, participantAddr) } -void linphone_chat_room_notify_participants_capabilities_checked(LinphoneChatRoom *cr, const LinphoneAddress *deviceAddr, const bctbx_list_t *participantsAddr) { +void _linphone_chat_room_notify_participants_capabilities_checked(LinphoneChatRoom *cr, const LinphoneAddress *deviceAddr, const bctbx_list_t *participantsAddr) { NOTIFY_IF_EXIST(ParticipantsCapabilitiesChecked, participants_capabilities_checked, cr, deviceAddr, participantsAddr) } -void linphone_chat_room_notify_chat_message_should_be_stored(LinphoneChatRoom *cr, LinphoneChatMessage *msg) { +void _linphone_chat_room_notify_chat_message_should_be_stored(LinphoneChatRoom *cr, LinphoneChatMessage *msg) { NOTIFY_IF_EXIST(ShouldChatMessageBeStored, chat_message_should_be_stored, cr, msg) } @@ -557,7 +551,7 @@ LinphoneChatRoom *_linphone_client_group_chat_room_new (LinphoneCore *core, cons L_GET_PRIVATE(cgcr)->setChatRoomListener(L_GET_PRIVATE_FROM_C_OBJECT(cr)); } else L_SET_CPP_PTR_FROM_C_OBJECT(cr, cgcr); - L_GET_PRIVATE(cgcr)->setState(LinphonePrivate::ChatRoom::State::Instantiated); + L_GET_PRIVATE_FROM_C_OBJECT(cr)->setState(LinphonePrivate::ChatRoom::State::Instantiated); return cr; } diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index 1e3bf9e8d..0d64995be 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -84,6 +84,8 @@ void ChatMessagePrivate::setParticipantState (const IdentityAddress &participant if (!validStateTransition(currentState, newState)) return; + lInfo() << "Chat message " << this << ": moving participant '" << participantAddress.asString() << "' state to " + << Utils::toString(newState); mainDb->setChatMessageParticipantState(eventLog, participantAddress, newState); list states = mainDb->getChatMessageParticipantStates(eventLog); @@ -443,15 +445,14 @@ void ChatMessagePrivate::notifyReceiving () { LinphoneChatRoom *chatRoom = L_GET_C_BACK_PTR(q->getChatRoom()); if ((getContentType() != ContentType::Imdn) && (getContentType() != ContentType::ImIsComposing)) { - linphone_chat_room_notify_chat_message_should_be_stored(chatRoom, L_GET_C_BACK_PTR(q->getSharedFromThis())); - + _linphone_chat_room_notify_chat_message_should_be_stored(chatRoom, L_GET_C_BACK_PTR(q->getSharedFromThis())); if (toBeStored) storeInDb(); } shared_ptr event = make_shared( ::time(nullptr), q->getSharedFromThis() ); - linphone_chat_room_notify_chat_message_received(chatRoom, L_GET_C_BACK_PTR(event)); + _linphone_chat_room_notify_chat_message_received(chatRoom, L_GET_C_BACK_PTR(event)); // Legacy q->getChatRoom()->getPrivate()->notifyChatMessageReceived(q->getSharedFromThis()); diff --git a/src/chat/chat-room/chat-room.cpp b/src/chat/chat-room/chat-room.cpp index 601d9219d..dc5e378f5 100644 --- a/src/chat/chat-room/chat-room.cpp +++ b/src/chat/chat-room/chat-room.cpp @@ -59,7 +59,7 @@ void ChatRoomPrivate::sendChatMessage (const shared_ptr &chatMessag if (!event) event = make_shared(time(nullptr), chatMessage); - linphone_chat_room_notify_chat_message_sent(cr, L_GET_C_BACK_PTR(event)); + _linphone_chat_room_notify_chat_message_sent(cr, L_GET_C_BACK_PTR(event)); } if (isComposing) @@ -134,7 +134,7 @@ void ChatRoomPrivate::notifyChatMessageReceived (const shared_ptr & ); linphone_address_unref(fromAddress); } - linphone_chat_room_notify_message_received(cr, L_GET_C_BACK_PTR(chatMessage)); + _linphone_chat_room_notify_message_received(cr, L_GET_C_BACK_PTR(chatMessage)); linphone_core_notify_message_received(q->getCore()->getCCore(), cr, L_GET_C_BACK_PTR(chatMessage)); } @@ -148,7 +148,7 @@ void ChatRoomPrivate::notifyIsComposingReceived (const Address &remoteAddress, b LinphoneChatRoom *cr = L_GET_C_BACK_PTR(q); LinphoneAddress *lAddr = linphone_address_new(remoteAddress.asString().c_str()); - linphone_chat_room_notify_is_composing_received(cr, lAddr, !!isComposing); + _linphone_chat_room_notify_is_composing_received(cr, lAddr, !!isComposing); linphone_address_unref(lAddr); // Legacy notification linphone_core_notify_is_composing_received(q->getCore()->getCCore(), cr); @@ -158,13 +158,13 @@ void ChatRoomPrivate::notifyStateChanged () { L_Q(); linphone_core_notify_chat_room_state_changed(q->getCore()->getCCore(), L_GET_C_BACK_PTR(q), (LinphoneChatRoomState)state); LinphoneChatRoom *cr = L_GET_C_BACK_PTR(q); - linphone_chat_room_notify_state_changed(cr, (LinphoneChatRoomState)state); + _linphone_chat_room_notify_state_changed(cr, (LinphoneChatRoomState)state); } void ChatRoomPrivate::notifyUndecryptableChatMessageReceived (const shared_ptr &chatMessage) { L_Q(); LinphoneChatRoom *cr = L_GET_C_BACK_PTR(q); - linphone_chat_room_notify_undecryptable_message_received(cr, L_GET_C_BACK_PTR(chatMessage)); + _linphone_chat_room_notify_undecryptable_message_received(cr, L_GET_C_BACK_PTR(chatMessage)); linphone_core_notify_message_received_unable_decrypt(q->getCore()->getCCore(), cr, L_GET_C_BACK_PTR(chatMessage)); } @@ -418,8 +418,10 @@ void ChatRoom::markAsRead () { L_D(); CorePrivate *dCore = getCore()->getPrivate(); - for (auto &chatMessage : dCore->mainDb->getUnreadChatMessages(d->chatRoomId)) + for (auto &chatMessage : dCore->mainDb->getUnreadChatMessages(d->chatRoomId)) { chatMessage->sendDisplayNotification(); + chatMessage->getPrivate()->setState(ChatMessage::State::Displayed, true); + } dCore->mainDb->markChatMessagesAsRead(d->chatRoomId); } diff --git a/src/chat/chat-room/client-group-chat-room.cpp b/src/chat/chat-room/client-group-chat-room.cpp index 257a9861c..a3de641a3 100644 --- a/src/chat/chat-room/client-group-chat-room.cpp +++ b/src/chat/chat-room/client-group-chat-room.cpp @@ -513,7 +513,7 @@ void ClientGroupChatRoom::onParticipantAdded (const shared_ptraddEvent(event); LinphoneChatRoom *cr = L_GET_C_BACK_PTR(this); - linphone_chat_room_notify_participant_added(cr, L_GET_C_BACK_PTR(event)); + _linphone_chat_room_notify_participant_added(cr, L_GET_C_BACK_PTR(event)); } void ClientGroupChatRoom::onParticipantRemoved (const shared_ptr &event, bool isFullState) { @@ -533,7 +533,7 @@ void ClientGroupChatRoom::onParticipantRemoved (const shared_ptraddEvent(event); LinphoneChatRoom *cr = L_GET_C_BACK_PTR(this); - linphone_chat_room_notify_participant_removed(cr, L_GET_C_BACK_PTR(event)); + _linphone_chat_room_notify_participant_removed(cr, L_GET_C_BACK_PTR(event)); } void ClientGroupChatRoom::onParticipantSetAdmin (const shared_ptr &event, bool isFullState) { @@ -561,7 +561,7 @@ void ClientGroupChatRoom::onParticipantSetAdmin (const shared_ptraddEvent(event); LinphoneChatRoom *cr = L_GET_C_BACK_PTR(this); - linphone_chat_room_notify_participant_admin_status_changed(cr, L_GET_C_BACK_PTR(event)); + _linphone_chat_room_notify_participant_admin_status_changed(cr, L_GET_C_BACK_PTR(event)); } void ClientGroupChatRoom::onSubjectChanged (const shared_ptr &event, bool isFullState) { @@ -577,7 +577,7 @@ void ClientGroupChatRoom::onSubjectChanged (const shared_ptraddEvent(event); LinphoneChatRoom *cr = L_GET_C_BACK_PTR(this); - linphone_chat_room_notify_subject_changed(cr, L_GET_C_BACK_PTR(event)); + _linphone_chat_room_notify_subject_changed(cr, L_GET_C_BACK_PTR(event)); } void ClientGroupChatRoom::onParticipantDeviceAdded (const shared_ptr &event, bool isFullState) { @@ -601,7 +601,7 @@ void ClientGroupChatRoom::onParticipantDeviceAdded (const shared_ptraddEvent(event); LinphoneChatRoom *cr = L_GET_C_BACK_PTR(this); - linphone_chat_room_notify_participant_device_added(cr, L_GET_C_BACK_PTR(event)); + _linphone_chat_room_notify_participant_device_added(cr, L_GET_C_BACK_PTR(event)); } void ClientGroupChatRoom::onParticipantDeviceRemoved (const shared_ptr &event, bool isFullState) { @@ -623,7 +623,7 @@ void ClientGroupChatRoom::onParticipantDeviceRemoved (const shared_ptraddEvent(event); LinphoneChatRoom *cr = L_GET_C_BACK_PTR(this); - linphone_chat_room_notify_participant_device_removed(cr, L_GET_C_BACK_PTR(event)); + _linphone_chat_room_notify_participant_device_removed(cr, L_GET_C_BACK_PTR(event)); } LINPHONE_END_NAMESPACE diff --git a/src/chat/chat-room/proxy-chat-room-p.h b/src/chat/chat-room/proxy-chat-room-p.h index ea8a4b741..89fb81e21 100644 --- a/src/chat/chat-room/proxy-chat-room-p.h +++ b/src/chat/chat-room/proxy-chat-room-p.h @@ -77,7 +77,6 @@ public: void teardownCallbacks (); std::shared_ptr chatRoom; - LinphoneChatRoomCbs *callbacks; L_DECLARE_PUBLIC(ProxyChatRoom); }; diff --git a/src/chat/chat-room/proxy-chat-room.cpp b/src/chat/chat-room/proxy-chat-room.cpp index f761f2def..a81847e10 100644 --- a/src/chat/chat-room/proxy-chat-room.cpp +++ b/src/chat/chat-room/proxy-chat-room.cpp @@ -32,7 +32,7 @@ LINPHONE_BEGIN_NAMESPACE LinphoneChatRoomCbs *proxiedCbs = linphone_chat_room_get_current_callbacks(cr); \ ProxyChatRoom *pcr = static_cast(linphone_chat_room_cbs_get_user_data(proxiedCbs)); \ LinphoneChatRoom *lcr = L_GET_C_BACK_PTR(pcr->getSharedFromThis()); \ - linphone_chat_room_notify_ ## callback(lcr, ##__VA_ARGS__) + _linphone_chat_room_notify_ ## callback(lcr, ##__VA_ARGS__) static void chatMessageReceived (LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { PROXY_CALLBACK(chat_message_received, event_log); @@ -97,8 +97,7 @@ static void undecryptableMessageReceived (LinphoneChatRoom *cr, LinphoneChatMess void ProxyChatRoomPrivate::setupCallbacks () { L_Q(); LinphoneChatRoom *lcr = L_GET_C_BACK_PTR(chatRoom); - LinphoneChatRoomCbs *cbs = linphone_chat_room_cbs_new(); - callbacks = cbs; + LinphoneChatRoomCbs *cbs = linphone_factory_create_chat_room_cbs(linphone_factory_get()); linphone_chat_room_cbs_set_user_data(cbs, q); linphone_chat_room_cbs_set_chat_message_received(cbs, chatMessageReceived); linphone_chat_room_cbs_set_chat_message_sent(cbs, chatMessageSent); @@ -120,7 +119,7 @@ void ProxyChatRoomPrivate::setupCallbacks () { void ProxyChatRoomPrivate::teardownCallbacks () { LinphoneChatRoom *lcr = L_GET_C_BACK_PTR(chatRoom); - linphone_chat_room_remove_callbacks(lcr, callbacks); + _linphone_chat_room_clear_callbacks(lcr); } // ----------------------------------------------------------------------------- diff --git a/tester/group_chat_tester.c b/tester/group_chat_tester.c index a89060899..bffccc84b 100644 --- a/tester/group_chat_tester.c +++ b/tester/group_chat_tester.c @@ -107,7 +107,7 @@ static void chat_room_subject_changed (LinphoneChatRoom *cr, const LinphoneEvent static void core_chat_room_state_changed (LinphoneCore *core, LinphoneChatRoom *cr, LinphoneChatRoomState state) { if (state == LinphoneChatRoomStateInstantiated) { - LinphoneChatRoomCbs *cbs = linphone_chat_room_get_callbacks(cr); + LinphoneChatRoomCbs *cbs = linphone_factory_create_chat_room_cbs(linphone_factory_get()); linphone_chat_room_cbs_set_is_composing_received(cbs, chat_room_is_composing_received); linphone_chat_room_cbs_set_participant_added(cbs, chat_room_participant_added); linphone_chat_room_cbs_set_participant_admin_status_changed(cbs, chat_room_participant_admin_status_changed); @@ -115,6 +115,7 @@ static void core_chat_room_state_changed (LinphoneCore *core, LinphoneChatRoom * linphone_chat_room_cbs_set_state_changed(cbs, chat_room_state_changed); linphone_chat_room_cbs_set_subject_changed(cbs, chat_room_subject_changed); linphone_chat_room_cbs_set_participant_device_added(cbs, chat_room_participant_device_added); + linphone_chat_room_add_callbacks(cr, cbs); } } @@ -142,16 +143,9 @@ static void _configure_core_for_conference (LinphoneCoreManager *lcm, LinphoneAd configure_core_for_conference(lcm->lc, NULL, factoryAddr, FALSE); } -static void legacy_is_composing_received(LinphoneCore *lc, LinphoneChatRoom *room) { - ms_message("Legacy is composing function on core [%p] for chatroom [%p]",lc , room); -} static void _configure_core_for_callbacks(LinphoneCoreManager *lcm, LinphoneCoreCbs *cbs) { - bctbx_list_t *it; - for (it = linphone_core_get_callbacks_list(lcm->lc);it!=NULL;it=it->next) { - if (linphone_core_cbs_get_is_composing_received((LinphoneCoreCbs*)it->data)) - linphone_core_cbs_set_is_composing_received((LinphoneCoreCbs*)it->data, legacy_is_composing_received); - } - + // Remove is-composing callback from the core, we use our own on the chat room + linphone_core_cbs_set_is_composing_received(lcm->cbs, NULL); linphone_core_add_callbacks(lcm->lc, cbs); linphone_core_set_user_data(lcm->lc, lcm); } @@ -471,6 +465,7 @@ static void group_chat_room_creation_server (void) { linphone_core_manager_destroy(chloe); } +#if 0 static void group_chat_room_add_participant (void) { LinphoneCoreManager *marie = linphone_core_manager_create("marie_rc"); LinphoneCoreManager *pauline = linphone_core_manager_create("pauline_rc"); @@ -583,6 +578,7 @@ static void group_chat_room_add_participant (void) { linphone_core_manager_destroy(laure); linphone_core_manager_destroy(chloe); } +#endif static int im_encryption_engine_process_incoming_message_cb(LinphoneImEncryptionEngine *engine, LinphoneChatRoom *room, LinphoneChatMessage *msg) { if (linphone_chat_message_get_content_type(msg)) { @@ -1592,6 +1588,7 @@ static void group_chat_room_reinvited_after_removed_while_offline_2 (void) { group_chat_room_reinvited_after_removed_base(TRUE, TRUE); } +#if 0 static void group_chat_room_reinvited_after_removed_with_several_devices (void) { LinphoneCoreManager *marie1 = linphone_core_manager_create("marie_rc"); LinphoneCoreManager *marie2 = linphone_core_manager_create("marie_rc"); @@ -1680,6 +1677,7 @@ static void group_chat_room_reinvited_after_removed_with_several_devices (void) linphone_core_manager_destroy(pauline2); linphone_core_manager_destroy(laure); } +#endif static void group_chat_room_notify_after_disconnection (void) { LinphoneCoreManager *marie = linphone_core_manager_create("marie_rc"); @@ -2983,7 +2981,7 @@ end: test_t group_chat_tests[] = { TEST_TWO_TAGS("Group chat room creation server", group_chat_room_creation_server, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Add participant", group_chat_room_add_participant, "Server", "LeaksMemory"), + //TEST_TWO_TAGS("Add participant", group_chat_room_add_participant, "Server", "LeaksMemory"), TEST_TWO_TAGS("Send message", group_chat_room_send_message, "Server", "LeaksMemory"), TEST_TWO_TAGS("Send encrypted message", group_chat_room_send_message_encrypted, "Server", "LeaksMemory"), TEST_TWO_TAGS("Send invite on a multi register account", group_chat_room_invite_multi_register_account, "Server", "LeaksMemory"), @@ -3003,7 +3001,7 @@ test_t group_chat_tests[] = { TEST_TWO_TAGS("Reinvited after removed from group chat room", group_chat_room_reinvited_after_removed, "Server", "LeaksMemory"), TEST_TWO_TAGS("Reinvited after removed from group chat room while offline", group_chat_room_reinvited_after_removed_while_offline, "Server", "LeaksMemory"), TEST_TWO_TAGS("Reinvited after removed from group chat room while offline 2", group_chat_room_reinvited_after_removed_while_offline_2, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Reinvited after removed from group chat room with several devices", group_chat_room_reinvited_after_removed_with_several_devices, "Server", "LeaksMemory"), + //TEST_TWO_TAGS("Reinvited after removed from group chat room with several devices", group_chat_room_reinvited_after_removed_with_several_devices, "Server", "LeaksMemory"), TEST_TWO_TAGS("Notify after disconnection", group_chat_room_notify_after_disconnection, "Server", "LeaksMemory"), TEST_TWO_TAGS("Send refer to all participants devices", group_chat_room_send_refer_to_all_devices, "Server", "LeaksMemory"), // TODO: Use when we support adding a new device in created conf From 9ea10688efdab858c3952c437dddce56269663d4 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 27 Feb 2018 14:22:03 +0100 Subject: [PATCH 159/281] feat(AbstractDb): deal with sqlite3 logs on Android and Ios --- src/db/abstract/abstract-db.cpp | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/src/db/abstract/abstract-db.cpp b/src/db/abstract/abstract-db.cpp index 54d63ceb1..79b94aaae 100644 --- a/src/db/abstract/abstract-db.cpp +++ b/src/db/abstract/abstract-db.cpp @@ -21,6 +21,10 @@ #include #endif // ifdef __APPLE__ +#if defined(SOCI_ENABLED) && (TARGET_OS_IPHONE || defined(__ANDROID__)) + #include +#endif // if defined(SOCI_ENABLED) && (TARGET_OS_IPHONE || defined(__ANDROID__)) + #include "abstract-db-p.h" #include "logger/logger.h" @@ -30,19 +34,29 @@ using namespace std; LINPHONE_BEGIN_NAMESPACE -AbstractDb::AbstractDb (AbstractDbPrivate &p) : Object(p) {} - -// Force static sqlite3 linking for IOS and Android. #if defined(SOCI_ENABLED) && (TARGET_OS_IPHONE || defined(__ANDROID__)) + // Force static sqlite3 linking for IOS and Android. extern "C" void register_factory_sqlite3(); + + static void sqlite3Log (void *, int iErrCode, const char *zMsg) { + lInfo() << "[sqlite3][" << iErrCode << "]" << zMsg; + } #endif // if defined(SOCI_ENABLED) && (TARGET_OS_IPHONE || defined(__ANDROID__)) +AbstractDb::AbstractDb (AbstractDbPrivate &p) : Object(p) {} + bool AbstractDb::connect (Backend backend, const string ¶meters) { L_D(); #if defined(SOCI_ENABLED) && (TARGET_OS_IPHONE || defined(__ANDROID__)) - if (backend == Sqlite3) - register_factory_sqlite3(); + if (backend == Sqlite3) { + static bool registered = false; + if (!registered) { + registered = true; + register_factory_sqlite3(); + sqlite3_config(SQLITE_CONFIG_LOG, sqlite3Log, nullptr); + } + } #endif // if defined(SOCI_ENABLED) && (TARGET_OS_IPHONE || defined(__ANDROID__)) d->backend = backend; From 3f16a7196005ed49c4e2743be678360d8992c0f1 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 27 Feb 2018 16:08:42 +0100 Subject: [PATCH 160/281] feat(MainDb): - Allow only move constructor/assignment operator on DbSession - Check thread id of AbstractDb in transaction - Fix a copy session in MainDb::init --- src/CMakeLists.txt | 2 +- src/db/abstract/abstract-db-p.h | 4 +++ src/db/internal/db-exception-handler.h | 11 ++++-- src/db/main-db.cpp | 8 ++--- src/db/session/db-session-p.h | 47 -------------------------- src/db/session/db-session.cpp | 32 +++++++++++++++--- src/db/session/db-session.h | 9 +++-- 7 files changed, 51 insertions(+), 62 deletions(-) delete mode 100644 src/db/session/db-session-p.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index cf0c965bb..fec6c0eda 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -112,7 +112,7 @@ set(LINPHONE_CXX_OBJECTS_PRIVATE_HEADER_FILES db/main-db-key.h db/main-db-p.h db/main-db.h - db/session/db-session-p.h + db/session/db-session.h dial-plan/dial-plan-p.h dial-plan/dial-plan.h enums.h diff --git a/src/db/abstract/abstract-db-p.h b/src/db/abstract/abstract-db-p.h index fa2d12c3f..b74a82157 100644 --- a/src/db/abstract/abstract-db-p.h +++ b/src/db/abstract/abstract-db-p.h @@ -20,6 +20,8 @@ #ifndef _L_ABSTRACT_DB_P_H_ #define _L_ABSTRACT_DB_P_H_ +#include + #include "abstract-db.h" #include "db/session/db-session.h" #include "object/object-p.h" @@ -34,6 +36,8 @@ public: DbSession dbSession; + const std::thread::id threadId = std::this_thread::get_id(); + private: AbstractDb::Backend backend; diff --git a/src/db/internal/db-exception-handler.h b/src/db/internal/db-exception-handler.h index a0135c6d6..2993c58e0 100644 --- a/src/db/internal/db-exception-handler.h +++ b/src/db/internal/db-exception-handler.h @@ -85,19 +85,24 @@ public: >::type; DbExceptionHandler (DbExceptionHandlerInfo &info, Function &&function) : mFunction(std::move(function)) { + MainDb *mainDb = info.mainDb; + L_ASSERT(mainDb->getPrivate()->threadId == std::this_thread::get_id()); + const char *name = info.name; + soci::session *session = mainDb->getPrivate()->dbSession.getBackendSession(); + try { - SmartTransaction tr(info.mainDb->getPrivate()->dbSession.getBackendSession(), name); + SmartTransaction tr(session, name); mResult = exec(tr); } catch (const soci::soci_error &e) { lWarning() << "Catched exception in MainDb::" << name << "(" << e.what() << ")."; soci::soci_error::error_category category = e.get_error_category(); if ( (category == soci::soci_error::connection_error || category == soci::soci_error::unknown) && - info.mainDb->forceReconnect() + mainDb->forceReconnect() ) { try { - SmartTransaction tr(info.mainDb->getPrivate()->dbSession.getBackendSession(), name); + SmartTransaction tr(session, name); mResult = exec(tr); } catch (const std::exception &e) { lError() << "Unable to execute query after reconnect in MainDb::" << name << "(" << e.what() << ")."; diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index a86b8eccd..5e7aa74c2 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -1386,10 +1386,10 @@ void MainDb::init () { soci::session *session = d->dbSession.getBackendSession(); using namespace placeholders; - auto primaryKeyRefStr = bind(&DbSession::primaryKeyRefStr, d->dbSession, _1); - auto primaryKeyStr = bind(&DbSession::primaryKeyStr, d->dbSession, _1); - auto timestampType = bind(&DbSession::timestampType, d->dbSession); - auto varcharPrimaryKeyStr = bind(&DbSession::varcharPrimaryKeyStr, d->dbSession, _1); + auto primaryKeyRefStr = bind(&DbSession::primaryKeyRefStr, &d->dbSession, _1); + auto primaryKeyStr = bind(&DbSession::primaryKeyStr, &d->dbSession, _1); + auto timestampType = bind(&DbSession::timestampType, &d->dbSession); + auto varcharPrimaryKeyStr = bind(&DbSession::varcharPrimaryKeyStr, &d->dbSession, _1); auto createTableSanitizer = [](const char *statement) { // TODO. diff --git a/src/db/session/db-session-p.h b/src/db/session/db-session-p.h deleted file mode 100644 index aae12db9c..000000000 --- a/src/db/session/db-session-p.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * db-session-p.h - * Copyright (C) 2010-2018 Belledonne Communications SARL - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -#ifndef _L_DB_SESSION_P_H_ -#define _L_DB_SESSION_P_H_ - -#include "db-session.h" -#include "object/clonable-object-p.h" - -// ============================================================================= - -LINPHONE_BEGIN_NAMESPACE - -class DbSessionPrivate : public ClonableObjectPrivate { -private: - enum class Backend { - None, - Mysql, - Sqlite3 - } backend = Backend::None; - - #ifdef SOCI_ENABLED - std::unique_ptr backendSession; - #endif // ifdef SOCI_ENABLED - - L_DECLARE_PUBLIC(DbSession); -}; - -LINPHONE_END_NAMESPACE - -#endif // ifndef _L_DB_SESSION_P_H_ diff --git a/src/db/session/db-session.cpp b/src/db/session/db-session.cpp index 7e4f141d1..b38550e35 100644 --- a/src/db/session/db-session.cpp +++ b/src/db/session/db-session.cpp @@ -19,7 +19,7 @@ #include "linphone/utils/utils.h" -#include "db-session-p.h" +#include "db-session.h" #include "logger/logger.h" // ============================================================================= @@ -28,7 +28,20 @@ using namespace std; LINPHONE_BEGIN_NAMESPACE -DbSession::DbSession () : ClonableObject(*new DbSessionPrivate) {} +class DbSessionPrivate { +public: + enum class Backend { + None, + Mysql, + Sqlite3 + } backend = Backend::None; + + #ifdef SOCI_ENABLED + std::unique_ptr backendSession; + #endif // ifdef SOCI_ENABLED +}; + +DbSession::DbSession () : mPrivate(new DbSessionPrivate) {} DbSession::DbSession (const string &uri) : DbSession() { #ifdef SOCI_ENABLED @@ -44,13 +57,24 @@ DbSession::DbSession (const string &uri) : DbSession() { #endif // ifdef SOCI_ENABLED } +DbSession::DbSession (DbSession &&other) : mPrivate(other.mPrivate) { + other.mPrivate = nullptr; +} + +DbSession::~DbSession () { + delete mPrivate; +} + +DbSession &DbSession::operator= (DbSession &&other) { + std::swap(mPrivate, other.mPrivate); + return *this; +} + DbSession::operator bool () const { L_D(); return d->backend != DbSessionPrivate::Backend::None; } -L_USE_DEFAULT_CLONABLE_OBJECT_SHARED_IMPL(DbSession); - soci::session *DbSession::getBackendSession () const { #ifdef SOCI_ENABLED L_D(); diff --git a/src/db/session/db-session.h b/src/db/session/db-session.h index a94fa7abb..6d4bf7b1c 100644 --- a/src/db/session/db-session.h +++ b/src/db/session/db-session.h @@ -39,15 +39,16 @@ LINPHONE_BEGIN_NAMESPACE class DbSessionPrivate; -class DbSession : public ClonableObject { +class DbSession { friend class DbSessionProvider; public: DbSession (); explicit DbSession (const std::string &uri); - DbSession (const DbSession &other); + DbSession (DbSession &&other); + ~DbSession (); - DbSession &operator= (const DbSession &other); + DbSession &operator= (DbSession &&other); operator bool () const; @@ -70,6 +71,8 @@ public: long long resolveId (const soci::row &row, int col) const; private: + DbSessionPrivate *mPrivate; + L_DECLARE_PRIVATE(DbSession); }; From ab721847ba7516f436debebe2975dbcb7bfe7153 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 27 Feb 2018 17:12:50 +0100 Subject: [PATCH 161/281] feat(SmartTransaction): don't use soci::transaction, use soci::session methods to deal directly with transactions --- src/db/abstract/abstract-db-p.h | 4 ---- src/db/internal/db-exception-handler.h | 20 +++++++++++++------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/db/abstract/abstract-db-p.h b/src/db/abstract/abstract-db-p.h index b74a82157..fa2d12c3f 100644 --- a/src/db/abstract/abstract-db-p.h +++ b/src/db/abstract/abstract-db-p.h @@ -20,8 +20,6 @@ #ifndef _L_ABSTRACT_DB_P_H_ #define _L_ABSTRACT_DB_P_H_ -#include - #include "abstract-db.h" #include "db/session/db-session.h" #include "object/object-p.h" @@ -36,8 +34,6 @@ public: DbSession dbSession; - const std::thread::id threadId = std::this_thread::get_id(); - private: AbstractDb::Backend backend; diff --git a/src/db/internal/db-exception-handler.h b/src/db/internal/db-exception-handler.h index 2993c58e0..74084a7ac 100644 --- a/src/db/internal/db-exception-handler.h +++ b/src/db/internal/db-exception-handler.h @@ -37,23 +37,31 @@ LINPHONE_BEGIN_NAMESPACE class SmartTransaction { public: SmartTransaction (soci::session *session, const char *name) : - mTransaction(*session), mName(name), mIsCommitted(false) { + mSession(session), mName(name), mIsCommitted(false) { lInfo() << "Start transaction " << this << " in MainDb::" << mName << "."; + mSession->begin(); } ~SmartTransaction () { - if (!mIsCommitted) + if (!mIsCommitted) { lInfo() << "Rollback transaction " << this << " in MainDb::" << mName << "."; + mSession->rollback(); + } } void commit () { - mTransaction.commit(); - mIsCommitted = true; + if (mIsCommitted) { + lError() << "Transaction " << this << " in MainDb::" << mName << " already committed!!!"; + return; + } + lInfo() << "Commit transaction " << this << " in MainDb::" << mName << "."; + mIsCommitted = true; + mSession->commit(); } private: - soci::transaction mTransaction; + soci::session *mSession; const char *mName; bool mIsCommitted; @@ -86,8 +94,6 @@ public: DbExceptionHandler (DbExceptionHandlerInfo &info, Function &&function) : mFunction(std::move(function)) { MainDb *mainDb = info.mainDb; - L_ASSERT(mainDb->getPrivate()->threadId == std::this_thread::get_id()); - const char *name = info.name; soci::session *session = mainDb->getPrivate()->dbSession.getBackendSession(); From 71fd0d0a6412fcf25178958a277a8173e376a612 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 27 Feb 2018 17:10:42 +0100 Subject: [PATCH 162/281] Add linphone_chat_room_set_current_callbacks() API. --- include/linphone/api/c-chat-room.h | 2 +- include/linphone/wrapper_utils.h | 9 ++++++++- src/c-wrapper/api/c-chat-room.cpp | 14 +++++++++----- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/include/linphone/api/c-chat-room.h b/include/linphone/api/c-chat-room.h index 2175d0f06..529cca44a 100644 --- a/include/linphone/api/c-chat-room.h +++ b/include/linphone/api/c-chat-room.h @@ -299,7 +299,7 @@ LINPHONE_PUBLIC void linphone_chat_room_remove_callbacks(LinphoneChatRoom *cr, L * @return The LinphoneChatRoomCbs that has called the last callback */ LINPHONE_PUBLIC LinphoneChatRoomCbs *linphone_chat_room_get_current_callbacks(const LinphoneChatRoom *cr); - + /** * Get the state of the chat room. * @param[in] cr LinphoneChatRoom object diff --git a/include/linphone/wrapper_utils.h b/include/linphone/wrapper_utils.h index 5ab052604..ee7978269 100644 --- a/include/linphone/wrapper_utils.h +++ b/include/linphone/wrapper_utils.h @@ -56,12 +56,19 @@ LINPHONE_PUBLIC const bctbx_list_t *linphone_call_get_callbacks_list(const Linph /** * @brief Gets the list of listener in the chat room. - * @param[in] call #LinphoneChatRoom object. + * @param[in] cr #LinphoneChatRoom object. * @return The list of #LinphoneChatRoomCbs. * @donotwrap */ LINPHONE_PUBLIC const bctbx_list_t *linphone_chat_room_get_callbacks_list(const LinphoneChatRoom *cr); +/** + * Sets the current LinphoneChatRoomCbs. + * @param[in] cr LinphoneChatRoom object + * @param[in] cbs LinphoneChatRoomCbs object + */ +LINPHONE_PUBLIC void linphone_chat_room_set_current_callbacks(LinphoneChatRoom *cr, LinphoneChatRoomCbs *cbs); + /** * Send a message to peer member of this chat room. * diff --git a/src/c-wrapper/api/c-chat-room.cpp b/src/c-wrapper/api/c-chat-room.cpp index 2f1b935e7..9682489ea 100644 --- a/src/c-wrapper/api/c-chat-room.cpp +++ b/src/c-wrapper/api/c-chat-room.cpp @@ -419,19 +419,23 @@ LinphoneChatRoomCbs *linphone_chat_room_get_current_callbacks (const LinphoneCha return cr->currentCbs; } +void linphone_chat_room_set_current_callbacks(LinphoneChatRoom *cr, LinphoneChatRoomCbs *cbs) { + cr->currentCbs = cbs; +} + const bctbx_list_t *linphone_chat_room_get_callbacks_list(const LinphoneChatRoom *cr) { return cr->callbacks; } #define NOTIFY_IF_EXIST(cbName, functionName, ...) \ - bctbx_list_t *callbacks_copy = bctbx_list_copy(cr->callbacks); \ - for (bctbx_list_t *it = callbacks_copy; it; it = bctbx_list_next(it)) { \ - cr->currentCbs = reinterpret_cast(bctbx_list_get_data(it)); \ - LinphoneChatRoomCbs ## cbName ## Cb cb = linphone_chat_room_cbs_get_ ## functionName (cr->currentCbs); \ + bctbx_list_t *callbacksCopy = bctbx_list_copy(linphone_chat_room_get_callbacks_list(cr)); \ + for (bctbx_list_t *it = callbacksCopy; it; it = bctbx_list_next(it)) { \ + linphone_chat_room_set_current_callbacks(cr, reinterpret_cast(bctbx_list_get_data(it))); \ + LinphoneChatRoomCbs ## cbName ## Cb cb = linphone_chat_room_cbs_get_ ## functionName (linphone_chat_room_get_current_callbacks(cr)); \ if (cb) \ cb(__VA_ARGS__); \ } \ - bctbx_free(callbacks_copy); + bctbx_free(callbacksCopy); void _linphone_chat_room_notify_is_composing_received(LinphoneChatRoom *cr, const LinphoneAddress *remoteAddr, bool_t isComposing) { NOTIFY_IF_EXIST(IsComposingReceived, is_composing_received, cr, remoteAddr, isComposing) From 54a0a8c1567abccada8125532da911a664b371dc Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 27 Feb 2018 17:11:06 +0100 Subject: [PATCH 163/281] Fix wrong SQL request to insert one-to-one chat room in DB. --- src/db/main-db.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 5e7aa74c2..81d4c709a 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -2767,6 +2767,7 @@ void MainDb::insertOneToOneConferenceChatRoom (const shared_ptrselectOneToOneChatRoomId(participantASipAddressId, participantBSipAddressId); if (chatRoomId == -1) { + chatRoomId = d->selectChatRoomId(chatRoom->getChatRoomId()); StatementBind stmt(*d->preparedStatements->insert[Statements::InsertOneToOneChatRoom]); stmt.bind(chatRoomId); stmt.bind(participantASipAddressId); From 7d491f8689f0b3a590dde24151f7696045fa95d5 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 27 Feb 2018 17:11:28 +0100 Subject: [PATCH 164/281] Remove useless generateConferenceAddress() method in ServerGroupChatRoom. --- src/chat/chat-room/server-group-chat-room-p.h | 2 -- src/chat/chat-room/server-group-chat-room-stub.cpp | 4 ---- tester/group_chat_tester.c | 5 +---- 3 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/chat/chat-room/server-group-chat-room-p.h b/src/chat/chat-room/server-group-chat-room-p.h index bfb58f200..e8721c4e7 100644 --- a/src/chat/chat-room/server-group-chat-room-p.h +++ b/src/chat/chat-room/server-group-chat-room-p.h @@ -51,8 +51,6 @@ public: void confirmRecreation (SalCallOp *op); void dispatchQueuedMessages (); - IdentityAddress generateConferenceAddress (const std::shared_ptr &me) const; - void subscribeReceived (LinphoneEvent *event); bool update (SalCallOp *op); diff --git a/src/chat/chat-room/server-group-chat-room-stub.cpp b/src/chat/chat-room/server-group-chat-room-stub.cpp index 93532904a..46f613db1 100644 --- a/src/chat/chat-room/server-group-chat-room-stub.cpp +++ b/src/chat/chat-room/server-group-chat-room-stub.cpp @@ -64,10 +64,6 @@ void ServerGroupChatRoomPrivate::dispatchQueuedMessages () {} // ----------------------------------------------------------------------------- -IdentityAddress ServerGroupChatRoomPrivate::generateConferenceAddress (const shared_ptr &me) const { - return IdentityAddress(); -} - void ServerGroupChatRoomPrivate::subscribeReceived (LinphoneEvent *) {} bool ServerGroupChatRoomPrivate::update (SalCallOp *) { return true; } diff --git a/tester/group_chat_tester.c b/tester/group_chat_tester.c index bffccc84b..acaa6b582 100644 --- a/tester/group_chat_tester.c +++ b/tester/group_chat_tester.c @@ -308,10 +308,7 @@ static void group_chat_room_creation_server (void) { coresManagerList = bctbx_list_append(coresManagerList, laure); coresManagerList = bctbx_list_append(coresManagerList, chloe); bctbx_list_t *coresList = init_core_for_conference(coresManagerList); - - - - + start_core_for_conference(coresManagerList); participantsAddresses = bctbx_list_append(participantsAddresses, linphone_address_new(linphone_core_get_identity(pauline->lc))); From 10049e078f6711c7ba7388a5157831c29967c7d6 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Wed, 28 Feb 2018 10:43:16 +0100 Subject: [PATCH 165/281] fix(Abstract): in reconnect case, disable foreign key before init call --- src/db/abstract/abstract-db-p.h | 2 ++ src/db/abstract/abstract-db.cpp | 22 ++++++++++++---------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/db/abstract/abstract-db-p.h b/src/db/abstract/abstract-db-p.h index fa2d12c3f..d596d7b8d 100644 --- a/src/db/abstract/abstract-db-p.h +++ b/src/db/abstract/abstract-db-p.h @@ -35,6 +35,8 @@ public: DbSession dbSession; private: + void safeInit (); + AbstractDb::Backend backend; L_DECLARE_PUBLIC(AbstractDb); diff --git a/src/db/abstract/abstract-db.cpp b/src/db/abstract/abstract-db.cpp index 79b94aaae..bf56b954d 100644 --- a/src/db/abstract/abstract-db.cpp +++ b/src/db/abstract/abstract-db.cpp @@ -43,6 +43,15 @@ LINPHONE_BEGIN_NAMESPACE } #endif // if defined(SOCI_ENABLED) && (TARGET_OS_IPHONE || defined(__ANDROID__)) +void AbstractDbPrivate::safeInit () { + #ifdef SOCI_ENABLED + L_Q(); + dbSession.enableForeignKeys(false); + q->init(); + dbSession.enableForeignKeys(true); + #endif // ifdef SOCI_ENABLED +} + AbstractDb::AbstractDb (AbstractDbPrivate &p) : Object(p) {} bool AbstractDb::connect (Backend backend, const string ¶meters) { @@ -66,11 +75,7 @@ bool AbstractDb::connect (Backend backend, const string ¶meters) { if (d->dbSession) { try { - #ifdef SOCI_ENABLED - d->dbSession.enableForeignKeys(false); - init(); - d->dbSession.enableForeignKeys(true); - #endif // ifdef SOCI_ENABLED + d->safeInit(); } catch (const exception &e) { lWarning() << "Unable to init database: " << e.what(); @@ -99,14 +104,11 @@ bool AbstractDb::forceReconnect () { lInfo() << "Trying sql backend reconnect..."; try { - soci::session *session = d->dbSession.getBackendSession(); - session->close(); - for (int i = 0; i < retryCount; ++i) { try { lInfo() << "Reconnect... Try: " << i; - session->reconnect(); - init(); + d->dbSession.getBackendSession()->reconnect(); // Equivalent to close and connect. + d->safeInit(); lInfo() << "Database reconnection successful!"; return true; } catch (const soci::soci_error &e) { From 25e5919a6a832b5f1c8944d18263d912bc8c12e1 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 28 Feb 2018 10:39:55 +0100 Subject: [PATCH 166/281] Improve RPM packaging. --- .gitignore | 1 + build/CMakeLists.txt | 9 ++-- ...inphone.spec.in => liblinphone.spec.cmake} | 54 ++++++++++--------- 3 files changed, 36 insertions(+), 28 deletions(-) rename build/rpm/{liblinphone.spec.in => liblinphone.spec.cmake} (66%) diff --git a/.gitignore b/.gitignore index 594850b6d..69b985389 100644 --- a/.gitignore +++ b/.gitignore @@ -106,3 +106,4 @@ tools/lp-test-ecc tools/lp-sendmsg *.pyc +liblinphone.spec diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt index 1f1b88af7..ac389909d 100644 --- a/build/CMakeLists.txt +++ b/build/CMakeLists.txt @@ -1,6 +1,6 @@ ############################################################################ # CMakeLists.txt -# Copyright (C) 2017 Belledonne Communications, Grenoble France +# Copyright (C) 2017-2018 Belledonne Communications, Grenoble France # ############################################################################ # @@ -20,7 +20,7 @@ # ############################################################################ -if (NOT CPACK_PACKAGE_NAME) +if(NOT CPACK_PACKAGE_NAME) set(CPACK_PACKAGE_NAME "liblinphone") ENDIF() @@ -40,13 +40,14 @@ set(CPACK_SOURCE_IGNORE_FILES bc_project_build_version(${PROJECT_VERSION} PROJECT_VERSION_BUILD) if(PROJECT_VERSION_BUILD) - set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_FILE_NAME}-${PROJECT_VERSION_BUILD}") + set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_FILE_NAME}-${PROJECT_VERSION_BUILD}") endif() message("-- Package file name is ${CPACK_PACKAGE_FILE_NAME}" ) set(CPACK_SOURCE_PACKAGE_FILE_NAME ${CPACK_PACKAGE_FILE_NAME}) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/rpm/liblinphone.spec.in ${CMAKE_CURRENT_SOURCE_DIR}/../liblinphone.spec) + +bc_generate_rpm_specfile("rpm/liblinphone.spec.cmake" "${PROJECT_SOURCE_DIR}/liblinphone.spec") include(CPack) diff --git a/build/rpm/liblinphone.spec.in b/build/rpm/liblinphone.spec.cmake similarity index 66% rename from build/rpm/liblinphone.spec.in rename to build/rpm/liblinphone.spec.cmake index 1ea7e5aa3..b0f030334 100755 --- a/build/rpm/liblinphone.spec.in +++ b/build/rpm/liblinphone.spec.cmake @@ -1,12 +1,7 @@ # -*- rpm-spec -*- -## rpmbuild options -# These 2 lines are here because we can build the RPM for flexisip, in which -# case we prefix the entire installation so that we don't break compatibility -# with the user's libs. -# To compile with bc prefix, use rpmbuild -ba --with bc [SPEC] -%define pkg_name %{?_with_bc:bc-liblinphone}%{!?_with_bc:liblinphone} -%{?_with_bc: %define _prefix /opt/belledonne-communications} +%define _prefix @CMAKE_INSTALL_PREFIX@ +%define pkg_prefix @BC_PACKAGE_NAME_PREFIX@ # re-define some directories for older RPMBuild versions which don't. This messes up the doc/ dir # taken from https://fedoraproject.org/wiki/Packaging:RPMMacros?rd=Packaging/RPMMacros @@ -15,18 +10,20 @@ %define _docdir %{_datadir}/doc %define build_number @PROJECT_VERSION_BUILD@ +%if %{build_number} +%define build_number_ext -%{build_number} +%endif - -Name: %{pkg_name} +Name: @CPACK_PACKAGE_NAME@ Version: @PROJECT_VERSION@ -Release: %build_number%{?dist} +Release: %{build_number}%{?dist} Summary: Phone anywhere in the whole world by using the Internet Group: Applications/Communications License: GPL URL: http://www.linphone.org -Source0: %{name}-%{version}-%{build_number}.tar.gz +Source0: %{name}-%{version}%{?build_number_ext}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot Requires: %{pkg_prefix}bctoolbox @@ -34,15 +31,13 @@ Requires: %{pkg_prefix}ortp Requires: %{pkg_prefix}mediastreamer Requires: %{pkg_prefix}belle-sip Requires: %{pkg_prefix}belr -%if %{?_with_soci:1}%{!?_with_soci:0} +%if @ENABLE_SOCI_STORAGE@ Requires: %{pkg_prefix}soci %endif %description liblinphone is the voip sdk used by Linphone -%define video %{?_without_video:0}%{!?_without_video:1} - %package devel Summary: Development libraries for liblinphone @@ -61,11 +56,15 @@ develop programs using the liblinphone library. %define ctest_name ctest %endif +# This is for debian builds where debug_package has to be manually specified, whereas in centos it does not +%define custom_debug_package %{!?_enable_debug_packages:%debug_package}%{?_enable_debug_package:%{nil}} +%custom_debug_package + %prep -%setup -n %{name}-%{version}-%build_number +%setup -n %{name}-%{version}%{?build_number_ext} %build -%{expand:%%%cmake_name} . -DCMAKE_INSTALL_LIBDIR:PATH=%{_libdir} -DCMAKE_PREFIX_PATH:PATH=%{_prefix} -DENABLE_VIDEO=%{video} +%{expand:%%%cmake_name} . -DCMAKE_BUILD_TYPE=@CMAKE_BUILD_TYPE@ -DCMAKE_INSTALL_LIBDIR:PATH=%{_libdir} -DCMAKE_PREFIX_PATH:PATH=%{_prefix} @RPM_ALL_CMAKE_OPTIONS@ make %{?_smp_mflags} %install @@ -84,25 +83,32 @@ rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) %doc AUTHORS ChangeLog COPYING NEWS README.md TODO -%{_bindir}/linphonec -%{_bindir}/linphonecsh -%{_bindir}/lp-auto-answer -%{_bindir}/lp-test-ecc +%if @ENABLE_DAEMON@ || @ENABLE_CONSOLE_UI@ +%{_bindir}/* +%endif %{_libdir}/*.so.* #%{_mandir}/* %{_datadir}/linphone %{_datadir}/sounds/linphone -%{_datadir}/Linphone/rootca.pem %files devel %defattr(-,root,root) -%{_bindir}/* %{_includedir}/linphone +%if @ENABLE_CXX_WRAPPER@ +%{_includedir}/linphone++ +%endif +%if @ENABLE_STATIC@ %{_libdir}/*.a +%endif +%if @ENABLE_SHARED@ %{_libdir}/*.so -#%{_docdir} +%endif +%if @ENABLE_DOC@ +%{_docdir}/linphone*/html +%{_docdir}/linphone*/xml +%endif %{_datadir}/Linphone/cmake/*.cmake -%{_datadir}/liblinphone_tester +%{_datadir}/LinphoneCxx/cmake/*.cmake %{_datadir}/belr/grammars/cpim_grammar From 969b78d7e27fe6c7adf30c95fb32cc04873e3ce6 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 28 Feb 2018 10:40:15 +0100 Subject: [PATCH 167/281] Clean created files in group chat testers. --- tester/group_chat_tester.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tester/group_chat_tester.c b/tester/group_chat_tester.c index acaa6b582..55eb2c4d8 100644 --- a/tester/group_chat_tester.c +++ b/tester/group_chat_tester.c @@ -2587,6 +2587,8 @@ static void group_chat_room_send_file_with_or_without_text (bool_t with_text) { linphone_core_manager_delete_chat_room(marie, marieCr, coresList); linphone_core_manager_delete_chat_room(chloe, chloeCr, coresList); linphone_core_manager_delete_chat_room(pauline, paulineCr, coresList); + remove(receivePaulineFilepath); + remove(receiveChloeFilepath); bc_free(sendFilepath); bc_free(receivePaulineFilepath); bc_free(receiveChloeFilepath); From c8823c10238a9d13ea56f87cd938bffe8deb0d97 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 28 Feb 2018 10:40:50 +0100 Subject: [PATCH 168/281] Add CallSession::getPreviousState() method. --- src/conference/session/call-session.cpp | 5 +++++ src/conference/session/call-session.h | 1 + 2 files changed, 6 insertions(+) diff --git a/src/conference/session/call-session.cpp b/src/conference/session/call-session.cpp index b2b7a7703..14267ee12 100644 --- a/src/conference/session/call-session.cpp +++ b/src/conference/session/call-session.cpp @@ -1297,6 +1297,11 @@ CallSession::State CallSession::getState () const { return d->state; } +CallSession::State CallSession::getPreviousState () const { + L_D(); + return d->prevState; +} + const Address& CallSession::getToAddress () const { L_D(); d->toAddress = Address(d->op->get_to()); diff --git a/src/conference/session/call-session.h b/src/conference/session/call-session.h index 563ca89bb..a554db3a7 100644 --- a/src/conference/session/call-session.h +++ b/src/conference/session/call-session.h @@ -103,6 +103,7 @@ public: protected: explicit CallSession (CallSessionPrivate &p, const std::shared_ptr &core); + CallSession::State getPreviousState () const; private: L_DECLARE_PRIVATE(CallSession); From 763b4e3a0729184ec6d024daa53a443a5b6237b0 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 28 Feb 2018 10:42:10 +0100 Subject: [PATCH 169/281] Add ServerGroupChatRoomPrivate::declineSession() method. --- src/chat/chat-room/server-group-chat-room-p.h | 1 + src/chat/chat-room/server-group-chat-room-stub.cpp | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/chat/chat-room/server-group-chat-room-p.h b/src/chat/chat-room/server-group-chat-room-p.h index e8721c4e7..a10679ede 100644 --- a/src/chat/chat-room/server-group-chat-room-p.h +++ b/src/chat/chat-room/server-group-chat-room-p.h @@ -49,6 +49,7 @@ public: void confirmCreation (); void confirmJoining (SalCallOp *op); void confirmRecreation (SalCallOp *op); + void declineSession (const std::shared_ptr &session, LinphoneReason reason); void dispatchQueuedMessages (); void subscribeReceived (LinphoneEvent *event); diff --git a/src/chat/chat-room/server-group-chat-room-stub.cpp b/src/chat/chat-room/server-group-chat-room-stub.cpp index 46f613db1..7b58513c6 100644 --- a/src/chat/chat-room/server-group-chat-room-stub.cpp +++ b/src/chat/chat-room/server-group-chat-room-stub.cpp @@ -60,6 +60,8 @@ void ServerGroupChatRoomPrivate::confirmJoining (SalCallOp *) {} void ServerGroupChatRoomPrivate::confirmRecreation (SalCallOp *) {} +void ServerGroupChatRoomPrivate::declineSession (const shared_ptr &session, LinphoneReason reason) {} + void ServerGroupChatRoomPrivate::dispatchQueuedMessages () {} // ----------------------------------------------------------------------------- From 3ec59a12392a12ca40de474fb7d6df2e548bea5a Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 28 Feb 2018 11:47:01 +0100 Subject: [PATCH 170/281] Allow not sending SIP RINGING message. --- src/conference/session/call-session-p.h | 1 + src/conference/session/call-session.cpp | 3 ++- src/conference/session/call-session.h | 2 +- src/conference/session/media-session.cpp | 4 ++-- src/conference/session/media-session.h | 2 +- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/conference/session/call-session-p.h b/src/conference/session/call-session-p.h index 8ad819ce7..fb425b508 100644 --- a/src/conference/session/call-session-p.h +++ b/src/conference/session/call-session-p.h @@ -138,6 +138,7 @@ protected: bool deferUpdate = false; bool needLocalIpRefresh = false; bool nonOpError = false; /* Set when the LinphoneErrorInfo was set at higher level than sal */ + bool notifyRinging = true; bool referPending = false; bool reinviteOnCancelResponseRequested = false; diff --git a/src/conference/session/call-session.cpp b/src/conference/session/call-session.cpp index 14267ee12..8e6effe64 100644 --- a/src/conference/session/call-session.cpp +++ b/src/conference/session/call-session.cpp @@ -550,7 +550,8 @@ void CallSessionPrivate::handleIncomingReceivedStateInIncomingNotification () { L_Q(); /* Try to be best-effort in giving real local or routable contact address for 100Rel case */ setContactOp(); - op->notify_ringing(false); + if (notifyRinging) + op->notify_ringing(false); if (op->get_replaces() && lp_config_get_int(linphone_core_get_config(q->getCore()->getCCore()), "sip", "auto_answer_replacing_calls", 1)) q->accept(); } diff --git a/src/conference/session/call-session.h b/src/conference/session/call-session.h index a554db3a7..fa3969b64 100644 --- a/src/conference/session/call-session.h +++ b/src/conference/session/call-session.h @@ -69,7 +69,7 @@ public: virtual void iterate (time_t currentRealTime, bool oneSecondElapsed); LinphoneStatus redirect (const std::string &redirectUri); LinphoneStatus redirect (const Address &redirectAddr); - virtual void startIncomingNotification (); + virtual void startIncomingNotification (bool notifyRinging = true); virtual int startInvite (const Address *destination, const std::string &subject = "", const Content *content = nullptr); LinphoneStatus terminate (const LinphoneErrorInfo *ei = nullptr); LinphoneStatus transfer (const std::shared_ptr &dest); diff --git a/src/conference/session/media-session.cpp b/src/conference/session/media-session.cpp index c21b2fa22..506f8687d 100644 --- a/src/conference/session/media-session.cpp +++ b/src/conference/session/media-session.cpp @@ -4202,7 +4202,7 @@ void MediaSession::sendVfuRequest () { #endif } -void MediaSession::startIncomingNotification () { +void MediaSession::startIncomingNotification (bool notifyRinging) { L_D(); d->makeLocalMediaDescription(); d->op->set_local_media_description(d->localDesc); @@ -4218,7 +4218,7 @@ void MediaSession::startIncomingNotification () { } } - CallSession::startIncomingNotification(); + CallSession::startIncomingNotification(notifyRinging); } int MediaSession::startInvite (const Address *destination, const string &subject, const Content *content) { diff --git a/src/conference/session/media-session.h b/src/conference/session/media-session.h index 10a7f29ab..695c44ae4 100644 --- a/src/conference/session/media-session.h +++ b/src/conference/session/media-session.h @@ -56,7 +56,7 @@ public: LinphoneStatus sendDtmf (char dtmf); LinphoneStatus sendDtmfs (const std::string &dtmfs); void sendVfuRequest (); - void startIncomingNotification () override; + void startIncomingNotification (bool notifyRinging = true) override; int startInvite (const Address *destination, const std::string &subject = "", const Content *content = nullptr) override; void startRecording (); void stopRecording (); From 587e9518459f2061812820eae6548e9e8add2290 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 28 Feb 2018 11:48:43 +0100 Subject: [PATCH 171/281] Ooopppsss... Forgot one file in last commit. --- src/conference/session/call-session.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/conference/session/call-session.cpp b/src/conference/session/call-session.cpp index 8e6effe64..04fb89a3f 100644 --- a/src/conference/session/call-session.cpp +++ b/src/conference/session/call-session.cpp @@ -1067,8 +1067,9 @@ LinphoneStatus CallSession::redirect (const Address &redirectAddr) { return 0; } -void CallSession::startIncomingNotification () { +void CallSession::startIncomingNotification (bool notifyRinging) { L_D(); + d->notifyRinging = notifyRinging; if (d->listener) { d->listener->onIncomingCallSessionNotified(getSharedFromThis()); d->listener->onBackgroundTaskToBeStarted(getSharedFromThis()); From c9d5db0309c5fa78a43dc904b7f656d34e537371 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 28 Feb 2018 12:09:31 +0100 Subject: [PATCH 172/281] Reactivate "Add participant" group chat tester. --- tester/group_chat_tester.c | 43 +++++++++++++++++--------------------- 1 file changed, 19 insertions(+), 24 deletions(-) diff --git a/tester/group_chat_tester.c b/tester/group_chat_tester.c index 55eb2c4d8..c18284687 100644 --- a/tester/group_chat_tester.c +++ b/tester/group_chat_tester.c @@ -462,13 +462,11 @@ static void group_chat_room_creation_server (void) { linphone_core_manager_destroy(chloe); } -#if 0 static void group_chat_room_add_participant (void) { LinphoneCoreManager *marie = linphone_core_manager_create("marie_rc"); LinphoneCoreManager *pauline = linphone_core_manager_create("pauline_rc"); LinphoneCoreManager *laure = linphone_core_manager_create("laure_tcp_rc"); LinphoneCoreManager *chloe = linphone_core_manager_create("chloe_rc"); - bctbx_list_t *coresManagerList = NULL; bctbx_list_t *participantsAddresses = NULL; coresManagerList = bctbx_list_append(coresManagerList, marie); @@ -476,29 +474,28 @@ static void group_chat_room_add_participant (void) { coresManagerList = bctbx_list_append(coresManagerList, laure); coresManagerList = bctbx_list_append(coresManagerList, chloe); bctbx_list_t *coresList = init_core_for_conference(coresManagerList); - linphone_core_set_linphone_specs(chloe->lc, ""); //disable group chat for chloe - + linphone_core_set_linphone_specs(chloe->lc, ""); // Disable group chat for Chloe + start_core_for_conference(coresManagerList); - participantsAddresses = bctbx_list_append(participantsAddresses, linphone_address_new(linphone_core_get_identity(marie->lc))); participantsAddresses = bctbx_list_append(participantsAddresses, linphone_address_new(linphone_core_get_identity(laure->lc))); stats initialMarieStats = marie->stat; stats initialPaulineStats = pauline->stat; stats initialLaureStats = laure->stat; stats initialChloeStats = chloe->stat; - + // Pauline creates a new group chat room const char *initialSubject = "Colleagues"; LinphoneChatRoom *paulineCr = create_chat_room_client_side(coresList, pauline, &initialPaulineStats, participantsAddresses, initialSubject, -1); const LinphoneAddress *confAddr = linphone_chat_room_get_conference_address(paulineCr); - + // Check that the chat room is correctly created on Pauline's side and that the participants are added LinphoneChatRoom *marieCr = check_creation_chat_room_client_side(coresList, marie, &initialMarieStats, confAddr, initialSubject, 2, FALSE); - + // Check that the chat room is correctly created on Laure's side and that the participants are added LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, FALSE); - - //to simulate dialog removal for pauline + + // To simulate dialog removal for Pauline linphone_core_set_network_reachable(pauline->lc, FALSE); coresList=bctbx_list_remove(coresList, pauline->lc); linphone_core_manager_reinit(pauline); @@ -509,45 +506,44 @@ static void group_chat_room_add_participant (void) { linphone_core_manager_start(pauline, TRUE); LinphoneChatRoom *olpaulineCr = paulineCr; paulineCr = linphone_core_get_chat_room(pauline->lc, linphone_chat_room_get_peer_address(olpaulineCr)); - + // Pauline adds Chloe to the chat room participantsAddresses = NULL; participantsAddresses = bctbx_list_append(participantsAddresses, linphone_address_new(linphone_core_get_identity(chloe->lc))); linphone_chat_room_add_participants(paulineCr, participantsAddresses); bctbx_list_free_with_data(participantsAddresses, (bctbx_list_free_func)linphone_address_unref); participantsAddresses = NULL; - - //refused by server because group chat disabled for chloe + + // Refused by server because group chat disabled for Chloe BC_ASSERT_FALSE(wait_for_list(coresList, &marie->stat.number_of_participants_added, initialMarieStats.number_of_participants_added + 1, 1000)); BC_ASSERT_FALSE(wait_for_list(coresList, &pauline->stat.number_of_participants_added, initialPaulineStats.number_of_participants_added + 1, 1000)); BC_ASSERT_FALSE(wait_for_list(coresList, &laure->stat.number_of_participants_added, initialLaureStats.number_of_participants_added + 1, 1000)); BC_ASSERT_EQUAL(linphone_chat_room_get_nb_participants(marieCr), 2, int, "%d"); BC_ASSERT_EQUAL(linphone_chat_room_get_nb_participants(paulineCr), 2, int, "%d"); BC_ASSERT_EQUAL(linphone_chat_room_get_nb_participants(laureCr), 2, int, "%d"); - + // Pauline begins composing a message linphone_chat_room_compose(paulineCr); BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneIsComposingActiveReceived, initialMarieStats.number_of_LinphoneIsComposingActiveReceived + 1, 10000)); BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_LinphoneIsComposingActiveReceived, initialPaulineStats.number_of_LinphoneIsComposingActiveReceived + 1, 10000)); - - - //Now, chloe is upgrading to group chat client + + // Now, Chloe is upgrading to group chat client linphone_core_set_network_reachable(chloe->lc, FALSE); - coresList=bctbx_list_remove(coresList, chloe->lc); + coresList = bctbx_list_remove(coresList, chloe->lc); linphone_core_manager_reinit(chloe); tmpCoresManagerList = bctbx_list_append(NULL, chloe); init_core_for_conference(tmpCoresManagerList); bctbx_list_free(tmpCoresManagerList); coresList = bctbx_list_append(coresList, chloe->lc); linphone_core_manager_start(chloe, TRUE); - + // Pauline adds Chloe to the chat room participantsAddresses = NULL; participantsAddresses = bctbx_list_append(participantsAddresses, linphone_address_new(linphone_core_get_identity(chloe->lc))); linphone_chat_room_add_participants(paulineCr, participantsAddresses); bctbx_list_free_with_data(participantsAddresses, (bctbx_list_free_func)linphone_address_unref); participantsAddresses = NULL; - + // Check that the chat room is correctly created on Chloe's side and that she was added everywhere LinphoneChatRoom *chloeCr = check_creation_chat_room_client_side(coresList, chloe, &initialChloeStats, confAddr, initialSubject, 3, FALSE); BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_participants_added, initialMarieStats.number_of_participants_added + 1, 10000)); @@ -562,12 +558,12 @@ static void group_chat_room_add_participant (void) { linphone_core_manager_delete_chat_room(laure, laureCr, coresList); linphone_core_manager_delete_chat_room(pauline, paulineCr, coresList); linphone_core_manager_delete_chat_room(chloe, chloeCr, coresList); - + BC_ASSERT_EQUAL(linphone_core_get_call_history_size(marie->lc), 0, int,"%i"); BC_ASSERT_EQUAL(linphone_core_get_call_history_size(laure->lc), 0, int,"%i"); BC_ASSERT_EQUAL(linphone_core_get_call_history_size(pauline->lc), 0, int,"%i"); BC_ASSERT_EQUAL(linphone_core_get_call_history_size(chloe->lc), 0, int,"%i"); - + bctbx_list_free(coresList); bctbx_list_free(coresManagerList); linphone_core_manager_destroy(marie); @@ -575,7 +571,6 @@ static void group_chat_room_add_participant (void) { linphone_core_manager_destroy(laure); linphone_core_manager_destroy(chloe); } -#endif static int im_encryption_engine_process_incoming_message_cb(LinphoneImEncryptionEngine *engine, LinphoneChatRoom *room, LinphoneChatMessage *msg) { if (linphone_chat_message_get_content_type(msg)) { @@ -2980,7 +2975,7 @@ end: test_t group_chat_tests[] = { TEST_TWO_TAGS("Group chat room creation server", group_chat_room_creation_server, "Server", "LeaksMemory"), - //TEST_TWO_TAGS("Add participant", group_chat_room_add_participant, "Server", "LeaksMemory"), + TEST_TWO_TAGS("Add participant", group_chat_room_add_participant, "Server", "LeaksMemory"), TEST_TWO_TAGS("Send message", group_chat_room_send_message, "Server", "LeaksMemory"), TEST_TWO_TAGS("Send encrypted message", group_chat_room_send_message_encrypted, "Server", "LeaksMemory"), TEST_TWO_TAGS("Send invite on a multi register account", group_chat_room_invite_multi_register_account, "Server", "LeaksMemory"), From ff8a7e2c258cf62c32065d17ab9bcd0f0e025123 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 28 Feb 2018 14:45:13 +0100 Subject: [PATCH 173/281] Add a check on the number of chat rooms when migrating from basic to client group chat room. --- tester/group_chat_tester.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tester/group_chat_tester.c b/tester/group_chat_tester.c index c18284687..2d9b22b44 100644 --- a/tester/group_chat_tester.c +++ b/tester/group_chat_tester.c @@ -2309,6 +2309,9 @@ static void group_chat_room_migrate_from_basic_chat_room (void) { BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneMessageReceived, initialMarieStats.number_of_LinphoneMessageReceived + 1, 1000)); BC_ASSERT_EQUAL(linphone_chat_room_get_history_size(marieCr), 4, int, "%d"); BC_ASSERT_EQUAL(linphone_chat_room_get_history_size(paulineCr), 4, int, "%d"); + + BC_ASSERT_EQUAL((int)bctbx_list_size(linphone_core_get_chat_rooms(marie->lc)), 1, int, "%d"); + BC_ASSERT_EQUAL((int)bctbx_list_size(linphone_core_get_chat_rooms(pauline->lc)), 1, int, "%d"); } // Clean db from chat room From eaa7804d8124076e30a79eae97e4badef5c52412 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Wed, 28 Feb 2018 15:52:36 +0100 Subject: [PATCH 174/281] feat(MainDb): avoid usage of prepared statements for the entire core life (prevent lock???) --- src/db/main-db-p.h | 6 --- src/db/main-db.cpp | 113 +++++++++++---------------------------------- 2 files changed, 27 insertions(+), 92 deletions(-) diff --git a/src/db/main-db-p.h b/src/db/main-db-p.h index bb6d7abe5..4c9e263ab 100644 --- a/src/db/main-db-p.h +++ b/src/db/main-db-p.h @@ -34,16 +34,10 @@ class Content; class MainDbPrivate : public AbstractDbPrivate { public: - struct PreparedStatements; - mutable std::unordered_map> storageIdToEvent; mutable std::unordered_map> storageIdToChatMessage; private: - std::unique_ptr preparedStatements; - - void initPreparedStatements (); - // --------------------------------------------------------------------------- // Low level API. // --------------------------------------------------------------------------- diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 81d4c709a..bb52d52f3 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -222,63 +222,6 @@ static constexpr string &blobToString (string &in) { return in; } -// ----------------------------------------------------------------------------- -// Statements and helpers. -// ----------------------------------------------------------------------------- - -class StatementBind { -public: - StatementBind (soci::statement &stmt) : mStmt(stmt) {} - - ~StatementBind () { - mStmt.bind_clean_up(); - } - - template - void bind (const T &var) { - mStmt.exchange(soci::use(var)); - } - - template - void bindResult (T &var) { - mStmt.exchange(soci::into(var)); - } - - bool exec () { - mStmt.define_and_bind(); - return mStmt.execute(true); - } - -private: - soci::statement &mStmt; -}; - -static inline unique_ptr makeStatement (soci::session &session, const char *stmt) { - return makeUnique(session.prepare << stmt); -} - -struct MainDbPrivate::PreparedStatements { - typedef unique_ptr Statement; - - Statement select[Statements::SelectCount]; - Statement insert[Statements::InsertCount]; -}; - -void MainDbPrivate::initPreparedStatements () { - L_Q(); - - soci::session *session = dbSession.getBackendSession(); - AbstractDb::Backend backend = q->getBackend(); - - preparedStatements = makeUnique(); - for (int i = 0; i < int(Statements::SelectCount); ++i) - preparedStatements->select[i] = makeStatement(*session, Statements::get(Statements::Select(i), backend)); - for (int i = 0; i < int(Statements::InsertCount); ++i) - preparedStatements->insert[i] = makeStatement(*session, Statements::get(Statements::Insert(i), backend)); -} - -// ----------------------------------------------------------------------------- - long long MainDbPrivate::insertSipAddress (const string &sipAddress) { soci::session *session = dbSession.getBackendSession(); @@ -471,24 +414,27 @@ void MainDbPrivate::insertChatMessageParticipant (long long eventId, long long s // ----------------------------------------------------------------------------- long long MainDbPrivate::selectSipAddressId (const string &sipAddress) const { + L_Q(); + long long id; - StatementBind stmt(*preparedStatements->select[Statements::SelectSipAddressId]); - stmt.bind(sipAddress); - stmt.bindResult(id); + soci::session *session = dbSession.getBackendSession(); + *session << Statements::get(Statements::SelectSipAddressId, q->getBackend()), + soci::use(sipAddress), soci::into(id); - return stmt.exec() ? id : -1; + return session->got_data() ? id : -1; } long long MainDbPrivate::selectChatRoomId (long long peerSipAddressId, long long localSipAddressId) const { + L_Q(); + long long id; - StatementBind stmt(*preparedStatements->select[Statements::SelectChatRoomId]); - stmt.bind(peerSipAddressId); - stmt.bind(localSipAddressId); - stmt.bindResult(id); + soci::session *session = dbSession.getBackendSession(); + *session << Statements::get(Statements::SelectChatRoomId, q->getBackend()), + soci::use(peerSipAddressId), soci::use(localSipAddressId), soci::into(id); - return stmt.exec() ? id : -1; + return session->got_data() ? id : -1; } long long MainDbPrivate::selectChatRoomId (const ChatRoomId &chatRoomId) const { @@ -504,27 +450,28 @@ long long MainDbPrivate::selectChatRoomId (const ChatRoomId &chatRoomId) const { } long long MainDbPrivate::selectChatRoomParticipantId (long long chatRoomId, long long participantSipAddressId) const { + L_Q(); + long long id; - StatementBind stmt(*preparedStatements->select[Statements::SelectChatRoomParticipantId]); - stmt.bind(chatRoomId); - stmt.bind(participantSipAddressId); - stmt.bindResult(id); + soci::session *session = dbSession.getBackendSession(); + *session << Statements::get(Statements::SelectChatRoomParticipantId, q->getBackend()), + soci::use(chatRoomId), soci::use(participantSipAddressId), soci::into(id); - return stmt.exec() ? id : -1; + return session->got_data() ? id : -1; } long long MainDbPrivate::selectOneToOneChatRoomId (long long sipAddressIdA, long long sipAddressIdB) const { + L_Q(); + long long id; - StatementBind stmt(*preparedStatements->select[Statements::SelectOneToOneChatRoomId]); - stmt.bind(sipAddressIdA); - stmt.bind(sipAddressIdB); - stmt.bind(sipAddressIdA); - stmt.bind(sipAddressIdB); - stmt.bindResult(id); + soci::session *session = dbSession.getBackendSession(); + *session << Statements::get(Statements::SelectChatRoomParticipantId, q->getBackend()), + soci::use(sipAddressIdA), soci::use(sipAddressIdB), soci::use(sipAddressIdA), soci::use(sipAddressIdB), + soci::into(id); - return stmt.exec() ? id : -1; + return session->got_data() ? id : -1; } // ----------------------------------------------------------------------------- @@ -1747,8 +1694,6 @@ void MainDb::init () { d->updateModuleVersion("events", ModuleVersionEvents); d->updateModuleVersion("friends", ModuleVersionFriends); - - d->initPreparedStatements(); } bool MainDb::addEvent (const shared_ptr &eventLog) { @@ -2768,12 +2713,8 @@ void MainDb::insertOneToOneConferenceChatRoom (const shared_ptrselectOneToOneChatRoomId(participantASipAddressId, participantBSipAddressId); if (chatRoomId == -1) { chatRoomId = d->selectChatRoomId(chatRoom->getChatRoomId()); - StatementBind stmt(*d->preparedStatements->insert[Statements::InsertOneToOneChatRoom]); - stmt.bind(chatRoomId); - stmt.bind(participantASipAddressId); - stmt.bind(participantBSipAddressId); - - stmt.exec(); + *d->dbSession.getBackendSession() << Statements::get(Statements::InsertOneToOneChatRoom, getBackend()), + soci::use(chatRoomId), soci::use(participantASipAddressId), soci::use(participantBSipAddressId); } tr.commit(); From d41dba6357eb0f9617535409f59910176ddc157a Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 28 Feb 2018 16:13:08 +0100 Subject: [PATCH 175/281] Fixed message stored one time in clear and one time encrypted if using asynchronism while encrypting --- src/chat/chat-message/chat-message.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index 0d64995be..d932e72cb 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -582,7 +582,7 @@ void ChatMessagePrivate::send () { currentSendStep |= ChatMessagePrivate::Step::Started; - if (toBeStored) + if (toBeStored || currentSendStep == (ChatMessagePrivate::Step::Started | ChatMessagePrivate::Step::None)) storeInDb(); if ((currentSendStep & ChatMessagePrivate::Step::FileUpload) == ChatMessagePrivate::Step::FileUpload) { From d440dfd3fdf2e2eee4c420725f03af668f5d1cfa Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 28 Feb 2018 16:40:51 +0100 Subject: [PATCH 176/281] Fixed big mistake in my previous commit... --- src/chat/chat-message/chat-message.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index d932e72cb..ff3fe50d4 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -582,7 +582,7 @@ void ChatMessagePrivate::send () { currentSendStep |= ChatMessagePrivate::Step::Started; - if (toBeStored || currentSendStep == (ChatMessagePrivate::Step::Started | ChatMessagePrivate::Step::None)) + if (toBeStored && currentSendStep == (ChatMessagePrivate::Step::Started | ChatMessagePrivate::Step::None)) storeInDb(); if ((currentSendStep & ChatMessagePrivate::Step::FileUpload) == ChatMessagePrivate::Step::FileUpload) { From 1ad9a0789fb6fd80177c043d012bd8acaf7eb01a Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Thu, 1 Mar 2018 11:51:50 +0100 Subject: [PATCH 177/281] feat(ContentManager): refactoring, avoid buffer copy, use move, use constexpr, avoid casts... --- src/content/content-manager.cpp | 59 ++++++++++++++++----------------- 1 file changed, 28 insertions(+), 31 deletions(-) diff --git a/src/content/content-manager.cpp b/src/content/content-manager.cpp index 600f57a48..8640014a2 100644 --- a/src/content/content-manager.cpp +++ b/src/content/content-manager.cpp @@ -23,44 +23,46 @@ #include "content-type.h" #include "content/content.h" -#define MULTIPART_BOUNDARY "---------------------------14737809831466499882746641449" - // ============================================================================= using namespace std; LINPHONE_BEGIN_NAMESPACE +namespace { + constexpr const char MultipartBoundary[] = "---------------------------14737809831466499882746641449"; +} + // ----------------------------------------------------------------------------- list ContentManager::multipartToContentList (const Content &content) { + const string body = content.getBodyAsString(); belle_sip_multipart_body_handler_t *mpbh = belle_sip_multipart_body_handler_new_from_buffer( - (void *)content.getBodyAsString().c_str(), - content.getBodyAsString().length(), - MULTIPART_BOUNDARY + body.c_str(), body.length(), MultipartBoundary ); belle_sip_object_ref(mpbh); list contents; for (const belle_sip_list_t *parts = belle_sip_multipart_body_handler_get_parts(mpbh); parts; parts = parts->next) { belle_sip_body_handler_t *part = BELLE_SIP_BODY_HANDLER(parts->data); - const belle_sip_list_t *part_headers = belle_sip_body_handler_get_headers(part); - belle_sip_header_content_type_t *part_content_type = nullptr; - for (belle_sip_list_t *it = (belle_sip_list_t *)part_headers; it; it = it->next) { + belle_sip_header_content_type_t *partContentType = nullptr; + for (const belle_sip_list_t *it = belle_sip_body_handler_get_headers(part); it; it = it->next) { belle_sip_header_t *header = BELLE_SIP_HEADER(it->data); if (strcasecmp("Content-Type", belle_sip_header_get_name(header)) == 0) { - part_content_type = BELLE_SIP_HEADER_CONTENT_TYPE(header); + partContentType = BELLE_SIP_HEADER_CONTENT_TYPE(header); break; } } - Content retContent; - retContent.setBody((const char *)belle_sip_memory_body_handler_get_buffer(BELLE_SIP_MEMORY_BODY_HANDLER(part))); - retContent.setContentType(ContentType( - belle_sip_header_content_type_get_type(part_content_type), - belle_sip_header_content_type_get_subtype(part_content_type) + Content content; + content.setBody(static_cast( + belle_sip_memory_body_handler_get_buffer(BELLE_SIP_MEMORY_BODY_HANDLER(part)) )); - contents.push_back(retContent); + content.setContentType(ContentType( + belle_sip_header_content_type_get_type(partContentType), + belle_sip_header_content_type_get_subtype(partContentType) + )); + contents.push_back(move(content)); } belle_sip_object_unref(mpbh); @@ -68,31 +70,27 @@ list ContentManager::multipartToContentList (const Content &content) { } Content ContentManager::contentListToMultipart (const list &contents) { - belle_sip_memory_body_handler_t *mbh = nullptr; belle_sip_multipart_body_handler_t *mpbh = belle_sip_multipart_body_handler_new( - nullptr, nullptr, nullptr, MULTIPART_BOUNDARY + nullptr, nullptr, nullptr, MultipartBoundary ); belle_sip_object_ref(mpbh); for (const auto &content : contents) { const ContentType &contentType = content.getContentType(); - stringstream subtype; - subtype << contentType.getSubType() << "; charset=\"UTF-8\""; belle_sip_header_t *cContentType = BELLE_SIP_HEADER( belle_sip_header_content_type_create( contentType.getType().c_str(), - subtype.str().c_str() + string(contentType.getSubType() + "; charset=\"UTF-8\"").c_str() ) ); - string body = content.getBodyAsString(); - mbh = belle_sip_memory_body_handler_new_copy_from_buffer( - (void *)body.c_str(), body.length(), nullptr, nullptr + const string body = content.getBodyAsString(); + belle_sip_memory_body_handler_t *mbh = belle_sip_memory_body_handler_new_copy_from_buffer( + body.c_str(), body.length(), nullptr, nullptr ); belle_sip_body_handler_add_header(BELLE_SIP_BODY_HANDLER(mbh), cContentType); - const list> headers = content.getHeaders(); - for (const auto &header : headers) { + for (const auto &header : content.getHeaders()) { belle_sip_header_t *additionalHeader = BELLE_SIP_HEADER( belle_sip_header_create( header.first.c_str(), @@ -104,18 +102,17 @@ Content ContentManager::contentListToMultipart (const list &contents) { belle_sip_multipart_body_handler_add_part(mpbh, BELLE_SIP_BODY_HANDLER(mbh)); } - char *desc = belle_sip_object_to_string(mpbh); + char *desc = belle_sip_object_to_string(mpbh); Content content; content.setBody(desc); - ContentType contentType = ContentType::Multipart; - string boundary = "boundary=" + string(MULTIPART_BOUNDARY); - contentType.setParameter(boundary); - content.setContentType(contentType); - belle_sip_free(desc); belle_sip_object_unref(mpbh); + ContentType contentType = ContentType::Multipart; + contentType.setParameter("boundary=" + string(MultipartBoundary)); + content.setContentType(ContentType::Multipart); + return content; } From fe79c8fdb4fcda483b3d8063ec7ecb9fc86c2b8d Mon Sep 17 00:00:00 2001 From: Benjamin Reis Date: Thu, 1 Mar 2018 14:39:06 +0100 Subject: [PATCH 178/281] fix typo in previous commit --- src/content/content-manager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/content/content-manager.cpp b/src/content/content-manager.cpp index 8640014a2..94ee69ce9 100644 --- a/src/content/content-manager.cpp +++ b/src/content/content-manager.cpp @@ -111,7 +111,7 @@ Content ContentManager::contentListToMultipart (const list &contents) { ContentType contentType = ContentType::Multipart; contentType.setParameter("boundary=" + string(MultipartBoundary)); - content.setContentType(ContentType::Multipart); + content.setContentType(contentType); return content; } From 3f916b19723fa5f38d881644142b809ac627297a Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Thu, 1 Mar 2018 15:06:28 +0100 Subject: [PATCH 179/281] Make a copy of listeners list before calling them in C++ wrapper so that the list can be modified in these listeners. --- wrappers/cpp/class_impl.mustache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wrappers/cpp/class_impl.mustache b/wrappers/cpp/class_impl.mustache index e98acedfa..3002c3c9c 100644 --- a/wrappers/cpp/class_impl.mustache +++ b/wrappers/cpp/class_impl.mustache @@ -38,7 +38,7 @@ static {{{returnType}}} {{{cbName}}}({{{declArgs}}}) { {{#ismultilistenable}} {{{cListenerName}}} *cbs = {{{currentCallbacksGetter}}}({{{firstArgName}}}); - std::list > &listeners = *(std::list > *){{{userDataGetter}}}(cbs); + std::list > listeners = *(std::list > *){{{userDataGetter}}}(cbs); for(auto it=listeners.begin(); it!=listeners.end(); it++) { std::shared_ptr<{{{cppListenerName}}}> listener = std::static_pointer_cast<{{{cppListenerName}}},Listener>(*it); {{{cppMethodCallingLine}}}; From 67b6f7193926191907498c41bebb507f1302dca6 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Thu, 1 Mar 2018 23:20:14 +0100 Subject: [PATCH 180/281] Fix no audio issue - because StunClient was corrupting localMediaDescription when no STUN discovery was actually made. --- console/commands.c | 1 + src/nat/stun-client.cpp | 3 +++ src/nat/stun-client.h | 3 ++- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/console/commands.c b/console/commands.c index cd178daed..e7cd39bb4 100644 --- a/console/commands.c +++ b/console/commands.c @@ -930,6 +930,7 @@ lpc_cmd_firewall(LinphoneCore *lc, char *args) return 1; } linphone_core_set_firewall_policy(lc,LinphonePolicyUseNatAddress); + setting = linphone_core_get_nat_address(lc); } } diff --git a/src/nat/stun-client.cpp b/src/nat/stun-client.cpp index 82a4eb72f..590abfd1d 100644 --- a/src/nat/stun-client.cpp +++ b/src/nat/stun-client.cpp @@ -30,6 +30,7 @@ using namespace std; LINPHONE_BEGIN_NAMESPACE int StunClient::run (int audioPort, int videoPort, int textPort) { + stunDiscoveryDone = false; if (linphone_core_ipv6_enabled(getCore()->getCCore())) { lWarning() << "STUN support is not implemented for ipv6"; return -1; @@ -139,10 +140,12 @@ int StunClient::run (int audioPort, int videoPort, int textPort) { close_socket(sockAudio); if (sockVideo != -1) close_socket(sockVideo); if (sockText != -1) close_socket(sockText); + stunDiscoveryDone = true; return ret; } void StunClient::updateMediaDescription (SalMediaDescription *md) const { + if (!stunDiscoveryDone) return; for (int i = 0; i < SAL_MEDIA_DESCRIPTION_MAX_STREAMS; i++) { if (!sal_stream_description_active(&md->streams[i])) continue; diff --git a/src/nat/stun-client.h b/src/nat/stun-client.h index ec8b399a1..d686ea9cb 100644 --- a/src/nat/stun-client.h +++ b/src/nat/stun-client.h @@ -38,7 +38,7 @@ LINPHONE_BEGIN_NAMESPACE class StunClient : public CoreAccessor { struct Candidate { std::string address; - int port; + int port = 0; }; public: @@ -67,6 +67,7 @@ private: Candidate audioCandidate; Candidate videoCandidate; Candidate textCandidate; + bool stunDiscoveryDone = false; }; LINPHONE_END_NAMESPACE From ea838faff21afb9447d9acd96789104817253ccc Mon Sep 17 00:00:00 2001 From: Benjamin Reis Date: Fri, 2 Mar 2018 09:24:54 +0100 Subject: [PATCH 181/281] Fix find_one_to_one_chatroom and add a test to avoir its regression --- src/core/core-chat-room.cpp | 25 +++++++-- tester/group_chat_tester.c | 101 +++++++++++++++++++++++++++++++++--- 2 files changed, 114 insertions(+), 12 deletions(-) diff --git a/src/core/core-chat-room.cpp b/src/core/core-chat-room.cpp index 8e8eeed9d..1db4bc109 100644 --- a/src/core/core-chat-room.cpp +++ b/src/core/core-chat-room.cpp @@ -184,11 +184,28 @@ shared_ptr Core::findOneToOneChatRoom ( L_D(); for (const auto &chatRoom : d->chatRooms) { const IdentityAddress &curLocalAddress = chatRoom->getLocalAddress(); + ChatRoom::CapabilitiesMask capabilities = chatRoom->getCapabilities(); + + // We are looking fo a one to one chatroom + // Do not return a group chat room that everyone except one person has left + if (!(capabilities & ChatRoom::Capabilities::OneToOne)) + continue; + + // One to one client group chat room + // The only participant's address must match the participantAddress argument if ( - chatRoom->getParticipantCount() == 1 && ( - (curLocalAddress == localAddress && participantAddress == chatRoom->getParticipants().front()->getAddress()) || - (curLocalAddress == localAddress.getAddressWithoutGruu() && chatRoom->getPeerAddress() == participantAddress) - ) + localAddress == curLocalAddress && + participantAddress.getAddressWithoutGruu() == chatRoom->getParticipants().front()->getAddress() && + (capabilities & ChatRoom::Capabilities::Conference) + ) + return chatRoom; + + // One to one basic chat room (addresses without gruu) + // The peer address must match the participantAddress argument + if ( + localAddress.getAddressWithoutGruu() == curLocalAddress.getAddressWithoutGruu() && + participantAddress.getAddressWithoutGruu() == chatRoom->getPeerAddress().getAddressWithoutGruu() && + (capabilities & ChatRoom::Capabilities::Basic) ) return chatRoom; } diff --git a/tester/group_chat_tester.c b/tester/group_chat_tester.c index 2d9b22b44..aca3cad6e 100644 --- a/tester/group_chat_tester.c +++ b/tester/group_chat_tester.c @@ -453,7 +453,7 @@ static void group_chat_room_creation_server (void) { BC_ASSERT_EQUAL(linphone_core_get_call_history_size(laure->lc), 0, int,"%i"); BC_ASSERT_EQUAL(linphone_core_get_call_history_size(pauline->lc), 0, int,"%i"); BC_ASSERT_EQUAL(linphone_core_get_call_history_size(chloe->lc), 0, int,"%i"); - + bctbx_list_free(coresList); bctbx_list_free(coresManagerList); linphone_core_manager_destroy(marie); @@ -643,7 +643,7 @@ static void group_chat_room_message (bool_t encrypt) { linphone_im_encryption_engine_cbs_set_process_incoming_message(marie_cbs, im_encryption_engine_process_incoming_message_cb); linphone_im_encryption_engine_cbs_set_process_incoming_message(pauline_cbs, im_encryption_engine_process_incoming_message_cb); linphone_im_encryption_engine_cbs_set_process_incoming_message(chloe_cbs, im_encryption_engine_process_incoming_message_cb); - + linphone_core_set_im_encryption_engine(marie->lc, marie_imee); linphone_core_set_im_encryption_engine(pauline->lc, pauline_imee); linphone_core_set_im_encryption_engine(chloe->lc, chloe_imee); @@ -1378,7 +1378,7 @@ static void group_chat_room_create_room_with_disconnected_friends_base (bool_t i int dummy = 0; LinphoneChatRoom *paulineCr = NULL; LinphoneChatRoom *laureCr = NULL; - + coresManagerList = bctbx_list_append(coresManagerList, marie); coresManagerList = bctbx_list_append(coresManagerList, pauline); coresManagerList = bctbx_list_append(coresManagerList, laure); @@ -1411,7 +1411,7 @@ static void group_chat_room_create_room_with_disconnected_friends_base (bool_t i linphone_chat_message_send(msg); linphone_chat_message_unref(msg); } - + wait_for_list(coresList, &dummy, 1, 4000); // Reconnect pauline and laure @@ -1839,7 +1839,7 @@ static void group_chat_room_send_refer_to_all_devices (void) { marieParticipant = linphone_chat_room_find_participant(laureCr, marieAddr); if(BC_ASSERT_PTR_NOT_NULL(marieParticipant)) BC_ASSERT_TRUE(linphone_participant_is_admin(marieParticipant)); - + linphone_address_unref(marieAddr); // Marie removes Laure from the chat room @@ -2715,7 +2715,7 @@ static void group_chat_room_unique_one_to_one_chat_room_recreated_from_message_b LinphoneChatRoom *oldMarieCr = marieCr; marieCr = linphone_core_get_chat_room(marie->lc, linphone_chat_room_get_peer_address(oldMarieCr)); } - + // Marie deletes the chat room linphone_core_manager_delete_chat_room(marie, marieCr, coresList); @@ -2746,7 +2746,7 @@ static void group_chat_room_unique_one_to_one_chat_room_recreated_from_message_b BC_ASSERT_EQUAL(linphone_core_get_call_history_size(pauline->lc), 0, int,"%i"); BC_ASSERT_PTR_NULL(linphone_core_get_call_logs(marie->lc)); BC_ASSERT_PTR_NULL(linphone_core_get_call_logs(pauline->lc)); - + linphone_address_unref(confAddr); bctbx_list_free(coresList); bctbx_list_free(coresManagerList); @@ -2976,6 +2976,90 @@ end: linphone_core_manager_destroy(chloe); } +static void find_one_to_one_chat_room (void) { + LinphoneCoreManager *marie = linphone_core_manager_create("marie_rc"); + LinphoneCoreManager *pauline = linphone_core_manager_create("pauline_rc"); + LinphoneCoreManager *chloe = linphone_core_manager_create("chloe_rc"); + bctbx_list_t *coresManagerList = NULL; + bctbx_list_t *participantsAddresses = NULL; + coresManagerList = bctbx_list_append(coresManagerList, marie); + coresManagerList = bctbx_list_append(coresManagerList, pauline); + coresManagerList = bctbx_list_append(coresManagerList, chloe); + bctbx_list_t *coresList = init_core_for_conference(coresManagerList); + start_core_for_conference(coresManagerList); + participantsAddresses = bctbx_list_append(participantsAddresses, linphone_address_new(linphone_core_get_identity(pauline->lc))); + participantsAddresses = bctbx_list_append(participantsAddresses, linphone_address_new(linphone_core_get_identity(chloe->lc))); + stats initialMarieStats = marie->stat; + stats initialPaulineStats = pauline->stat; + stats initialChloeStats = chloe->stat; + // Only to be used in linphone_core_find_one_to_one_chatroom(...); + const LinphoneAddress *marieAddr = linphone_proxy_config_get_contact(linphone_core_get_default_proxy_config(marie->lc)); + const LinphoneAddress *paulineAddr = linphone_proxy_config_get_identity_address(linphone_core_get_default_proxy_config(pauline->lc)); + + // Marie creates a new group chat room + const char *initialSubject = "Colleagues"; + LinphoneChatRoom *marieCr = create_chat_room_client_side(coresList, marie, &initialMarieStats, participantsAddresses, initialSubject, -1); + 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, 2, FALSE); + + // Check that the chat room is correctly created on Chloe's side and that the participants are added + LinphoneChatRoom *chloeCr = check_creation_chat_room_client_side(coresList, chloe, &initialChloeStats, confAddr, initialSubject, 2, FALSE); + + // Chloe leave the chat room + linphone_chat_room_leave(chloeCr); + BC_ASSERT_TRUE(wait_for_list(coresList, &chloe->stat.number_of_LinphoneChatRoomStateTerminationPending, initialChloeStats.number_of_LinphoneChatRoomStateTerminationPending + 1, 100)); + BC_ASSERT_TRUE(wait_for_list(coresList, &chloe->stat.number_of_LinphoneChatRoomStateTerminated, initialChloeStats.number_of_LinphoneChatRoomStateTerminated + 1, 10000)); + BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_participants_removed, initialPaulineStats.number_of_participants_removed + 1, 1000)); + BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_participants_removed, initialMarieStats.number_of_participants_removed + 1, 1000)); + + LinphoneChatRoom *oneToOneChatRoom = linphone_core_find_one_to_one_chat_room(marie->lc, marieAddr, paulineAddr); + BC_ASSERT_PTR_NULL(oneToOneChatRoom); + + // Marie create a one to one chat room with Pauline + participantsAddresses = NULL; + participantsAddresses = bctbx_list_append(participantsAddresses, pauline->identity); + initialMarieStats = marie->stat; + initialPaulineStats = pauline->stat; + LinphoneChatRoom *marieOneToOneCr = create_chat_room_client_side(coresList, marie, &initialMarieStats, participantsAddresses, "one to one", -1); + confAddr = linphone_chat_room_get_conference_address(marieOneToOneCr); + LinphoneChatRoom *paulineOneToOneCr = check_creation_chat_room_client_side(coresList, pauline, &initialPaulineStats, confAddr, "one to one", 1, FALSE); + + // Check it's the same chat room + oneToOneChatRoom = linphone_core_find_one_to_one_chat_room(marie->lc, marieAddr, paulineAddr); + BC_ASSERT_PTR_NOT_NULL(oneToOneChatRoom); + BC_ASSERT_PTR_EQUAL(oneToOneChatRoom, marieOneToOneCr); + + // Clean the db + linphone_core_manager_delete_chat_room(marie, marieOneToOneCr, coresList); + linphone_core_manager_delete_chat_room(pauline, paulineOneToOneCr, coresList); + + // Check cleaning went well + oneToOneChatRoom = linphone_core_find_one_to_one_chat_room(marie->lc, marieAddr, paulineAddr); + BC_ASSERT_PTR_NULL(oneToOneChatRoom); + + // Create a basic chat room + marieOneToOneCr = linphone_core_get_chat_room(marie->lc, paulineAddr); + + // Check it's the same chat room + oneToOneChatRoom = linphone_core_find_one_to_one_chat_room(marie->lc, marieAddr, paulineAddr); + BC_ASSERT_PTR_NOT_NULL(oneToOneChatRoom); + BC_ASSERT_PTR_EQUAL(oneToOneChatRoom, marieOneToOneCr); + + // Clean db from chat room + linphone_core_manager_delete_chat_room(marie, marieOneToOneCr, coresList); + linphone_core_manager_delete_chat_room(marie, marieCr, coresList); + linphone_core_manager_delete_chat_room(chloe, chloeCr, 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); + linphone_core_manager_destroy(chloe); +} + test_t group_chat_tests[] = { TEST_TWO_TAGS("Group chat room creation server", group_chat_room_creation_server, "Server", "LeaksMemory"), TEST_TWO_TAGS("Add participant", group_chat_room_add_participant, "Server", "LeaksMemory"), @@ -3017,7 +3101,8 @@ test_t group_chat_tests[] = { TEST_TWO_TAGS("Unique one-to-one chatroom recreated from message with app restart", group_chat_room_unique_one_to_one_chat_room_recreated_from_message_with_app_restart, "Server", "LeaksMemory"), TEST_TWO_TAGS("Join one-to-one chat room with a new device", group_chat_room_join_one_to_one_chat_room_with_a_new_device, "Server", "LeaksMemory"), TEST_TWO_TAGS("New unique one-to-one chatroom after both participants left", group_chat_room_new_unique_one_to_one_chat_room_after_both_participants_left, "Server", "LeaksMemory"), - TEST_TWO_TAGS("IMDN for group chat room", imdn_for_group_chat_room, "Server", "LeaksMemory") + TEST_TWO_TAGS("IMDN for group chat room", imdn_for_group_chat_room, "Server", "LeaksMemory"), + TEST_TWO_TAGS("Find one to one chat room", find_one_to_one_chat_room, "Server", "LeaksMemory") }; test_suite_t group_chat_test_suite = { From f528de3f75147878b6c155841fe07815f6d66567 Mon Sep 17 00:00:00 2001 From: Erwan Croze Date: Fri, 2 Mar 2018 11:17:12 +0100 Subject: [PATCH 182/281] Removing the limit in the MagicSearch cache --- include/linphone/api/c-magic-search.h | 2 +- src/search/magic-search.cpp | 33 ++++++++++++++------------- src/search/magic-search.h | 2 +- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/include/linphone/api/c-magic-search.h b/include/linphone/api/c-magic-search.h index 1bd04a72f..e45bc2605 100644 --- a/include/linphone/api/c-magic-search.h +++ b/include/linphone/api/c-magic-search.h @@ -121,7 +121,7 @@ LINPHONE_PUBLIC void linphone_magic_search_reset_search_cache(LinphoneMagicSearc * Create a sorted list of SearchResult from SipUri, Contact name, * Contact displayname, Contact phone number, which match with a filter word * The last item list will be an address formed with "filter" if a proxy config exist - * During the first search, a cache is created and used for the next search and so on + * During the first search, a cache is created and used for the next search * Use linphone_magic_search_reset_search_cache() to begin a new search * @param[in] filter word we search * @param[in] withDomain domain which we want to search only diff --git a/src/search/magic-search.cpp b/src/search/magic-search.cpp index 13ebc6e41..a6a4e197e 100644 --- a/src/search/magic-search.cpp +++ b/src/search/magic-search.cpp @@ -116,15 +116,14 @@ void MagicSearch::resetSearchCache() { list MagicSearch::getContactListFromFilter(const string &filter, const string &withDomain) { list *resultList; + list returnList; LinphoneProxyConfig *proxy = nullptr; if (filter.empty()) return list(); - // We begin a new search if the last result size is superior or equal of the search limit size - if (getSearchCache() != nullptr && - (getLimitedSearch() && getSearchLimit() > getSearchCache()->size()) - ) { + if (getSearchCache() != nullptr) { resultList = continueSearch(filter, withDomain); + resetSearchCache(); } else { resultList = beginNewSearch(filter, withDomain); } @@ -133,6 +132,15 @@ list MagicSearch::getContactListFromFilter(const string &filter, c return (!rsr.getFriend() && lsr.getFriend()) || lsr >= rsr; }); + setSearchCache(resultList); + returnList = *resultList; + + if (getLimitedSearch() && returnList.size() > getSearchLimit()) { + auto limitIterator = returnList.begin(); + advance(limitIterator, getSearchLimit()); + returnList.erase(limitIterator, returnList.cend()); + } + proxy = linphone_core_get_default_proxy_config(this->getCore()->getCCore()); // Adding last item if proxy exist if (proxy) { @@ -140,12 +148,11 @@ list MagicSearch::getContactListFromFilter(const string &filter, c if (domain) { string filterAddress = "sip:" + filter + "@" + domain; LinphoneAddress *lastResult = linphone_core_create_address(this->getCore()->getCCore(), filterAddress.c_str()); - if (lastResult) resultList->push_back(SearchResult(0, lastResult, nullptr)); + if (lastResult) returnList.push_back(SearchResult(0, lastResult, nullptr)); } } - setSearchCache(resultList); - return *resultList; + return returnList; } ///////////////////// @@ -169,10 +176,7 @@ list *MagicSearch::beginNewSearch(const string &filter, const stri const bctbx_list_t *callLog = linphone_core_get_call_logs(this->getCore()->getCCore()); // For all friends or when we reach the search limit - for (bctbx_list_t *f = list->friends; - f != nullptr && (!getLimitedSearch() || resultList->size() < getSearchLimit()); - f = bctbx_list_next(f) - ) { + for (bctbx_list_t *f = list->friends ; f != nullptr ; f = bctbx_list_next(f)) { SearchResult result = searchInFriend(reinterpret_cast(f->data), filter, withDomain); if (result.getWeight() > getMinWeight()) { resultList->push_back(result); @@ -180,10 +184,7 @@ list *MagicSearch::beginNewSearch(const string &filter, const stri } // For all call log or when we reach the search limit - for (const bctbx_list_t *f = callLog; - f != nullptr && (!getLimitedSearch() || resultList->size() < getSearchLimit()); - f = bctbx_list_next(f) - ) { + for (const bctbx_list_t *f = callLog ; f != nullptr ; f = bctbx_list_next(f)) { LinphoneCallLog *log = reinterpret_cast(f->data); const LinphoneAddress *addr = (linphone_call_log_get_dir(log) == LinphoneCallDir::LinphoneCallIncoming) ? linphone_call_log_get_from_address(log) : linphone_call_log_get_to_address(log); @@ -269,7 +270,7 @@ unsigned int MagicSearch::getWeight(const string &stringWords, const string &fil for (size_t w = stringWords.find(filter); w != string::npos; w = stringWords.find(filter, w + filter.length()) - ) { + ) { // weight max if occurence find at beginning if (w == 0) { weight = getMaxWeight(); diff --git a/src/search/magic-search.h b/src/search/magic-search.h index 3c7331fef..7fa34f294 100644 --- a/src/search/magic-search.h +++ b/src/search/magic-search.h @@ -114,7 +114,7 @@ public: * Create a sorted list of SearchResult from SipUri, Contact name, * Contact displayname, Contact phone number, which match with a filter word * The last item list will be an address formed with "filter" if a proxy config exist - * During the first search, a cache is created and used for the next search and so on + * During the first search, a cache is created and used for the next search * Use resetSearchCache() to begin a new search * @param[in] filter word we search * @param[in] withDomain From a23391a0567f4612545c2bbe81e90ff9855186c1 Mon Sep 17 00:00:00 2001 From: Erwan Croze Date: Fri, 2 Mar 2018 11:18:06 +0100 Subject: [PATCH 183/281] Updating MagicSearch test --- tester/setup_tester.c | 52 ++++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 16 deletions(-) diff --git a/tester/setup_tester.c b/tester/setup_tester.c index 97262a9d3..e022f225d 100644 --- a/tester/setup_tester.c +++ b/tester/setup_tester.c @@ -489,11 +489,12 @@ static void search_friend_all_domains(void) { _check_friend_result_list(manager->lc, resultList, 0, sFriends[2], NULL);//"sip:allo@sip.example.org" _check_friend_result_list(manager->lc, resultList, 1, sFriends[3], NULL);//"sip:hello@sip.example.org" _check_friend_result_list(manager->lc, resultList, 2, sFriends[4], NULL);//"sip:hello@sip.test.org" - free(resultList); + bctbx_list_free(resultList); } _remove_friends_from_list(lfl, sFriends, sSizeFriend); + linphone_magic_search_unref(magicSearch); linphone_core_manager_destroy(manager); } @@ -513,12 +514,12 @@ static void search_friend_one_domain(void) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 2, int, "%d"); _check_friend_result_list(manager->lc, resultList, 0, sFriends[2], NULL);//"sip:allo@sip.example.org" _check_friend_result_list(manager->lc, resultList, 1, sFriends[3], NULL);//"sip:hello@sip.example.org" - free(resultList); + bctbx_list_free(resultList); } - _remove_friends_from_list(lfl, sFriends, sSizeFriend); + linphone_magic_search_unref(magicSearch); linphone_core_manager_destroy(manager); } @@ -543,7 +544,7 @@ static void search_friend_research_estate(void) { _check_friend_result_list(manager->lc, resultList, 4, sFriends[2], NULL);//"sip:allo@sip.example.org" _check_friend_result_list(manager->lc, resultList, 5, sFriends[3], NULL);//"sip:hello@sip.example.org" _check_friend_result_list(manager->lc, resultList, 6, sFriends[4], NULL);//"sip:hello@sip.test.org" - free(resultList); + bctbx_list_free(resultList); } resultList = linphone_magic_search_get_contact_list_from_filter(magicSearch, "la", ""); @@ -552,11 +553,12 @@ static void search_friend_research_estate(void) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 2, int, "%d"); _check_friend_result_list(manager->lc, resultList, 0, sFriends[8], NULL);//"sip:laure@sip.test.org" _check_friend_result_list(manager->lc, resultList, 1, sFriends[6], NULL);//"sip:laura@sip.example.org" - free(resultList); + bctbx_list_free(resultList); } _remove_friends_from_list(lfl, sFriends, sSizeFriend); + linphone_magic_search_unref(magicSearch); linphone_core_manager_destroy(manager); } @@ -576,7 +578,7 @@ static void search_friend_research_estate_reset(void) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 2, int, "%d"); _check_friend_result_list(manager->lc, resultList, 0, sFriends[6], NULL);//"sip:laura@sip.example.org" _check_friend_result_list(manager->lc, resultList, 1, sFriends[8], NULL);//"sip:laure@sip.test.org" - free(resultList); + bctbx_list_free(resultList); } linphone_magic_search_reset_search_cache(magicSearch); @@ -592,11 +594,12 @@ static void search_friend_research_estate_reset(void) { _check_friend_result_list(manager->lc, resultList, 4, sFriends[2], NULL);//"sip:allo@sip.example.org" _check_friend_result_list(manager->lc, resultList, 5, sFriends[3], NULL);//"sip:hello@sip.example.org" _check_friend_result_list(manager->lc, resultList, 6, sFriends[4], NULL);//"sip:hello@sip.test.org" - free(resultList); + bctbx_list_free(resultList); } _remove_friends_from_list(lfl, sFriends, sSizeFriend); + linphone_magic_search_unref(magicSearch); linphone_core_manager_destroy(manager); } @@ -620,11 +623,12 @@ static void search_friend_with_phone_number(void) { _check_friend_result_list(manager->lc, resultList, 0, sFriends[11], NULL);//"sip:+111223344@sip.example.org" _check_friend_result_list(manager->lc, resultList, 1, sFriends[10], NULL);//"sip:+33655667788@sip.example.org" _check_friend_result_list(manager->lc, resultList, 2, sFriends[5], NULL);//"sip:marie@sip.example.org" - free(resultList); + bctbx_list_free(resultList); } _remove_friends_from_list(lfl, sFriends, sSizeFriend); + linphone_magic_search_unref(magicSearch); linphone_core_manager_destroy(manager); } @@ -660,7 +664,7 @@ static void search_friend_with_presence(void) { _check_friend_result_list(manager->lc, resultList, 0, sFriends[11], NULL);//"sip:+111223344@sip.example.org" _check_friend_result_list(manager->lc, resultList, 1, chloeSipUri, chloePhoneNumber);//"sip:chloe@sip.example.org" _check_friend_result_list(manager->lc, resultList, 2, sFriends[10], NULL);//"sip:+33655667788@sip.example.org" - free(resultList); + bctbx_list_free(resultList); } linphone_magic_search_reset_search_cache(magicSearch); @@ -671,15 +675,17 @@ static void search_friend_with_presence(void) { // 1 + last address from filter "sip:chloe@sip.example.org" BC_ASSERT_EQUAL(bctbx_list_size(resultList), 2, int, "%d"); _check_friend_result_list(manager->lc, resultList, 0, chloeSipUri, chloePhoneNumber);//"sip:chloe@sip.example.org" - free(resultList); + bctbx_list_free(resultList); } _remove_friends_from_list(lfl, sFriends, sSizeFriend); { LinphoneFriend *fr = linphone_friend_list_find_friend_by_uri(lfl, chloeSipUri); if (fr != NULL) linphone_friend_list_remove_friend(lfl, fr); + if (chloeFriend) linphone_friend_unref(chloeFriend); } + linphone_magic_search_unref(magicSearch); linphone_core_manager_destroy(manager); } @@ -713,7 +719,7 @@ static void search_friend_in_call_log(void) { _check_friend_result_list(manager->lc, resultList, 1, sFriends[1], NULL);//"sip:charette@sip.example.org" _check_friend_result_list(manager->lc, resultList, 2, chloeSipUri, NULL);//"sip:chloe@sip.example.org" _check_friend_result_list(manager->lc, resultList, 3, charlesSipUri, NULL);//"sip:charles@sip.test.org" - free(resultList); + bctbx_list_free(resultList); } linphone_magic_search_reset_search_cache(magicSearch); @@ -724,11 +730,17 @@ static void search_friend_in_call_log(void) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 2, int, "%d"); _check_friend_result_list(manager->lc, resultList, 0, sFriends[0], NULL);//"sip:charu@sip.test.org" _check_friend_result_list(manager->lc, resultList, 1, charlesSipUri, NULL);//"sip:charles@sip.test.org" - free(resultList); + bctbx_list_free(resultList); } _remove_friends_from_list(lfl, sFriends, sSizeFriend); + if (chloeAddress) linphone_address_unref(chloeAddress); + if (benjaminAddress) linphone_address_unref(benjaminAddress); + if (charlesAddress) linphone_address_unref(charlesAddress); + if (ronanAddress) linphone_address_unref(ronanAddress); + + linphone_magic_search_unref(magicSearch); linphone_core_manager_destroy(manager); } @@ -753,9 +765,10 @@ static void search_friend_last_item_is_filter(void) { BC_ASSERT_STRING_EQUAL(linphone_address_get_username(srAddress), "newaddress"); } } - free(resultList); + bctbx_list_free(resultList); } + linphone_magic_search_unref(magicSearch); linphone_core_manager_destroy(manager); } @@ -795,7 +808,7 @@ static void search_friend_with_name(void) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 2, int, "%d"); _check_friend_result_list(manager->lc, resultList, 0, stephanie1SipUri, NULL);//"sip:toto@sip.example.org" _check_friend_result_list(manager->lc, resultList, 1, stephanie2SipUri, NULL);//"sip:stephanie@sip.example.org" - free(resultList); + bctbx_list_free(resultList); } linphone_magic_search_reset_search_cache(magicSearch); @@ -806,13 +819,18 @@ static void search_friend_with_name(void) { BC_ASSERT_EQUAL(bctbx_list_size(resultList), 2, int, "%d"); _check_friend_result_list(manager->lc, resultList, 0, stephanie2SipUri, NULL);//"sip:stephanie@sip.example.org" _check_friend_result_list(manager->lc, resultList, 1, stephanie1SipUri, NULL);//"sip:toto@sip.example.org" - free(resultList); + bctbx_list_free(resultList); } _remove_friends_from_list(lfl, sFriends, sSizeFriend); linphone_friend_list_remove_friend(lfl, stephanie1Friend); linphone_friend_list_remove_friend(lfl, stephanie2Friend); + if (stephanie1Friend) linphone_friend_unref(stephanie1Friend); + if (stephanie2Friend) linphone_friend_unref(stephanie2Friend); + if (stephanie1Vcard) linphone_vcard_unref(stephanie1Vcard); + if (stephanie2Vcard) linphone_vcard_unref(stephanie2Vcard); + linphone_magic_search_unref(magicSearch); linphone_core_manager_destroy(manager); } @@ -839,10 +857,12 @@ static void search_friend_large_database(void) { if (BC_ASSERT_PTR_NOT_NULL(resultList)) ms_message("List size: %zu", bctbx_list_size(resultList)); - free(resultList); + bctbx_list_free(resultList); } } + free(dbPath); + linphone_magic_search_unref(magicSearch); linphone_core_manager_destroy(manager); } From f14896c65ee7ef3a2f2381416117398ed5ee0333 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 2 Mar 2018 15:20:10 +0100 Subject: [PATCH 184/281] Add a couple of methods to ServerGroupChatRoom. --- src/chat/chat-room/server-group-chat-room-p.h | 3 +++ src/chat/chat-room/server-group-chat-room-stub.cpp | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/src/chat/chat-room/server-group-chat-room-p.h b/src/chat/chat-room/server-group-chat-room-p.h index a10679ede..1f124cab3 100644 --- a/src/chat/chat-room/server-group-chat-room-p.h +++ b/src/chat/chat-room/server-group-chat-room-p.h @@ -36,6 +36,8 @@ class ParticipantDevice; class ServerGroupChatRoomPrivate : public ChatRoomPrivate { public: + void setState (ChatRoom::State state) override; + std::shared_ptr addParticipant (const IdentityAddress &participantAddress); void removeParticipant (const std::shared_ptr &participant); @@ -98,6 +100,7 @@ private: CallSession::State newState, const std::string &message ) override; + void onCallSessionSetReleased (const std::shared_ptr &session) override; std::list> filteredParticipants; ChatRoomListener *chatRoomListener = this; diff --git a/src/chat/chat-room/server-group-chat-room-stub.cpp b/src/chat/chat-room/server-group-chat-room-stub.cpp index 7b58513c6..ad0ce75f6 100644 --- a/src/chat/chat-room/server-group-chat-room-stub.cpp +++ b/src/chat/chat-room/server-group-chat-room-stub.cpp @@ -28,6 +28,10 @@ LINPHONE_BEGIN_NAMESPACE // ----------------------------------------------------------------------------- +void ServerGroupChatRoomPrivate::setState (ChatRoom::State state) { + ChatRoomPrivate::setState(state); +} + shared_ptr ServerGroupChatRoomPrivate::addParticipant (const IdentityAddress &) { return nullptr; } @@ -124,6 +128,8 @@ void ServerGroupChatRoomPrivate::onCallSessionStateChanged ( const string & ) {} +void ServerGroupChatRoomPrivate::onCallSessionSetReleased (const shared_ptr &session) {} + // ============================================================================= ServerGroupChatRoom::ServerGroupChatRoom (const shared_ptr &core, SalCallOp *op) From 51ebc76aa97018fadfbfa456d76eb77935e39d6f Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 2 Mar 2018 15:20:42 +0100 Subject: [PATCH 185/281] Restore group chat test that was previously failing. --- tester/group_chat_tester.c | 11 +++-------- tester/tester.c | 5 +++++ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tester/group_chat_tester.c b/tester/group_chat_tester.c index aca3cad6e..8052c79c5 100644 --- a/tester/group_chat_tester.c +++ b/tester/group_chat_tester.c @@ -1580,7 +1580,6 @@ static void group_chat_room_reinvited_after_removed_while_offline_2 (void) { group_chat_room_reinvited_after_removed_base(TRUE, TRUE); } -#if 0 static void group_chat_room_reinvited_after_removed_with_several_devices (void) { LinphoneCoreManager *marie1 = linphone_core_manager_create("marie_rc"); LinphoneCoreManager *marie2 = linphone_core_manager_create("marie_rc"); @@ -1635,6 +1634,7 @@ static void group_chat_room_reinvited_after_removed_with_several_devices (void) LinphoneChatRoom *marie2Cr = check_creation_chat_room_client_side(coresList, marie2, &initialMarie2Stats, confAddr, initialSubject, 1, TRUE); // Marie2 adds Pauline back to the chat room + initialPauline1Stats = pauline1->stat; participantsAddresses = bctbx_list_append(participantsAddresses, paulineAddr); linphone_chat_room_add_participants(marie2Cr, participantsAddresses); bctbx_list_free_with_data(participantsAddresses, (bctbx_list_free_func)linphone_address_unref); @@ -1642,14 +1642,10 @@ static void group_chat_room_reinvited_after_removed_with_several_devices (void) BC_ASSERT_TRUE(wait_for_list(coresList, &marie1->stat.number_of_participants_added, initialMarie1Stats.number_of_participants_added + 1, 1000)); BC_ASSERT_TRUE(wait_for_list(coresList, &marie2->stat.number_of_participants_added, initialMarie2Stats.number_of_participants_added + 1, 1000)); BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_participants_added, initialLaureStats.number_of_participants_added + 1, 1000)); - BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_LinphoneChatRoomStateCreationPending, initialLaureStats.number_of_LinphoneChatRoomStateCreationPending + 1, 5000)); - BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_LinphoneChatRoomStateCreated, initialLaureStats.number_of_LinphoneChatRoomStateCreated + 1, 5000)); BC_ASSERT_EQUAL(linphone_chat_room_get_nb_participants(marie1Cr), 2, int, "%d"); BC_ASSERT_EQUAL(linphone_chat_room_get_nb_participants(marie2Cr), 2, int, "%d"); BC_ASSERT_EQUAL(linphone_chat_room_get_nb_participants(laureCr), 2, int, "%d"); - paulineAddr = linphone_address_new(linphone_core_get_device_identity(pauline1->lc)); - LinphoneChatRoom *newPauline1Cr = linphone_core_find_chat_room(pauline1->lc, confAddr, paulineAddr); - linphone_address_unref(paulineAddr); + LinphoneChatRoom *newPauline1Cr = check_creation_chat_room_client_side(coresList, pauline1, &initialPauline1Stats, confAddr, initialSubject, 2, FALSE); BC_ASSERT_PTR_EQUAL(newPauline1Cr, pauline1Cr); BC_ASSERT_EQUAL(linphone_chat_room_get_nb_participants(newPauline1Cr), 2, int, "%d"); BC_ASSERT_STRING_EQUAL(linphone_chat_room_get_subject(newPauline1Cr), initialSubject); @@ -1669,7 +1665,6 @@ static void group_chat_room_reinvited_after_removed_with_several_devices (void) linphone_core_manager_destroy(pauline2); linphone_core_manager_destroy(laure); } -#endif static void group_chat_room_notify_after_disconnection (void) { LinphoneCoreManager *marie = linphone_core_manager_create("marie_rc"); @@ -3082,7 +3077,7 @@ test_t group_chat_tests[] = { TEST_TWO_TAGS("Reinvited after removed from group chat room", group_chat_room_reinvited_after_removed, "Server", "LeaksMemory"), TEST_TWO_TAGS("Reinvited after removed from group chat room while offline", group_chat_room_reinvited_after_removed_while_offline, "Server", "LeaksMemory"), TEST_TWO_TAGS("Reinvited after removed from group chat room while offline 2", group_chat_room_reinvited_after_removed_while_offline_2, "Server", "LeaksMemory"), - //TEST_TWO_TAGS("Reinvited after removed from group chat room with several devices", group_chat_room_reinvited_after_removed_with_several_devices, "Server", "LeaksMemory"), + TEST_TWO_TAGS("Reinvited after removed from group chat room with several devices", group_chat_room_reinvited_after_removed_with_several_devices, "Server", "LeaksMemory"), TEST_TWO_TAGS("Notify after disconnection", group_chat_room_notify_after_disconnection, "Server", "LeaksMemory"), TEST_TWO_TAGS("Send refer to all participants devices", group_chat_room_send_refer_to_all_devices, "Server", "LeaksMemory"), // TODO: Use when we support adding a new device in created conf diff --git a/tester/tester.c b/tester/tester.c index 71b7a7d65..d39e4f18c 100644 --- a/tester/tester.c +++ b/tester/tester.c @@ -517,6 +517,11 @@ void linphone_core_manager_wait_for_stun_resolution(LinphoneCoreManager *mgr) { } void linphone_core_manager_destroy(LinphoneCoreManager* mgr) { + if (!linphone_core_is_network_reachable(mgr->lc)) { + int previousNbRegistrationOk = mgr->stat.number_of_LinphoneRegistrationOk; + linphone_core_set_network_reachable(mgr->lc, TRUE); + wait_for_until(mgr->lc, NULL, &mgr->stat.number_of_LinphoneRegistrationOk, previousNbRegistrationOk + 1, 2000); + } linphone_core_manager_stop(mgr); linphone_core_manager_uninit(mgr); ms_free(mgr); From 714fb3656dd90bffcec0214200d29f14250e760f Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 2 Mar 2018 16:06:29 +0100 Subject: [PATCH 186/281] Fix crash in "Find one to one chat room" group chat test. --- tester/group_chat_tester.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tester/group_chat_tester.c b/tester/group_chat_tester.c index 8052c79c5..a4953f96b 100644 --- a/tester/group_chat_tester.c +++ b/tester/group_chat_tester.c @@ -3014,7 +3014,7 @@ static void find_one_to_one_chat_room (void) { // Marie create a one to one chat room with Pauline participantsAddresses = NULL; - participantsAddresses = bctbx_list_append(participantsAddresses, pauline->identity); + participantsAddresses = bctbx_list_append(participantsAddresses, linphone_address_new(linphone_core_get_identity(pauline->lc))); initialMarieStats = marie->stat; initialPaulineStats = pauline->stat; LinphoneChatRoom *marieOneToOneCr = create_chat_room_client_side(coresList, marie, &initialMarieStats, participantsAddresses, "one to one", -1); @@ -3085,7 +3085,7 @@ test_t group_chat_tests[] = { TEST_TWO_TAGS("Send multiple is composing", multiple_is_composing_notification, "Server", "LeaksMemory"), TEST_TWO_TAGS("Fallback to basic chat room", group_chat_room_fallback_to_basic_chat_room, "Server", "LeaksMemory"), TEST_TWO_TAGS("Group chat room creation fails if invited participants don't support it", group_chat_room_creation_fails_if_invited_participants_dont_support_it, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Group chat room creation succesful if at least one invited participant supports it", group_chat_room_creation_successful_if_at_least_one_invited_participant_supports_it, "Server", "LeaksMemory"), + TEST_TWO_TAGS("Group chat room creation successful if at least one invited participant supports it", group_chat_room_creation_successful_if_at_least_one_invited_participant_supports_it, "Server", "LeaksMemory"), TEST_TWO_TAGS("Migrate basic chat room to client group chat room", group_chat_room_migrate_from_basic_chat_room, "Server", "LeaksMemory"), TEST_TWO_TAGS("Migrate basic chat room to client group chat room failure", group_chat_room_migrate_from_basic_to_client_fail, "Server", "LeaksMemory"), TEST_TWO_TAGS("Migrate basic chat room to client group chat room not needed", group_chat_donot_room_migrate_from_basic_chat_room, "Server", "LeaksMemory"), From 7c239c8ec4aa1c0006a1204112e93e272c8ca5a5 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 2 Mar 2018 17:33:25 +0100 Subject: [PATCH 187/281] Fix wrong statement being used in main db. --- src/db/main-db.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index bb52d52f3..a3f11b66f 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -467,7 +467,7 @@ long long MainDbPrivate::selectOneToOneChatRoomId (long long sipAddressIdA, long long long id; soci::session *session = dbSession.getBackendSession(); - *session << Statements::get(Statements::SelectChatRoomParticipantId, q->getBackend()), + *session << Statements::get(Statements::SelectOneToOneChatRoomId, q->getBackend()), soci::use(sipAddressIdA), soci::use(sipAddressIdB), soci::use(sipAddressIdA), soci::use(sipAddressIdB), soci::into(id); From bb2c51f2ca552a036d2cd77ae392ff64f6353b05 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 2 Mar 2018 17:49:17 +0100 Subject: [PATCH 188/281] Fix build. --- src/search/magic-search.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/search/magic-search.cpp b/src/search/magic-search.cpp index a6a4e197e..88749b778 100644 --- a/src/search/magic-search.cpp +++ b/src/search/magic-search.cpp @@ -138,7 +138,7 @@ list MagicSearch::getContactListFromFilter(const string &filter, c if (getLimitedSearch() && returnList.size() > getSearchLimit()) { auto limitIterator = returnList.begin(); advance(limitIterator, getSearchLimit()); - returnList.erase(limitIterator, returnList.cend()); + returnList.erase(limitIterator, returnList.end()); } proxy = linphone_core_get_default_proxy_config(this->getCore()->getCCore()); From 5adb1f04c33cb719bf929d5b386fed48948d0b1e Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 2 Mar 2018 18:00:53 +0100 Subject: [PATCH 189/281] Removed useless use_cpim rc param --- src/chat/chat-message/chat-message.cpp | 7 ++----- tester/cpim-tester.cpp | 3 --- tester/group_chat_tester.c | 1 - 3 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index ff3fe50d4..7f76b9efe 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -663,11 +663,8 @@ void ChatMessagePrivate::send () { if ((currentSendStep &ChatMessagePrivate::Step::Cpim) == ChatMessagePrivate::Step::Cpim) { lInfo() << "Cpim step already done, skipping"; } else { - int defaultValue = !!lp_config_get_string(core->getCCore()->config, "misc", "conference_factory_uri", nullptr); - if (lp_config_get_int(core->getCCore()->config, "sip", "use_cpim", defaultValue) == 1) { - CpimChatMessageModifier ccmm; - ccmm.encode(q->getSharedFromThis(), errorCode); - } + CpimChatMessageModifier ccmm; + ccmm.encode(q->getSharedFromThis(), errorCode); currentSendStep |= ChatMessagePrivate::Step::Cpim; } } diff --git a/tester/cpim-tester.cpp b/tester/cpim-tester.cpp index a98ca133d..e803ae33a 100644 --- a/tester/cpim-tester.cpp +++ b/tester/cpim-tester.cpp @@ -402,7 +402,6 @@ static int fake_im_encryption_engine_process_outgoing_message_cb(LinphoneImEncry static void cpim_chat_message_modifier_base(bool_t use_multipart) { LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc"); - LpConfig *config = linphone_core_get_config(marie->lc); // We use a fake encryption engine just to check the internal content type during the sending/receiving process LinphoneImEncryptionEngine *marie_imee = linphone_im_encryption_engine_new(); @@ -414,8 +413,6 @@ static void cpim_chat_message_modifier_base(bool_t use_multipart) { linphone_core_set_im_encryption_engine(marie->lc, marie_imee); linphone_core_set_im_encryption_engine(pauline->lc, pauline_imee); - lp_config_set_int(config, "sip", "use_cpim", 1); - IdentityAddress paulineAddress(linphone_address_as_string_uri_only(pauline->identity)); shared_ptr marieRoom = marie->lc->cppPtr->getOrCreateBasicChatRoom(paulineAddress); marieRoom->allowCpim(true); diff --git a/tester/group_chat_tester.c b/tester/group_chat_tester.c index a4953f96b..20295fb6e 100644 --- a/tester/group_chat_tester.c +++ b/tester/group_chat_tester.c @@ -135,7 +135,6 @@ static void configure_core_for_conference (LinphoneCore *core, const char* usern char *factoryUri = linphone_address_as_string(factoryAddr); linphone_core_set_conference_factory_uri(core, factoryUri); bctbx_free(factoryUri); - linphone_config_set_int(linphone_core_get_config(core), "sip", "use_cpim", 1); linphone_core_set_linphone_specs(core, "groupchat"); } From 9c904e7982c661b5a96fa34cbb3aa793e98cf7a8 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 2 Mar 2018 18:11:09 +0100 Subject: [PATCH 190/281] Fixed compil on Android armv7 --- src/search/magic-search.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/search/magic-search.cpp b/src/search/magic-search.cpp index 88749b778..6e8a8fa94 100644 --- a/src/search/magic-search.cpp +++ b/src/search/magic-search.cpp @@ -137,7 +137,7 @@ list MagicSearch::getContactListFromFilter(const string &filter, c if (getLimitedSearch() && returnList.size() > getSearchLimit()) { auto limitIterator = returnList.begin(); - advance(limitIterator, getSearchLimit()); + advance(limitIterator, (int)getSearchLimit()); returnList.erase(limitIterator, returnList.end()); } From 204e218bb0990a78caaa06d74728ddd175c7b50a Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 2 Mar 2018 20:51:54 +0100 Subject: [PATCH 191/281] Fix : move Cpu lock and so on into the Call object. There are not needed for INVITE sessions without media (like group chat), and they cause important battery drain because the phone will stay awake all the time since the INVITE session never BYEs. --- src/call/call.cpp | 15 +++++++++++++++ src/conference/session/call-session.cpp | 11 ----------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/call/call.cpp b/src/call/call.cpp index 9cd36d9ed..797eee31a 100644 --- a/src/call/call.cpp +++ b/src/call/call.cpp @@ -285,6 +285,21 @@ void CallPrivate::onCallSessionStartReferred (const shared_ptr &ses void CallPrivate::onCallSessionStateChanged (const shared_ptr &session, CallSession::State state, const string &message) { L_Q(); + switch(state){ + case CallSession::State::OutgoingInit: + case CallSession::State::IncomingReceived: + getPlatformHelpers(q->getCore()->getCCore())->acquireWifiLock(); + getPlatformHelpers(q->getCore()->getCCore())->acquireMcastLock(); + getPlatformHelpers(q->getCore()->getCCore())->acquireCpuLock(); + break; + case CallSession::State::Released: + getPlatformHelpers(q->getCore()->getCCore())->releaseWifiLock(); + getPlatformHelpers(q->getCore()->getCCore())->releaseMcastLock(); + getPlatformHelpers(q->getCore()->getCCore())->releaseCpuLock(); + break; + default: + break; + } linphone_call_notify_state_changed(L_GET_C_BACK_PTR(q), static_cast(state), message.c_str()); } diff --git a/src/conference/session/call-session.cpp b/src/conference/session/call-session.cpp index 04fb89a3f..035f66841 100644 --- a/src/conference/session/call-session.cpp +++ b/src/conference/session/call-session.cpp @@ -86,12 +86,6 @@ void CallSessionPrivate::setState (CallSession::State newState, const string &me } switch (newState) { - case CallSession::State::OutgoingInit: - case CallSession::State::IncomingReceived: - getPlatformHelpers(q->getCore()->getCCore())->acquireWifiLock(); - getPlatformHelpers(q->getCore()->getCCore())->acquireMcastLock(); - getPlatformHelpers(q->getCore()->getCCore())->acquireCpuLock(); - break; case CallSession::State::End: case CallSession::State::Error: switch (linphone_error_info_get_reason(q->getErrorInfo())) { @@ -129,11 +123,6 @@ void CallSessionPrivate::setState (CallSession::State newState, const string &me log->status = LinphoneCallSuccess; log->connected_date_time = ms_time(nullptr); break; - case CallSession::State::Released: - getPlatformHelpers(q->getCore()->getCCore())->releaseWifiLock(); - getPlatformHelpers(q->getCore()->getCCore())->releaseMcastLock(); - getPlatformHelpers(q->getCore()->getCCore())->releaseCpuLock(); - break; default: break; } From a029a954cdcadb632705c259d1d457cfd04d62a7 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Sat, 3 Mar 2018 11:46:54 +0100 Subject: [PATCH 192/281] add property to forcibly deactivate ice. --- src/nat/ice-agent.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/nat/ice-agent.cpp b/src/nat/ice-agent.cpp index 51874850f..4c98340fd 100644 --- a/src/nat/ice-agent.cpp +++ b/src/nat/ice-agent.cpp @@ -45,6 +45,12 @@ void IceAgent::checkSession (IceRole role, bool isReinvite) { return; LinphoneConfig *config = linphone_core_get_config(mediaSession.getCore()->getCCore()); + + if (lp_config_get_int(config, "net", "force_ice_disablement", 0)){ + lWarning()<<"ICE is disabled in this version"; + return; + } + if (isReinvite && (lp_config_get_int(config, "net", "allow_late_ice", 0) == 0)) return; From 2fb4ce6ffc3657719e88c2ae7c97e9f17730962a Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Sat, 3 Mar 2018 11:54:35 +0100 Subject: [PATCH 193/281] add test showing that ICE is deactivated if stun server is not responding. To be fixed later. --- coreapi/nat_policy.c | 11 +++++++++++ tester/call_single_tester.c | 17 +++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/coreapi/nat_policy.c b/coreapi/nat_policy.c index 8edfe3bd2..ed072ca7f 100644 --- a/coreapi/nat_policy.c +++ b/coreapi/nat_policy.c @@ -185,6 +185,17 @@ void linphone_nat_policy_set_stun_server(LinphoneNatPolicy *policy, const char * if (new_stun_server != NULL) { policy->stun_server = new_stun_server; } + if (policy->stun_addrinfo) { + bctbx_freeaddrinfo(policy->stun_addrinfo); + policy->stun_addrinfo = NULL; + } + if (policy->stun_resolver_context){ + belle_sip_resolver_context_cancel(policy->stun_resolver_context); + belle_sip_object_unref(policy->stun_resolver_context); + policy->stun_resolver_context = NULL; + + } + linphone_nat_policy_resolve_stun_server(policy); } const char * linphone_nat_policy_get_stun_server_username(const LinphoneNatPolicy *policy) { diff --git a/tester/call_single_tester.c b/tester/call_single_tester.c index 57e502ef8..68d935442 100644 --- a/tester/call_single_tester.c +++ b/tester/call_single_tester.c @@ -5880,6 +5880,22 @@ static void call_with_ice_without_stun2(void){ linphone_core_manager_destroy(pauline); } +#if 0 +static void call_with_ice_stun_not_responding(void){ + LinphoneCoreManager * marie = linphone_core_manager_new( "marie_rc"); + LinphoneCoreManager *pauline = linphone_core_manager_new(transport_supported(LinphoneTransportTls) ? "pauline_rc" : "pauline_tcp_rc"); + + /*set dummy stun servers*/ + linphone_core_set_stun_server(marie->lc, "belledonne-communications.com:443"); + linphone_core_set_stun_server(pauline->lc, "belledonne-communications.com:443"); + /*we expect ICE to continue without stun candidates*/ + _call_with_ice_base(marie, pauline, TRUE, TRUE, TRUE, FALSE); + + linphone_core_manager_destroy(marie); + linphone_core_manager_destroy(pauline); +} +#endif + static void call_with_zrtp_configured_calling_side(void) { LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new(transport_supported(LinphoneTransportTls) ? "pauline_rc" : "pauline_tcp_rc"); @@ -6490,6 +6506,7 @@ test_t call_tests[] = { TEST_ONE_TAG("Call with ICE with default candidate not stun", call_with_ice_with_default_candidate_not_stun, "ICE"), TEST_ONE_TAG("Call with ICE without stun server", call_with_ice_without_stun, "ICE"), TEST_ONE_TAG("Call with ICE without stun server one side", call_with_ice_without_stun2, "ICE"), + /*TEST_ONE_TAG("Call with ICE and stun server not responding", call_with_ice_stun_not_responding, "ICE"),*/ TEST_NO_TAG("Call with ZRTP configured calling side only", call_with_zrtp_configured_calling_side), TEST_NO_TAG("Call with ZRTP configured receiver side only", call_with_zrtp_configured_callee_side), TEST_NO_TAG("Call from plain RTP to ZRTP mandatory should be silent", call_from_plain_rtp_to_zrtp), From d6c17a16837371c343389c88eafb1f3b19c288ad Mon Sep 17 00:00:00 2001 From: Benjamin Reis Date: Mon, 5 Mar 2018 11:39:38 +0100 Subject: [PATCH 194/281] add priority header with 'non-urgent' valu to imdn & is-composing --- src/chat/chat-message/chat-message-p.h | 3 ++ src/chat/chat-message/chat-message.cpp | 3 ++ src/chat/chat-message/chat-message.h | 1 + src/chat/chat-room/chat-room.cpp | 32 +++++++++++-------- src/sip-tools/sip-headers.h | 43 ++++++++++++++++++++++++++ 5 files changed, 69 insertions(+), 13 deletions(-) create mode 100644 src/sip-tools/sip-headers.h diff --git a/src/chat/chat-message/chat-message-p.h b/src/chat/chat-message/chat-message-p.h index ebca8138c..740900df0 100644 --- a/src/chat/chat-message/chat-message-p.h +++ b/src/chat/chat-message/chat-message-p.h @@ -160,7 +160,10 @@ private: bool isSecured = false; mutable bool isReadOnly = false; Content internalContent; + + // TODO: to replace salCustomheaders std::unordered_map customHeaders; + mutable LinphoneErrorInfo * errorInfo = nullptr; SalOp *salOp = nullptr; SalCustomHeader *salCustomHeaders = nullptr; diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index 7f76b9efe..4031ceedb 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -40,6 +40,7 @@ #include "core/core-p.h" #include "logger/logger.h" #include "chat/notification/imdn.h" +#include "sip-tools/sip-headers.h" #include "ortp/b64.h" @@ -402,7 +403,9 @@ void ChatMessagePrivate::sendImdn (Imdn::Type imdnType, LinphoneReason reason) { if (reason != LinphoneReasonNone) msg->getPrivate()->setEncryptionPrevented(true); + msg->setToBeStored(false); + msg->getPrivate()->addSalCustomHeader(PriorityHeader::HeaderName, PriorityHeader::NonUrgent); msg->getPrivate()->send(); } diff --git a/src/chat/chat-message/chat-message.h b/src/chat/chat-message/chat-message.h index 1108bcb70..5ed06b1e9 100644 --- a/src/chat/chat-message/chat-message.h +++ b/src/chat/chat-message/chat-message.h @@ -100,6 +100,7 @@ public: const Content &getInternalContent () const; void setInternalContent (const Content &content); + // TODO: to replace salCustomheaders std::string getCustomHeaderValue (const std::string &headerName) const; void addCustomHeader (const std::string &headerName, const std::string &headerValue); void removeCustomHeader (const std::string &headerName); diff --git a/src/chat/chat-room/chat-room.cpp b/src/chat/chat-room/chat-room.cpp index dc5e378f5..232ef6175 100644 --- a/src/chat/chat-room/chat-room.cpp +++ b/src/chat/chat-room/chat-room.cpp @@ -25,6 +25,7 @@ #include "chat/chat-message/chat-message-p.h" #include "chat/chat-room/chat-room-p.h" #include "core/core-p.h" +#include "sip-tools/sip-headers.h" // ============================================================================= @@ -50,7 +51,7 @@ void ChatRoomPrivate::sendChatMessage (const shared_ptr &chatMessag dChatMessage->setTime(ms_time(0)); dChatMessage->send(); - LinphoneChatRoom *cr = L_GET_C_BACK_PTR(q); + LinphoneChatRoom *cr = L_GET_C_BACK_PTR(q); // TODO: server currently don't stock message, remove condition in the future. if (!linphone_core_conference_server_enabled(q->getCore()->getCCore())) { shared_ptr event = static_pointer_cast( @@ -71,18 +72,23 @@ void ChatRoomPrivate::sendChatMessage (const shared_ptr &chatMessag void ChatRoomPrivate::sendIsComposingNotification () { L_Q(); LinphoneImNotifPolicy *policy = linphone_core_get_im_notif_policy(q->getCore()->getCCore()); - if (linphone_im_notif_policy_get_send_is_composing(policy)) { - string payload = isComposingHandler->marshal(isComposing); - if (!payload.empty()) { - shared_ptr chatMessage = createChatMessage(ChatMessage::Direction::Outgoing); - chatMessage->setToBeStored(false); - Content *content = new Content(); - content->setContentType(ContentType::ImIsComposing); - content->setBody(payload); - chatMessage->addContent(*content); - chatMessage->getPrivate()->send(); - } - } + if (!linphone_im_notif_policy_get_send_is_composing(policy)) + return; + + string payload = isComposingHandler->marshal(isComposing); + if (payload.empty()) + return; + + Content *content = new Content(); + content->setContentType(ContentType::ImIsComposing); + content->setBody(payload); + + shared_ptr chatMessage = createChatMessage(ChatMessage::Direction::Outgoing); + chatMessage->setToBeStored(false); + chatMessage->addContent(*content); + chatMessage->getPrivate()->addSalCustomHeader(PriorityHeader::HeaderName, PriorityHeader::NonUrgent); + + chatMessage->getPrivate()->send(); } // ----------------------------------------------------------------------------- diff --git a/src/sip-tools/sip-headers.h b/src/sip-tools/sip-headers.h new file mode 100644 index 000000000..969735841 --- /dev/null +++ b/src/sip-tools/sip-headers.h @@ -0,0 +1,43 @@ +/* + * sip-headers.h + * Copyright (C) 2010-2018 Belledonne Communications SARL + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _L_SIP_HEADERS_H_ +#define _L_SIP_HEADERS_H_ + +#include "linphone/utils/general.h" + +// ============================================================================= + +using namespace std; + +LINPHONE_BEGIN_NAMESPACE + +namespace PriorityHeader { + constexpr const char HeaderName[] = "Priority"; + + // Values + constexpr const char NonUrgent[] = "non-urgent"; + constexpr const char Urgent[] = "urgent"; + constexpr const char Emergency[] = "emergency"; + constexpr const char Normal[] = "normal"; +} + +LINPHONE_END_NAMESPACE + +#endif // _L_SIP_HEADERS_H_ From cf5abd62b754831f3775e21f109ae1724466dfaa Mon Sep 17 00:00:00 2001 From: Benjamin Reis Date: Mon, 5 Mar 2018 11:54:44 +0100 Subject: [PATCH 195/281] set Expires=0 for im-iscomposing in order to make sure flexisip doesn't store them --- src/chat/chat-room/chat-room.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/chat/chat-room/chat-room.cpp b/src/chat/chat-room/chat-room.cpp index 232ef6175..a55a82560 100644 --- a/src/chat/chat-room/chat-room.cpp +++ b/src/chat/chat-room/chat-room.cpp @@ -87,6 +87,7 @@ void ChatRoomPrivate::sendIsComposingNotification () { chatMessage->setToBeStored(false); chatMessage->addContent(*content); chatMessage->getPrivate()->addSalCustomHeader(PriorityHeader::HeaderName, PriorityHeader::NonUrgent); + chatMessage->getPrivate()->addSalCustomHeader("Expires", "0"); chatMessage->getPrivate()->send(); } From 8b0f60894b6fd5a26d65fe28eb319be3bfd68d9b Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Mon, 5 Mar 2018 13:29:41 +0100 Subject: [PATCH 196/281] fix findOneToOneChatRoom in case of chatroom has no participant in --- src/core/core-chat-room.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/core/core-chat-room.cpp b/src/core/core-chat-room.cpp index 1db4bc109..bb0bc95d7 100644 --- a/src/core/core-chat-room.cpp +++ b/src/core/core-chat-room.cpp @@ -195,6 +195,7 @@ shared_ptr Core::findOneToOneChatRoom ( // The only participant's address must match the participantAddress argument if ( localAddress == curLocalAddress && + ! chatRoom->getParticipants().empty() && participantAddress.getAddressWithoutGruu() == chatRoom->getParticipants().front()->getAddress() && (capabilities & ChatRoom::Capabilities::Conference) ) From 77fec544bdbfc11f44a12e1777525e5458dfd300 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Mon, 5 Mar 2018 13:32:08 +0100 Subject: [PATCH 197/281] Fix register unit test --- tester/tester.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tester/tester.c b/tester/tester.c index d39e4f18c..92fc68a86 100644 --- a/tester/tester.c +++ b/tester/tester.c @@ -517,7 +517,7 @@ void linphone_core_manager_wait_for_stun_resolution(LinphoneCoreManager *mgr) { } void linphone_core_manager_destroy(LinphoneCoreManager* mgr) { - if (!linphone_core_is_network_reachable(mgr->lc)) { + if (mgr->lc && !linphone_core_is_network_reachable(mgr->lc)) { int previousNbRegistrationOk = mgr->stat.number_of_LinphoneRegistrationOk; linphone_core_set_network_reachable(mgr->lc, TRUE); wait_for_until(mgr->lc, NULL, &mgr->stat.number_of_LinphoneRegistrationOk, previousNbRegistrationOk + 1, 2000); From 59a66ca7c4cc44482f59824c20f340ec4d467aa7 Mon Sep 17 00:00:00 2001 From: Benjamin Reis Date: Mon, 5 Mar 2018 14:05:06 +0100 Subject: [PATCH 198/281] test priority and expires header for is composing and imdn --- tester/message_tester.c | 49 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/tester/message_tester.c b/tester/message_tester.c index 6aaea5cb7..df54f9160 100644 --- a/tester/message_tester.c +++ b/tester/message_tester.c @@ -891,6 +891,7 @@ static void _is_composing_notification(bool_t lime_enabled) { LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc"); + lp_config_set_int(linphone_core_get_config(marie->lc), "sip", "deliver_imdn", 1); if (lime_enabled) { if (enable_lime_for_message_test(marie, pauline) < 0) goto end; @@ -900,15 +901,42 @@ static void _is_composing_notification(bool_t lime_enabled) { marie_chat_room = linphone_core_get_chat_room(marie->lc, pauline->identity); linphone_core_get_chat_room(marie->lc, pauline->identity); /*make marie create the chatroom with pauline, which is necessary for receiving the is-composing*/ linphone_chat_room_compose(pauline_chat_room); - wait_for_until(pauline->lc, marie->lc, &dummy, 1, 1500); /*just to sleep while iterating*/ - linphone_chat_room_send_message(pauline_chat_room, "Composing a msg"); BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneIsComposingActiveReceived, 1)); composing_addresses = linphone_chat_room_get_composing_addresses(marie_chat_room); BC_ASSERT_GREATER(bctbx_list_size(composing_addresses), 0, int, "%i"); if (bctbx_list_size(composing_addresses) > 0) { LinphoneAddress *addr = (LinphoneAddress *)bctbx_list_get_data(composing_addresses); - BC_ASSERT_STRING_EQUAL(linphone_address_as_string(addr), linphone_address_as_string(pauline->identity)); + char *address_string = linphone_address_as_string(addr); + char *pauline_address = linphone_address_as_string(pauline->identity); + BC_ASSERT_STRING_EQUAL(address_string, pauline_address); + bctbx_free(address_string); + bctbx_free(pauline_address); } + BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneMessageReceived, 1)); + LinphoneChatMessage *is_composing_msg = marie->stat.last_received_chat_message; + if (BC_ASSERT_PTR_NOT_NULL(is_composing_msg)) { + const char *expires = linphone_chat_message_get_custom_header(is_composing_msg, "Expires"); + if (BC_ASSERT_PTR_NOT_NULL(expires)) + BC_ASSERT_STRING_EQUAL(expires, "0"); + + const char *priority = linphone_chat_message_get_custom_header(is_composing_msg, "Priority"); + if (BC_ASSERT_PTR_NOT_NULL(priority)) + BC_ASSERT_STRING_EQUAL(priority, "non-urgent"); + } + wait_for_until(pauline->lc, marie->lc, &dummy, 1, 1500); /*just to sleep while iterating*/ + BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneIsComposingIdleReceived, 1)); + BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneMessageReceived, 2)); + is_composing_msg = marie->stat.last_received_chat_message; + if (BC_ASSERT_PTR_NOT_NULL(is_composing_msg)) { + const char *expires = linphone_chat_message_get_custom_header(is_composing_msg, "Expires"); + if (BC_ASSERT_PTR_NOT_NULL(expires)) + BC_ASSERT_STRING_EQUAL(expires, "0"); + + const char *priority = linphone_chat_message_get_custom_header(is_composing_msg, "Priority"); + if (BC_ASSERT_PTR_NOT_NULL(priority)) + BC_ASSERT_STRING_EQUAL(priority, "non-urgent"); + } + linphone_chat_room_send_message(pauline_chat_room, "Composing a msg"); BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &marie->stat.number_of_LinphoneIsComposingIdleReceived, 2)); composing_addresses = linphone_chat_room_get_composing_addresses(marie_chat_room); BC_ASSERT_EQUAL(bctbx_list_size(composing_addresses), 0, int, "%i"); @@ -933,6 +961,7 @@ static void is_composing_notification_with_lime(void) { static void _imdn_notifications(bool_t with_lime) { LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); LinphoneCoreManager *pauline = linphone_core_manager_new("pauline_tcp_rc"); + lp_config_set_int(linphone_core_get_config(pauline->lc), "sip", "deliver_imdn", 1); LinphoneChatRoom *pauline_chat_room = linphone_core_get_chat_room(pauline->lc, marie->identity); LinphoneChatRoom *marie_chat_room; LinphoneChatMessage *sent_cm; @@ -959,8 +988,22 @@ static void _imdn_notifications(bool_t with_lime) { BC_ASSERT_PTR_NOT_NULL(received_cm); if (received_cm != NULL) { BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &pauline->stat.number_of_LinphoneMessageDeliveredToUser, 1)); + BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &pauline->stat.number_of_LinphoneMessageReceived, 1)); + LinphoneChatMessage *imdn_message = pauline->stat.last_received_chat_message; + if (BC_ASSERT_PTR_NOT_NULL(imdn_message)) { + const char *priority = linphone_chat_message_get_custom_header(imdn_message, "Priority"); + if (BC_ASSERT_PTR_NOT_NULL(priority)) + BC_ASSERT_STRING_EQUAL(priority, "non-urgent"); + } linphone_chat_room_mark_as_read(marie_chat_room); /* This sends the display notification */ BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &pauline->stat.number_of_LinphoneMessageDisplayed, 1)); + BC_ASSERT_TRUE(wait_for(pauline->lc, marie->lc, &pauline->stat.number_of_LinphoneMessageReceived, 2)); + imdn_message = pauline->stat.last_received_chat_message; + if (BC_ASSERT_PTR_NOT_NULL(imdn_message)) { + const char *priority = linphone_chat_message_get_custom_header(imdn_message, "Priority"); + if (BC_ASSERT_PTR_NOT_NULL(priority)) + BC_ASSERT_STRING_EQUAL(priority, "non-urgent"); + } bctbx_list_free_with_data(history, (bctbx_list_free_func)linphone_chat_message_unref); } } From 95c39b0e1ac155e03a7de0094baef736c3752230 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Mon, 5 Mar 2018 14:29:01 +0100 Subject: [PATCH 199/281] Configure the conference factory uri on the proxy config instead of the core. --- coreapi/linphonecore.c | 41 ++++++++----------- coreapi/misc.c | 5 ++- coreapi/private_structs.h | 1 + coreapi/proxy.c | 21 +++++++++- include/linphone/api/c-chat-room.h | 8 ---- include/linphone/core.h | 16 +------- include/linphone/proxy_config.h | 14 +++++++ src/c-wrapper/api/c-chat-room.cpp | 21 ++++++---- .../basic-to-client-group-chat-room.cpp | 11 ++++- src/core/core-chat-room.cpp | 21 ++++++---- tester/group_chat_tester.c | 9 ++-- tester/rcfiles/marie_rc | 1 - 12 files changed, 100 insertions(+), 69 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index d82ac82ad..84ccd6461 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -5812,20 +5812,6 @@ void sip_config_uninit(LinphoneCore *lc) } if (i>=20) ms_warning("Cannot complete unregistration, giving up"); } - elem = config->proxies; - config->proxies=NULL; /*to make sure proxies cannot be refferenced during deletion*/ - bctbx_list_free_with_data(elem,(void (*)(void*)) _linphone_proxy_config_release); - - config->deleted_proxies=bctbx_list_free_with_data(config->deleted_proxies,(void (*)(void*)) _linphone_proxy_config_release); - - /*no longuer need to write proxy config if not changedlinphone_proxy_config_write_to_config_file(lc->config,NULL,i);*/ /*mark the end */ - - lc->auth_info=bctbx_list_free_with_data(lc->auth_info,(void (*)(void*))linphone_auth_info_unref); - - if (lc->vcard_context) { - linphone_vcard_context_destroy(lc->vcard_context); - } - lc->sal->reset_transports(); lc->sal->unlisten_ports(); /*to make sure no new messages are received*/ if (lc->http_provider) { @@ -5850,6 +5836,20 @@ void sip_config_uninit(LinphoneCore *lc) delete lc->sal; lc->sal=NULL; + elem = config->proxies; + config->proxies=NULL; /*to make sure proxies cannot be refferenced during deletion*/ + bctbx_list_free_with_data(elem,(void (*)(void*)) _linphone_proxy_config_release); + + config->deleted_proxies=bctbx_list_free_with_data(config->deleted_proxies,(void (*)(void*)) _linphone_proxy_config_release); + + /*no longuer need to write proxy config if not changedlinphone_proxy_config_write_to_config_file(lc->config,NULL,i);*/ /*mark the end */ + + lc->auth_info=bctbx_list_free_with_data(lc->auth_info,(void (*)(void*))linphone_auth_info_unref); + + if (lc->vcard_context) { + linphone_vcard_context_destroy(lc->vcard_context); + } + if (lc->sip_conf.guessed_contact) ms_free(lc->sip_conf.guessed_contact); if (config->contact) @@ -7042,20 +7042,15 @@ LinphoneConference *linphone_core_get_conference(LinphoneCore *lc) { return lc->conf_ctx; } -void linphone_core_set_conference_factory_uri(LinphoneCore *lc, const char *uri) { - lp_config_set_string(linphone_core_get_config(lc), "misc", "conference_factory_uri", uri); -} - -const char * linphone_core_get_conference_factory_uri(const LinphoneCore *lc) { - return lp_config_get_string(linphone_core_get_config(lc), "misc", "conference_factory_uri", nullptr); -} - void linphone_core_enable_conference_server (LinphoneCore *lc, bool_t enable) { lp_config_set_int(linphone_core_get_config(lc), "misc", "conference_server_enabled", enable); } bool_t _linphone_core_is_conference_creation (const LinphoneCore *lc, const LinphoneAddress *addr) { - const char *uri = linphone_core_get_conference_factory_uri(lc); + LinphoneProxyConfig *proxy = linphone_core_get_default_proxy_config(lc); + if (!proxy) + return FALSE; + const char *uri = linphone_proxy_config_get_conference_factory_uri(proxy); if (!uri) return FALSE; diff --git a/coreapi/misc.c b/coreapi/misc.c index b82e749bf..3e255a354 100644 --- a/coreapi/misc.c +++ b/coreapi/misc.c @@ -907,7 +907,10 @@ void linphone_core_report_call_log(LinphoneCore *lc, LinphoneCallLog *call_log){ // TODO: This is a workaround that has to be removed ASAP // Do not add calls made to the conference factory in the history - const char *conference_factory_uri = linphone_core_get_conference_factory_uri(lc); + const char *conference_factory_uri = nullptr; + LinphoneProxyConfig *proxy = linphone_core_lookup_known_proxy(lc, call_log->to); + if (proxy) + conference_factory_uri = linphone_proxy_config_get_conference_factory_uri(proxy); if (conference_factory_uri) { LinphoneAddress *conference_factory_addr = linphone_address_new(conference_factory_uri); if (linphone_address_weak_equal(call_log->to, conference_factory_addr)) { diff --git a/coreapi/private_structs.h b/coreapi/private_structs.h index d064fca03..13e0bcce5 100644 --- a/coreapi/private_structs.h +++ b/coreapi/private_structs.h @@ -131,6 +131,7 @@ struct _LinphoneProxyConfig char *refkey; char *sip_etag; /*publish context*/ + char *conference_factory_uri; }; BELLE_SIP_DECLARE_VPTR_NO_EXPORT(LinphoneProxyConfig); diff --git a/coreapi/proxy.c b/coreapi/proxy.c index 4741b355b..8eecdeaba 100644 --- a/coreapi/proxy.c +++ b/coreapi/proxy.c @@ -249,6 +249,8 @@ void _linphone_proxy_config_destroy(LinphoneProxyConfig *cfg){ if (cfg->nat_policy != NULL) { linphone_nat_policy_unref(cfg->nat_policy); } + if (cfg->conference_factory_uri) + bctbx_free(cfg->conference_factory_uri); if (cfg->ei){ linphone_error_info_unref(cfg->ei); } @@ -1089,7 +1091,7 @@ int linphone_core_get_default_proxy(LinphoneCore *lc, LinphoneProxyConfig **conf return linphone_core_get_default_proxy_config_index(lc); } -LinphoneProxyConfig * linphone_core_get_default_proxy_config(LinphoneCore *lc) { +LinphoneProxyConfig * linphone_core_get_default_proxy_config(const LinphoneCore *lc) { return lc->default_proxy; } @@ -1147,6 +1149,8 @@ void linphone_proxy_config_write_to_config_file(LpConfig *config, LinphoneProxyC lp_config_set_string(config, key, "nat_policy_ref", cfg->nat_policy->ref); linphone_nat_policy_save_to_config(cfg->nat_policy); } + + lp_config_set_string(config, key, "conference_factory_uri", cfg->conference_factory_uri); } @@ -1213,6 +1217,8 @@ LinphoneProxyConfig *linphone_proxy_config_new_from_config_file(LinphoneCore* lc cfg->nat_policy = linphone_core_create_nat_policy_from_config(lc, nat_policy_ref); } + CONFIGURE_STRING_VALUE(cfg, config, key, conference_factory_uri, "conference_factory_uri"); + return cfg; } @@ -1495,3 +1501,16 @@ void linphone_proxy_config_notify_publish_state_changed(LinphoneProxyConfig *cfg cfg->presence_publish_event = NULL; } } + +void linphone_proxy_config_set_conference_factory_uri(LinphoneProxyConfig *cfg, const char *uri) { + if (cfg->conference_factory_uri) { + bctbx_free(cfg->conference_factory_uri); + cfg->conference_factory_uri = nullptr; + } + if (uri) + cfg->conference_factory_uri = bctbx_strdup(uri); +} + +const char * linphone_proxy_config_get_conference_factory_uri(const LinphoneProxyConfig *cfg) { + return cfg->conference_factory_uri; +} diff --git a/include/linphone/api/c-chat-room.h b/include/linphone/api/c-chat-room.h index 529cca44a..0cd0761db 100644 --- a/include/linphone/api/c-chat-room.h +++ b/include/linphone/api/c-chat-room.h @@ -477,14 +477,6 @@ LINPHONE_PUBLIC void linphone_chat_room_add_compatible_participants (LinphoneCha **/ LINPHONE_PUBLIC LINPHONE_DEPRECATED LinphoneCore* linphone_chat_room_get_lc(const LinphoneChatRoom *cr); -/** - * Destroy a LinphoneChatRoom. - * @param cr #LinphoneChatRoom object - * @deprecated Use linphone_chat_room_unref() instead. - * @donotwrap - */ -LINPHONE_PUBLIC LINPHONE_DEPRECATED void linphone_chat_room_destroy(LinphoneChatRoom *cr); - /** * @} */ diff --git a/include/linphone/core.h b/include/linphone/core.h index 2dc9cf384..7ee26c5d0 100644 --- a/include/linphone/core.h +++ b/include/linphone/core.h @@ -2017,7 +2017,7 @@ LINPHONE_PUBLIC LINPHONE_DEPRECATED int linphone_core_get_default_proxy(Linphone * @param[in] lc LinphoneCore object * @return The default proxy configuration. **/ -LINPHONE_PUBLIC LinphoneProxyConfig * linphone_core_get_default_proxy_config(LinphoneCore *lc); +LINPHONE_PUBLIC LinphoneProxyConfig * linphone_core_get_default_proxy_config(const LinphoneCore *lc); /** * Sets the default proxy. @@ -4252,20 +4252,6 @@ LINPHONE_PUBLIC LinphoneStatus linphone_core_stop_conference_recording(LinphoneC */ LINPHONE_PUBLIC LinphoneConference *linphone_core_get_conference(LinphoneCore *lc); -/** - * Set the conference factory uri. - * @param[in] lc A #LinphoneCore object - * @param[in] uri The uri of the conference factory - */ -void linphone_core_set_conference_factory_uri(LinphoneCore *lc, const char *uri); - -/** - * Get the conference factory uri. - * @param[in] lc A #LinphoneCore object - * @return The uri of the conference factory - */ -const char * linphone_core_get_conference_factory_uri(const LinphoneCore *lc); - /** * Enable the conference server feature. This has the effect to listen of the conference factory uri * to create new conferences when receiving INVITE messages there. diff --git a/include/linphone/proxy_config.h b/include/linphone/proxy_config.h index ead6e6663..ec9368a34 100644 --- a/include/linphone/proxy_config.h +++ b/include/linphone/proxy_config.h @@ -585,6 +585,20 @@ LINPHONE_PUBLIC LinphoneNatPolicy * linphone_proxy_config_get_nat_policy(const L */ LINPHONE_PUBLIC void linphone_proxy_config_set_nat_policy(LinphoneProxyConfig *cfg, LinphoneNatPolicy *policy); +/** + * Set the conference factory uri. + * @param[in] cfg A #LinphoneProxyConfig object + * @param[in] uri The uri of the conference factory + */ +void linphone_proxy_config_set_conference_factory_uri(LinphoneProxyConfig *cfg, const char *uri); + +/** + * Get the conference factory uri. + * @param[in] cfg A #LinphoneProxyConfig object + * @return The uri of the conference factory + */ +const char * linphone_proxy_config_get_conference_factory_uri(const LinphoneProxyConfig *cfg); + /** * @} */ diff --git a/src/c-wrapper/api/c-chat-room.cpp b/src/c-wrapper/api/c-chat-room.cpp index 9682489ea..c0bdaeae7 100644 --- a/src/c-wrapper/api/c-chat-room.cpp +++ b/src/c-wrapper/api/c-chat-room.cpp @@ -527,10 +527,20 @@ void linphone_chat_room_set_user_data (LinphoneChatRoom *cr, void *ud) { // ============================================================================= LinphoneChatRoom *_linphone_client_group_chat_room_new (LinphoneCore *core, const char *uri, const char *subject, bool_t fallback) { - LinphoneAddress *addr = linphone_address_new(uri); - LinphoneProxyConfig *proxy = linphone_core_lookup_known_proxy(core, addr); - linphone_address_unref(addr); string from; + LinphoneProxyConfig *proxy = nullptr; + if (uri) { + LinphoneAddress *addr = linphone_address_new(uri); + proxy = linphone_core_lookup_known_proxy(core, addr); + linphone_address_unref(addr); + } else { + proxy = linphone_core_get_default_proxy_config(core); + if (!proxy) + return nullptr; + uri = linphone_proxy_config_get_conference_factory_uri(proxy); + if (!uri) + return nullptr; + } if (proxy) { const LinphoneAddress *contactAddr = linphone_proxy_config_get_contact(proxy); if (contactAddr) { @@ -569,8 +579,3 @@ LinphoneChatRoom *_linphone_server_group_chat_room_new (LinphoneCore *core, Linp L_GET_PRIVATE_FROM_C_OBJECT(cr, ServerGroupChatRoom)->confirmCreation(); return cr; } - -/* DEPRECATED */ -void linphone_chat_room_destroy (LinphoneChatRoom *cr) { - linphone_chat_room_unref(cr); -} diff --git a/src/chat/chat-room/basic-to-client-group-chat-room.cpp b/src/chat/chat-room/basic-to-client-group-chat-room.cpp index e75c56337..f350d8690 100644 --- a/src/chat/chat-room/basic-to-client-group-chat-room.cpp +++ b/src/chat/chat-room/basic-to-client-group-chat-room.cpp @@ -53,10 +53,19 @@ public: } void sendChatMessage (const shared_ptr &chatMessage) override { + L_Q(); ProxyChatRoomPrivate::sendChatMessage(chatMessage); const char *specs = linphone_core_get_linphone_specs(chatMessage->getCore()->getCCore()); time_t currentRealTime = ms_time(nullptr); - if (!linphone_core_get_conference_factory_uri(chatMessage->getCore()->getCCore()) + LinphoneAddress *lAddr = linphone_address_new( + chatMessage->getChatRoom()->getChatRoomId().getLocalAddress().asString().c_str() + ); + LinphoneProxyConfig *proxy = linphone_core_lookup_known_proxy(q->getCore()->getCCore(), lAddr); + linphone_address_unref(lAddr); + const char *conferenceFactoryUri = nullptr; + if (proxy) + conferenceFactoryUri = linphone_proxy_config_get_conference_factory_uri(proxy); + if (!conferenceFactoryUri || (chatRoom->getCapabilities() & ChatRoom::Capabilities::Conference) || clientGroupChatRoom || !specs || !strstr(specs, "groupchat") diff --git a/src/core/core-chat-room.cpp b/src/core/core-chat-room.cpp index bb0bc95d7..3350dd46c 100644 --- a/src/core/core-chat-room.cpp +++ b/src/core/core-chat-room.cpp @@ -74,9 +74,15 @@ shared_ptr CorePrivate::createBasicChatRoom ( chatRoom.reset(new RealTimeTextChatRoom(q->getSharedFromThis(), chatRoomId)); else { BasicChatRoom *basicChatRoom = new BasicChatRoom(q->getSharedFromThis(), chatRoomId); + LinphoneAddress *lAddr = linphone_address_new(chatRoomId.getLocalAddress().asString().c_str()); + LinphoneProxyConfig *proxy = linphone_core_lookup_known_proxy(q->getCCore(), lAddr); + linphone_address_unref(lAddr); + const char *conferenceFactoryUri = nullptr; + if (proxy) + conferenceFactoryUri = linphone_proxy_config_get_conference_factory_uri(proxy); if ( capabilities & ChatRoom::Capabilities::Migratable && - linphone_core_get_conference_factory_uri(q->getCCore()) && + conferenceFactoryUri && linphone_config_get_bool(linphone_core_get_config(q->getCCore()), "misc", "enable_basic_to_client_group_chat_room_migration", FALSE) ) @@ -94,14 +100,13 @@ shared_ptr CorePrivate::createBasicChatRoom ( shared_ptr CorePrivate::createClientGroupChatRoom (const string &subject, bool fallback) { L_Q(); - return L_GET_CPP_PTR_FROM_C_OBJECT( - _linphone_client_group_chat_room_new( - q->getCCore(), - linphone_core_get_conference_factory_uri(q->getCCore()), - L_STRING_TO_C(subject), - fallback ? TRUE : FALSE - ) + LinphoneChatRoom *lcr = _linphone_client_group_chat_room_new( + q->getCCore(), + nullptr, + L_STRING_TO_C(subject), + fallback ? TRUE : FALSE ); + return lcr ? L_GET_CPP_PTR_FROM_C_OBJECT(lcr) : nullptr; } void CorePrivate::insertChatRoom (const shared_ptr &chatRoom) { diff --git a/tester/group_chat_tester.c b/tester/group_chat_tester.c index 20295fb6e..84675be75 100644 --- a/tester/group_chat_tester.c +++ b/tester/group_chat_tester.c @@ -133,7 +133,8 @@ static void configure_core_for_conference (LinphoneCore *core, const char* usern bctbx_free(newIdentity); linphone_core_enable_conference_server(core, server); char *factoryUri = linphone_address_as_string(factoryAddr); - linphone_core_set_conference_factory_uri(core, factoryUri); + LinphoneProxyConfig *proxy = linphone_core_get_default_proxy_config(core); + linphone_proxy_config_set_conference_factory_uri(proxy, factoryUri); bctbx_free(factoryUri); linphone_core_set_linphone_specs(core, "groupchat"); } @@ -2264,11 +2265,12 @@ static void group_chat_room_migrate_from_basic_chat_room (void) { // Enable chat room migration and restart core for Marie _linphone_chat_room_enable_migration(marieCr, TRUE); coresList = bctbx_list_remove(coresList, marie->lc); - linphone_core_manager_restart(marie, TRUE); + linphone_core_manager_reinit(marie); bctbx_list_t *tmpCoresManagerList = bctbx_list_append(NULL, marie); init_core_for_conference(tmpCoresManagerList); bctbx_list_free(tmpCoresManagerList); coresList = bctbx_list_append(coresList, marie->lc); + linphone_core_manager_start(marie, TRUE); // Send a new message to initiate chat room migration marieCr = linphone_core_get_chat_room(marie->lc, paulineAddr); @@ -2364,11 +2366,12 @@ static void group_chat_room_migrate_from_basic_to_client_fail (void) { // Enable chat room migration and restart core for Marie _linphone_chat_room_enable_migration(marieCr, TRUE); coresList = bctbx_list_remove(coresList, marie->lc); - linphone_core_manager_restart(marie, TRUE); + linphone_core_manager_reinit(marie); bctbx_list_t *tmpCoresManagerList = bctbx_list_append(NULL, marie); init_core_for_conference(tmpCoresManagerList); bctbx_list_free(tmpCoresManagerList); coresList = bctbx_list_append(coresList, marie->lc); + linphone_core_manager_start(marie, TRUE); // Send a new message to initiate chat room migration LinphoneAddress *paulineAddr = linphone_address_new(linphone_core_get_identity(pauline->lc)); diff --git a/tester/rcfiles/marie_rc b/tester/rcfiles/marie_rc index 282cc9cc0..ce4c4877f 100644 --- a/tester/rcfiles/marie_rc +++ b/tester/rcfiles/marie_rc @@ -28,7 +28,6 @@ pol=accept subscribe=0 [misc] -conference_factory_uri=sip:conference-factory@conf.example.org enable_basic_to_client_group_chat_room_migration=1 basic_to_client_group_chat_room_migration_timer=10 From 32b565265cdbe155b3fa0ca74a6cd5f194b575ca Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Mon, 5 Mar 2018 15:18:41 +0100 Subject: [PATCH 200/281] Do not check admin status for one-to-one chat room in group chat testers. --- tester/group_chat_tester.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tester/group_chat_tester.c b/tester/group_chat_tester.c index 84675be75..de46a8172 100644 --- a/tester/group_chat_tester.c +++ b/tester/group_chat_tester.c @@ -262,7 +262,8 @@ static LinphoneChatRoom * check_creation_chat_room_client_side(bctbx_list_t *lcs BC_ASSERT_EQUAL(linphone_chat_room_get_nb_participants(chatRoom), participantNumber, int, "%d"); LinphoneParticipant *participant = linphone_chat_room_get_me(chatRoom); BC_ASSERT_PTR_NOT_NULL(participant); - BC_ASSERT(isAdmin == linphone_participant_is_admin(participant)); + if (!(linphone_chat_room_get_capabilities(chatRoom) & LinphoneChatRoomCapabilitiesOneToOne)) + BC_ASSERT(isAdmin == linphone_participant_is_admin(participant)); BC_ASSERT_STRING_EQUAL(linphone_chat_room_get_subject(chatRoom), subject); } return chatRoom; From 4b111911ed77a657a11c129cb207f1f20c0d6b11 Mon Sep 17 00:00:00 2001 From: Benjamin Reis Date: Mon, 5 Mar 2018 15:36:38 +0100 Subject: [PATCH 201/281] check capabilities before addresses to compare faster --- src/core/core-chat-room.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/core/core-chat-room.cpp b/src/core/core-chat-room.cpp index 3350dd46c..6def1428b 100644 --- a/src/core/core-chat-room.cpp +++ b/src/core/core-chat-room.cpp @@ -199,19 +199,19 @@ shared_ptr Core::findOneToOneChatRoom ( // One to one client group chat room // The only participant's address must match the participantAddress argument if ( + (capabilities & ChatRoom::Capabilities::Conference) && + !chatRoom->getParticipants().empty() && localAddress == curLocalAddress && - ! chatRoom->getParticipants().empty() && - participantAddress.getAddressWithoutGruu() == chatRoom->getParticipants().front()->getAddress() && - (capabilities & ChatRoom::Capabilities::Conference) + participantAddress.getAddressWithoutGruu() == chatRoom->getParticipants().front()->getAddress() ) return chatRoom; // One to one basic chat room (addresses without gruu) // The peer address must match the participantAddress argument if ( + (capabilities & ChatRoom::Capabilities::Basic) && localAddress.getAddressWithoutGruu() == curLocalAddress.getAddressWithoutGruu() && - participantAddress.getAddressWithoutGruu() == chatRoom->getPeerAddress().getAddressWithoutGruu() && - (capabilities & ChatRoom::Capabilities::Basic) + participantAddress.getAddressWithoutGruu() == chatRoom->getPeerAddress().getAddressWithoutGruu() ) return chatRoom; } From 556fb1a6fad3f3e8f73ffa804ae3e1dc411c2dec Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Mon, 5 Mar 2018 17:16:38 +0100 Subject: [PATCH 202/281] Add test reproducing an issue where a one-to-one chatroom is recreated while some inactivate devices have not yet joined the chatroom. --- tester/group_chat_tester.c | 87 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/tester/group_chat_tester.c b/tester/group_chat_tester.c index de46a8172..083a2a3ee 100644 --- a/tester/group_chat_tester.c +++ b/tester/group_chat_tester.c @@ -2760,6 +2760,92 @@ static void group_chat_room_unique_one_to_one_chat_room_recreated_from_message_w group_chat_room_unique_one_to_one_chat_room_recreated_from_message_base(TRUE); } +static void group_chat_room_unique_one_to_one_chat_room_recreated_from_message_2 (void) { + LinphoneCoreManager *marie = linphone_core_manager_create("marie_rc"); + LinphoneCoreManager *pauline = linphone_core_manager_create("pauline_rc"); + /*create a second device for marie, but it is inactive after registration in this test*/ + LinphoneCoreManager *marie2 = linphone_core_manager_create("marie_rc"); + /*Create a seconde device for pauline, but again inactivate after registration*/ + LinphoneCoreManager *pauline2 = linphone_core_manager_create("marie_rc"); + bctbx_list_t *coresManagerList = NULL; + bctbx_list_t *participantsAddresses = NULL; + coresManagerList = bctbx_list_append(coresManagerList, marie); + coresManagerList = bctbx_list_append(coresManagerList, pauline); + coresManagerList = bctbx_list_append(coresManagerList, marie2); + coresManagerList = bctbx_list_append(coresManagerList, pauline2); + bctbx_list_t *coresList = init_core_for_conference(coresManagerList); + start_core_for_conference(coresManagerList); + participantsAddresses = bctbx_list_append(participantsAddresses, linphone_address_new(linphone_core_get_identity(pauline->lc))); + stats initialMarieStats = marie->stat; + stats initialPaulineStats = pauline->stat; + + + linphone_core_set_network_reachable(marie2->lc, FALSE); + linphone_core_set_network_reachable(pauline2->lc, FALSE); + + // Marie creates a new group chat room + const char *initialSubject = "Pauline"; + LinphoneChatRoom *marieCr = create_chat_room_client_side(coresList, marie, &initialMarieStats, participantsAddresses, initialSubject, -1); + BC_ASSERT_TRUE(linphone_chat_room_get_capabilities(marieCr) & LinphoneChatRoomCapabilitiesOneToOne); + + LinphoneAddress *confAddr = linphone_address_clone(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); + BC_ASSERT_TRUE(linphone_chat_room_get_capabilities(paulineCr) & LinphoneChatRoomCapabilitiesOneToOne); + + // Marie sends a message + const char *message = "Hello"; + _send_message(marieCr, message); + BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneMessageDelivered, initialMarieStats.number_of_LinphoneMessageDelivered + 1, 10000)); + BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneMessageReceived, initialPaulineStats.number_of_LinphoneMessageReceived + 1, 10000)); + BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(pauline->stat.last_received_chat_message), message); + + // Marie deletes the chat room + linphone_core_manager_delete_chat_room(marie, marieCr, coresList); + wait_for_list(coresList, 0, 1, 2000); + BC_ASSERT_EQUAL(pauline->stat.number_of_participants_removed, initialPaulineStats.number_of_participants_removed, int, "%d"); + + // Marie sends a new message + participantsAddresses = NULL; + participantsAddresses = bctbx_list_append(participantsAddresses, linphone_address_new(linphone_core_get_identity(pauline->lc))); + initialMarieStats = marie->stat; + initialPaulineStats = pauline->stat; + marieCr = create_chat_room_client_side(coresList, marie, &initialMarieStats, participantsAddresses, initialSubject, -1); + // Check that the chat room has been correctly recreated on Marie's side + marieCr = check_creation_chat_room_client_side(coresList, marie, &initialMarieStats, confAddr, initialSubject, 1, FALSE); + if (BC_ASSERT_PTR_NOT_NULL(marieCr)){ + BC_ASSERT_TRUE(linphone_chat_room_get_capabilities(marieCr) & LinphoneChatRoomCapabilitiesOneToOne); + + message = "Hey you"; + _send_message(marieCr, message); + BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneMessageDelivered, initialMarieStats.number_of_LinphoneMessageDelivered + 1, 10000)); + BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneMessageReceived, initialPaulineStats.number_of_LinphoneMessageReceived + 1, 10000)); + BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(pauline->stat.last_received_chat_message), message); + + // Clean db from chat room + linphone_core_manager_delete_chat_room(marie, marieCr, coresList); + } + linphone_core_manager_delete_chat_room(pauline, paulineCr, coresList); + + wait_for_list(coresList, 0, 1, 2000); + BC_ASSERT_EQUAL(linphone_core_get_call_history_size(marie->lc), 0, int,"%i"); + BC_ASSERT_EQUAL(linphone_core_get_call_history_size(pauline->lc), 0, int,"%i"); + BC_ASSERT_PTR_NULL(linphone_core_get_call_logs(marie->lc)); + BC_ASSERT_PTR_NULL(linphone_core_get_call_logs(pauline->lc)); + + linphone_address_unref(confAddr); + bctbx_list_free(coresList); + bctbx_list_free(coresManagerList); + linphone_core_set_network_reachable(marie2->lc, TRUE); + linphone_core_set_network_reachable(pauline2->lc, TRUE); + linphone_core_manager_destroy(marie); + linphone_core_manager_destroy(pauline); + linphone_core_manager_destroy(marie2); + linphone_core_manager_destroy(pauline2); +} + + static void group_chat_room_join_one_to_one_chat_room_with_a_new_device (void) { LinphoneCoreManager *marie1 = linphone_core_manager_create("marie_rc"); LinphoneCoreManager *pauline = linphone_core_manager_create("pauline_rc"); @@ -3099,6 +3185,7 @@ test_t group_chat_tests[] = { TEST_TWO_TAGS("Unique one-to-one chatroom recreated from message with app restart", group_chat_room_unique_one_to_one_chat_room_recreated_from_message_with_app_restart, "Server", "LeaksMemory"), TEST_TWO_TAGS("Join one-to-one chat room with a new device", group_chat_room_join_one_to_one_chat_room_with_a_new_device, "Server", "LeaksMemory"), TEST_TWO_TAGS("New unique one-to-one chatroom after both participants left", group_chat_room_new_unique_one_to_one_chat_room_after_both_participants_left, "Server", "LeaksMemory"), + TEST_TWO_TAGS("Unique one-to-one chatroom re-created from the party that deleted it, with inactive devices", group_chat_room_unique_one_to_one_chat_room_recreated_from_message_2, "Server", "LeaksMemory"), TEST_TWO_TAGS("IMDN for group chat room", imdn_for_group_chat_room, "Server", "LeaksMemory"), TEST_TWO_TAGS("Find one to one chat room", find_one_to_one_chat_room, "Server", "LeaksMemory") }; From 76342c715f37e210b20ea4df9977bef027c142f5 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Fri, 2 Mar 2018 15:41:56 +0100 Subject: [PATCH 203/281] feat(MainDb): reworking, better code (performance and fixes) --- src/CMakeLists.txt | 24 +- src/address/address.h | 7 + src/address/identity-address.h | 7 + src/chat/chat-room/chat-room-id.h | 5 + src/core/core-chat-room.cpp | 6 +- src/db/abstract/abstract-db-p.h | 2 - src/db/abstract/abstract-db.cpp | 60 +- src/db/abstract/abstract-db.h | 2 +- ...b-exception-handler.h => db-transaction.h} | 32 +- src/db/internal/statements.cpp | 54 +- src/db/internal/statements.h | 9 +- src/db/main-db-p.h | 85 +- src/db/main-db.cpp | 1010 ++++++----------- src/db/main-db.h | 6 +- src/db/session/db-session.cpp | 116 +- src/db/session/db-session.h | 15 +- 16 files changed, 520 insertions(+), 920 deletions(-) rename src/db/internal/{db-exception-handler.h => db-transaction.h} (82%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fec6c0eda..fbca16af0 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -106,6 +106,8 @@ set(LINPHONE_CXX_OBJECTS_PRIVATE_HEADER_FILES core/platform-helpers/platform-helpers.h db/abstract/abstract-db-p.h db/abstract/abstract-db.h + db/internal/db-transaction.h + db/internal/statements.h db/main-db-chat-message-key.h db/main-db-event-key.h db/main-db-key-p.h @@ -225,6 +227,7 @@ set(LINPHONE_CXX_OBJECTS_SOURCE_FILES core/paths/paths.cpp core/platform-helpers/platform-helpers.cpp db/abstract/abstract-db.cpp + db/internal/statements.cpp db/main-db-chat-message-key.cpp db/main-db-event-key.cpp db/main-db-key.cpp @@ -284,24 +287,15 @@ elseif (UNIX) list(APPEND LINPHONE_CXX_OBJECTS_PRIVATE_HEADER_FILES core/paths/paths-linux.h) endif () -set(LINPHONE_CXX_OBJECTS_INCLUDE_DIRS ${BELR_INCLUDE_DIRS} ${LIBXSD_INCLUDE_DIRS}) +set(LINPHONE_CXX_OBJECTS_INCLUDE_DIRS + ${BELR_INCLUDE_DIRS} + ${LIBXSD_INCLUDE_DIRS} + ${SOCI_INCLUDE_DIRS} + ${SOCI_MYSQL_INCLUDES} +) set(LINPHONE_CXX_OBJECTS_DEFINITIONS "-DLIBLINPHONE_EXPORTS") set(LINPHONE_CXX_OBJECTS_INCLUDE_DIRS ${BELR_INCLUDE_DIRS}) -if (SOCI_FOUND) - list(APPEND LINPHONE_CXX_OBJECTS_INCLUDE_DIRS ${SOCI_INCLUDE_DIRS} ${SOCI_MYSQL_INCLUDES}) - add_definitions(-DSOCI_ENABLED) - - list(APPEND LINPHONE_CXX_OBJECTS_PRIVATE_HEADER_FILES - db/internal/db-exception-handler.h - db/internal/statements.h - ) - - list(APPEND LINPHONE_CXX_OBJECTS_SOURCE_FILES - db/internal/statements.cpp - ) -endif () - set(LINPHONE_PRIVATE_HEADER_FILES) foreach (header ${LINPHONE_CXX_OBJECTS_PRIVATE_HEADER_FILES}) list(APPEND LINPHONE_PRIVATE_HEADER_FILES "${CMAKE_CURRENT_SOURCE_DIR}/${header}") diff --git a/src/address/address.h b/src/address/address.h index cccca9ac8..f92300277 100644 --- a/src/address/address.h +++ b/src/address/address.h @@ -20,6 +20,8 @@ #ifndef _L_ADDRESS_H_ #define _L_ADDRESS_H_ +#include + #include "enums.h" #include "object/clonable-object.h" @@ -107,6 +109,11 @@ private: L_DECLARE_PRIVATE(Address); }; +inline std::ostream &operator<< (std::ostream &os, const Address &address) { + os << "Address(" << address.asString() << ")"; + return os; +} + LINPHONE_END_NAMESPACE #endif // ifndef _L_ADDRESS_H_ diff --git a/src/address/identity-address.h b/src/address/identity-address.h index 58afd9ff4..2e39b959b 100644 --- a/src/address/identity-address.h +++ b/src/address/identity-address.h @@ -20,6 +20,8 @@ #ifndef _L_IDENTITY_ADDRESS_H_ #define _L_IDENTITY_ADDRESS_H_ +#include + #include "object/clonable-object.h" // ============================================================================= @@ -65,6 +67,11 @@ private: L_DECLARE_PRIVATE(IdentityAddress); }; +inline std::ostream &operator<< (std::ostream &os, const IdentityAddress &identityAddress) { + os << "IdentityAddress(" << identityAddress.asString() << ")"; + return os; +} + LINPHONE_END_NAMESPACE #endif // ifndef _L_IDENTITY_ADDRESS_H_ diff --git a/src/chat/chat-room/chat-room-id.h b/src/chat/chat-room/chat-room-id.h index c82dd0da4..1751a6820 100644 --- a/src/chat/chat-room/chat-room-id.h +++ b/src/chat/chat-room/chat-room-id.h @@ -50,6 +50,11 @@ private: L_DECLARE_PRIVATE(ChatRoomId); }; +inline std::ostream &operator<< (std::ostream &os, const ChatRoomId &chatRoomId) { + os << "ChatRoomId(" << chatRoomId.getPeerAddress() << ", local=" << chatRoomId.getLocalAddress() << ")"; + return os; +} + LINPHONE_END_NAMESPACE // Add map key support. diff --git a/src/core/core-chat-room.cpp b/src/core/core-chat-room.cpp index 6def1428b..1084d48e6 100644 --- a/src/core/core-chat-room.cpp +++ b/src/core/core-chat-room.cpp @@ -162,10 +162,8 @@ shared_ptr Core::findChatRoom (const ChatRoomId &chatRoomId) c if (it != d->chatRoomsById.cend()) return it->second; - lInfo() << "Unable to find chat room in RAM: (peer=" << - chatRoomId.getPeerAddress().asString() << ", local=" << chatRoomId.getLocalAddress().asString() << ")."; - - return shared_ptr(); + lInfo() << "Unable to find chat room in RAM: " << chatRoomId << "."; + return nullptr; } list> Core::findChatRooms (const IdentityAddress &peerAddress) const { diff --git a/src/db/abstract/abstract-db-p.h b/src/db/abstract/abstract-db-p.h index d596d7b8d..4064c5408 100644 --- a/src/db/abstract/abstract-db-p.h +++ b/src/db/abstract/abstract-db-p.h @@ -30,8 +30,6 @@ LINPHONE_BEGIN_NAMESPACE class AbstractDbPrivate : public ObjectPrivate { public: - AbstractDbPrivate () = default; - DbSession dbSession; private: diff --git a/src/db/abstract/abstract-db.cpp b/src/db/abstract/abstract-db.cpp index bf56b954d..18531439a 100644 --- a/src/db/abstract/abstract-db.cpp +++ b/src/db/abstract/abstract-db.cpp @@ -21,9 +21,9 @@ #include #endif // ifdef __APPLE__ -#if defined(SOCI_ENABLED) && (TARGET_OS_IPHONE || defined(__ANDROID__)) +#if (TARGET_OS_IPHONE || defined(__ANDROID__)) #include -#endif // if defined(SOCI_ENABLED) && (TARGET_OS_IPHONE || defined(__ANDROID__)) +#endif // if (TARGET_OS_IPHONE || defined(__ANDROID__)) #include "abstract-db-p.h" #include "logger/logger.h" @@ -34,22 +34,20 @@ using namespace std; LINPHONE_BEGIN_NAMESPACE -#if defined(SOCI_ENABLED) && (TARGET_OS_IPHONE || defined(__ANDROID__)) +#if (TARGET_OS_IPHONE || defined(__ANDROID__)) // Force static sqlite3 linking for IOS and Android. extern "C" void register_factory_sqlite3(); static void sqlite3Log (void *, int iErrCode, const char *zMsg) { lInfo() << "[sqlite3][" << iErrCode << "]" << zMsg; } -#endif // if defined(SOCI_ENABLED) && (TARGET_OS_IPHONE || defined(__ANDROID__)) +#endif // if (TARGET_OS_IPHONE || defined(__ANDROID__)) void AbstractDbPrivate::safeInit () { - #ifdef SOCI_ENABLED - L_Q(); - dbSession.enableForeignKeys(false); - q->init(); - dbSession.enableForeignKeys(true); - #endif // ifdef SOCI_ENABLED + L_Q(); + dbSession.enableForeignKeys(false); + q->init(); + dbSession.enableForeignKeys(true); } AbstractDb::AbstractDb (AbstractDbPrivate &p) : Object(p) {} @@ -57,7 +55,7 @@ AbstractDb::AbstractDb (AbstractDbPrivate &p) : Object(p) {} bool AbstractDb::connect (Backend backend, const string ¶meters) { L_D(); - #if defined(SOCI_ENABLED) && (TARGET_OS_IPHONE || defined(__ANDROID__)) + #if (TARGET_OS_IPHONE || defined(__ANDROID__)) if (backend == Sqlite3) { static bool registered = false; if (!registered) { @@ -66,7 +64,7 @@ bool AbstractDb::connect (Backend backend, const string ¶meters) { sqlite3_config(SQLITE_CONFIG_LOG, sqlite3Log, nullptr); } } - #endif // if defined(SOCI_ENABLED) && (TARGET_OS_IPHONE || defined(__ANDROID__)) + #endif // if (TARGET_OS_IPHONE || defined(__ANDROID__)) d->backend = backend; d->dbSession = DbSession( @@ -99,30 +97,28 @@ bool AbstractDb::forceReconnect () { return false; } - #ifdef SOCI_ENABLED - constexpr int retryCount = 2; - lInfo() << "Trying sql backend reconnect..."; + constexpr int retryCount = 2; + lInfo() << "Trying sql backend reconnect..."; - try { - for (int i = 0; i < retryCount; ++i) { - try { - lInfo() << "Reconnect... Try: " << i; - d->dbSession.getBackendSession()->reconnect(); // Equivalent to close and connect. - d->safeInit(); - lInfo() << "Database reconnection successful!"; - return true; - } catch (const soci::soci_error &e) { - if (e.get_error_category() != soci::soci_error::connection_error) - throw e; - } + try { + for (int i = 0; i < retryCount; ++i) { + try { + lInfo() << "Reconnect... Try: " << i; + d->dbSession.getBackendSession()->reconnect(); // Equivalent to close and connect. + d->safeInit(); + lInfo() << "Database reconnection successful!"; + return true; + } catch (const soci::soci_error &e) { + if (e.get_error_category() != soci::soci_error::connection_error) + throw e; } - } catch (const exception &e) { - lError() << "Unable to reconnect: `" << e.what() << "`."; - return false; } + } catch (const exception &e) { + lError() << "Unable to reconnect: `" << e.what() << "`."; + return false; + } - lError() << "Database reconnection failed!"; - #endif // ifdef SOCI_ENABLED + lError() << "Database reconnection failed!"; return false; } diff --git a/src/db/abstract/abstract-db.h b/src/db/abstract/abstract-db.h index 1d612b58b..a6b401dd8 100644 --- a/src/db/abstract/abstract-db.h +++ b/src/db/abstract/abstract-db.h @@ -28,7 +28,7 @@ LINPHONE_BEGIN_NAMESPACE class AbstractDbPrivate; -class LINPHONE_PUBLIC AbstractDb : public Object { +class AbstractDb : public Object { public: enum Backend { Mysql, diff --git a/src/db/internal/db-exception-handler.h b/src/db/internal/db-transaction.h similarity index 82% rename from src/db/internal/db-exception-handler.h rename to src/db/internal/db-transaction.h index 74084a7ac..dbb57fa12 100644 --- a/src/db/internal/db-exception-handler.h +++ b/src/db/internal/db-transaction.h @@ -1,5 +1,5 @@ /* - * db-exception-handler.h + * db-transaction.h * Copyright (C) 2010-2018 Belledonne Communications SARL * * This program is free software; you can redistribute it and/or @@ -17,20 +17,18 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#ifndef _L_DB_EXCEPTION_HANDLER_H_ -#define _L_DB_EXCEPTION_HANDLER_H_ - -#include +#ifndef _L_DB_TRANSACTION_H_ +#define _L_DB_TRANSACTION_H_ #include "db/main-db-p.h" #include "logger/logger.h" // ============================================================================= -#define L_DB_EXCEPTION_HANDLER_C(CONTEXT) \ - LinphonePrivate::DbExceptionHandlerInfo().set(__func__, CONTEXT) * [&](SmartTransaction &tr) +#define L_DB_TRANSACTION_C(CONTEXT) \ + LinphonePrivate::DbTransactionInfo().set(__func__, CONTEXT) * [&](SmartTransaction &tr) -#define L_DB_EXCEPTION_HANDLER L_DB_EXCEPTION_HANDLER_C(this) +#define L_DB_TRANSACTION L_DB_TRANSACTION_C(this) LINPHONE_BEGIN_NAMESPACE @@ -68,8 +66,8 @@ private: L_DISABLE_COPY(SmartTransaction); }; -struct DbExceptionHandlerInfo { - DbExceptionHandlerInfo &set (const char *_name, const MainDb *_mainDb) { +struct DbTransactionInfo { + DbTransactionInfo &set (const char *_name, const MainDb *_mainDb) { name = _name; mainDb = const_cast(_mainDb); return *this; @@ -80,7 +78,7 @@ struct DbExceptionHandlerInfo { }; template -class DbExceptionHandler { +class DbTransaction { using InternalReturnType = typename std::remove_reference< decltype(std::declval()(std::declval())) >::type; @@ -92,7 +90,7 @@ public: InternalReturnType >::type; - DbExceptionHandler (DbExceptionHandlerInfo &info, Function &&function) : mFunction(std::move(function)) { + DbTransaction (DbTransactionInfo &info, Function &&function) : mFunction(std::move(function)) { MainDb *mainDb = info.mainDb; const char *name = info.name; soci::session *session = mainDb->getPrivate()->dbSession.getBackendSession(); @@ -122,7 +120,7 @@ public: } } - DbExceptionHandler (DbExceptionHandler &&dbExceptionHandler) : mFunction(std::move(dbExceptionHandler.mFunction)) {} + DbTransaction (DbTransaction &&DbTransaction) : mFunction(std::move(DbTransaction.mFunction)) {} operator ReturnType () const { return mResult; @@ -170,14 +168,14 @@ private: Function mFunction; ReturnType mResult{}; - L_DISABLE_COPY(DbExceptionHandler); + L_DISABLE_COPY(DbTransaction); }; template -typename DbExceptionHandler::ReturnType operator* (DbExceptionHandlerInfo &info, Function &&function) { - return DbExceptionHandler(info, std::forward(function)); +typename DbTransaction::ReturnType operator* (DbTransactionInfo &info, Function &&function) { + return DbTransaction(info, std::forward(function)); } LINPHONE_END_NAMESPACE -#endif // ifndef _L_DB_EXCEPTION_HANDLER_H_ +#endif // ifndef _L_DB_TRANSACTION_H_ diff --git a/src/db/internal/statements.cpp b/src/db/internal/statements.cpp index b0bf05cc8..6b6754228 100644 --- a/src/db/internal/statements.cpp +++ b/src/db/internal/statements.cpp @@ -50,42 +50,11 @@ namespace Statements { const char *mSql[2]; }; - // --------------------------------------------------------------------------- - // Create statements. - // --------------------------------------------------------------------------- - - constexpr AbstractStatement create[CreateCount] = { - [CreateConferenceEventView] = { { - Backend::Sqlite3, R"( - CREATE VIEW IF NOT EXISTS conference_event_view AS - SELECT id, type, creation_time, chat_room_id, from_sip_address_id, to_sip_address_id, time, imdn_message_id, state, direction, is_secured, notify_id, device_sip_address_id, participant_sip_address_id, subject - FROM event - LEFT JOIN conference_event ON conference_event.event_id = event.id - LEFT JOIN conference_chat_message_event ON conference_chat_message_event.event_id = event.id - LEFT JOIN conference_notified_event ON conference_notified_event.event_id = event.id - LEFT JOIN conference_participant_device_event ON conference_participant_device_event.event_id = event.id - LEFT JOIN conference_participant_event ON conference_participant_event.event_id = event.id - LEFT JOIN conference_subject_event ON conference_subject_event.event_id = event.id - )" }, { - Backend::Mysql, R"( - CREATE OR REPLACE VIEW conference_event_view AS - SELECT id, type, creation_time, chat_room_id, from_sip_address_id, to_sip_address_id, time, imdn_message_id, state, direction, is_secured, notify_id, device_sip_address_id, participant_sip_address_id, subject - FROM event - LEFT JOIN conference_event ON conference_event.event_id = event.id - LEFT JOIN conference_chat_message_event ON conference_chat_message_event.event_id = event.id - LEFT JOIN conference_notified_event ON conference_notified_event.event_id = event.id - LEFT JOIN conference_participant_device_event ON conference_participant_device_event.event_id = event.id - LEFT JOIN conference_participant_event ON conference_participant_event.event_id = event.id - LEFT JOIN conference_subject_event ON conference_subject_event.event_id = event.id - )" - } } - }; - // --------------------------------------------------------------------------- // Select statements. // --------------------------------------------------------------------------- - constexpr AbstractStatement select[SelectCount] = { + constexpr const char *select[SelectCount] = { [SelectSipAddressId] = R"( SELECT id FROM sip_address @@ -111,6 +80,19 @@ namespace Statements { AND participant_b_sip_address_id IN (:3, :4) )", + [SelectConferenceEvent] = R"( + SELECT conference_event_view.id AS event_id, type, conference_event_view.creation_time, from_sip_address.value, to_sip_address.value, time, imdn_message_id, state, direction, is_secured, notify_id, device_sip_address.value, participant_sip_address.value, conference_event_view.subject, peer_sip_address.value, local_sip_address.value + FROM conference_event_view + JOIN chat_room ON chat_room.id = chat_room_id + JOIN sip_address AS peer_sip_address ON peer_sip_address.id = peer_sip_address_id + JOIN sip_address AS local_sip_address ON local_sip_address.id = local_sip_address_id + LEFT JOIN sip_address AS from_sip_address ON from_sip_address.id = from_sip_address_id + LEFT JOIN sip_address AS to_sip_address ON to_sip_address.id = to_sip_address_id + LEFT JOIN sip_address AS device_sip_address ON device_sip_address.id = device_sip_address_id + LEFT JOIN sip_address AS participant_sip_address ON participant_sip_address.id = participant_sip_address_id + WHERE event_id = :1 + )", + [SelectConferenceEvents] = R"( SELECT conference_event_view.id AS event_id, type, creation_time, from_sip_address.value, to_sip_address.value, time, imdn_message_id, state, direction, is_secured, notify_id, device_sip_address.value, participant_sip_address.value, subject FROM conference_event_view @@ -138,12 +120,8 @@ namespace Statements { // Getters. // --------------------------------------------------------------------------- - const char *get (Create createStmt, AbstractDb::Backend backend) { - return createStmt >= Create::CreateCount ? nullptr : create[createStmt].get(backend); - } - - const char *get (Select selectStmt, AbstractDb::Backend backend) { - return selectStmt >= Select::SelectCount ? nullptr : select[selectStmt].get(backend); + const char *get (Select selectStmt) { + return selectStmt >= Select::SelectCount ? nullptr : select[selectStmt]; } const char *get (Insert insertStmt, AbstractDb::Backend backend) { diff --git a/src/db/internal/statements.h b/src/db/internal/statements.h index bc14a1b92..4f518ccad 100644 --- a/src/db/internal/statements.h +++ b/src/db/internal/statements.h @@ -27,16 +27,12 @@ LINPHONE_BEGIN_NAMESPACE namespace Statements { - enum Create { - CreateConferenceEventView, - CreateCount - }; - enum Select { SelectSipAddressId, SelectChatRoomId, SelectChatRoomParticipantId, SelectOneToOneChatRoomId, + SelectConferenceEvent, SelectConferenceEvents, SelectCount }; @@ -46,8 +42,7 @@ namespace Statements { InsertCount }; - const char *get (Create createStmt, AbstractDb::Backend backend); - const char *get (Select selectStmt, AbstractDb::Backend backend); + const char *get (Select selectStmt); const char *get (Insert insertStmt, AbstractDb::Backend backend); } diff --git a/src/db/main-db-p.h b/src/db/main-db-p.h index 4c9e263ab..8a8a52ad1 100644 --- a/src/db/main-db-p.h +++ b/src/db/main-db-p.h @@ -22,6 +22,8 @@ #include +#include "linphone/utils/utils.h" + #include "abstract/abstract-db-p.h" #include "event-log/event-log.h" #include "main-db.h" @@ -38,12 +40,18 @@ public: mutable std::unordered_map> storageIdToChatMessage; private: + // --------------------------------------------------------------------------- + // Misc helpers. + // --------------------------------------------------------------------------- + + std::shared_ptr findChatRoom (const ChatRoomId &chatRoomId) const; + // --------------------------------------------------------------------------- // Low level API. // --------------------------------------------------------------------------- long long insertSipAddress (const std::string &sipAddress); - void insertContent (long long messageEventId, const Content &content); + void insertContent (long long chatMessageId, const Content &content); long long insertContentType (const std::string &contentType); long long insertOrUpdateImportedBasicChatRoom ( long long peerSipAddressId, @@ -53,7 +61,7 @@ private: long long insertChatRoom (const std::shared_ptr &chatRoom); long long insertChatRoomParticipant (long long chatRoomId, long long participantSipAddressId, bool isAdmin); void insertChatRoomParticipantDevice (long long participantId, long long participantDeviceSipAddressId); - void insertChatMessageParticipant (long long messageEventId, long long sipAddressId, int state); + void insertChatMessageParticipant (long long chatMessageId, long long sipAddressId, int state); long long selectSipAddressId (const std::string &sipAddress) const; long long selectChatRoomId (long long peerSipAddressId, long long localSipAddressId) const; @@ -61,7 +69,7 @@ private: long long selectChatRoomParticipantId (long long chatRoomId, long long participantSipAddressId) const; long long selectOneToOneChatRoomId (long long sipAddressIdA, long long sipAddressIdB) const; - void deleteContents (long long messageEventId); + void deleteContents (long long chatMessageId); void deleteChatRoomParticipant (long long chatRoomId, long long participantSipAddressId); void deleteChatRoomParticipantDevice (long long participantId, long long participantDeviceSipAddressId); @@ -69,68 +77,65 @@ private: // Events API. // --------------------------------------------------------------------------- + long long getConferenceEventIdFromRow (const soci::row &row) const { + return dbSession.resolveId(row, -1); + } + + time_t getConferenceEventCreationTimeFromRow (const soci::row &row) const { + return Utils::getTmAsTimeT(row.get(2)); + } + + unsigned int getConferenceEventNotifyIdFromRow (const soci::row &row) const { + L_Q(); + return q->getBackend() == MainDb::Backend::Mysql + ? row.get(10, 0) + : static_cast(row.get(10, 0)); + } + std::shared_ptr selectGenericConferenceEvent ( - long long eventId, - EventLog::Type type, - time_t creationTime, - const ChatRoomId &chatRoomId + const std::shared_ptr &chatRoom, + const soci::row &row + ) const; + + std::shared_ptr selectGenericConferenceNotifiedEvent ( + const ChatRoomId &chatRoomId, + const soci::row &row ) const; std::shared_ptr selectConferenceEvent ( - long long eventId, + const ChatRoomId &chatRoomId, EventLog::Type type, - time_t creationTime, - const ChatRoomId &chatRoomId + const soci::row &row ) const; std::shared_ptr selectConferenceCallEvent ( - long long eventId, + const ChatRoomId &chatRoomId, EventLog::Type type, - time_t creationTime, - const ChatRoomId &chatRoomId + const soci::row &row ) const; std::shared_ptr selectConferenceChatMessageEvent ( - long long eventId, + const std::shared_ptr &chatRoom, EventLog::Type type, - time_t creationTime, - const ChatRoomId &chatRoomId - ) const; - - // TODO: Remove me. Workaround to increase fetch performance. - std::shared_ptr selectConferenceChatMessageEvent ( - long long eventId, - EventLog::Type type, - time_t creationTime, - std::shared_ptr &chatRoom, - const std::string &fromSipAddress, - const std::string &toSipAddress, - const tm &messageTime, - const std::string &imdnMessageId, - int state, - int direction, - int isSecured + const soci::row &row ) const; std::shared_ptr selectConferenceParticipantEvent ( - long long eventId, + const ChatRoomId &chatRoomId, EventLog::Type type, - time_t creationTime, - const ChatRoomId &chatRoomId + const soci::row &row ) const; std::shared_ptr selectConferenceParticipantDeviceEvent ( - long long eventId, + const ChatRoomId &chatRoomId, EventLog::Type type, - time_t creationTime, - const ChatRoomId &chatRoomId + const soci::row &row ) const; std::shared_ptr selectConferenceSubjectEvent ( - long long eventId, + const ChatRoomId &chatRoomId, EventLog::Type type, - time_t creationTime, - const ChatRoomId &chatRoomId + const soci::row &row ) const; long long insertEvent (const std::shared_ptr &eventLog); diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index a3f11b66f..45b80c128 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -20,7 +20,6 @@ #include #include "linphone/utils/algorithm.h" -#include "linphone/utils/utils.h" #include "linphone/utils/static-string.h" #include "chat/chat-message/chat-message-p.h" @@ -28,19 +27,13 @@ #include "chat/chat-room/client-group-chat-room.h" #include "chat/chat-room/server-group-chat-room.h" #include "conference/participant-p.h" -#include "content/content-type.h" -#include "content/content.h" #include "core/core-p.h" #include "event-log/event-log-p.h" #include "event-log/events.h" -#include "logger/logger.h" #include "main-db-key-p.h" -#include "main-db-p.h" -#ifdef SOCI_ENABLED - #include "internal/db-exception-handler.h" - #include "internal/statements.h" -#endif // ifdef SOCI_ENABLED +#include "internal/db-transaction.h" +#include "internal/statements.h" // ============================================================================= @@ -88,11 +81,38 @@ namespace { constexpr int LegacyMessageColIsSecured = 14; } +// ----------------------------------------------------------------------------- +// soci helpers. // ----------------------------------------------------------------------------- -MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), CoreAccessor(core) {} +static inline vector blobToVector (soci::blob &in) { + size_t len = in.get_len(); + if (!len) + return vector(); + vector out(len); + in.read(0, &out[0], len); + return out; +} -#ifdef SOCI_ENABLED +static inline string blobToString (soci::blob &in) { + vector out = blobToVector(in); + return string(out.begin(), out.end()); +} + +static constexpr string &blobToString (string &in) { + return in; +} + +template +static T getValueFromRow (const soci::row &row, int index, bool &isNull) { + isNull = false; + + if (row.get_indicator(size_t(index)) == soci::i_null) { + isNull = true; + return T(); + } + return row.get(size_t(index)); +} // ----------------------------------------------------------------------------- // Event filter tools. @@ -202,45 +222,39 @@ static string buildSqlEventFilter ( return sql; } +// ----------------------------------------------------------------------------- +// Misc helpers. // ----------------------------------------------------------------------------- -static inline vector blobToVector (soci::blob &in) { - size_t len = in.get_len(); - if (!len) - return vector(); - vector out(len); - in.read(0, &out[0], len); - return out; +shared_ptr MainDbPrivate::findChatRoom (const ChatRoomId &chatRoomId) const { + L_Q(); + shared_ptr chatRoom = q->getCore()->findChatRoom(chatRoomId); + if (!chatRoom) + lError() << "Unable to find chat room: " << chatRoomId << "."; + return chatRoom; } -static inline string blobToString (soci::blob &in) { - vector out = blobToVector(in); - return string(out.begin(), out.end()); -} - -static constexpr string &blobToString (string &in) { - return in; -} +// ----------------------------------------------------------------------------- +// Low level API. +// ----------------------------------------------------------------------------- long long MainDbPrivate::insertSipAddress (const string &sipAddress) { - soci::session *session = dbSession.getBackendSession(); - long long id = selectSipAddressId(sipAddress); if (id >= 0) return id; lInfo() << "Insert new sip address in database: `" << sipAddress << "`."; - *session << "INSERT INTO sip_address (value) VALUES (:sipAddress)", soci::use(sipAddress); + *dbSession.getBackendSession() << "INSERT INTO sip_address (value) VALUES (:sipAddress)", soci::use(sipAddress); return dbSession.getLastInsertId(); } -void MainDbPrivate::insertContent (long long eventId, const Content &content) { +void MainDbPrivate::insertContent (long long chatMessageId, const Content &content) { soci::session *session = dbSession.getBackendSession(); const long long &contentTypeId = insertContentType(content.getContentType().asString()); const string &body = content.getBodyAsString(); *session << "INSERT INTO chat_message_content (event_id, content_type_id, body) VALUES" - " (:eventId, :contentTypeId, :body)", soci::use(eventId), soci::use(contentTypeId), + " (:chatMessageId, :contentTypeId, :body)", soci::use(chatMessageId), soci::use(contentTypeId), soci::use(body); const long long &chatMessageContentId = dbSession.getLastInsertId(); @@ -249,7 +263,7 @@ void MainDbPrivate::insertContent (long long eventId, const Content &content) { const string &name = fileContent.getFileName(); const size_t &size = fileContent.getFileSize(); const string &path = fileContent.getFilePath(); - *session << "INSERT INTO chat_message_file_content (chat_message_content_id, name, size, path) VALUES " + *session << "INSERT INTO chat_message_file_content (chat_message_content_id, name, size, path) VALUES" " (:chatMessageContentId, :name, :size, :path)", soci::use(chatMessageContentId), soci::use(name), soci::use(size), soci::use(path); } @@ -287,7 +301,7 @@ long long MainDbPrivate::insertOrUpdateImportedBasicChatRoom ( return id; } - static const int capabilities = ChatRoom::CapabilitiesMask( + constexpr int capabilities = ChatRoom::CapabilitiesMask( { ChatRoom::Capabilities::Basic, ChatRoom::Capabilities::Migratable } ); lInfo() << "Insert new chat room in database: (peer=" << peerSipAddressId << @@ -302,30 +316,25 @@ long long MainDbPrivate::insertOrUpdateImportedBasicChatRoom ( } long long MainDbPrivate::insertChatRoom (const shared_ptr &chatRoom) { - soci::session *session = dbSession.getBackendSession(); - const ChatRoomId &chatRoomId = chatRoom->getChatRoomId(); const long long &peerSipAddressId = insertSipAddress(chatRoomId.getPeerAddress().asString()); const long long &localSipAddressId = insertSipAddress(chatRoomId.getLocalAddress().asString()); long long id = selectChatRoomId(peerSipAddressId, localSipAddressId); - if (id >= 0) { - lError() << "Unable to insert chat room (it already exists): (peer=" << peerSipAddressId << - ", local=" << localSipAddressId << ")."; + if (id >= 0) return id; - } - lInfo() << "Insert new chat room in database: (peer=" << peerSipAddressId << - ", local=" << localSipAddressId << ")."; + lInfo() << "Insert new chat room in database: " << chatRoomId << "."; const tm &creationTime = Utils::getTimeTAsTm(chatRoom->getCreationTime()); const tm &lastUpdateTime = Utils::getTimeTAsTm(chatRoom->getLastUpdateTime()); + // Remove capabilities like `Proxy`. const int &capabilities = chatRoom->getCapabilities() & ~ChatRoom::CapabilitiesMask(ChatRoom::Capabilities::Proxy); const string &subject = chatRoom->getSubject(); const int &flags = chatRoom->hasBeenLeft(); - *session << "INSERT INTO chat_room (" + *dbSession.getBackendSession() << "INSERT INTO chat_room (" " peer_sip_address_id, local_sip_address_id, creation_time, last_update_time, capabilities, subject, flags" ") VALUES (:peerSipAddressId, :localSipAddressId, :creationTime, :lastUpdateTime, :capabilities, :subject, :flags)", soci::use(peerSipAddressId), soci::use(localSipAddressId), soci::use(creationTime), soci::use(lastUpdateTime), @@ -374,8 +383,6 @@ long long MainDbPrivate::insertChatRoomParticipant ( return id; } - lInfo() << "Insert new chat room participant in database: `" << participantSipAddressId << - "` (isAdmin=" << isAdmin << ")."; *session << "INSERT INTO chat_room_participant (chat_room_id, participant_sip_address_id, is_admin)" " VALUES (:chatRoomId, :participantSipAddressId, :isAdmin)", soci::use(chatRoomId), soci::use(participantSipAddressId), soci::use(static_cast(isAdmin)); @@ -396,42 +403,36 @@ void MainDbPrivate::insertChatRoomParticipantDevice ( if (count) return; - lInfo() << "Insert new chat room participant device in database: `" << participantDeviceSipAddressId << "`."; *session << "INSERT INTO chat_room_participant_device (chat_room_participant_id, participant_device_sip_address_id)" " VALUES (:participantId, :participantDeviceSipAddressId)", soci::use(participantId), soci::use(participantDeviceSipAddressId); } -void MainDbPrivate::insertChatMessageParticipant (long long eventId, long long sipAddressId, int state) { - if (state != static_cast(ChatMessage::State::Displayed)) { - soci::session *session = dbSession.getBackendSession(); - *session << "INSERT INTO chat_message_participant (event_id, participant_sip_address_id, state)" - " VALUES (:eventId, :sipAddressId, :state)", - soci::use(eventId), soci::use(sipAddressId), soci::use(state); - } +void MainDbPrivate::insertChatMessageParticipant (long long chatMessageId, long long sipAddressId, int state) { + if (state != static_cast(ChatMessage::State::Displayed)) + *dbSession.getBackendSession() << + "INSERT INTO chat_message_participant (event_id, participant_sip_address_id, state)" + " VALUES (:chatMessageId, :sipAddressId, :state)", + soci::use(chatMessageId), soci::use(sipAddressId), soci::use(state); } // ----------------------------------------------------------------------------- long long MainDbPrivate::selectSipAddressId (const string &sipAddress) const { - L_Q(); - long long id; soci::session *session = dbSession.getBackendSession(); - *session << Statements::get(Statements::SelectSipAddressId, q->getBackend()), + *session << Statements::get(Statements::SelectSipAddressId), soci::use(sipAddress), soci::into(id); return session->got_data() ? id : -1; } long long MainDbPrivate::selectChatRoomId (long long peerSipAddressId, long long localSipAddressId) const { - L_Q(); - long long id; soci::session *session = dbSession.getBackendSession(); - *session << Statements::get(Statements::SelectChatRoomId, q->getBackend()), + *session << Statements::get(Statements::SelectChatRoomId), soci::use(peerSipAddressId), soci::use(localSipAddressId), soci::into(id); return session->got_data() ? id : -1; @@ -450,24 +451,20 @@ long long MainDbPrivate::selectChatRoomId (const ChatRoomId &chatRoomId) const { } long long MainDbPrivate::selectChatRoomParticipantId (long long chatRoomId, long long participantSipAddressId) const { - L_Q(); - long long id; soci::session *session = dbSession.getBackendSession(); - *session << Statements::get(Statements::SelectChatRoomParticipantId, q->getBackend()), + *session << Statements::get(Statements::SelectChatRoomParticipantId), soci::use(chatRoomId), soci::use(participantSipAddressId), soci::into(id); return session->got_data() ? id : -1; } long long MainDbPrivate::selectOneToOneChatRoomId (long long sipAddressIdA, long long sipAddressIdB) const { - L_Q(); - long long id; soci::session *session = dbSession.getBackendSession(); - *session << Statements::get(Statements::SelectOneToOneChatRoomId, q->getBackend()), + *session << Statements::get(Statements::SelectOneToOneChatRoomId), soci::use(sipAddressIdA), soci::use(sipAddressIdB), soci::use(sipAddressIdA), soci::use(sipAddressIdB), soci::into(id); @@ -476,15 +473,14 @@ long long MainDbPrivate::selectOneToOneChatRoomId (long long sipAddressIdA, long // ----------------------------------------------------------------------------- -void MainDbPrivate::deleteContents (long long messageEventId) { - soci::session *session = dbSession.getBackendSession(); - *session << "DELETE FROM chat_message_content WHERE event_id = :messageEventId", soci::use(messageEventId); +void MainDbPrivate::deleteContents (long long chatMessageId) { + *dbSession.getBackendSession() << "DELETE FROM chat_message_content WHERE event_id = :chatMessageId", + soci::use(chatMessageId); } void MainDbPrivate::deleteChatRoomParticipant (long long chatRoomId, long long participantSipAddressId) { - soci::session *session = dbSession.getBackendSession(); - *session << "DELETE FROM chat_room_participant" - " WHERE chat_room_id = :chatRoomId AND participant_sip_address_id = :participantSipAddressId", + *dbSession.getBackendSession() << "DELETE FROM chat_room_participant" + " WHERE chat_room_id = :chatRoomId AND participant_sip_address_id = :participantSipAddressId", soci::use(chatRoomId), soci::use(participantSipAddressId); } @@ -492,55 +488,74 @@ void MainDbPrivate::deleteChatRoomParticipantDevice ( long long participantId, long long participantDeviceSipAddressId ) { - soci::session *session = dbSession.getBackendSession(); - *session << "DELETE FROM chat_room_participant_device" - " WHERE chat_room_participant_id = :participantId" - " AND participant_device_sip_address_id = :participantDeviceSipAddressId", + *dbSession.getBackendSession() << "DELETE FROM chat_room_participant_device" + " WHERE chat_room_participant_id = :participantId" + " AND participant_device_sip_address_id = :participantDeviceSipAddressId", soci::use(participantId), soci::use(participantDeviceSipAddressId); } +// ----------------------------------------------------------------------------- +// Events API. // ----------------------------------------------------------------------------- shared_ptr MainDbPrivate::selectGenericConferenceEvent ( - long long eventId, - EventLog::Type type, - time_t creationTime, - const ChatRoomId &chatRoomId + const shared_ptr &chatRoom, + const soci::row &row ) const { - shared_ptr eventLog; + EventLog::Type type = EventLog::Type(row.get(1)); + if (type == EventLog::Type::ConferenceChatMessage) { + long long eventId = getConferenceEventIdFromRow(row); + shared_ptr eventLog = getEventFromCache(eventId); + if (!eventLog) { + eventLog = selectConferenceChatMessageEvent(chatRoom, type, row); + if (eventLog) + cache(eventLog, eventId); + } + return eventLog; + } + return selectGenericConferenceNotifiedEvent(chatRoom->getChatRoomId(), row); +} + +shared_ptr MainDbPrivate::selectGenericConferenceNotifiedEvent ( + const ChatRoomId &chatRoomId, + const soci::row &row +) const { + long long eventId = getConferenceEventIdFromRow(row); + shared_ptr eventLog = getEventFromCache(eventId); + if (eventLog) + return eventLog; + + EventLog::Type type = EventLog::Type(row.get(1)); switch (type) { case EventLog::Type::None: + case EventLog::Type::ConferenceChatMessage: return nullptr; case EventLog::Type::ConferenceCreated: case EventLog::Type::ConferenceTerminated: - eventLog = selectConferenceEvent(eventId, type, creationTime, chatRoomId); + eventLog = selectConferenceEvent(chatRoomId, type, row); break; case EventLog::Type::ConferenceCallStart: case EventLog::Type::ConferenceCallEnd: - eventLog = selectConferenceCallEvent(eventId, type, creationTime, chatRoomId); - break; - - case EventLog::Type::ConferenceChatMessage: - eventLog = selectConferenceChatMessageEvent(eventId, type, creationTime, chatRoomId); + eventLog = selectConferenceCallEvent(chatRoomId, type, row); break; case EventLog::Type::ConferenceParticipantAdded: case EventLog::Type::ConferenceParticipantRemoved: case EventLog::Type::ConferenceParticipantSetAdmin: case EventLog::Type::ConferenceParticipantUnsetAdmin: - eventLog = selectConferenceParticipantEvent(eventId, type, creationTime, chatRoomId); + eventLog = selectConferenceParticipantEvent(chatRoomId, type, row); break; case EventLog::Type::ConferenceParticipantDeviceAdded: case EventLog::Type::ConferenceParticipantDeviceRemoved: - eventLog = selectConferenceParticipantDeviceEvent(eventId, type, creationTime, chatRoomId); + eventLog = selectConferenceParticipantDeviceEvent(chatRoomId, type, row); break; case EventLog::Type::ConferenceSubjectChanged: - eventLog = selectConferenceSubjectEvent(eventId, type, creationTime, chatRoomId); + eventLog = selectConferenceSubjectEvent(chatRoomId, type, row); break; } @@ -551,130 +566,48 @@ shared_ptr MainDbPrivate::selectGenericConferenceEvent ( } shared_ptr MainDbPrivate::selectConferenceEvent ( - long long, + const ChatRoomId &chatRoomId, EventLog::Type type, - time_t creationTime, - const ChatRoomId &chatRoomId + const soci::row &row ) const { return make_shared( type, - creationTime, + getConferenceEventCreationTimeFromRow(row), chatRoomId ); } shared_ptr MainDbPrivate::selectConferenceCallEvent ( - long long eventId, + const ChatRoomId &chatRoomId, EventLog::Type type, - time_t creationTime, - const ChatRoomId &chatRoomId + const soci::row &row ) const { // TODO. return nullptr; } -template -static void fetchContentAppData (soci::session *session, Content &content, long long contentId, T &data) { - static const string query = "SELECT name, data FROM chat_message_content_app_data" - " WHERE chat_message_content_id = :contentId"; - - string name; - soci::statement statement = (session->prepare << query, soci::use(contentId), soci::into(name), soci::into(data)); - statement.execute(); - while (statement.fetch()) - content.setAppData(name, blobToString(data)); -} - shared_ptr MainDbPrivate::selectConferenceChatMessageEvent ( - long long eventId, + const shared_ptr &chatRoom, EventLog::Type type, - time_t creationTime, - const ChatRoomId &chatRoomId -) const { - L_Q(); - - shared_ptr core = q->getCore(); - shared_ptr chatRoom = core->findChatRoom(chatRoomId); - if (!chatRoom) { - lError() << "Unable to find chat room storage id of (peer=" + - chatRoomId.getPeerAddress().asString() + - ", local=" + chatRoomId.getLocalAddress().asString() + "`)."; - return nullptr; - } - - shared_ptr chatMessage = getChatMessageFromCache(eventId); - if (!chatMessage) { - string fromSipAddress; - string toSipAddress; - - tm messageTime; - - string imdnMessageId; - - int state; - int direction; - int isSecured; - - soci::session *session = dbSession.getBackendSession(); - *session << "SELECT from_sip_address.value, to_sip_address.value, time, imdn_message_id, state, direction, is_secured" - " FROM event, conference_chat_message_event, sip_address AS from_sip_address, sip_address AS to_sip_address" - " WHERE event_id = :eventId" - " AND event_id = event.id" - " AND from_sip_address_id = from_sip_address.id" - " AND to_sip_address_id = to_sip_address.id", soci::into(fromSipAddress), soci::into(toSipAddress), - soci::into(messageTime), soci::into(imdnMessageId), soci::into(state), soci::into(direction), - soci::into(isSecured), soci::use(eventId); - - return selectConferenceChatMessageEvent ( - eventId, - type, - creationTime, - chatRoom, - fromSipAddress, - toSipAddress, - messageTime, - imdnMessageId, - state, - direction, - isSecured - ); - } - - return make_shared( - creationTime, - chatMessage - ); -} - -shared_ptr MainDbPrivate::selectConferenceChatMessageEvent ( - long long eventId, - EventLog::Type type, - time_t creationTime, - shared_ptr &chatRoom, - const string &fromSipAddress, - const string &toSipAddress, - const tm &messageTime, - const string &imdnMessageId, - int state, - int direction, - int isSecured + const soci::row &row ) const { + long long eventId = getConferenceEventIdFromRow(row); shared_ptr chatMessage = getChatMessageFromCache(eventId); if (!chatMessage) { chatMessage = shared_ptr(new ChatMessage( chatRoom, - ChatMessage::Direction(direction) + ChatMessage::Direction(row.get(8)) )); - chatMessage->setIsSecured(bool(isSecured)); + chatMessage->setIsSecured(bool(row.get(9))); ChatMessagePrivate *dChatMessage = chatMessage->getPrivate(); - dChatMessage->setState(ChatMessage::State(state), true); + dChatMessage->setState(ChatMessage::State(row.get(7)), true); - dChatMessage->forceFromAddress(IdentityAddress(fromSipAddress)); - dChatMessage->forceToAddress(IdentityAddress(toSipAddress)); + dChatMessage->forceFromAddress(IdentityAddress(row.get(3))); + dChatMessage->forceToAddress(IdentityAddress(row.get(4))); - dChatMessage->setTime(Utils::getTmAsTimeT(messageTime)); - dChatMessage->setImdnMessageId(imdnMessageId); + dChatMessage->setTime(Utils::getTmAsTimeT(row.get(5))); + dChatMessage->setImdnMessageId(row.get(6)); dChatMessage->markContentsAsNotLoaded(); dChatMessage->setIsReadOnly(true); @@ -683,102 +616,60 @@ shared_ptr MainDbPrivate::selectConferenceChatMessageEvent ( } return make_shared( - creationTime, + getConferenceEventCreationTimeFromRow(row), chatMessage ); } shared_ptr MainDbPrivate::selectConferenceParticipantEvent ( - long long eventId, + const ChatRoomId &chatRoomId, EventLog::Type type, - time_t creationTime, - const ChatRoomId &chatRoomId + const soci::row &row ) const { - unsigned int notifyId; - string participantAddress; - - soci::session *session = dbSession.getBackendSession(); - *session << "SELECT notify_id, participant_address.value" - " FROM conference_notified_event, conference_participant_event, sip_address as participant_address" - " WHERE conference_participant_event.event_id = :eventId" - " AND conference_notified_event.event_id = conference_participant_event.event_id" - " AND participant_address.id = participant_sip_address_id", - soci::into(notifyId), soci::into(participantAddress), soci::use(eventId); - return make_shared( type, - creationTime, + getConferenceEventCreationTimeFromRow(row), chatRoomId, - notifyId, - IdentityAddress(participantAddress) + getConferenceEventNotifyIdFromRow(row), + IdentityAddress(row.get(12)) ); } shared_ptr MainDbPrivate::selectConferenceParticipantDeviceEvent ( - long long eventId, + const ChatRoomId &chatRoomId, EventLog::Type type, - time_t creationTime, - const ChatRoomId &chatRoomId + const soci::row &row ) const { - unsigned int notifyId; - string participantAddress; - string deviceAddress; - - soci::session *session = dbSession.getBackendSession(); - *session << "SELECT notify_id, participant_address.value, device_address.value" - " FROM conference_notified_event, conference_participant_event, conference_participant_device_event," - " sip_address AS participant_address, sip_address AS device_address" - " WHERE conference_participant_device_event.event_id = :eventId" - " AND conference_participant_event.event_id = conference_participant_device_event.event_id" - " AND conference_notified_event.event_id = conference_participant_event.event_id" - " AND participant_address.id = participant_sip_address_id" - " AND device_address.id = device_sip_address_id", - soci::into(notifyId), soci::into(participantAddress), soci::into(deviceAddress), soci::use(eventId); - return make_shared( type, - creationTime, + getConferenceEventCreationTimeFromRow(row), chatRoomId, - notifyId, - IdentityAddress(participantAddress), - IdentityAddress(deviceAddress) + getConferenceEventNotifyIdFromRow(row), + IdentityAddress(row.get(12)), + IdentityAddress(row.get(11)) ); } shared_ptr MainDbPrivate::selectConferenceSubjectEvent ( - long long eventId, + const ChatRoomId &chatRoomId, EventLog::Type type, - time_t creationTime, - const ChatRoomId &chatRoomId + const soci::row &row ) const { - unsigned int notifyId; - string subject; - - soci::session *session = dbSession.getBackendSession(); - *session << "SELECT notify_id, subject" - " FROM conference_notified_event, conference_subject_event" - " WHERE conference_subject_event.event_id = :eventId" - " AND conference_notified_event.event_id = conference_subject_event.event_id", - soci::into(notifyId), soci::into(subject), soci::use(eventId); - return make_shared( - creationTime, + getConferenceEventCreationTimeFromRow(row), chatRoomId, - notifyId, - subject + getConferenceEventNotifyIdFromRow(row), + row.get(13) ); } // ----------------------------------------------------------------------------- long long MainDbPrivate::insertEvent (const shared_ptr &eventLog) { - soci::session *session = dbSession.getBackendSession(); - const int &type = int(eventLog->getType()); const tm &creationTime = Utils::getTimeTAsTm(eventLog->getCreationTime()); - *session << "INSERT INTO event (type, creation_time) VALUES (:type, :creationTime)", - soci::use(type), - soci::use(creationTime); + *dbSession.getBackendSession() << "INSERT INTO event (type, creation_time) VALUES (:type, :creationTime)", + soci::use(type), soci::use(creationTime); return dbSession.getLastInsertId(); } @@ -792,9 +683,7 @@ long long MainDbPrivate::insertConferenceEvent (const shared_ptr &even // A conference event can be inserted in database only if chat room exists. // Otherwise it's an error. const ChatRoomId &chatRoomId = conferenceEvent->getChatRoomId(); - lError() << "Unable to find chat room storage id of (peer=" + - chatRoomId.getPeerAddress().asString() + - ", local=" + chatRoomId.getLocalAddress().asString() + "`)."; + lError() << "Unable to find chat room storage id of: " << chatRoomId << "."; } else { eventId = insertEvent(eventLog); @@ -823,19 +712,11 @@ long long MainDbPrivate::insertConferenceCallEvent (const shared_ptr & } long long MainDbPrivate::insertConferenceChatMessageEvent (const shared_ptr &eventLog) { - shared_ptr chatMessage = static_pointer_cast(eventLog)->getChatMessage(); - shared_ptr chatRoom = chatMessage->getChatRoom(); - if (!chatRoom) { - lError() << "Unable to get a valid chat room. It was removed from database."; - return -1; - } - const long long &eventId = insertConferenceEvent(eventLog); if (eventId < 0) return -1; - soci::session *session = dbSession.getBackendSession(); - + shared_ptr chatMessage = static_pointer_cast(eventLog)->getChatMessage(); const long long &fromSipAddressId = insertSipAddress(chatMessage->getFromAddress().asString()); const long long &toSipAddressId = insertSipAddress(chatMessage->getToAddress().asString()); const tm &messageTime = Utils::getTimeTAsTm(chatMessage->getTime()); @@ -844,7 +725,7 @@ long long MainDbPrivate::insertConferenceChatMessageEvent (const shared_ptrgetImdnMessageId(); const int &isSecured = chatMessage->isSecured() ? 1 : 0; - *session << "INSERT INTO conference_chat_message_event (" + *dbSession.getBackendSession() << "INSERT INTO conference_chat_message_event (" " event_id, from_sip_address_id, to_sip_address_id," " time, state, direction, imdn_message_id, is_secured" ") VALUES (" @@ -857,7 +738,7 @@ long long MainDbPrivate::insertConferenceChatMessageEvent (const shared_ptrgetContents()) insertContent(eventId, *content); - for (const auto &participant : chatRoom->getParticipants()) { + for (const auto &participant : chatMessage->getChatRoom()->getParticipants()) { const long long &participantSipAddressId = selectSipAddressId(participant->getAddress().asString()); insertChatMessageParticipant(eventId, participantSipAddressId, state); } @@ -867,20 +748,14 @@ long long MainDbPrivate::insertConferenceChatMessageEvent (const shared_ptr &eventLog) { shared_ptr chatMessage = static_pointer_cast(eventLog)->getChatMessage(); - shared_ptr chatRoom = chatMessage->getChatRoom(); - if (!chatRoom) { - lError() << "Unable to get a valid chat room. It was removed from database."; - return; - } const EventLogPrivate *dEventLog = eventLog->getPrivate(); MainDbKeyPrivate *dEventKey = static_cast(dEventLog->dbKey).getPrivate(); const long long &eventId = dEventKey->storageId; - soci::session *session = dbSession.getBackendSession(); const int &state = int(chatMessage->getState()); const string &imdnMessageId = chatMessage->getImdnMessageId(); - *session << "UPDATE conference_chat_message_event SET state = :state, imdn_message_id = :imdnMessageId" + *dbSession.getBackendSession() << "UPDATE conference_chat_message_event SET state = :state, imdn_message_id = :imdnMessageId" " WHERE event_id = :eventId", soci::use(state), soci::use(imdnMessageId), soci::use(eventId); @@ -925,9 +800,8 @@ long long MainDbPrivate::insertConferenceParticipantEvent ( participantEvent->getParticipantAddress().asString() ); - soci::session *session = dbSession.getBackendSession(); - *session << "INSERT INTO conference_participant_event (event_id, participant_sip_address_id)" - " VALUES (:eventId, :participantAddressId)", soci::use(eventId), soci::use(participantAddressId); + *dbSession.getBackendSession() << "INSERT INTO conference_participant_event (event_id, participant_sip_address_id)" + " VALUES (:eventId, :participantAddressId)", soci::use(eventId), soci::use(participantAddressId); bool isAdmin = eventLog->getType() == EventLog::Type::ConferenceParticipantSetAdmin; switch (eventLog->getType()) { @@ -969,15 +843,14 @@ long long MainDbPrivate::insertConferenceParticipantDeviceEvent (const shared_pt const long long &participantId = selectChatRoomParticipantId(chatRoomId, participantAddressId); if (participantId < 0) { lError() << "Unable to find valid participant id in database with chat room id = " << chatRoomId << - " and participant address id = " << participantId; + " and participant address id = " << participantAddressId; return -1; } const long long &deviceAddressId = insertSipAddress( participantDeviceEvent->getDeviceAddress().asString() ); - soci::session *session = dbSession.getBackendSession(); - *session << "INSERT INTO conference_participant_device_event (event_id, device_sip_address_id)" + *dbSession.getBackendSession() << "INSERT INTO conference_participant_device_event (event_id, device_sip_address_id)" " VALUES (:eventId, :deviceAddressId)", soci::use(eventId), soci::use(deviceAddressId); switch (eventLog->getType()) { @@ -1014,6 +887,8 @@ long long MainDbPrivate::insertConferenceSubjectEvent (const shared_ptr MainDbPrivate::getEventFromCache (long long storageId) const { @@ -1022,7 +897,6 @@ shared_ptr MainDbPrivate::getEventFromCache (long long storageId) cons return nullptr; shared_ptr eventLog = it->second.lock(); - // Must exist. If not, implementation bug. L_ASSERT(eventLog); return eventLog; } @@ -1033,7 +907,6 @@ shared_ptr MainDbPrivate::getChatMessageFromCache (long long storag return nullptr; shared_ptr chatMessage = it->second.lock(); - // Must exist. If not, implementation bug. L_ASSERT(chatMessage); return chatMessage; } @@ -1059,8 +932,7 @@ void MainDbPrivate::cache (const shared_ptr &chatMessage, long long } void MainDbPrivate::invalidConferenceEventsFromQuery (const string &query, long long chatRoomId) { - soci::session *session = dbSession.getBackendSession(); - soci::rowset rows = (session->prepare << query, soci::use(chatRoomId)); + soci::rowset rows = (dbSession.getBackendSession()->prepare << query, soci::use(chatRoomId)); for (const auto &row : rows) { long long eventId = dbSession.resolveId(row, 0); shared_ptr eventLog = getEventFromCache(eventId); @@ -1069,7 +941,6 @@ void MainDbPrivate::invalidConferenceEventsFromQuery (const string &query, long L_ASSERT(dEventLog->dbKey.isValid()); dEventLog->dbKey = MainDbEventKey(); } - // TODO: Try to add a better code here... shared_ptr chatMessage = getChatMessageFromCache(eventId); if (chatMessage) { const ChatMessagePrivate *dChatMessage = chatMessage->getPrivate(); @@ -1079,6 +950,8 @@ void MainDbPrivate::invalidConferenceEventsFromQuery (const string &query, long } } +// ----------------------------------------------------------------------------- +// Versions. // ----------------------------------------------------------------------------- unsigned int MainDbPrivate::getModuleVersion (const string &name) { @@ -1103,14 +976,14 @@ void MainDbPrivate::updateSchema () { soci::session *session = dbSession.getBackendSession(); unsigned int version = getModuleVersion("events"); - if (version < makeVersion(1, 0, 1)) { + if (version < makeVersion(1, 0, 1)) *session << "ALTER TABLE chat_room_participant_device ADD COLUMN state TINYINT UNSIGNED DEFAULT 0"; - } } +// ----------------------------------------------------------------------------- +// Import. // ----------------------------------------------------------------------------- -// NOTE: Legacy supports only sqlite. static inline bool checkLegacyTableExists (soci::session &session, const string &name) { session << "SELECT name FROM sqlite_master WHERE type='table' AND name = :name", soci::use(name); return session.got_data() > 0; @@ -1124,22 +997,9 @@ static inline bool checkLegacyHistoryTableExists (soci::session &session) { return checkLegacyTableExists(session, "history"); } -template -static T getValueFromRow (const soci::row &row, int index, bool &isNull) { - isNull = false; - - if (row.get_indicator(size_t(index)) == soci::i_null){ - isNull = true; - return T(); - } - return row.get(size_t(index)); -} - -// ----------------------------------------------------------------------------- - void MainDbPrivate::importLegacyFriends (DbSession &inDbSession) { L_Q(); - L_DB_EXCEPTION_HANDLER_C(q) { + L_DB_TRANSACTION_C(q) { if (getModuleVersion("legacy-friends-import") >= makeVersion(1, 0, 0)) return; updateModuleVersion("legacy-friends-import", ModuleVersionLegacyFriendsImport); @@ -1211,10 +1071,8 @@ void MainDbPrivate::importLegacyFriends (DbSession &inDbSession) { void MainDbPrivate::importLegacyHistory (DbSession &inDbSession) { L_Q(); - L_DB_EXCEPTION_HANDLER_C(q) { - - unsigned int version = getModuleVersion("legacy-history-import"); - if (version >= makeVersion(1, 0, 0)) + L_DB_TRANSACTION_C(q) { + if (getModuleVersion("legacy-history-import") >= makeVersion(1, 0, 0)) return; updateModuleVersion("legacy-history-import", ModuleVersionLegacyHistoryImport); @@ -1299,7 +1157,7 @@ void MainDbPrivate::importLegacyHistory (DbSession &inDbSession) { const int &isSecured = message.get(LegacyMessageColIsSecured, 0); *session << "INSERT INTO conference_event (event_id, chat_room_id)" - " VALUES (:eventId, :chatRoomId)", soci::use(eventId), soci::use(chatRoomId); + " VALUES (:eventId, :chatRoomId)", soci::use(eventId), soci::use(chatRoomId); *session << "INSERT INTO conference_chat_message_event (" " event_id, from_sip_address_id, to_sip_address_id," @@ -1322,7 +1180,9 @@ void MainDbPrivate::importLegacyHistory (DbSession &inDbSession) { }; } -// ----------------------------------------------------------------------------- +// ============================================================================= + +MainDb::MainDb (const shared_ptr &core) : AbstractDb(*new MainDbPrivate), CoreAccessor(core) {} void MainDb::init () { L_D(); @@ -1338,13 +1198,6 @@ void MainDb::init () { auto timestampType = bind(&DbSession::timestampType, &d->dbSession); auto varcharPrimaryKeyStr = bind(&DbSession::varcharPrimaryKeyStr, &d->dbSession, _1); - auto createTableSanitizer = [](const char *statement) { - // TODO. - string sanitized = statement; - return sanitized; - }; - - // TODO: Migrate all statements in statements.cpp. *session << "CREATE TABLE IF NOT EXISTS sip_address (" " id" + primaryKeyStr("BIGINT UNSIGNED") + "," @@ -1661,8 +1514,23 @@ void MainDb::init () { " ON DELETE CASCADE" ") " + charset; - for (int i = 0; i < int(Statements::CreateCount); ++i) - *session << createTableSanitizer(Statements::get(static_cast(i), backend)); + { + string query; + if (getBackend() == Backend::Mysql) + query = "CREATE OR REPLACE VIEW conference_event_view AS"; + else + query = "CREATE VIEW IF NOT EXISTS conference_event_view AS"; + + *session << query + + " SELECT id, type, creation_time, chat_room_id, from_sip_address_id, to_sip_address_id, time, imdn_message_id, state, direction, is_secured, notify_id, device_sip_address_id, participant_sip_address_id, subject" + " FROM event" + " LEFT JOIN conference_event ON conference_event.event_id = event.id" + " LEFT JOIN conference_chat_message_event ON conference_chat_message_event.event_id = event.id" + " LEFT JOIN conference_notified_event ON conference_notified_event.event_id = event.id" + " LEFT JOIN conference_participant_device_event ON conference_participant_device_event.event_id = event.id" + " LEFT JOIN conference_participant_event ON conference_participant_event.event_id = event.id" + " LEFT JOIN conference_subject_event ON conference_subject_event.event_id = event.id"; + } *session << "CREATE TABLE IF NOT EXISTS db_module_version (" @@ -1697,16 +1565,15 @@ void MainDb::init () { } bool MainDb::addEvent (const shared_ptr &eventLog) { - const EventLogPrivate *dEventLog = eventLog->getPrivate(); - if (dEventLog->dbKey.isValid()) { + if (eventLog->getPrivate()->dbKey.isValid()) { lWarning() << "Unable to add an event twice!!!"; return false; } - return L_DB_EXCEPTION_HANDLER { + return L_DB_TRANSACTION { L_D(); - long long storageId = 0; + long long eventId = -1; EventLog::Type type = eventLog->getType(); switch (type) { @@ -1715,41 +1582,41 @@ bool MainDb::addEvent (const shared_ptr &eventLog) { case EventLog::Type::ConferenceCreated: case EventLog::Type::ConferenceTerminated: - storageId = d->insertConferenceEvent(eventLog); + eventId = d->insertConferenceEvent(eventLog); break; case EventLog::Type::ConferenceCallStart: case EventLog::Type::ConferenceCallEnd: - storageId = d->insertConferenceCallEvent(eventLog); + eventId = d->insertConferenceCallEvent(eventLog); break; case EventLog::Type::ConferenceChatMessage: - storageId = d->insertConferenceChatMessageEvent(eventLog); + eventId = d->insertConferenceChatMessageEvent(eventLog); break; case EventLog::Type::ConferenceParticipantAdded: case EventLog::Type::ConferenceParticipantRemoved: case EventLog::Type::ConferenceParticipantSetAdmin: case EventLog::Type::ConferenceParticipantUnsetAdmin: - storageId = d->insertConferenceParticipantEvent(eventLog); + eventId = d->insertConferenceParticipantEvent(eventLog); break; case EventLog::Type::ConferenceParticipantDeviceAdded: case EventLog::Type::ConferenceParticipantDeviceRemoved: - storageId = d->insertConferenceParticipantDeviceEvent(eventLog); + eventId = d->insertConferenceParticipantDeviceEvent(eventLog); break; case EventLog::Type::ConferenceSubjectChanged: - storageId = d->insertConferenceSubjectEvent(eventLog); + eventId = d->insertConferenceSubjectEvent(eventLog); break; } - if (storageId >= 0) { + if (eventId >= 0) { tr.commit(); - d->cache(eventLog, storageId); + d->cache(eventLog, eventId); if (type == EventLog::Type::ConferenceChatMessage) - d->cache(static_pointer_cast(eventLog)->getChatMessage(), storageId); + d->cache(static_pointer_cast(eventLog)->getChatMessage(), eventId); return true; } @@ -1759,13 +1626,12 @@ bool MainDb::addEvent (const shared_ptr &eventLog) { } bool MainDb::updateEvent (const shared_ptr &eventLog) { - const EventLogPrivate *dEventLog = eventLog->getPrivate(); - if (!dEventLog->dbKey.isValid()) { + if (!eventLog->getPrivate()->dbKey.isValid()) { lWarning() << "Unable to update an event that wasn't inserted yet!!!"; return false; } - return L_DB_EXCEPTION_HANDLER { + return L_DB_TRANSACTION { L_D(); switch (eventLog->getType()) { @@ -1809,7 +1675,7 @@ bool MainDb::deleteEvent (const shared_ptr &eventLog) { MainDb &mainDb = *core->getPrivate()->mainDb.get(); - return L_DB_EXCEPTION_HANDLER_C(&mainDb) { + return L_DB_TRANSACTION_C(&mainDb) { soci::session *session = mainDb.getPrivate()->dbSession.getBackendSession(); *session << "DELETE FROM event WHERE id = :id", soci::use(dEventKey->storageId); tr.commit(); @@ -1826,19 +1692,19 @@ bool MainDb::deleteEvent (const shared_ptr &eventLog) { } int MainDb::getEventCount (FilterMask mask) const { - string query = "SELECT COUNT(*) FROM event" + - buildSqlEventFilter({ ConferenceCallFilter, ConferenceChatMessageFilter, ConferenceInfoFilter, ConferenceInfoNoDeviceFilter }, mask); + const string query = "SELECT COUNT(*) FROM event" + + buildSqlEventFilter( + { ConferenceCallFilter, ConferenceChatMessageFilter, ConferenceInfoFilter, ConferenceInfoNoDeviceFilter }, + mask + ); - DurationLogger durationLogger( - "Get events count with mask=" + Utils::toString(mask) + "." - ); + DurationLogger durationLogger("Get event count with mask=" + Utils::toString(mask) + "."); - return L_DB_EXCEPTION_HANDLER { + return L_DB_TRANSACTION { L_D(); int count; - soci::session *session = d->dbSession.getBackendSession(); - *session << query, soci::into(count); + *d->dbSession.getBackendSession() << query, soci::into(count); return count; }; } @@ -1852,38 +1718,23 @@ shared_ptr MainDb::getEventFromKey (const MainDbKey &dbKey) { unique_ptr &q = dbKey.getPrivate()->core.lock()->getPrivate()->mainDb; MainDbPrivate *d = q->getPrivate(); - const long long &storageId = dbKey.getPrivate()->storageId; - { - shared_ptr event = d->getEventFromCache(storageId); - if (event) - return event; - } + const long long &eventId = dbKey.getPrivate()->storageId; + shared_ptr event = d->getEventFromCache(eventId); + if (event) + return event; - // TODO: Improve. Deal with all events in the future. - static const string query = "SELECT peer_sip_address.value, local_sip_address.value, type, event.creation_time" - " FROM event, conference_event, chat_room, sip_address AS peer_sip_address, sip_address as local_sip_address" - " WHERE event.id = :eventId" - " AND conference_event.event_id = event.id" - " AND conference_event.chat_room_id = chat_room.id" - " AND chat_room.peer_sip_address_id = peer_sip_address.id" - " AND chat_room.local_sip_address_id = local_sip_address.id"; + return L_DB_TRANSACTION_C(q.get()) { + // TODO: Improve. Deal with all events in the future. + soci::row row; + *d->dbSession.getBackendSession() << Statements::get(Statements::SelectConferenceEvent), + soci::into(row), soci::use(eventId); - return L_DB_EXCEPTION_HANDLER_C(q.get()) { - soci::session *session = d->dbSession.getBackendSession(); + ChatRoomId chatRoomId(IdentityAddress(row.get(14)), IdentityAddress(row.get(15))); + shared_ptr chatRoom = d->findChatRoom(chatRoomId); + if (!chatRoom) + return shared_ptr(); - string peerSipAddress; - string localSipAddress; - int type; - tm creationTime; - *session << query, soci::into(peerSipAddress), soci::into(localSipAddress), soci::into(type), - soci::into(creationTime), soci::use(storageId); - - return d->selectGenericConferenceEvent( - storageId, - EventLog::Type(type), - Utils::getTmAsTimeT(creationTime), - ChatRoomId(IdentityAddress(peerSipAddress), IdentityAddress(localSipAddress)) - ); + return d->selectGenericConferenceEvent(chatRoom, row); }; } @@ -1891,12 +1742,9 @@ list> MainDb::getConferenceNotifiedEvents ( const ChatRoomId &chatRoomId, unsigned int lastNotifyId ) const { - static const string query = "SELECT id, type, creation_time FROM event" - " WHERE id IN (" - " SELECT event_id FROM conference_notified_event WHERE event_id IN (" - " SELECT event_id FROM conference_event WHERE chat_room_id = :chatRoomId" - " ) AND notify_id > :lastNotifyId" - " )"; + // TODO: Optimize. + const string query = Statements::get(Statements::SelectConferenceEvents) + + string(" AND notify_id > :lastNotifyId"); DurationLogger durationLogger( "Get conference notified events of: (peer=" + chatRoomId.getPeerAddress().asString() + @@ -1904,7 +1752,7 @@ list> MainDb::getConferenceNotifiedEvents ( ", lastNotifyId=" + Utils::toString(lastNotifyId) + ")." ); - return L_DB_EXCEPTION_HANDLER { + return L_DB_TRANSACTION { L_D(); soci::session *session = d->dbSession.getBackendSession(); @@ -1913,18 +1761,8 @@ list> MainDb::getConferenceNotifiedEvents ( list> events; soci::rowset rows = (session->prepare << query, soci::use(dbChatRoomId), soci::use(lastNotifyId)); - for (const auto &row : rows) { - long long eventId = d->dbSession.resolveId(row, 0); - shared_ptr eventLog = d->getEventFromCache(eventId); - - events.push_back(eventLog ? eventLog : d->selectGenericConferenceEvent( - eventId, - EventLog::Type(row.get(1)), - Utils::getTmAsTimeT(row.get(2)), - chatRoomId - )); - } - + for (const auto &row : rows) + events.push_back(d->selectGenericConferenceNotifiedEvent(chatRoomId, row)); return events; }; } @@ -1935,7 +1773,7 @@ int MainDb::getChatMessageCount (const ChatRoomId &chatRoomId) const { ", local=" + chatRoomId.getLocalAddress().asString() + ")." ); - return L_DB_EXCEPTION_HANDLER { + return L_DB_TRANSACTION { L_D(); int count; @@ -1946,7 +1784,7 @@ int MainDb::getChatMessageCount (const ChatRoomId &chatRoomId) const { if (!chatRoomId.isValid()) *session << query, soci::into(count); else { - query += " WHERE event_id IN (" + query += " WHERE event_id IN (" " SELECT event_id FROM conference_event WHERE chat_room_id = :chatRoomId" ")"; @@ -1973,7 +1811,7 @@ int MainDb::getUnreadChatMessageCount (const ChatRoomId &chatRoomId) const { ", local=" + chatRoomId.getLocalAddress().asString() + ")." ); - return L_DB_EXCEPTION_HANDLER { + return L_DB_TRANSACTION { L_D(); int count = 0; @@ -1995,77 +1833,55 @@ void MainDb::markChatMessagesAsRead (const ChatRoomId &chatRoomId) const { if (getUnreadChatMessageCount(chatRoomId) == 0) return; - string query = "UPDATE conference_chat_message_event" - " SET state = " + Utils::toString(int(ChatMessage::State::Displayed)) + " "; - query += "WHERE"; - if (chatRoomId.isValid()) - query += " event_id IN (" - " SELECT event_id FROM conference_event WHERE chat_room_id = :chatRoomId" - ") AND"; - query += " direction = " + Utils::toString(int(ChatMessage::Direction::Incoming)); + static const string query = "UPDATE conference_chat_message_event" + " SET state = " + Utils::toString(int(ChatMessage::State::Displayed)) + + " WHERE event_id IN (" + " SELECT event_id FROM conference_event WHERE chat_room_id = :chatRoomId" + ") AND direction = " + Utils::toString(int(ChatMessage::Direction::Incoming)); DurationLogger durationLogger( "Mark chat messages as read of: (peer=" + chatRoomId.getPeerAddress().asString() + ", local=" + chatRoomId.getLocalAddress().asString() + ")." ); - L_DB_EXCEPTION_HANDLER { + L_DB_TRANSACTION { L_D(); - soci::session *session = d->dbSession.getBackendSession(); + const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId); + *d->dbSession.getBackendSession() << query, soci::use(dbChatRoomId); - if (!chatRoomId.isValid()) - *session << query; - else { - const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId); - *session << query, soci::use(dbChatRoomId); - } tr.commit(); }; } list> MainDb::getUnreadChatMessages (const ChatRoomId &chatRoomId) const { - string query = "SELECT id, creation_time FROM event WHERE" - " id IN (" - " SELECT conference_event.event_id FROM conference_event, conference_chat_message_event" - " WHERE"; - if (chatRoomId.isValid()) - query += " chat_room_id = :chatRoomId AND "; - query += " conference_event.event_id = conference_chat_message_event.event_id" - " AND direction = " + Utils::toString(int(ChatMessage::Direction::Incoming)) + - " AND state <> " + Utils::toString(int(ChatMessage::State::Displayed)) + - ")"; + // TODO: Optimize. + static const string query = Statements::get(Statements::SelectConferenceEvents) + + string(" AND direction = ") + Utils::toString(int(ChatMessage::Direction::Incoming)) + + " AND state <> " + Utils::toString(int(ChatMessage::State::Displayed)); DurationLogger durationLogger( "Get unread chat messages: (peer=" + chatRoomId.getPeerAddress().asString() + ", local=" + chatRoomId.getLocalAddress().asString() + ")." ); - return L_DB_EXCEPTION_HANDLER { + return L_DB_TRANSACTION { L_D(); soci::session *session = d->dbSession.getBackendSession(); - long long dbChatRoomId; - if (chatRoomId.isValid()) - dbChatRoomId = d->selectChatRoomId(chatRoomId); - + long long dbChatRoomId = d->selectChatRoomId(chatRoomId); + shared_ptr chatRoom = d->findChatRoom(chatRoomId); list> chatMessages; - soci::rowset rows = chatRoomId.isValid() - ? (session->prepare << query, soci::use(dbChatRoomId)) - : (session->prepare << query); + if (!chatRoom) + return chatMessages; + soci::rowset rows = (session->prepare << query, soci::use(dbChatRoomId)); for (const auto &row : rows) { - long long eventId = d->dbSession.resolveId(row, 0); - shared_ptr event = d->getEventFromCache(eventId); - - if (!event) - event = d->selectGenericConferenceEvent( - eventId, - EventLog::Type::ConferenceChatMessage, - Utils::getTmAsTimeT(row.get(1)), - chatRoomId - ); + shared_ptr event = d->selectGenericConferenceEvent( + chatRoom, + row + ); if (event) chatMessages.push_back(static_pointer_cast(event)->getChatMessage()); @@ -2076,24 +1892,23 @@ list> MainDb::getUnreadChatMessages (const ChatRoomId &c } list MainDb::getChatMessageParticipantStates (const shared_ptr &eventLog) const { - return L_DB_EXCEPTION_HANDLER { + return L_DB_TRANSACTION { L_D(); - soci::session *session = d->dbSession.getBackendSession(); - const EventLogPrivate *dEventLog = eventLog->getPrivate(); MainDbKeyPrivate *dEventKey = static_cast(dEventLog->dbKey).getPrivate(); const long long &eventId = dEventKey->storageId; - list states; - unsigned int state; - soci::statement statement = (session->prepare - << "SELECT state FROM chat_message_participant WHERE event_id = :eventId", - soci::into(state), soci::use(eventId) + unsigned int state; + soci::statement statement = ( + d->dbSession.getBackendSession()->prepare << "SELECT state FROM chat_message_participant WHERE event_id = :eventId", + soci::into(state), soci::use(eventId) ); statement.execute(); + + list states; while (statement.fetch()) - states.push_back(static_cast(state)); + states.push_back(ChatMessage::State(state)); return states; }; @@ -2103,22 +1918,20 @@ ChatMessage::State MainDb::getChatMessageParticipantState ( const shared_ptr &eventLog, const IdentityAddress &participantAddress ) const { - return L_DB_EXCEPTION_HANDLER { + return L_DB_TRANSACTION { L_D(); - soci::session *session = d->dbSession.getBackendSession(); - const EventLogPrivate *dEventLog = eventLog->getPrivate(); MainDbKeyPrivate *dEventKey = static_cast(dEventLog->dbKey).getPrivate(); const long long &eventId = dEventKey->storageId; const long long &participantSipAddressId = d->selectSipAddressId(participantAddress.asString()); - unsigned int state; - *session << "SELECT state FROM chat_message_participant" + unsigned int state; + *d->dbSession.getBackendSession() << "SELECT state FROM chat_message_participant" " WHERE event_id = :eventId AND participant_sip_address_id = :participantSipAddressId", soci::into(state), soci::use(eventId), soci::use(participantSipAddressId); - return static_cast(state); + return ChatMessage::State(state); }; } @@ -2127,18 +1940,16 @@ void MainDb::setChatMessageParticipantState ( const IdentityAddress &participantAddress, ChatMessage::State state ) { - L_DB_EXCEPTION_HANDLER { + L_DB_TRANSACTION { L_D(); - soci::session *session = d->dbSession.getBackendSession(); - const EventLogPrivate *dEventLog = eventLog->getPrivate(); MainDbKeyPrivate *dEventKey = static_cast(dEventLog->dbKey).getPrivate(); const long long &eventId = dEventKey->storageId; const long long &participantSipAddressId = d->selectSipAddressId(participantAddress.asString()); int stateInt = static_cast(state); - *session << "UPDATE chat_message_participant SET state = :state" + *d->dbSession.getBackendSession() << "UPDATE chat_message_participant SET state = :state" " WHERE event_id = :eventId AND participant_sip_address_id = :participantSipAddressId", soci::use(stateInt), soci::use(eventId), soci::use(participantSipAddressId); @@ -2158,44 +1969,33 @@ list> MainDb::findChatMessages ( const ChatRoomId &chatRoomId, const string &imdnMessageId ) const { - static const string query = "SELECT id, type, creation_time FROM event" - " WHERE id IN (" - " SELECT event_id FROM conference_event" - " WHERE event_id IN (SELECT event_id FROM conference_chat_message_event WHERE imdn_message_id = :imdnMessageId)" - " AND chat_room_id = :chatRoomId" - " )"; + // TODO: Optimize. + static const string query = Statements::get(Statements::SelectConferenceEvents) + + string(" AND imdn_message_id = :imdnMessageId"); DurationLogger durationLogger( "Find chat messages: (peer=" + chatRoomId.getPeerAddress().asString() + ", local=" + chatRoomId.getLocalAddress().asString() + ")." ); - return L_DB_EXCEPTION_HANDLER { + return L_DB_TRANSACTION { L_D(); - soci::session *session = d->dbSession.getBackendSession(); - + shared_ptr chatRoom = d->findChatRoom(chatRoomId); list> chatMessages; + if (!chatRoom) + return chatMessages; const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId); - soci::rowset rows = (session->prepare << query, soci::use(imdnMessageId), soci::use(dbChatRoomId)); + soci::rowset rows = ( + d->dbSession.getBackendSession()->prepare << query, soci::use(dbChatRoomId), soci::use(imdnMessageId) + ); for (const auto &row : rows) { - long long eventId = d->dbSession.resolveId(row, 0); - shared_ptr event = d->getEventFromCache(eventId); - - if (!event) - event = d->selectGenericConferenceEvent( - eventId, - EventLog::Type(row.get(1)), - Utils::getTmAsTimeT(row.get(2)), - chatRoomId - ); - + shared_ptr event = d->selectGenericConferenceEvent(chatRoom, row); if (event) { L_ASSERT(event->getType() == EventLog::Type::ConferenceChatMessage); chatMessages.push_back(static_pointer_cast(event)->getChatMessage()); - } else - lWarning() << "Unable to fetch event: " << eventId; + } } return chatMessages; @@ -2223,18 +2023,18 @@ list> MainDb::getHistoryRange ( return events; } - string query = Statements::get(Statements::SelectConferenceEvents, Backend::Sqlite3) + buildSqlEventFilter({ + string query = Statements::get(Statements::SelectConferenceEvents) + buildSqlEventFilter({ ConferenceCallFilter, ConferenceChatMessageFilter, ConferenceInfoFilter, ConferenceInfoNoDeviceFilter }, mask, "AND"); - query += " ORDER BY event_id DESC"; + query += " ORDER BY event_id DESC"; if (end > 0) - query += " LIMIT " + Utils::toString(end - begin); + query += " LIMIT " + Utils::toString(end - begin); else - query += " LIMIT " + d->dbSession.noLimitValue(); + query += " LIMIT " + d->dbSession.noLimitValue(); if (begin > 0) - query += " OFFSET " + Utils::toString(begin); + query += " OFFSET " + Utils::toString(begin); DurationLogger durationLogger( "Get history range of: (peer=" + chatRoomId.getPeerAddress().asString() + @@ -2242,57 +2042,19 @@ list> MainDb::getHistoryRange ( ", begin=" + Utils::toString(begin) + ", end=" + Utils::toString(end) + ")." ); - return L_DB_EXCEPTION_HANDLER { + return L_DB_TRANSACTION { L_D(); - soci::session *session = d->dbSession.getBackendSession(); - - shared_ptr core = getCore(); - shared_ptr chatRoom = core->findChatRoom(chatRoomId); - if (!chatRoom) { - lError() << "Unable to find chat room storage id of (peer=" + - chatRoomId.getPeerAddress().asString() + - ", local=" + chatRoomId.getLocalAddress().asString() + "`)."; + shared_ptr chatRoom = d->findChatRoom(chatRoomId); + if (!chatRoom) return events; - } const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId); - soci::rowset rows = (session->prepare << query, soci::use(dbChatRoomId)); + soci::rowset rows = (d->dbSession.getBackendSession()->prepare << query, soci::use(dbChatRoomId)); for (const auto &row : rows) { - long long eventId = d->dbSession.resolveId(row, 0); - shared_ptr event = d->getEventFromCache(eventId); - - if (!event) { - EventLog::Type type = EventLog::Type(row.get(1)); - - // TODO: Remove me. Performance workaround. - if (type == EventLog::Type::ConferenceChatMessage) - event = d->selectConferenceChatMessageEvent( - eventId, - type, - Utils::getTmAsTimeT(row.get(2)), - chatRoom, - row.get(3), - row.get(4), - row.get(5), - row.get(6), - row.get(7), - row.get(8), - row.get(9) - ); - else - event = d->selectGenericConferenceEvent( - eventId, - type, - Utils::getTmAsTimeT(row.get(2)), - chatRoomId - ); - } - + shared_ptr event = d->selectGenericConferenceEvent(chatRoom, row); if (event) events.push_front(event); - else - lWarning() << "Unable to fetch event: " << eventId; } return events; @@ -2306,21 +2068,31 @@ int MainDb::getHistorySize (const ChatRoomId &chatRoomId, FilterMask mask) const ConferenceCallFilter, ConferenceChatMessageFilter, ConferenceInfoFilter, ConferenceInfoNoDeviceFilter }, mask, "AND"); - return L_DB_EXCEPTION_HANDLER { + return L_DB_TRANSACTION { L_D(); - soci::session *session = d->dbSession.getBackendSession(); - int count; const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId); - *session << query, soci::into(count), soci::use(dbChatRoomId); + *d->dbSession.getBackendSession() << query, soci::into(count), soci::use(dbChatRoomId); return count; }; } +template +static void fetchContentAppData (soci::session *session, Content &content, long long contentId, T &data) { + static const string query = "SELECT name, data FROM chat_message_content_app_data" + " WHERE chat_message_content_id = :contentId"; + + string name; + soci::statement statement = (session->prepare << query, soci::use(contentId), soci::into(name), soci::into(data)); + statement.execute(); + while (statement.fetch()) + content.setAppData(name, blobToString(data)); +} + void MainDb::loadChatMessageContents (const shared_ptr &chatMessage) { - L_DB_EXCEPTION_HANDLER { + L_DB_TRANSACTION { L_D(); soci::session *session = d->dbSession.getBackendSession(); @@ -2395,15 +2167,13 @@ void MainDb::cleanHistory (const ChatRoomId &chatRoomId, FilterMask mask) { ", mask=" + Utils::toString(mask) + ")." ); - L_DB_EXCEPTION_HANDLER { + L_DB_TRANSACTION { L_D(); - soci::session *session = d->dbSession.getBackendSession(); - const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId); d->invalidConferenceEventsFromQuery(query, dbChatRoomId); - *session << "DELETE FROM event WHERE id IN (" + query + ")", soci::use(dbChatRoomId); + *d->dbSession.getBackendSession() << "DELETE FROM event WHERE id IN (" + query + ")", soci::use(dbChatRoomId); tr.commit(); }; @@ -2412,15 +2182,15 @@ void MainDb::cleanHistory (const ChatRoomId &chatRoomId, FilterMask mask) { // ----------------------------------------------------------------------------- list> MainDb::getChatRooms () const { - static const string query = "SELECT chat_room.id, peer_sip_address.value, local_sip_address.value, " - "creation_time, last_update_time, capabilities, subject, last_notify_id, flags" - " FROM chat_room, sip_address AS peer_sip_address, sip_address AS local_sip_address" - " WHERE chat_room.peer_sip_address_id = peer_sip_address.id AND chat_room.local_sip_address_id = local_sip_address.id" - " ORDER BY last_update_time DESC"; + static const string query = "SELECT chat_room.id, peer_sip_address.value, local_sip_address.value," + " creation_time, last_update_time, capabilities, subject, last_notify_id, flags" + " FROM chat_room, sip_address AS peer_sip_address, sip_address AS local_sip_address" + " WHERE chat_room.peer_sip_address_id = peer_sip_address.id AND chat_room.local_sip_address_id = local_sip_address.id" + " ORDER BY last_update_time DESC"; DurationLogger durationLogger("Get chat rooms."); - return L_DB_EXCEPTION_HANDLER { + return L_DB_TRANSACTION { L_D(); list> chatRooms; @@ -2456,10 +2226,10 @@ list> MainDb::getChatRooms () const { const long long &dbChatRoomId = d->dbSession.resolveId(row, 0); static const string query = "SELECT chat_room_participant.id, sip_address.value, is_admin" - " FROM sip_address, chat_room, chat_room_participant" - " WHERE chat_room.id = :chatRoomId" - " AND sip_address.id = chat_room_participant.participant_sip_address_id" - " AND chat_room_participant.chat_room_id = chat_room.id"; + " FROM sip_address, chat_room, chat_room_participant" + " WHERE chat_room.id = :chatRoomId" + " AND sip_address.id = chat_room_participant.participant_sip_address_id" + " AND chat_room_participant.chat_room_id = chat_room.id"; // Fetch participants. soci::rowset rows = (session->prepare << query, soci::use(dbChatRoomId)); @@ -2473,8 +2243,8 @@ list> MainDb::getChatRooms () const { { const long long &participantId = d->dbSession.resolveId(row, 0); static const string query = "SELECT sip_address.value, state FROM chat_room_participant_device, sip_address" - " WHERE chat_room_participant_id = :participantId" - " AND participant_device_sip_address_id = sip_address.id"; + " WHERE chat_room_participant_id = :participantId" + " AND participant_device_sip_address_id = sip_address.id"; soci::rowset rows = (session->prepare << query, soci::use(participantId)); for (const auto &row : rows) { @@ -2546,13 +2316,7 @@ list> MainDb::getChatRooms () const { } void MainDb::insertChatRoom (const shared_ptr &chatRoom) { - const ChatRoomId &chatRoomId = chatRoom->getChatRoomId(); - DurationLogger durationLogger( - "Insert chat room: (peer=" + chatRoomId.getPeerAddress().asString() + - ", local=" + chatRoomId.getLocalAddress().asString() + ")." - ); - - L_DB_EXCEPTION_HANDLER { + L_DB_TRANSACTION { L_D(); d->insertChatRoom(chatRoom); @@ -2561,14 +2325,8 @@ void MainDb::insertChatRoom (const shared_ptr &chatRoom) { } void MainDb::deleteChatRoom (const ChatRoomId &chatRoomId) { - DurationLogger durationLogger( - "Delete chat room: (peer=" + chatRoomId.getPeerAddress().asString() + - ", local=" + chatRoomId.getLocalAddress().asString() + "`)." - ); - - L_DB_EXCEPTION_HANDLER { + L_DB_TRANSACTION { L_D(); - soci::session *session = d->dbSession.getBackendSession(); const long long &dbChatRoomId = d->selectChatRoomId(chatRoomId); @@ -2577,7 +2335,7 @@ void MainDb::deleteChatRoom (const ChatRoomId &chatRoomId) { dbChatRoomId ); - *session << "DELETE FROM chat_room WHERE id = :chatRoomId", soci::use(dbChatRoomId); + *d->dbSession.getBackendSession() << "DELETE FROM chat_room WHERE id = :chatRoomId", soci::use(dbChatRoomId); tr.commit(); }; @@ -2590,13 +2348,10 @@ void MainDb::migrateBasicToClientGroupChatRoom ( L_ASSERT(basicChatRoom->getCapabilities().isSet(ChatRoom::Capabilities::Basic)); L_ASSERT(clientGroupChatRoom->getCapabilities().isSet(ChatRoom::Capabilities::Conference)); - L_DB_EXCEPTION_HANDLER { + L_DB_TRANSACTION { L_D(); // TODO: Update events and chat messages. (Or wait signals.) - - soci::session *session = d->dbSession.getBackendSession(); - const long long &dbChatRoomId = d->selectChatRoomId(basicChatRoom->getChatRoomId()); const ChatRoomId &newChatRoomId = clientGroupChatRoom->getChatRoomId(); @@ -2604,11 +2359,11 @@ void MainDb::migrateBasicToClientGroupChatRoom ( const long long &localSipAddressId = d->insertSipAddress(newChatRoomId.getLocalAddress().asString()); const int &capabilities = clientGroupChatRoom->getCapabilities(); - *session << "UPDATE chat_room" - " SET capabilities = :capabilities," - " peer_sip_address_id = :peerSipAddressId," - " local_sip_address_id = :localSipAddressId" - " WHERE id = :chatRoomId", soci::use(capabilities), soci::use(peerSipAddressId), + *d->dbSession.getBackendSession() << "UPDATE chat_room" + " SET capabilities = :capabilities," + " peer_sip_address_id = :peerSipAddressId," + " local_sip_address_id = :localSipAddressId" + " WHERE id = :chatRoomId", soci::use(capabilities), soci::use(peerSipAddressId), soci::use(localSipAddressId), soci::use(dbChatRoomId); shared_ptr me = clientGroupChatRoom->getMe(); @@ -2642,11 +2397,9 @@ IdentityAddress MainDb::findMissingOneToOneConferenceChatRoomParticipantAddress L_ASSERT(chatRoom->getCapabilities() & ChatRoom::Capabilities::OneToOne); L_ASSERT(chatRoom->getParticipantCount() == 1); - return L_DB_EXCEPTION_HANDLER { + return L_DB_TRANSACTION { L_D(); - soci::session *session = d->dbSession.getBackendSession(); - string missingParticipantAddress; string participantASipAddress; string participantBSipAddress; @@ -2654,7 +2407,7 @@ IdentityAddress MainDb::findMissingOneToOneConferenceChatRoomParticipantAddress const long long &chatRoomId = d->selectChatRoomId(chatRoom->getChatRoomId()); L_ASSERT(chatRoomId != -1); - *session << "SELECT participant_a_sip_address.value, participant_b_sip_address.value" + *d->dbSession.getBackendSession() << "SELECT participant_a_sip_address.value, participant_b_sip_address.value" " FROM one_to_one_chat_room, sip_address AS participant_a_sip_address, sip_address AS participant_b_sip_address" " WHERE chat_room_id = :chatRoomId" " AND participant_a_sip_address_id = participant_a_sip_address.id" @@ -2675,20 +2428,18 @@ IdentityAddress MainDb::findOneToOneConferenceChatRoomAddress ( const IdentityAddress &participantA, const IdentityAddress &participantB ) const { - return L_DB_EXCEPTION_HANDLER { + return L_DB_TRANSACTION { L_D(); - soci::session *session = d->dbSession.getBackendSession(); - const long long &participantASipAddressId = d->selectSipAddressId(participantA.asString()); const long long &participantBSipAddressId = d->selectSipAddressId(participantB.asString()); - if ((participantASipAddressId == -1) || (participantBSipAddressId == -1)) + if (participantASipAddressId == -1 || participantBSipAddressId == -1) return IdentityAddress(); const long long &chatRoomId = d->selectOneToOneChatRoomId(participantASipAddressId, participantBSipAddressId); string chatRoomAddress; - *session << "SELECT sip_address.value" + *d->dbSession.getBackendSession() << "SELECT sip_address.value" " FROM chat_room, sip_address" " WHERE chat_room.id = :chatRoomId AND peer_sip_address_id = sip_address.id", soci::use(chatRoomId), soci::into(chatRoomAddress); @@ -2701,7 +2452,7 @@ void MainDb::insertOneToOneConferenceChatRoom (const shared_ptrgetCore()->getCCore())); L_ASSERT(chatRoom->getCapabilities() & ChatRoom::Capabilities::OneToOne); - L_DB_EXCEPTION_HANDLER { + L_DB_TRANSACTION { L_D(); const list> &participants = chatRoom->getParticipants(); @@ -2722,7 +2473,7 @@ void MainDb::insertOneToOneConferenceChatRoom (const shared_ptrdbSession.getBackendSession(); @@ -2747,18 +2498,16 @@ void MainDb::updateChatRoomParticipantDevice ( const shared_ptr &chatRoom, const shared_ptr &device ) { - L_DB_EXCEPTION_HANDLER { + L_DB_TRANSACTION { L_D(); - soci::session *session = d->dbSession.getBackendSession(); - const long long &dbChatRoomId = d->selectChatRoomId(chatRoom->getChatRoomId()); const long long &participantSipAddressId = d->selectSipAddressId(device->getParticipant()->getAddress().asString()); const long long &participantId = d->selectChatRoomParticipantId(dbChatRoomId, participantSipAddressId); const long long &participantSipDeviceAddressId = d->selectSipAddressId(device->getAddress().asString()); unsigned int state = static_cast(device->getState()); - *session << "UPDATE chat_room_participant_device SET state = :state" - " WHERE chat_room_participant_id = :participantId AND participant_device_sip_address_id = :participantSipDeviceAddressId", + *d->dbSession.getBackendSession() << "UPDATE chat_room_participant_device SET state = :state" + " WHERE chat_room_participant_id = :participantId AND participant_device_sip_address_id = :participantSipDeviceAddressId", soci::use(state), soci::use(participantId), soci::use(participantSipDeviceAddressId); tr.commit(); @@ -2788,103 +2537,4 @@ bool MainDb::import (Backend, const string ¶meters) { return true; } -// ----------------------------------------------------------------------------- -// No backend. -// ----------------------------------------------------------------------------- - -#else - -void MainDb::init () {} - -bool MainDb::addEvent (const shared_ptr &) { - return false; -} - -bool MainDb::updateEvent (const shared_ptr &) { - return false; -} - -bool MainDb::deleteEvent (const shared_ptr &) { - return false; -} - -int MainDb::getEventCount (FilterMask) const { - return 0; -} - -shared_ptr MainDb::getEventFromKey (const MainDbKey &) { - return nullptr; -} - -list> MainDb::getConferenceNotifiedEvents ( - const ChatRoomId &, - unsigned int -) const { - return list>(); -} - -int MainDb::getChatMessageCount (const ChatRoomId &) const { - return 0; -} - -int MainDb::getUnreadChatMessageCount (const ChatRoomId &) const { - return 0; -} - -shared_ptr MainDb::getLastChatMessage (const ChatRoomId &) const { - return nullptr; -} - -list> MainDb::findChatMessages (const ChatRoomId &, const string &) const { - return list>(); -} - -void MainDb::markChatMessagesAsRead (const ChatRoomId &) const {} - -list> MainDb::getUnreadChatMessages (const ChatRoomId &) const { - return list>(); -} - -list> MainDb::getHistory (const ChatRoomId &, int, FilterMask) const { - return list>(); -} - -list> MainDb::getHistoryRange (const ChatRoomId &, int, int, FilterMask) const { - return list>(); -} - -int MainDb::getHistorySize (const ChatRoomId &, FilterMask) const { - return 0; -} - -list> MainDb::getChatRooms () const { - return list>(); -} - -void MainDb::insertChatRoom (const shared_ptr &) {} - -void MainDb::deleteChatRoom (const ChatRoomId &) {} - -void MainDb::migrateBasicToClientGroupChatRoom ( - const shared_ptr &, - const shared_ptr & -) {} - -IdentityAddress MainDb::findOneToOneConferenceChatRoomAddress ( - const IdentityAddress &, - const IdentityAddress & -) const { - return IdentityAddress(); -} - -void MainDb::loadChatMessageContents (const shared_ptr &) {} - -void MainDb::cleanHistory (const ChatRoomId &, FilterMask) {} - -bool MainDb::import (Backend, const string &) { - return false; -} - -#endif // ifdef SOCI_ENABLED - LINPHONE_END_NAMESPACE diff --git a/src/db/main-db.h b/src/db/main-db.h index 14e7294c9..f0f4b6f06 100644 --- a/src/db/main-db.h +++ b/src/db/main-db.h @@ -43,7 +43,7 @@ class ParticipantDevice; class MainDb : public AbstractDb, public CoreAccessor { template - friend class DbExceptionHandler; + friend class DbTransaction; friend class MainDbChatMessageKey; friend class MainDbEventKey; @@ -87,8 +87,8 @@ public: int getChatMessageCount (const ChatRoomId &chatRoomId = ChatRoomId()) const; int getUnreadChatMessageCount (const ChatRoomId &chatRoomId = ChatRoomId()) const; - void markChatMessagesAsRead (const ChatRoomId &chatRoomId = ChatRoomId()) const; - std::list> getUnreadChatMessages (const ChatRoomId &chatRoomId = ChatRoomId()) const; + void markChatMessagesAsRead (const ChatRoomId &chatRoomId) const; + std::list> getUnreadChatMessages (const ChatRoomId &chatRoomId) const; std::list getChatMessageParticipantStates (const std::shared_ptr &eventLog) const; ChatMessage::State getChatMessageParticipantState ( diff --git a/src/db/session/db-session.cpp b/src/db/session/db-session.cpp index b38550e35..e9fbc4450 100644 --- a/src/db/session/db-session.cpp +++ b/src/db/session/db-session.cpp @@ -36,25 +36,19 @@ public: Sqlite3 } backend = Backend::None; - #ifdef SOCI_ENABLED - std::unique_ptr backendSession; - #endif // ifdef SOCI_ENABLED + std::unique_ptr backendSession; }; DbSession::DbSession () : mPrivate(new DbSessionPrivate) {} DbSession::DbSession (const string &uri) : DbSession() { - #ifdef SOCI_ENABLED - try { - L_D(); - d->backendSession = makeUnique(uri); - d->backend = !uri.find("mysql") ? DbSessionPrivate::Backend::Mysql : DbSessionPrivate::Backend::Sqlite3; - } catch (const exception &e) { - lWarning() << "Unable to build db session with uri: " << e.what(); - } - #else - lWarning() << "Unable to build db session with uri: soci not enabled."; - #endif // ifdef SOCI_ENABLED + try { + L_D(); + d->backendSession = makeUnique(uri); + d->backend = !uri.find("mysql") ? DbSessionPrivate::Backend::Mysql : DbSessionPrivate::Backend::Sqlite3; + } catch (const exception &e) { + lWarning() << "Unable to build db session with uri: " << e.what(); + } } DbSession::DbSession (DbSession &&other) : mPrivate(other.mPrivate) { @@ -76,12 +70,8 @@ DbSession::operator bool () const { } soci::session *DbSession::getBackendSession () const { - #ifdef SOCI_ENABLED - L_D(); - return d->backendSession.get(); - #else - return nullptr; - #endif // ifdef SOCI_ENABLED + L_D(); + return d->backendSession.get(); } string DbSession::primaryKeyStr (const string &type) const { @@ -183,68 +173,58 @@ long long DbSession::getLastInsertId () const { break; } - #ifdef SOCI_ENABLED - *d->backendSession << sql, soci::into(id); - #endif // ifdef SOCI_ENABLED + *d->backendSession << sql, soci::into(id); return id; } void DbSession::enableForeignKeys (bool status) { - #ifdef SOCI_ENABLED - L_D(); - switch (d->backend) { - case DbSessionPrivate::Backend::Mysql: - *d->backendSession << string("SET FOREIGN_KEY_CHECKS = ") + (status ? "1" : "0"); - break; - case DbSessionPrivate::Backend::Sqlite3: - *d->backendSession << string("PRAGMA foreign_keys = ") + (status ? "ON" : "OFF"); - break; - case DbSessionPrivate::Backend::None: - break; - } - #endif // ifdef SOCI_ENABLED + L_D(); + + switch (d->backend) { + case DbSessionPrivate::Backend::Mysql: + *d->backendSession << string("SET FOREIGN_KEY_CHECKS = ") + (status ? "1" : "0"); + break; + case DbSessionPrivate::Backend::Sqlite3: + *d->backendSession << string("PRAGMA foreign_keys = ") + (status ? "ON" : "OFF"); + break; + case DbSessionPrivate::Backend::None: + break; + } } bool DbSession::checkTableExists (const string &table) const { - #ifdef SOCI_ENABLED - L_D(); - soci::session *session = d->backendSession.get(); - switch (d->backend) { - case DbSessionPrivate::Backend::Mysql: - *session << "SHOW TABLES LIKE :table", soci::use(table); - return session->got_data() > 0; - case DbSessionPrivate::Backend::Sqlite3: - *session << "SELECT name FROM sqlite_master WHERE type='table' AND name=:table", soci::use(table); - return session->got_data() > 0; - case DbSessionPrivate::Backend::None: - return false; - } - L_ASSERT(false); - #else - (void)table; - #endif // ifdef SOCI_ENABLED + L_D(); + soci::session *session = d->backendSession.get(); + switch (d->backend) { + case DbSessionPrivate::Backend::Mysql: + *session << "SHOW TABLES LIKE :table", soci::use(table); + return session->got_data() > 0; + case DbSessionPrivate::Backend::Sqlite3: + *session << "SELECT name FROM sqlite_master WHERE type='table' AND name=:table", soci::use(table); + return session->got_data() > 0; + case DbSessionPrivate::Backend::None: + return false; + } + + L_ASSERT(false); return false; } long long DbSession::resolveId (const soci::row &row, int col) const { - #ifdef SOCI_ENABLED - L_D(); - switch (d->backend) { - case DbSessionPrivate::Backend::Mysql: - return static_cast(row.get(0)); - case DbSessionPrivate::Backend::Sqlite3: - return static_cast(row.get(0)); - case DbSessionPrivate::Backend::None: - return 0; - } - L_ASSERT(false); - #else - (void)row; - (void)col; - #endif // ifdef SOCI_ENABLED + L_D(); + switch (d->backend) { + case DbSessionPrivate::Backend::Mysql: + return static_cast(row.get(0)); + case DbSessionPrivate::Backend::Sqlite3: + return static_cast(row.get(0)); + case DbSessionPrivate::Backend::None: + return 0; + } + + L_ASSERT(false); return 0; } diff --git a/src/db/session/db-session.h b/src/db/session/db-session.h index 6d4bf7b1c..0189bf997 100644 --- a/src/db/session/db-session.h +++ b/src/db/session/db-session.h @@ -20,28 +20,17 @@ #ifndef _L_DB_SESSION_H_ #define _L_DB_SESSION_H_ -#ifdef SOCI_ENABLED - #include -#endif // ifdef SOCI_ENABLED +#include -#include "object/clonable-object.h" +#include "linphone/utils/general.h" // ============================================================================= -#ifndef SOCI_ENABLED - namespace soci { - class row; - class session; - } -#endif // ifndef SOCI_ENABLED - LINPHONE_BEGIN_NAMESPACE class DbSessionPrivate; class DbSession { - friend class DbSessionProvider; - public: DbSession (); explicit DbSession (const std::string &uri); From badcd4c536b6eac9fb97f300d44fcb75855d23e2 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 6 Mar 2018 09:22:26 +0100 Subject: [PATCH 204/281] fix(CoreChatRoom): typo --- src/core/core-chat-room.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/core-chat-room.cpp b/src/core/core-chat-room.cpp index 1084d48e6..0bceb5707 100644 --- a/src/core/core-chat-room.cpp +++ b/src/core/core-chat-room.cpp @@ -189,7 +189,7 @@ shared_ptr Core::findOneToOneChatRoom ( const IdentityAddress &curLocalAddress = chatRoom->getLocalAddress(); ChatRoom::CapabilitiesMask capabilities = chatRoom->getCapabilities(); - // We are looking fo a one to one chatroom + // We are looking for a one to one chatroom // Do not return a group chat room that everyone except one person has left if (!(capabilities & ChatRoom::Capabilities::OneToOne)) continue; From 9e4e48830be42c921072e781e3f5ecdb5cc4e07f Mon Sep 17 00:00:00 2001 From: Benjamin Reis Date: Tue, 6 Mar 2018 10:00:53 +0100 Subject: [PATCH 205/281] We build on C++11 --- src/db/main-db.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 45b80c128..99209a3b3 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -301,7 +301,7 @@ long long MainDbPrivate::insertOrUpdateImportedBasicChatRoom ( return id; } - constexpr int capabilities = ChatRoom::CapabilitiesMask( + const int capabilities = ChatRoom::CapabilitiesMask( { ChatRoom::Capabilities::Basic, ChatRoom::Capabilities::Migratable } ); lInfo() << "Insert new chat room in database: (peer=" << peerSipAddressId << From ae06ed6d551968c41e42352982d900a6bfaffefa Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 6 Mar 2018 10:24:28 +0100 Subject: [PATCH 206/281] chore(CMakeLists.txt): disable C++ extensions like GNU11 --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1fb65a4de..bae67bcb6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -68,6 +68,7 @@ cmake_dependent_option(ENABLE_NOTIFY "Enable libnotify support." YES "ENABLE_GTK cmake_dependent_option(ENABLE_ASSISTANT "Turn on assistant compiling." YES "ENABLE_GTK_UI" NO) set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_EXTENSIONS NO) if(NOT CMAKE_BUILD_TYPE) set(CMAKE_BUILD_TYPE "Release") From cf37868b503f9c3c0967ad144b1cda30146afcf0 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 6 Mar 2018 11:32:42 +0100 Subject: [PATCH 207/281] fix(c-core): clean default proxy before core --- coreapi/linphonecore.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 84ccd6461..cc85eb679 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -2320,7 +2320,7 @@ void linphone_core_start (LinphoneCore *lc) { lp_config_set_string(lc->config,"misc","uuid",tmp); }else if (strcmp(uuid,"0")!=0) /*to allow to disable sip.instance*/ lc->sal->set_uuid(uuid); - + if (lc->sal->get_root_ca()) { belle_tls_crypto_config_set_root_ca(lc->http_crypto_config, lc->sal->get_root_ca()); belle_http_provider_set_tls_crypto_config(lc->http_provider, lc->http_crypto_config); @@ -5812,6 +5812,22 @@ void sip_config_uninit(LinphoneCore *lc) } if (i>=20) ms_warning("Cannot complete unregistration, giving up"); } + + elem = config->proxies; + config->proxies=NULL; /*to make sure proxies cannot be referenced during deletion*/ + bctbx_list_free_with_data(elem,(void (*)(void*)) _linphone_proxy_config_release); + + config->deleted_proxies=bctbx_list_free_with_data(config->deleted_proxies,(void (*)(void*)) _linphone_proxy_config_release); + + /*no longuer need to write proxy config if not changed linphone_proxy_config_write_to_config_file(lc->config,NULL,i);*/ /*mark the end */ + + lc->auth_info=bctbx_list_free_with_data(lc->auth_info,(void (*)(void*))linphone_auth_info_unref); + lc->default_proxy = NULL; + + if (lc->vcard_context) { + linphone_vcard_context_destroy(lc->vcard_context); + } + lc->sal->reset_transports(); lc->sal->unlisten_ports(); /*to make sure no new messages are received*/ if (lc->http_provider) { @@ -5836,19 +5852,6 @@ void sip_config_uninit(LinphoneCore *lc) delete lc->sal; lc->sal=NULL; - elem = config->proxies; - config->proxies=NULL; /*to make sure proxies cannot be refferenced during deletion*/ - bctbx_list_free_with_data(elem,(void (*)(void*)) _linphone_proxy_config_release); - - config->deleted_proxies=bctbx_list_free_with_data(config->deleted_proxies,(void (*)(void*)) _linphone_proxy_config_release); - - /*no longuer need to write proxy config if not changedlinphone_proxy_config_write_to_config_file(lc->config,NULL,i);*/ /*mark the end */ - - lc->auth_info=bctbx_list_free_with_data(lc->auth_info,(void (*)(void*))linphone_auth_info_unref); - - if (lc->vcard_context) { - linphone_vcard_context_destroy(lc->vcard_context); - } if (lc->sip_conf.guessed_contact) ms_free(lc->sip_conf.guessed_contact); From 2154c78ff37e553d2a3a8a6218ff6095725b9d20 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 6 Mar 2018 12:28:09 +0100 Subject: [PATCH 208/281] fix(ChatMessage): avoid invalid read of destroyed strings, and construct C++ cache correctly!!! --- src/c-wrapper/api/c-chat-message.cpp | 44 +++++++++++++++----------- src/chat/chat-message/chat-message-p.h | 6 ++-- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/src/c-wrapper/api/c-chat-message.cpp b/src/c-wrapper/api/c-chat-message.cpp index 1c4fb7c62..4b99e8bcb 100644 --- a/src/c-wrapper/api/c-chat-message.cpp +++ b/src/c-wrapper/api/c-chat-message.cpp @@ -23,14 +23,14 @@ #include "ortp/b64.h" -#include "c-wrapper/c-wrapper.h" #include "address/address.h" -#include "content/content.h" -#include "content/content-type.h" +#include "c-wrapper/c-wrapper.h" #include "chat/chat-message/chat-message-p.h" #include "chat/chat-room/chat-room-p.h" #include "chat/chat-room/real-time-text-chat-room-p.h" #include "chat/notification/imdn.h" +#include "content/content-type.h" +#include "content/content.h" // ============================================================================= @@ -45,13 +45,18 @@ L_DECLARE_C_OBJECT_IMPL_WITH_XTORS(ChatMessage, LinphoneAddress *from; // cache for shared_ptr

LinphoneAddress *to; // cache for shared_ptr
LinphoneChatMessageStateChangedCb message_state_changed_cb; - void* message_state_changed_user_data; - mutable char *contentTypeCache; - mutable std::string textContentBody; + void *message_state_changed_user_data; + + struct Cache { + string contentType; + string textContentBody; + string customHeaderValue; + } mutable cache; ) static void _linphone_chat_message_constructor (LinphoneChatMessage *msg) { msg->cbs = linphone_chat_message_cbs_new(); + new(&msg->cache) LinphoneChatMessage::Cache(); } static void _linphone_chat_message_destructor (LinphoneChatMessage *msg) { @@ -61,8 +66,8 @@ static void _linphone_chat_message_destructor (LinphoneChatMessage *msg) { linphone_address_unref(msg->from); if (msg->to) linphone_address_unref(msg->to); - if (msg->contentTypeCache) - ms_free(msg->contentTypeCache); + + msg->cache.~Cache(); } // ============================================================================= @@ -160,8 +165,11 @@ void linphone_chat_message_set_file_transfer_filepath(LinphoneChatMessage *msg, L_GET_PRIVATE_FROM_C_OBJECT(msg)->setFileTransferFilepath(L_C_TO_STRING(filepath)); } -void linphone_chat_message_add_custom_header(LinphoneChatMessage *msg, const char *header_name, - const char *header_value) { +void linphone_chat_message_add_custom_header( + LinphoneChatMessage *msg, + const char *header_name, + const char *header_value +) { L_GET_PRIVATE_FROM_C_OBJECT(msg)->addSalCustomHeader(L_C_TO_STRING(header_name), L_C_TO_STRING(header_value)); } @@ -170,7 +178,8 @@ void linphone_chat_message_remove_custom_header(LinphoneChatMessage *msg, const } const char *linphone_chat_message_get_custom_header(LinphoneChatMessage *msg, const char *header_name) { - return L_STRING_TO_C(L_GET_PRIVATE_FROM_C_OBJECT(msg)->getSalCustomHeaderValue(L_C_TO_STRING(header_name))); + msg->cache.customHeaderValue = L_GET_PRIVATE_FROM_C_OBJECT(msg)->getSalCustomHeaderValue(L_C_TO_STRING(header_name)); + return L_STRING_TO_C(msg->cache.customHeaderValue); } const LinphoneErrorInfo *linphone_chat_message_get_error_info(const LinphoneChatMessage *msg) { @@ -229,8 +238,8 @@ const char *linphone_chat_message_get_text_content(const LinphoneChatMessage *ms const LinphonePrivate::Content *content = L_GET_PRIVATE_FROM_C_OBJECT(msg)->getTextContent(); if (content->isEmpty()) return nullptr; - msg->textContentBody = content->getBodyAsString(); - return L_STRING_TO_C(msg->textContentBody); + msg->cache.textContentBody = content->getBodyAsString(); + return L_STRING_TO_C(msg->cache.textContentBody); } // ============================================================================= @@ -257,12 +266,9 @@ void * linphone_chat_message_get_message_state_changed_cb_user_data(LinphoneChat // Structure has changed, hard to keep the behavior // ============================================================================= -const char * linphone_chat_message_get_content_type(LinphoneChatMessage *msg) { - if (msg->contentTypeCache) { - ms_free(msg->contentTypeCache); - } - msg->contentTypeCache = ms_strdup(L_STRING_TO_C(L_GET_PRIVATE_FROM_C_OBJECT(msg)->getContentType().asString())); - return msg->contentTypeCache; +const char *linphone_chat_message_get_content_type(LinphoneChatMessage *msg) { + msg->cache.contentType = L_GET_PRIVATE_FROM_C_OBJECT(msg)->getContentType().asString(); + return L_STRING_TO_C(msg->cache.contentType); } void linphone_chat_message_set_content_type(LinphoneChatMessage *msg, const char *content_type) { diff --git a/src/chat/chat-message/chat-message-p.h b/src/chat/chat-message/chat-message-p.h index 740900df0..730270265 100644 --- a/src/chat/chat-message/chat-message-p.h +++ b/src/chat/chat-message/chat-message-p.h @@ -102,9 +102,9 @@ public: SalCustomHeader *getSalCustomHeaders () const; void setSalCustomHeaders (SalCustomHeader *headers); - void addSalCustomHeader (const std::string& name, const std::string& value); - void removeSalCustomHeader (const std::string& name); - std::string getSalCustomHeaderValue (const std::string& name); + void addSalCustomHeader (const std::string &name, const std::string &value); + void removeSalCustomHeader (const std::string &name); + std::string getSalCustomHeaderValue (const std::string &name); void loadFileTransferUrlFromBodyToContent (); From d8e81d63c89c2e3e182b09ebaa55cdd7f8bb5758 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 6 Mar 2018 12:30:24 +0100 Subject: [PATCH 209/281] When a call session of a ClientGroupChatRoom is released, destroy the chat room only if the state is TerminationPending and there was no error during the termination. --- src/chat/chat-room/client-group-chat-room.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/chat/chat-room/client-group-chat-room.cpp b/src/chat/chat-room/client-group-chat-room.cpp index a3de641a3..a5ea59cb4 100644 --- a/src/chat/chat-room/client-group-chat-room.cpp +++ b/src/chat/chat-room/client-group-chat-room.cpp @@ -143,8 +143,17 @@ void ClientGroupChatRoomPrivate::onCallSessionStateChanged ( qConference->getPrivate()->eventHandler->subscribe(q->getChatRoomId()); } else if (q->getState() == ChatRoom::State::TerminationPending) qConference->getPrivate()->focus->getPrivate()->getSession()->terminate(); - } else if ((newState == CallSession::State::Released) && (q->getState() == ChatRoom::State::TerminationPending)) { - q->onConferenceTerminated(q->getConferenceAddress()); + } else if (newState == CallSession::State::Released) { + if (q->getState() == ChatRoom::State::TerminationPending) { + if (session->getReason() == LinphoneReasonNone) { + // Everything is fine, the chat room has been left on the server side + q->onConferenceTerminated(q->getConferenceAddress()); + } else { + // Go to state TerminationFailed and then back to Created since it has not been terminated + setState(ChatRoom::State::TerminationFailed); + setState(ChatRoom::State::Created); + } + } } else if (newState == CallSession::State::Error) { if (q->getState() == ChatRoom::State::CreationPending) setState(ChatRoom::State::CreationFailed); From 2f1be97c10278b7e5096e15b266f2cfc0a6f5e1c Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Tue, 6 Mar 2018 15:39:13 +0100 Subject: [PATCH 210/281] fix(c-tools): fix a memory leak on getResolvedCListFromCppList --- src/c-wrapper/internal/c-tools.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/c-wrapper/internal/c-tools.h b/src/c-wrapper/internal/c-tools.h index f7d39519a..17ec09ff5 100644 --- a/src/c-wrapper/internal/c-tools.h +++ b/src/c-wrapper/internal/c-tools.h @@ -562,7 +562,7 @@ public: static inline bctbx_list_t *getResolvedCListFromCppList (const std::list &cppList) { bctbx_list_t *result = nullptr; for (const auto &value : cppList) - result = bctbx_list_append(result, belle_sip_object_ref(getCBackPtr(&value))); + result = bctbx_list_append(result, getCBackPtr(&value)); return result; } From 9d7a94303299097d464c0d82fcdfc2654809ebb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Turnel?= Date: Tue, 6 Mar 2018 17:04:16 +0100 Subject: [PATCH 211/281] Add reconnect_to_primary_asap parameter to linphonerc and pass it to belle_sip_stack --- coreapi/linphonecore.c | 3 +++ src/sal/sal.h | 1 + 2 files changed, 4 insertions(+) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index cc85eb679..40de59c18 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -1395,6 +1395,9 @@ static void sip_config_read(LinphoneCore *lc) { /*this is to filter out unsupported encryption schemes*/ linphone_core_set_media_encryption(lc,linphone_core_get_media_encryption(lc)); + /*enable the reconnection to the primary server when it is up again asap*/ + lc->sal->enable_reconnect_to_primary_asap(!!lp_config_get_int(lc->config,"sip","reconnect_to_primary_asap",0)); + /*for tuning or test*/ lc->sip_conf.sdp_200_ack = !!lp_config_get_int(lc->config,"sip","sdp_200_ack",0); lc->sip_conf.register_only_when_network_is_up= diff --git a/src/sal/sal.h b/src/sal/sal.h index bf9322d48..3e48bc481 100644 --- a/src/sal/sal.h +++ b/src/sal/sal.h @@ -171,6 +171,7 @@ public: void enable_test_features(bool_t enabled) {this->_enable_test_features=enabled;} void use_no_initial_route(bool_t enabled) {this->no_initial_route=enabled;} void enable_unconditional_answer(int value) {belle_sip_provider_enable_unconditional_answer(this->prov,value);} + void enable_reconnect_to_primary_asap(bool_t enabled) {belle_sip_stack_enable_reconnect_to_primary_asap(this->stack,enabled);} bctbx_list_t *get_pending_auths() const {return bctbx_list_copy(this->pending_auths);} From 9092d88775d5a4f41a4e63b94e18a45d5e51bf69 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 6 Mar 2018 17:50:25 +0100 Subject: [PATCH 212/281] Added method on chat message to know whether or not a download is in progress --- include/linphone/api/c-chat-message.h | 7 +++++++ src/c-wrapper/api/c-chat-message.cpp | 4 ++++ src/chat/chat-message/chat-message.cpp | 5 +++++ src/chat/chat-message/chat-message.h | 1 + 4 files changed, 17 insertions(+) diff --git a/include/linphone/api/c-chat-message.h b/include/linphone/api/c-chat-message.h index 1b66980bf..75445e0b5 100644 --- a/include/linphone/api/c-chat-message.h +++ b/include/linphone/api/c-chat-message.h @@ -362,6 +362,13 @@ LINPHONE_PUBLIC bool_t linphone_chat_message_has_text_content(const LinphoneChat */ LINPHONE_PUBLIC const char* linphone_chat_message_get_text_content(const LinphoneChatMessage *msg); +/** + * Gets whether or not a received file is currently being downloaded + * @param[in] msg LinphoneChatMessage object + * @return true if download is in progress, false otherwise + */ +LINPHONE_PUBLIC bool_t linphone_chat_message_is_download_in_progress(LinphoneChatMessage *msg); + /** * @} */ diff --git a/src/c-wrapper/api/c-chat-message.cpp b/src/c-wrapper/api/c-chat-message.cpp index 4b99e8bcb..693a1789a 100644 --- a/src/c-wrapper/api/c-chat-message.cpp +++ b/src/c-wrapper/api/c-chat-message.cpp @@ -242,6 +242,10 @@ const char *linphone_chat_message_get_text_content(const LinphoneChatMessage *ms return L_STRING_TO_C(msg->cache.textContentBody); } +bool_t linphone_chat_message_is_download_in_progress(LinphoneChatMessage *msg) { + return L_GET_CPP_PTR_FROM_C_OBJECT(msg)->isDownloadInProgress(); +} + // ============================================================================= // Old listener // ============================================================================= diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index 4031ceedb..6f50162b4 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -1040,6 +1040,11 @@ bool ChatMessage::downloadFile(FileTransferContent &fileTransferContent) { return d->fileTransferChatMessageModifier.downloadFile(getSharedFromThis(), &fileTransferContent); } +bool ChatMessage::isDownloadInProgress() { + L_D(); + return d->fileTransferChatMessageModifier.isFileTransferInProgressAndValid(); +} + void ChatMessage::cancelFileTransfer () { L_D(); if (d->fileTransferChatMessageModifier.isFileTransferInProgressAndValid()) { diff --git a/src/chat/chat-message/chat-message.h b/src/chat/chat-message/chat-message.h index 5ed06b1e9..501fb2b83 100644 --- a/src/chat/chat-message/chat-message.h +++ b/src/chat/chat-message/chat-message.h @@ -106,6 +106,7 @@ public: void removeCustomHeader (const std::string &headerName); bool downloadFile (FileTransferContent &content); + bool isDownloadInProgress(); private: ChatMessage (const std::shared_ptr &chatRoom, ChatMessage::Direction direction); From 0684cedc21487decf5b05b24133f4654b86c8024 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 6 Mar 2018 18:00:05 +0100 Subject: [PATCH 213/281] Renamed method as it is also true for uploads --- include/linphone/api/c-chat-message.h | 6 +++--- src/c-wrapper/api/c-chat-message.cpp | 4 ++-- src/chat/chat-message/chat-message.cpp | 2 +- src/chat/chat-message/chat-message.h | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/include/linphone/api/c-chat-message.h b/include/linphone/api/c-chat-message.h index 75445e0b5..f028464a2 100644 --- a/include/linphone/api/c-chat-message.h +++ b/include/linphone/api/c-chat-message.h @@ -363,11 +363,11 @@ LINPHONE_PUBLIC bool_t linphone_chat_message_has_text_content(const LinphoneChat LINPHONE_PUBLIC const char* linphone_chat_message_get_text_content(const LinphoneChatMessage *msg); /** - * Gets whether or not a received file is currently being downloaded + * Gets whether or not a file is currently being downloaded or uploaded * @param[in] msg LinphoneChatMessage object - * @return true if download is in progress, false otherwise + * @return true if download or upload is in progress, false otherwise */ -LINPHONE_PUBLIC bool_t linphone_chat_message_is_download_in_progress(LinphoneChatMessage *msg); +LINPHONE_PUBLIC bool_t linphone_chat_message_is_file_transfer_in_progress(LinphoneChatMessage *msg); /** * @} diff --git a/src/c-wrapper/api/c-chat-message.cpp b/src/c-wrapper/api/c-chat-message.cpp index 693a1789a..333d6a94e 100644 --- a/src/c-wrapper/api/c-chat-message.cpp +++ b/src/c-wrapper/api/c-chat-message.cpp @@ -242,8 +242,8 @@ const char *linphone_chat_message_get_text_content(const LinphoneChatMessage *ms return L_STRING_TO_C(msg->cache.textContentBody); } -bool_t linphone_chat_message_is_download_in_progress(LinphoneChatMessage *msg) { - return L_GET_CPP_PTR_FROM_C_OBJECT(msg)->isDownloadInProgress(); +bool_t linphone_chat_message_is_file_transfer_in_progress(LinphoneChatMessage *msg) { + return L_GET_CPP_PTR_FROM_C_OBJECT(msg)->isFileTransferInProgress(); } // ============================================================================= diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index 6f50162b4..dd6fa43f9 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -1040,7 +1040,7 @@ bool ChatMessage::downloadFile(FileTransferContent &fileTransferContent) { return d->fileTransferChatMessageModifier.downloadFile(getSharedFromThis(), &fileTransferContent); } -bool ChatMessage::isDownloadInProgress() { +bool ChatMessage::isFileTransferInProgress() { L_D(); return d->fileTransferChatMessageModifier.isFileTransferInProgressAndValid(); } diff --git a/src/chat/chat-message/chat-message.h b/src/chat/chat-message/chat-message.h index 501fb2b83..961455882 100644 --- a/src/chat/chat-message/chat-message.h +++ b/src/chat/chat-message/chat-message.h @@ -106,7 +106,7 @@ public: void removeCustomHeader (const std::string &headerName); bool downloadFile (FileTransferContent &content); - bool isDownloadInProgress(); + bool isFileTransferInProgress(); private: ChatMessage (const std::shared_ptr &chatRoom, ChatMessage::Direction direction); From 30380ff39efaa9b62e2cb04ee90b6b259a2ea176 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 7 Mar 2018 13:08:11 +0100 Subject: [PATCH 214/281] Fixed file transfer chat messages migration --- src/db/main-db.cpp | 92 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 76 insertions(+), 16 deletions(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 99209a3b3..b7edec022 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -1069,6 +1069,53 @@ void MainDbPrivate::importLegacyFriends (DbSession &inDbSession) { }; } +static string extractFileContentType(string xml) { + string contentTypeString; + xmlDocPtr xmlMessageBody; + xmlNodePtr cur; + /* parse the msg body to get all informations from it */ + xmlMessageBody = xmlParseDoc((const xmlChar *)xml.c_str()); + + cur = xmlDocGetRootElement(xmlMessageBody); + if (cur) { + cur = cur->xmlChildrenNode; + while (cur) { + if (!xmlStrcmp(cur->name, (const xmlChar *)"file-info")) { + xmlChar *typeAttribute = xmlGetProp(cur, (const xmlChar *)"type"); + if (!xmlStrcmp(typeAttribute, (const xmlChar *)"file")) { /* this is the node we are looking for */ + cur = cur->xmlChildrenNode; /* now loop on the content of the file-info node */ + while (cur) { + if (!xmlStrcmp(cur->name, (const xmlChar *)"content-type")) { + xmlChar *content_type = xmlNodeListGetString(xmlMessageBody, cur->xmlChildrenNode, 1); + int contentTypeIndex = 0; + char *type; + char *subtype; + while (content_type[contentTypeIndex] != '/' && content_type[contentTypeIndex] != '\0') { + contentTypeIndex++; + } + type = ms_strndup((char *)content_type, contentTypeIndex); + subtype = ms_strdup(((char *)content_type + contentTypeIndex + 1)); + ContentType contentType(type, subtype); + contentTypeString = contentType.asString(); + ms_free(subtype); + ms_free(type); + ms_free(content_type); + break; + } + cur = cur->next; + } + xmlFree(typeAttribute); + break; + } + xmlFree(typeAttribute); + } + cur = cur->next; + } + } + xmlFreeDoc(xmlMessageBody); + return contentTypeString; +} + void MainDbPrivate::importLegacyHistory (DbSession &inDbSession) { L_Q(); L_DB_TRANSACTION_C(q) { @@ -1114,27 +1161,37 @@ void MainDbPrivate::importLegacyHistory (DbSession &inDbSession) { const string &text = getValueFromRow(message, LegacyMessageColText, isNull); - Content content; - content.setContentType(contentType); - if (contentType == ContentType::PlainText) { - if (isNull) { - lWarning() << "Unable to import legacy message with no text."; - continue; - } - content.setBody(text); - } else { - if (contentType != ContentType::FileTransfer) { - lWarning() << "Unable to import unsupported legacy content."; - continue; - } - + Content *content = nullptr; + if (contentType == ContentType::FileTransfer) { const string appData = getValueFromRow(message, LegacyMessageColAppData, isNull); if (isNull) { lWarning() << "Unable to import legacy file message without app data."; continue; } - content.setAppData("legacy", appData); + string contentTypeString = extractFileContentType(text); + if (contentTypeString.empty()) { + lWarning() << "Unable to extract file content type form legacy transfer message"; + continue; + } + ContentType fileContentType(contentTypeString); + content = new FileContent(); + content->setContentType(fileContentType); + content->setAppData("legacy", appData); + content->setBody(text); + } else { + content = new Content(); + content->setContentType(contentType); + if (contentType == ContentType::PlainText) { + if (isNull) { + lWarning() << "Unable to import legacy message with no text."; + continue; + } + content->setBody(text); + } else { + lWarning() << "Unable to import unsupported legacy content."; + continue; + } } soci::session *session = dbSession.getBackendSession(); @@ -1169,7 +1226,10 @@ void MainDbPrivate::importLegacyHistory (DbSession &inDbSession) { soci::use(creationTime), soci::use(state), soci::use(direction), soci::use(isSecured); - insertContent(eventId, content); + if (content != nullptr) { + insertContent(eventId, *content); + free(content); + } insertChatRoomParticipant(chatRoomId, remoteSipAddressId, false); if (state != int(ChatMessage::State::Displayed)) From 12f0e6c1ed2dda32f0d0db5ee41b7bfd5324187b Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 7 Mar 2018 13:29:15 +0100 Subject: [PATCH 215/281] Fixed issue when downloading a file from a chat message loaded from database (and thus locked) --- src/chat/chat-message/chat-message-p.h | 3 +++ src/chat/chat-message/chat-message.cpp | 14 +++++++++++--- .../file-transfer-chat-message-modifier.cpp | 4 ++-- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/chat/chat-message/chat-message-p.h b/src/chat/chat-message/chat-message-p.h index 730270265..fb3a15d0b 100644 --- a/src/chat/chat-message/chat-message-p.h +++ b/src/chat/chat-message/chat-message-p.h @@ -138,6 +138,9 @@ public: LinphoneContent *getFileTransferInformation () const; void setFileTransferInformation (const LinphoneContent *content); + + void addContent (Content &content); + void removeContent (const Content &content); bool downloadFile (); diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index dd6fa43f9..e5d1a8db6 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -371,6 +371,14 @@ bool ChatMessagePrivate::downloadFile () { return false; } +void ChatMessagePrivate::addContent (Content &content) { + getContents().push_back(&content); +} + +void ChatMessagePrivate::removeContent (const Content &content) { + getContents().remove(&const_cast(content)); +} + void ChatMessagePrivate::loadFileTransferUrlFromBodyToContent() { L_Q(); int errorCode = 0; @@ -718,7 +726,7 @@ void ChatMessagePrivate::send () { if (content->getContentType() == ContentType::FileTransfer) { FileTransferContent *fileTransferContent = (FileTransferContent *)content; it = contents.erase(it); - q->addContent(*fileTransferContent->getFileContent()); + addContent(*fileTransferContent->getFileContent()); delete fileTransferContent; } else { it++; @@ -962,13 +970,13 @@ const list &ChatMessage::getContents () const { void ChatMessage::addContent (Content &content) { L_D(); if (!d->isReadOnly) - d->getContents().push_back(&content); + d->addContent(content); } void ChatMessage::removeContent (const Content &content) { L_D(); if (!d->isReadOnly) - d->getContents().remove(&const_cast(content)); + d->removeContent(content); } const Content &ChatMessage::getInternalContent () const { diff --git a/src/chat/modifier/file-transfer-chat-message-modifier.cpp b/src/chat/modifier/file-transfer-chat-message-modifier.cpp index 41ffa66c8..f0293d67a 100644 --- a/src/chat/modifier/file-transfer-chat-message-modifier.cpp +++ b/src/chat/modifier/file-transfer-chat-message-modifier.cpp @@ -750,12 +750,12 @@ void FileTransferChatMessageModifier::onRecvEnd (belle_sip_user_body_handler_t * if (retval <= 0 && message->getState() != ChatMessage::State::FileTransferError) { // Remove the FileTransferContent from the message and store the FileContent FileContent *fileContent = currentFileContentToTransfer; - message->addContent(*fileContent); + message->getPrivate()->addContent(*fileContent); for (Content *content : message->getContents()) { if (content->getContentType() == ContentType::FileTransfer) { FileTransferContent *fileTransferContent = (FileTransferContent*)content; if (fileTransferContent->getFileContent() == fileContent) { - message->removeContent(*content); + message->getPrivate()->removeContent(*content); delete fileTransferContent; break; } From ae9d3012efa6e293e42666f9f64f2b4dfff94729 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Wed, 7 Mar 2018 13:44:39 +0100 Subject: [PATCH 216/281] fix(MainDb): do not use free on content --- src/db/main-db.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index b7edec022..df4a839f9 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -1226,9 +1226,9 @@ void MainDbPrivate::importLegacyHistory (DbSession &inDbSession) { soci::use(creationTime), soci::use(state), soci::use(direction), soci::use(isSecured); - if (content != nullptr) { + if (content) { insertContent(eventId, *content); - free(content); + delete content; } insertChatRoomParticipant(chatRoomId, remoteSipAddressId, false); From f1dbb519ad858f90d71a74e254919dd9f29c139e Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Wed, 7 Mar 2018 13:48:40 +0100 Subject: [PATCH 217/281] fix(MainDb): avoid memory leak --- src/db/main-db.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index df4a839f9..2cce4947a 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -1161,7 +1161,7 @@ void MainDbPrivate::importLegacyHistory (DbSession &inDbSession) { const string &text = getValueFromRow(message, LegacyMessageColText, isNull); - Content *content = nullptr; + unique_ptr content; if (contentType == ContentType::FileTransfer) { const string appData = getValueFromRow(message, LegacyMessageColAppData, isNull); if (isNull) { @@ -1175,12 +1175,12 @@ void MainDbPrivate::importLegacyHistory (DbSession &inDbSession) { continue; } ContentType fileContentType(contentTypeString); - content = new FileContent(); + content.reset(new FileContent()); content->setContentType(fileContentType); content->setAppData("legacy", appData); content->setBody(text); } else { - content = new Content(); + content.reset(new Content()); content->setContentType(contentType); if (contentType == ContentType::PlainText) { if (isNull) { @@ -1226,10 +1226,8 @@ void MainDbPrivate::importLegacyHistory (DbSession &inDbSession) { soci::use(creationTime), soci::use(state), soci::use(direction), soci::use(isSecured); - if (content) { + if (content) insertContent(eventId, *content); - delete content; - } insertChatRoomParticipant(chatRoomId, remoteSipAddressId, false); if (state != int(ChatMessage::State::Displayed)) From c0f5d97a8a154739f7ebf6234f0afb92e679ba45 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Wed, 7 Mar 2018 13:53:52 +0100 Subject: [PATCH 218/281] fix(MainDb): avoid xml copy in extractFileContentType --- src/db/main-db.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 2cce4947a..8869c4399 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -1069,7 +1069,7 @@ void MainDbPrivate::importLegacyFriends (DbSession &inDbSession) { }; } -static string extractFileContentType(string xml) { +static string extractFileContentType (const string &xml) { string contentTypeString; xmlDocPtr xmlMessageBody; xmlNodePtr cur; From 1b942b3306086c7ed70cb80ddae344a949e8380a Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Wed, 7 Mar 2018 14:24:20 +0100 Subject: [PATCH 219/281] Fixed message state if linphone has crashed while sending it --- src/db/main-db.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 8869c4399..8ddd98748 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -601,7 +601,11 @@ shared_ptr MainDbPrivate::selectConferenceChatMessageEvent ( chatMessage->setIsSecured(bool(row.get(9))); ChatMessagePrivate *dChatMessage = chatMessage->getPrivate(); - dChatMessage->setState(ChatMessage::State(row.get(7)), true); + ChatMessage::State messageState = (ChatMessage::State) row.get(7); + // This is necessary if linphone has crashed while sending a message. It will set the correct state so the user can resend it. + if (messageState == ChatMessage::State::Idle || messageState == ChatMessage::State::InProgress) + messageState = ChatMessage::State::NotDelivered; + dChatMessage->setState(messageState, true); dChatMessage->forceFromAddress(IdentityAddress(row.get(3))); dChatMessage->forceToAddress(IdentityAddress(row.get(4))); From 58e0b47a99b00c48dff31c07d21dbab4ec5a384b Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Wed, 7 Mar 2018 15:05:39 +0100 Subject: [PATCH 220/281] feat(MainDb): clean xml parser --- src/db/main-db.cpp | 84 +++++++++++++++++++++------------------------- 1 file changed, 39 insertions(+), 45 deletions(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 8ddd98748..80e44d650 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -1073,51 +1073,45 @@ void MainDbPrivate::importLegacyFriends (DbSession &inDbSession) { }; } -static string extractFileContentType (const string &xml) { - string contentTypeString; - xmlDocPtr xmlMessageBody; - xmlNodePtr cur; - /* parse the msg body to get all informations from it */ - xmlMessageBody = xmlParseDoc((const xmlChar *)xml.c_str()); - - cur = xmlDocGetRootElement(xmlMessageBody); - if (cur) { - cur = cur->xmlChildrenNode; - while (cur) { - if (!xmlStrcmp(cur->name, (const xmlChar *)"file-info")) { - xmlChar *typeAttribute = xmlGetProp(cur, (const xmlChar *)"type"); - if (!xmlStrcmp(typeAttribute, (const xmlChar *)"file")) { /* this is the node we are looking for */ - cur = cur->xmlChildrenNode; /* now loop on the content of the file-info node */ - while (cur) { - if (!xmlStrcmp(cur->name, (const xmlChar *)"content-type")) { - xmlChar *content_type = xmlNodeListGetString(xmlMessageBody, cur->xmlChildrenNode, 1); - int contentTypeIndex = 0; - char *type; - char *subtype; - while (content_type[contentTypeIndex] != '/' && content_type[contentTypeIndex] != '\0') { - contentTypeIndex++; - } - type = ms_strndup((char *)content_type, contentTypeIndex); - subtype = ms_strdup(((char *)content_type + contentTypeIndex + 1)); - ContentType contentType(type, subtype); - contentTypeString = contentType.asString(); - ms_free(subtype); - ms_free(type); - ms_free(content_type); - break; - } - cur = cur->next; - } - xmlFree(typeAttribute); - break; - } - xmlFree(typeAttribute); - } - cur = cur->next; - } +// TODO: Move in a helper file? With others xml. +struct XmlCharObjectDeleter { + void operator() (void *ptr) const { + xmlFree(ptr); } - xmlFreeDoc(xmlMessageBody); - return contentTypeString; +}; +using XmlCharObject = unique_ptr; + +struct XmlDocObjectDeleter { + void operator() (xmlDocPtr ptr) const { + xmlFreeDoc(ptr); + } +}; +using XmlDocObject = unique_ptr::type, XmlDocObjectDeleter>; + +typedef const xmlChar* XmlCharPtr; + +static string extractLegacyFileContentType (const string &xml) { + XmlDocObject xmlMessageBody(xmlParseDoc(XmlCharPtr(xml.c_str()))); + xmlNodePtr xmlElement = xmlDocGetRootElement(xmlMessageBody.get()); + if (!xmlElement) + return ""; + + for (xmlElement = xmlElement->xmlChildrenNode; xmlElement; xmlElement = xmlElement->next) { + if (xmlStrcmp(xmlElement->name, XmlCharPtr("file-info"))) + continue; + + XmlCharObject typeAttribute(xmlGetProp(xmlElement, XmlCharPtr("type"))); + if (xmlStrcmp(typeAttribute.get(), XmlCharPtr("file"))) + continue; + + for (xmlElement = xmlElement->xmlChildrenNode; xmlElement; xmlElement = xmlElement->next) + if (!xmlStrcmp(xmlElement->name, XmlCharPtr("content-type"))) { + XmlCharObject xmlContentType(xmlNodeListGetString(xmlMessageBody.get(), xmlElement->xmlChildrenNode, 1)); + return ContentType(reinterpret_cast(xmlContentType.get())).asString(); + } + } + + return ""; } void MainDbPrivate::importLegacyHistory (DbSession &inDbSession) { @@ -1173,7 +1167,7 @@ void MainDbPrivate::importLegacyHistory (DbSession &inDbSession) { continue; } - string contentTypeString = extractFileContentType(text); + string contentTypeString = extractLegacyFileContentType(text); if (contentTypeString.empty()) { lWarning() << "Unable to extract file content type form legacy transfer message"; continue; From 30b270f221f69a2b7382161f3c34760e51a44045 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Wed, 7 Mar 2018 15:08:09 +0100 Subject: [PATCH 221/281] fix(MainDb): avoid old c-style cast --- src/db/main-db.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/db/main-db.cpp b/src/db/main-db.cpp index 80e44d650..983630099 100644 --- a/src/db/main-db.cpp +++ b/src/db/main-db.cpp @@ -601,7 +601,7 @@ shared_ptr MainDbPrivate::selectConferenceChatMessageEvent ( chatMessage->setIsSecured(bool(row.get(9))); ChatMessagePrivate *dChatMessage = chatMessage->getPrivate(); - ChatMessage::State messageState = (ChatMessage::State) row.get(7); + ChatMessage::State messageState = ChatMessage::State(row.get(7)); // This is necessary if linphone has crashed while sending a message. It will set the correct state so the user can resend it. if (messageState == ChatMessage::State::Idle || messageState == ChatMessage::State::InProgress) messageState = ChatMessage::State::NotDelivered; From cff45b8c13d97ebad4bdde51c55815b9e3d4066e Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Wed, 7 Mar 2018 16:32:12 +0100 Subject: [PATCH 222/281] fix crash in cardav tester --- tester/vcard_tester.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tester/vcard_tester.c b/tester/vcard_tester.c index be14d2007..664ed68e6 100644 --- a/tester/vcard_tester.c +++ b/tester/vcard_tester.c @@ -795,9 +795,9 @@ static void carddav_integration(void) { linphone_friend_done(lf); BC_ASSERT_EQUAL((unsigned int)bctbx_list_size(linphone_friend_list_get_dirty_friends_to_update(linphone_friend_get_friend_list(lf))), 1, unsigned int, "%u"); - ms_free(stats); linphone_friend_list_unref(lfl); linphone_core_manager_destroy(manager); + ms_free(stats); } static void carddav_clean(void) { // This is to ensure the content of the test addressbook is in the correct state for the following tests From b6496cbfa9ded769e0ec829db0eeb47539f07bde Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Wed, 7 Mar 2018 16:58:59 +0100 Subject: [PATCH 223/281] fix(core): remove useless default constructors and avoid memory leak on virtual destructor --- src/call/local-conference-call-p.h | 2 -- src/call/remote-conference-call-p.h | 2 -- src/chat/chat-message/chat-message-p.h | 4 +--- src/chat/chat-room/basic-chat-room-p.h | 3 --- src/chat/chat-room/client-group-chat-room-p.h | 2 -- src/chat/chat-room/real-time-text-chat-room-p.h | 2 -- src/conference/conference-p.h | 2 ++ src/conference/params/call-session-params-p.h | 2 -- src/conference/session/media-session-p.h | 5 ----- 9 files changed, 3 insertions(+), 21 deletions(-) diff --git a/src/call/local-conference-call-p.h b/src/call/local-conference-call-p.h index b352fa0b0..89e4a1971 100644 --- a/src/call/local-conference-call-p.h +++ b/src/call/local-conference-call-p.h @@ -29,8 +29,6 @@ LINPHONE_BEGIN_NAMESPACE class LocalConferenceCallPrivate : public CallPrivate { public: - LocalConferenceCallPrivate () = default; - std::shared_ptr getActiveSession () const override; private: diff --git a/src/call/remote-conference-call-p.h b/src/call/remote-conference-call-p.h index b627e2742..8f9cda90b 100644 --- a/src/call/remote-conference-call-p.h +++ b/src/call/remote-conference-call-p.h @@ -29,8 +29,6 @@ LINPHONE_BEGIN_NAMESPACE class RemoteConferenceCallPrivate : public CallPrivate { public: - RemoteConferenceCallPrivate () = default; - std::shared_ptr getActiveSession () const override; private: diff --git a/src/chat/chat-message/chat-message-p.h b/src/chat/chat-message/chat-message-p.h index fb3a15d0b..745815859 100644 --- a/src/chat/chat-message/chat-message-p.h +++ b/src/chat/chat-message/chat-message-p.h @@ -54,8 +54,6 @@ public: Started = 1 << 5, }; - ChatMessagePrivate () = default; - void setApplyModifiers (bool value) { applyModifiers = value; } void setDirection (ChatMessage::Direction dir); @@ -138,7 +136,7 @@ public: LinphoneContent *getFileTransferInformation () const; void setFileTransferInformation (const LinphoneContent *content); - + void addContent (Content &content); void removeContent (const Content &content); diff --git a/src/chat/chat-room/basic-chat-room-p.h b/src/chat/chat-room/basic-chat-room-p.h index 661a413a5..c281f940d 100644 --- a/src/chat/chat-room/basic-chat-room-p.h +++ b/src/chat/chat-room/basic-chat-room-p.h @@ -28,9 +28,6 @@ LINPHONE_BEGIN_NAMESPACE class BasicChatRoomPrivate : public ChatRoomPrivate { -public: - BasicChatRoomPrivate () = default; - private: std::string subject; std::list> participants; diff --git a/src/chat/chat-room/client-group-chat-room-p.h b/src/chat/chat-room/client-group-chat-room-p.h index f75a5abac..cb62f6800 100644 --- a/src/chat/chat-room/client-group-chat-room-p.h +++ b/src/chat/chat-room/client-group-chat-room-p.h @@ -30,8 +30,6 @@ LINPHONE_BEGIN_NAMESPACE class ClientGroupChatRoomPrivate : public ChatRoomPrivate { public: - ClientGroupChatRoomPrivate () = default; - std::list cleanAddressesList (const std::list &addresses) const; std::shared_ptr createSession (); void notifyReceived (const std::string &body); diff --git a/src/chat/chat-room/real-time-text-chat-room-p.h b/src/chat/chat-room/real-time-text-chat-room-p.h index ae9af9de3..26b89d53b 100644 --- a/src/chat/chat-room/real-time-text-chat-room-p.h +++ b/src/chat/chat-room/real-time-text-chat-room-p.h @@ -34,8 +34,6 @@ public: bool hasBeenRead; }; - RealTimeTextChatRoomPrivate () = default; - void realtimeTextReceived (uint32_t character, const std::shared_ptr &call); void sendChatMessage (const std::shared_ptr &chatMessage) override; void setCall (const std::shared_ptr &value) { call = value; } diff --git a/src/conference/conference-p.h b/src/conference/conference-p.h index 0a5441a03..c2f21013c 100644 --- a/src/conference/conference-p.h +++ b/src/conference/conference-p.h @@ -32,6 +32,8 @@ class Participant; class ConferencePrivate { public: + virtual ~ConferencePrivate () = default; + IdentityAddress conferenceAddress; std::list> participants; std::string subject; diff --git a/src/conference/params/call-session-params-p.h b/src/conference/params/call-session-params-p.h index 77b701291..74a7c0072 100644 --- a/src/conference/params/call-session-params-p.h +++ b/src/conference/params/call-session-params-p.h @@ -34,8 +34,6 @@ class CallSession; class CallSessionParamsPrivate : public ClonableObjectPrivate { public: - CallSessionParamsPrivate () = default; - void clone (const CallSessionParamsPrivate *src); bool getInConference () const { return inConference; } diff --git a/src/conference/session/media-session-p.h b/src/conference/session/media-session-p.h index a238078c1..6ee6ac50a 100644 --- a/src/conference/session/media-session-p.h +++ b/src/conference/session/media-session-p.h @@ -20,8 +20,6 @@ #ifndef _L_MEDIA_SESSION_P_H_ #define _L_MEDIA_SESSION_P_H_ -#include - #include "call-session-p.h" #include "media-session.h" @@ -36,9 +34,6 @@ LINPHONE_BEGIN_NAMESPACE class MediaSessionPrivate : public CallSessionPrivate { -public: - MediaSessionPrivate () = default; - public: static int resumeAfterFailedTransfer (void *userData, unsigned int); static bool_t startPendingRefer (void *userData); From 18d0c4ad209986afeba500e8013c11782b1bf32c Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Wed, 7 Mar 2018 17:16:20 +0100 Subject: [PATCH 224/281] improve message tester for file transfer --- .../file-transfer-chat-message-modifier.cpp | 4 +-- tester/message_tester.c | 30 +++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/chat/modifier/file-transfer-chat-message-modifier.cpp b/src/chat/modifier/file-transfer-chat-message-modifier.cpp index f0293d67a..44b1a3090 100644 --- a/src/chat/modifier/file-transfer-chat-message-modifier.cpp +++ b/src/chat/modifier/file-transfer-chat-message-modifier.cpp @@ -361,8 +361,8 @@ void FileTransferChatMessageModifier::processResponseFromPostFile (const belle_h fileTransferContent->setContentType(ContentType::FileTransfer); fileTransferContent->setFileContent(fileContent); - message->removeContent(*fileContent); - message->addContent(*fileTransferContent); + message->getPrivate()->removeContent(*fileContent); + message->getPrivate()->addContent(*fileTransferContent); message->getPrivate()->setState(ChatMessage::State::FileTransferDone); releaseHttpRequest(); diff --git a/tester/message_tester.c b/tester/message_tester.c index df54f9160..0d639eac0 100644 --- a/tester/message_tester.c +++ b/tester/message_tester.c @@ -533,6 +533,7 @@ void transfer_message_base2(LinphoneCoreManager* marie, LinphoneCoreManager* pau /* wait for a long time in case the DNS SRV resolution takes times - it should be immediate though */ if (BC_ASSERT_TRUE(wait_for_until(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneFileTransferDownloadSuccessful,1,55000))) { compare_files(send_filepath, receive_filepath); + } } } @@ -1587,6 +1588,8 @@ void crash_during_file_transfer(void) { /* Create a new core and check that the message stored in the saved database is in the not delivered state */ linphone_core_manager_restart(pauline, TRUE); + linphone_core_set_file_transfer_server(pauline->lc, "https://www.linphone.org:444/lft.php"); + //BC_ASSERT_TRUE(wait_for(pauline->lc, pauline->lc, &pauline->stat.number_of_LinphoneRegistrationOk, 1)); chat_room = linphone_core_get_chat_room(pauline->lc, marie->identity); @@ -1596,9 +1599,36 @@ void crash_during_file_transfer(void) { msg_list = linphone_chat_room_get_history(chat_room, 0); LinphoneChatMessage *sent_msg = (LinphoneChatMessage *)bctbx_list_get_data(msg_list); BC_ASSERT_EQUAL((int)linphone_chat_message_get_state(sent_msg), (int)LinphoneChatMessageStateNotDelivered, int, "%d"); + //resend + LinphoneChatMessageCbs *cbs = linphone_chat_message_get_callbacks(sent_msg); + linphone_chat_message_cbs_set_file_transfer_send(cbs, tester_file_transfer_send); + linphone_chat_message_cbs_set_msg_state_changed(cbs,liblinphone_tester_chat_message_msg_state_changed); + linphone_chat_message_cbs_set_file_transfer_progress_indication(cbs, file_transfer_progress_indication); + linphone_chat_message_send(sent_msg); + if (BC_ASSERT_TRUE(wait_for_until(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceivedWithFile,1, 60000))) { + linphone_core_manager_stop(marie); + /* Create a new core and check that the message stored in the saved database is in the not delivered state */ + linphone_core_manager_restart(marie, TRUE); + LinphoneChatRoom *marie_room = linphone_core_get_chat_room(marie->lc, pauline->identity); + bctbx_list_t *msg_list_2 = linphone_chat_room_get_history(marie_room,1); + BC_ASSERT_PTR_NOT_NULL(msg_list_2); + LinphoneChatMessage *recv_msg = (LinphoneChatMessage *)msg_list_2->data; + LinphoneChatMessageCbs *cbs = linphone_chat_message_get_callbacks(recv_msg); + linphone_chat_message_cbs_set_msg_state_changed(cbs, liblinphone_tester_chat_message_msg_state_changed); + linphone_chat_message_cbs_set_file_transfer_recv(cbs, file_transfer_received); + linphone_chat_message_cbs_set_file_transfer_progress_indication(cbs, file_transfer_progress_indication); + linphone_chat_message_download_file(recv_msg); + /* wait for a long time in case the DNS SRV resolution takes times - it should be immediate though */ + if (BC_ASSERT_TRUE(wait_for_until(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneFileTransferDownloadSuccessful,1,55000))) { + BC_ASSERT_PTR_NULL(linphone_chat_message_get_external_body_url(recv_msg)); + } + bctbx_list_free_with_data(msg_list_2, (bctbx_list_free_func)linphone_chat_message_unref); + } } + bctbx_list_free_with_data(msg_list, (bctbx_list_free_func)linphone_chat_message_unref); + linphone_core_manager_destroy(pauline); linphone_core_manager_destroy(marie); From 21a5f1c00114f71645e8455d694373497362ed50 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Wed, 7 Mar 2018 17:17:18 +0100 Subject: [PATCH 225/281] fix(core): remove useless include, virtual... And add required virtual on some classes (add a -Wdelete-non-virtual-dtor warning on clang) --- CMakeLists.txt | 2 +- src/call/call-p.h | 2 -- src/call/remote-conference-call.h | 2 +- src/conference/conference-listener.h | 8 ++------ src/conference/conference.h | 2 +- src/conference/session/call-session-p.h | 2 -- src/conference/session/call-session.h | 2 +- src/conference/session/media-session.cpp | 2 +- src/conference/session/media-session.h | 2 +- 9 files changed, 8 insertions(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bae67bcb6..ca173404d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -284,7 +284,7 @@ else() list(APPEND STRICT_OPTIONS_C "-fno-inline-small-functions") endif() if(CMAKE_C_COMPILER_ID MATCHES "Clang") - list(APPEND STRICT_OPTIONS_CPP "-Qunused-arguments" "-Wno-array-bounds") + list(APPEND STRICT_OPTIONS_CPP "-Qunused-arguments" "-Wno-array-bounds -Wdelete-non-virtual-dtor") endif() if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") list(APPEND STRICT_OPTIONS_CXX "-x c++") diff --git a/src/call/call-p.h b/src/call/call-p.h index 0c6f9ae65..7b2754ff6 100644 --- a/src/call/call-p.h +++ b/src/call/call-p.h @@ -38,8 +38,6 @@ class RealTimeTextChatRoom; class CallPrivate : public ObjectPrivate, public CallSessionListener { public: - CallPrivate () = default; - void initiateIncoming (); bool initiateOutgoing (); void iterate (time_t currentRealTime, bool oneSecondElapsed); diff --git a/src/call/remote-conference-call.h b/src/call/remote-conference-call.h index f2a50fd00..9360b2c11 100644 --- a/src/call/remote-conference-call.h +++ b/src/call/remote-conference-call.h @@ -42,7 +42,7 @@ public: SalCallOp *op, const MediaSessionParams *msp ); - virtual ~RemoteConferenceCall (); + ~RemoteConferenceCall (); std::shared_ptr getCore () const; diff --git a/src/conference/conference-listener.h b/src/conference/conference-listener.h index e4da1bd7b..f185259f8 100644 --- a/src/conference/conference-listener.h +++ b/src/conference/conference-listener.h @@ -20,22 +20,18 @@ #ifndef _L_CONFERENCE_LISTENER_H_ #define _L_CONFERENCE_LISTENER_H_ -#include -#include #include -#include "linphone/utils/general.h" - #include "event-log/events.h" // ============================================================================= LINPHONE_BEGIN_NAMESPACE -class IdentityAddress; - class ConferenceListener { public: + virtual ~ConferenceListener () = default; + virtual void onConferenceCreated (const IdentityAddress &addr) {} virtual void onConferenceKeywordsChanged (const std::vector &keywords) {} virtual void onConferenceTerminated (const IdentityAddress &addr) {} diff --git a/src/conference/conference.h b/src/conference/conference.h index ed8d93637..0df0ae998 100644 --- a/src/conference/conference.h +++ b/src/conference/conference.h @@ -43,7 +43,7 @@ class LINPHONE_PUBLIC Conference : friend class CallSessionPrivate; public: - virtual ~Conference(); + ~Conference(); std::shared_ptr getActiveParticipant () const; diff --git a/src/conference/session/call-session-p.h b/src/conference/session/call-session-p.h index fb425b508..fc62e4e43 100644 --- a/src/conference/session/call-session-p.h +++ b/src/conference/session/call-session-p.h @@ -31,8 +31,6 @@ LINPHONE_BEGIN_NAMESPACE class CallSessionPrivate : public ObjectPrivate, public CoreListener { public: - CallSessionPrivate () = default; - int computeDuration () const; virtual void initializeParamsAccordingToIncomingCallParams (); void notifyReferState (); diff --git a/src/conference/session/call-session.h b/src/conference/session/call-session.h index fa3969b64..63330f3d0 100644 --- a/src/conference/session/call-session.h +++ b/src/conference/session/call-session.h @@ -54,7 +54,7 @@ public: L_DECLARE_ENUM(State, L_ENUM_VALUES_CALL_SESSION_STATE); CallSession (const std::shared_ptr &core, const CallSessionParams *params, CallSessionListener *listener); - virtual ~CallSession (); + ~CallSession (); LinphoneStatus accept (const CallSessionParams *csp = nullptr); LinphoneStatus acceptUpdate (const CallSessionParams *csp = nullptr); diff --git a/src/conference/session/media-session.cpp b/src/conference/session/media-session.cpp index 506f8687d..2994d721d 100644 --- a/src/conference/session/media-session.cpp +++ b/src/conference/session/media-session.cpp @@ -3432,7 +3432,7 @@ void MediaSessionPrivate::reportBandwidth () { lInfo() << "Bandwidth usage for CallSession [" << q << "]:\n" << fixed << setprecision(2) << "\tRTP audio=[d=" << linphone_call_stats_get_download_bandwidth(audioStats) << ",u=" << linphone_call_stats_get_upload_bandwidth(audioStats) << - "], video=[d=" << linphone_call_stats_get_download_bandwidth(videoStats) << ",u=" << linphone_call_stats_get_upload_bandwidth(videoStats) << ",ed=" << linphone_call_stats_get_estimated_download_bandwidth(videoStats) << + "], video=[d=" << linphone_call_stats_get_download_bandwidth(videoStats) << ",u=" << linphone_call_stats_get_upload_bandwidth(videoStats) << ",ed=" << linphone_call_stats_get_estimated_download_bandwidth(videoStats) << "], text=[d=" << linphone_call_stats_get_download_bandwidth(textStats) << ",u=" << linphone_call_stats_get_upload_bandwidth(textStats) << "] kbits/sec\n" << "\tRTCP audio=[d=" << linphone_call_stats_get_rtcp_download_bandwidth(audioStats) << ",u=" << linphone_call_stats_get_rtcp_upload_bandwidth(audioStats) << "], video=[d=" << linphone_call_stats_get_rtcp_download_bandwidth(videoStats) << ",u=" << linphone_call_stats_get_rtcp_upload_bandwidth(videoStats) << diff --git a/src/conference/session/media-session.h b/src/conference/session/media-session.h index 695c44ae4..18fc76d2a 100644 --- a/src/conference/session/media-session.h +++ b/src/conference/session/media-session.h @@ -40,7 +40,7 @@ class LINPHONE_PUBLIC MediaSession : public CallSession { public: MediaSession (const std::shared_ptr &core, std::shared_ptr me, const CallSessionParams *params, CallSessionListener *listener); - virtual ~MediaSession (); + ~MediaSession (); LinphoneStatus accept (const MediaSessionParams *msp = nullptr); LinphoneStatus acceptEarlyMedia (const MediaSessionParams *msp = nullptr); From 49e1af1f758dbb7b33debd4faea8ce976c473f98 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Wed, 7 Mar 2018 17:40:29 +0100 Subject: [PATCH 226/281] feat(PropertyContainer): increase performance => avoid private allocation if not used in childs --- CMakeLists.txt | 3 ++- src/address/address.cpp | 3 --- src/object/property-container.cpp | 22 +++++++++++++--------- src/object/property-container.h | 4 +--- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ca173404d..7ef09b6f6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -268,6 +268,7 @@ else() "-Wfloat-equal" "-Winit-self" "-Wno-error=deprecated-declarations" + "-Wnon-virtual-dtor" "-Wpointer-arith" "-Wuninitialized" "-Wunused" @@ -284,7 +285,7 @@ else() list(APPEND STRICT_OPTIONS_C "-fno-inline-small-functions") endif() if(CMAKE_C_COMPILER_ID MATCHES "Clang") - list(APPEND STRICT_OPTIONS_CPP "-Qunused-arguments" "-Wno-array-bounds -Wdelete-non-virtual-dtor") + list(APPEND STRICT_OPTIONS_CPP "-Qunused-arguments" "-Wno-array-bounds") endif() if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") list(APPEND STRICT_OPTIONS_CXX "-x c++") diff --git a/src/address/address.cpp b/src/address/address.cpp index 4d263aa73..bd875f7a2 100644 --- a/src/address/address.cpp +++ b/src/address/address.cpp @@ -17,12 +17,9 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#include "linphone/utils/utils.h" - #include "address-p.h" #include "address/identity-address.h" #include "c-wrapper/c-wrapper.h" -#include "c-wrapper/internal/c-sal.h" #include "containers/lru-cache.h" #include "logger/logger.h" diff --git a/src/object/property-container.cpp b/src/object/property-container.cpp index 24e46174e..dbd216ace 100644 --- a/src/object/property-container.cpp +++ b/src/object/property-container.cpp @@ -36,14 +36,14 @@ public: // ----------------------------------------------------------------------------- -PropertyContainer::PropertyContainer () : mPrivate(new PropertyContainerPrivate) {} +PropertyContainer::PropertyContainer () : mPrivate(nullptr) {} /* * Empty copy constructor. Don't change this pattern. * PropertyContainer is an Entity component, not a simple structure. * An Entity is UNIQUE. */ -PropertyContainer::PropertyContainer (const PropertyContainer &) : mPrivate(new PropertyContainerPrivate) {} +PropertyContainer::PropertyContainer (const PropertyContainer &) : mPrivate(nullptr) {} PropertyContainer::~PropertyContainer () { delete mPrivate; @@ -54,19 +54,23 @@ PropertyContainer &PropertyContainer::operator= (const PropertyContainer &) { } Variant PropertyContainer::getProperty (const string &name) const { - L_D(); - auto it = d->properties.find(name); - return it == d->properties.cend() ? Variant() : it->second; + if (!mPrivate) + return Variant(); + auto &properties = mPrivate->properties; + auto it = properties.find(name); + return it == properties.cend() ? Variant() : it->second; } void PropertyContainer::setProperty (const string &name, const Variant &value) { - L_D(); - d->properties[name] = value; + if (!mPrivate) + mPrivate = new PropertyContainerPrivate(); + mPrivate->properties[name] = value; } void PropertyContainer::setProperty (const string &name, Variant &&value) { - L_D(); - d->properties[name] = move(value); + if (!mPrivate) + mPrivate = new PropertyContainerPrivate(); + mPrivate->properties[name] = move(value); } LINPHONE_END_NAMESPACE diff --git a/src/object/property-container.h b/src/object/property-container.h index 53a885ddd..8f9db93bb 100644 --- a/src/object/property-container.h +++ b/src/object/property-container.h @@ -41,9 +41,7 @@ public: void setProperty (const std::string &name, Variant &&value); private: - PropertyContainerPrivate *mPrivate = nullptr; - - L_DECLARE_PRIVATE(PropertyContainer); + PropertyContainerPrivate *mPrivate; }; LINPHONE_END_NAMESPACE From c3a185d84c6abf6298ec2e7e074ef1c3ed4f8011 Mon Sep 17 00:00:00 2001 From: Ronan Abhamon Date: Wed, 7 Mar 2018 18:10:42 +0100 Subject: [PATCH 227/281] fix(CMakeLists.txt): move non-virtual-dtor warning in STRICT_OPTIONS_CXX --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 7ef09b6f6..b5a4cbe6a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -268,12 +268,12 @@ else() "-Wfloat-equal" "-Winit-self" "-Wno-error=deprecated-declarations" - "-Wnon-virtual-dtor" "-Wpointer-arith" "-Wuninitialized" "-Wunused" ) list(APPEND STRICT_OPTIONS_CXX + "-Wnon-virtual-dtor" "-Woverloaded-virtual" ) CHECK_CXX_COMPILER_FLAG("-Wsuggest-override" SUGGEST_OVERRIDE) From 4a4ea17be2203b30d13d096603eb6d946fe9f2e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Turnel?= Date: Thu, 8 Mar 2018 10:01:18 +0100 Subject: [PATCH 228/281] Fix 'increases required alignment of target type' --- coreapi/linphonecore.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 40de59c18..2027b4101 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -2387,7 +2387,8 @@ LinphoneCore *linphone_core_new(const LinphoneCoreVTable *vtable, } LinphoneCore *linphone_core_ref(LinphoneCore *lc) { - return reinterpret_cast(belle_sip_object_ref(BELLE_SIP_OBJECT(lc))); + belle_sip_object_ref(BELLE_SIP_OBJECT(lc)); + return lc; } void linphone_core_unref(LinphoneCore *lc) { From d41fb1f995f6a28d8026c459d2e885b56184ed69 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Thu, 8 Mar 2018 12:17:42 +0100 Subject: [PATCH 229/281] fix proxy default value for conference_factory_uri --- coreapi/proxy.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/coreapi/proxy.c b/coreapi/proxy.c index 8eecdeaba..127d9bb93 100644 --- a/coreapi/proxy.c +++ b/coreapi/proxy.c @@ -120,6 +120,7 @@ static void linphone_proxy_config_init(LinphoneCore* lc, LinphoneProxyConfig *cf const char *contact_uri_params = lc ? lp_config_get_default_string(lc->config, "proxy", "contact_uri_parameters", NULL) : NULL; const char *refkey = lc ? lp_config_get_default_string(lc->config, "proxy", "refkey", NULL) : NULL; const char *nat_policy_ref = lc ? lp_config_get_default_string(lc->config, "proxy", "nat_policy_ref", NULL):NULL; + const char *conference_factory_uri = lc ? lp_config_get_default_string(lc->config, "proxy", "conference_factory_uri", NULL):NULL; cfg->lc = lc; cfg->expires = lc ? lp_config_get_default_int(lc->config, "proxy", "reg_expires", 3600) : 3600; cfg->reg_sendregister = lc ? !!lp_config_get_default_int(lc->config, "proxy", "reg_sendregister", 1) : 1; @@ -150,6 +151,7 @@ static void linphone_proxy_config_init(LinphoneCore* lc, LinphoneProxyConfig *cf ms_error("Cannot create default nat policy with ref [%s] for proxy config [%p]",nat_policy_ref,cfg); } } + cfg->conference_factory_uri = conference_factory_uri ? ms_strdup(conference_factory_uri) : NULL; } LinphoneProxyConfig *linphone_proxy_config_new() { From b9eaf0a7e9d35487dfb3bd83fde1fe106d8a8dba Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 6 Mar 2018 12:20:51 +0100 Subject: [PATCH 230/281] Prevent ChatRoom C++ objects from being leaked. --- coreapi/callbacks.c | 10 +- coreapi/linphonecore.c | 3 +- coreapi/private_functions.h | 1 - src/c-wrapper/api/c-chat-room.cpp | 48 +-- .../basic-to-client-group-chat-room.cpp | 2 +- src/chat/chat-room/chat-room-p.h | 6 + src/chat/chat-room/chat-room.cpp | 26 +- src/chat/chat-room/chat-room.h | 2 + src/chat/chat-room/client-group-chat-room.cpp | 12 +- src/chat/chat-room/client-group-chat-room.h | 1 + .../client-group-to-basic-chat-room.cpp | 17 +- src/chat/chat-room/proxy-chat-room-p.h | 4 +- src/chat/chat-room/proxy-chat-room.cpp | 97 +----- src/chat/chat-room/proxy-chat-room.h | 2 + .../chat-room/real-time-text-chat-room.cpp | 2 +- src/conference/conference-interface.h | 2 +- src/conference/session/call-session.cpp | 2 + src/core/core-chat-room.cpp | 82 ++++-- src/core/core-p.h | 6 +- src/core/core.cpp | 4 + src/core/core.h | 3 +- src/sal/refer-op.cpp | 2 + tester/group_chat_tester.c | 275 ++++++++++-------- 23 files changed, 294 insertions(+), 315 deletions(-) diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index 535883882..2faa1cef6 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -748,10 +748,12 @@ static void refer_received(SalOp *op, const SalAddress *refer_to){ return; } } else { - LinphoneChatRoom *cr = L_GET_C_BACK_PTR(L_GET_CPP_PTR_FROM_C_OBJECT(lc)->findChatRoom(ChatRoomId(addr, IdentityAddress(op->get_to())))); - if (!cr) - cr = _linphone_client_group_chat_room_new(lc, addr.asString().c_str(), nullptr, FALSE); - L_GET_CPP_PTR_FROM_C_OBJECT(cr)->join(); + shared_ptr chatRoom = L_GET_CPP_PTR_FROM_C_OBJECT(lc)->findChatRoom( + ChatRoomId(addr, IdentityAddress(op->get_to())) + ); + if (!chatRoom) + chatRoom = L_GET_PRIVATE_FROM_C_OBJECT(lc)->createClientGroupChatRoom("", addr.asString(), false); + chatRoom->join(); static_cast(op)->reply(SalReasonNone); return; } diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 2027b4101..a46771707 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -2145,6 +2145,7 @@ static void linphone_core_internal_notify_received(LinphoneCore *lc, LinphoneEve while ((part = linphone_content_get_part(body, i))) { i++; L_GET_PRIVATE(cgcr)->notifyReceived(linphone_content_get_string_buffer(part)); + linphone_content_unref(part); } } else L_GET_PRIVATE(cgcr)->notifyReceived(linphone_content_get_string_buffer(body)); @@ -3449,7 +3450,7 @@ LinphoneProxyConfig * linphone_core_lookup_known_proxy(LinphoneCore *lc, const L LinphoneProxyConfig *default_cfg=lc->default_proxy; if (linphone_address_get_domain(uri) == NULL) { - ms_message("cannot seach for proxy for uri [%p] if no domain set. returning default",uri); + ms_message("Cannot look for proxy for uri [%p] that has no domain set, returning default", uri); return default_cfg; } /*return default proxy if it is matching the destination uri*/ diff --git a/coreapi/private_functions.h b/coreapi/private_functions.h index 6ecc2f094..9ab4e447f 100644 --- a/coreapi/private_functions.h +++ b/coreapi/private_functions.h @@ -275,7 +275,6 @@ void _linphone_proxy_config_unregister(LinphoneProxyConfig *obj); void _linphone_proxy_config_release_ops(LinphoneProxyConfig *obj); /*chat*/ -LinphoneChatRoom *_linphone_client_group_chat_room_new (LinphoneCore *core, const char *uri, const char *subject, bool_t fallback); LinphoneChatRoom *_linphone_server_group_chat_room_new (LinphoneCore *core, LinphonePrivate::SalCallOp *op); void linphone_chat_room_set_call(LinphoneChatRoom *cr, LinphoneCall *call); LinphoneChatRoomCbs * _linphone_chat_room_cbs_new (void); diff --git a/src/c-wrapper/api/c-chat-room.cpp b/src/c-wrapper/api/c-chat-room.cpp index c0bdaeae7..817a82bbd 100644 --- a/src/c-wrapper/api/c-chat-room.cpp +++ b/src/c-wrapper/api/c-chat-room.cpp @@ -29,9 +29,6 @@ #include "c-wrapper/c-wrapper.h" #include "call/call.h" #include "chat/chat-message/chat-message-p.h" -#include "chat/chat-room/basic-chat-room.h" -#include "chat/chat-room/client-group-chat-room-p.h" -#include "chat/chat-room/client-group-to-basic-chat-room.h" #include "chat/chat-room/real-time-text-chat-room-p.h" #include "chat/chat-room/server-group-chat-room-p.h" #include "conference/participant.h" @@ -435,7 +432,7 @@ const bctbx_list_t *linphone_chat_room_get_callbacks_list(const LinphoneChatRoom if (cb) \ cb(__VA_ARGS__); \ } \ - bctbx_free(callbacksCopy); + bctbx_list_free(callbacksCopy); void _linphone_chat_room_notify_is_composing_received(LinphoneChatRoom *cr, const LinphoneAddress *remoteAddr, bool_t isComposing) { NOTIFY_IF_EXIST(IsComposingReceived, is_composing_received, cr, remoteAddr, isComposing) @@ -526,49 +523,6 @@ void linphone_chat_room_set_user_data (LinphoneChatRoom *cr, void *ud) { // Constructor and destructor functions. // ============================================================================= -LinphoneChatRoom *_linphone_client_group_chat_room_new (LinphoneCore *core, const char *uri, const char *subject, bool_t fallback) { - string from; - LinphoneProxyConfig *proxy = nullptr; - if (uri) { - LinphoneAddress *addr = linphone_address_new(uri); - proxy = linphone_core_lookup_known_proxy(core, addr); - linphone_address_unref(addr); - } else { - proxy = linphone_core_get_default_proxy_config(core); - if (!proxy) - return nullptr; - uri = linphone_proxy_config_get_conference_factory_uri(proxy); - if (!uri) - return nullptr; - } - if (proxy) { - const LinphoneAddress *contactAddr = linphone_proxy_config_get_contact(proxy); - if (contactAddr) { - char *cFrom = linphone_address_as_string(contactAddr); - from = string(cFrom); - bctbx_free(cFrom); - } else { - from = L_GET_CPP_PTR_FROM_C_OBJECT(linphone_proxy_config_get_identity_address(proxy))->asString(); - } - } - if (from.empty()) - from = linphone_core_get_primary_contact(core); - LinphonePrivate::IdentityAddress me(from); - shared_ptr cgcr = make_shared( - L_GET_CPP_PTR_FROM_C_OBJECT(core), L_C_TO_STRING(uri), me, L_C_TO_STRING(subject)); - LinphoneChatRoom *cr = L_INIT(ChatRoom); - if (fallback) { - // Create a ClientGroupToBasicChatRoom to handle fallback from ClientGroupChatRoom to BasicGroupChatRoom if - // only one participant is invited and that it does not support group chat - L_SET_CPP_PTR_FROM_C_OBJECT(cr, make_shared(cgcr)); - L_GET_PRIVATE(cgcr)->setCallSessionListener(L_GET_PRIVATE_FROM_C_OBJECT(cr)); - L_GET_PRIVATE(cgcr)->setChatRoomListener(L_GET_PRIVATE_FROM_C_OBJECT(cr)); - } else - L_SET_CPP_PTR_FROM_C_OBJECT(cr, cgcr); - L_GET_PRIVATE_FROM_C_OBJECT(cr)->setState(LinphonePrivate::ChatRoom::State::Instantiated); - return cr; -} - LinphoneChatRoom *_linphone_server_group_chat_room_new (LinphoneCore *core, LinphonePrivate::SalCallOp *op) { LinphoneChatRoom *cr = L_INIT(ChatRoom); L_SET_CPP_PTR_FROM_C_OBJECT(cr, make_shared( diff --git a/src/chat/chat-room/basic-to-client-group-chat-room.cpp b/src/chat/chat-room/basic-to-client-group-chat-room.cpp index f350d8690..67f9ea2fc 100644 --- a/src/chat/chat-room/basic-to-client-group-chat-room.cpp +++ b/src/chat/chat-room/basic-to-client-group-chat-room.cpp @@ -78,7 +78,7 @@ public: } migrationRealTime = currentRealTime; clientGroupChatRoom = static_pointer_cast( - chatRoom->getCore()->getPrivate()->createClientGroupChatRoom(chatRoom->getSubject(), false) + chatRoom->getCore()->getPrivate()->createClientGroupChatRoom(chatRoom->getSubject(), "", false) ); clientGroupChatRoom->getPrivate()->setCallSessionListener(this); clientGroupChatRoom->getPrivate()->setChatRoomListener(this); diff --git a/src/chat/chat-room/chat-room-p.h b/src/chat/chat-room/chat-room-p.h index 2deeec842..4d177d845 100644 --- a/src/chat/chat-room/chat-room-p.h +++ b/src/chat/chat-room/chat-room-p.h @@ -33,6 +33,8 @@ LINPHONE_BEGIN_NAMESPACE class ChatRoomPrivate : public AbstractChatRoomPrivate, public IsComposingListener { public: + inline void setProxyChatRoom (AbstractChatRoom *value) { proxyChatRoom = value; } + inline void setCreationTime (time_t creationTime) override { this->creationTime = creationTime; } @@ -67,12 +69,16 @@ public: void onIsComposingStateChanged (bool isComposing) override; void onIsRemoteComposingStateChanged (const Address &remoteAddress, bool isComposing) override; + LinphoneChatRoom *getCChatRoom () const; + std::list remoteIsComposing; std::list> transientEvents; ChatRoomId chatRoomId; private: + AbstractChatRoom *proxyChatRoom = nullptr; + ChatRoom::State state = ChatRoom::State::None; time_t creationTime = std::time(nullptr); diff --git a/src/chat/chat-room/chat-room.cpp b/src/chat/chat-room/chat-room.cpp index a55a82560..9404bba69 100644 --- a/src/chat/chat-room/chat-room.cpp +++ b/src/chat/chat-room/chat-room.cpp @@ -51,7 +51,7 @@ void ChatRoomPrivate::sendChatMessage (const shared_ptr &chatMessag dChatMessage->setTime(ms_time(0)); dChatMessage->send(); - LinphoneChatRoom *cr = L_GET_C_BACK_PTR(q); + LinphoneChatRoom *cr = getCChatRoom(); // TODO: server currently don't stock message, remove condition in the future. if (!linphone_core_conference_server_enabled(q->getCore()->getCCore())) { shared_ptr event = static_pointer_cast( @@ -129,7 +129,7 @@ list> ChatRoomPrivate::findChatMessages (const string &m void ChatRoomPrivate::notifyChatMessageReceived (const shared_ptr &chatMessage) { L_Q(); - LinphoneChatRoom *cr = L_GET_C_BACK_PTR(q); + LinphoneChatRoom *cr = getCChatRoom(); if (!chatMessage->getPrivate()->getText().empty()) { /* Legacy API */ LinphoneAddress *fromAddress = linphone_address_new(chatMessage->getFromAddress().asString().c_str()); @@ -153,7 +153,7 @@ void ChatRoomPrivate::notifyIsComposingReceived (const Address &remoteAddress, b else remoteIsComposing.remove(remoteAddress); - LinphoneChatRoom *cr = L_GET_C_BACK_PTR(q); + LinphoneChatRoom *cr = getCChatRoom(); LinphoneAddress *lAddr = linphone_address_new(remoteAddress.asString().c_str()); _linphone_chat_room_notify_is_composing_received(cr, lAddr, !!isComposing); linphone_address_unref(lAddr); @@ -163,14 +163,14 @@ void ChatRoomPrivate::notifyIsComposingReceived (const Address &remoteAddress, b void ChatRoomPrivate::notifyStateChanged () { L_Q(); - linphone_core_notify_chat_room_state_changed(q->getCore()->getCCore(), L_GET_C_BACK_PTR(q), (LinphoneChatRoomState)state); - LinphoneChatRoom *cr = L_GET_C_BACK_PTR(q); + LinphoneChatRoom *cr = getCChatRoom(); + linphone_core_notify_chat_room_state_changed(q->getCore()->getCCore(), cr, (LinphoneChatRoomState)state); _linphone_chat_room_notify_state_changed(cr, (LinphoneChatRoomState)state); } void ChatRoomPrivate::notifyUndecryptableChatMessageReceived (const shared_ptr &chatMessage) { L_Q(); - LinphoneChatRoom *cr = L_GET_C_BACK_PTR(q); + LinphoneChatRoom *cr = getCChatRoom(); _linphone_chat_room_notify_undecryptable_message_received(cr, L_GET_C_BACK_PTR(chatMessage)); linphone_core_notify_message_received_unable_decrypt(q->getCore()->getCCore(), cr, L_GET_C_BACK_PTR(chatMessage)); } @@ -262,6 +262,16 @@ void ChatRoomPrivate::onIsRemoteComposingStateChanged (const Address &remoteAddr notifyIsComposingReceived(remoteAddress, isComposing); } +// ----------------------------------------------------------------------------- + +LinphoneChatRoom *ChatRoomPrivate::getCChatRoom () const { + L_Q(); + if (proxyChatRoom) + return L_GET_C_BACK_PTR(proxyChatRoom); + else + return L_GET_C_BACK_PTR(q); +} + // ============================================================================= ChatRoom::ChatRoom (ChatRoomPrivate &p, const shared_ptr &core, const ChatRoomId &chatRoomId) : @@ -341,7 +351,9 @@ int ChatRoom::getHistorySize () const { void ChatRoom::deleteFromDb () { L_D(); - Core::deleteChatRoom(this->getSharedFromThis()); + // Keep a ref, otherwise the object might be destroyed before we can set the Deleted state + shared_ptr ref = this->getSharedFromThis(); + Core::deleteChatRoom(ref); d->setState(ChatRoom::State::Deleted); } diff --git a/src/chat/chat-room/chat-room.h b/src/chat/chat-room/chat-room.h index e5a270a97..40cad5ae3 100644 --- a/src/chat/chat-room/chat-room.h +++ b/src/chat/chat-room/chat-room.h @@ -30,6 +30,8 @@ class ChatRoomPrivate; class LINPHONE_PUBLIC ChatRoom : public AbstractChatRoom { public: + friend class ProxyChatRoomPrivate; + L_OVERRIDE_SHARED_FROM_THIS(ChatRoom); const ChatRoomId &getChatRoomId () const override; diff --git a/src/chat/chat-room/client-group-chat-room.cpp b/src/chat/chat-room/client-group-chat-room.cpp index a5ea59cb4..e40482457 100644 --- a/src/chat/chat-room/client-group-chat-room.cpp +++ b/src/chat/chat-room/client-group-chat-room.cpp @@ -521,7 +521,7 @@ void ClientGroupChatRoom::onParticipantAdded (const shared_ptraddEvent(event); - LinphoneChatRoom *cr = L_GET_C_BACK_PTR(this); + LinphoneChatRoom *cr = d->getCChatRoom(); _linphone_chat_room_notify_participant_added(cr, L_GET_C_BACK_PTR(event)); } @@ -541,7 +541,7 @@ void ClientGroupChatRoom::onParticipantRemoved (const shared_ptrparticipants.remove(participant); d->addEvent(event); - LinphoneChatRoom *cr = L_GET_C_BACK_PTR(this); + LinphoneChatRoom *cr = d->getCChatRoom(); _linphone_chat_room_notify_participant_removed(cr, L_GET_C_BACK_PTR(event)); } @@ -569,7 +569,7 @@ void ClientGroupChatRoom::onParticipantSetAdmin (const shared_ptraddEvent(event); - LinphoneChatRoom *cr = L_GET_C_BACK_PTR(this); + LinphoneChatRoom *cr = d->getCChatRoom(); _linphone_chat_room_notify_participant_admin_status_changed(cr, L_GET_C_BACK_PTR(event)); } @@ -585,7 +585,7 @@ void ClientGroupChatRoom::onSubjectChanged (const shared_ptraddEvent(event); - LinphoneChatRoom *cr = L_GET_C_BACK_PTR(this); + LinphoneChatRoom *cr = d->getCChatRoom(); _linphone_chat_room_notify_subject_changed(cr, L_GET_C_BACK_PTR(event)); } @@ -609,7 +609,7 @@ void ClientGroupChatRoom::onParticipantDeviceAdded (const shared_ptraddEvent(event); - LinphoneChatRoom *cr = L_GET_C_BACK_PTR(this); + LinphoneChatRoom *cr = d->getCChatRoom(); _linphone_chat_room_notify_participant_device_added(cr, L_GET_C_BACK_PTR(event)); } @@ -631,7 +631,7 @@ void ClientGroupChatRoom::onParticipantDeviceRemoved (const shared_ptrgetPrivate()->removeDevice(event->getDeviceAddress()); d->addEvent(event); - LinphoneChatRoom *cr = L_GET_C_BACK_PTR(this); + LinphoneChatRoom *cr = d->getCChatRoom(); _linphone_chat_room_notify_participant_device_removed(cr, L_GET_C_BACK_PTR(event)); } diff --git a/src/chat/chat-room/client-group-chat-room.h b/src/chat/chat-room/client-group-chat-room.h index 3569dd2d2..9bb13f526 100644 --- a/src/chat/chat-room/client-group-chat-room.h +++ b/src/chat/chat-room/client-group-chat-room.h @@ -33,6 +33,7 @@ class LINPHONE_PUBLIC ClientGroupChatRoom : public ChatRoom, public RemoteConfer friend class BasicToClientGroupChatRoomPrivate; friend class ClientGroupToBasicChatRoomPrivate; friend class Core; + friend class CorePrivate; public: L_OVERRIDE_SHARED_FROM_THIS(ClientGroupChatRoom); diff --git a/src/chat/chat-room/client-group-to-basic-chat-room.cpp b/src/chat/chat-room/client-group-to-basic-chat-room.cpp index 7ca4ab61f..c72f9cfec 100644 --- a/src/chat/chat-room/client-group-to-basic-chat-room.cpp +++ b/src/chat/chat-room/client-group-to-basic-chat-room.cpp @@ -48,7 +48,9 @@ public: void onChatRoomDeleteRequested (const shared_ptr &chatRoom) override { L_Q(); - q->getCore()->deleteChatRoom(q->getSharedFromThis()); + // Keep a ref, otherwise the object might be destroyed before we can set the Deleted state + shared_ptr ref = q->getSharedFromThis(); + q->getCore()->deleteChatRoom(ref); setState(AbstractChatRoom::State::Deleted); } @@ -64,24 +66,23 @@ public: const string &message ) override { L_Q(); + // Keep a ref, otherwise the object might be destroyed when calling Core::deleteChatRoom() + shared_ptr ref = q->getSharedFromThis(); + // TODO: Avoid cast, use capabilities. shared_ptr cgcr = dynamic_pointer_cast(chatRoom); if (!cgcr) return; if ((newState == CallSession::State::Error) && (cgcr->getState() == ChatRoom::State::CreationPending) && (session->getReason() == LinphoneReasonNotAcceptable) && (invitedAddresses.size() == 1)) { - teardownCallbacks(); + teardownProxy(); cgcr->getPrivate()->onCallSessionStateChanged(session, newState, message); cgcr->getPrivate()->setCallSessionListener(nullptr); cgcr->getPrivate()->setChatRoomListener(nullptr); Core::deleteChatRoom(q->getSharedFromThis()); - setupCallbacks(); + setupProxy(); LinphoneChatRoom *lcr = L_GET_C_BACK_PTR(q); - shared_ptr bcr = cgcr->getCore()->onlyGetOrCreateBasicChatRoom(invitedAddresses.front()); + shared_ptr bcr = cgcr->getCore()->getOrCreateBasicChatRoom(invitedAddresses.front()); L_SET_CPP_PTR_FROM_C_OBJECT(lcr, bcr); - bcr->getPrivate()->setState(ChatRoom::State::Instantiated); - cgcr->getCore()->getPrivate()->insertChatRoom(bcr); - bcr->getPrivate()->setState(ChatRoom::State::Created); - cgcr->getCore()->getPrivate()->insertChatRoomWithDb(bcr); return; } cgcr->getPrivate()->onCallSessionStateChanged(session, newState, message); diff --git a/src/chat/chat-room/proxy-chat-room-p.h b/src/chat/chat-room/proxy-chat-room-p.h index 89fb81e21..b10aa3d8a 100644 --- a/src/chat/chat-room/proxy-chat-room-p.h +++ b/src/chat/chat-room/proxy-chat-room-p.h @@ -73,8 +73,8 @@ public: chatRoom->getPrivate()->onChatMessageReceived(chatMessage); } - void setupCallbacks (); - void teardownCallbacks (); + void setupProxy (); + void teardownProxy (); std::shared_ptr chatRoom; diff --git a/src/chat/chat-room/proxy-chat-room.cpp b/src/chat/chat-room/proxy-chat-room.cpp index a81847e10..6ddcb4f74 100644 --- a/src/chat/chat-room/proxy-chat-room.cpp +++ b/src/chat/chat-room/proxy-chat-room.cpp @@ -18,7 +18,7 @@ */ #include "basic-to-client-group-chat-room.h" -#include "chat-room.h" +#include "chat-room-p.h" #include "proxy-chat-room-p.h" #include "c-wrapper/c-wrapper.h" @@ -28,98 +28,13 @@ using namespace std; LINPHONE_BEGIN_NAMESPACE -#define PROXY_CALLBACK(callback, ...) \ - LinphoneChatRoomCbs *proxiedCbs = linphone_chat_room_get_current_callbacks(cr); \ - ProxyChatRoom *pcr = static_cast(linphone_chat_room_cbs_get_user_data(proxiedCbs)); \ - LinphoneChatRoom *lcr = L_GET_C_BACK_PTR(pcr->getSharedFromThis()); \ - _linphone_chat_room_notify_ ## callback(lcr, ##__VA_ARGS__) - -static void chatMessageReceived (LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { - PROXY_CALLBACK(chat_message_received, event_log); -} - -static void chatMessageSent (LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { - PROXY_CALLBACK(chat_message_sent, event_log); -} - -static void conferenceAddressGeneration (LinphoneChatRoom *cr) { - PROXY_CALLBACK(conference_address_generation); -} - -static void isComposingReceived (LinphoneChatRoom *cr, const LinphoneAddress *remoteAddr, bool_t isComposing) { - PROXY_CALLBACK(is_composing_received, remoteAddr, isComposing); -} - -static void messageReceived (LinphoneChatRoom *cr, LinphoneChatMessage *msg) { - PROXY_CALLBACK(message_received, msg); -} - -static void participantAdded (LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { - PROXY_CALLBACK(participant_added, event_log); -} - -static void participantAdminStatusChanged (LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { - PROXY_CALLBACK(participant_admin_status_changed, event_log); -} - -static void participantDeviceAdded (LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { - PROXY_CALLBACK(participant_device_added, event_log); -} - -static void participantDeviceFetched (LinphoneChatRoom *cr, const LinphoneAddress *participantAddr) { - PROXY_CALLBACK(participant_device_fetched, participantAddr); -} - -static void participantDeviceRemoved (LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { - PROXY_CALLBACK(participant_device_removed, event_log); -} - -static void participantRemoved (LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { - PROXY_CALLBACK(participant_removed, event_log); -} - -static void participantsCapabilitiesChecked (LinphoneChatRoom *cr, const LinphoneAddress *deviceAddr, const bctbx_list_t *participantsAddr) { - PROXY_CALLBACK(participants_capabilities_checked, deviceAddr, participantsAddr); -} - -static void stateChanged (LinphoneChatRoom *cr, LinphoneChatRoomState newState) { - PROXY_CALLBACK(state_changed, newState); -} - -static void subjectChanged (LinphoneChatRoom *cr, const LinphoneEventLog *event_log) { - PROXY_CALLBACK(subject_changed, event_log); -} - -static void undecryptableMessageReceived (LinphoneChatRoom *cr, LinphoneChatMessage *msg) { - PROXY_CALLBACK(undecryptable_message_received, msg); -} - -void ProxyChatRoomPrivate::setupCallbacks () { +void ProxyChatRoomPrivate::setupProxy () { L_Q(); - LinphoneChatRoom *lcr = L_GET_C_BACK_PTR(chatRoom); - LinphoneChatRoomCbs *cbs = linphone_factory_create_chat_room_cbs(linphone_factory_get()); - linphone_chat_room_cbs_set_user_data(cbs, q); - linphone_chat_room_cbs_set_chat_message_received(cbs, chatMessageReceived); - linphone_chat_room_cbs_set_chat_message_sent(cbs, chatMessageSent); - linphone_chat_room_cbs_set_conference_address_generation(cbs, conferenceAddressGeneration); - linphone_chat_room_cbs_set_is_composing_received(cbs, isComposingReceived); - linphone_chat_room_cbs_set_message_received(cbs, messageReceived); - linphone_chat_room_cbs_set_participant_added(cbs, participantAdded); - linphone_chat_room_cbs_set_participant_admin_status_changed(cbs, participantAdminStatusChanged); - linphone_chat_room_cbs_set_participant_device_added(cbs, participantDeviceAdded); - linphone_chat_room_cbs_set_participant_device_fetched(cbs, participantDeviceFetched); - linphone_chat_room_cbs_set_participant_device_removed(cbs, participantDeviceRemoved); - linphone_chat_room_cbs_set_participant_removed(cbs, participantRemoved); - linphone_chat_room_cbs_set_participants_capabilities_checked(cbs, participantsCapabilitiesChecked); - linphone_chat_room_cbs_set_state_changed(cbs, stateChanged); - linphone_chat_room_cbs_set_subject_changed(cbs, subjectChanged); - linphone_chat_room_cbs_set_undecryptable_message_received(cbs, undecryptableMessageReceived); - linphone_chat_room_add_callbacks(lcr, cbs); + static_pointer_cast(chatRoom)->getPrivate()->setProxyChatRoom(q); } -void ProxyChatRoomPrivate::teardownCallbacks () { - LinphoneChatRoom *lcr = L_GET_C_BACK_PTR(chatRoom); - _linphone_chat_room_clear_callbacks(lcr); +void ProxyChatRoomPrivate::teardownProxy () { + static_pointer_cast(chatRoom)->getPrivate()->setProxyChatRoom(nullptr); } // ----------------------------------------------------------------------------- @@ -128,7 +43,7 @@ void ProxyChatRoomPrivate::teardownCallbacks () { AbstractChatRoom(p, chatRoom->getCore()) { L_D(); d->chatRoom = chatRoom; - d->setupCallbacks(); + d->setupProxy(); } // ----------------------------------------------------------------------------- diff --git a/src/chat/chat-room/proxy-chat-room.h b/src/chat/chat-room/proxy-chat-room.h index 4f162e8ad..5e4c68d11 100644 --- a/src/chat/chat-room/proxy-chat-room.h +++ b/src/chat/chat-room/proxy-chat-room.h @@ -30,6 +30,8 @@ class ChatRoom; class ProxyChatRoomPrivate; class LINPHONE_PUBLIC ProxyChatRoom : public AbstractChatRoom { + friend class CorePrivate; + public: const ChatRoomId &getChatRoomId () const override; diff --git a/src/chat/chat-room/real-time-text-chat-room.cpp b/src/chat/chat-room/real-time-text-chat-room.cpp index f33162682..a33a19535 100644 --- a/src/chat/chat-room/real-time-text-chat-room.cpp +++ b/src/chat/chat-room/real-time-text-chat-room.cpp @@ -52,7 +52,7 @@ void RealTimeTextChatRoomPrivate::realtimeTextReceived (uint32_t character, cons receivedRttCharacters.push_back(cmc); remoteIsComposing.push_back(q->getPeerAddress()); - linphone_core_notify_is_composing_received(cCore, L_GET_C_BACK_PTR(q)); + linphone_core_notify_is_composing_received(cCore, getCChatRoom()); if ((character == new_line) || (character == crlf) || (character == lf)) { // End of message diff --git a/src/conference/conference-interface.h b/src/conference/conference-interface.h index dc4e740a1..aacf6bfab 100644 --- a/src/conference/conference-interface.h +++ b/src/conference/conference-interface.h @@ -34,7 +34,7 @@ class Participant; class LINPHONE_PUBLIC ConferenceInterface { public: - virtual ~ConferenceInterface() = default; + virtual ~ConferenceInterface () = default; virtual void addParticipant ( const IdentityAddress &participantAddress, diff --git a/src/conference/session/call-session.cpp b/src/conference/session/call-session.cpp index 035f66841..1d525bad9 100644 --- a/src/conference/session/call-session.cpp +++ b/src/conference/session/call-session.cpp @@ -62,6 +62,8 @@ void CallSessionPrivate::notifyReferState () { void CallSessionPrivate::setState (CallSession::State newState, const string &message) { L_Q(); + // Keep a ref on the CallSession, otherwise it might get destroyed before the end of the method + shared_ptr ref = q->getSharedFromThis(); if (state != newState){ prevState = state; diff --git a/src/core/core-chat-room.cpp b/src/core/core-chat-room.cpp index 0bceb5707..291c2a600 100644 --- a/src/core/core-chat-room.cpp +++ b/src/core/core-chat-room.cpp @@ -23,6 +23,8 @@ #include "chat/chat-room/basic-chat-room.h" #include "chat/chat-room/basic-to-client-group-chat-room.h" #include "chat/chat-room/chat-room-p.h" +#include "chat/chat-room/client-group-chat-room-p.h" +#include "chat/chat-room/client-group-to-basic-chat-room.h" #include "chat/chat-room/real-time-text-chat-room.h" #include "conference/participant.h" #include "core-p.h" @@ -98,15 +100,59 @@ shared_ptr CorePrivate::createBasicChatRoom ( return chatRoom; } -shared_ptr CorePrivate::createClientGroupChatRoom (const string &subject, bool fallback) { +shared_ptr CorePrivate::createClientGroupChatRoom (const string &subject, const string &uri, bool fallback) { L_Q(); - LinphoneChatRoom *lcr = _linphone_client_group_chat_room_new( - q->getCCore(), - nullptr, - L_STRING_TO_C(subject), - fallback ? TRUE : FALSE - ); - return lcr ? L_GET_CPP_PTR_FROM_C_OBJECT(lcr) : nullptr; + + string usedUri; + string from; + { + LinphoneProxyConfig *proxy = nullptr; + if (uri.empty()) { + proxy = linphone_core_get_default_proxy_config(q->getCCore()); + if (!proxy) + return nullptr; + const char *conferenceFactoryUri = linphone_proxy_config_get_conference_factory_uri(proxy); + if (!conferenceFactoryUri) + return nullptr; + usedUri = conferenceFactoryUri; + } else { + LinphoneAddress *addr = linphone_address_new(uri.c_str()); + proxy = linphone_core_lookup_known_proxy(q->getCCore(), addr); + linphone_address_unref(addr); + usedUri = uri; + } + if (proxy) { + const LinphoneAddress *contactAddr = linphone_proxy_config_get_contact(proxy); + if (contactAddr) { + char *cFrom = linphone_address_as_string(contactAddr); + from = string(cFrom); + bctbx_free(cFrom); + } else + from = L_GET_CPP_PTR_FROM_C_OBJECT(linphone_proxy_config_get_identity_address(proxy))->asString(); + } + } + + shared_ptr chatRoom; + { + shared_ptr clientGroupChatRoom = make_shared( + q->getSharedFromThis(), usedUri, IdentityAddress(from), subject + ); + ClientGroupChatRoomPrivate *dClientGroupChatRoom = clientGroupChatRoom->getPrivate(); + + if (fallback) { + // Create a ClientGroupToBasicChatRoom to handle fallback from ClientGroupChatRoom to BasicGroupChatRoom if + // only one participant is invited and that it does not support group chat + chatRoom = make_shared(clientGroupChatRoom); + dClientGroupChatRoom->setCallSessionListener(chatRoom->getPrivate()); + dClientGroupChatRoom->setChatRoomListener(chatRoom->getPrivate()); + } else + chatRoom = clientGroupChatRoom; + } + chatRoom->getPrivate()->setState(ChatRoom::State::Instantiated); + + noCreatedClientGroupChatRooms[chatRoom.get()] = chatRoom; + + return chatRoom; } void CorePrivate::insertChatRoom (const shared_ptr &chatRoom) { @@ -117,6 +163,9 @@ void CorePrivate::insertChatRoom (const shared_ptr &chatRoom) // Chat room not exist or yes but with the same pointer! L_ASSERT(it == chatRoomsById.end() || it->second == chatRoom); if (it == chatRoomsById.end()) { + // Remove chat room from workaround cache. + noCreatedClientGroupChatRooms.erase(chatRoom.get()); + chatRooms.push_back(chatRoom); chatRoomsById[chatRoomId] = chatRoom; } @@ -218,21 +267,7 @@ shared_ptr Core::findOneToOneChatRoom ( shared_ptr Core::createClientGroupChatRoom (const string &subject) { L_D(); - return d->createClientGroupChatRoom(subject, true); -} - -shared_ptr Core::onlyGetOrCreateBasicChatRoom (const IdentityAddress &peerAddress, bool isRtt) { - list> chatRooms = findChatRooms(peerAddress); - if (!chatRooms.empty()) - return chatRooms.front(); - - const ChatRoomId &chatRoomId = ChatRoomId(peerAddress, getDefaultLocalAddress(getSharedFromThis(), peerAddress)); - shared_ptr chatRoom; - - BasicChatRoom *basicChatRoom = new BasicChatRoom(getSharedFromThis(), chatRoomId); - chatRoom.reset(basicChatRoom); - - return chatRoom; + return d->createClientGroupChatRoom(subject); } shared_ptr Core::getOrCreateBasicChatRoom (const ChatRoomId &chatRoomId, bool isRtt) { @@ -283,6 +318,7 @@ shared_ptr Core::getOrCreateBasicChatRoomFromUri (const string void Core::deleteChatRoom (const shared_ptr &chatRoom) { CorePrivate *d = chatRoom->getCore()->getPrivate(); + d->noCreatedClientGroupChatRooms.erase(chatRoom.get()); const ChatRoomId &chatRoomId = chatRoom->getChatRoomId(); auto chatRoomsByIdIt = d->chatRoomsById.find(chatRoomId); if (chatRoomsByIdIt != d->chatRoomsById.end()) { diff --git a/src/core/core-p.h b/src/core/core-p.h index 1f47779c6..0106dd502 100644 --- a/src/core/core-p.h +++ b/src/core/core-p.h @@ -61,7 +61,7 @@ public: void insertChatRoom (const std::shared_ptr &chatRoom); void insertChatRoomWithDb (const std::shared_ptr &chatRoom); std::shared_ptr createBasicChatRoom (const ChatRoomId &chatRoomId, AbstractChatRoom::CapabilitiesMask capabilities); - std::shared_ptr createClientGroupChatRoom (const std::string &subject, bool fallback = true); + std::shared_ptr createClientGroupChatRoom (const std::string &subject, const std::string &uri = "", bool fallback = true); void replaceChatRoom (const std::shared_ptr &replacedChatRoom, const std::shared_ptr &newChatRoom); std::unique_ptr mainDb; @@ -73,8 +73,12 @@ private: std::shared_ptr currentCall; std::list> chatRooms; + std::unordered_map> chatRoomsById; + // Ugly cache to deal with C code. + std::unordered_map> noCreatedClientGroupChatRooms; + L_DECLARE_PUBLIC(Core); }; diff --git a/src/core/core.cpp b/src/core/core.cpp index d339db5cf..9e9d94cc6 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -77,6 +77,10 @@ void CorePrivate::uninit () { ms_usleep(10000); } + chatRooms.clear(); + chatRoomsById.clear(); + noCreatedClientGroupChatRooms.clear(); + AddressPrivate::clearSipAddressesCache(); } diff --git a/src/core/core.h b/src/core/core.h index b4ae4d921..a8a15630a 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -107,8 +107,9 @@ public: const IdentityAddress &localAddress ); - std::shared_ptr onlyGetOrCreateBasicChatRoom (const IdentityAddress &peerAddress, bool isRtt = false); std::shared_ptr getOrCreateBasicChatRoom (const ChatRoomId &chatRoomId, bool isRtt = false); + + // TODO: Remove me in the future, a chatroom is identified by a local and peer address now! std::shared_ptr getOrCreateBasicChatRoom (const IdentityAddress &peerAddress, bool isRtt = false); std::shared_ptr getOrCreateBasicChatRoomFromUri (const std::string &uri, bool isRtt = false); diff --git a/src/sal/refer-op.cpp b/src/sal/refer-op.cpp index a6ea0425f..6cc1b34b1 100644 --- a/src/sal/refer-op.cpp +++ b/src/sal/refer-op.cpp @@ -59,12 +59,14 @@ void SalReferOp::process_request_event_cb(void *op_base, const belle_sip_request if (!refer_to){ ms_warning("cannot do anything with the refer without destination"); op->reply(SalReasonUnknown);/*is mapped on bad request*/ + op->unref(); return; } SalAddress *referToAddr = sal_address_new(belle_sip_header_get_unparsed_value(BELLE_SIP_HEADER(refer_to))); op->root->callbacks.refer_received(op, referToAddr); /*the app is expected to reply in the callback*/ sal_address_unref(referToAddr); + op->unref(); } void SalReferOp::fill_cbs() { diff --git a/tester/group_chat_tester.c b/tester/group_chat_tester.c index 083a2a3ee..22cb42d4b 100644 --- a/tester/group_chat_tester.c +++ b/tester/group_chat_tester.c @@ -116,6 +116,7 @@ static void core_chat_room_state_changed (LinphoneCore *core, LinphoneChatRoom * linphone_chat_room_cbs_set_subject_changed(cbs, chat_room_subject_changed); linphone_chat_room_cbs_set_participant_device_added(cbs, chat_room_participant_device_added); linphone_chat_room_add_callbacks(cr, cbs); + linphone_chat_room_cbs_unref(cbs); } } @@ -154,11 +155,12 @@ static void _start_core(LinphoneCoreManager *lcm) { linphone_core_manager_start(lcm, TRUE); } -static void _send_message(LinphoneChatRoom *chatRoom, const char *message) { +static LinphoneChatMessage *_send_message(LinphoneChatRoom *chatRoom, const char *message) { LinphoneChatMessage *msg = linphone_chat_room_create_message(chatRoom, message); LinphoneChatMessageCbs *msgCbs = linphone_chat_message_get_callbacks(msg); linphone_chat_message_cbs_set_msg_state_changed(msgCbs, liblinphone_tester_chat_message_msg_state_changed); linphone_chat_message_send(msg); + return msg; } static void _send_file_plus_text(LinphoneChatRoom* cr, const char *sendFilepath, const char *text) { @@ -180,8 +182,9 @@ static void _send_file_plus_text(LinphoneChatRoom* cr, const char *sendFilepath, linphone_chat_message_cbs_set_file_transfer_send(cbs, tester_file_transfer_send); linphone_chat_message_cbs_set_msg_state_changed(cbs,liblinphone_tester_chat_message_msg_state_changed); linphone_chat_message_cbs_set_file_transfer_progress_indication(cbs, file_transfer_progress_indication); - linphone_chat_room_send_chat_message_2(cr, msg); + linphone_chat_room_send_chat_message(cr, msg); linphone_content_unref(content); + linphone_chat_message_unref(msg); } static void _send_file(LinphoneChatRoom* cr, const char *sendFilepath) { @@ -392,8 +395,8 @@ static void group_chat_room_creation_server (void) { BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneIsComposingActiveReceived, initialMarieStats.number_of_LinphoneIsComposingActiveReceived + 1, 10000)); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneIsComposingActiveReceived, initialPaulineStats.number_of_LinphoneIsComposingActiveReceived + 1, 10000)); BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_LinphoneIsComposingActiveReceived, initialLaureStats.number_of_LinphoneIsComposingActiveReceived + 1, 10000)); - const char *chloeMessage = "Hello"; - _send_message(chloeCr, chloeMessage); + const char *chloeTextMessage = "Hello"; + LinphoneChatMessage *chloeMessage = _send_message(chloeCr, chloeTextMessage); BC_ASSERT_TRUE(wait_for_list(coresList, &chloe->stat.number_of_LinphoneMessageDelivered, initialChloeStats.number_of_LinphoneMessageDelivered + 1, 10000)); BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneMessageReceived, initialMarieStats.number_of_LinphoneMessageReceived + 1, 10000)); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneMessageReceived, initialPaulineStats.number_of_LinphoneMessageReceived + 1, 10000)); @@ -401,7 +404,8 @@ static void group_chat_room_creation_server (void) { BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneIsComposingIdleReceived, initialMarieStats.number_of_LinphoneIsComposingIdleReceived + 1, 10000)); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneIsComposingIdleReceived, initialPaulineStats.number_of_LinphoneIsComposingIdleReceived + 1, 10000)); BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_LinphoneIsComposingIdleReceived, initialLaureStats.number_of_LinphoneIsComposingIdleReceived + 1, 10000)); - BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(marie->stat.last_received_chat_message), chloeMessage); + BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(marie->stat.last_received_chat_message), chloeTextMessage); + linphone_chat_message_unref(chloeMessage); LinphoneAddress *chloeAddr = linphone_address_new(linphone_core_get_identity(chloe->lc)); BC_ASSERT_TRUE(linphone_address_weak_equal(chloeAddr, linphone_chat_message_get_from_address(marie->stat.last_received_chat_message))); linphone_address_unref(chloeAddr); @@ -488,7 +492,7 @@ static void group_chat_room_add_participant (void) { // Pauline creates a new group chat room const char *initialSubject = "Colleagues"; LinphoneChatRoom *paulineCr = create_chat_room_client_side(coresList, pauline, &initialPaulineStats, participantsAddresses, initialSubject, -1); - const LinphoneAddress *confAddr = linphone_chat_room_get_conference_address(paulineCr); + LinphoneAddress *confAddr = linphone_address_clone(linphone_chat_room_get_conference_address(paulineCr)); // Check that the chat room is correctly created on Pauline's side and that the participants are added LinphoneChatRoom *marieCr = check_creation_chat_room_client_side(coresList, marie, &initialMarieStats, confAddr, initialSubject, 2, FALSE); @@ -498,15 +502,16 @@ static void group_chat_room_add_participant (void) { // To simulate dialog removal for Pauline linphone_core_set_network_reachable(pauline->lc, FALSE); - coresList=bctbx_list_remove(coresList, pauline->lc); + LinphoneAddress *paulineAddr = linphone_address_clone(linphone_chat_room_get_peer_address(paulineCr)); + coresList = bctbx_list_remove(coresList, pauline->lc); linphone_core_manager_reinit(pauline); bctbx_list_t *tmpCoresManagerList = bctbx_list_append(NULL, pauline); - init_core_for_conference(tmpCoresManagerList); + bctbx_list_t *tmpCoresList = init_core_for_conference(tmpCoresManagerList); bctbx_list_free(tmpCoresManagerList); - coresList = bctbx_list_append(coresList, pauline->lc); + coresList = bctbx_list_concat(coresList, tmpCoresList); linphone_core_manager_start(pauline, TRUE); - LinphoneChatRoom *olpaulineCr = paulineCr; - paulineCr = linphone_core_get_chat_room(pauline->lc, linphone_chat_room_get_peer_address(olpaulineCr)); + paulineCr = linphone_core_get_chat_room(pauline->lc, paulineAddr); + linphone_address_unref(paulineAddr); // Pauline adds Chloe to the chat room participantsAddresses = NULL; @@ -533,9 +538,9 @@ static void group_chat_room_add_participant (void) { coresList = bctbx_list_remove(coresList, chloe->lc); linphone_core_manager_reinit(chloe); tmpCoresManagerList = bctbx_list_append(NULL, chloe); - init_core_for_conference(tmpCoresManagerList); + tmpCoresList = init_core_for_conference(tmpCoresManagerList); bctbx_list_free(tmpCoresManagerList); - coresList = bctbx_list_append(coresList, chloe->lc); + coresList = bctbx_list_concat(coresList, tmpCoresList); linphone_core_manager_start(chloe, TRUE); // Pauline adds Chloe to the chat room @@ -565,6 +570,7 @@ static void group_chat_room_add_participant (void) { BC_ASSERT_EQUAL(linphone_core_get_call_history_size(pauline->lc), 0, int,"%i"); BC_ASSERT_EQUAL(linphone_core_get_call_history_size(chloe->lc), 0, int,"%i"); + linphone_address_unref(confAddr); bctbx_list_free(coresList); bctbx_list_free(coresManagerList); linphone_core_manager_destroy(marie); @@ -665,8 +671,8 @@ static void group_chat_room_message (bool_t encrypt) { linphone_chat_room_compose(chloeCr); BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneIsComposingActiveReceived, initialMarieStats.number_of_LinphoneIsComposingActiveReceived + 1, 10000)); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneIsComposingActiveReceived, initialPaulineStats.number_of_LinphoneIsComposingActiveReceived + 1, 10000)); - const char *chloeMessage = "Hello"; - _send_message(chloeCr, chloeMessage); + const char *chloeTextMessage = "Hello"; + LinphoneChatMessage *chloeMessage = _send_message(chloeCr, chloeTextMessage); BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneMessageReceived, initialMarieStats.number_of_LinphoneMessageReceived + 1, 10000)); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneMessageReceived, initialPaulineStats.number_of_LinphoneMessageReceived + 1, 10000)); BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneIsComposingIdleReceived, initialMarieStats.number_of_LinphoneIsComposingIdleReceived + 1, 10000)); @@ -675,7 +681,8 @@ static void group_chat_room_message (bool_t encrypt) { if (!BC_ASSERT_PTR_NOT_NULL(marieLastMsg)) goto end; - BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(marieLastMsg), chloeMessage); + BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(marieLastMsg), chloeTextMessage); + linphone_chat_message_unref(chloeMessage); LinphoneAddress *chloeAddr = linphone_address_new(linphone_core_get_identity(chloe->lc)); BC_ASSERT_TRUE(linphone_address_weak_equal(chloeAddr, linphone_chat_message_get_from_address(marieLastMsg))); linphone_address_unref(chloeAddr); @@ -684,8 +691,8 @@ static void group_chat_room_message (bool_t encrypt) { linphone_chat_room_compose(paulineCr); BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneIsComposingActiveReceived, initialMarieStats.number_of_LinphoneIsComposingActiveReceived + 1, 10000)); BC_ASSERT_TRUE(wait_for_list(coresList, &chloe->stat.number_of_LinphoneIsComposingActiveReceived, initialChloeStats.number_of_LinphoneIsComposingActiveReceived + 1, 10000)); - const char *paulineMessage = "Héllö Dàrling"; - _send_message(paulineCr, paulineMessage); + const char *paulineTextMessage = "Héllö Dàrling"; + LinphoneChatMessage *paulineMessage = _send_message(paulineCr, paulineTextMessage); BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneMessageReceived, initialMarieStats.number_of_LinphoneMessageReceived + 1, 10000)); BC_ASSERT_TRUE(wait_for_list(coresList, &chloe->stat.number_of_LinphoneMessageReceived, initialChloeStats.number_of_LinphoneMessageReceived + 1, 10000)); BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneIsComposingIdleReceived, initialMarieStats.number_of_LinphoneIsComposingIdleReceived + 1, 10000)); @@ -694,7 +701,8 @@ static void group_chat_room_message (bool_t encrypt) { if (!BC_ASSERT_PTR_NOT_NULL(marieLastMsg)) goto end; - BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(marieLastMsg), paulineMessage); + BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(marieLastMsg), paulineTextMessage); + linphone_chat_message_unref(paulineMessage); LinphoneAddress *paulineAddr = linphone_address_new(linphone_core_get_identity(pauline->lc)); BC_ASSERT_TRUE(linphone_address_weak_equal(paulineAddr, linphone_chat_message_get_from_address(marieLastMsg))); linphone_address_unref(paulineAddr); @@ -1242,8 +1250,9 @@ static void group_chat_room_send_message_with_participant_removed (void) { BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_participants_removed, initialPaulineStats.number_of_participants_removed + 1, 1000)); // Laure try to send a message with the chat room where she was removed - const char *laureMessage = "Hello"; - _send_message(laureCr, laureMessage); + const char *laureTextMessage = "Hello"; + LinphoneChatMessage *laureMessage = _send_message(laureCr, laureTextMessage); + linphone_chat_message_unref(laureMessage); BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_LinphoneMessageReceived, initialMarieStats.number_of_LinphoneMessageDelivered, 10000)); BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneMessageReceived, initialMarieStats.number_of_LinphoneMessageReceived, 10000)); @@ -1431,13 +1440,17 @@ static void group_chat_room_create_room_with_disconnected_friends_base (bool_t i if (initial_message) { if (BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneMessageReceived, 1, 10000))) { LinphoneChatMessage *msg = linphone_chat_room_get_last_message_in_history(paulineCr); - if (BC_ASSERT_PTR_NOT_NULL(msg)) + if (BC_ASSERT_PTR_NOT_NULL(msg)) { BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(msg), "Salut"); + linphone_chat_message_unref(msg); + } } if (BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_LinphoneMessageReceived, 1, 10000))) { LinphoneChatMessage *msg = linphone_chat_room_get_last_message_in_history(laureCr); - if (BC_ASSERT_PTR_NOT_NULL(msg)) + if (BC_ASSERT_PTR_NOT_NULL(msg)) { BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(msg), "Salut"); + linphone_chat_message_unref(msg); + } } } @@ -1513,11 +1526,11 @@ static void group_chat_room_reinvited_after_removed_base (bool_t offline_when_re lp_config_set_string(linphone_core_get_config(laure->lc), "misc", "uuid", savedLaureUuid); bctbx_free(savedLaureUuid); bctbx_list_t *tmpCoresManagerList = bctbx_list_append(NULL, laure); - init_core_for_conference(tmpCoresManagerList); + bctbx_list_t *tmpCoresList = init_core_for_conference(tmpCoresManagerList); bctbx_list_free(tmpCoresManagerList); initialLaureStats = laure->stat; linphone_core_manager_start(laure, TRUE); - coresList = bctbx_list_append(coresList, laure->lc); + coresList = bctbx_list_concat(coresList, tmpCoresList); coresManagerList = bctbx_list_append(coresManagerList, laure); } if (!offline_when_reinvited) @@ -1535,11 +1548,11 @@ static void group_chat_room_reinvited_after_removed_base (bool_t offline_when_re lp_config_set_string(linphone_core_get_config(laure->lc), "misc", "uuid", savedLaureUuid); bctbx_free(savedLaureUuid); bctbx_list_t *tmpCoresManagerList = bctbx_list_append(NULL, laure); - init_core_for_conference(tmpCoresManagerList); + bctbx_list_t *tmpCoresList = init_core_for_conference(tmpCoresManagerList); bctbx_list_free(tmpCoresManagerList); initialLaureStats = laure->stat; linphone_core_manager_start(laure, TRUE); - coresList = bctbx_list_append(coresList, laure->lc); + coresList = bctbx_list_concat(coresList, tmpCoresList); coresManagerList = bctbx_list_append(coresManagerList, laure); BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_LinphoneChatRoomStateCreationPending, initialLaureStats.number_of_LinphoneChatRoomStateCreationPending + 1, 5000)); BC_ASSERT_TRUE(wait_for_list(coresList, &laure->stat.number_of_LinphoneChatRoomStateCreated, initialLaureStats.number_of_LinphoneChatRoomStateCreated + 2, 5000)); @@ -1549,7 +1562,9 @@ static void group_chat_room_reinvited_after_removed_base (bool_t offline_when_re } BC_ASSERT_EQUAL(linphone_chat_room_get_nb_participants(marieCr), 2, int, "%d"); BC_ASSERT_EQUAL(linphone_chat_room_get_nb_participants(paulineCr), 2, int, "%d"); - laureAddr = linphone_address_new(linphone_core_get_device_identity(laure->lc)); + char *laureIdentity = linphone_core_get_device_identity(laure->lc); + laureAddr = linphone_address_new(laureIdentity); + bctbx_free(laureIdentity); LinphoneChatRoom *newLaureCr = linphone_core_find_chat_room(laure->lc, confAddr, laureAddr); linphone_address_unref(laureAddr); if (!offline_when_removed) @@ -2059,7 +2074,6 @@ static void multiple_is_composing_notification(void) { } } - // Marie side BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneIsComposingActiveReceived, 2, 1000)); // + 1 composing_addresses = linphone_chat_room_get_composing_addresses(marieCr); @@ -2132,9 +2146,10 @@ static void group_chat_room_fallback_to_basic_chat_room (void) { bctbx_list_free_with_data(participantsAddresses, (bctbx_list_free_func)linphone_address_unref); participantsAddresses = NULL; - // Send a message and check that a basic chat room is create on Pauline's side + // Send a message and check that a basic chat room is created on Pauline's side LinphoneChatMessage *msg = linphone_chat_room_create_message(marieCr, "Hey Pauline!"); linphone_chat_message_send(msg); + linphone_chat_message_unref(msg); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneMessageReceived, initialPaulineStats.number_of_LinphoneMessageReceived + 1, 1000)); BC_ASSERT_PTR_NOT_NULL(pauline->stat.last_received_chat_message); if (pauline->stat.last_received_chat_message) @@ -2251,9 +2266,10 @@ static void group_chat_room_migrate_from_basic_chat_room (void) { LinphoneAddress *paulineAddr = linphone_address_new(linphone_core_get_identity(pauline->lc)); LinphoneChatRoom *marieCr = linphone_core_get_chat_room(marie->lc, paulineAddr); - // Send a message and check that a basic chat room is create on Pauline's side + // Send a message and check that a basic chat room is created on Pauline's side LinphoneChatMessage *msg = linphone_chat_room_create_message(marieCr, "Hey Pauline!"); linphone_chat_message_send(msg); + linphone_chat_message_unref(msg); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneMessageReceived, initialPaulineStats.number_of_LinphoneMessageReceived + 1, 1000)); BC_ASSERT_PTR_NOT_NULL(pauline->stat.last_received_chat_message); if (pauline->stat.last_received_chat_message) @@ -2268,9 +2284,9 @@ static void group_chat_room_migrate_from_basic_chat_room (void) { coresList = bctbx_list_remove(coresList, marie->lc); linphone_core_manager_reinit(marie); bctbx_list_t *tmpCoresManagerList = bctbx_list_append(NULL, marie); - init_core_for_conference(tmpCoresManagerList); + bctbx_list_t *tmpCoresList = init_core_for_conference(tmpCoresManagerList); bctbx_list_free(tmpCoresManagerList); - coresList = bctbx_list_append(coresList, marie->lc); + coresList = bctbx_list_concat(coresList, tmpCoresList); linphone_core_manager_start(marie, TRUE); // Send a new message to initiate chat room migration @@ -2282,6 +2298,7 @@ static void group_chat_room_migrate_from_basic_chat_room (void) { BC_ASSERT_EQUAL(linphone_chat_room_get_capabilities(marieCr), LinphoneChatRoomCapabilitiesBasic | LinphoneChatRoomCapabilitiesProxy | LinphoneChatRoomCapabilitiesMigratable | LinphoneChatRoomCapabilitiesOneToOne, int, "%d"); msg = linphone_chat_room_create_message(marieCr, "Did you migrate?"); linphone_chat_message_send(msg); + linphone_chat_message_unref(msg); BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneChatRoomStateCreationPending, initialMarieStats.number_of_LinphoneChatRoomStateCreationPending + 1, 10000)); BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneChatRoomStateCreated, initialMarieStats.number_of_LinphoneChatRoomStateCreated + 1, 10000)); BC_ASSERT_TRUE(linphone_chat_room_get_capabilities(marieCr) & LinphoneChatRoomCapabilitiesConference); @@ -2297,12 +2314,14 @@ static void group_chat_room_migrate_from_basic_chat_room (void) { msg = linphone_chat_room_create_message(marieCr, "Let's go drink a beer"); linphone_chat_message_send(msg); + linphone_chat_message_unref(msg); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneMessageReceived, initialPaulineStats.number_of_LinphoneMessageReceived + 2, 1000)); BC_ASSERT_EQUAL(linphone_chat_room_get_history_size(marieCr), 3, int, "%d"); BC_ASSERT_EQUAL(linphone_chat_room_get_history_size(paulineCr), 3, int, "%d"); msg = linphone_chat_room_create_message(paulineCr, "Let's go drink mineral water instead"); linphone_chat_message_send(msg); + linphone_chat_message_unref(msg); BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneMessageReceived, initialMarieStats.number_of_LinphoneMessageReceived + 1, 1000)); BC_ASSERT_EQUAL(linphone_chat_room_get_history_size(marieCr), 4, int, "%d"); BC_ASSERT_EQUAL(linphone_chat_room_get_history_size(paulineCr), 4, int, "%d"); @@ -2315,6 +2334,7 @@ static void group_chat_room_migrate_from_basic_chat_room (void) { linphone_core_manager_delete_chat_room(marie, marieCr, coresList); linphone_core_manager_delete_chat_room(pauline, paulineCr, coresList); + linphone_address_unref(paulineAddr); bctbx_list_free(coresList); bctbx_list_free(coresManagerList); linphone_core_manager_destroy(marie); @@ -2352,7 +2372,7 @@ static void group_chat_room_migrate_from_basic_to_client_fail (void) { bctbx_list_free_with_data(participantsAddresses, (bctbx_list_free_func)linphone_address_unref); participantsAddresses = NULL; - // Send a message and check that a basic chat room is create on Pauline's side + // Send a message and check that a basic chat room is created on Pauline's side LinphoneChatMessage *msg = linphone_chat_room_create_message(marieCr, "Hey Pauline!"); linphone_chat_message_send(msg); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneMessageReceived, initialPaulineStats.number_of_LinphoneMessageReceived + 1, 1000)); @@ -2456,9 +2476,10 @@ static void group_chat_donot_room_migrate_from_basic_chat_room (void) { LinphoneAddress *paulineAddr = linphone_address_new(linphone_core_get_identity(pauline->lc)); LinphoneChatRoom *marieCr = linphone_core_get_chat_room(marie->lc, paulineAddr); - // Send a message and check that a basic chat room is create on Pauline's side + // Send a message and check that a basic chat room is created on Pauline's side LinphoneChatMessage *msg = linphone_chat_room_create_message(marieCr, "Hey Pauline!"); linphone_chat_message_send(msg); + linphone_chat_message_unref(msg); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneMessageReceived, initialPaulineStats.number_of_LinphoneMessageReceived + 1, 1000)); BC_ASSERT_PTR_NOT_NULL(pauline->stat.last_received_chat_message); if (pauline->stat.last_received_chat_message) @@ -2485,6 +2506,7 @@ static void group_chat_donot_room_migrate_from_basic_chat_room (void) { BC_ASSERT_EQUAL(linphone_chat_room_get_capabilities(marieCr), LinphoneChatRoomCapabilitiesBasic | LinphoneChatRoomCapabilitiesOneToOne, int, "%d"); msg = linphone_chat_room_create_message(marieCr, "Did you migrate?"); linphone_chat_message_send(msg); + linphone_chat_message_unref(msg); BC_ASSERT_FALSE(wait_for_list(coresList, &marie->stat.number_of_LinphoneChatRoomStateCreationPending, initialMarieStats.number_of_LinphoneChatRoomStateCreationPending + 1, 10000)); BC_ASSERT_FALSE(wait_for_list(coresList, &marie->stat.number_of_LinphoneChatRoomStateCreated, initialMarieStats.number_of_LinphoneChatRoomStateCreated + 1, 10000)); BC_ASSERT_TRUE(linphone_chat_room_get_capabilities(marieCr) & LinphoneChatRoomCapabilitiesBasic); @@ -2500,12 +2522,14 @@ static void group_chat_donot_room_migrate_from_basic_chat_room (void) { msg = linphone_chat_room_create_message(marieCr, "Let's go drink a beer"); linphone_chat_message_send(msg); + linphone_chat_message_unref(msg); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneMessageReceived, initialPaulineStats.number_of_LinphoneMessageReceived + 2, 1000)); BC_ASSERT_EQUAL(linphone_chat_room_get_history_size(marieCr), 3, int, "%d"); BC_ASSERT_EQUAL(linphone_chat_room_get_history_size(paulineCr), 3, int, "%d"); msg = linphone_chat_room_create_message(paulineCr, "Let's go drink mineral water instead"); linphone_chat_message_send(msg); + linphone_chat_message_unref(msg); BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneMessageReceived, initialMarieStats.number_of_LinphoneMessageReceived + 1, 1000)); BC_ASSERT_EQUAL(linphone_chat_room_get_history_size(marieCr), 4, int, "%d"); BC_ASSERT_EQUAL(linphone_chat_room_get_history_size(paulineCr), 4, int, "%d"); @@ -2515,6 +2539,7 @@ static void group_chat_donot_room_migrate_from_basic_chat_room (void) { linphone_core_delete_chat_room(marie->lc, marieCr); linphone_core_delete_chat_room(pauline->lc, paulineCr); + linphone_address_unref(paulineAddr); bctbx_list_free(coresList); bctbx_list_free(coresManagerList); linphone_core_manager_destroy(marie); @@ -2629,11 +2654,12 @@ static void group_chat_room_unique_one_to_one_chat_room (void) { BC_ASSERT_TRUE(linphone_chat_room_get_capabilities(paulineCr) & LinphoneChatRoomCapabilitiesOneToOne); // Marie sends a message - const char *message = "Hello"; - _send_message(marieCr, message); + const char *textMessage = "Hello"; + LinphoneChatMessage *message = _send_message(marieCr, textMessage); BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneMessageDelivered, initialMarieStats.number_of_LinphoneMessageDelivered + 1, 10000)); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneMessageReceived, initialPaulineStats.number_of_LinphoneMessageReceived + 1, 10000)); - BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(pauline->stat.last_received_chat_message), message); + BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(pauline->stat.last_received_chat_message), textMessage); + linphone_chat_message_unref(message); // Marie deletes the chat room linphone_core_manager_delete_chat_room(marie, marieCr, coresList); @@ -2647,11 +2673,12 @@ static void group_chat_room_unique_one_to_one_chat_room (void) { marieCr = create_chat_room_client_side(coresList, marie, &initialMarieStats, participantsAddresses, initialSubject, -1); // Marie sends a new message - message = "Hey again"; - _send_message(marieCr, message); + textMessage = "Hey again"; + message = _send_message(marieCr, textMessage); BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneMessageDelivered, initialMarieStats.number_of_LinphoneMessageDelivered + 1, 10000)); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneMessageReceived, initialPaulineStats.number_of_LinphoneMessageReceived + 1, 10000)); - BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(pauline->stat.last_received_chat_message), message); + BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(pauline->stat.last_received_chat_message), textMessage); + linphone_chat_message_unref(message); // Check that the created address is the same as before const LinphoneAddress *newConfAddr = linphone_chat_room_get_conference_address(marieCr); @@ -2693,28 +2720,28 @@ static void group_chat_room_unique_one_to_one_chat_room_recreated_from_message_b BC_ASSERT_TRUE(linphone_chat_room_get_capabilities(paulineCr) & LinphoneChatRoomCapabilitiesOneToOne); // Marie sends a message - const char *message = "Hello"; - _send_message(marieCr, message); + const char *textMessage = "Hello"; + LinphoneChatMessage *message = _send_message(marieCr, textMessage); BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneMessageDelivered, initialMarieStats.number_of_LinphoneMessageDelivered + 1, 10000)); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneMessageReceived, initialPaulineStats.number_of_LinphoneMessageReceived + 1, 10000)); - BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(pauline->stat.last_received_chat_message), message); + BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(pauline->stat.last_received_chat_message), textMessage); + linphone_chat_message_unref(message); if (with_app_restart) { - //to simulate dialog removal + // To simulate dialog removal + LinphoneAddress *marieAddr = linphone_address_clone(linphone_chat_room_get_peer_address(marieCr)); linphone_core_set_network_reachable(marie->lc, FALSE); - coresList=bctbx_list_remove(coresList, marie->lc); + coresList = bctbx_list_remove(coresList, marie->lc); linphone_core_manager_reinit(marie); bctbx_list_t *tmpCoresManagerList = bctbx_list_append(NULL, marie); - init_core_for_conference(tmpCoresManagerList); + bctbx_list_t *tmpCoresList = init_core_for_conference(tmpCoresManagerList); bctbx_list_free(tmpCoresManagerList); - coresList = bctbx_list_append(coresList, marie->lc); + coresList = bctbx_list_concat(coresList, tmpCoresList); linphone_core_manager_start(marie, TRUE); - //wait_for_list(coresList, 0, 1, 2000); - LinphoneChatRoom *oldMarieCr = marieCr; - marieCr = linphone_core_get_chat_room(marie->lc, linphone_chat_room_get_peer_address(oldMarieCr)); + marieCr = linphone_core_get_chat_room(marie->lc, marieAddr); + linphone_address_unref(marieAddr); } - // Marie deletes the chat room linphone_core_manager_delete_chat_room(marie, marieCr, coresList); wait_for_list(coresList, 0, 1, 2000); @@ -2725,11 +2752,12 @@ static void group_chat_room_unique_one_to_one_chat_room_recreated_from_message_b initialPaulineStats = pauline->stat; // Pauline sends a new message - message = "Hey you"; - _send_message(paulineCr, message); + textMessage = "Hey you"; + message = _send_message(paulineCr, textMessage); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneMessageDelivered, initialPaulineStats.number_of_LinphoneMessageDelivered + 1, 10000)); BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneMessageReceived, initialMarieStats.number_of_LinphoneMessageReceived + 1, 10000)); - BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(marie->stat.last_received_chat_message), message); + BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(marie->stat.last_received_chat_message), textMessage); + linphone_chat_message_unref(message); // Check that the chat room has been correctly recreated on Marie's side marieCr = check_creation_chat_room_client_side(coresList, marie, &initialMarieStats, confAddr, initialSubject, 1, FALSE); @@ -2779,7 +2807,6 @@ static void group_chat_room_unique_one_to_one_chat_room_recreated_from_message_2 stats initialMarieStats = marie->stat; stats initialPaulineStats = pauline->stat; - linphone_core_set_network_reachable(marie2->lc, FALSE); linphone_core_set_network_reachable(pauline2->lc, FALSE); @@ -2795,11 +2822,12 @@ static void group_chat_room_unique_one_to_one_chat_room_recreated_from_message_2 BC_ASSERT_TRUE(linphone_chat_room_get_capabilities(paulineCr) & LinphoneChatRoomCapabilitiesOneToOne); // Marie sends a message - const char *message = "Hello"; - _send_message(marieCr, message); + const char *textMessage = "Hello"; + LinphoneChatMessage *message = _send_message(marieCr, textMessage); BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneMessageDelivered, initialMarieStats.number_of_LinphoneMessageDelivered + 1, 10000)); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneMessageReceived, initialPaulineStats.number_of_LinphoneMessageReceived + 1, 10000)); - BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(pauline->stat.last_received_chat_message), message); + BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(pauline->stat.last_received_chat_message), textMessage); + linphone_chat_message_unref(message); // Marie deletes the chat room linphone_core_manager_delete_chat_room(marie, marieCr, coresList); @@ -2812,16 +2840,17 @@ static void group_chat_room_unique_one_to_one_chat_room_recreated_from_message_2 initialMarieStats = marie->stat; initialPaulineStats = pauline->stat; marieCr = create_chat_room_client_side(coresList, marie, &initialMarieStats, participantsAddresses, initialSubject, -1); + // Check that the chat room has been correctly recreated on Marie's side marieCr = check_creation_chat_room_client_side(coresList, marie, &initialMarieStats, confAddr, initialSubject, 1, FALSE); if (BC_ASSERT_PTR_NOT_NULL(marieCr)){ BC_ASSERT_TRUE(linphone_chat_room_get_capabilities(marieCr) & LinphoneChatRoomCapabilitiesOneToOne); - - message = "Hey you"; - _send_message(marieCr, message); + textMessage = "Hey you"; + message = _send_message(marieCr, textMessage); BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneMessageDelivered, initialMarieStats.number_of_LinphoneMessageDelivered + 1, 10000)); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneMessageReceived, initialPaulineStats.number_of_LinphoneMessageReceived + 1, 10000)); - BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(pauline->stat.last_received_chat_message), message); + BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(pauline->stat.last_received_chat_message), textMessage); + linphone_chat_message_unref(message); // Clean db from chat room linphone_core_manager_delete_chat_room(marie, marieCr, coresList); @@ -2870,18 +2899,20 @@ static void group_chat_room_join_one_to_one_chat_room_with_a_new_device (void) { BC_ASSERT_TRUE(linphone_chat_room_get_capabilities(paulineCr) & LinphoneChatRoomCapabilitiesOneToOne); // Marie1 sends a message - const char *message = "Hello"; - _send_message(marie1Cr, message); + const char *textMessage = "Hello"; + LinphoneChatMessage *message = _send_message(marie1Cr, textMessage); BC_ASSERT_TRUE(wait_for_list(coresList, &marie1->stat.number_of_LinphoneMessageDelivered, initialMarie1Stats.number_of_LinphoneMessageDelivered + 1, 10000)); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneMessageReceived, initialPaulineStats.number_of_LinphoneMessageReceived + 1, 10000)); - BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(pauline->stat.last_received_chat_message), message); + BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(pauline->stat.last_received_chat_message), textMessage); + linphone_chat_message_unref(message); // Pauline answers to the previous message - message = "Hey. How are you?"; - _send_message(paulineCr, message); + textMessage = "Hey. How are you?"; + message = _send_message(paulineCr, textMessage); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneMessageDelivered, initialPaulineStats.number_of_LinphoneMessageDelivered + 1, 10000)); BC_ASSERT_TRUE(wait_for_list(coresList, &marie1->stat.number_of_LinphoneMessageReceived, initialMarie1Stats.number_of_LinphoneMessageReceived + 1, 10000)); - BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(marie1->stat.last_received_chat_message), message); + BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(marie1->stat.last_received_chat_message), textMessage); + linphone_chat_message_unref(message); // Simulate an uninstall of the application on Marie's side linphone_core_set_network_reachable(marie1->lc, FALSE); @@ -2905,18 +2936,20 @@ static void group_chat_room_join_one_to_one_chat_room_with_a_new_device (void) { BC_ASSERT_TRUE(linphone_address_weak_equal(confAddr, newConfAddr)); // Marie2 sends a new message - message = "Fine and you?"; - _send_message(marie2Cr, message); + textMessage = "Fine and you?"; + message = _send_message(marie2Cr, textMessage); BC_ASSERT_TRUE(wait_for_list(coresList, &marie2->stat.number_of_LinphoneMessageDelivered, initialMarie2Stats.number_of_LinphoneMessageDelivered + 1, 10000)); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneMessageReceived, initialPaulineStats.number_of_LinphoneMessageReceived + 2, 10000)); - BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(pauline->stat.last_received_chat_message), message); + BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(pauline->stat.last_received_chat_message), textMessage); + linphone_chat_message_unref(message); // Pauline answers to the previous message - message = "Perfect!"; - _send_message(paulineCr, message); + textMessage = "Perfect!"; + message = _send_message(paulineCr, textMessage); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneMessageDelivered, initialPaulineStats.number_of_LinphoneMessageDelivered + 2, 10000)); BC_ASSERT_TRUE(wait_for_list(coresList, &marie2->stat.number_of_LinphoneMessageReceived, initialMarie2Stats.number_of_LinphoneMessageReceived + 1, 10000)); - BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(marie2->stat.last_received_chat_message), message); + BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(marie2->stat.last_received_chat_message), textMessage); + linphone_chat_message_unref(message); // Clean db from chat room linphone_core_manager_delete_chat_room(marie2, marie2Cr, coresList); @@ -3024,14 +3057,14 @@ static void imdn_for_group_chat_room (void) { LinphoneChatRoom *chloeCr = check_creation_chat_room_client_side(coresList, chloe, &initialChloeStats, confAddr, initialSubject, 2, FALSE); // Chloe begins composing a message - const char *chloeMessage = "Hello"; - _send_message(chloeCr, chloeMessage); + const char *chloeTextMessage = "Hello"; + LinphoneChatMessage *chloeMessage = _send_message(chloeCr, chloeTextMessage); BC_ASSERT_TRUE(wait_for_list(coresList, &marie->stat.number_of_LinphoneMessageReceived, initialMarieStats.number_of_LinphoneMessageReceived + 1, 10000)); BC_ASSERT_TRUE(wait_for_list(coresList, &pauline->stat.number_of_LinphoneMessageReceived, initialPaulineStats.number_of_LinphoneMessageReceived + 1, 10000)); LinphoneChatMessage *marieLastMsg = marie->stat.last_received_chat_message; if (!BC_ASSERT_PTR_NOT_NULL(marieLastMsg)) goto end; - BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(marieLastMsg), chloeMessage); + BC_ASSERT_STRING_EQUAL(linphone_chat_message_get_text(marieLastMsg), chloeTextMessage); LinphoneAddress *chloeAddr = linphone_address_new(linphone_core_get_identity(chloe->lc)); BC_ASSERT_TRUE(linphone_address_weak_equal(chloeAddr, linphone_chat_message_get_from_address(marieLastMsg))); linphone_address_unref(chloeAddr); @@ -3047,6 +3080,8 @@ static void imdn_for_group_chat_room (void) { linphone_chat_room_mark_as_read(paulineCr); BC_ASSERT_TRUE(wait_for_list(coresList, &chloe->stat.number_of_LinphoneMessageDisplayed, initialChloeStats.number_of_LinphoneMessageDisplayed + 1, 1000)); + linphone_chat_message_unref(chloeMessage); + end: // Clean db from chat room linphone_core_manager_delete_chat_room(marie, marieCr, coresList); @@ -3145,49 +3180,49 @@ static void find_one_to_one_chat_room (void) { } test_t group_chat_tests[] = { - TEST_TWO_TAGS("Group chat room creation server", group_chat_room_creation_server, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Add participant", group_chat_room_add_participant, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Send message", group_chat_room_send_message, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Send encrypted message", group_chat_room_send_message_encrypted, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Send invite on a multi register account", group_chat_room_invite_multi_register_account, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Add admin", group_chat_room_add_admin, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Add admin lately notified", group_chat_room_add_admin_lately_notified, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Add admin with a non admin", group_chat_room_add_admin_non_admin, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Remove admin", group_chat_room_remove_admin, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Admin creator leaves the room", group_chat_room_admin_creator_leaves_the_room, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Change subject", group_chat_room_change_subject, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Change subject with a non admin", group_chat_room_change_subject_non_admin, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Remove participant", group_chat_room_remove_participant, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Send message with a participant removed", group_chat_room_send_message_with_participant_removed, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Leave group chat room", group_chat_room_leave, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Come back on a group chat room after a disconnection", group_chat_room_come_back_after_disconnection, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Create chat room with disconnected friends", group_chat_room_create_room_with_disconnected_friends, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Create chat room with disconnected friends and initial message", group_chat_room_create_room_with_disconnected_friends_and_initial_message, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Reinvited after removed from group chat room", group_chat_room_reinvited_after_removed, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Reinvited after removed from group chat room while offline", group_chat_room_reinvited_after_removed_while_offline, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Reinvited after removed from group chat room while offline 2", group_chat_room_reinvited_after_removed_while_offline_2, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Reinvited after removed from group chat room with several devices", group_chat_room_reinvited_after_removed_with_several_devices, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Notify after disconnection", group_chat_room_notify_after_disconnection, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Send refer to all participants devices", group_chat_room_send_refer_to_all_devices, "Server", "LeaksMemory"), + TEST_NO_TAG("Group chat room creation server", group_chat_room_creation_server), + TEST_ONE_TAG("Add participant", group_chat_room_add_participant, "LeaksMemory"), + TEST_NO_TAG("Send message", group_chat_room_send_message), + TEST_NO_TAG("Send encrypted message", group_chat_room_send_message_encrypted), + TEST_NO_TAG("Send invite on a multi register account", group_chat_room_invite_multi_register_account), + TEST_NO_TAG("Add admin", group_chat_room_add_admin), + TEST_NO_TAG("Add admin lately notified", group_chat_room_add_admin_lately_notified), + TEST_NO_TAG("Add admin with a non admin", group_chat_room_add_admin_non_admin), + TEST_NO_TAG("Remove admin", group_chat_room_remove_admin), + TEST_NO_TAG("Admin creator leaves the room", group_chat_room_admin_creator_leaves_the_room), + TEST_NO_TAG("Change subject", group_chat_room_change_subject), + TEST_NO_TAG("Change subject with a non admin", group_chat_room_change_subject_non_admin), + TEST_NO_TAG("Remove participant", group_chat_room_remove_participant), + TEST_NO_TAG("Send message with a participant removed", group_chat_room_send_message_with_participant_removed), + TEST_NO_TAG("Leave group chat room", group_chat_room_leave), + TEST_NO_TAG("Come back on a group chat room after a disconnection", group_chat_room_come_back_after_disconnection), + TEST_NO_TAG("Create chat room with disconnected friends", group_chat_room_create_room_with_disconnected_friends), + TEST_ONE_TAG("Create chat room with disconnected friends and initial message", group_chat_room_create_room_with_disconnected_friends_and_initial_message, "LeaksMemory"), + TEST_NO_TAG("Reinvited after removed from group chat room", group_chat_room_reinvited_after_removed), + TEST_ONE_TAG("Reinvited after removed from group chat room while offline", group_chat_room_reinvited_after_removed_while_offline, "LeaksMemory"), + TEST_ONE_TAG("Reinvited after removed from group chat room while offline 2", group_chat_room_reinvited_after_removed_while_offline_2, "LeaksMemory"), + TEST_ONE_TAG("Reinvited after removed from group chat room with several devices", group_chat_room_reinvited_after_removed_with_several_devices, "LeaksMemory"), + TEST_NO_TAG("Notify after disconnection", group_chat_room_notify_after_disconnection), + TEST_NO_TAG("Send refer to all participants devices", group_chat_room_send_refer_to_all_devices), // TODO: Use when we support adding a new device in created conf - //TEST_TWO_TAGS("Admin add device and doesn't lose admin status", group_chat_room_add_device, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Send multiple is composing", multiple_is_composing_notification, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Fallback to basic chat room", group_chat_room_fallback_to_basic_chat_room, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Group chat room creation fails if invited participants don't support it", group_chat_room_creation_fails_if_invited_participants_dont_support_it, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Group chat room creation successful if at least one invited participant supports it", group_chat_room_creation_successful_if_at_least_one_invited_participant_supports_it, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Migrate basic chat room to client group chat room", group_chat_room_migrate_from_basic_chat_room, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Migrate basic chat room to client group chat room failure", group_chat_room_migrate_from_basic_to_client_fail, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Migrate basic chat room to client group chat room not needed", group_chat_donot_room_migrate_from_basic_chat_room, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Send file", group_chat_room_send_file, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Send file + text", group_chat_room_send_file_plus_text, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Unique one-to-one chatroom", group_chat_room_unique_one_to_one_chat_room, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Unique one-to-one chatroom recreated from message", group_chat_room_unique_one_to_one_chat_room_recreated_from_message, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Unique one-to-one chatroom recreated from message with app restart", group_chat_room_unique_one_to_one_chat_room_recreated_from_message_with_app_restart, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Join one-to-one chat room with a new device", group_chat_room_join_one_to_one_chat_room_with_a_new_device, "Server", "LeaksMemory"), - TEST_TWO_TAGS("New unique one-to-one chatroom after both participants left", group_chat_room_new_unique_one_to_one_chat_room_after_both_participants_left, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Unique one-to-one chatroom re-created from the party that deleted it, with inactive devices", group_chat_room_unique_one_to_one_chat_room_recreated_from_message_2, "Server", "LeaksMemory"), - TEST_TWO_TAGS("IMDN for group chat room", imdn_for_group_chat_room, "Server", "LeaksMemory"), - TEST_TWO_TAGS("Find one to one chat room", find_one_to_one_chat_room, "Server", "LeaksMemory") + //TEST_ONE_TAGS("Admin add device and doesn't lose admin status", group_chat_room_add_device, "LeaksMemory"), + TEST_NO_TAG("Send multiple is composing", multiple_is_composing_notification), + TEST_ONE_TAG("Fallback to basic chat room", group_chat_room_fallback_to_basic_chat_room, "LeaksMemory"), + TEST_NO_TAG("Group chat room creation fails if invited participants don't support it", group_chat_room_creation_fails_if_invited_participants_dont_support_it), + TEST_NO_TAG("Group chat room creation successful if at least one invited participant supports it", group_chat_room_creation_successful_if_at_least_one_invited_participant_supports_it), + TEST_ONE_TAG("Migrate basic chat room to client group chat room", group_chat_room_migrate_from_basic_chat_room, "LeaksMemory"), + TEST_ONE_TAG("Migrate basic chat room to client group chat room failure", group_chat_room_migrate_from_basic_to_client_fail, "LeaksMemory"), + TEST_NO_TAG("Migrate basic chat room to client group chat room not needed", group_chat_donot_room_migrate_from_basic_chat_room), + TEST_NO_TAG("Send file", group_chat_room_send_file), + TEST_NO_TAG("Send file + text", group_chat_room_send_file_plus_text), + 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 recreated from message", group_chat_room_unique_one_to_one_chat_room_recreated_from_message), + TEST_ONE_TAG("Unique one-to-one chatroom recreated from message with app restart", group_chat_room_unique_one_to_one_chat_room_recreated_from_message_with_app_restart, "LeaksMemory"), + TEST_NO_TAG("Join one-to-one chat room with a new device", group_chat_room_join_one_to_one_chat_room_with_a_new_device), + TEST_NO_TAG("New unique one-to-one chatroom after both participants left", group_chat_room_new_unique_one_to_one_chat_room_after_both_participants_left), + TEST_NO_TAG("Unique one-to-one chatroom re-created from the party that deleted it, with inactive devices", group_chat_room_unique_one_to_one_chat_room_recreated_from_message_2), + TEST_NO_TAG("IMDN for group chat room", imdn_for_group_chat_room), + TEST_NO_TAG("Find one to one chat room", find_one_to_one_chat_room) }; test_suite_t group_chat_test_suite = { From b35df101ee162831573fd9b11515e34ed71638db Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 9 Mar 2018 17:42:22 +0100 Subject: [PATCH 231/281] Started multi routes but currently crashes... --- coreapi/linphonecore.c | 15 +++++++++----- coreapi/private_structs.h | 2 +- coreapi/proxy.c | 36 +++++++++++++++++++++------------ include/linphone/proxy_config.h | 8 ++++++++ 4 files changed, 42 insertions(+), 19 deletions(-) diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 2027b4101..56024b2c5 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -3421,11 +3421,16 @@ LinphoneCall * linphone_core_start_refered_call(LinphoneCore *lc, LinphoneCall * system. */ static bctbx_list_t *make_routes_for_proxy(LinphoneProxyConfig *proxy, const LinphoneAddress *dest){ - bctbx_list_t *ret=NULL; - const char *local_route=linphone_proxy_config_get_route(proxy); - const LinphoneAddress *srv_route=linphone_proxy_config_get_service_route(proxy); - if (local_route){ - ret=bctbx_list_append(ret,sal_address_new(local_route)); + bctbx_list_t *ret = NULL; + const bctbx_list_t *proxy_routes = linphone_proxy_config_get_routes(proxy); + bctbx_list_t *proxy_routes_iterator = (bctbx_list_t *)proxy_routes; + const LinphoneAddress *srv_route = linphone_proxy_config_get_service_route(proxy); + while (proxy_routes_iterator) { + const char *local_route = (const char *)bctbx_list_get_data(proxy_routes_iterator); + if (local_route) { + ret = bctbx_list_append(ret, sal_address_new(local_route)); + } + proxy_routes_iterator = bctbx_list_next(proxy_routes_iterator); } if (srv_route){ ret=bctbx_list_append(ret,sal_address_clone(L_GET_PRIVATE_FROM_C_OBJECT(srv_route)->getInternalAddress())); diff --git a/coreapi/private_structs.h b/coreapi/private_structs.h index 13e0bcce5..3bcfc4d78 100644 --- a/coreapi/private_structs.h +++ b/coreapi/private_structs.h @@ -90,7 +90,7 @@ struct _LinphoneProxyConfig LinphoneAddress* identity_address; LinphoneAddress *contact_address; LinphoneAddress *contact_address_without_params; - char *reg_route; + bctbx_list_t *reg_routes; char *quality_reporting_collector; char *realm; char *contact_params; diff --git a/coreapi/proxy.c b/coreapi/proxy.c index 127d9bb93..dad8307e5 100644 --- a/coreapi/proxy.c +++ b/coreapi/proxy.c @@ -113,7 +113,7 @@ static void linphone_proxy_config_init(LinphoneCore* lc, LinphoneProxyConfig *cf const char *dial_prefix = lc ? lp_config_get_default_string(lc->config,"proxy","dial_prefix",NULL) : NULL; const char *identity = lc ? lp_config_get_default_string(lc->config, "proxy", "reg_identity", NULL) : NULL; const char *proxy = lc ? lp_config_get_default_string(lc->config, "proxy", "reg_proxy", NULL) : NULL; - const char *route = lc ? lp_config_get_default_string(lc->config, "proxy", "reg_route", NULL) : NULL; + const char *route = lc ? lp_config_get_default_string(lc->config, "proxy", "reg_route", NULL) : NULL; //TODO return list instead of string const char *realm = lc ? lp_config_get_default_string(lc->config, "proxy", "realm", NULL) : NULL; const char *quality_reporting_collector = lc ? lp_config_get_default_string(lc->config, "proxy", "quality_reporting_collector", NULL) : NULL; const char *contact_params = lc ? lp_config_get_default_string(lc->config, "proxy", "contact_parameters", NULL) : NULL; @@ -130,7 +130,7 @@ static void linphone_proxy_config_init(LinphoneCore* lc, LinphoneProxyConfig *cf cfg->identity_address = identity ? linphone_address_new(identity) : NULL; cfg->reg_identity = cfg->identity_address ? linphone_address_as_string(cfg->identity_address) : NULL; cfg->reg_proxy = proxy ? ms_strdup(proxy) : NULL; - cfg->reg_route = route ? ms_strdup(route) : NULL; + cfg->reg_routes = route ? bctbx_list_append(cfg->reg_routes, ms_strdup(route)) : NULL; //TODO get list directly cfg->realm = realm ? ms_strdup(realm) : NULL; cfg->quality_reporting_enabled = lc ? !!lp_config_get_default_int(lc->config, "proxy", "quality_reporting_enabled", 0) : 0; cfg->quality_reporting_collector = quality_reporting_collector ? ms_strdup(quality_reporting_collector) : NULL; @@ -183,13 +183,18 @@ bool_t linphone_proxy_config_compute_publish_params_hash(LinphoneProxyConfig * c char hash[33]; char saved; unsigned long long previous_hash[2]; + bctbx_list_t *routes_iterator = cfg->reg_routes; previous_hash[0] = cfg->previous_publish_config_hash[0]; previous_hash[1] = cfg->previous_publish_config_hash[1]; source = ms_strcat_printf(source, "%i",cfg->privacy); source=append_linphone_address(cfg->identity_address, source); source=append_string(cfg->reg_proxy,source); - source=append_string(cfg->reg_route,source); + while (routes_iterator) { + const char *route = (const char *)bctbx_list_get_data(routes_iterator); + source=append_string(route,source); + routes_iterator = bctbx_list_next(routes_iterator); + } source=append_string(cfg->realm,source); source = ms_strcat_printf(source, "%i",cfg->publish_expires); source = ms_strcat_printf(source, "%i",cfg->publish); @@ -235,7 +240,7 @@ void _linphone_proxy_config_destroy(LinphoneProxyConfig *cfg){ if (cfg->reg_proxy!=NULL) ms_free(cfg->reg_proxy); if (cfg->reg_identity!=NULL) ms_free(cfg->reg_identity); if (cfg->identity_address!=NULL) linphone_address_unref(cfg->identity_address); - if (cfg->reg_route!=NULL) ms_free(cfg->reg_route); + if (cfg->reg_routes!=NULL) bctbx_list_free_with_data(cfg->reg_routes, ms_free); if (cfg->quality_reporting_collector!=NULL) ms_free(cfg->quality_reporting_collector); if (cfg->ssctx!=NULL) sip_setup_context_free(cfg->ssctx); if (cfg->realm!=NULL) ms_free(cfg->realm); @@ -348,9 +353,9 @@ const char *linphone_proxy_config_get_domain(const LinphoneProxyConfig *cfg){ LinphoneStatus linphone_proxy_config_set_route(LinphoneProxyConfig *cfg, const char *route) { - if (cfg->reg_route!=NULL){ - ms_free(cfg->reg_route); - cfg->reg_route=NULL; + if (cfg->reg_routes!=NULL){ + bctbx_list_free_with_data(cfg->reg_routes, ms_free); + cfg->reg_routes=NULL; } if (route!=NULL && route[0] !='\0'){ SalAddress *addr; @@ -362,7 +367,7 @@ LinphoneStatus linphone_proxy_config_set_route(LinphoneProxyConfig *cfg, const c addr=sal_address_new(tmp); if (addr!=NULL){ sal_address_destroy(addr); - cfg->reg_route=tmp; + cfg->reg_routes = bctbx_list_append(cfg->reg_routes, tmp); return 0; }else{ ms_free(tmp); @@ -934,8 +939,13 @@ void _linphone_proxy_config_unpublish(LinphoneProxyConfig *obj) { } } -const char *linphone_proxy_config_get_route(const LinphoneProxyConfig *cfg){ - return cfg->reg_route; +const char *linphone_proxy_config_get_route(const LinphoneProxyConfig *cfg) { + if (cfg->reg_routes) return (const char *)bctbx_list_get_data(cfg->reg_routes); + return NULL; +} + +const bctbx_list_t* linphone_proxy_config_get_routes(const LinphoneProxyConfig *cfg) { + return cfg->reg_routes; } const LinphoneAddress *linphone_proxy_config_get_identity_address(const LinphoneProxyConfig *cfg){ @@ -1116,8 +1126,8 @@ void linphone_proxy_config_write_to_config_file(LpConfig *config, LinphoneProxyC if (cfg->reg_proxy!=NULL){ lp_config_set_string(config,key,"reg_proxy",cfg->reg_proxy); } - if (cfg->reg_route!=NULL){ - lp_config_set_string(config,key,"reg_route",cfg->reg_route); + if (cfg->reg_routes != NULL) { + lp_config_set_string_list(config, key, "reg_route", cfg->reg_routes); } if (cfg->reg_identity!=NULL){ lp_config_set_string(config,key,"reg_identity",cfg->reg_identity); @@ -1187,7 +1197,7 @@ LinphoneProxyConfig *linphone_proxy_config_new_from_config_file(LinphoneCore* lc CONFIGURE_STRING_VALUE(cfg,config,key,identity,"reg_identity") CONFIGURE_STRING_VALUE(cfg,config,key,server_addr,"reg_proxy") - CONFIGURE_STRING_VALUE(cfg,config,key,route,"reg_route") + cfg->reg_routes = linphone_config_get_string_list(config, key, "reg_route", NULL); CONFIGURE_STRING_VALUE(cfg,config,key,realm,"realm") diff --git a/include/linphone/proxy_config.h b/include/linphone/proxy_config.h index ec9368a34..13ef5d294 100644 --- a/include/linphone/proxy_config.h +++ b/include/linphone/proxy_config.h @@ -257,9 +257,17 @@ LINPHONE_PUBLIC void linphone_proxy_config_set_realm(LinphoneProxyConfig *cfg, c /** * @return the route set for this proxy configuration. + * @deprecated Use linphone_proxy_config_get_routes() instead. **/ LINPHONE_PUBLIC const char *linphone_proxy_config_get_route(const LinphoneProxyConfig *cfg); +/** + * Gets the list of the routes set for this proxy config. + * @param[in] cfg #LinphoneProxyConfig object. + * @return \bctbx_list{const char *} the list of routes. + */ +LINPHONE_PUBLIC const bctbx_list_t* linphone_proxy_config_get_routes(const LinphoneProxyConfig *cfg); + /** * @return the SIP identity that belongs to this proxy configuration. **/ From 18696f2ad257cb96cf8271be11e9580864bb7633 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 9 Mar 2018 22:14:05 +0100 Subject: [PATCH 232/281] Fix background task usage when receiving a REFER to join a chatroom. Add a timeout, because on Android wake locks have no limit in time. The timeout will secure that whatever happens, the wake lock is always released after a reasonable time. --- src/call/call.cpp | 3 +- src/chat/chat-room/client-group-chat-room-p.h | 1 - src/chat/chat-room/client-group-chat-room.cpp | 21 ++++++------- .../file-transfer-chat-message-modifier.cpp | 5 ++- src/utils/background-task.cpp | 31 ++++++++++++++++--- src/utils/background-task.h | 23 ++++++++++---- 6 files changed, 59 insertions(+), 25 deletions(-) diff --git a/src/call/call.cpp b/src/call/call.cpp index 797eee31a..f7b915a54 100644 --- a/src/call/call.cpp +++ b/src/call/call.cpp @@ -198,7 +198,8 @@ void CallPrivate::onAckReceived (const shared_ptr &session, Linphon } void CallPrivate::onBackgroundTaskToBeStarted (const shared_ptr &session) { - bgTask.start(); + L_Q(); + bgTask.start(q->getCore(),30); } void CallPrivate::onBackgroundTaskToBeStopped (const shared_ptr &session) { diff --git a/src/chat/chat-room/client-group-chat-room-p.h b/src/chat/chat-room/client-group-chat-room-p.h index cb62f6800..e617b517d 100644 --- a/src/chat/chat-room/client-group-chat-room-p.h +++ b/src/chat/chat-room/client-group-chat-room-p.h @@ -53,7 +53,6 @@ private: ClientGroupChatRoom::CapabilitiesMask capabilities = ClientGroupChatRoom::Capabilities::Conference; bool deletionOnTerminationEnabled = false; BackgroundTask bgTask; - L_DECLARE_PUBLIC(ClientGroupChatRoom); }; diff --git a/src/chat/chat-room/client-group-chat-room.cpp b/src/chat/chat-room/client-group-chat-room.cpp index e40482457..370d2b4a9 100644 --- a/src/chat/chat-room/client-group-chat-room.cpp +++ b/src/chat/chat-room/client-group-chat-room.cpp @@ -139,8 +139,10 @@ void ClientGroupChatRoomPrivate::onCallSessionStateChanged ( if (q->getState() == ChatRoom::State::CreationPending) { IdentityAddress addr(session->getRemoteContactAddress()->asStringUriOnly()); q->onConferenceCreated(addr); - if (session->getRemoteContactAddress()->hasParam("isfocus")) + if (session->getRemoteContactAddress()->hasParam("isfocus")){ + bgTask.start(q->getCore(), 32); /*it will be stopped when receiving the first notify*/ qConference->getPrivate()->eventHandler->subscribe(q->getChatRoomId()); + } } else if (q->getState() == ChatRoom::State::TerminationPending) qConference->getPrivate()->focus->getPrivate()->getSession()->terminate(); } else if (newState == CallSession::State::Released) { @@ -179,15 +181,14 @@ ClientGroupChatRoom::ClientGroupChatRoom ( const string &subject ) : ChatRoom(*new ClientGroupChatRoomPrivate, core, ChatRoomId(IdentityAddress(), me)), RemoteConference(core, me, nullptr) { - L_D(); L_D_T(RemoteConference, dConference); - - d->bgTask.setName("Client group chat room refer received"); - + L_D(); + IdentityAddress focusAddr(uri); dConference->focus = make_shared(focusAddr); dConference->focus->getPrivate()->addDevice(focusAddr); RemoteConference::setSubject(subject); + d->bgTask.setName("Subscribe/notify of full state conference"); } ClientGroupChatRoom::ClientGroupChatRoom ( @@ -410,7 +411,6 @@ void ClientGroupChatRoom::join () { shared_ptr session = dConference->focus->getPrivate()->getSession(); if (!session && ((getState() == ChatRoom::State::Instantiated) || (getState() == ChatRoom::State::Terminated))) { - d->bgTask.start(); session = d->createSession(); } if (session) { @@ -424,7 +424,6 @@ void ClientGroupChatRoom::leave () { L_D(); L_D_T(RemoteConference, dConference); - d->bgTask.start(); dConference->eventHandler->unsubscribe(); shared_ptr session = dConference->focus->getPrivate()->getSession(); @@ -475,18 +474,19 @@ void ClientGroupChatRoom::onConferenceTerminated (const IdentityAddress &addr) { void ClientGroupChatRoom::onFirstNotifyReceived (const IdentityAddress &addr) { L_D(); d->setState(ChatRoom::State::Created); - + if (getParticipantCount() == 1) { ChatRoomId id(getParticipants().front()->getAddress(), getMe()->getAddress()); shared_ptr chatRoom = getCore()->findChatRoom(id); if (chatRoom && (chatRoom->getCapabilities() & ChatRoom::Capabilities::Basic)) { BasicToClientGroupChatRoom::migrate(getSharedFromThis(), chatRoom); - return; + goto end; } } d->chatRoomListener->onChatRoomInsertInDatabaseRequested(getSharedFromThis()); - +end: + d->bgTask.stop(); // TODO: Bug. Event is inserted many times. // Avoid this in the future. Deal with signals/slots system. #if 0 @@ -496,7 +496,6 @@ void ClientGroupChatRoom::onFirstNotifyReceived (const IdentityAddress &addr) { d->chatRoomId )); #endif - d->bgTask.stop(); } void ClientGroupChatRoom::onParticipantAdded (const shared_ptr &event, bool isFullState) { diff --git a/src/chat/modifier/file-transfer-chat-message-modifier.cpp b/src/chat/modifier/file-transfer-chat-message-modifier.cpp index 44b1a3090..7f9d6dd39 100644 --- a/src/chat/modifier/file-transfer-chat-message-modifier.cpp +++ b/src/chat/modifier/file-transfer-chat-message-modifier.cpp @@ -485,7 +485,10 @@ error: } void FileTransferChatMessageModifier::fileUploadBeginBackgroundTask () { - bgTask.start(); + shared_ptr message = chatMessage.lock(); + if (!message) + return; + bgTask.start(message->getCore()); } void FileTransferChatMessageModifier::fileUploadEndBackgroundTask () { diff --git a/src/utils/background-task.cpp b/src/utils/background-task.cpp index a83d1b14b..bca543c35 100644 --- a/src/utils/background-task.cpp +++ b/src/utils/background-task.cpp @@ -20,25 +20,41 @@ #include "background-task.h" #include "c-wrapper/internal/c-sal.h" #include "logger/logger.h" +#include "core/core-p.h" +#include "private.h" //to get access to the Sal // ============================================================================= LINPHONE_BEGIN_NAMESPACE -static void notifier (void *context) { +void BackgroundTask::sHandleTimeout(void *context) { static_cast(context)->handleTimeout(); } -void BackgroundTask::start () { +int BackgroundTask::sHandleSalTimeout(void *data, unsigned int events){ + static_cast(data)->handleSalTimeout(); + return BELLE_SIP_STOP; +} + +void BackgroundTask::handleSalTimeout(){ + lWarning() << "Background task [" << mId << "] with name : [" << mName << "] is now expiring."; + stop(); +} + +void BackgroundTask::start (const std::shared_ptr &core, int max_duration_seconds) { if (mName.empty()) { lError() << "No name was set on background task."; return; } - unsigned long newId = sal_begin_background_task(mName.c_str(), notifier, this); - lInfo() << "Starting background task [" << newId << "] with name : [" << mName << "]."; + unsigned long newId = sal_begin_background_task(mName.c_str(), sHandleTimeout, this); + lInfo() << "Starting background task [" << newId << "] with name : [" << mName << "] and expiration of ["< 0){ + mSal = core->getCCore()->sal; + mTimeout = mSal->create_timer(sHandleSalTimeout, this, (unsigned int) max_duration_seconds * 1000, mName.c_str()); + } } void BackgroundTask::stop () { @@ -47,11 +63,16 @@ void BackgroundTask::stop () { lInfo() << "Ending background task [" << mId << "] with name : [" << mName << "]."; sal_end_background_task(mId); + if (mTimeout){ + mSal->cancel_timer(mTimeout); + belle_sip_object_unref(mTimeout); + mTimeout = NULL; + } mId = 0; } void BackgroundTask::handleTimeout () { - lWarning() << "Background task [" << mId << "] with name : [" << mName << "] has expired before completion..."; + lWarning() << "Background task [" << mId << "] with name : [" << mName << "] is expiring from OS before completion..."; stop(); } diff --git a/src/utils/background-task.h b/src/utils/background-task.h index 45b2002fb..5aa7edb89 100644 --- a/src/utils/background-task.h +++ b/src/utils/background-task.h @@ -23,15 +23,19 @@ #include #include "linphone/utils/general.h" +#include "sal/sal.h" // ============================================================================= LINPHONE_BEGIN_NAMESPACE +class Sal; +class Core; + class BackgroundTask { public: - BackgroundTask () = default; - BackgroundTask (const std::string &name) : mName(name) {} + BackgroundTask() : mTimeout(NULL), mSal(NULL), mId(0){} + BackgroundTask (const std::string &name) : mTimeout(NULL), mSal(NULL), mName(name), mId(0) {} virtual ~BackgroundTask () { stop(); } @@ -39,19 +43,26 @@ public: void setName (const std::string &name) { mName = name; } - - void start (); - void stop (); + /** + * Start a long running task for at most max_duration_seconds, after which it is automatically terminated + */ + void start(const std::shared_ptr &core, int max_duration_seconds = 15*60); /*15 mn by default, like on iOS*/ + void stop(); const std::string &getName () const { return mName; } - +protected: virtual void handleTimeout (); private: + static int sHandleSalTimeout(void *data, unsigned int events); + static void sHandleTimeout(void *data); + belle_sip_source_t *mTimeout; + Sal *mSal; std::string mName; unsigned long mId = 0; + void handleSalTimeout(); }; LINPHONE_END_NAMESPACE From 307e27e63583789b624c1a260c6a8d4a7ab11960 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Mon, 12 Mar 2018 15:26:00 +0100 Subject: [PATCH 233/281] Allow receiving and parsing of CPIM messages without buggy Content-Type header. --- src/chat/cpim/message/cpim-message.cpp | 5 ++- src/chat/cpim/message/cpim-message.h | 4 +- src/chat/cpim/parser/cpim-parser.cpp | 44 ++++++++++++------- .../modifier/cpim-chat-message-modifier.cpp | 7 ++- 4 files changed, 39 insertions(+), 21 deletions(-) diff --git a/src/chat/cpim/message/cpim-message.cpp b/src/chat/cpim/message/cpim-message.cpp index b1a993559..84753f4ef 100644 --- a/src/chat/cpim/message/cpim-message.cpp +++ b/src/chat/cpim/message/cpim-message.cpp @@ -38,7 +38,7 @@ class Cpim::MessagePrivate : public ObjectPrivate { public: typedef list > PrivHeaderList; - shared_ptr cpimHeaders = make_shared(); + shared_ptr cpimHeaders = make_shared(); // TODO: Remove this useless variable shared_ptr messageHeaders = make_shared(); shared_ptr contentHeaders = make_shared(); string content; @@ -148,10 +148,11 @@ string Cpim::Message::asString () const { L_D(); string output; + // TODO: Remove cpimHeaders for (const auto &cpimHeader : *d->cpimHeaders) output += cpimHeader->asString(); - output += "\r\n"; + // TODO Remove cpimHeaders if (d->messageHeaders->size() > 0) { for (const auto &messageHeader : *d->messageHeaders) diff --git a/src/chat/cpim/message/cpim-message.h b/src/chat/cpim/message/cpim-message.h index 53e33e45e..c7778c929 100644 --- a/src/chat/cpim/message/cpim-message.h +++ b/src/chat/cpim/message/cpim-message.h @@ -36,9 +36,11 @@ namespace Cpim { typedef std::shared_ptr > > HeaderList; + // TODO: Remove these useless methods HeaderList getCpimHeaders () const; bool addCpimHeader (const Header &cpimHeader); void removeCpimHeader (const Header &cpimHeader); + // TODO: Remove these useless methods HeaderList getMessageHeaders () const; bool addMessageHeader (const Header &messageHeader); @@ -51,7 +53,7 @@ namespace Cpim { std::string getContent () const; bool setContent (const std::string &content); - bool isValid () const; + bool isValid () const; // TODO: Remove this useless method std::string asString () const; diff --git a/src/chat/cpim/parser/cpim-parser.cpp b/src/chat/cpim/parser/cpim-parser.cpp index 7acdac5bd..d3beb28d2 100644 --- a/src/chat/cpim/parser/cpim-parser.cpp +++ b/src/chat/cpim/parser/cpim-parser.cpp @@ -171,37 +171,47 @@ namespace Cpim { // Warning: Call this function one time! shared_ptr createMessage () const { size_t size = mHeaders->size(); - if (size < 2 || size > 3) { + if (size < 2 || size > 3) { // TODO: Check that size is == 2 lWarning() << "Bad headers lists size."; return nullptr; } const shared_ptr message = make_shared(); - const shared_ptr cpimHeaders = mHeaders->front(); - if (find_if(cpimHeaders->cbegin(), cpimHeaders->cend(), - [](const shared_ptr &headerNode) { - return Utils::iequals(headerNode->getName(), "content-type") && (ContentType(headerNode->getValue()) == ContentType::Cpim); - }) == cpimHeaders->cend()) { - lWarning() << "No MIME `Content-Type` found!"; - return nullptr; - } - - // Add MIME headers. - for (const auto &headerNode : *cpimHeaders) { - const shared_ptr header = headerNode->createHeader(); - if (!header || !message->addCpimHeader(*header)) + // TODO: To remove + if (size == 3) { + const shared_ptr cpimHeaders = mHeaders->front(); + if (find_if(cpimHeaders->cbegin(), cpimHeaders->cend(), + [](const shared_ptr &headerNode) { + return Utils::iequals(headerNode->getName(), "content-type") && (ContentType(headerNode->getValue()) == ContentType::Cpim); + }) == cpimHeaders->cend()) { + lWarning() << "No MIME `Content-Type` found!"; return nullptr; - } + } - // Add message headers. - if (mHeaders->size() > 2) { + // Add MIME headers. + for (const auto &headerNode : *cpimHeaders) { + const shared_ptr header = headerNode->createHeader(); + if (!header || !message->addCpimHeader(*header)) + return nullptr; + } + + // Add message headers. for (const auto &headerNode : **(++mHeaders->cbegin())) { const shared_ptr header = headerNode->createHeader(); if (!header || !message->addMessageHeader(*header)) return nullptr; } } + // TODO: To remove + else { + // Add message headers. + for (const auto &headerNode : *mHeaders->front()) { + const shared_ptr header = headerNode->createHeader(); + if (!header || !message->addMessageHeader(*header)) + return nullptr; + } + } // Add content headers. for (const auto &headerNode : *mHeaders->back()) { diff --git a/src/chat/modifier/cpim-chat-message-modifier.cpp b/src/chat/modifier/cpim-chat-message-modifier.cpp index ebb07e9a0..8958c0f82 100644 --- a/src/chat/modifier/cpim-chat-message-modifier.cpp +++ b/src/chat/modifier/cpim-chat-message-modifier.cpp @@ -34,10 +34,13 @@ LINPHONE_BEGIN_NAMESPACE ChatMessageModifier::Result CpimChatMessageModifier::encode (const shared_ptr &message, int &errorCode) { Cpim::Message cpimMessage; + + // TODO: Remove this buggy Content-Type header Cpim::GenericHeader cpimContentTypeHeader; cpimContentTypeHeader.setName("Content-Type"); cpimContentTypeHeader.setValue(ContentType::Cpim.asString()); cpimMessage.addCpimHeader(cpimContentTypeHeader); + // TODO: Remove this buggy Content-Type header Cpim::FromHeader cpimFromHeader; cpimFromHeader.setValue(cpimAddressAsString(message->getFromAddress())); @@ -71,11 +74,13 @@ ChatMessageModifier::Result CpimChatMessageModifier::encode (const shared_ptrgetBodyAsString(); cpimMessage.setContent(contentBody); + // TODO: Remove this check because of buggy Content-Type header if (!cpimMessage.isValid()) { lError() << "[CPIM] Message is invalid: " << contentBody; errorCode = 500; return ChatMessageModifier::Result::Error; } + // TODO: Remove this check because of buggy Content-Type header Content newContent; newContent.setContentType(ContentType::Cpim); @@ -99,7 +104,7 @@ ChatMessageModifier::Result CpimChatMessageModifier::decode (const shared_ptrgetBodyAsString(); const shared_ptr cpimMessage = Cpim::Message::createFromString(contentBody); - if (!cpimMessage || !cpimMessage->isValid()) { + if (!cpimMessage) { lError() << "[CPIM] Message is invalid: " << contentBody; errorCode = 500; return ChatMessageModifier::Result::Error; From ead7221c9762a8bfdd3e0dfa9b7b0655284465d9 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 13 Mar 2018 14:10:05 +0100 Subject: [PATCH 234/281] Handle Content-Encoding in C++ Content object. --- src/chat/chat-room/client-group-chat-room.cpp | 4 ++++ .../handlers/local-conference-event-handler.cpp | 4 ++++ src/content/content-p.h | 1 + src/content/content.cpp | 17 ++++++++++++++++- src/content/content.h | 3 +++ src/sal/call-op.cpp | 6 +++++- 6 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/chat/chat-room/client-group-chat-room.cpp b/src/chat/chat-room/client-group-chat-room.cpp index 370d2b4a9..c796f5fee 100644 --- a/src/chat/chat-room/client-group-chat-room.cpp +++ b/src/chat/chat-room/client-group-chat-room.cpp @@ -310,6 +310,10 @@ void ClientGroupChatRoom::addParticipants ( content.setBody(getResourceLists(addressesList)); content.setContentType("application/resource-lists+xml"); content.setContentDisposition("recipient-list"); + // TODO: Activate compression + //if (linphone_core_content_encoding_supported(getCore()->getCCore(), "deflate")) + // content.setContentEncoding("deflate"); + // TODO: Activate compression shared_ptr session = dConference->focus->getPrivate()->getSession(); if (session) diff --git a/src/conference/handlers/local-conference-event-handler.cpp b/src/conference/handlers/local-conference-event-handler.cpp index 9e246f9b0..f9f5e2f8a 100644 --- a/src/conference/handlers/local-conference-event-handler.cpp +++ b/src/conference/handlers/local-conference-event-handler.cpp @@ -372,6 +372,10 @@ void LocalConferenceEventHandlerPrivate::notifyParticipantDevice (const string & content, multipart ? "mixed;boundary=---------------------------14737809831466499882746641449" : "conference-info" ); + // TODO: Activate compression + //if (linphone_core_content_encoding_supported(conf->getCore()->getCCore(), "deflate")) + // linphone_content_set_encoding(content, "deflate"); + // TODO: Activate compression linphone_event_notify(ev, content); linphone_content_unref(content); } diff --git a/src/content/content-p.h b/src/content/content-p.h index bb4daced3..d0b8738c6 100644 --- a/src/content/content-p.h +++ b/src/content/content-p.h @@ -33,6 +33,7 @@ private: std::vector body; ContentType contentType; std::string contentDisposition; + std::string contentEncoding; std::list> headers; L_DECLARE_PUBLIC(Content); diff --git a/src/content/content.cpp b/src/content/content.cpp index c6c218ea3..c538141cf 100644 --- a/src/content/content.cpp +++ b/src/content/content.cpp @@ -40,7 +40,8 @@ Content::Content (const Content &other) : ClonableObject(*new ContentPrivate), A L_D(); d->body = other.getBody(); d->contentType = other.getContentType(); - d->contentDisposition = other.getContentDisposition();; + d->contentDisposition = other.getContentDisposition(); + d->contentEncoding = other.getContentEncoding(); d->headers = other.getHeaders(); } @@ -50,6 +51,7 @@ Content::Content (Content &&other) : ClonableObject(*new ContentPrivate), AppDat d->body = move(dOther->body); d->contentType = move(dOther->contentType); d->contentDisposition = move(dOther->contentDisposition); + d->contentEncoding = move(dOther->contentEncoding); d->headers = move(dOther->headers); } @@ -71,6 +73,7 @@ Content &Content::operator= (const Content &other) { d->body = other.getBody(); d->contentType = other.getContentType(); d->contentDisposition = other.getContentDisposition(); + d->contentEncoding = other.getContentEncoding(); d->headers = other.getHeaders(); } return *this; @@ -83,6 +86,7 @@ Content &Content::operator= (Content &&other) { d->body = move(dOther->body); d->contentType = move(dOther->contentType); d->contentDisposition = move(dOther->contentDisposition); + d->contentEncoding = move(dOther->contentEncoding); d->headers = move(dOther->headers); return *this; } @@ -92,6 +96,7 @@ bool Content::operator== (const Content &other) const { return d->contentType == other.getContentType() && d->body == other.getBody() && d->contentDisposition == other.getContentDisposition() && + d->contentEncoding == other.getContentEncoding() && d->headers == other.getHeaders(); } @@ -120,6 +125,16 @@ void Content::setContentDisposition (const string &contentDisposition) { d->contentDisposition = contentDisposition; } +const string &Content::getContentEncoding () const { + L_D(); + return d->contentEncoding; +} + +void Content::setContentEncoding (const string &contentEncoding) { + L_D(); + d->contentEncoding = contentEncoding; +} + const vector &Content::getBody () const { L_D(); return d->body; diff --git a/src/content/content.h b/src/content/content.h index a74bdd147..d3be11f51 100644 --- a/src/content/content.h +++ b/src/content/content.h @@ -54,6 +54,9 @@ public: const std::string &getContentDisposition () const; void setContentDisposition (const std::string &contentDisposition); + const std::string &getContentEncoding () const; + void setContentEncoding (const std::string &contentEncoding); + const std::vector &getBody () const; std::string getBodyAsString () const; std::string getBodyAsUtf8String () const; diff --git a/src/sal/call-op.cpp b/src/sal/call-op.cpp index d2f494064..5a8583479 100644 --- a/src/sal/call-op.cpp +++ b/src/sal/call-op.cpp @@ -103,6 +103,7 @@ belle_sip_header_allow_t *SalCallOp::create_allow(bool_t enable_update) { int SalCallOp::set_custom_body(belle_sip_message_t *msg, const Content &body) { ContentType contentType = body.getContentType(); string contentDisposition = body.getContentDisposition(); + string contentEncoding = body.getContentEncoding(); size_t bodySize = body.getBody().size(); if (bodySize > SIP_MESSAGE_BODY_LIMIT) { @@ -118,12 +119,15 @@ int SalCallOp::set_custom_body(belle_sip_message_t *msg, const Content &body) { belle_sip_header_content_disposition_t *contentDispositionHeader = belle_sip_header_content_disposition_create(contentDisposition.c_str()); belle_sip_message_add_header(msg, BELLE_SIP_HEADER(contentDispositionHeader)); } + if (!contentEncoding.empty()) + belle_sip_message_add_header(msg, belle_sip_header_create("Content-Encoding", contentEncoding.c_str())); 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); + char *buffer = bctbx_new(char, bodySize + 1); memcpy(buffer, body.getBody().data(), bodySize); + buffer[bodySize] = '\0'; belle_sip_message_assign_body(msg, buffer, bodySize); } From 9b0c21cc233f85b79364acdd9762536f50b2be92 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 13 Mar 2018 15:03:20 +0100 Subject: [PATCH 235/281] Fixed multi routes crash --- coreapi/proxy.c | 37 ++++++++++++++++++++++++++++++--- include/linphone/proxy_config.h | 10 +++++++++ 2 files changed, 44 insertions(+), 3 deletions(-) diff --git a/coreapi/proxy.c b/coreapi/proxy.c index dad8307e5..067b95790 100644 --- a/coreapi/proxy.c +++ b/coreapi/proxy.c @@ -353,9 +353,9 @@ const char *linphone_proxy_config_get_domain(const LinphoneProxyConfig *cfg){ LinphoneStatus linphone_proxy_config_set_route(LinphoneProxyConfig *cfg, const char *route) { - if (cfg->reg_routes!=NULL){ + if (cfg->reg_routes != NULL) { bctbx_list_free_with_data(cfg->reg_routes, ms_free); - cfg->reg_routes=NULL; + cfg->reg_routes = NULL; } if (route!=NULL && route[0] !='\0'){ SalAddress *addr; @@ -378,6 +378,37 @@ LinphoneStatus linphone_proxy_config_set_route(LinphoneProxyConfig *cfg, const c } } +LinphoneStatus linphone_proxy_config_set_routes(LinphoneProxyConfig *cfg, const bctbx_list_t *routes) { + if (cfg->reg_routes != NULL) { + bctbx_list_free_with_data(cfg->reg_routes, ms_free); + cfg->reg_routes = NULL; + } + bctbx_list_t *iterator = (bctbx_list_t *)routes; + while (iterator != NULL) { + char *route = (char *)bctbx_list_get_data(iterator); + if (route != NULL && route[0] !='\0') { + SalAddress *addr; + char *tmp; + /*try to prepend 'sip:' */ + if (strstr(route,"sip:") == NULL && strstr(route,"sips:") == NULL) { + tmp = ms_strdup_printf("sip:%s",route); + } else { + tmp = ms_strdup(route); + } + addr = sal_address_new(tmp); + if (addr != NULL) { + sal_address_destroy(addr); + cfg->reg_routes = bctbx_list_append(cfg->reg_routes, tmp); + } else { + ms_free(tmp); + return -1; + } + } + iterator = bctbx_list_next(iterator); + } + return 0; +} + bool_t linphone_proxy_config_check(LinphoneCore *lc, LinphoneProxyConfig *cfg){ if (cfg->reg_proxy==NULL) return FALSE; @@ -1197,7 +1228,7 @@ LinphoneProxyConfig *linphone_proxy_config_new_from_config_file(LinphoneCore* lc CONFIGURE_STRING_VALUE(cfg,config,key,identity,"reg_identity") CONFIGURE_STRING_VALUE(cfg,config,key,server_addr,"reg_proxy") - cfg->reg_routes = linphone_config_get_string_list(config, key, "reg_route", NULL); + linphone_proxy_config_set_routes(cfg, linphone_config_get_string_list(config, key, "reg_route", NULL)); CONFIGURE_STRING_VALUE(cfg,config,key,realm,"realm") diff --git a/include/linphone/proxy_config.h b/include/linphone/proxy_config.h index 13ef5d294..edaa9d8c8 100644 --- a/include/linphone/proxy_config.h +++ b/include/linphone/proxy_config.h @@ -99,6 +99,16 @@ LINPHONE_PUBLIC LinphoneStatus linphone_proxy_config_set_identity_address(Linpho **/ LINPHONE_PUBLIC LinphoneStatus linphone_proxy_config_set_route(LinphoneProxyConfig *cfg, const char *route); +/** + * Sets a list of SIP route. + * When a route is set, all outgoing calls will go to the route's destination if this proxy + * is the default one (see linphone_core_set_default_proxy() ). + * @param[in] cfg the #LinphoneProxyConfig + * @param[in] routes A \bctbx_list{const char *} of routes + * @return -1 if routes are invalid, 0 otherwise. +**/ +LINPHONE_PUBLIC LinphoneStatus linphone_proxy_config_set_routes(LinphoneProxyConfig *cfg, const bctbx_list_t *routes); + /** * Sets the registration expiration time in seconds. **/ From 94ce0fa252204a27bfc90ebb0c1cf60337f82208 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 13 Mar 2018 15:16:44 +0100 Subject: [PATCH 236/281] Fix background task handling on platforms that do not support wakelocks. --- src/chat/chat-room/client-group-chat-room.cpp | 9 ++--- src/utils/background-task.cpp | 35 +++++++++++-------- src/utils/background-task.h | 23 ++++++------ 3 files changed, 39 insertions(+), 28 deletions(-) diff --git a/src/chat/chat-room/client-group-chat-room.cpp b/src/chat/chat-room/client-group-chat-room.cpp index c796f5fee..496be28ac 100644 --- a/src/chat/chat-room/client-group-chat-room.cpp +++ b/src/chat/chat-room/client-group-chat-room.cpp @@ -139,8 +139,8 @@ void ClientGroupChatRoomPrivate::onCallSessionStateChanged ( if (q->getState() == ChatRoom::State::CreationPending) { IdentityAddress addr(session->getRemoteContactAddress()->asStringUriOnly()); q->onConferenceCreated(addr); - if (session->getRemoteContactAddress()->hasParam("isfocus")){ - bgTask.start(q->getCore(), 32); /*it will be stopped when receiving the first notify*/ + if (session->getRemoteContactAddress()->hasParam("isfocus")) { + bgTask.start(q->getCore(), 32); // It will be stopped when receiving the first notify qConference->getPrivate()->eventHandler->subscribe(q->getChatRoomId()); } } else if (q->getState() == ChatRoom::State::TerminationPending) @@ -484,12 +484,13 @@ void ClientGroupChatRoom::onFirstNotifyReceived (const IdentityAddress &addr) { shared_ptr chatRoom = getCore()->findChatRoom(id); if (chatRoom && (chatRoom->getCapabilities() & ChatRoom::Capabilities::Basic)) { BasicToClientGroupChatRoom::migrate(getSharedFromThis(), chatRoom); - goto end; + d->bgTask.stop(); + return; } } d->chatRoomListener->onChatRoomInsertInDatabaseRequested(getSharedFromThis()); -end: + d->bgTask.stop(); // TODO: Bug. Event is inserted many times. // Avoid this in the future. Deal with signals/slots system. diff --git a/src/utils/background-task.cpp b/src/utils/background-task.cpp index bca543c35..0aaeb3397 100644 --- a/src/utils/background-task.cpp +++ b/src/utils/background-task.cpp @@ -21,39 +21,45 @@ #include "c-wrapper/internal/c-sal.h" #include "logger/logger.h" #include "core/core-p.h" -#include "private.h" //to get access to the Sal + +// TODO: Remove me +#include "private.h" // To get access to the Sal // ============================================================================= LINPHONE_BEGIN_NAMESPACE -void BackgroundTask::sHandleTimeout(void *context) { +void BackgroundTask::sHandleTimeout (void *context) { static_cast(context)->handleTimeout(); } -int BackgroundTask::sHandleSalTimeout(void *data, unsigned int events){ +int BackgroundTask::sHandleSalTimeout (void *data, unsigned int events) { static_cast(data)->handleSalTimeout(); return BELLE_SIP_STOP; } -void BackgroundTask::handleSalTimeout(){ - lWarning() << "Background task [" << mId << "] with name : [" << mName << "] is now expiring."; +void BackgroundTask::handleSalTimeout () { + lWarning() << "Background task [" << mId << "] with name: [" << mName << "] is now expiring"; stop(); } -void BackgroundTask::start (const std::shared_ptr &core, int max_duration_seconds) { +void BackgroundTask::start (const std::shared_ptr &core, int maxDurationSeconds) { if (mName.empty()) { - lError() << "No name was set on background task."; + lError() << "No name was set on background task"; return; } unsigned long newId = sal_begin_background_task(mName.c_str(), sHandleTimeout, this); - lInfo() << "Starting background task [" << newId << "] with name : [" << mName << "] and expiration of ["< 0){ + if (maxDurationSeconds > 0) { mSal = core->getCCore()->sal; - mTimeout = mSal->create_timer(sHandleSalTimeout, this, (unsigned int) max_duration_seconds * 1000, mName.c_str()); + mTimeout = mSal->create_timer(sHandleSalTimeout, this, (unsigned int)maxDurationSeconds * 1000, mName.c_str()); } } @@ -61,18 +67,19 @@ void BackgroundTask::stop () { if (mId == 0) return; - lInfo() << "Ending background task [" << mId << "] with name : [" << mName << "]."; + lInfo() << "Ending background task [" << mId << "] with name: [" << mName << "]"; sal_end_background_task(mId); - if (mTimeout){ + if (mTimeout) { mSal->cancel_timer(mTimeout); belle_sip_object_unref(mTimeout); - mTimeout = NULL; + mTimeout = nullptr; } mId = 0; } void BackgroundTask::handleTimeout () { - lWarning() << "Background task [" << mId << "] with name : [" << mName << "] is expiring from OS before completion..."; + lWarning() << "Background task [" << mId << "] with name: [" << mName + << "] is expiring from OS before completion..."; stop(); } diff --git a/src/utils/background-task.h b/src/utils/background-task.h index 5aa7edb89..2567a5b6d 100644 --- a/src/utils/background-task.h +++ b/src/utils/background-task.h @@ -34,8 +34,8 @@ class Core; class BackgroundTask { public: - BackgroundTask() : mTimeout(NULL), mSal(NULL), mId(0){} - BackgroundTask (const std::string &name) : mTimeout(NULL), mSal(NULL), mName(name), mId(0) {} + BackgroundTask () {} + BackgroundTask (const std::string &name) {} virtual ~BackgroundTask () { stop(); } @@ -43,26 +43,29 @@ public: void setName (const std::string &name) { mName = name; } - /** - * Start a long running task for at most max_duration_seconds, after which it is automatically terminated - */ - void start(const std::shared_ptr &core, int max_duration_seconds = 15*60); /*15 mn by default, like on iOS*/ - void stop(); const std::string &getName () const { return mName; } + + /** + * Start a long running task for at most max_duration_seconds, after which it is automatically terminated + */ + void start (const std::shared_ptr &core, int maxDurationSeconds = 15 * 60); // 15 min by default, like on iOS + void stop (); + protected: virtual void handleTimeout (); private: static int sHandleSalTimeout(void *data, unsigned int events); static void sHandleTimeout(void *data); - belle_sip_source_t *mTimeout; - Sal *mSal; + void handleSalTimeout(); + + belle_sip_source_t *mTimeout = nullptr; + Sal *mSal = nullptr; std::string mName; unsigned long mId = 0; - void handleSalTimeout(); }; LINPHONE_END_NAMESPACE From c80f9f65c0f59bb9de4d9d037fdd0f3a088c922c Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Tue, 13 Mar 2018 17:16:11 +0100 Subject: [PATCH 237/281] Added test for single route --- tester/proxy_config_tester.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/tester/proxy_config_tester.c b/tester/proxy_config_tester.c index a2bf63066..a07c0217f 100644 --- a/tester/proxy_config_tester.c +++ b/tester/proxy_config_tester.c @@ -243,12 +243,36 @@ static void load_dynamic_proxy_config(void) { } +static void single_route(void) { + LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); + LinphoneProxyConfig *marie_cfg = linphone_core_get_default_proxy_config(marie->lc); + BC_ASSERT_PTR_NOT_NULL(marie_cfg); + + const bctbx_list_t *routes = linphone_proxy_config_get_routes(marie_cfg); + BC_ASSERT_PTR_NOT_NULL(routes); + BC_ASSERT_EQUAL(bctbx_list_size(routes), 1, int, "%d"); + const char *route = (const char *)bctbx_list_get_data(routes); + BC_ASSERT_STRING_EQUAL(linphone_proxy_config_get_route(marie_cfg), "sip:sip.example.org;transport=tcp;lr"); + BC_ASSERT_STRING_EQUAL(route, "sip:sip.example.org;transport=tcp;lr"); + + linphone_proxy_config_set_route(marie_cfg, "sip.linphone.org"); + routes = linphone_proxy_config_get_routes(marie_cfg); + BC_ASSERT_PTR_NOT_NULL(routes); + BC_ASSERT_EQUAL(bctbx_list_size(routes), 1, int, "%d"); + route = (const char *)bctbx_list_get_data(routes); + BC_ASSERT_STRING_EQUAL(linphone_proxy_config_get_route(marie_cfg), "sip:sip.linphone.org"); + BC_ASSERT_STRING_EQUAL(route, "sip:sip.linphone.org"); + + linphone_core_manager_destroy(marie); +} + test_t proxy_config_tests[] = { TEST_NO_TAG("Phone normalization without proxy", phone_normalization_without_proxy), TEST_NO_TAG("Phone normalization with proxy", phone_normalization_with_proxy), TEST_NO_TAG("Phone normalization with dial escape plus", phone_normalization_with_dial_escape_plus), TEST_NO_TAG("SIP URI normalization", sip_uri_normalization), - TEST_NO_TAG("Load new default value for proxy config", load_dynamic_proxy_config) + TEST_NO_TAG("Load new default value for proxy config", load_dynamic_proxy_config), + TEST_NO_TAG("Single route", single_route) }; test_suite_t proxy_config_test_suite = {"Proxy config", NULL, NULL, liblinphone_tester_before_each, liblinphone_tester_after_each, From 61c79b43e0fc46cf4429d3b699956d2b679d65a4 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 13 Mar 2018 17:29:13 +0100 Subject: [PATCH 238/281] Use C++ instead of C where possible. --- src/call/call.cpp | 21 ++++++++++----------- src/call/call.h | 1 + src/chat/chat-message/chat-message.cpp | 6 +++--- src/conference/session/call-session.cpp | 6 +++--- src/conference/session/media-session.cpp | 2 +- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/call/call.cpp b/src/call/call.cpp index f7b915a54..f60387011 100644 --- a/src/call/call.cpp +++ b/src/call/call.cpp @@ -311,25 +311,24 @@ void CallPrivate::onCallSessionTransferStateChanged (const shared_ptr &session) { L_Q(); - LinphoneCall *lcall = L_GET_C_BACK_PTR(q); - bctbx_list_t *copy = bctbx_list_copy(linphone_core_get_calls(q->getCore()->getCCore())); - for (bctbx_list_t *it = copy; it != nullptr; it = bctbx_list_next(it)) { - LinphoneCall *call = reinterpret_cast(bctbx_list_get_data(it)); - if (call == lcall) continue; - switch (L_GET_CPP_PTR_FROM_C_OBJECT(call)->getState()) { + list> calls = q->getCore()->getCalls(); + shared_ptr currentCall = q->getSharedFromThis(); + for (const auto &call : calls) { + if (call == currentCall) + continue; + switch (call->getState()) { case CallSession::State::OutgoingInit: case CallSession::State::OutgoingProgress: case CallSession::State::OutgoingRinging: case CallSession::State::OutgoingEarlyMedia: - lInfo() << "Already existing call [" << call << "] in state [" << linphone_call_state_to_string(linphone_call_get_state(call)) << - "], canceling it before accepting new call [" << lcall << "]"; - linphone_call_terminate(call); + lInfo() << "Already existing call [" << call << "] in state [" << Utils::toString(call->getState()) + << "], canceling it before accepting new call [" << currentCall << "]"; + call->terminate(); break; default: - break; /* Nothing to do */ + break; // Nothing to do } } - bctbx_list_free(copy); } void CallPrivate::onDtmfReceived (const shared_ptr &session, char dtmf) { diff --git a/src/call/call.h b/src/call/call.h index 15204a797..4cfbf9a8a 100644 --- a/src/call/call.h +++ b/src/call/call.h @@ -37,6 +37,7 @@ class MediaSessionPrivate; class Call : public Object, public CoreAccessor { friend class CallSessionPrivate; friend class ChatMessage; + friend class ChatMessagePrivate; friend class CorePrivate; friend class MediaSessionPrivate; diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index e5d1a8db6..f28305460 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -621,8 +621,8 @@ void ChatMessagePrivate::send () { || (call->getState() == CallSession::State::Pausing) || (call->getState() == CallSession::State::PausedByRemote) ) { - lInfo() << "send SIP msg through the existing call."; - op = linphone_call_get_op(lcall); + lInfo() << "Send SIP msg through the existing call"; + op = call->getPrivate()->getOp(); string identity = linphone_core_find_best_identity(core->getCCore(), linphone_call_get_remote_address(lcall)); if (identity.empty()) { LinphoneAddress *addr = linphone_address_new(q->getToAddress().asString().c_str()); @@ -1019,7 +1019,7 @@ void ChatMessage::send () { // Do not allow sending a message that is already being sent or that has been correctly delivered/displayed if ((d->state == State::InProgress) || (d->state == State::Delivered) || (d->state == State::FileTransferDone) || (d->state == State::DeliveredToUser) || (d->state == State::Displayed)) { - lWarning() << "Cannot send chat message in state " << linphone_chat_message_state_to_string((LinphoneChatMessageState)d->state); + lWarning() << "Cannot send chat message in state " << Utils::toString(d->state); return; } diff --git a/src/conference/session/call-session.cpp b/src/conference/session/call-session.cpp index 1d525bad9..2aad40f1a 100644 --- a/src/conference/session/call-session.cpp +++ b/src/conference/session/call-session.cpp @@ -469,13 +469,13 @@ void CallSessionPrivate::updatedByRemote () { setState(CallSession::State::UpdatedByRemote,"Call updated by remote"); if (deferUpdate) { if (state == CallSession::State::UpdatedByRemote) - lInfo() << "CallSession [" << q << "]: UpdatedByRemoted was signaled but defered. LinphoneCore expects the application to call linphone_core_accept_call_update() later."; + lInfo() << "CallSession [" << q << "]: UpdatedByRemoted was signaled but defered. LinphoneCore expects the application to call CallSession::acceptUpdate() later"; } else { if (state == CallSession::State::UpdatedByRemote) q->acceptUpdate(nullptr); else { - /* Otherwise it means that the app responded by linphone_core_accept_call_update - * within the callback, so job is already done. */ + // Otherwise it means that the app responded by CallSession::acceptUpdate() within the callback, + // so job is already done } } } diff --git a/src/conference/session/media-session.cpp b/src/conference/session/media-session.cpp index 2994d721d..d79b6a34a 100644 --- a/src/conference/session/media-session.cpp +++ b/src/conference/session/media-session.cpp @@ -4254,7 +4254,7 @@ int MediaSession::startInvite (const Address *destination, const string &subject void MediaSession::startRecording () { L_D(); if (d->getParams()->getRecordFilePath().empty()) { - lError() << "MediaSession::startRecording(): no output file specified. Use linphone_call_params_set_record_file()"; + lError() << "MediaSession::startRecording(): no output file specified. Use MediaSessionParams::setRecordFilePath()"; return; } if (d->audioStream && !d->getParams()->getPrivate()->getInConference()) From 261b0f195adef14020c782a1abf2738cd6759959 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Tue, 13 Mar 2018 12:09:41 +0100 Subject: [PATCH 239/281] fix crash when destroying LinphoneCore during file upload --- src/chat/chat-message/chat-message-p.h | 4 +++- src/chat/chat-message/chat-message.cpp | 12 +++++++----- .../modifier/file-transfer-chat-message-modifier.cpp | 12 ++++++++---- .../modifier/file-transfer-chat-message-modifier.h | 3 ++- 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/chat/chat-message/chat-message-p.h b/src/chat/chat-message/chat-message-p.h index 745815859..764de0d96 100644 --- a/src/chat/chat-message/chat-message-p.h +++ b/src/chat/chat-message/chat-message-p.h @@ -152,6 +152,9 @@ public: void updateInDb (); private: + + ChatMessagePrivate(const std::shared_ptr &cr, ChatMessage::Direction dir); + static bool validStateTransition (ChatMessage::State currentState, ChatMessage::State newState); // TODO: Clean attributes. @@ -198,7 +201,6 @@ private: bool encryptionPrevented = false; bool toBeStored = true; mutable bool contentsNotLoadedFromDatabase = false; - L_DECLARE_PUBLIC(ChatMessage); }; diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index f28305460..487a052af 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -52,6 +52,11 @@ using namespace B64_NAMESPACE; LINPHONE_BEGIN_NAMESPACE +ChatMessagePrivate::ChatMessagePrivate(const std::shared_ptr &cr, ChatMessage::Direction dir):fileTransferChatMessageModifier(cr->getCore()->getCCore()->http_provider) { + direction = dir; + setChatRoom(cr); +} + void ChatMessagePrivate::setDirection (ChatMessage::Direction dir) { direction = dir; } @@ -829,15 +834,12 @@ bool ChatMessagePrivate::validStateTransition (ChatMessage::State currentState, // ----------------------------------------------------------------------------- ChatMessage::ChatMessage (const shared_ptr &chatRoom, ChatMessage::Direction direction) : - Object(*new ChatMessagePrivate), CoreAccessor(chatRoom->getCore()) { - L_D(); - - d->direction = direction; - d->setChatRoom(chatRoom); + Object(*new ChatMessagePrivate(chatRoom,direction)), CoreAccessor(chatRoom->getCore()) { } ChatMessage::~ChatMessage () { L_D(); + for (Content *content : d->contents) delete content; diff --git a/src/chat/modifier/file-transfer-chat-message-modifier.cpp b/src/chat/modifier/file-transfer-chat-message-modifier.cpp index 7f9d6dd39..1da43ae8d 100644 --- a/src/chat/modifier/file-transfer-chat-message-modifier.cpp +++ b/src/chat/modifier/file-transfer-chat-message-modifier.cpp @@ -35,7 +35,7 @@ using namespace std; LINPHONE_BEGIN_NAMESPACE -FileTransferChatMessageModifier::FileTransferChatMessageModifier () { +FileTransferChatMessageModifier::FileTransferChatMessageModifier (belle_http_provider_t *prov) : provider(prov) { bgTask.setName("File transfer upload"); } @@ -48,7 +48,10 @@ void FileTransferChatMessageModifier::setHttpRequest (belle_http_request_t *requ } FileTransferChatMessageModifier::~FileTransferChatMessageModifier () { - releaseHttpRequest(); + if (isFileTransferInProgressAndValid()) + cancelFileTransfer(); //to avoid body handler to still refference zombie FileTransferChatMessageModifier + else + releaseHttpRequest(); } ChatMessageModifier::Result FileTransferChatMessageModifier::encode (const shared_ptr &message, int &errorCode) { @@ -474,7 +477,7 @@ int FileTransferChatMessageModifier::startHttpTransfer (const string &url, const // give msg to listener to be able to start the actual file upload when server answer a 204 No content httpListener = belle_http_request_listener_create_from_callbacks(cbs, this); - belle_http_provider_send_request(message->getCore()->getCCore()->http_provider, httpRequest, httpListener); + belle_http_provider_send_request(provider, httpRequest, httpListener); return 0; error: @@ -941,10 +944,11 @@ void FileTransferChatMessageModifier::cancelFileTransfer () { ? L_C_TO_STRING(linphone_core_get_file_transfer_server(message->getCore()->getCCore())) : currentFileContentToTransfer->getFilePath().c_str() ); - belle_http_provider_cancel_request(message->getCore()->getCCore()->http_provider, httpRequest); + } else { lInfo() << "Warning: http request still running for ORPHAN msg: this is a memory leak"; } + belle_http_provider_cancel_request(provider, httpRequest); } releaseHttpRequest(); } diff --git a/src/chat/modifier/file-transfer-chat-message-modifier.h b/src/chat/modifier/file-transfer-chat-message-modifier.h index d79b5bdc2..99a7cbf2e 100644 --- a/src/chat/modifier/file-transfer-chat-message-modifier.h +++ b/src/chat/modifier/file-transfer-chat-message-modifier.h @@ -36,7 +36,7 @@ class FileTransferContent; class FileTransferChatMessageModifier : public ChatMessageModifier { public: - FileTransferChatMessageModifier (); + FileTransferChatMessageModifier (belle_http_provider_t *prov); ~FileTransferChatMessageModifier (); Result encode (const std::shared_ptr &message, int &errorCode) override; @@ -77,6 +77,7 @@ private: belle_http_request_t *httpRequest = nullptr; belle_http_request_listener_t *httpListener = nullptr; + belle_http_provider_t *provider = nullptr; BackgroundTask bgTask; }; From e620b432b20e6337b6a638b7a52234b793974ecf Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Wed, 14 Mar 2018 10:29:44 +0100 Subject: [PATCH 240/281] avoid invalid read if CallSessionPrivate is deleted within call to L_GET_PRIVATE(session)->failure(); --- coreapi/callbacks.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index 2faa1cef6..6302d92f6 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -256,7 +256,7 @@ static void call_terminated(SalOp *op, const char *from) { } static void call_failure(SalOp *op) { - LinphonePrivate::CallSession *session = reinterpret_cast(op->get_user_pointer()); + std::shared_ptr session = reinterpret_cast(op->get_user_pointer())->getSharedFromThis(); if (!session) { ms_warning("Failure reported on already terminated CallSession"); return; From 12660bea3ac8a6632f108c258d50d392da724951 Mon Sep 17 00:00:00 2001 From: Benjamin Reis Date: Wed, 14 Mar 2018 17:26:11 +0100 Subject: [PATCH 241/281] do not notify unknown device --- .../handlers/local-conference-event-handler.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/conference/handlers/local-conference-event-handler.cpp b/src/conference/handlers/local-conference-event-handler.cpp index f9f5e2f8a..9847a93e9 100644 --- a/src/conference/handlers/local-conference-event-handler.cpp +++ b/src/conference/handlers/local-conference-event-handler.cpp @@ -404,15 +404,14 @@ void LocalConferenceEventHandler::subscribeReceived (LinphoneEvent *lev, bool on const LinphoneAddress *lContactAddr = linphone_event_get_remote_contact(lev); char *contactAddrStr = linphone_address_as_string(lContactAddr); - Address contactAddr(contactAddrStr); + IdentityAddress contactAddr(contactAddrStr); bctbx_free(contactAddrStr); - if (contactAddr.getUriParamValue("gr").empty()) { + shared_ptr device = participant->getPrivate()->findDevice(contactAddr); + if (!device) { lError() << "received SUBSCRIBE for conference: " << d->conf->getConferenceAddress().asString() - << "has no GRUU in it's contact address:" << contactAddr.asString() << ", no NOTIFY sent."; + << "device sending subscribe: " << contactAddr.asString() << " is not known, no NOTIFY sent."; return; } - IdentityAddress gruu(contactAddr); - shared_ptr device = participant->getPrivate()->addDevice(gruu); if (linphone_event_get_subscription_state(lev) == LinphoneSubscriptionActive) { unsigned int lastNotify = static_cast(Utils::stoi(linphone_event_get_custom_header(lev, "Last-Notify-Version"))); From 09025ed3c894d2b3dd3f601dceccdbe32d1305e4 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Wed, 14 Mar 2018 18:18:39 +0100 Subject: [PATCH 242/281] Add chat room callbacks to handle subscription to registration state of participants + add new group chat tester. --- coreapi/private_functions.h | 4 +- include/linphone/api/c-callbacks.h | 16 ++++- include/linphone/api/c-chat-room-cbs.h | 40 +++++++++-- include/linphone/api/c-chat-room.h | 11 ++- src/c-wrapper/api/c-chat-room-cbs.cpp | 28 ++++++-- src/c-wrapper/api/c-chat-room.cpp | 22 +++++- src/chat/chat-room/server-group-chat-room-p.h | 15 ++++- .../chat-room/server-group-chat-room-stub.cpp | 2 + tester/group_chat_tester.c | 67 ++++++++++++++++++- 9 files changed, 185 insertions(+), 20 deletions(-) diff --git a/coreapi/private_functions.h b/coreapi/private_functions.h index 9ab4e447f..df615255b 100644 --- a/coreapi/private_functions.h +++ b/coreapi/private_functions.h @@ -291,8 +291,10 @@ void _linphone_chat_room_notify_undecryptable_message_received(LinphoneChatRoom void _linphone_chat_room_notify_chat_message_received(LinphoneChatRoom *cr, const LinphoneEventLog *event_log); void _linphone_chat_room_notify_chat_message_sent(LinphoneChatRoom *cr, const LinphoneEventLog *event_log); void _linphone_chat_room_notify_conference_address_generation(LinphoneChatRoom *cr); -void _linphone_chat_room_notify_participant_device_fetched(LinphoneChatRoom *cr, const LinphoneAddress *participantAddr); +void _linphone_chat_room_notify_participant_device_fetch_requested(LinphoneChatRoom *cr, const LinphoneAddress *participantAddr); void _linphone_chat_room_notify_participants_capabilities_checked(LinphoneChatRoom *cr, const LinphoneAddress *deviceAddr, const bctbx_list_t *participantsAddr); +void _linphone_chat_room_notify_participant_registration_subscription_requested(LinphoneChatRoom *cr, const LinphoneAddress *participantAddr); +void _linphone_chat_room_notify_participant_registration_unsubscription_requested(LinphoneChatRoom *cr, const LinphoneAddress *participantAddr); void _linphone_chat_room_notify_chat_message_should_be_stored(LinphoneChatRoom *cr, LinphoneChatMessage *msg); void _linphone_chat_room_clear_callbacks (LinphoneChatRoom *cr); diff --git a/include/linphone/api/c-callbacks.h b/include/linphone/api/c-callbacks.h index 228758a61..f8b796a00 100644 --- a/include/linphone/api/c-callbacks.h +++ b/include/linphone/api/c-callbacks.h @@ -239,7 +239,7 @@ typedef void (*LinphoneChatRoomCbsConferenceAddressGenerationCb) (LinphoneChatRo * @param[in] cr #LinphoneChatRoom object * @param[in] participantAddr #LinphoneAddress object */ -typedef void (*LinphoneChatRoomCbsParticipantDeviceFetchedCb) (LinphoneChatRoom *cr, const LinphoneAddress *participantAddr); +typedef void (*LinphoneChatRoomCbsParticipantDeviceFetchRequestedCb) (LinphoneChatRoom *cr, const LinphoneAddress *participantAddr); /** * Callback used when a group chat room server is checking participants capabilities. @@ -249,6 +249,20 @@ typedef void (*LinphoneChatRoomCbsParticipantDeviceFetchedCb) (LinphoneChatRoom */ typedef void (*LinphoneChatRoomCbsParticipantsCapabilitiesCheckedCb) (LinphoneChatRoom *cr, const LinphoneAddress *deviceAddr, const bctbx_list_t *participantsAddr); +/** + * Callback used when a group chat room server is subscribing to registration state of a participant. + * @param[in] cr #LinphoneChatRoom object + * @param[in] participantAddr #LinphoneAddress object + */ +typedef void (*LinphoneChatRoomCbsParticipantRegistrationSubscriptionRequestedCb) (LinphoneChatRoom *cr, const LinphoneAddress *participantAddr); + +/** + * Callback used when a group chat room server is unsubscribing to registration state of a participant. + * @param[in] cr #LinphoneChatRoom object + * @param[in] participantAddr #LinphoneAddress object + */ +typedef void (*LinphoneChatRoomCbsParticipantRegistrationUnsubscriptionRequestedCb) (LinphoneChatRoom *cr, const LinphoneAddress *participantAddr); + /** * Callback used to tell the core whether or not to store the incoming message in db or not using linphone_chat_message_set_to_be_stored(). * @param[in] cr #LinphoneChatRoom object diff --git a/include/linphone/api/c-chat-room-cbs.h b/include/linphone/api/c-chat-room-cbs.h index 0e02b615c..6cbf7bd91 100644 --- a/include/linphone/api/c-chat-room-cbs.h +++ b/include/linphone/api/c-chat-room-cbs.h @@ -244,18 +244,18 @@ LINPHONE_PUBLIC LinphoneChatRoomCbsConferenceAddressGenerationCb linphone_chat_r LINPHONE_PUBLIC void linphone_chat_room_cbs_set_conference_address_generation (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsConferenceAddressGenerationCb cb); /** - * Get the participant device getting callback. + * Get the participant device fetching callback. * @param[in] cbs LinphoneChatRoomCbs object - * @return The participant device getting callback + * @return The participant device fetching callback */ -LINPHONE_PUBLIC LinphoneChatRoomCbsParticipantDeviceFetchedCb linphone_chat_room_cbs_get_participant_device_fetched (const LinphoneChatRoomCbs *cbs); +LINPHONE_PUBLIC LinphoneChatRoomCbsParticipantDeviceFetchRequestedCb linphone_chat_room_cbs_get_participant_device_fetch_requested (const LinphoneChatRoomCbs *cbs); /** - * Set the participant device getting callback. + * Set the participant device fetching callback. * @param[in] cbs LinphoneChatRoomCbs object - * @param[in] cb The participant device getting callback to be used + * @param[in] cb The participant device fetching callback to be used */ -LINPHONE_PUBLIC void linphone_chat_room_cbs_set_participant_device_fetched (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsParticipantDeviceFetchedCb cb); +LINPHONE_PUBLIC void linphone_chat_room_cbs_set_participant_device_fetch_requested (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsParticipantDeviceFetchRequestedCb cb); /** * Get the participants capabilities callback. @@ -271,6 +271,34 @@ LINPHONE_PUBLIC LinphoneChatRoomCbsParticipantsCapabilitiesCheckedCb linphone_ch */ LINPHONE_PUBLIC void linphone_chat_room_cbs_set_participants_capabilities_checked (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsParticipantsCapabilitiesCheckedCb cb); +/** + * Get the participant registration subscription callback. + * @param[in] cbs LinphoneChatRoomCbs object + * @return The participant registration subscription callback + */ +LINPHONE_PUBLIC LinphoneChatRoomCbsParticipantRegistrationSubscriptionRequestedCb linphone_chat_room_cbs_get_participant_registration_subscription_requested (const LinphoneChatRoomCbs *cbs); + +/** + * Set the participant registration subscription callback. + * @param[in] cbs LinphoneChatRoomCbs object + * @param[in] cb The participant registration subscription callback to be used + */ +LINPHONE_PUBLIC void linphone_chat_room_cbs_set_participant_registration_subscription_requested (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsParticipantRegistrationSubscriptionRequestedCb cb); + +/** + * Get the participant registration unsubscription callback. + * @param[in] cbs LinphoneChatRoomCbs object + * @return The participant registration unsubscription callback + */ +LINPHONE_PUBLIC LinphoneChatRoomCbsParticipantRegistrationUnsubscriptionRequestedCb linphone_chat_room_cbs_get_participant_registration_unsubscription_requested (const LinphoneChatRoomCbs *cbs); + +/** + * Set the participant registration unsubscription callback. + * @param[in] cbs LinphoneChatRoomCbs object + * @param[in] cb The participant registration unsubscription callback to be used + */ +LINPHONE_PUBLIC void linphone_chat_room_cbs_set_participant_registration_unsubscription_requested (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsParticipantRegistrationUnsubscriptionRequestedCb cb); + /** * Get the message should be stored callback. * @param[in] cbs LinphoneChatRoomCbs object diff --git a/include/linphone/api/c-chat-room.h b/include/linphone/api/c-chat-room.h index 0cd0761db..63aa290cb 100644 --- a/include/linphone/api/c-chat-room.h +++ b/include/linphone/api/c-chat-room.h @@ -454,13 +454,22 @@ LINPHONE_PUBLIC void linphone_chat_room_set_conference_address (LinphoneChatRoom /** * Set the participant device. This function needs to be called from the - * LinphoneChatRoomCbsParticipantDeviceFetchedCb callback and only there. + * LinphoneChatRoomCbsParticipantDeviceFetchRequestedCb callback and only there. * @param[in] cr A LinphoneChatRoom object * @param[in] partAddr The participant address * @param[in] partDevices \bctbx_list{LinphoneAddress} list of the participant devices to be used by the group chat room */ LINPHONE_PUBLIC void linphone_chat_room_set_participant_devices (LinphoneChatRoom *cr, const LinphoneAddress *partAddr, const bctbx_list_t *partDevices); +/** + * Add a participant device. + * This is to used if a new device registers itself after the chat room creation. + * @param[in] cr A #LinphoneChatRoom object + * @param[in] participantAddress The address of the participant for which a new device is to be added + * @param[in] deviceAddress The address of the new device to be added + */ +LINPHONE_PUBLIC void linphone_chat_room_add_participant_device (LinphoneChatRoom *cr, const LinphoneAddress *participantAddress, const LinphoneAddress *deviceAddress); + /** * Set the participant device. This function needs to be called from the * LinphoneChatRoomCbsParticipantsCapabilitiesCheckedCb callback and only there. diff --git a/src/c-wrapper/api/c-chat-room-cbs.cpp b/src/c-wrapper/api/c-chat-room-cbs.cpp index 518c5b8bd..1d3d4d8d6 100644 --- a/src/c-wrapper/api/c-chat-room-cbs.cpp +++ b/src/c-wrapper/api/c-chat-room-cbs.cpp @@ -39,8 +39,10 @@ struct _LinphoneChatRoomCbs { LinphoneChatRoomCbsChatMessageReceivedCb chatMessageReceivedCb; LinphoneChatRoomCbsChatMessageSentCb chatMessageSentCb; LinphoneChatRoomCbsConferenceAddressGenerationCb conferenceAddressGenerationCb; - LinphoneChatRoomCbsParticipantDeviceFetchedCb participantDeviceFetchedCb; + LinphoneChatRoomCbsParticipantDeviceFetchRequestedCb participantDeviceFetchRequestedCb; LinphoneChatRoomCbsParticipantsCapabilitiesCheckedCb participantsCapabilitiesChecked; + LinphoneChatRoomCbsParticipantRegistrationSubscriptionRequestedCb participantRegistrationSubscriptionRequestedCb; + LinphoneChatRoomCbsParticipantRegistrationUnsubscriptionRequestedCb participantRegistrationUnsubscriptionRequestedCb; LinphoneChatRoomCbsShouldChatMessageBeStoredCb shouldMessageBeStoredCb; }; @@ -182,12 +184,12 @@ void linphone_chat_room_cbs_set_conference_address_generation (LinphoneChatRoomC cbs->conferenceAddressGenerationCb = cb; } -LinphoneChatRoomCbsParticipantDeviceFetchedCb linphone_chat_room_cbs_get_participant_device_fetched (const LinphoneChatRoomCbs *cbs) { - return cbs->participantDeviceFetchedCb; +LinphoneChatRoomCbsParticipantDeviceFetchRequestedCb linphone_chat_room_cbs_get_participant_device_fetch_requested (const LinphoneChatRoomCbs *cbs) { + return cbs->participantDeviceFetchRequestedCb; } -void linphone_chat_room_cbs_set_participant_device_fetched (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsParticipantDeviceFetchedCb cb) { - cbs->participantDeviceFetchedCb = cb; +void linphone_chat_room_cbs_set_participant_device_fetch_requested (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsParticipantDeviceFetchRequestedCb cb) { + cbs->participantDeviceFetchRequestedCb = cb; } LinphoneChatRoomCbsParticipantsCapabilitiesCheckedCb linphone_chat_room_cbs_get_participants_capabilities_checked (const LinphoneChatRoomCbs *cbs) { @@ -198,6 +200,22 @@ void linphone_chat_room_cbs_set_participants_capabilities_checked (LinphoneChatR cbs->participantsCapabilitiesChecked = cb; } +LinphoneChatRoomCbsParticipantRegistrationSubscriptionRequestedCb linphone_chat_room_cbs_get_participant_registration_subscription_requested (const LinphoneChatRoomCbs *cbs) { + return cbs->participantRegistrationSubscriptionRequestedCb; +} + +void linphone_chat_room_cbs_set_participant_registration_subscription_requested (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsParticipantRegistrationSubscriptionRequestedCb cb) { + cbs->participantRegistrationSubscriptionRequestedCb = cb; +} + +LinphoneChatRoomCbsParticipantRegistrationUnsubscriptionRequestedCb linphone_chat_room_cbs_get_participant_registration_unsubscription_requested (const LinphoneChatRoomCbs *cbs) { + return cbs->participantRegistrationUnsubscriptionRequestedCb; +} + +void linphone_chat_room_cbs_set_participant_registration_unsubscription_requested (LinphoneChatRoomCbs *cbs, LinphoneChatRoomCbsParticipantRegistrationUnsubscriptionRequestedCb cb) { + cbs->participantRegistrationUnsubscriptionRequestedCb = cb; +} + LinphoneChatRoomCbsShouldChatMessageBeStoredCb linphone_chat_room_cbs_get_chat_message_should_be_stored( LinphoneChatRoomCbs *cbs) { return cbs->shouldMessageBeStoredCb; } diff --git a/src/c-wrapper/api/c-chat-room.cpp b/src/c-wrapper/api/c-chat-room.cpp index 817a82bbd..e549964e0 100644 --- a/src/c-wrapper/api/c-chat-room.cpp +++ b/src/c-wrapper/api/c-chat-room.cpp @@ -382,6 +382,16 @@ void linphone_chat_room_set_participant_devices (LinphoneChatRoom *cr, const Lin bctbx_free(addrStr); } +void linphone_chat_room_add_participant_device (LinphoneChatRoom *cr, const LinphoneAddress *participantAddress, const LinphoneAddress *deviceAddress) { + char *participantAddressStr = linphone_address_as_string(participantAddress); + char *deviceAddressStr = linphone_address_as_string(deviceAddress); + LinphonePrivate::ServerGroupChatRoomPrivate *sgcr = dynamic_cast(L_GET_PRIVATE_FROM_C_OBJECT(cr)); + if (sgcr) + sgcr->addParticipantDevice(LinphonePrivate::IdentityAddress(participantAddressStr), LinphonePrivate::IdentityAddress(deviceAddressStr)); + bctbx_free(participantAddressStr); + bctbx_free(deviceAddressStr); +} + void linphone_chat_room_add_compatible_participants (LinphoneChatRoom *cr, const LinphoneAddress *deviceAddr, const bctbx_list_t *participantsCompatible) { list lPartsComp = L_GET_RESOLVED_CPP_LIST_FROM_C_LIST(participantsCompatible, Address); LinphonePrivate::ServerGroupChatRoomPrivate *sgcr = dynamic_cast(L_GET_PRIVATE_FROM_C_OBJECT(cr)); @@ -486,14 +496,22 @@ void _linphone_chat_room_notify_conference_address_generation(LinphoneChatRoom * NOTIFY_IF_EXIST(ConferenceAddressGeneration, conference_address_generation, cr) } -void _linphone_chat_room_notify_participant_device_fetched(LinphoneChatRoom *cr, const LinphoneAddress *participantAddr) { - NOTIFY_IF_EXIST(ParticipantDeviceFetched, participant_device_fetched, cr, participantAddr) +void _linphone_chat_room_notify_participant_device_fetch_requested(LinphoneChatRoom *cr, const LinphoneAddress *participantAddr) { + NOTIFY_IF_EXIST(ParticipantDeviceFetchRequested, participant_device_fetch_requested, cr, participantAddr) } void _linphone_chat_room_notify_participants_capabilities_checked(LinphoneChatRoom *cr, const LinphoneAddress *deviceAddr, const bctbx_list_t *participantsAddr) { NOTIFY_IF_EXIST(ParticipantsCapabilitiesChecked, participants_capabilities_checked, cr, deviceAddr, participantsAddr) } +void _linphone_chat_room_notify_participant_registration_subscription_requested(LinphoneChatRoom *cr, const LinphoneAddress *participantAddr) { + NOTIFY_IF_EXIST(ParticipantRegistrationSubscriptionRequested, participant_registration_subscription_requested, cr, participantAddr) +} + +void _linphone_chat_room_notify_participant_registration_unsubscription_requested(LinphoneChatRoom *cr, const LinphoneAddress *participantAddr) { + NOTIFY_IF_EXIST(ParticipantRegistrationUnsubscriptionRequested, participant_registration_unsubscription_requested, cr, participantAddr) +} + void _linphone_chat_room_notify_chat_message_should_be_stored(LinphoneChatRoom *cr, LinphoneChatMessage *msg) { NOTIFY_IF_EXIST(ShouldChatMessageBeStored, chat_message_should_be_stored, cr, msg) } diff --git a/src/chat/chat-room/server-group-chat-room-p.h b/src/chat/chat-room/server-group-chat-room-p.h index 1f124cab3..f31326ad0 100644 --- a/src/chat/chat-room/server-group-chat-room-p.h +++ b/src/chat/chat-room/server-group-chat-room-p.h @@ -60,6 +60,7 @@ public: void setConferenceAddress (const IdentityAddress &conferenceAddress); void setParticipantDevices (const IdentityAddress &addr, const std::list &devices); + void addParticipantDevice (const IdentityAddress &participantAddress, const IdentityAddress &deviceAddress); void addCompatibleParticipants (const IdentityAddress &deviceAddr, const std::list &compatibleParticipants); void checkCompatibleParticipants (const IdentityAddress &deviceAddr, const std::list &addressesToCheck); @@ -67,17 +68,29 @@ public: private: struct Message { - Message (const std::string &from, const std::string &contentType, const std::string &text) : fromAddr(from) { + Message (const std::string &from, const std::string &contentType, const std::string &text, const SalCustomHeader *salCustomHeaders) + : fromAddr(from) + { content.setContentType(contentType); if (!text.empty()) content.setBodyFromUtf8(text); + if (salCustomHeaders) + customHeaders = sal_custom_header_clone(salCustomHeaders); + } + + ~Message () { + if (customHeaders) + sal_custom_header_free(customHeaders); } IdentityAddress fromAddr; Content content; std::chrono::system_clock::time_point timestamp = std::chrono::system_clock::now(); + SalCustomHeader *customHeaders = nullptr; }; + static void copyMessageHeaders (const std::shared_ptr &fromMessage, const std::shared_ptr &toMessage); + void designateAdmin (); void dispatchMessage (const std::shared_ptr &message, const std::string &uri); void finalizeCreation (); diff --git a/src/chat/chat-room/server-group-chat-room-stub.cpp b/src/chat/chat-room/server-group-chat-room-stub.cpp index ad0ce75f6..d8204fc5b 100644 --- a/src/chat/chat-room/server-group-chat-room-stub.cpp +++ b/src/chat/chat-room/server-group-chat-room-stub.cpp @@ -80,6 +80,8 @@ void ServerGroupChatRoomPrivate::setConferenceAddress (const IdentityAddress &) void ServerGroupChatRoomPrivate::setParticipantDevices (const IdentityAddress &addr, const list &devices) {} +void ServerGroupChatRoomPrivate::addParticipantDevice (const IdentityAddress &participantAddress, const IdentityAddress &deviceAddress) {} + void ServerGroupChatRoomPrivate::addCompatibleParticipants (const IdentityAddress &deviceAddr, const list &participantCompatible) {} // ----------------------------------------------------------------------------- diff --git a/tester/group_chat_tester.c b/tester/group_chat_tester.c index 22cb42d4b..fcccb89ee 100644 --- a/tester/group_chat_tester.c +++ b/tester/group_chat_tester.c @@ -2874,7 +2874,7 @@ static void group_chat_room_unique_one_to_one_chat_room_recreated_from_message_2 linphone_core_manager_destroy(pauline2); } - +#if 0 static void group_chat_room_join_one_to_one_chat_room_with_a_new_device (void) { LinphoneCoreManager *marie1 = linphone_core_manager_create("marie_rc"); LinphoneCoreManager *pauline = linphone_core_manager_create("pauline_rc"); @@ -2963,6 +2963,7 @@ static void group_chat_room_join_one_to_one_chat_room_with_a_new_device (void) { linphone_core_manager_destroy(marie1); linphone_core_manager_destroy(pauline); } +#endif static void group_chat_room_new_unique_one_to_one_chat_room_after_both_participants_left (void) { LinphoneCoreManager *marie = linphone_core_manager_create("marie_rc"); @@ -3179,6 +3180,65 @@ static void find_one_to_one_chat_room (void) { linphone_core_manager_destroy(chloe); } +static void group_chat_room_new_device_after_creation (void) { + LinphoneCoreManager *marie1 = linphone_core_manager_create("marie_rc"); + LinphoneCoreManager *pauline1 = linphone_core_manager_create("pauline_rc"); + LinphoneCoreManager *pauline2 = linphone_core_manager_create("pauline_rc"); + LinphoneCoreManager *laure = linphone_core_manager_create("laure_tcp_rc"); + bctbx_list_t *coresManagerList = NULL; + bctbx_list_t *participantsAddresses = NULL; + coresManagerList = bctbx_list_append(coresManagerList, marie1); + coresManagerList = bctbx_list_append(coresManagerList, pauline1); + coresManagerList = bctbx_list_append(coresManagerList, pauline2); + coresManagerList = bctbx_list_append(coresManagerList, laure); + bctbx_list_t *coresList = init_core_for_conference(coresManagerList); + start_core_for_conference(coresManagerList); + participantsAddresses = bctbx_list_append(participantsAddresses, linphone_address_new(linphone_core_get_identity(pauline1->lc))); + participantsAddresses = bctbx_list_append(participantsAddresses, linphone_address_new(linphone_core_get_identity(laure->lc))); + stats initialMarie1Stats = marie1->stat; + stats initialPauline1Stats = pauline1->stat; + stats initialPauline2Stats = pauline2->stat; + stats initialLaureStats = laure->stat; + + // Marie creates a new group chat room + const char *initialSubject = "Colleagues"; + LinphoneChatRoom *marie1Cr = create_chat_room_client_side(coresList, marie1, &initialMarie1Stats, participantsAddresses, initialSubject, -1); + participantsAddresses = NULL; + const LinphoneAddress *confAddr = linphone_chat_room_get_conference_address(marie1Cr); + + // Check that the chat room is correctly created on Pauline1 and Pauline2's sides and that the participants are added + LinphoneChatRoom *pauline1Cr = check_creation_chat_room_client_side(coresList, pauline1, &initialPauline1Stats, confAddr, initialSubject, 2, FALSE); + LinphoneChatRoom *pauline2Cr = check_creation_chat_room_client_side(coresList, pauline2, &initialPauline2Stats, confAddr, initialSubject, 2, FALSE); + + // Check that the chat room is correctly created on Laure's side and that the participants are added + LinphoneChatRoom *laureCr = check_creation_chat_room_client_side(coresList, laure, &initialLaureStats, confAddr, initialSubject, 2, FALSE); + + // Marie adds a new device + LinphoneCoreManager *marie2 = linphone_core_manager_create("marie_rc"); + stats initialMarie2Stats = marie2->stat; + bctbx_list_t *tmpCoresManagerList = bctbx_list_append(NULL, marie2); + bctbx_list_t *tmpCoresList = init_core_for_conference(tmpCoresManagerList); + coresList = bctbx_list_concat(coresList, tmpCoresList); + start_core_for_conference(tmpCoresManagerList); + bctbx_list_free(tmpCoresManagerList); + LinphoneChatRoom *marie2Cr = check_creation_chat_room_client_side(coresList, marie2, &initialMarie2Stats, confAddr, initialSubject, 2, TRUE); + + // Clean db from chat room + linphone_core_manager_delete_chat_room(marie1, marie1Cr, coresList); + linphone_core_delete_chat_room(marie2->lc, marie2Cr); + linphone_core_manager_delete_chat_room(pauline1, pauline1Cr, coresList); + linphone_core_delete_chat_room(pauline2->lc, pauline2Cr); + linphone_core_manager_delete_chat_room(laure, laureCr, coresList); + + bctbx_list_free(coresList); + bctbx_list_free(coresManagerList); + linphone_core_manager_destroy(marie1); + linphone_core_manager_destroy(marie2); + linphone_core_manager_destroy(pauline1); + linphone_core_manager_destroy(pauline2); + linphone_core_manager_destroy(laure); +} + test_t group_chat_tests[] = { TEST_NO_TAG("Group chat room creation server", group_chat_room_creation_server), TEST_ONE_TAG("Add participant", group_chat_room_add_participant, "LeaksMemory"), @@ -3218,11 +3278,12 @@ test_t group_chat_tests[] = { 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 recreated from message", group_chat_room_unique_one_to_one_chat_room_recreated_from_message), TEST_ONE_TAG("Unique one-to-one chatroom recreated from message with app restart", group_chat_room_unique_one_to_one_chat_room_recreated_from_message_with_app_restart, "LeaksMemory"), - TEST_NO_TAG("Join one-to-one chat room with a new device", group_chat_room_join_one_to_one_chat_room_with_a_new_device), + //TEST_NO_TAG("Join one-to-one chat room with a new device", group_chat_room_join_one_to_one_chat_room_with_a_new_device), TEST_NO_TAG("New unique one-to-one chatroom after both participants left", group_chat_room_new_unique_one_to_one_chat_room_after_both_participants_left), TEST_NO_TAG("Unique one-to-one chatroom re-created from the party that deleted it, with inactive devices", group_chat_room_unique_one_to_one_chat_room_recreated_from_message_2), TEST_NO_TAG("IMDN for group chat room", imdn_for_group_chat_room), - TEST_NO_TAG("Find one to one chat room", find_one_to_one_chat_room) + TEST_NO_TAG("Find one to one chat room", find_one_to_one_chat_room), + TEST_NO_TAG("New device after group chat room creation", group_chat_room_new_device_after_creation) }; test_suite_t group_chat_test_suite = { From 7c27d3c9bc2fa468e61683055eb7867d216d5b3a Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Thu, 15 Mar 2018 08:58:07 +0100 Subject: [PATCH 243/281] fix invalid read in Sal destruction --- src/sal/sal.cpp | 1 - tester/flexisip_tester.c | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/sal/sal.cpp b/src/sal/sal.cpp index 41054ddc8..3346ab05e 100644 --- a/src/sal/sal.cpp +++ b/src/sal/sal.cpp @@ -118,7 +118,6 @@ void Sal::process_request_event_cb (void *ud, const belle_sip_request_event_t *e op->fill_cbs(); }else if (strcmp("REFER",method)==0) { op=new SalReferOp(sal); - op->fill_cbs(); }else if (strcmp("OPTIONS",method)==0) { resp=belle_sip_response_create_from_request(req,200); belle_sip_provider_send_response(sal->prov,resp); diff --git a/tester/flexisip_tester.c b/tester/flexisip_tester.c index 11e80bab4..ef21a90ea 100644 --- a/tester/flexisip_tester.c +++ b/tester/flexisip_tester.c @@ -1388,7 +1388,7 @@ static void on_refer_received(SalOp *op, const SalAddress *refer_to) { Sal *sal = sal_op_get_sal(op); LinphoneCoreManager *receiver = (LinphoneCoreManager*)sal_get_user_pointer(sal); receiver->stat.number_of_LinphoneCallRefered++; - sal_release_op(op); + } void resend_refer_other_devices(void) { From 734453206d4dcce5d0024e47ee7be50a5a113e46 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Thu, 15 Mar 2018 10:36:01 +0100 Subject: [PATCH 244/281] Fix crash if user pointer of op is null in call failure callback. --- coreapi/callbacks.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/coreapi/callbacks.c b/coreapi/callbacks.c index 6302d92f6..da809bc05 100644 --- a/coreapi/callbacks.c +++ b/coreapi/callbacks.c @@ -256,7 +256,9 @@ static void call_terminated(SalOp *op, const char *from) { } static void call_failure(SalOp *op) { - std::shared_ptr session = reinterpret_cast(op->get_user_pointer())->getSharedFromThis(); + shared_ptr session; + if (op->get_user_pointer()) + session = reinterpret_cast(op->get_user_pointer())->getSharedFromThis(); if (!session) { ms_warning("Failure reported on already terminated CallSession"); return; From 5c2669970fc341e6c97cc3f6e2eb7ca766de2bd7 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Thu, 15 Mar 2018 10:49:51 +0100 Subject: [PATCH 245/281] Restore "Join one-to-one chat room with a new device" group chat tester. --- tester/group_chat_tester.c | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/tester/group_chat_tester.c b/tester/group_chat_tester.c index fcccb89ee..bc9bb7159 100644 --- a/tester/group_chat_tester.c +++ b/tester/group_chat_tester.c @@ -2874,7 +2874,6 @@ static void group_chat_room_unique_one_to_one_chat_room_recreated_from_message_2 linphone_core_manager_destroy(pauline2); } -#if 0 static void group_chat_room_join_one_to_one_chat_room_with_a_new_device (void) { LinphoneCoreManager *marie1 = linphone_core_manager_create("marie_rc"); LinphoneCoreManager *pauline = linphone_core_manager_create("pauline_rc"); @@ -2925,16 +2924,11 @@ static void group_chat_room_join_one_to_one_chat_room_with_a_new_device (void) { coresManagerList = bctbx_list_concat(coresManagerList, newCoresManagerList); coresList = bctbx_list_concat(coresList, newCoresList); - // Marie2 creates a new one-to-one chat room with Pauline + // Marie2 gets the one-to-one chat room with Pauline stats initialMarie2Stats = marie2->stat; - participantsAddresses = bctbx_list_append(NULL, linphone_address_new(linphone_core_get_identity(pauline->lc))); - LinphoneChatRoom *marie2Cr = create_chat_room_client_side(coresList, marie2, &initialMarie2Stats, participantsAddresses, initialSubject, -1); + LinphoneChatRoom *marie2Cr = check_creation_chat_room_client_side(coresList, marie2, &initialMarie2Stats, confAddr, initialSubject, 1, FALSE); BC_ASSERT_TRUE(linphone_chat_room_get_capabilities(marie2Cr) & LinphoneChatRoomCapabilitiesOneToOne); - // Check that the created address is the same as before - const LinphoneAddress *newConfAddr = linphone_chat_room_get_conference_address(marie2Cr); - BC_ASSERT_TRUE(linphone_address_weak_equal(confAddr, newConfAddr)); - // Marie2 sends a new message textMessage = "Fine and you?"; message = _send_message(marie2Cr, textMessage); @@ -2963,7 +2957,6 @@ static void group_chat_room_join_one_to_one_chat_room_with_a_new_device (void) { linphone_core_manager_destroy(marie1); linphone_core_manager_destroy(pauline); } -#endif static void group_chat_room_new_unique_one_to_one_chat_room_after_both_participants_left (void) { LinphoneCoreManager *marie = linphone_core_manager_create("marie_rc"); @@ -3278,7 +3271,7 @@ test_t group_chat_tests[] = { 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 recreated from message", group_chat_room_unique_one_to_one_chat_room_recreated_from_message), TEST_ONE_TAG("Unique one-to-one chatroom recreated from message with app restart", group_chat_room_unique_one_to_one_chat_room_recreated_from_message_with_app_restart, "LeaksMemory"), - //TEST_NO_TAG("Join one-to-one chat room with a new device", group_chat_room_join_one_to_one_chat_room_with_a_new_device), + TEST_NO_TAG("Join one-to-one chat room with a new device", group_chat_room_join_one_to_one_chat_room_with_a_new_device), TEST_NO_TAG("New unique one-to-one chatroom after both participants left", group_chat_room_new_unique_one_to_one_chat_room_after_both_participants_left), TEST_NO_TAG("Unique one-to-one chatroom re-created from the party that deleted it, with inactive devices", group_chat_room_unique_one_to_one_chat_room_recreated_from_message_2), TEST_NO_TAG("IMDN for group chat room", imdn_for_group_chat_room), From a244da20ff900f63073e3d4c5afe425960dcbca0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micka=C3=ABl=20Turnel?= Date: Thu, 15 Mar 2018 13:58:33 +0100 Subject: [PATCH 246/281] Add a TMMBR callback --- coreapi/private_functions.h | 1 + include/linphone/api/c-call-cbs.h | 14 ++++ include/linphone/api/c-callbacks.h | 8 +++ src/c-wrapper/api/c-call-cbs.cpp | 9 +++ src/c-wrapper/api/c-call.cpp | 4 ++ src/call/call-p.h | 1 + src/call/call.cpp | 5 ++ .../session/call-session-listener.h | 1 + src/conference/session/media-session.cpp | 19 ++++- tester/call_video_tester.c | 69 ++++++++++++++++++- tester/liblinphone_tester.h | 1 + 11 files changed, 128 insertions(+), 4 deletions(-) diff --git a/coreapi/private_functions.h b/coreapi/private_functions.h index df615255b..e6a27fbe0 100644 --- a/coreapi/private_functions.h +++ b/coreapi/private_functions.h @@ -47,6 +47,7 @@ void linphone_call_notify_transfer_state_changed(LinphoneCall *call, LinphoneCal void linphone_call_notify_stats_updated(LinphoneCall *call, const LinphoneCallStats *stats); void linphone_call_notify_info_message_received(LinphoneCall *call, const LinphoneInfoMessage *msg); void linphone_call_notify_ack_processing(LinphoneCall *call, LinphoneHeaders *msg, bool_t is_received); +void linphone_call_notify_tmmbr_received(LinphoneCall *call, int stream_index, int tmmbr); LinphoneCall * linphone_call_new_outgoing(struct _LinphoneCore *lc, const LinphoneAddress *from, const LinphoneAddress *to, const LinphoneCallParams *params, LinphoneProxyConfig *cfg); LinphoneCall * linphone_call_new_incoming(struct _LinphoneCore *lc, const LinphoneAddress *from, const LinphoneAddress *to, LinphonePrivate::SalCallOp *op); diff --git a/include/linphone/api/c-call-cbs.h b/include/linphone/api/c-call-cbs.h index ed5c3718c..207321ddf 100644 --- a/include/linphone/api/c-call-cbs.h +++ b/include/linphone/api/c-call-cbs.h @@ -159,6 +159,20 @@ LINPHONE_PUBLIC LinphoneCallCbsAckProcessingCb linphone_call_cbs_get_ack_process */ LINPHONE_PUBLIC void linphone_call_cbs_set_ack_processing (LinphoneCallCbs *cbs, LinphoneCallCbsAckProcessingCb cb); +/** + * Get the TMMBR received callback. + * @param[in] cbs LinphoneCallCbs object. + * @return The current TMMBR received callback. + */ +LINPHONE_PUBLIC LinphoneCallCbsTmmbrReceivedCb linphone_call_cbs_get_tmmbr_received(LinphoneCallCbs *cbs); + +/** + * Set the TMMBR received callback. + * @param[in] cbs LinphoneCallCbs object. + * @param[in] cb The TMMBR received callback to be used. + */ +LINPHONE_PUBLIC void linphone_call_cbs_set_tmmbr_received(LinphoneCallCbs *cbs, LinphoneCallCbsTmmbrReceivedCb cb); + /** * @} */ diff --git a/include/linphone/api/c-callbacks.h b/include/linphone/api/c-callbacks.h index f8b796a00..339963691 100644 --- a/include/linphone/api/c-callbacks.h +++ b/include/linphone/api/c-callbacks.h @@ -87,6 +87,14 @@ typedef void (*LinphoneCallCbsTransferStateChangedCb)(LinphoneCall *call, Linpho */ typedef void (*LinphoneCallCbsAckProcessingCb)(LinphoneCall *call, LinphoneHeaders *ack, bool_t is_received); +/** + * Callback for notifying a received TMMBR. + * @param call LinphoneCall for which the TMMBR has changed + * @param stream_index the index of the current stream + * @param tmmbr the value of the received TMMBR + */ +typedef void (*LinphoneCallCbsTmmbrReceivedCb)(LinphoneCall *call, int stream_index, int tmmbr); + /** * @} **/ diff --git a/src/c-wrapper/api/c-call-cbs.cpp b/src/c-wrapper/api/c-call-cbs.cpp index 17b521e40..903dfa26a 100644 --- a/src/c-wrapper/api/c-call-cbs.cpp +++ b/src/c-wrapper/api/c-call-cbs.cpp @@ -33,6 +33,7 @@ struct _LinphoneCallCbs { LinphoneCallCbsStatsUpdatedCb statsUpdatedCb; LinphoneCallCbsTransferStateChangedCb transferStateChangedCb; LinphoneCallCbsAckProcessingCb ackProcessing; + LinphoneCallCbsTmmbrReceivedCb tmmbrReceivedCb; }; BELLE_SIP_DECLARE_VPTR_NO_EXPORT(LinphoneCallCbs); @@ -124,3 +125,11 @@ LinphoneCallCbsAckProcessingCb linphone_call_cbs_get_ack_processing (LinphoneCal void linphone_call_cbs_set_ack_processing (LinphoneCallCbs *cbs, LinphoneCallCbsAckProcessingCb cb){ cbs->ackProcessing = cb; } + +LinphoneCallCbsTmmbrReceivedCb linphone_call_cbs_get_tmmbr_received (LinphoneCallCbs *cbs) { + return cbs->tmmbrReceivedCb; +} + +void linphone_call_cbs_set_tmmbr_received (LinphoneCallCbs *cbs, LinphoneCallCbsTmmbrReceivedCb cb) { + cbs->tmmbrReceivedCb = cb; +} diff --git a/src/c-wrapper/api/c-call.cpp b/src/c-wrapper/api/c-call.cpp index 07159bfc4..0fa450fa5 100644 --- a/src/c-wrapper/api/c-call.cpp +++ b/src/c-wrapper/api/c-call.cpp @@ -206,6 +206,10 @@ void linphone_call_notify_ack_processing (LinphoneCall *call, LinphoneHeaders *m NOTIFY_IF_EXIST(AckProcessing, ack_processing, call, msg, is_received) } +void linphone_call_notify_tmmbr_received (LinphoneCall *call, int stream_index, int tmmbr) { + NOTIFY_IF_EXIST(TmmbrReceived, tmmbr_received, call, stream_index, tmmbr) +} + // ============================================================================= // Public functions. diff --git a/src/call/call-p.h b/src/call/call-p.h index 7b2754ff6..0477198df 100644 --- a/src/call/call-p.h +++ b/src/call/call-p.h @@ -110,6 +110,7 @@ private: bool areSoundResourcesAvailable (const std::shared_ptr &session) override; bool isPlayingRingbackTone (const std::shared_ptr &session) override; void onRealTimeTextCharacterReceived (const std::shared_ptr &session, RealtimeTextReceivedCharacter *character) override; + void onTmmbrReceived(const std::shared_ptr &session, int streamIndex, int tmmbr) override; mutable LinphonePlayer *player = nullptr; diff --git a/src/call/call.cpp b/src/call/call.cpp index f60387011..6d51ce781 100644 --- a/src/call/call.cpp +++ b/src/call/call.cpp @@ -491,6 +491,11 @@ void CallPrivate::onRealTimeTextCharacterReceived (const shared_ptr getChatRoom()->getPrivate()->realtimeTextReceived(data->character, q->getSharedFromThis()); } +void CallPrivate::onTmmbrReceived (const shared_ptr &session, int streamIndex, int tmmbr) { + L_Q(); + linphone_call_notify_tmmbr_received(L_GET_C_BACK_PTR(q), streamIndex, tmmbr); +} + // ============================================================================= Call::Call (CallPrivate &p, shared_ptr core) : Object(p), CoreAccessor(core) { diff --git a/src/conference/session/call-session-listener.h b/src/conference/session/call-session-listener.h index a334614ea..edc634f22 100644 --- a/src/conference/session/call-session-listener.h +++ b/src/conference/session/call-session-listener.h @@ -54,6 +54,7 @@ public: virtual void onIncomingCallSessionTimeoutCheck (const std::shared_ptr &session, int elapsed, bool oneSecondElapsed) {} virtual void onInfoReceived (const std::shared_ptr &session, const LinphoneInfoMessage *im) {} virtual void onNoMediaTimeoutCheck (const std::shared_ptr &session, bool oneSecondElapsed) {} + virtual void onTmmbrReceived (const std::shared_ptr &session, int streamIndex, int tmmbr) {} virtual void onEncryptionChanged (const std::shared_ptr &session, bool activated, const std::string &authToken) {} diff --git a/src/conference/session/media-session.cpp b/src/conference/session/media-session.cpp index d79b6a34a..955bcbb4e 100644 --- a/src/conference/session/media-session.cpp +++ b/src/conference/session/media-session.cpp @@ -2238,6 +2238,7 @@ void MediaSessionPrivate::handleIceEvents (OrtpEvent *ev) { } void MediaSessionPrivate::handleStreamEvents (int streamIndex) { + L_Q(); MediaStream *ms = (streamIndex == mainAudioStreamIndex) ? &audioStream->ms : (streamIndex == mainVideoStreamIndex ? &videoStream->ms : &textStream->ms); if (ms) { @@ -2272,14 +2273,28 @@ void MediaSessionPrivate::handleStreamEvents (int streamIndex) { stats = videoStats; else stats = textStats; + + OrtpEventType evt = ortp_event_get_type(ev); + OrtpEventData *evd = ortp_event_get_data(ev); + + /*This MUST be done before any call to "linphone_call_stats_fill" since it has ownership over evd->packet*/ + if (evt == ORTP_EVENT_RTCP_PACKET_RECEIVED) { + do { + if (evd->packet && rtcp_is_RTPFB(evd->packet)) { + if (rtcp_RTPFB_get_type(evd->packet) == RTCP_RTPFB_TMMBR) { + listener->onTmmbrReceived(q->getSharedFromThis(), streamIndex, (int)rtcp_RTPFB_tmmbr_get_max_bitrate(evd->packet)); + } + } + } while (rtcp_next_packet(evd->packet)); + rtcp_rewind(evd->packet); + } + /* And yes the MediaStream must be taken at each iteration, because it may have changed due to the handling of events * in this loop*/ ms = getMediaStream(streamIndex); if (ms) linphone_call_stats_fill(stats, ms, ev); notifyStatsUpdated(streamIndex); - OrtpEventType evt = ortp_event_get_type(ev); - OrtpEventData *evd = ortp_event_get_data(ev); if (evt == ORTP_EVENT_ZRTP_ENCRYPTION_CHANGED) { if (streamIndex == mainAudioStreamIndex) audioStreamEncryptionChanged(!!evd->info.zrtp_stream_encrypted); diff --git a/tester/call_video_tester.c b/tester/call_video_tester.c index cf55ad1f1..d74fbd2f8 100644 --- a/tester/call_video_tester.c +++ b/tester/call_video_tester.c @@ -2008,6 +2008,70 @@ static void video_call_with_thin_congestion(void){ linphone_core_manager_destroy(pauline); } +static void on_tmmbr_received(LinphoneCall *call, int stream_index, int tmmbr) { + if (stream_index == _linphone_call_get_main_video_stream_index(call)) { + stats* stat = get_stats(linphone_call_get_core(call)); + stat->tmmbr_received_from_cb = tmmbr; + } +} + +static void call_created(LinphoneCore *lc, LinphoneCall *call) { + LinphoneCallCbs *cbs = linphone_factory_create_call_cbs(linphone_factory_get()); + linphone_call_cbs_set_tmmbr_received(cbs, on_tmmbr_received); + linphone_call_add_callbacks(call, cbs); + linphone_call_cbs_unref(cbs); +} + +/* + * This test simulates a higher bandwith available from marie than expected. + * The stream from pauline to marie is not under test. + * It checks that after a few seconds marie received a TMMBR with the approximate value corresponding to the new bandwidth. + * +**/ +static void video_call_with_high_bandwidth_available(void) { + LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); + LinphoneCoreManager *pauline = linphone_core_manager_new("pauline_rc"); + LinphoneVideoPolicy pol = {0}; + OrtpNetworkSimulatorParams simparams = { 0 }; + LinphoneCoreCbs *core_cbs = linphone_factory_create_core_cbs(linphone_factory_get()); + + linphone_core_set_video_device(marie->lc, "Mire: Mire (synthetic moving picture)"); + linphone_core_enable_video_capture(marie->lc, TRUE); + linphone_core_enable_video_display(marie->lc, TRUE); + linphone_core_enable_video_capture(pauline->lc, TRUE); + linphone_core_enable_video_display(pauline->lc, TRUE); + + pol.automatically_accept = TRUE; + pol.automatically_initiate = TRUE; + linphone_core_set_video_policy(marie->lc, &pol); + linphone_core_set_video_policy(pauline->lc, &pol); + + linphone_core_set_preferred_video_size_by_name(marie->lc, "vga"); + simparams.mode = OrtpNetworkSimulatorOutbound; + simparams.enabled = TRUE; + simparams.max_bandwidth = 1000000; + simparams.max_buffer_size = (int)simparams.max_bandwidth; + simparams.latency = 60; + + linphone_core_set_network_simulator_params(marie->lc, &simparams); + + linphone_core_cbs_set_call_created(core_cbs, call_created); + linphone_core_add_callbacks(marie->lc, core_cbs); + + if (BC_ASSERT_TRUE(call(marie, pauline))){ + /*wait a little in order to have traffic*/ + BC_ASSERT_TRUE(wait_for_until(marie->lc, pauline->lc, NULL, 5, 50000)); + + BC_ASSERT_GREATER((float)marie->stat.last_tmmbr_value_received, 870000.f, float, "%f"); + BC_ASSERT_LOWER((float)marie->stat.last_tmmbr_value_received, 1150000.f, float, "%f"); + + end_call(marie, pauline); + } + linphone_core_cbs_unref(core_cbs); + linphone_core_manager_destroy(marie); + linphone_core_manager_destroy(pauline); +} + test_t call_video_tests[] = { #ifdef VIDEO_ENABLED TEST_NO_TAG("Call paused resumed with video", call_paused_resumed_with_video), @@ -2073,10 +2137,11 @@ test_t call_video_tests[] = { TEST_NO_TAG("Classic video entry phone setup", classic_video_entry_phone_setup), TEST_NO_TAG("Incoming REINVITE with invalid SDP in ACK", incoming_reinvite_with_invalid_ack_sdp), TEST_NO_TAG("Outgoing REINVITE with invalid SDP in ACK", outgoing_reinvite_with_invalid_ack_sdp), -#endif TEST_NO_TAG("Video call with no audio and no video codec", video_call_with_no_audio_and_no_video_codec), TEST_NO_TAG("Call with early media and no SDP in 200 Ok with video", call_with_early_media_and_no_sdp_in_200_with_video), - TEST_NO_TAG("Video call with thin congestion", video_call_with_thin_congestion) + TEST_NO_TAG("Video call with thin congestion", video_call_with_thin_congestion), + TEST_NO_TAG("Video call with high bandwidth available", video_call_with_high_bandwidth_available) +#endif }; test_suite_t call_video_test_suite = {"Video Call", NULL, NULL, liblinphone_tester_before_each, liblinphone_tester_after_each, diff --git a/tester/liblinphone_tester.h b/tester/liblinphone_tester.h index 7e07493d0..9824c2084 100644 --- a/tester/liblinphone_tester.h +++ b/tester/liblinphone_tester.h @@ -283,6 +283,7 @@ typedef struct _stats { int number_of_rtcp_generic_nack; int number_of_tmmbr_received; int last_tmmbr_value_received; + int tmmbr_received_from_cb; int number_of_participants_added; int number_of_participant_admin_statuses_changed; From 1207501da26b2e2861ff091c72f761c86b988eb9 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 15 Mar 2018 14:00:57 +0100 Subject: [PATCH 247/281] Started to restore external body url feature in chat message --- src/c-wrapper/api/c-chat-message.cpp | 2 +- src/chat/chat-message/chat-message-p.h | 2 ++ src/chat/chat-message/chat-message.cpp | 8 ++++++++ src/chat/chat-room/chat-room.cpp | 9 +++++++-- .../modifier/file-transfer-chat-message-modifier.cpp | 4 ++++ src/chat/modifier/file-transfer-chat-message-modifier.h | 1 + 6 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/c-wrapper/api/c-chat-message.cpp b/src/c-wrapper/api/c-chat-message.cpp index 333d6a94e..902055f9a 100644 --- a/src/c-wrapper/api/c-chat-message.cpp +++ b/src/c-wrapper/api/c-chat-message.cpp @@ -108,7 +108,7 @@ const char *linphone_chat_message_get_external_body_url(const LinphoneChatMessag } void linphone_chat_message_set_external_body_url(LinphoneChatMessage *msg, const char *url) { - + L_GET_PRIVATE_FROM_C_OBJECT(msg)->setExternalBodyUrl(L_C_TO_STRING(url)); } time_t linphone_chat_message_get_time(const LinphoneChatMessage *msg) { diff --git a/src/chat/chat-message/chat-message-p.h b/src/chat/chat-message/chat-message-p.h index 764de0d96..42cbb58e6 100644 --- a/src/chat/chat-message/chat-message-p.h +++ b/src/chat/chat-message/chat-message-p.h @@ -105,6 +105,7 @@ public: std::string getSalCustomHeaderValue (const std::string &name); void loadFileTransferUrlFromBodyToContent (); + std::string createFakeFileTransferFromUrl(const std::string &url); void setChatRoom (const std::shared_ptr &chatRoom); @@ -127,6 +128,7 @@ public: void setAppdata (const std::string &appData); const std::string &getExternalBodyUrl () const; + void setExternalBodyUrl (const std::string &url); bool hasTextContent () const; const Content* getTextContent () const; diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index 487a052af..ead18f02c 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -263,6 +263,10 @@ const string &ChatMessagePrivate::getExternalBodyUrl () const { return Utils::getEmptyConstRefObject(); } +void ChatMessagePrivate::setExternalBodyUrl (const string &url) { + //TODO +} + const ContentType &ChatMessagePrivate::getContentType () { loadContentsFromDatabase(); if (direction == ChatMessage::Direction::Incoming) { @@ -390,6 +394,10 @@ void ChatMessagePrivate::loadFileTransferUrlFromBodyToContent() { fileTransferChatMessageModifier.decode(q->getSharedFromThis(), errorCode); } +std::string ChatMessagePrivate::createFakeFileTransferFromUrl(const std::string &url) { + return fileTransferChatMessageModifier.createFakeFileTransferFromUrl(url); +} + void ChatMessagePrivate::setChatRoom (const shared_ptr &cr) { chatRoom = cr; chatRoomId = cr->getChatRoomId(); diff --git a/src/chat/chat-room/chat-room.cpp b/src/chat/chat-room/chat-room.cpp index 9404bba69..8f69fda03 100644 --- a/src/chat/chat-room/chat-room.cpp +++ b/src/chat/chat-room/chat-room.cpp @@ -193,8 +193,13 @@ LinphoneReason ChatRoomPrivate::onSipMessageReceived (SalOp *op, const SalMessag ); Content content; - content.setContentType(message->content_type); - content.setBodyFromUtf8(message->text ? message->text : ""); + if (message->url && strcmp(message->content_type, ContentType::ExternalBody.asString().c_str()) == 0) { + content.setContentType(ContentType::FileTransfer); + content.setBody(msg->getPrivate()->createFakeFileTransferFromUrl(message->url)); + } else { + content.setContentType(message->content_type); + content.setBodyFromUtf8(message->text ? message->text : ""); + } msg->setInternalContent(content); msg->getPrivate()->setTime(message->time); diff --git a/src/chat/modifier/file-transfer-chat-message-modifier.cpp b/src/chat/modifier/file-transfer-chat-message-modifier.cpp index 1da43ae8d..8dd98988d 100644 --- a/src/chat/modifier/file-transfer-chat-message-modifier.cpp +++ b/src/chat/modifier/file-transfer-chat-message-modifier.cpp @@ -968,4 +968,8 @@ void FileTransferChatMessageModifier::releaseHttpRequest () { } } +string FileTransferChatMessageModifier::createFakeFileTransferFromUrl(const string &url) { + return ""; //TODO +} + LINPHONE_END_NAMESPACE diff --git a/src/chat/modifier/file-transfer-chat-message-modifier.h b/src/chat/modifier/file-transfer-chat-message-modifier.h index 99a7cbf2e..d6d9af736 100644 --- a/src/chat/modifier/file-transfer-chat-message-modifier.h +++ b/src/chat/modifier/file-transfer-chat-message-modifier.h @@ -63,6 +63,7 @@ public: int downloadFile(const std::shared_ptr &message, FileTransferContent *fileTransferContent); void cancelFileTransfer(); bool isFileTransferInProgressAndValid(); + std::string createFakeFileTransferFromUrl(const std::string &url); private: int uploadFile(); From 166b0a5d62e391e5eddf17a58d1f3acc4facd012 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 15 Mar 2018 14:09:42 +0100 Subject: [PATCH 248/281] Send message with external body url if exists --- src/chat/chat-message/chat-message-p.h | 1 + src/chat/chat-message/chat-message.cpp | 13 ++++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/chat/chat-message/chat-message-p.h b/src/chat/chat-message/chat-message-p.h index 42cbb58e6..b665e0d1f 100644 --- a/src/chat/chat-message/chat-message-p.h +++ b/src/chat/chat-message/chat-message-p.h @@ -163,6 +163,7 @@ private: time_t time = ::ms_time(0); // TODO: Change me in all files. std::string imdnId; std::string rttMessage; + std::string externalBodyUrl; bool isSecured = false; mutable bool isReadOnly = false; Content internalContent; diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index ead18f02c..86b126cfa 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -256,6 +256,9 @@ void ChatMessagePrivate::setAppdata (const string &data) { } const string &ChatMessagePrivate::getExternalBodyUrl () const { + if (!externalBodyUrl.empty()) { + return externalBodyUrl; + } if (hasFileTransferContent()) { FileTransferContent *content = (FileTransferContent*) getFileTransferContent(); return content->getFileUrl(); @@ -264,7 +267,7 @@ const string &ChatMessagePrivate::getExternalBodyUrl () const { } void ChatMessagePrivate::setExternalBodyUrl (const string &url) { - //TODO + externalBodyUrl = url; } const ContentType &ChatMessagePrivate::getContentType () { @@ -719,14 +722,18 @@ void ChatMessagePrivate::send () { if (internalContent.isEmpty()) { if (contents.size() > 0) { internalContent = *(contents.front()); - } else { + } else if (!externalBodyUrl.empty()) { // When using external body url, there is no content lError() << "Trying to send a message without any content !"; return; } } auto msgOp = dynamic_cast(op); - if (internalContent.getContentType().isValid()) { + if (!externalBodyUrl.empty()) { + char *content_type = ms_strdup_printf("message/external-body; access-type=URL; URL=\"%s\"", externalBodyUrl); + msgOp->send_message(content_type, NULL); + ms_free(content_type); + } else if (internalContent.getContentType().isValid()) { msgOp->send_message(internalContent.getContentType().asString().c_str(), internalContent.getBodyAsUtf8String().c_str()); } else { msgOp->send_message(ContentType::PlainText.asString().c_str(), internalContent.getBodyAsUtf8String().c_str()); From 3fd55c4a2bb81be4449d297bfebdbdbce4a01f1d Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 15 Mar 2018 14:31:57 +0100 Subject: [PATCH 249/281] Fixes + tests for external body URL --- src/c-wrapper/api/c-chat-room.cpp | 7 +++- src/chat/chat-message/chat-message.cpp | 4 +-- src/chat/chat-room/chat-room.cpp | 2 ++ tester/message_tester.c | 48 ++++++++++++++++++++++++++ 4 files changed, 58 insertions(+), 3 deletions(-) diff --git a/src/c-wrapper/api/c-chat-room.cpp b/src/c-wrapper/api/c-chat-room.cpp index e549964e0..91dbad4c0 100644 --- a/src/c-wrapper/api/c-chat-room.cpp +++ b/src/c-wrapper/api/c-chat-room.cpp @@ -113,7 +113,12 @@ const LinphoneAddress *linphone_chat_room_get_local_address (LinphoneChatRoom *c } LinphoneChatMessage *linphone_chat_room_create_message (LinphoneChatRoom *cr, const char *message) { - shared_ptr cppPtr = L_GET_CPP_PTR_FROM_C_OBJECT(cr)->createChatMessage(L_C_TO_STRING(message)); + shared_ptr cppPtr; + if (message && strlen(message) > 0) { + cppPtr = L_GET_CPP_PTR_FROM_C_OBJECT(cr)->createChatMessage(L_C_TO_STRING(message)); + } else { + cppPtr = L_GET_CPP_PTR_FROM_C_OBJECT(cr)->createChatMessage(); + } LinphoneChatMessage *object = L_INIT(ChatMessage); L_SET_CPP_PTR_FROM_C_OBJECT(object, cppPtr); return object; diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index 86b126cfa..7e12324ee 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -722,7 +722,7 @@ void ChatMessagePrivate::send () { if (internalContent.isEmpty()) { if (contents.size() > 0) { internalContent = *(contents.front()); - } else if (!externalBodyUrl.empty()) { // When using external body url, there is no content + } else if (externalBodyUrl.empty()) { // When using external body url, there is no content lError() << "Trying to send a message without any content !"; return; } @@ -730,7 +730,7 @@ void ChatMessagePrivate::send () { auto msgOp = dynamic_cast(op); if (!externalBodyUrl.empty()) { - char *content_type = ms_strdup_printf("message/external-body; access-type=URL; URL=\"%s\"", externalBodyUrl); + char *content_type = ms_strdup_printf("message/external-body; access-type=URL; URL=\"%s\"", externalBodyUrl.c_str()); msgOp->send_message(content_type, NULL); ms_free(content_type); } else if (internalContent.getContentType().isValid()) { diff --git a/src/chat/chat-room/chat-room.cpp b/src/chat/chat-room/chat-room.cpp index 8f69fda03..cbd6ef4c3 100644 --- a/src/chat/chat-room/chat-room.cpp +++ b/src/chat/chat-room/chat-room.cpp @@ -26,6 +26,7 @@ #include "chat/chat-room/chat-room-p.h" #include "core/core-p.h" #include "sip-tools/sip-headers.h" +#include "logger/logger.h" // ============================================================================= @@ -194,6 +195,7 @@ LinphoneReason ChatRoomPrivate::onSipMessageReceived (SalOp *op, const SalMessag Content content; if (message->url && strcmp(message->content_type, ContentType::ExternalBody.asString().c_str()) == 0) { + lInfo() << "Received a message with an external body URL " << message->url; content.setContentType(ContentType::FileTransfer); content.setBody(msg->getPrivate()->createFakeFileTransferFromUrl(message->url)); } else { diff --git a/tester/message_tester.c b/tester/message_tester.c index 0d639eac0..cfca82130 100644 --- a/tester/message_tester.c +++ b/tester/message_tester.c @@ -730,6 +730,52 @@ static void file_transfer_2_messages_simultaneously(void) { } } +static void file_transfer_external_body_url(bool_t use_file_body_handler_in_download) { + LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc"); + LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc"); + LinphoneChatRoom* chat_room = linphone_core_get_chat_room(marie->lc, pauline->identity); + LinphoneChatMessage* msg = linphone_chat_room_create_message(chat_room, NULL); + LinphoneChatMessageCbs *cbs = linphone_chat_message_get_callbacks(msg); + char *receive_filepath = bc_tester_file("receive_file.dump"); + + linphone_chat_message_set_external_body_url(msg, "https://www.linphone.org/img/linphone-open-source-voip-projectX2.png"); + linphone_chat_message_cbs_set_msg_state_changed(cbs, liblinphone_tester_chat_message_msg_state_changed); + linphone_chat_room_send_chat_message(chat_room, msg); + linphone_chat_message_unref(msg); + + BC_ASSERT_TRUE(wait_for_until(pauline->lc, marie->lc, &pauline->stat.number_of_LinphoneMessageReceivedWithFile, 1, 60000)); + + if (pauline->stat.last_received_chat_message) { + LinphoneChatMessage *recv_msg = pauline->stat.last_received_chat_message; + cbs = linphone_chat_message_get_callbacks(recv_msg); + linphone_chat_message_cbs_set_msg_state_changed(cbs, liblinphone_tester_chat_message_msg_state_changed); + linphone_chat_message_cbs_set_file_transfer_recv(cbs, file_transfer_received); + linphone_chat_message_cbs_set_file_transfer_progress_indication(cbs, file_transfer_progress_indication); + if (use_file_body_handler_in_download) { + /* Remove any previously downloaded file */ + remove(receive_filepath); + linphone_chat_message_set_file_transfer_filepath(recv_msg, receive_filepath); + } + linphone_chat_message_download_file(recv_msg); + + /* wait for a long time in case the DNS SRV resolution takes times - it should be immediate though */ + BC_ASSERT_TRUE(wait_for_until(pauline->lc, marie->lc, &pauline->stat.number_of_LinphoneFileTransferDownloadSuccessful, 1, 55000)); + } + + remove(receive_filepath); + bc_free(receive_filepath); + linphone_core_manager_destroy(marie); + linphone_core_manager_destroy(pauline); +} + +static void file_transfer_using_external_body_url(void) { + file_transfer_external_body_url(FALSE); +} + +static void file_transfer_using_external_body_url_2(void) { + file_transfer_external_body_url(TRUE); +} + static void text_message_denied(void) { LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc"); @@ -2439,6 +2485,8 @@ test_t message_tests[] = { TEST_NO_TAG("Transfer message upload cancelled", transfer_message_upload_cancelled), TEST_NO_TAG("Transfer message download cancelled", transfer_message_download_cancelled), TEST_NO_TAG("Transfer 2 messages simultaneously", file_transfer_2_messages_simultaneously), + TEST_NO_TAG("Transfer using external body URL", file_transfer_using_external_body_url), + TEST_NO_TAG("Transfer using external body URL 2", file_transfer_using_external_body_url_2), TEST_NO_TAG("Text message denied", text_message_denied), TEST_NO_TAG("IsComposing notification", is_composing_notification), TEST_NO_TAG("IMDN notifications", imdn_notifications), From a36a3c55cfdd3957d331c14daae5be69a10238f7 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 15 Mar 2018 14:43:53 +0100 Subject: [PATCH 250/281] Finished fake file transfer xml from external body url --- .../modifier/file-transfer-chat-message-modifier.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/chat/modifier/file-transfer-chat-message-modifier.cpp b/src/chat/modifier/file-transfer-chat-message-modifier.cpp index 8dd98988d..f0eeef84e 100644 --- a/src/chat/modifier/file-transfer-chat-message-modifier.cpp +++ b/src/chat/modifier/file-transfer-chat-message-modifier.cpp @@ -969,7 +969,16 @@ void FileTransferChatMessageModifier::releaseHttpRequest () { } string FileTransferChatMessageModifier::createFakeFileTransferFromUrl(const string &url) { - return ""; //TODO + string fileName = url.substr(url.find_last_of("/") + 1); + stringstream fakeXml; + fakeXml << "\r\n"; + fakeXml << "\r\n"; + fakeXml << "" << fileName << "\r\n"; + fakeXml << "application/binary\r\n"; + fakeXml << "\r\n"; + fakeXml << "\r\n"; + fakeXml << ""; + return fakeXml.str(); } LINPHONE_END_NAMESPACE From 5fb17f6598c7a7de5e82434d257775aa96ff5106 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 15 Mar 2018 15:06:35 +0100 Subject: [PATCH 251/281] Split first line of fake xml in two --- src/chat/modifier/file-transfer-chat-message-modifier.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/chat/modifier/file-transfer-chat-message-modifier.cpp b/src/chat/modifier/file-transfer-chat-message-modifier.cpp index f0eeef84e..b320de965 100644 --- a/src/chat/modifier/file-transfer-chat-message-modifier.cpp +++ b/src/chat/modifier/file-transfer-chat-message-modifier.cpp @@ -971,7 +971,8 @@ void FileTransferChatMessageModifier::releaseHttpRequest () { string FileTransferChatMessageModifier::createFakeFileTransferFromUrl(const string &url) { string fileName = url.substr(url.find_last_of("/") + 1); stringstream fakeXml; - fakeXml << "\r\n"; + fakeXml << "\r\n" + fakeXml << "\r\n"; fakeXml << "\r\n"; fakeXml << "" << fileName << "\r\n"; fakeXml << "application/binary\r\n"; From 23287aae21b9fdd56bb99e2c2438211cdbbe9f5c Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 15 Mar 2018 15:25:43 +0100 Subject: [PATCH 252/281] Forgot ; --- src/chat/modifier/file-transfer-chat-message-modifier.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chat/modifier/file-transfer-chat-message-modifier.cpp b/src/chat/modifier/file-transfer-chat-message-modifier.cpp index b320de965..d9d0767b2 100644 --- a/src/chat/modifier/file-transfer-chat-message-modifier.cpp +++ b/src/chat/modifier/file-transfer-chat-message-modifier.cpp @@ -971,7 +971,7 @@ void FileTransferChatMessageModifier::releaseHttpRequest () { string FileTransferChatMessageModifier::createFakeFileTransferFromUrl(const string &url) { string fileName = url.substr(url.find_last_of("/") + 1); stringstream fakeXml; - fakeXml << "\r\n" + fakeXml << "\r\n"; fakeXml << "\r\n"; fakeXml << "\r\n"; fakeXml << "" << fileName << "\r\n"; From f58ba4083e00cd8c1b15135f3deb6788144f085c Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 15 Mar 2018 15:46:45 +0100 Subject: [PATCH 253/281] Moved appData from FileContent to any Content --- src/chat/chat-message/chat-message.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index 7e12324ee..4781424be 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -236,23 +236,23 @@ void ChatMessagePrivate::setFileTransferFilepath (const string &path) { const string &ChatMessagePrivate::getAppdata () const { for (const Content *c : getContents()) { - if (c->isFile()) { - FileContent *fileContent = (FileContent *)c; - return fileContent->getAppData("legacy"); + if (!c->getAppData("legacy").empty()) { + return c->getAppData("legacy"); } } return Utils::getEmptyConstRefObject(); } void ChatMessagePrivate::setAppdata (const string &data) { - for (const Content *c : getContents()) { - if (c->isFile()) { - FileContent *fileContent = (FileContent *)c; - fileContent->setAppData("legacy", data); - break; - } + bool contentFound = false; + for (Content *c : getContents()) { + c->setAppData("legacy", data); + contentFound = true; + break; + } + if (contentFound) { + updateInDb(); } - updateInDb(); } const string &ChatMessagePrivate::getExternalBodyUrl () const { From 032f6cd91a276879a3c97959b446f61d80f85554 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Thu, 15 Mar 2018 15:57:59 +0100 Subject: [PATCH 254/281] When creating a message with no text, create an empty Content so we can use it to store an appData --- src/c-wrapper/api/c-chat-room.cpp | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/c-wrapper/api/c-chat-room.cpp b/src/c-wrapper/api/c-chat-room.cpp index 91dbad4c0..e549964e0 100644 --- a/src/c-wrapper/api/c-chat-room.cpp +++ b/src/c-wrapper/api/c-chat-room.cpp @@ -113,12 +113,7 @@ const LinphoneAddress *linphone_chat_room_get_local_address (LinphoneChatRoom *c } LinphoneChatMessage *linphone_chat_room_create_message (LinphoneChatRoom *cr, const char *message) { - shared_ptr cppPtr; - if (message && strlen(message) > 0) { - cppPtr = L_GET_CPP_PTR_FROM_C_OBJECT(cr)->createChatMessage(L_C_TO_STRING(message)); - } else { - cppPtr = L_GET_CPP_PTR_FROM_C_OBJECT(cr)->createChatMessage(); - } + shared_ptr cppPtr = L_GET_CPP_PTR_FROM_C_OBJECT(cr)->createChatMessage(L_C_TO_STRING(message)); LinphoneChatMessage *object = L_INIT(ChatMessage); L_SET_CPP_PTR_FROM_C_OBJECT(object, cppPtr); return object; From bcf1baaff13ddd7299fe08dc49152a15109a8196 Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Fri, 16 Mar 2018 11:04:08 +0100 Subject: [PATCH 255/281] Wait for file transfer to be downloaded before sending Displayed IMDN --- src/chat/chat-message/chat-message.cpp | 8 +++++- src/chat/chat-room/chat-room.cpp | 7 +++-- tester/message_tester.c | 36 +++++++++++++++++++------- 3 files changed, 38 insertions(+), 13 deletions(-) diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index 4781424be..579f44343 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -147,7 +147,13 @@ void ChatMessagePrivate::setState (ChatMessage::State newState, bool force) { if (cbs && linphone_chat_message_cbs_get_msg_state_changed(cbs)) linphone_chat_message_cbs_get_msg_state_changed(cbs)(msg, (LinphoneChatMessageState)state); - updateInDb(); + if (state == ChatMessage::State::FileTransferDone && !hasFileTransferContent()) { + // We wait until the file has been downloaded to send the displayed IMDN + q->sendDisplayNotification(); + setState(ChatMessage::State::Displayed); + } else { + updateInDb(); + } } belle_http_request_t *ChatMessagePrivate::getHttpRequest () const { diff --git a/src/chat/chat-room/chat-room.cpp b/src/chat/chat-room/chat-room.cpp index cbd6ef4c3..1eb64ce00 100644 --- a/src/chat/chat-room/chat-room.cpp +++ b/src/chat/chat-room/chat-room.cpp @@ -445,8 +445,11 @@ void ChatRoom::markAsRead () { CorePrivate *dCore = getCore()->getPrivate(); for (auto &chatMessage : dCore->mainDb->getUnreadChatMessages(d->chatRoomId)) { - chatMessage->sendDisplayNotification(); - chatMessage->getPrivate()->setState(ChatMessage::State::Displayed, true); + // Do not send display notification for file transfer until it has been downloaded (it won't have a file transfer content anymore) + if (!chatMessage->getPrivate()->hasFileTransferContent()) { + chatMessage->sendDisplayNotification(); + chatMessage->getPrivate()->setState(ChatMessage::State::Displayed, true); // True will ensure the setState won't update the database so it will be done below by the markChatMessagesAsRead + } } dCore->mainDb->markChatMessagesAsRead(d->chatRoomId); diff --git a/tester/message_tester.c b/tester/message_tester.c index cfca82130..396f4b9c4 100644 --- a/tester/message_tester.c +++ b/tester/message_tester.c @@ -503,9 +503,13 @@ void transfer_message_base2(LinphoneCoreManager* marie, LinphoneCoreManager* pau } else { BC_ASSERT_TRUE(wait_for_until(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneMessageReceivedWithFile,1, 60000)); if (marie->stat.last_received_chat_message) { + LinphoneChatRoom *marie_room = linphone_core_get_chat_room(marie->lc, pauline->identity); + linphone_chat_room_mark_as_read(marie_room); + // We shoudln't get displayed IMDN until file has been downloaded + BC_ASSERT_FALSE(wait_for_until(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneMessageDisplayed,1, 5000)); + LinphoneChatMessage *recv_msg; if (download_from_history) { - LinphoneChatRoom *marie_room = linphone_core_get_chat_room(marie->lc, pauline->identity); msg_list = linphone_chat_room_get_history(marie_room,1); BC_ASSERT_PTR_NOT_NULL(msg_list); if (!msg_list) goto end; @@ -529,12 +533,13 @@ void transfer_message_base2(LinphoneCoreManager* marie, LinphoneCoreManager* pau belle_http_provider_set_recv_error(linphone_core_get_http_provider(marie->lc), -1); BC_ASSERT_TRUE(wait_for_until(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneMessageNotDelivered,1, 10000)); belle_http_provider_set_recv_error(linphone_core_get_http_provider(marie->lc), 0); + BC_ASSERT_FALSE(wait_for_until(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneMessageDisplayed,1, 5000)); } else { /* wait for a long time in case the DNS SRV resolution takes times - it should be immediate though */ if (BC_ASSERT_TRUE(wait_for_until(pauline->lc,marie->lc,&marie->stat.number_of_LinphoneFileTransferDownloadSuccessful,1,55000))) { compare_files(send_filepath, receive_filepath); - } + BC_ASSERT_TRUE(wait_for_until(pauline->lc,marie->lc,&pauline->stat.number_of_LinphoneMessageDisplayed,1, 5000)); } } BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneMessageInProgress,2, int, "%d"); //sent twice because of file transfer @@ -549,41 +554,48 @@ end: } void transfer_message_base(bool_t upload_error, bool_t download_error, bool_t use_file_body_handler_in_upload, - bool_t use_file_body_handler_in_download, bool_t download_from_history) { + bool_t use_file_body_handler_in_download, bool_t download_from_history, bool_t enable_imdn) { if (transport_supported(LinphoneTransportTls)) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc"); + + if (enable_imdn) { + lp_config_set_int(linphone_core_get_config(pauline->lc), "sip", "deliver_imdn", 1); + lp_config_set_int(linphone_core_get_config(marie->lc), "sip", "deliver_imdn", 1); + linphone_im_notif_policy_enable_all(linphone_core_get_im_notif_policy(marie->lc)); + linphone_im_notif_policy_enable_all(linphone_core_get_im_notif_policy(pauline->lc)); + } transfer_message_base2(marie,pauline,upload_error,download_error, use_file_body_handler_in_upload, use_file_body_handler_in_download, download_from_history); linphone_core_manager_destroy(pauline); linphone_core_manager_destroy(marie); } } static void transfer_message(void) { - transfer_message_base(FALSE, FALSE, FALSE, FALSE, FALSE); + transfer_message_base(FALSE, FALSE, FALSE, FALSE, FALSE, TRUE); } static void transfer_message_2(void) { - transfer_message_base(FALSE, FALSE, TRUE, FALSE, FALSE); + transfer_message_base(FALSE, FALSE, TRUE, FALSE, FALSE, TRUE); } static void transfer_message_3(void) { - transfer_message_base(FALSE, FALSE, FALSE, TRUE, FALSE); + transfer_message_base(FALSE, FALSE, FALSE, TRUE, FALSE, TRUE); } static void transfer_message_4(void) { - transfer_message_base(FALSE, FALSE, TRUE, TRUE, FALSE); + transfer_message_base(FALSE, FALSE, TRUE, TRUE, FALSE, TRUE); } static void transfer_message_from_history(void) { - transfer_message_base(FALSE, FALSE, TRUE, TRUE, TRUE); + transfer_message_base(FALSE, FALSE, TRUE, TRUE, TRUE, TRUE); } static void transfer_message_with_upload_io_error(void) { - transfer_message_base(TRUE, FALSE, FALSE, FALSE, FALSE); + transfer_message_base(TRUE, FALSE, FALSE, FALSE, FALSE, TRUE); } static void transfer_message_with_download_io_error(void) { - transfer_message_base(FALSE, TRUE, FALSE, FALSE, FALSE); + transfer_message_base(FALSE, TRUE, FALSE, FALSE, FALSE, TRUE); } static void transfer_message_upload_cancelled(void) { @@ -2176,6 +2188,10 @@ void file_transfer_with_http_proxy(void) { if (transport_supported(LinphoneTransportTls)) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc"); + lp_config_set_int(linphone_core_get_config(pauline->lc), "sip", "deliver_imdn", 1); + lp_config_set_int(linphone_core_get_config(marie->lc), "sip", "deliver_imdn", 1); + linphone_im_notif_policy_enable_all(linphone_core_get_im_notif_policy(marie->lc)); + linphone_im_notif_policy_enable_all(linphone_core_get_im_notif_policy(pauline->lc)); linphone_core_set_http_proxy_host(marie->lc, "sip.linphone.org"); transfer_message_base2(marie,pauline,FALSE,FALSE,FALSE,FALSE,FALSE); linphone_core_manager_destroy(pauline); From 5ec972c98dad2b92d0e3665f8d4b7422b60f3cb6 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 16 Mar 2018 14:32:41 +0100 Subject: [PATCH 256/281] Improve Content-Type and Content-Disposition handling. --- src/CMakeLists.txt | 2 + src/chat/chat-message/chat-message.cpp | 2 +- src/chat/chat-room/chat-room.cpp | 4 +- src/chat/chat-room/client-group-chat-room.cpp | 6 +- src/chat/chat-room/server-group-chat-room-p.h | 2 +- src/conference/local-conference.cpp | 3 +- src/content/content-disposition.cpp | 86 +++++++++++++++++++ src/content/content-disposition.h | 59 +++++++++++++ src/content/content-p.h | 3 +- src/content/content.cpp | 9 +- src/content/content.h | 6 +- src/sal/call-op.cpp | 13 ++- tester/multipart-tester.cpp | 4 +- 13 files changed, 175 insertions(+), 24 deletions(-) create mode 100644 src/content/content-disposition.cpp create mode 100644 src/content/content-disposition.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fbca16af0..ca182139f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -92,6 +92,7 @@ set(LINPHONE_CXX_OBJECTS_PRIVATE_HEADER_FILES conference/session/media-session.h conference/session/port-config.h containers/lru-cache.h + content/content-disposition.h content/content-manager.h content/content-p.h content/content-type.h @@ -215,6 +216,7 @@ set(LINPHONE_CXX_OBJECTS_SOURCE_FILES conference/remote-conference.cpp conference/session/call-session.cpp conference/session/media-session.cpp + content/content-disposition.cpp content/content-manager.cpp content/content-type.cpp content/content.cpp diff --git a/src/chat/chat-message/chat-message.cpp b/src/chat/chat-message/chat-message.cpp index 579f44343..eb2d1f029 100644 --- a/src/chat/chat-message/chat-message.cpp +++ b/src/chat/chat-message/chat-message.cpp @@ -427,7 +427,7 @@ void ChatMessagePrivate::sendImdn (Imdn::Type imdnType, LinphoneReason reason) { shared_ptr msg = q->getChatRoom()->createChatMessage(); Content *content = new Content(); - content->setContentType("message/imdn+xml"); + content->setContentType(ContentType::Imdn); content->setBody(Imdn::createXml(imdnId, time, imdnType, reason)); msg->addContent(*content); diff --git a/src/chat/chat-room/chat-room.cpp b/src/chat/chat-room/chat-room.cpp index 1eb64ce00..28106b50d 100644 --- a/src/chat/chat-room/chat-room.cpp +++ b/src/chat/chat-room/chat-room.cpp @@ -194,12 +194,12 @@ LinphoneReason ChatRoomPrivate::onSipMessageReceived (SalOp *op, const SalMessag ); Content content; - if (message->url && strcmp(message->content_type, ContentType::ExternalBody.asString().c_str()) == 0) { + if (message->url && (ContentType(message->content_type) == ContentType::ExternalBody)) { lInfo() << "Received a message with an external body URL " << message->url; content.setContentType(ContentType::FileTransfer); content.setBody(msg->getPrivate()->createFakeFileTransferFromUrl(message->url)); } else { - content.setContentType(message->content_type); + content.setContentType(ContentType(message->content_type)); content.setBodyFromUtf8(message->text ? message->text : ""); } msg->setInternalContent(content); diff --git a/src/chat/chat-room/client-group-chat-room.cpp b/src/chat/chat-room/client-group-chat-room.cpp index 496be28ac..29c872d30 100644 --- a/src/chat/chat-room/client-group-chat-room.cpp +++ b/src/chat/chat-room/client-group-chat-room.cpp @@ -27,6 +27,8 @@ #include "conference/participant-p.h" #include "conference/remote-conference-p.h" #include "conference/session/call-session-p.h" +#include "content/content-disposition.h" +#include "content/content-type.h" #include "core/core-p.h" #include "logger/logger.h" #include "sal/refer-op.h" @@ -308,8 +310,8 @@ void ClientGroupChatRoom::addParticipants ( Content content; content.setBody(getResourceLists(addressesList)); - content.setContentType("application/resource-lists+xml"); - content.setContentDisposition("recipient-list"); + content.setContentType(ContentType::ResourceLists); + content.setContentDisposition(ContentDisposition::RecipientList); // TODO: Activate compression //if (linphone_core_content_encoding_supported(getCore()->getCCore(), "deflate")) // content.setContentEncoding("deflate"); diff --git a/src/chat/chat-room/server-group-chat-room-p.h b/src/chat/chat-room/server-group-chat-room-p.h index f31326ad0..911f31f67 100644 --- a/src/chat/chat-room/server-group-chat-room-p.h +++ b/src/chat/chat-room/server-group-chat-room-p.h @@ -68,7 +68,7 @@ public: private: struct Message { - Message (const std::string &from, const std::string &contentType, const std::string &text, const SalCustomHeader *salCustomHeaders) + Message (const std::string &from, const ContentType &contentType, const std::string &text, const SalCustomHeader *salCustomHeaders) : fromAddr(from) { content.setContentType(contentType); diff --git a/src/conference/local-conference.cpp b/src/conference/local-conference.cpp index fe06f6464..847400131 100644 --- a/src/conference/local-conference.cpp +++ b/src/conference/local-conference.cpp @@ -18,6 +18,7 @@ */ #include "content/content.h" +#include "content/content-disposition.h" #include "content/content-type.h" #include "handlers/local-conference-event-handler.h" #include "local-conference-p.h" @@ -70,7 +71,7 @@ void LocalConference::removeParticipant (const shared_ptr &pa list LocalConference::parseResourceLists (const Content &content) { if ((content.getContentType() == ContentType::ResourceLists) - && (content.getContentDisposition() == "recipient-list") + && (content.getContentDisposition() == ContentDisposition::RecipientList) ) { istringstream data(content.getBodyAsString()); unique_ptr rl(Xsd::ResourceLists::parseResourceLists( diff --git a/src/content/content-disposition.cpp b/src/content/content-disposition.cpp new file mode 100644 index 000000000..f8dc53ce4 --- /dev/null +++ b/src/content/content-disposition.cpp @@ -0,0 +1,86 @@ +/* + * content-disposition.cpp + * Copyright (C) 2010-2018 Belledonne Communications SARL + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "linphone/utils/utils.h" + +#include "content-disposition.h" +#include "object/clonable-object-p.h" + +// ============================================================================= + +using namespace std; + +LINPHONE_BEGIN_NAMESPACE + +// ----------------------------------------------------------------------------- + +class ContentDispositionPrivate : public ClonableObjectPrivate { +public: + string disposition; +}; + +// ----------------------------------------------------------------------------- + +const ContentDisposition ContentDisposition::RecipientList("recipient-list"); + +// ----------------------------------------------------------------------------- + +ContentDisposition::ContentDisposition (const string &disposition) : ClonableObject(*new ContentDispositionPrivate) { + L_D(); + d->disposition = disposition; +} + +ContentDisposition::ContentDisposition (const ContentDisposition &other) + : ContentDisposition(other.getPrivate()->disposition) {} + +ContentDisposition &ContentDisposition::operator= (const ContentDisposition &other) { + L_D(); + if (this != &other) { + d->disposition = other.getPrivate()->disposition; + } + return *this; +} + +bool ContentDisposition::operator== (const ContentDisposition &other) const { + L_D(); + return d->disposition == other.getPrivate()->disposition; +} + +bool ContentDisposition::operator!= (const ContentDisposition &other) const { + return !(*this == other); +} + +bool ContentDisposition::isEmpty () const { + L_D(); + return d->disposition.empty(); +} + +bool ContentDisposition::isValid () const { + L_D(); + return !d->disposition.empty(); +} + +string ContentDisposition::asString () const { + L_D(); + if (isValid()) + return d->disposition; + return ""; +} + +LINPHONE_END_NAMESPACE diff --git a/src/content/content-disposition.h b/src/content/content-disposition.h new file mode 100644 index 000000000..c9668d379 --- /dev/null +++ b/src/content/content-disposition.h @@ -0,0 +1,59 @@ +/* + * content-disposition.h + * Copyright (C) 2010-2018 Belledonne Communications SARL + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef _L_CONTENT_DISPOSITION_H_ +#define _L_CONTENT_DISPOSITION_H_ + +#include "object/clonable-object.h" + +// ============================================================================= + +LINPHONE_BEGIN_NAMESPACE + +class ContentDispositionPrivate; + +class LINPHONE_PUBLIC ContentDisposition : public ClonableObject { +public: + explicit ContentDisposition (const std::string &contentDisposition = ""); + ContentDisposition (const ContentDisposition &other); + + ContentDisposition &operator= (const ContentDisposition &other); + + bool operator== (const ContentDisposition &other) const; + bool operator!= (const ContentDisposition &other) const; + + // Delete these operators to prevent putting complicated content-disposition strings + // in the code. Instead define static const ContentDisposition objects below. + bool operator== (const std::string &other) const = delete; + bool operator!= (const std::string &other) const = delete; + + bool isEmpty () const; + bool isValid () const; + + std::string asString () const; + + static const ContentDisposition RecipientList; + +private: + L_DECLARE_PRIVATE(ContentDisposition); +}; + +LINPHONE_END_NAMESPACE + +#endif // ifndef _L_CONTENT_DISPOSITION_H_ diff --git a/src/content/content-p.h b/src/content/content-p.h index d0b8738c6..167712313 100644 --- a/src/content/content-p.h +++ b/src/content/content-p.h @@ -20,6 +20,7 @@ #ifndef _L_CONTENT_P_H_ #define _L_CONTENT_P_H_ +#include "content-disposition.h" #include "content-type.h" #include "content.h" #include "object/clonable-object-p.h" @@ -32,7 +33,7 @@ class ContentPrivate : public ClonableObjectPrivate { private: std::vector body; ContentType contentType; - std::string contentDisposition; + ContentDisposition contentDisposition; std::string contentEncoding; std::list> headers; diff --git a/src/content/content.cpp b/src/content/content.cpp index c538141cf..aa30503d4 100644 --- a/src/content/content.cpp +++ b/src/content/content.cpp @@ -110,17 +110,12 @@ void Content::setContentType (const ContentType &contentType) { d->contentType = contentType; } -void Content::setContentType (const string &contentType) { - L_D(); - d->contentType = ContentType(contentType); -} - -const string &Content::getContentDisposition () const { +const ContentDisposition &Content::getContentDisposition () const { L_D(); return d->contentDisposition; } -void Content::setContentDisposition (const string &contentDisposition) { +void Content::setContentDisposition (const ContentDisposition &contentDisposition) { L_D(); d->contentDisposition = contentDisposition; } diff --git a/src/content/content.h b/src/content/content.h index d3be11f51..c570670c5 100644 --- a/src/content/content.h +++ b/src/content/content.h @@ -32,6 +32,7 @@ L_DECL_C_STRUCT(LinphoneContent); LINPHONE_BEGIN_NAMESPACE +class ContentDisposition; class ContentType; class ContentPrivate; @@ -49,10 +50,9 @@ public: const ContentType &getContentType () const; void setContentType (const ContentType &contentType); - void setContentType (const std::string &contentType); - const std::string &getContentDisposition () const; - void setContentDisposition (const std::string &contentDisposition); + const ContentDisposition &getContentDisposition () const; + void setContentDisposition (const ContentDisposition &contentDisposition); const std::string &getContentEncoding () const; void setContentEncoding (const std::string &contentEncoding); diff --git a/src/sal/call-op.cpp b/src/sal/call-op.cpp index 5a8583479..a73c021ea 100644 --- a/src/sal/call-op.cpp +++ b/src/sal/call-op.cpp @@ -24,6 +24,7 @@ #include #include +#include "content/content-disposition.h" #include "content/content-type.h" using namespace std; @@ -102,7 +103,7 @@ belle_sip_header_allow_t *SalCallOp::create_allow(bool_t enable_update) { int SalCallOp::set_custom_body(belle_sip_message_t *msg, const Content &body) { ContentType contentType = body.getContentType(); - string contentDisposition = body.getContentDisposition(); + auto contentDisposition = body.getContentDisposition(); string contentEncoding = body.getContentEncoding(); size_t bodySize = body.getBody().size(); @@ -115,8 +116,10 @@ int SalCallOp::set_custom_body(belle_sip_message_t *msg, const Content &body) { 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)); } - if (!contentDisposition.empty()) { - belle_sip_header_content_disposition_t *contentDispositionHeader = belle_sip_header_content_disposition_create(contentDisposition.c_str()); + if (contentDisposition.isValid()) { + belle_sip_header_content_disposition_t *contentDispositionHeader = belle_sip_header_content_disposition_create( + contentDisposition.asString().c_str() + ); belle_sip_message_add_header(msg, BELLE_SIP_HEADER(contentDispositionHeader)); } if (!contentEncoding.empty()) @@ -243,7 +246,9 @@ Content SalCallOp::extract_body(belle_sip_message_t *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)); + body.setContentDisposition( + ContentDisposition(belle_sip_header_content_disposition_get_content_disposition(contentDisposition)) + ); if (length > 0 && body_str) body.setBody(body_str, length); return body; } diff --git a/tester/multipart-tester.cpp b/tester/multipart-tester.cpp index ad5d731f3..3fdd9073a 100644 --- a/tester/multipart-tester.cpp +++ b/tester/multipart-tester.cpp @@ -50,7 +50,7 @@ static void chat_message_multipart_modifier_base(bool first_file_transfer, bool if (first_file_transfer) { char *send_filepath = bc_tester_res("sounds/sintel_trailer_opus_h264.mkv"); FileContent *content = new FileContent(); - content->setContentType("video/mkv"); + content->setContentType(ContentType("video/mkv")); content->setFilePath(send_filepath); content->setFileName("sintel_trailer_opus_h264.mkv"); marieMessage->addContent(*content); @@ -65,7 +65,7 @@ static void chat_message_multipart_modifier_base(bool first_file_transfer, bool if (second_file_transfer) { char *send_filepath = bc_tester_res("vcards/vcards.vcf"); FileContent *content = new FileContent(); - content->setContentType("file/vcf"); + content->setContentType(ContentType("file/vcf")); content->setFilePath(send_filepath); content->setFileName("vcards.vcf"); marieMessage->addContent(*content); From 01394ff75ce51cd424ef8aaae2d74d13dc75c1ed Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 16 Mar 2018 14:55:55 +0100 Subject: [PATCH 257/281] Use unique_ptr for StunClient and IceAgent objects. --- src/conference/session/media-session-p.h | 6 +++--- src/conference/session/media-session.cpp | 7 ++----- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/conference/session/media-session-p.h b/src/conference/session/media-session-p.h index 6ee6ac50a..7b014e138 100644 --- a/src/conference/session/media-session-p.h +++ b/src/conference/session/media-session-p.h @@ -74,7 +74,7 @@ public: void setParams (MediaSessionParams *msp); void setRemoteParams (MediaSessionParams *msp); - IceSession *getIceSession () const { return iceAgent->getIceSession(); } + IceSession *getIceSession () const { return iceAgent ? iceAgent->getIceSession() : nullptr; } SalMediaDescription *getLocalDesc () const { return localDesc; } @@ -284,8 +284,8 @@ private: int mainTextStreamIndex = LINPHONE_CALL_STATS_TEXT; LinphoneNatPolicy *natPolicy = nullptr; - StunClient *stunClient = nullptr; - IceAgent *iceAgent = nullptr; + std::unique_ptr stunClient; + std::unique_ptr iceAgent; // The address family to prefer for RTP path, guessed from signaling path. int af; diff --git a/src/conference/session/media-session.cpp b/src/conference/session/media-session.cpp index 955bcbb4e..32ae463c6 100644 --- a/src/conference/session/media-session.cpp +++ b/src/conference/session/media-session.cpp @@ -1177,7 +1177,7 @@ string MediaSessionPrivate::getPublicIpForStream (int streamIndex) { void MediaSessionPrivate::runStunTestsIfNeeded () { L_Q(); if (linphone_nat_policy_stun_enabled(natPolicy) && !(linphone_nat_policy_ice_enabled(natPolicy) || linphone_nat_policy_turn_enabled(natPolicy))) { - stunClient = new StunClient(q->getCore()); + stunClient = makeUnique(q->getCore()); int ret = stunClient->run(mediaPorts[mainAudioStreamIndex].rtpPort, mediaPorts[mainVideoStreamIndex].rtpPort, mediaPorts[mainTextStreamIndex].rtpPort); if (ret >= 0) pingTime = ret; @@ -3939,7 +3939,7 @@ MediaSession::MediaSession (const shared_ptr &core, shared_ptrsetPortConfig(d->mainTextStreamIndex, make_pair(minPort, maxPort)); memset(d->sessions, 0, sizeof(d->sessions)); - d->iceAgent = new IceAgent(*this); + d->iceAgent = makeUnique(*this); lInfo() << "New MediaSession [" << this << "] initialized (LinphoneCore version: " << linphone_core_get_version() << ")"; } @@ -3957,9 +3957,6 @@ MediaSession::~MediaSession () { linphone_call_stats_unref(d->textStats); if (d->natPolicy) linphone_nat_policy_unref(d->natPolicy); - if (d->stunClient) - delete d->stunClient; - delete d->iceAgent; if (d->localDesc) sal_media_description_unref(d->localDesc); if (d->biggestDesc) From 0cf7325c4b53921d1b6a61ac486149beea77516d Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 16 Mar 2018 15:58:48 +0100 Subject: [PATCH 258/281] Fix memory leak with proxy config routes. --- coreapi/proxy.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/coreapi/proxy.c b/coreapi/proxy.c index 067b95790..bad2e9aa4 100644 --- a/coreapi/proxy.c +++ b/coreapi/proxy.c @@ -1228,7 +1228,10 @@ LinphoneProxyConfig *linphone_proxy_config_new_from_config_file(LinphoneCore* lc CONFIGURE_STRING_VALUE(cfg,config,key,identity,"reg_identity") CONFIGURE_STRING_VALUE(cfg,config,key,server_addr,"reg_proxy") - linphone_proxy_config_set_routes(cfg, linphone_config_get_string_list(config, key, "reg_route", NULL)); + bctbx_list_t *routes = linphone_config_get_string_list(config, key, "reg_route", NULL); + linphone_proxy_config_set_routes(cfg, routes); + if (routes) + bctbx_list_free_with_data(routes, (bctbx_list_free_func)bctbx_free); CONFIGURE_STRING_VALUE(cfg,config,key,realm,"realm") From 3a0bcc675a2ad5ef205297cfb3a79a943cb339c6 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Fri, 16 Mar 2018 16:55:51 +0100 Subject: [PATCH 259/281] Some more improvements to Content-Type and Content-Disposition handling. --- include/linphone/utils/utils.h | 2 ++ src/content/content-disposition.cpp | 31 ++++++++++++++++++++++++----- src/content/content-disposition.h | 4 ++++ src/content/content-type.cpp | 8 ++++---- src/utils/utils.cpp | 6 ++++++ 5 files changed, 42 insertions(+), 9 deletions(-) diff --git a/include/linphone/utils/utils.h b/include/linphone/utils/utils.h index 7200ec935..e13c89889 100644 --- a/include/linphone/utils/utils.h +++ b/include/linphone/utils/utils.h @@ -107,6 +107,8 @@ namespace Utils { return str ? str : ""; } + LINPHONE_PUBLIC std::string trim (const std::string &str); + template LINPHONE_PUBLIC const T &getEmptyConstRefObject () { static const T object; diff --git a/src/content/content-disposition.cpp b/src/content/content-disposition.cpp index f8dc53ce4..ccaf7da15 100644 --- a/src/content/content-disposition.cpp +++ b/src/content/content-disposition.cpp @@ -33,33 +33,40 @@ LINPHONE_BEGIN_NAMESPACE class ContentDispositionPrivate : public ClonableObjectPrivate { public: string disposition; + string parameter; }; // ----------------------------------------------------------------------------- const ContentDisposition ContentDisposition::RecipientList("recipient-list"); +const ContentDisposition ContentDisposition::RecipientListHistory("recipient-list-history; handling=optional"); // ----------------------------------------------------------------------------- ContentDisposition::ContentDisposition (const string &disposition) : ClonableObject(*new ContentDispositionPrivate) { L_D(); - d->disposition = disposition; + size_t posParam = disposition.find(";"); + d->disposition = Utils::trim(disposition.substr(0, posParam)); + if (posParam != string::npos) + setParameter(Utils::trim(disposition.substr(posParam + 1))); } ContentDisposition::ContentDisposition (const ContentDisposition &other) - : ContentDisposition(other.getPrivate()->disposition) {} + : ContentDisposition(other.asString()) {} ContentDisposition &ContentDisposition::operator= (const ContentDisposition &other) { L_D(); if (this != &other) { d->disposition = other.getPrivate()->disposition; + setParameter(other.getParameter()); } return *this; } bool ContentDisposition::operator== (const ContentDisposition &other) const { L_D(); - return d->disposition == other.getPrivate()->disposition; + return d->disposition == other.getPrivate()->disposition + && getParameter() == other.getParameter(); } bool ContentDisposition::operator!= (const ContentDisposition &other) const { @@ -76,10 +83,24 @@ bool ContentDisposition::isValid () const { return !d->disposition.empty(); } +const string &ContentDisposition::getParameter () const { + L_D(); + return d->parameter; +} + +void ContentDisposition::setParameter (const string ¶meter) { + L_D(); + d->parameter = parameter; +} + string ContentDisposition::asString () const { L_D(); - if (isValid()) - return d->disposition; + if (isValid()) { + string asString = d->disposition; + if (!d->parameter.empty()) + asString += ";" + d->parameter; + return asString; + } return ""; } diff --git a/src/content/content-disposition.h b/src/content/content-disposition.h index c9668d379..6f2fcc9ca 100644 --- a/src/content/content-disposition.h +++ b/src/content/content-disposition.h @@ -46,9 +46,13 @@ public: bool isEmpty () const; bool isValid () const; + const std::string &getParameter () const; + void setParameter (const std::string ¶meter); + std::string asString () const; static const ContentDisposition RecipientList; + static const ContentDisposition RecipientListHistory; private: L_DECLARE_PRIVATE(ContentDisposition); diff --git a/src/content/content-type.cpp b/src/content/content-type.cpp index 97a0ad488..78c356af6 100644 --- a/src/content/content-type.cpp +++ b/src/content/content-type.cpp @@ -56,20 +56,20 @@ ContentType::ContentType (const string &contentType) : ClonableObject(*new Conte L_D(); size_t pos = contentType.find('/'); - size_t posParam = contentType.find("; "); + size_t posParam = contentType.find(";"); size_t end = contentType.length(); if (pos == string::npos) return; - if (setType(contentType.substr(0, pos))) { + if (setType(Utils::trim(contentType.substr(0, pos)))) { if (posParam != string::npos) end = posParam; - if (!setSubType(contentType.substr(pos + 1, end - (pos + 1)))) + if (!setSubType(Utils::trim(contentType.substr(pos + 1, end - (pos + 1))))) d->type.clear(); } if (posParam != string::npos) - setParameter(contentType.substr(posParam + 2)); // We remove the blankspace after the ;. + setParameter(Utils::trim(contentType.substr(posParam + 1))); } ContentType::ContentType (const string &type, const string &subType) : ClonableObject(*new ContentTypePrivate) { diff --git a/src/utils/utils.cpp b/src/utils/utils.cpp index c9d1b8442..eb5ba94d2 100644 --- a/src/utils/utils.cpp +++ b/src/utils/utils.cpp @@ -175,6 +175,12 @@ char *Utils::utf8ToChar (uint32_t ic) { return result; } +string Utils::trim (const string &str) { + auto itFront = find_if_not(str.begin(), str.end(), [] (int c) { return isspace(c); }); + auto itBack = find_if_not(str.rbegin(), str.rend(), [] (int c) { return isspace(c); }).base(); + return (itBack <= itFront ? string() : string(itFront, itBack)); +} + // ----------------------------------------------------------------------------- tm Utils::getTimeTAsTm (time_t time) { From 6c7c56271a261af359a587a06916d8309f47003f Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Sat, 17 Mar 2018 12:05:49 +0100 Subject: [PATCH 260/281] Implement deferred ICE reinvite response when the ICE session isn't yet completed. --- src/conference/session/call-session-p.h | 1 + src/conference/session/call-session.cpp | 7 +++--- src/conference/session/media-session-p.h | 2 +- src/conference/session/media-session.cpp | 26 +++++++++++++++++++- src/nat/ice-agent.cpp | 31 ++++++++++++++++++++++++ src/nat/ice-agent.h | 5 ++++ 6 files changed, 67 insertions(+), 5 deletions(-) diff --git a/src/conference/session/call-session-p.h b/src/conference/session/call-session-p.h index fc62e4e43..d8dbed101 100644 --- a/src/conference/session/call-session-p.h +++ b/src/conference/session/call-session-p.h @@ -134,6 +134,7 @@ protected: bool broken = false; bool deferIncomingNotification = false; bool deferUpdate = false; + bool deferUpdateInternal = false; bool needLocalIpRefresh = false; bool nonOpError = false; /* Set when the LinphoneErrorInfo was set at higher level than sal */ bool notifyRinging = true; diff --git a/src/conference/session/call-session.cpp b/src/conference/session/call-session.cpp index 2aad40f1a..2b6d0da8d 100644 --- a/src/conference/session/call-session.cpp +++ b/src/conference/session/call-session.cpp @@ -467,9 +467,10 @@ void CallSessionPrivate::updated (bool isUpdate) { void CallSessionPrivate::updatedByRemote () { L_Q(); setState(CallSession::State::UpdatedByRemote,"Call updated by remote"); - if (deferUpdate) { - if (state == CallSession::State::UpdatedByRemote) - lInfo() << "CallSession [" << q << "]: UpdatedByRemoted was signaled but defered. LinphoneCore expects the application to call CallSession::acceptUpdate() later"; + if (deferUpdate || deferUpdateInternal) { + if (state == CallSession::State::UpdatedByRemote && !deferUpdateInternal){ + lInfo() << "CallSession [" << q << "]: UpdatedByRemoted was signaled but defered. LinphoneCore expects the application to call linphone_call_accept_update() later"; + } } else { if (state == CallSession::State::UpdatedByRemote) q->acceptUpdate(nullptr); diff --git a/src/conference/session/media-session-p.h b/src/conference/session/media-session-p.h index 7b014e138..7013e7b18 100644 --- a/src/conference/session/media-session-p.h +++ b/src/conference/session/media-session-p.h @@ -254,7 +254,6 @@ private: int sendDtmf (); void stunAuthRequestedCb (const char *realm, const char *nonce, const char **username, const char **password, const char **ha1); - private: static const std::string ecStateStore; static const int ecStateMaxLen; @@ -325,6 +324,7 @@ private: bool automaticallyPaused = false; bool pausedByApp = false; bool recordActive = false; + bool incomingIceReinvitePending = false; std::string onHoldFile; diff --git a/src/conference/session/media-session.cpp b/src/conference/session/media-session.cpp index 32ae463c6..c240343f7 100644 --- a/src/conference/session/media-session.cpp +++ b/src/conference/session/media-session.cpp @@ -382,6 +382,8 @@ void MediaSessionPrivate::updated (bool isUpdate) { CallSessionPrivate::updated(isUpdate); } + + void MediaSessionPrivate::updating (bool isUpdate) { L_Q(); SalMediaDescription *rmd = op->get_remote_media_description(); @@ -702,6 +704,10 @@ shared_ptr MediaSessionPrivate::getMe () const { void MediaSessionPrivate::setState (CallSession::State newState, const string &message) { L_Q(); + SalMediaDescription *rmd; + + lInfo()<<"MediaSessionPrivate::setState"; + /* Take a ref on the session otherwise it might get destroyed during the call to setState */ shared_ptr sessionRef = q->getSharedFromThis(); if ((newState != state) && (newState != CallSession::State::StreamsRunning)) @@ -709,6 +715,21 @@ void MediaSessionPrivate::setState (CallSession::State newState, const string &m CallSessionPrivate::setState(newState, message); if (listener) listener->onCallSessionStateChangedForReporting(q->getSharedFromThis()); + switch(newState){ + case CallSession::State::UpdatedByRemote: + /*Handle specifically the case of an incoming ICE-concluded reINVITE*/ + lInfo()<<"Checking for ICE reINVITE"; + rmd = op->get_remote_media_description(); + if (iceAgent && rmd != nullptr && iceAgent->checkIceReinviteNeedsDeferedResponse(rmd)){ + deferUpdate = true; + deferUpdateInternal = true; + incomingIceReinvitePending = true; + lInfo()<<"CallSession [" << q << "]: ICE reinvite received, but one or more check-lists are not completed. Response will be sent later, when ICE has completed"; + } + break; + default: + break; + } } // ----------------------------------------------------------------------------- @@ -2191,11 +2212,14 @@ void MediaSessionPrivate::handleIceEvents (OrtpEvent *ev) { OrtpEventData *evd = ortp_event_get_data(ev); if (evt == ORTP_EVENT_ICE_SESSION_PROCESSING_FINISHED) { if (iceAgent->hasCompletedCheckList()) { - /* At least one ICE session has succeeded, so perform a call update */ + /* The ICE session has succeeded, so perform a call update */ if (iceAgent->isControlling() && q->getCurrentParams()->getPrivate()->getUpdateCallWhenIceCompleted()) { MediaSessionParams newParams(*getParams()); newParams.getPrivate()->setInternalCallUpdate(true); q->update(&newParams); + }else if (!iceAgent->isControlling() && incomingIceReinvitePending){ + q->acceptUpdate(nullptr); + incomingIceReinvitePending = false; } startDtlsOnAllStreams(); } diff --git a/src/nat/ice-agent.cpp b/src/nat/ice-agent.cpp index 4c98340fd..726312f9f 100644 --- a/src/nat/ice-agent.cpp +++ b/src/nat/ice-agent.cpp @@ -738,4 +738,35 @@ void IceAgent::updateIceStateInCallStatsForStream (LinphoneCallStats *stats, Ice } } +bool IceAgent::checkIceReinviteNeedsDeferedResponse(SalMediaDescription *md){ + int i,j; + IceCheckList *cl; + + if (!iceSession) return false; + + if (ice_session_state(iceSession) != IS_Running ) return false; + + for (i = 0; i < md->nb_streams; i++) { + SalStreamDescription *stream = &md->streams[i]; + cl = ice_session_check_list(iceSession, i); + + if (cl==NULL) continue; + if (stream->ice_mismatch == TRUE) { + return false; + } + if (stream->rtp_port == 0) { + continue; + } + + if (ice_check_list_state(cl) != ICL_Running) continue; + + for (j = 0; j < SAL_MEDIA_DESCRIPTION_MAX_ICE_CANDIDATES; j++) { + const SalIceRemoteCandidate *remote_candidate = &stream->ice_remote_candidates[j]; + if (remote_candidate->addr[0] != '\0') return true; + + } + } + return false; +} + LINPHONE_END_NAMESPACE diff --git a/src/nat/ice-agent.h b/src/nat/ice-agent.h index 3af487df1..0e702010b 100644 --- a/src/nat/ice-agent.h +++ b/src/nat/ice-agent.h @@ -66,6 +66,11 @@ public: void updateFromRemoteMediaDescription (const SalMediaDescription *localDesc, const SalMediaDescription *remoteDesc, bool isOffer); void updateIceStateInCallStats (); void updateLocalMediaDescriptionFromIce (SalMediaDescription *desc); + /* + * Checks if an incoming offer with ICE needs a delayed answer, because the ice session hasn't completed yet with + * connecvity checks. + */ + bool checkIceReinviteNeedsDeferedResponse(SalMediaDescription *md); private: void addLocalIceCandidates (int family, const char *addr, IceCheckList *audioCl, IceCheckList *videoCl, IceCheckList *textCl); From 5a985ca79d9bf8018f0c191fdf27ef7c4ebde597 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Thu, 14 Sep 2017 13:08:30 +0200 Subject: [PATCH 261/281] update proxy config etag on status PublishOk. It allows PUBLISH to be consistent over network state changes, avoiding orphan tuples to remain server side. --- coreapi/proxy.c | 32 +++++-- tester/presence_server_tester.c | 149 ++++++++++++++++++++++++++++++++ tester/presence_tester.c | 101 +--------------------- 3 files changed, 174 insertions(+), 108 deletions(-) diff --git a/coreapi/proxy.c b/coreapi/proxy.c index bad2e9aa4..e9a3641a4 100644 --- a/coreapi/proxy.c +++ b/coreapi/proxy.c @@ -826,6 +826,13 @@ LinphoneAddress* linphone_proxy_config_normalize_sip_uri(LinphoneProxyConfig *pr return NULL; } +void linphone_proxy_config_set_etag(LinphoneProxyConfig *cfg,const char* sip_etag) { + if (cfg->sip_etag) ms_free(cfg->sip_etag); + if (sip_etag) + cfg->sip_etag = ms_strdup(sip_etag); + else + cfg->sip_etag = NULL; +} /** * Commits modification made to the proxy configuration. **/ @@ -867,11 +874,7 @@ LinphoneStatus linphone_proxy_config_done(LinphoneProxyConfig *cfg) ms_message("Publish params have changed on proxy config [%p]",cfg); if (cfg->presence_publish_event) { if (cfg->publish) { - const char * sip_etag = linphone_event_get_custom_header(cfg->presence_publish_event, "SIP-ETag"); - if (sip_etag) { - if (cfg->sip_etag) ms_free(cfg->sip_etag); - cfg->sip_etag = ms_strdup(sip_etag); - } + linphone_proxy_config_set_etag(cfg, linphone_event_get_custom_header(cfg->presence_publish_event, "SIP-ETag")); } /*publish is terminated*/ linphone_event_terminate(cfg->presence_publish_event); @@ -1542,9 +1545,22 @@ void linphone_proxy_config_set_nat_policy(LinphoneProxyConfig *cfg, LinphoneNatP } void linphone_proxy_config_notify_publish_state_changed(LinphoneProxyConfig *cfg, LinphonePublishState state) { - if ((cfg->presence_publish_event != NULL) && ((state == LinphonePublishCleared) || (state == LinphonePublishError))) { - linphone_event_unref(cfg->presence_publish_event); - cfg->presence_publish_event = NULL; + + if (cfg->presence_publish_event != NULL) { + switch (state) { + case LinphonePublishCleared: + linphone_proxy_config_set_etag(cfg,NULL); + case LinphonePublishError: + linphone_event_unref(cfg->presence_publish_event); + cfg->presence_publish_event = NULL; + break; + case LinphonePublishOk: + linphone_proxy_config_set_etag(cfg,linphone_event_get_custom_header(cfg->presence_publish_event, "SIP-ETag")); + break; + default: + break; + + } } } diff --git a/tester/presence_server_tester.c b/tester/presence_server_tester.c index 5f9f0bf7d..62bb8a364 100644 --- a/tester/presence_server_tester.c +++ b/tester/presence_server_tester.c @@ -1571,8 +1571,157 @@ static void extended_notify_sub_unsub_sub2(void) { bctbx_list_free(lcs); } +static void simple_publish_with_expire(int expires) { + LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); + LinphoneProxyConfig* proxy; + LinphonePresenceModel* presence; + LinphoneCoreCbs *cbs = linphone_factory_create_core_cbs(linphone_factory_get()); + + linphone_core_cbs_set_publish_state_changed(cbs, linphone_publish_state_changed); + _linphone_core_add_callbacks(marie->lc, cbs, TRUE); + linphone_core_cbs_unref(cbs); + + proxy = linphone_core_get_default_proxy_config(marie->lc); + linphone_proxy_config_edit(proxy); + if (expires > 0) { + linphone_proxy_config_set_publish_expires(proxy,expires); + } + linphone_proxy_config_enable_publish(proxy,TRUE); + linphone_proxy_config_done(proxy); + + BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishProgress,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishOk,1)); + + presence = linphone_presence_model_new(); + linphone_presence_model_set_basic_status(presence, LinphonePresenceBasicStatusClosed); + linphone_core_set_presence_model(marie->lc,presence); + linphone_presence_model_unref(presence); + + BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishProgress,2)); + BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishOk,2)); + + linphone_proxy_config_edit(proxy); + linphone_proxy_config_done(proxy); + /*make sure no publish is sent*/ + BC_ASSERT_FALSE(wait_for_until(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishProgress,3,2000)); + + linphone_proxy_config_edit(proxy); + linphone_proxy_config_enable_publish(proxy,FALSE); + linphone_proxy_config_done(proxy); + + + /*fixme PUBLISH state machine is too simple, clear state should only be propagated at API level when 200ok is received*/ + /*BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishProgress,3));*/ + wait_for_until(marie->lc,marie->lc,NULL,0,2000); + BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishCleared,1)); + + linphone_proxy_config_edit(proxy); + linphone_proxy_config_enable_publish(proxy,TRUE); + linphone_proxy_config_done(proxy); + BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishProgress,3)); + BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishOk,3)); + + linphone_proxy_config_edit(proxy); + linphone_proxy_config_set_publish_expires(proxy, linphone_proxy_config_get_publish_expires(proxy)+1); + linphone_proxy_config_done(proxy); + BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishProgress,4)); + BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishOk,4)); + + linphone_core_manager_stop(marie); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishCleared,3,int,"%i"); /*yes it is 3 because when we change the expires, a new LinphoneEvent is created*/ + BC_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishOk,4,int,"%i"); + linphone_core_manager_destroy(marie); +} + +static void simple_publish(void) { + simple_publish_with_expire(-1); +} + +static void publish_with_expires(void) { + simple_publish_with_expire(2); +} + +static void publish_with_dual_identity(void) { + LinphoneCoreManager* pauline = linphone_core_manager_new("multi_account_rc"); + const bctbx_list_t* proxies; + LinphoneCoreCbs *cbs = linphone_factory_create_core_cbs(linphone_factory_get()); + + linphone_core_cbs_set_publish_state_changed(cbs, linphone_publish_state_changed); + _linphone_core_add_callbacks(pauline->lc, cbs, TRUE); + linphone_core_cbs_unref(cbs); + + for (proxies = linphone_core_get_proxy_config_list(pauline->lc); proxies!=NULL; proxies = proxies->next) { + LinphoneProxyConfig *proxy = (LinphoneProxyConfig *) proxies->data; + linphone_proxy_config_edit(proxy); + linphone_proxy_config_enable_publish(proxy,TRUE); + linphone_proxy_config_done(proxy); + } + + BC_ASSERT_TRUE(wait_for(pauline->lc,pauline->lc,&pauline->stat.number_of_LinphonePublishProgress,4)); + BC_ASSERT_TRUE(wait_for(pauline->lc,pauline->lc,&pauline->stat.number_of_LinphonePublishOk,4)); + + linphone_core_manager_stop(pauline); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphonePublishCleared,4,int,"%i"); + BC_ASSERT_EQUAL(pauline->stat.number_of_LinphonePublishOk,4,int,"%i"); + linphone_core_manager_destroy(pauline); + +} +static void publish_with_network_state_changes(void) { + LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); + LinphoneCoreManager* pauline = linphone_core_manager_new(transport_supported(LinphoneTransportTls) ? "pauline_rc" : "pauline_tcp_rc"); + LinphoneFriend* marie_as_friend = linphone_core_create_friend_with_address(pauline->lc, get_identity(marie)); + + LinphoneProxyConfig* proxy; + LinphoneCoreCbs *cbs = linphone_factory_create_core_cbs(linphone_factory_get()); + + linphone_core_cbs_set_publish_state_changed(cbs, linphone_publish_state_changed); + _linphone_core_add_callbacks(marie->lc, cbs,TRUE); + linphone_core_cbs_unref(cbs); + + linphone_core_set_user_agent(marie->lc, "full-presence-support", NULL); + linphone_core_set_user_agent(marie->lc, "full-presence-support-bypass", NULL); + + proxy = linphone_core_get_default_proxy_config(marie->lc); + linphone_proxy_config_edit(proxy); + linphone_proxy_config_enable_publish(proxy,TRUE); + linphone_proxy_config_done(proxy); + + BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishProgress,1)); + BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishOk,1)); + + linphone_core_set_network_reachable(marie->lc, FALSE); + BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphoneRegistrationNone,1)); + BC_ASSERT_FALSE(wait_for_until(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishProgress,2,1000)); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishOk,1,int,"%i"); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishError,0,int,"%i"); + + linphone_core_set_network_reachable(marie->lc, TRUE); + BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishProgress,2)); + BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishOk,2)); + + + + linphone_core_manager_stop(marie); + BC_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishCleared,1,int,"%i"); /*yes it is 3 because when we change the expires, a new LinphoneEvent is created*/ + BC_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishOk,2,int,"%i"); + linphone_core_manager_destroy(marie); + + /*make sure there is no remaining publish caused by network failure*/ + linphone_core_set_user_agent(pauline->lc, "full-presence-support", NULL); + linphone_core_set_user_agent(pauline->lc, "full-presence-support-bypass", NULL); + linphone_core_add_friend(pauline->lc, marie_as_friend); + + BC_ASSERT_TRUE(wait_for(pauline->lc,pauline->lc,&pauline->stat.number_of_LinphonePresenceActivityAway,1)); + linphone_friend_unref(marie_as_friend); + linphone_core_manager_destroy(pauline); + +} test_t presence_server_tests[] = { + TEST_NO_TAG("Simple Publish", simple_publish), + TEST_NO_TAG("Publish with 2 identities", publish_with_dual_identity), + TEST_NO_TAG("Simple Publish with expires", publish_with_expires), + TEST_ONE_TAG("Publish with network state changes", publish_with_network_state_changes, "presence"), TEST_NO_TAG("Simple", simple), TEST_NO_TAG("Fast activity change", fast_activity_change), TEST_NO_TAG("Forked subscribe with late publish", test_forked_subscribe_notify_publish), diff --git a/tester/presence_tester.c b/tester/presence_tester.c index e53db19ed..67a35c0be 100644 --- a/tester/presence_tester.c +++ b/tester/presence_tester.c @@ -142,101 +142,6 @@ void notify_presence_received_for_uri_or_tel(LinphoneCore *lc, LinphoneFriend *l counters->number_of_NotifyPresenceReceivedForUriOrTel++; } -static void simple_publish_with_expire(int expires) { - LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); - LinphoneProxyConfig* proxy; - LinphonePresenceModel* presence; - LinphoneCoreCbs *cbs = linphone_factory_create_core_cbs(linphone_factory_get()); - - linphone_core_cbs_set_publish_state_changed(cbs, linphone_publish_state_changed); - _linphone_core_add_callbacks(marie->lc, cbs, TRUE); - linphone_core_cbs_unref(cbs); - - proxy = linphone_core_get_default_proxy_config(marie->lc); - linphone_proxy_config_edit(proxy); - if (expires > 0) { - linphone_proxy_config_set_publish_expires(proxy,expires); - } - linphone_proxy_config_enable_publish(proxy,TRUE); - linphone_proxy_config_done(proxy); - - BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishProgress,1)); - BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishOk,1)); - - presence = linphone_presence_model_new(); - linphone_presence_model_set_basic_status(presence, LinphonePresenceBasicStatusClosed); - linphone_core_set_presence_model(marie->lc,presence); - linphone_presence_model_unref(presence); - - BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishProgress,2)); - BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishOk,2)); - - linphone_proxy_config_edit(proxy); - linphone_proxy_config_done(proxy); - /*make sure no publish is sent*/ - BC_ASSERT_FALSE(wait_for_until(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishProgress,3,2000)); - - linphone_proxy_config_edit(proxy); - linphone_proxy_config_enable_publish(proxy,FALSE); - linphone_proxy_config_done(proxy); - - - /*fixme PUBLISH state machine is too simple, clear state should only be propagated at API level when 200ok is received*/ - /*BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishProgress,3));*/ - wait_for_until(marie->lc,marie->lc,NULL,0,2000); - BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishCleared,1)); - - linphone_proxy_config_edit(proxy); - linphone_proxy_config_enable_publish(proxy,TRUE); - linphone_proxy_config_done(proxy); - BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishProgress,3)); - BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishOk,3)); - - linphone_proxy_config_edit(proxy); - linphone_proxy_config_set_publish_expires(proxy, linphone_proxy_config_get_publish_expires(proxy)+1); - linphone_proxy_config_done(proxy); - BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishProgress,4)); - BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishOk,4)); - - linphone_core_manager_stop(marie); - BC_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishCleared,3,int,"%i"); /*yes it is 3 because when we change the expires, a new LinphoneEvent is created*/ - BC_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishOk,4,int,"%i"); - linphone_core_manager_destroy(marie); -} - -static void simple_publish(void) { - simple_publish_with_expire(-1); -} - -static void publish_with_expires(void) { - simple_publish_with_expire(2); -} - -static void publish_with_dual_identity(void) { - LinphoneCoreManager* pauline = linphone_core_manager_new("multi_account_rc"); - const bctbx_list_t* proxies; - LinphoneCoreCbs *cbs = linphone_factory_create_core_cbs(linphone_factory_get()); - - linphone_core_cbs_set_publish_state_changed(cbs, linphone_publish_state_changed); - _linphone_core_add_callbacks(pauline->lc, cbs, TRUE); - linphone_core_cbs_unref(cbs); - - for (proxies = linphone_core_get_proxy_config_list(pauline->lc); proxies!=NULL; proxies = proxies->next) { - LinphoneProxyConfig *proxy = (LinphoneProxyConfig *) proxies->data; - linphone_proxy_config_edit(proxy); - linphone_proxy_config_enable_publish(proxy,TRUE); - linphone_proxy_config_done(proxy); - } - - BC_ASSERT_TRUE(wait_for(pauline->lc,pauline->lc,&pauline->stat.number_of_LinphonePublishProgress,4)); - BC_ASSERT_TRUE(wait_for(pauline->lc,pauline->lc,&pauline->stat.number_of_LinphonePublishOk,4)); - - linphone_core_manager_stop(pauline); - BC_ASSERT_EQUAL(pauline->stat.number_of_LinphonePublishCleared,4,int,"%i"); - BC_ASSERT_EQUAL(pauline->stat.number_of_LinphonePublishOk,4,int,"%i"); - linphone_core_manager_destroy(pauline); - -} static bool_t subscribe_to_callee_presence(LinphoneCoreManager* caller_mgr,LinphoneCoreManager* callee_mgr) { stats initial_caller=caller_mgr->stat; stats initial_callee=callee_mgr->stat; @@ -640,14 +545,10 @@ test_t presence_tests[] = { TEST_ONE_TAG("Simple Subscribe", simple_subscribe,"presence"), TEST_ONE_TAG("Simple Subscribe with early NOTIFY", simple_subscribe_with_early_notify,"presence"), TEST_NO_TAG("Simple Subscribe with friend from rc", simple_subscribe_with_friend_from_rc), - TEST_NO_TAG("Simple Publish", simple_publish), - TEST_NO_TAG("Publish with 2 identities", publish_with_dual_identity), - TEST_NO_TAG("Simple Publish with expires", publish_with_expires), - TEST_ONE_TAG("Publish with network state changes", publish_with_network_state_changes, "presence"), /*TEST_ONE_TAG("Call with presence", call_with_presence, "LeaksMemory"),*/ TEST_NO_TAG("Unsubscribe while subscribing", unsubscribe_while_subscribing), TEST_NO_TAG("Presence information", presence_information), - TEST_NO_TAG("App managed presence failure", subscribe_failure_handle_by_app), + TEST_ONE_TAG("App managed presence failure", subscribe_failure_handle_by_app, "LeaksMemory"), TEST_NO_TAG("Presence SUBSCRIBE forked", subscribe_presence_forked), TEST_NO_TAG("Presence SUBSCRIBE expired", subscribe_presence_expired), }; From dc4f2a155b37174912070d7e60135ada60659317 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Thu, 14 Sep 2017 15:03:46 +0200 Subject: [PATCH 262/281] Switch sip transports used by multi call testers to full tcp in case of IPV6 --- tester/call_multi_tester.c | 44 +++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/tester/call_multi_tester.c b/tester/call_multi_tester.c index 1889a3683..da58f20eb 100644 --- a/tester/call_multi_tester.c +++ b/tester/call_multi_tester.c @@ -30,7 +30,17 @@ #define unlink _unlink #endif - +/* + * With IPV6, Flexisip automatically switches to TCP, so it's no more possible to really have Laure configured with UDP + * Anyway for IPV4, it's still a good opportunity to test UDP. + */ +static const char* get_laure_rc(void) { + if (liblinphone_tester_ipv6_available()) { + return "laure_tcp_rc"; + } else { + return "laure_rc_udp"; + } +} static void call_waiting_indication_with_param(bool_t enable_caller_privacy) { bctbx_list_t *iterator; bctbx_list_t* lcs; @@ -45,7 +55,7 @@ static void call_waiting_indication_with_param(bool_t enable_caller_privacy) { linphone_core_remove_supported_tag(pauline->lc,"gruu"); linphone_core_manager_start(pauline,TRUE); LinphoneCoreManager *laure = ms_new0(LinphoneCoreManager, 1); - linphone_core_manager_init(laure, "laure_rc_udp", NULL); + linphone_core_manager_init(laure, get_laure_rc(), NULL); linphone_core_remove_supported_tag(laure->lc,"gruu"); linphone_core_manager_start(laure, TRUE); LinphoneCallParams *laure_params=linphone_core_create_call_params(laure->lc, NULL); @@ -187,7 +197,7 @@ static void second_call_allowed_if_not_using_audio(void){ static void incoming_call_accepted_when_outgoing_call_in_state(LinphoneCallState state) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc"); - LinphoneCoreManager* laure = linphone_core_manager_new( "laure_rc_udp"); + LinphoneCoreManager* laure = linphone_core_manager_new( get_laure_rc()); bctbx_list_t* lcs; LinphoneCallParams *laure_params=linphone_core_create_call_params(laure->lc, NULL); LinphoneCallParams *marie_params=linphone_core_create_call_params(marie->lc, NULL); @@ -385,7 +395,7 @@ end: static void simple_conference(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc"); - LinphoneCoreManager* laure = linphone_core_manager_new( "laure_rc_udp"); + LinphoneCoreManager* laure = linphone_core_manager_new( get_laure_rc()); simple_conference_base(marie,pauline,laure, NULL, FALSE); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -396,7 +406,7 @@ static void simple_conference(void) { static void simple_conference_from_scratch(void){ LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc"); - LinphoneCoreManager* laure = linphone_core_manager_new( "laure_rc_udp"); + LinphoneCoreManager* laure = linphone_core_manager_new( get_laure_rc()); LinphoneConference *conf; LinphoneConferenceParams *conf_params; LinphoneCall *pauline_call, *laure_call; @@ -469,7 +479,7 @@ static void simple_conference_from_scratch(void){ static void simple_encrypted_conference_with_ice(LinphoneMediaEncryption mode) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc"); - LinphoneCoreManager* laure = linphone_core_manager_new( "laure_rc_udp"); + LinphoneCoreManager* laure = linphone_core_manager_new( get_laure_rc()); if (linphone_core_media_encryption_supported(marie->lc,mode)) { linphone_core_set_firewall_policy(marie->lc,LinphonePolicyUseIce); @@ -504,7 +514,7 @@ static void simple_zrtp_conference_with_ice(void) { static void conference_hang_up_call_on_hold(void) { LinphoneCoreManager* marie = linphone_core_manager_new("marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new("pauline_tcp_rc"); - LinphoneCoreManager* laure = linphone_core_manager_new("laure_rc_udp"); + LinphoneCoreManager* laure = linphone_core_manager_new(get_laure_rc()); simple_conference_base(marie, pauline, laure, NULL, TRUE); linphone_core_manager_destroy(marie); linphone_core_manager_destroy(pauline); @@ -514,7 +524,7 @@ static void conference_hang_up_call_on_hold(void) { static void simple_call_transfer(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc"); - LinphoneCoreManager* laure = linphone_core_manager_new( "laure_rc_udp"); + LinphoneCoreManager* laure = linphone_core_manager_new( get_laure_rc()); LinphoneCall* pauline_called_by_marie; LinphoneCall *marie_calling_pauline; LinphoneCall *marie_calling_laure; @@ -579,7 +589,7 @@ end: static void unattended_call_transfer(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc"); - LinphoneCoreManager* laure = linphone_core_manager_new( "laure_rc_udp"); + LinphoneCoreManager* laure = linphone_core_manager_new( get_laure_rc()); LinphoneCall* pauline_called_by_marie; char* laure_identity=linphone_address_as_string(laure->identity); @@ -668,7 +678,7 @@ static void unattended_call_transfer_with_error(void) { static void call_transfer_existing_call(bool_t outgoing_call) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc"); - LinphoneCoreManager* laure = linphone_core_manager_new( "laure_rc_udp"); + LinphoneCoreManager* laure = linphone_core_manager_new( get_laure_rc()); LinphoneCall* marie_call_pauline; LinphoneCall* pauline_called_by_marie; LinphoneCall* marie_call_laure; @@ -768,7 +778,7 @@ static void call_transfer_existing_call_incoming_call(void) { static void call_transfer_existing_ringing_call(void) { LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); LinphoneCoreManager *pauline = linphone_core_manager_new("pauline_tcp_rc"); - LinphoneCoreManager *laure = linphone_core_manager_new("laure_rc_udp"); + LinphoneCoreManager *laure = linphone_core_manager_new(get_laure_rc()); LinphoneCall *marie_call_pauline; LinphoneCall *pauline_called_by_marie; LinphoneCall *marie_call_laure; @@ -934,7 +944,7 @@ end: static void eject_from_3_participants_local_conference(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc"); - LinphoneCoreManager* laure = linphone_core_manager_new( "laure_rc_udp"); + LinphoneCoreManager* laure = linphone_core_manager_new( get_laure_rc()); eject_from_3_participants_conference(marie, pauline, laure, NULL); @@ -946,7 +956,7 @@ static void eject_from_3_participants_local_conference(void) { static void eject_from_4_participants_conference(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc"); - LinphoneCoreManager* laure = linphone_core_manager_new( "laure_rc_udp"); + LinphoneCoreManager* laure = linphone_core_manager_new( get_laure_rc()); LinphoneCoreManager* michelle = linphone_core_manager_new( "michelle_rc_udp"); int timeout_ms = 5000; stats initial_laure_stat; @@ -1038,7 +1048,7 @@ end: void simple_remote_conference(void) { LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); LinphoneCoreManager *pauline = linphone_core_manager_new("pauline_tcp_rc"); - LinphoneCoreManager *laure = linphone_core_manager_new("laure_rc_udp"); + LinphoneCoreManager *laure = linphone_core_manager_new(get_laure_rc()); LinphoneConferenceServer *focus = linphone_conference_server_new("conference_focus_rc", TRUE); LpConfig *marie_config = linphone_core_get_config(marie->lc); LinphoneProxyConfig *focus_proxy_config = linphone_core_get_default_proxy_config(((LinphoneCoreManager *)focus)->lc); @@ -1064,7 +1074,7 @@ void simple_remote_conference(void) { void simple_remote_conference_shut_down_focus(void) { LinphoneCoreManager *marie = linphone_core_manager_new("marie_rc"); LinphoneCoreManager *pauline = linphone_core_manager_new("pauline_tcp_rc"); - LinphoneCoreManager *laure = linphone_core_manager_new("laure_rc_udp"); + LinphoneCoreManager *laure = linphone_core_manager_new(get_laure_rc()); LinphoneConferenceServer *focus = linphone_conference_server_new("conference_focus_rc", FALSE); LpConfig *marie_config = linphone_core_get_config(marie->lc); LinphoneProxyConfig *focus_proxy_config = linphone_core_get_default_proxy_config(((LinphoneCoreManager *)focus)->lc); @@ -1090,7 +1100,7 @@ void simple_remote_conference_shut_down_focus(void) { void eject_from_3_participants_remote_conference(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc"); - LinphoneCoreManager* laure = linphone_core_manager_new( "laure_rc_udp"); + LinphoneCoreManager* laure = linphone_core_manager_new( get_laure_rc()); LinphoneConferenceServer *focus = linphone_conference_server_new("conference_focus_rc", TRUE); LpConfig *marie_config = linphone_core_get_config(marie->lc); LinphoneProxyConfig *focus_proxy_config = linphone_core_get_default_proxy_config(((LinphoneCoreManager *)focus)->lc); @@ -1116,7 +1126,7 @@ void eject_from_3_participants_remote_conference(void) { void do_not_stop_ringing_when_declining_one_of_two_incoming_calls(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc"); - LinphoneCoreManager* laure = linphone_core_manager_new( "laure_rc_udp"); + LinphoneCoreManager* laure = linphone_core_manager_new( get_laure_rc()); LinphoneCall* pauline_called_by_marie; LinphoneCall* pauline_called_by_laure; LinphoneCallParams *laure_params=linphone_core_create_call_params(laure->lc, NULL); From 11354f2cf6aab3640e584bf00cfea3192d787d62 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Thu, 14 Sep 2017 21:08:59 +0200 Subject: [PATCH 263/281] fix crash in linphonecsh --- console/shell.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/console/shell.c b/console/shell.c index f80a15378..8cf1d6c09 100644 --- a/console/shell.c +++ b/console/shell.c @@ -156,11 +156,11 @@ static char *argv_to_line(int argc, char *argv[]) { } #endif -#define MAX_ARGS 10 +#define MAX_ARGS 20 #ifndef _WIN32 static void spawn_linphonec(int argc, char *argv[]){ - char * args[MAX_ARGS]; + char * args[MAX_ARGS+1]; int i,j; pid_t pid; j=0; @@ -168,10 +168,10 @@ static void spawn_linphonec(int argc, char *argv[]){ args[j++]="--pipe"; args[j++]="-c"; args[j++]="/dev/null"; - for(i=0;i Date: Thu, 14 Sep 2017 21:16:05 +0200 Subject: [PATCH 264/281] fix crash in linphonec --- console/linphonec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/console/linphonec.c b/console/linphonec.c index ca556536b..b786288b4 100644 --- a/console/linphonec.c +++ b/console/linphonec.c @@ -975,7 +975,7 @@ linphonec_idle_call () linphone_core_iterate(opm); if (answer_call){ fprintf (stdout, "-------auto answering to call-------\n" ); - linphone_core_accept_call(opm,NULL); + linphone_core_accept_call(opm, linphone_core_get_current_call(opm)); answer_call=FALSE; } /* auto call handling */ From 533f47c7a9cb04651a24ce589566cac09ac8218c Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Mon, 19 Mar 2018 16:24:20 +0100 Subject: [PATCH 265/281] Indicate mediastreamer2 a maximum output bitrate, so that rate control algorithm can use it. --- src/conference/session/media-session.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/conference/session/media-session.cpp b/src/conference/session/media-session.cpp index c240343f7..d4a4c873f 100644 --- a/src/conference/session/media-session.cpp +++ b/src/conference/session/media-session.cpp @@ -2660,7 +2660,7 @@ void MediaSessionPrivate::startAudioStream (CallSession::State targetState, bool if (playcard) { ms_snd_card_set_stream_type(playcard, MS_SND_CARD_STREAM_VOICE); } - + media_stream_set_max_network_bitrate(&audioStream->ms, linphone_core_get_upload_bandwidth(q->getCore()->getCCore()) * 1000); bool useEc = captcard && linphone_core_echo_cancellation_enabled(q->getCore()->getCCore()); audio_stream_enable_echo_canceller(audioStream, useEc); if (playcard && (stream->max_rate > 0)) @@ -2899,6 +2899,7 @@ void MediaSessionPrivate::startVideoStream (CallSession::State targetState) { getCurrentParams()->getPrivate()->setUsedVideoCodec(rtp_profile_get_payload(videoProfile, usedPt)); getCurrentParams()->enableVideo(true); rtp_session_enable_rtcp_mux(videoStream->ms.sessions.rtp_session, vstream->rtcp_mux); + media_stream_set_max_network_bitrate(&videoStream->ms, linphone_core_get_upload_bandwidth(q->getCore()->getCCore()) * 1000); if (q->getCore()->getCCore()->video_conf.preview_vsize.width != 0) video_stream_set_preview_size(videoStream, q->getCore()->getCCore()->video_conf.preview_vsize); video_stream_set_fps(videoStream, linphone_core_get_preferred_framerate(q->getCore()->getCCore())); From 174f5f570a9bfd43d3b946c3379f851ad736b1ea Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Mon, 19 Mar 2018 16:35:05 +0100 Subject: [PATCH 266/281] fix compilation issue --- tester/presence_tester.c | 34 ---------------------------------- 1 file changed, 34 deletions(-) diff --git a/tester/presence_tester.c b/tester/presence_tester.c index 67a35c0be..18a29902b 100644 --- a/tester/presence_tester.c +++ b/tester/presence_tester.c @@ -211,40 +211,6 @@ static void subscribe_failure_handle_by_app(void) { linphone_core_manager_destroy(pauline); } -static void publish_with_network_state_changes(void) { - LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); - LinphoneProxyConfig* proxy; - LinphoneCoreCbs *cbs = linphone_factory_create_core_cbs(linphone_factory_get()); - - linphone_core_cbs_set_publish_state_changed(cbs, linphone_publish_state_changed); - _linphone_core_add_callbacks(marie->lc, cbs,TRUE); - linphone_core_cbs_unref(cbs); - - proxy = linphone_core_get_default_proxy_config(marie->lc); - linphone_proxy_config_edit(proxy); - linphone_proxy_config_enable_publish(proxy,TRUE); - linphone_proxy_config_done(proxy); - - BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishProgress,1)); - BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishOk,1)); - - linphone_core_set_network_reachable(marie->lc, FALSE); - BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphoneRegistrationNone,1)); - BC_ASSERT_FALSE(wait_for_until(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishProgress,2,1000)); - BC_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishOk,1,int,"%i"); - BC_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishError,0,int,"%i"); - - linphone_core_set_network_reachable(marie->lc, TRUE); - BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishProgress,2)); - BC_ASSERT_TRUE(wait_for(marie->lc,marie->lc,&marie->stat.number_of_LinphonePublishOk,2)); - - - linphone_core_manager_stop(marie); - BC_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishCleared,1,int,"%i"); /*yes it is 3 because when we change the expires, a new LinphoneEvent is created*/ - BC_ASSERT_EQUAL(marie->stat.number_of_LinphonePublishOk,2,int,"%i"); - linphone_core_manager_destroy(marie); -} - static void simple_subscribe(void) { LinphoneCoreManager* marie = presence_linphone_core_manager_new("marie"); LinphoneCoreManager* pauline = presence_linphone_core_manager_new("pauline"); From 4eb83a7b82b6dc9d474ca2901c0b37f75cfe185a Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Mon, 19 Mar 2018 16:41:06 +0100 Subject: [PATCH 267/281] remove LeaksMemory from tester presence/App managed presence failure --- tester/presence_tester.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tester/presence_tester.c b/tester/presence_tester.c index 18a29902b..2eb4c931d 100644 --- a/tester/presence_tester.c +++ b/tester/presence_tester.c @@ -514,7 +514,7 @@ test_t presence_tests[] = { /*TEST_ONE_TAG("Call with presence", call_with_presence, "LeaksMemory"),*/ TEST_NO_TAG("Unsubscribe while subscribing", unsubscribe_while_subscribing), TEST_NO_TAG("Presence information", presence_information), - TEST_ONE_TAG("App managed presence failure", subscribe_failure_handle_by_app, "LeaksMemory"), + TEST_ONE_TAG("App managed presence failure", subscribe_failure_handle_by_app,"presence"), TEST_NO_TAG("Presence SUBSCRIBE forked", subscribe_presence_forked), TEST_NO_TAG("Presence SUBSCRIBE expired", subscribe_presence_expired), }; From 29f9de93a30c6f7278ae4c0356fa7a4303832c2c Mon Sep 17 00:00:00 2001 From: Erwan Croze Date: Mon, 18 Sep 2017 10:47:59 +0200 Subject: [PATCH 268/281] Fix no break error in proxy.c --- coreapi/proxy.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/coreapi/proxy.c b/coreapi/proxy.c index e9a3641a4..03213da1e 100644 --- a/coreapi/proxy.c +++ b/coreapi/proxy.c @@ -20,6 +20,7 @@ Copyright (C) 2000 Simon MORLAT (simon.morlat@linphone.org) #include +#include #include "linphone/core_utils.h" #include "linphone/core.h" #include "linphone/lpconfig.h" @@ -1545,11 +1546,12 @@ void linphone_proxy_config_set_nat_policy(LinphoneProxyConfig *cfg, LinphoneNatP } void linphone_proxy_config_notify_publish_state_changed(LinphoneProxyConfig *cfg, LinphonePublishState state) { - + if (cfg->presence_publish_event != NULL) { switch (state) { case LinphonePublishCleared: linphone_proxy_config_set_etag(cfg,NULL); + BCTBX_NO_BREAK; case LinphonePublishError: linphone_event_unref(cfg->presence_publish_event); cfg->presence_publish_event = NULL; @@ -1559,7 +1561,7 @@ void linphone_proxy_config_notify_publish_state_changed(LinphoneProxyConfig *cfg break; default: break; - + } } } From c38a2e0c771fe7e88eb10aad954d93a1084e02c8 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Mon, 19 Mar 2018 17:52:34 +0100 Subject: [PATCH 269/281] Fix crash when trying to cancel a non-existing INVITE transaction. --- src/conference/session/call-session.cpp | 10 ++++++---- src/sal/call-op.cpp | 10 +++++++++- src/sal/call-op.h | 4 ++-- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/conference/session/call-session.cpp b/src/conference/session/call-session.cpp index 2b6d0da8d..a11a4ed1d 100644 --- a/src/conference/session/call-session.cpp +++ b/src/conference/session/call-session.cpp @@ -821,8 +821,9 @@ void CallSessionPrivate::repairIfBroken () { case CallSession::State::Pausing: if (op->dialog_request_pending()) { // Need to cancel first re-INVITE as described in section 5.5 of RFC 6141 - op->cancel_invite(); - reinviteOnCancelResponseRequested = true; + if (op->cancel_invite() == 0){ + reinviteOnCancelResponseRequested = true; + } } break; case CallSession::State::StreamsRunning: @@ -840,8 +841,9 @@ void CallSessionPrivate::repairIfBroken () { break; case CallSession::State::OutgoingInit: case CallSession::State::OutgoingProgress: - op->cancel_invite(); - reinviteOnCancelResponseRequested = true; + if (op->cancel_invite() == 0){ + reinviteOnCancelResponseRequested = true; + } break; case CallSession::State::OutgoingEarlyMedia: case CallSession::State::OutgoingRinging: diff --git a/src/sal/call-op.cpp b/src/sal/call-op.cpp index a73c021ea..936eb983b 100644 --- a/src/sal/call-op.cpp +++ b/src/sal/call-op.cpp @@ -1120,9 +1120,15 @@ int SalCallOp::update(const char *subject, bool_t no_user_consent) { return -1; } -void SalCallOp::cancel_invite_with_info(const SalErrorInfo *info) { +int SalCallOp::cancel_invite_with_info(const SalErrorInfo *info) { belle_sip_request_t* cancel; ms_message("Cancelling INVITE request from [%s] to [%s] ",get_from(), get_to()); + + if (this->pending_client_trans == NULL){ + ms_warning("There is no transaction to cancel."); + return -1; + } + cancel = belle_sip_client_transaction_create_cancel(this->pending_client_trans); if (cancel){ if (info != NULL){ @@ -1130,6 +1136,7 @@ void SalCallOp::cancel_invite_with_info(const SalErrorInfo *info) { belle_sip_message_add_header(BELLE_SIP_MESSAGE(cancel),BELLE_SIP_HEADER(reason)); } send_request(cancel); + return 0; }else if (this->dialog){ belle_sip_dialog_state_t state = belle_sip_dialog_get_state(this->dialog);; /*case where the response received is invalid (could not establish a dialog), but the transaction is not cancellable @@ -1145,6 +1152,7 @@ void SalCallOp::cancel_invite_with_info(const SalErrorInfo *info) { break; } } + return -1; } SalMediaDescription *SalCallOp::get_final_media_description() { diff --git a/src/sal/call-op.h b/src/sal/call-op.h index 414a808b6..fea958e6d 100644 --- a/src/sal/call-op.h +++ b/src/sal/call-op.h @@ -45,8 +45,8 @@ public: int decline(SalReason reason, const char *redirection /*optional*/); int decline_with_error_info(const SalErrorInfo *info, const SalAddress *redirectionAddr /*optional*/); int update(const char *subject, bool_t no_user_consent); - void cancel_invite() {cancel_invite_with_info(NULL);} - void cancel_invite_with_info(const SalErrorInfo *info); + int cancel_invite() { return cancel_invite_with_info(NULL);} + int cancel_invite_with_info(const SalErrorInfo *info); int refer(const char *refer_to_); int refer_with_replaces(SalCallOp *other_call_op); int set_referer(SalCallOp *refered_call); From be9a245657270e7f7208f8a10d67d684c13a8ba5 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Mon, 18 Sep 2017 21:10:57 +0200 Subject: [PATCH 270/281] fix compilation with NDK > 14 (cherry-picked from master, commit f28d968 .) --- tester/log_collection_tester.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tester/log_collection_tester.c b/tester/log_collection_tester.c index 6027e7d13..b81d43449 100644 --- a/tester/log_collection_tester.c +++ b/tester/log_collection_tester.c @@ -28,9 +28,14 @@ #include #endif +#ifdef __ANDROID__ +#include "android/api-level.h" +#endif /*getline is POSIX 2008, not available on many systems.*/ -#if (defined(__ANDROID__) && !defined(__LP64__)) || defined(_WIN32) || defined(__QNX__) + +/*It is declared since NDK14 unified headers, that can be detected by the presence of __ANDROID_API_O__ define*/ +#if (defined(__ANDROID__) && __ANDROID_API__ <= 16) || defined(_WIN32) || defined(__QNX__) /* This code is public domain -- Will Hartung 4/9/09 */ static ssize_t getline(char **lineptr, size_t *n, FILE *stream) { char *bufptr = NULL; From 95abefb81a3a45f86971158ee8b75a79fd5f5593 Mon Sep 17 00:00:00 2001 From: Ghislain MARY Date: Tue, 20 Mar 2018 15:02:29 +0100 Subject: [PATCH 271/281] Fix build with GCC 4.8. --- tester/setup_tester.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/tester/setup_tester.c b/tester/setup_tester.c index e022f225d..b10705004 100644 --- a/tester/setup_tester.c +++ b/tester/setup_tester.c @@ -43,14 +43,16 @@ static const char *sFriends[S_SIZE_FRIEND] = { }; static void _create_friends_from_tab(LinphoneCore *lc, LinphoneFriendList *list, const char *friends[], const unsigned int size) { - for (unsigned int i = 0 ; i < size ; i++) { + unsigned int i; + for (i = 0 ; i < size ; i++) { LinphoneFriend *fr = linphone_core_create_friend_with_address(lc, friends[i]); linphone_friend_list_add_friend(list, fr); } } static void _remove_friends_from_list(LinphoneFriendList *list, const char *friends[], const unsigned int size) { - for (unsigned int i = 0 ; i < size ; i++) { + unsigned int i; + for (i = 0 ; i < size ; i++) { LinphoneFriend *fr = linphone_friend_list_find_friend_by_uri(list, friends[i]); if (fr) linphone_friend_list_remove_friend(list, fr); } @@ -81,7 +83,8 @@ static void _check_friend_result_list(LinphoneCore *lc, const bctbx_list_t *resu } } else { const bctbx_list_t *callLog = linphone_core_get_call_logs(lc); - for (const bctbx_list_t *f = callLog ; f != NULL ; f = bctbx_list_next(f)) { + const bctbx_list_t *f; + for (f = callLog ; f != NULL ; f = bctbx_list_next(f)) { LinphoneCallLog *log = (LinphoneCallLog*)(f->data); const LinphoneAddress *addr = (linphone_call_log_get_dir(log) == LinphoneCallIncoming) ? linphone_call_log_get_from_address(log) : linphone_call_log_get_to_address(log); @@ -842,11 +845,13 @@ static void search_friend_large_database(void) { char searchedFriend[] = {"6295103032641994169"}; char subBuff[30]; LinphoneCoreManager* manager = linphone_core_manager_new2("empty_rc", FALSE); + unsigned int i; + linphone_core_set_friends_database_path(manager->lc, dbPath); magicSearch = linphone_magic_search_new(manager->lc); - for (unsigned int i = 1; i < sizeof(searchedFriend) ; i++) { + for (i = 1; i < sizeof(searchedFriend) ; i++) { memcpy(subBuff, &searchedFriend, i); subBuff[i] = '\0'; liblinphone_tester_clock_start(&start); From 1d103c73795f6fd1ce93dc0ed6574ecd8986e1b9 Mon Sep 17 00:00:00 2001 From: Jehan Monnier Date: Tue, 20 Mar 2018 17:45:54 +0100 Subject: [PATCH 272/281] fix double unref in ICE tester --- tester/tester.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tester/tester.c b/tester/tester.c index 92fc68a86..c47cff87f 100644 --- a/tester/tester.c +++ b/tester/tester.c @@ -842,6 +842,7 @@ bool_t check_ice(LinphoneCoreManager* caller, LinphoneCoreManager* callee, Linph linphone_core_iterate(callee->lc); linphone_call_stats_unref(stats1); linphone_call_stats_unref(stats2); + stats1 = stats2 = NULL; } ms_usleep(20000); } while (!liblinphone_tester_clock_elapsed(&ts,10000)); @@ -870,6 +871,7 @@ bool_t check_ice(LinphoneCoreManager* caller, LinphoneCoreManager* callee, Linph linphone_core_iterate(callee->lc); linphone_call_stats_unref(stats1); linphone_call_stats_unref(stats2); + stats1 = stats2 = NULL; } ms_usleep(20000); } while (!liblinphone_tester_clock_elapsed(&ts,10000)); From b0b908efce88697319ab23a6ab3fe320a2d06131 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Wed, 21 Mar 2018 10:57:06 +0100 Subject: [PATCH 273/281] Avoid detection of false leaks due to the address cache. --- coreapi/factory.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/coreapi/factory.c b/coreapi/factory.c index 1c52181ea..e316a93ba 100644 --- a/coreapi/factory.c +++ b/coreapi/factory.c @@ -21,6 +21,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #include "c-wrapper/c-wrapper.h" +#include "address/address-p.h" + // TODO: From coreapi. Remove me later. #include "private.h" @@ -145,6 +147,7 @@ LinphoneFactory *linphone_factory_get(void) { } void linphone_factory_clean(void){ + LinphonePrivate::AddressPrivate::clearSipAddressesCache(); if (_factory){ belle_sip_object_unref(_factory); _factory = NULL; From cd65cb0e117a1da7e072665d808c540c9b8e1e89 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Wed, 21 Mar 2018 11:50:14 +0100 Subject: [PATCH 274/281] Fix invalid declaration of C function. --- coreapi/ringtoneplayer_ios.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreapi/ringtoneplayer_ios.h b/coreapi/ringtoneplayer_ios.h index 37aa2b22e..fce0a16dc 100644 --- a/coreapi/ringtoneplayer_ios.h +++ b/coreapi/ringtoneplayer_ios.h @@ -24,7 +24,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. extern "C" { #endif -LinphoneRingtonePlayer* linphone_ringtoneplayer_ios_new(); +LinphoneRingtonePlayer* linphone_ringtoneplayer_ios_new(void); void linphone_ringtoneplayer_ios_destroy(LinphoneRingtonePlayer* rp); int linphone_ringtoneplayer_ios_start_with_cb(LinphoneRingtonePlayer* rp, const char* ringtone, int loop_pause_ms, LinphoneRingtonePlayerFunc end_of_ringtone, void * user_data); bool_t linphone_ringtoneplayer_ios_is_started(LinphoneRingtonePlayer* rp); From d51114d6c63591460c56d26caa631ba6abe4a06c Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Wed, 21 Mar 2018 16:34:27 +0100 Subject: [PATCH 275/281] Fix test regressed because now ICE has a preference for IPv6 --- tester/call_single_tester.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/tester/call_single_tester.c b/tester/call_single_tester.c index 68d935442..01dbc8f69 100644 --- a/tester/call_single_tester.c +++ b/tester/call_single_tester.c @@ -5829,6 +5829,10 @@ static void call_with_zrtp_configured_callee_base(LinphoneCoreManager *marie, Li } } +static bool_t is_matching_local_v4_or_v6(const char *ip, const char *localv4, const char *localv6){ + if (strlen(ip)==0) return FALSE; + return strcmp(ip, localv4) == 0 || strcmp(ip, localv6) == 0; +} /* * this test checks the 'dont_default_to_stun_candidates' mode, where the c= line is left to host @@ -5836,20 +5840,24 @@ static void call_with_zrtp_configured_callee_base(LinphoneCoreManager *marie, Li static void call_with_ice_with_default_candidate_not_stun(void){ LinphoneCoreManager * marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager *pauline = linphone_core_manager_new(transport_supported(LinphoneTransportTls) ? "pauline_rc" : "pauline_tcp_rc"); - char localip[LINPHONE_IPADDR_SIZE]; + char localip[LINPHONE_IPADDR_SIZE]={0}; + char localip6[LINPHONE_IPADDR_SIZE]={0}; bool_t call_ok; lp_config_set_int(linphone_core_get_config(marie->lc), "net", "dont_default_to_stun_candidates", 1); linphone_core_set_firewall_policy(marie->lc, LinphonePolicyUseIce); linphone_core_set_firewall_policy(pauline->lc, LinphonePolicyUseIce); linphone_core_get_local_ip(marie->lc, AF_INET, NULL, localip); + linphone_core_get_local_ip(marie->lc, AF_INET6, NULL, localip6); call_ok = call(marie, pauline); if (call_ok){ check_ice(marie, pauline, LinphoneIceStateHostConnection); - BC_ASSERT_STRING_EQUAL(_linphone_call_get_local_desc(linphone_core_get_current_call(marie->lc))->addr, localip); - BC_ASSERT_STRING_EQUAL(_linphone_call_get_result_desc(linphone_core_get_current_call(pauline->lc))->addr, localip); - BC_ASSERT_STRING_EQUAL(_linphone_call_get_local_desc(linphone_core_get_current_call(marie->lc))->streams[0].rtp_addr, localip); - BC_ASSERT_STRING_EQUAL(_linphone_call_get_result_desc(linphone_core_get_current_call(pauline->lc))->streams[0].rtp_addr, ""); + BC_ASSERT_TRUE(is_matching_local_v4_or_v6(_linphone_call_get_local_desc(linphone_core_get_current_call(marie->lc))->addr, localip, localip6)); + BC_ASSERT_TRUE(is_matching_local_v4_or_v6(_linphone_call_get_local_desc(linphone_core_get_current_call(marie->lc))->streams[0].rtp_addr, localip, localip6)); + BC_ASSERT_TRUE(is_matching_local_v4_or_v6(_linphone_call_get_local_desc(linphone_core_get_current_call(marie->lc))->streams[0].rtp_addr, localip, localip6)); + BC_ASSERT_TRUE(is_matching_local_v4_or_v6(_linphone_call_get_result_desc(linphone_core_get_current_call(pauline->lc))->streams[0].rtp_addr, localip, localip6) + || is_matching_local_v4_or_v6(_linphone_call_get_result_desc(linphone_core_get_current_call(pauline->lc))->addr, localip, localip6) + ); } end_call(marie, pauline); linphone_core_manager_destroy(marie); From c566bf5d3fd9ab304430db0fbce831d33aa8e9f5 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Wed, 21 Mar 2018 17:46:52 +0100 Subject: [PATCH 276/281] Fix tests --- tester/call_single_tester.c | 18 ++++- tester/certificates/client/cert2.pem | 95 +++++++++++++-------------- tester/certificates/client/key2.pem | 52 +++++++-------- tester/certificates/cn/openssl-cn.cnf | 2 +- tester/flexisip_tester.c | 5 +- 5 files changed, 92 insertions(+), 80 deletions(-) diff --git a/tester/call_single_tester.c b/tester/call_single_tester.c index 01dbc8f69..029f921b8 100644 --- a/tester/call_single_tester.c +++ b/tester/call_single_tester.c @@ -810,10 +810,22 @@ static void multiple_answers_call_with_media_relay(void) { /* Scenario is this: pauline calls marie, which is registered 2 times. * Both linphones answer at the same time, and only one should get the * call running, the other should be terminated */ - LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc" ); - LinphoneCoreManager* marie1 = linphone_core_manager_new( "marie_rc" ); - LinphoneCoreManager* marie2 = linphone_core_manager_new( "marie_rc" ); + LinphoneCoreManager* pauline = linphone_core_manager_new2( "pauline_tcp_rc", FALSE); + LinphoneCoreManager* marie1 = linphone_core_manager_new2( "marie_rc", FALSE); + LinphoneCoreManager* marie2 = linphone_core_manager_new2( "marie_rc", FALSE ); + /* This tests a feature of the proxy (nta_msg_ackbye()) that doesn't work with gruu. + * Actually nta_msg_ackbye() is deprecated because it is not the task of the proxy to handle the race conditions of 200 Ok arriving at the same time. + * It is the job of the user-agent, see test multiple_answers_call() above. + */ + linphone_core_remove_supported_tag(pauline->lc,"gruu"); + linphone_core_remove_supported_tag(marie1->lc,"gruu"); + linphone_core_remove_supported_tag(marie2->lc,"gruu"); + + linphone_core_manager_start(pauline, TRUE); + linphone_core_manager_start(marie1, TRUE); + linphone_core_manager_start(marie2, TRUE); + LinphoneCall* call1, *call2; bctbx_list_t* lcs = bctbx_list_append(NULL,pauline->lc); diff --git a/tester/certificates/client/cert2.pem b/tester/certificates/client/cert2.pem index dc359d851..bec3c3668 100644 --- a/tester/certificates/client/cert2.pem +++ b/tester/certificates/client/cert2.pem @@ -1,35 +1,35 @@ Certificate: Data: Version: 3 (0x2) - Serial Number: 13 (0xd) + Serial Number: 16 (0x10) Signature Algorithm: sha256WithRSAEncryption Issuer: C=FR, ST=Some-State, L=Grenoble, O=Belledonne Communications, OU=LAB, CN=Jehan Monnier/emailAddress=jehan.monnier@belledonne-communications.com Validity - Not Before: Nov 17 11:09:48 2016 GMT - Not After : Nov 17 11:09:48 2017 GMT - Subject: C=FR, ST=Some-State, L=Lorien, O=Internet Widgits Pty Ltd, CN=sip:galadrielle@sip.example.org + Not Before: Mar 21 16:35:56 2018 GMT + Not After : Mar 18 16:35:56 2028 GMT + Subject: C=FR, ST=Lorien, O=Elfes, CN=sip:galadrielle@sip.example.org Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: - 00:ae:3c:ab:f2:34:4b:dd:3e:96:b4:0f:76:61:5f: - 59:dd:d0:93:6f:05:04:a2:2e:f7:f5:2f:65:35:02: - f5:6f:ed:dd:46:bb:72:3e:7c:47:b5:37:15:1d:1d: - 90:a7:dc:0f:bf:cc:a8:58:43:86:fb:b8:c7:7e:13: - 7f:05:09:47:6b:bf:a1:d1:76:7d:7a:d3:09:3a:46: - 78:22:08:49:cd:02:8d:80:10:ee:d1:18:3c:e4:df: - 50:be:05:80:88:56:c3:d4:36:2c:05:5d:57:07:9a: - 4a:13:99:7f:46:d9:0b:dd:81:51:29:bd:8e:3a:55: - b2:33:f2:e6:3e:1c:ce:f9:2f:80:68:ca:5a:78:c5: - e1:27:4a:b4:0b:65:9b:24:ee:df:8c:16:f0:74:dc: - fe:a5:9f:52:5a:a1:f9:09:1d:47:00:d9:8a:84:72: - e2:19:7b:cb:cd:62:b3:44:e3:4f:cf:9b:1c:a1:bc: - 70:d3:e0:10:8b:f2:51:28:91:84:61:92:56:03:3a: - 2c:bf:11:8d:b6:4b:c8:4f:1c:e7:75:54:b9:cd:f3: - d5:be:6b:af:6e:9f:ca:77:45:44:5c:55:6a:23:49: - e0:52:fc:30:3d:a9:a8:66:f1:d8:d0:a8:5b:97:3c: - a7:de:70:db:7b:85:c1:f5:8e:54:3c:f8:0f:3a:9f: - 36:2d + 00:e5:0b:bd:b3:f7:e7:c2:1f:27:40:1f:57:7f:0b: + 47:67:08:54:aa:6f:78:f9:02:32:10:fa:0c:fd:4a: + 0f:3c:a3:f2:34:d0:60:93:1c:c5:fe:25:a5:66:7f: + 02:11:23:cc:98:b2:34:3e:1b:31:8a:f4:9d:d6:89: + a6:41:d5:8f:fc:db:24:0f:61:af:e2:15:7b:71:d7: + 10:3e:25:ea:a4:dd:f6:c5:6b:ac:b8:a8:f5:34:fe: + a2:7e:fc:8e:b5:99:55:2a:74:c4:55:3f:9a:ae:a0: + 62:b3:03:50:aa:39:dd:8c:62:22:ac:3d:0d:60:d0: + da:49:0d:31:79:01:e4:59:9b:54:d8:78:e6:90:3d: + 8a:d6:1b:6c:1f:4e:4e:d7:76:a2:16:e7:37:d8:c8: + cf:33:95:b9:eb:fe:e0:b5:10:6f:b6:0d:31:a5:d4: + d5:86:07:1b:05:43:f1:42:0b:f7:ba:20:96:45:48: + ec:6f:c9:29:8c:fe:15:55:d8:26:f2:20:c6:db:37: + 67:e6:42:de:4b:66:fa:68:a1:4c:6f:39:01:56:92: + 5c:7d:68:2d:58:85:4a:67:a5:03:cb:c5:1d:22:7c: + 00:24:cd:49:3b:68:af:1a:0f:cf:ed:09:9f:74:7a: + 54:69:6c:2e:bf:72:76:46:b0:26:24:14:e0:74:8e: + 0e:23 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: @@ -37,38 +37,37 @@ Certificate: Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: - 33:D0:36:5B:62:9B:1C:4D:31:47:9E:C0:91:41:E3:AE:29:61:AB:DB + 22:E0:9B:5C:30:1A:B0:02:A3:88:63:73:16:01:60:E1:16:1A:8A:AD X509v3 Authority Key Identifier: keyid:06:5F:5D:C7:16:AF:62:F8:2D:6E:71:03:88:A0:D6:1D:2B:04:7F:BA Signature Algorithm: sha256WithRSAEncryption - ba:a1:0a:7e:8e:a6:1e:e8:3d:5f:da:28:a6:57:3e:cb:50:79: - 06:8f:19:1b:df:b0:d2:e6:12:1f:ef:a2:bd:de:40:07:e2:5d: - 3d:64:41:34:10:24:3c:85:62:8e:69:0c:99:89:b7:ce:a4:f6: - 08:6d:37:8a:51:98:bd:46:b7:1b:dd:b2:ba:f7:f4:2f:47:d5: - 74:3f:c5:fe:95:60:b3:42:51:4f:d1:ac:ed:a4:c6:f6:16:f3: - 49:b6:8d:64:7f:76:e1:95:5e:ef:eb:46:4b:d7:a5:59:1d:0d: - ba:c5:07:5f:c3:db:2e:40:aa:6e:34:0c:1a:1d:4b:72:e3:ac: - 61:b5 + 12:78:7f:19:e2:38:d1:aa:9d:fe:c7:30:fb:00:00:ce:ce:28: + 66:fc:fe:d2:fb:3c:f8:af:68:83:11:96:30:ab:97:f9:f0:cd: + 09:67:12:4f:9f:97:ad:39:1c:a2:d2:f2:8c:38:71:be:1f:0a: + c8:12:93:8b:42:d7:1a:3a:29:6e:01:08:50:44:a3:cc:09:39: + 63:90:5f:20:09:70:a8:70:ed:91:1e:78:1b:f3:5c:2d:84:a8: + 6e:71:ff:36:0b:fa:b5:26:63:8b:d4:80:43:f0:4a:89:86:d5: + 37:3b:23:c2:2b:40:14:04:e6:67:5e:a5:61:68:8e:03:b7:4c: + cd:16 -----BEGIN CERTIFICATE----- -MIIDsjCCAxugAwIBAgIBDTANBgkqhkiG9w0BAQsFADCBuzELMAkGA1UEBhMCRlIx +MIIDiTCCAvKgAwIBAgIBEDANBgkqhkiG9w0BAQsFADCBuzELMAkGA1UEBhMCRlIx EzARBgNVBAgMClNvbWUtU3RhdGUxETAPBgNVBAcMCEdyZW5vYmxlMSIwIAYDVQQK DBlCZWxsZWRvbm5lIENvbW11bmljYXRpb25zMQwwCgYDVQQLDANMQUIxFjAUBgNV BAMMDUplaGFuIE1vbm5pZXIxOjA4BgkqhkiG9w0BCQEWK2plaGFuLm1vbm5pZXJA -YmVsbGVkb25uZS1jb21tdW5pY2F0aW9ucy5jb20wHhcNMTYxMTE3MTEwOTQ4WhcN -MTcxMTE3MTEwOTQ4WjCBgDELMAkGA1UEBhMCRlIxEzARBgNVBAgMClNvbWUtU3Rh -dGUxDzANBgNVBAcMBkxvcmllbjEhMB8GA1UECgwYSW50ZXJuZXQgV2lkZ2l0cyBQ -dHkgTHRkMSgwJgYDVQQDDB9zaXA6Z2FsYWRyaWVsbGVAc2lwLmV4YW1wbGUub3Jn -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArjyr8jRL3T6WtA92YV9Z -3dCTbwUEoi739S9lNQL1b+3dRrtyPnxHtTcVHR2Qp9wPv8yoWEOG+7jHfhN/BQlH -a7+h0XZ9etMJOkZ4IghJzQKNgBDu0Rg85N9QvgWAiFbD1DYsBV1XB5pKE5l/RtkL -3YFRKb2OOlWyM/LmPhzO+S+AaMpaeMXhJ0q0C2WbJO7fjBbwdNz+pZ9SWqH5CR1H -ANmKhHLiGXvLzWKzRONPz5scobxw0+AQi/JRKJGEYZJWAzosvxGNtkvITxzndVS5 -zfPVvmuvbp/Kd0VEXFVqI0ngUvwwPamoZvHY0Khblzyn3nDbe4XB9Y5UPPgPOp82 -LQIDAQABo3sweTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdl -bmVyYXRlZCBDZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUM9A2W2KbHE0xR57AkUHjrilh -q9swHwYDVR0jBBgwFoAUBl9dxxavYvgtbnEDiKDWHSsEf7owDQYJKoZIhvcNAQEL -BQADgYEAuqEKfo6mHug9X9ooplc+y1B5Bo8ZG9+w0uYSH++ivd5AB+JdPWRBNBAk -PIVijmkMmYm3zqT2CG03ilGYvUa3G92yuvf0L0fVdD/F/pVgs0JRT9Gs7aTG9hbz -SbaNZH924ZVe7+tGS9elWR0NusUHX8PbLkCqbjQMGh1LcuOsYbU= +YmVsbGVkb25uZS1jb21tdW5pY2F0aW9ucy5jb20wHhcNMTgwMzIxMTYzNTU2WhcN +MjgwMzE4MTYzNTU2WjBYMQswCQYDVQQGEwJGUjEPMA0GA1UECAwGTG9yaWVuMQ4w +DAYDVQQKDAVFbGZlczEoMCYGA1UEAwwfc2lwOmdhbGFkcmllbGxlQHNpcC5leGFt +cGxlLm9yZzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOULvbP358If +J0AfV38LR2cIVKpvePkCMhD6DP1KDzyj8jTQYJMcxf4lpWZ/AhEjzJiyND4bMYr0 +ndaJpkHVj/zbJA9hr+IVe3HXED4l6qTd9sVrrLio9TT+on78jrWZVSp0xFU/mq6g +YrMDUKo53YxiIqw9DWDQ2kkNMXkB5FmbVNh45pA9itYbbB9OTtd2ohbnN9jIzzOV +uev+4LUQb7YNMaXU1YYHGwVD8UIL97oglkVI7G/JKYz+FVXYJvIgxts3Z+ZC3ktm ++mihTG85AVaSXH1oLViFSmelA8vFHSJ8ACTNSTtorxoPz+0Jn3R6VGlsLr9ydkaw +JiQU4HSODiMCAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhCAQ0EHxYdT3Bl +blNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFCLgm1wwGrACo4hj +cxYBYOEWGoqtMB8GA1UdIwQYMBaAFAZfXccWr2L4LW5xA4ig1h0rBH+6MA0GCSqG +SIb3DQEBCwUAA4GBABJ4fxniONGqnf7HMPsAAM7OKGb8/tL7PPivaIMRljCrl/nw +zQlnEk+fl605HKLS8ow4cb4fCsgSk4tC1xo6KW4BCFBEo8wJOWOQXyAJcKhw7ZEe +eBvzXC2EqG5x/zYL+rUmY4vUgEPwSomG1Tc7I8IrQBQE5mdepWFojgO3TM0W -----END CERTIFICATE----- diff --git a/tester/certificates/client/key2.pem b/tester/certificates/client/key2.pem index d6eab8da5..e3b6c9551 100644 --- a/tester/certificates/client/key2.pem +++ b/tester/certificates/client/key2.pem @@ -1,28 +1,28 @@ -----BEGIN PRIVATE KEY----- -MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCuPKvyNEvdPpa0 -D3ZhX1nd0JNvBQSiLvf1L2U1AvVv7d1Gu3I+fEe1NxUdHZCn3A+/zKhYQ4b7uMd+ -E38FCUdrv6HRdn160wk6RngiCEnNAo2AEO7RGDzk31C+BYCIVsPUNiwFXVcHmkoT -mX9G2QvdgVEpvY46VbIz8uY+HM75L4Boylp4xeEnSrQLZZsk7t+MFvB03P6ln1Ja -ofkJHUcA2YqEcuIZe8vNYrNE40/PmxyhvHDT4BCL8lEokYRhklYDOiy/EY22S8hP -HOd1VLnN89W+a69un8p3RURcVWojSeBS/DA9qahm8djQqFuXPKfecNt7hcH1jlQ8 -+A86nzYtAgMBAAECggEAHyf8O0A8vKA/hI0rRvgs8qwkYPrNvE6XykEiYNtZlh07 -rzU/lYrVq8LgxKcPweRo8IwhIj9Y+NQu4A2ObhEds1e+EN2WTItGICSPwM4onD8z -nE3q1nr2EJsaLhB/zmFtfRn+vyrUsChXzK9rAfk31PEV2VfrAeVnC0EJCNxP6mDX -gAjTNN/+Elqzr8Cr7aofthaMnCWnI6JBJ0MCqaozDBreyfGkaFC+RkRxUpZQerqN -tvcurKn0C/Q5ZcfIugvnEFa4nL/V4s+j4Kv1SWgvfi2z4eR7wyiZVT+mStMiHvg5 -JCLNli4GtFyhYzsTqUnd3S2t0unEdaFLEzJakHGjQQKBgQDdjw9UN354QS2Aiqoe -Gu5e9nc3gi3e/dHmPyk4jKPC/cqrQ3AVrXILLjU/FHpT7OrkwoQNvI0qG39r1Akq -hnztTqDw0HVskuWJmPmUxfdl6DIOUln7pEX4yZMreDwdEjxx/oZzbu7bhU3k7zNV -zKv54deN78AmtVI5KzrEdvKfnQKBgQDJUnAtvDeuwE44XUU0mBoH3XdLULLaVeAl -4vovM/8U283+wiBkASXamFimboBKe34TGH/v10hmKxBHyPCgl9ps6o9iFbPRNzOB -kmGrTTojSOJ6u9EXvQ+wTYjzl2n/RlivIsOZRC0YXmk3n+mRPa0TGwnpxH13cEFV -RnEUnYdT0QKBgBZXw/L5Oa7E2+LXmPo6OwmmjzUw0pFnRVCT1ANY43bZgyOsRFRb -TmHkQghfd0qZXMK+/vQnrJCvfzUPh/Ea6ORBhqdiTkUpty4eGCUxpZZISSv6kAp5 -cXj6UvYSRPWljiTsxwBDEqFemxFYMfQYFMu5Q7STlewRYv5S5rVDTYpdAoGAG77I -xwTRh7vpC8uO5hiwPbU/45lTjNOY+J+3axn3ZaCFWz7Vx/KAjQfB7+36sEkkru0J -dLxuteXpcHs47mj/KVOKPzJOfd7lsk3COCGEiahZziBkSKk9qEaHQUr0yMGhJ0Hb -QxwqOtmIFqprPiEJ4UAwtY7m27cUyfPTUcwEAoECgYBEoCn8kmRXuBoDVNPK1IPh -vQcD0RDdtGhOrM36Pmmbky6oS37c3AV4sXOhw7aTYs4GejpeH0tX7F0hiwaZ/SqG -WxliyHCpUxpl+LsGzdfqCa9nEPn4B27/jFYHVCiSheOfVEwjGavkO+VIZbuHXAP4 -V8rXqdmFIbiVb43P6yoMhg== +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDlC72z9+fCHydA +H1d/C0dnCFSqb3j5AjIQ+gz9Sg88o/I00GCTHMX+JaVmfwIRI8yYsjQ+GzGK9J3W +iaZB1Y/82yQPYa/iFXtx1xA+Jeqk3fbFa6y4qPU0/qJ+/I61mVUqdMRVP5quoGKz +A1CqOd2MYiKsPQ1g0NpJDTF5AeRZm1TYeOaQPYrWG2wfTk7XdqIW5zfYyM8zlbnr +/uC1EG+2DTGl1NWGBxsFQ/FCC/e6IJZFSOxvySmM/hVV2CbyIMbbN2fmQt5LZvpo +oUxvOQFWklx9aC1YhUpnpQPLxR0ifAAkzUk7aK8aD8/tCZ90elRpbC6/cnZGsCYk +FOB0jg4jAgMBAAECggEBAJ5dZNfHQ23b3maehP+pS8A4aVnCY1FALF/ClDKY/zn9 +XR0ZKnzs+xSC8P6SOFqjdvXo2OhMIxAhm/RXDiYcxEafOiqMb3CRS93lRizCSJ+f +fNz5Wt3+rDPtD2tfskhrcRA+1fTfWlL9P+DoHODly4Ih5DlUqShUn2i8/4TcQweU +aM/Kii6s5lf76nqEd4ztzseyn1f3sklxFHI1p0+mzk57YghTdaD/qJiFV0Lxf6jw +SLb5eMmo+BRucV9Rl7jXlhJW00pTIc38ssRdH2XvHw5h51kv9CBRQFSmdnGrzj1/ +D2l+C5gxLIGshbEoAaFDJWZi2v01wWCpe7N0GXxl4HECgYEA9SNHCpWIehydIra1 +h0tBWOxv9gac7OiW64bDd5op6XYXNTwI8GIGX3VsV+avDhPWTptI0+cCOAgBqPyi +LCwT3HrXTyzRcJctlwHRZIUkzlr26Z+5WUJK0+bdCWiOCE31+pS6qX9bjreq1pL6 +C9Gfl3m4FXCICXCGSSutKBT8FRkCgYEA7zHsqzvBmJS8T57lNPBCqmpFI6viR5Vu +qza6zlJLSP7OTlWBiQ+coq4YmsAv2pF+i9j4VDizf77nF2tkNcC/2CJk70oXxj/Y +ahci9M5xnX9WyPn9x53clepT+XXUQ8yW/OvjKUc5gut1g5OZFsjGmWFk/EkzJLSz +p5lXMJl4iJsCgYA+5FQfpQmkup6d/15HXclgNRjsd/ne1jWSK7sOfmDuYrvFjqeE +dMHJz+iCDM8wv2omNLTUmNn64iL65gX9azmVQXbn+0mop0CtE2xTa81rm+7pNW9q +NRXZk8t11HtMKiRHq8zQG7qzvO95qa+5RIi7ZiESbxKXyWTKdQgx1mBuUQKBgHy1 +gdhRIoGj4n58sLImJgvltkB/6E08KuQXd9QEcf4P445R5GSKgDcNIATm+MwzGVBe +gjKfEW8kICZEto2T/jH41Lkx3y1csj+16mLKk8/yyVOli1wdARokfz3L4iyrKXma +nugxm1mX28ALH0ES0wC7F8S1gXW8xQI3346WJZLLAoGBALXykdDntTZ6RG5ahvQx +rLTr95sLxyujG2oyn7hatPcAfvqFatx2m+FiYVDw5x511XHJ49oFsxQ/+kiZrojJ +eKPvsy2gP8EievsEtK5+YDSkZQtZjzP65lOHd8g/0AmQGmO7RQ456GoG4qAhRc7+ +YwPlbSK0lTSXxcloSc2WW6ak -----END PRIVATE KEY----- diff --git a/tester/certificates/cn/openssl-cn.cnf b/tester/certificates/cn/openssl-cn.cnf index 908f6ed4c..fcfe5ef5f 100644 --- a/tester/certificates/cn/openssl-cn.cnf +++ b/tester/certificates/cn/openssl-cn.cnf @@ -70,7 +70,7 @@ cert_opt = ca_default # Certificate field options # crlnumber must also be commented out to leave a V1 CRL. # crl_extensions = crl_ext -default_days = 365 # how long to certify for +default_days = 3650 # how long to certify for default_crl_days= 30 # how long before next CRL default_md = default # use public key default MD preserve = no # keep passed DN ordering diff --git a/tester/flexisip_tester.c b/tester/flexisip_tester.c index ef21a90ea..19bdbe9d7 100644 --- a/tester/flexisip_tester.c +++ b/tester/flexisip_tester.c @@ -1257,9 +1257,10 @@ static void tls_client_auth_try_register(const char *identity, bool_t with_good_ }else{ BC_ASSERT_TRUE(wait_for(lcm->lc, NULL, &lcm->stat.number_of_LinphoneRegistrationFailed, 1)); BC_ASSERT_EQUAL(lcm->stat.number_of_LinphoneRegistrationOk,0, int, "%d"); - /*we should expect 2 "auth_requested": one for the TLS certificate, another one because the server rejects the REGISTER with 401.*/ + /*we should expect at least 2 "auth_requested": one for the TLS certificate, another one because the server rejects the REGISTER with 401, + with eventually MD5 + SHA256 challenge*/ /*If the certificate isn't recognized at all, the connection will not happen and no SIP response will be received from server.*/ - if (with_good_cert) BC_ASSERT_EQUAL(lcm->stat.number_of_auth_info_requested,2, int, "%d"); + if (with_good_cert) BC_ASSERT_GREATER(lcm->stat.number_of_auth_info_requested,2, int, "%d"); else BC_ASSERT_EQUAL(lcm->stat.number_of_auth_info_requested,1, int, "%d"); } From dcdb9528e673ba566b2475ebe08e898dd38487be Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Wed, 21 Mar 2018 18:27:47 +0100 Subject: [PATCH 277/281] Fix memory leaks when sending INFO messages --- src/sal/call-op.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sal/call-op.cpp b/src/sal/call-op.cpp index 936eb983b..238e6d255 100644 --- a/src/sal/call-op.cpp +++ b/src/sal/call-op.cpp @@ -376,7 +376,7 @@ void SalCallOp::set_error(belle_sip_response_t* response, bool_t fatal){ int SalCallOp::vfu_retry_cb (void *user_data, unsigned int events) { SalCallOp *op=(SalCallOp *)user_data; op->send_vfu_request(); - op->ref(); + op->unref(); return BELLE_SIP_STOP; } @@ -476,7 +476,7 @@ void SalCallOp::process_response_cb(void *op_base, const belle_sip_response_even && strcmp("media_control+xml",belle_sip_header_content_type_get_subtype(header_content_type))==0) { unsigned int retry_in = rand() % 1001; // [0;1000] belle_sip_source_t *s=op->root->create_timer(vfu_retry_cb,op->ref(), retry_in, "vfu request retry"); - ms_message("Rejected vfu request on op [%p], just retry in [%ui] ms",op,retry_in); + ms_message("Rejected vfu request on op [%p], just retry in [%u] ms",op,retry_in); belle_sip_object_unref(s); }else { /*ignoring*/ From b6678d64b6149b39e086f17cb0e4584abb6f4d90 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Mon, 26 Mar 2018 10:34:18 +0200 Subject: [PATCH 278/281] Fix error messages printed by mediastreamer2 due to empty string instead of null string. --- src/conference/session/media-session.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/conference/session/media-session.cpp b/src/conference/session/media-session.cpp index d4a4c873f..a124200cf 100644 --- a/src/conference/session/media-session.cpp +++ b/src/conference/session/media-session.cpp @@ -2697,7 +2697,7 @@ void MediaSessionPrivate::startAudioStream (CallSession::State targetState, bool io.output.soundcard = playcard; } else { io.output.type = MSResourceFile; - io.output.file = recfile.c_str(); + io.output.file = recfile.empty() ? nullptr : recfile.c_str(); } } else { io.input.type = io.output.type = MSResourceRtp; @@ -2711,7 +2711,7 @@ void MediaSessionPrivate::startAudioStream (CallSession::State targetState, bool io.output.soundcard = playcard; } else { io.output.type = MSResourceFile; - io.output.file = recfile.c_str(); + io.output.file = recfile.empty() ? nullptr : recfile.c_str(); } if (captcard) { io.input.type = MSResourceSoundcard; From eb2c46536ed61939d289664c69411576d4c774cf Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Fri, 22 Sep 2017 15:01:14 +0200 Subject: [PATCH 279/281] add offer answer test for payload types --- tester/offeranswer_tester.c | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/tester/offeranswer_tester.c b/tester/offeranswer_tester.c index b524381d5..5a70a42ba 100644 --- a/tester/offeranswer_tester.c +++ b/tester/offeranswer_tester.c @@ -105,6 +105,42 @@ static void simple_call_with_different_codec_mappings(void) { linphone_core_manager_destroy(pauline); } +static void simple_call_with_fmtps(void){ + LinphoneCoreManager* marie; + LinphoneCoreManager* pauline; + LinphoneCall *pauline_call; + + marie = linphone_core_manager_new( "marie_rc"); + pauline = linphone_core_manager_new( "pauline_tcp_rc"); + + disable_all_audio_codecs_except_one(marie->lc,"pcmu",-1); + disable_all_audio_codecs_except_one(pauline->lc,"pcmu",-1); + + /*marie set a fantasy fmtp to PCMU*/ + linphone_payload_type_set_recv_fmtp(linphone_core_get_payload_type(marie->lc, "PCMU", 8000, -1), "parles-plus-fort=1"); + + BC_ASSERT_TRUE(call(marie,pauline)); + pauline_call=linphone_core_get_current_call(pauline->lc); + BC_ASSERT_PTR_NOT_NULL(pauline_call); + if (pauline_call){ + LinphonePayloadType *pt = linphone_call_params_get_used_audio_payload_type(linphone_call_get_current_params(pauline_call)); + BC_ASSERT_PTR_NOT_NULL(pt); + if (pt){ + BC_ASSERT_STRING_EQUAL(linphone_payload_type_get_send_fmtp(pt),"parles-plus-fort=1"); + } + pt = linphone_call_params_get_used_audio_payload_type(linphone_call_get_current_params(linphone_core_get_current_call(marie->lc))); + BC_ASSERT_PTR_NOT_NULL(pt); + if (pt){ + ms_message("send_fmtp=%s, recv_fmtp=%s", linphone_payload_type_get_send_fmtp(pt), linphone_payload_type_get_recv_fmtp(pt)); + BC_ASSERT_STRING_EQUAL(linphone_payload_type_get_recv_fmtp(pt),"parles-plus-fort=1"); + } + } + + end_call(marie,pauline); + linphone_core_manager_destroy(marie); + linphone_core_manager_destroy(pauline); +} + static void call_failed_because_of_codecs(void) { LinphoneCoreManager* marie = linphone_core_manager_new( "marie_rc"); LinphoneCoreManager* pauline = linphone_core_manager_new( "pauline_tcp_rc"); @@ -492,6 +528,7 @@ static test_t offeranswer_tests[] = { TEST_NO_TAG("Start with no config", start_with_no_config), TEST_NO_TAG("Call failed because of codecs", call_failed_because_of_codecs), TEST_NO_TAG("Simple call with different codec mappings", simple_call_with_different_codec_mappings), + TEST_NO_TAG("Simple call with fmtps", simple_call_with_fmtps), TEST_NO_TAG("AVP to AVP call", avp_to_avp_call), TEST_NO_TAG("AVP to AVPF call", avp_to_avpf_call), TEST_NO_TAG("AVP to SAVP call", avp_to_savp_call), From 3ca2b0232d3f7c333d6533836e0887904fed059b Mon Sep 17 00:00:00 2001 From: Erwan Croze Date: Fri, 22 Sep 2017 16:33:35 +0200 Subject: [PATCH 280/281] Fix cancelled_ringing_call test --- tester/call_single_tester.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/tester/call_single_tester.c b/tester/call_single_tester.c index 029f921b8..88a6de226 100644 --- a/tester/call_single_tester.c +++ b/tester/call_single_tester.c @@ -1163,6 +1163,8 @@ static void cancel_other_device_after_accept(void) { BC_ASSERT_TRUE(wait_for(caller_mgr->lc,callee_mgr_2->lc,&callee_mgr_2->stat.number_of_LinphoneCallEnd,1)); BC_ASSERT_TRUE(wait_for(caller_mgr->lc,callee_mgr_2->lc,&callee_mgr_2->stat.number_of_LinphoneCallReleased,1)); + wait_for_until(caller_mgr->lc,callee_mgr_2->lc,NULL,0,500); + rei = linphone_call_get_error_info(call_callee_2); BC_ASSERT_PTR_NOT_NULL(rei); if (rei){ @@ -1353,9 +1355,10 @@ static void cancelled_ringing_call(void) { BC_ASSERT_EQUAL(pauline->stat.number_of_LinphoneCallEnd,1, int, "%d"); call_history = linphone_core_get_call_history(marie->lc); - BC_ASSERT_PTR_NOT_NULL(call_history); - BC_ASSERT_EQUAL((int)bctbx_list_size(call_history),1, int,"%i"); - BC_ASSERT_EQUAL(linphone_call_log_get_status((LinphoneCallLog*)bctbx_list_get_data(call_history)), LinphoneCallMissed, LinphoneCallStatus, "%i"); + if (BC_ASSERT_PTR_NOT_NULL(call_history)) { + BC_ASSERT_EQUAL((int)bctbx_list_size(call_history),1, int,"%i"); + BC_ASSERT_EQUAL(linphone_call_log_get_status((LinphoneCallLog*)bctbx_list_get_data(call_history)), LinphoneCallMissed, LinphoneCallStatus, "%i"); + } linphone_call_unref(out_call); linphone_core_manager_destroy(marie); @@ -5082,6 +5085,7 @@ static void recovered_call_on_network_switch_during_reinvite_1(void) { wait_for(marie->lc, pauline->lc, &marie->stat.number_of_NetworkReachableTrue, 2); BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallPaused, 1)); + wait_for_until(marie->lc, pauline->lc, NULL, 1, 2000); linphone_call_terminate(incoming_call); BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &pauline->stat.number_of_LinphoneCallEnd, 1)); BC_ASSERT_TRUE(wait_for(marie->lc, pauline->lc, &marie->stat.number_of_LinphoneCallReleased, 1)); From 0945515d6c4e50959537473e801f8c545870f543 Mon Sep 17 00:00:00 2001 From: Simon Morlat Date: Mon, 26 Mar 2018 15:40:51 +0200 Subject: [PATCH 281/281] Fix unreliability with custom header handling. (retrofit of commit 384669 from master branch) --- src/sal/sal.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/sal/sal.cpp b/src/sal/sal.cpp index 3346ab05e..a25236587 100644 --- a/src/sal/sal.cpp +++ b/src/sal/sal.cpp @@ -218,11 +218,14 @@ void Sal::process_request_event_cb (void *ud, const belle_sip_request_event_t *e if (!op->call_id) { op->call_id=ms_strdup(belle_sip_header_call_id_get_call_id(BELLE_SIP_HEADER_CALL_ID(belle_sip_message_get_header_by_type(BELLE_SIP_MESSAGE(req), belle_sip_header_call_id_t)))); } - /*It is worth noting that proxies can (and - will) remove this header field*/ + /*It is worth noting that proxies can (and will) remove this header field*/ op->set_privacy_from_message((belle_sip_message_t*)req); - - op->assign_recv_headers((belle_sip_message_t*)req); + + if (strcmp("ACK",method) != 0){ + /*The ACK custom header is processed specifically later on*/ + op->assign_recv_headers((belle_sip_message_t*)req); + } + if (op->callbacks && op->callbacks->process_request_event) { op->callbacks->process_request_event(op,event); } else {

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�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