diff --git a/coreapi/linphonecore.c b/coreapi/linphonecore.c index 753b8c9809f5be2c68d19e1730a447b6b733c95a..c190f2f50a8743ef79b2a0024545e683094b1ea0 100644 --- a/coreapi/linphonecore.c +++ b/coreapi/linphonecore.c @@ -9724,6 +9724,8 @@ LinphoneConferenceInfo *linphone_core_find_conference_information_from_uri(Linph static bctbx_list_t *get_conference_information_list(LinphoneCore *core, time_t t) { #ifdef HAVE_DB_STORAGE auto &mainDb = L_GET_PRIVATE_FROM_C_OBJECT(core)->mainDb; + if (mainDb == NULL) return NULL; + auto list = mainDb->getConferenceInfos(t); bctbx_list_t *results = NULL; diff --git a/include/linphone/types.h b/include/linphone/types.h index 887a78e1175e247454ab88a2c61f25df7473ec05..59f9a0debd7f87129fe9bda3ced31a64f8b5d6cc 100644 --- a/include/linphone/types.h +++ b/include/linphone/types.h @@ -1397,6 +1397,7 @@ typedef enum _LinphoneMagicSearchSource { LinphoneMagicSearchSourceRequest = 1 << 4, /**< Search from request : it is usually an address built from the request */ LinphoneMagicSearchSourceFavoriteFriends = 1 << 5, /**< Search in "starred" friends only */ + LinphoneMagicSearchSourceConferencesInfo = 1 << 6, /**< Search in conferences info (organizer and participants) */ LinphoneMagicSearchSourceAll = -1 /**< Search in all sources */ } LinphoneMagicSearchSource; diff --git a/src/search/magic-search.cpp b/src/search/magic-search.cpp index c51a28696d926416bf2a53dec4c4657eaac4cb8b..a8d690017d4d008cbcfb6d7ff102f758ee5dbdfe 100644 --- a/src/search/magic-search.cpp +++ b/src/search/magic-search.cpp @@ -496,6 +496,70 @@ list<std::shared_ptr<SearchResult>> MagicSearch::getAddressFromGroupChatRoomPart return resultList; } +list<std::shared_ptr<SearchResult>> MagicSearch::getAddressFromConferencesInfo( + const string &filter, const string &withDomain, const list<std::shared_ptr<SearchResult>> ¤tList) const { + list<std::shared_ptr<SearchResult>> resultList; + + const bctbx_list_t *conferencesInfo = linphone_core_get_conference_information_list(this->getCore()->getCCore()); + for (const bctbx_list_t *f = conferencesInfo; f != nullptr; f = bctbx_list_next(f)) { + LinphoneConferenceInfo *info = static_cast<LinphoneConferenceInfo *>(f->data); + const LinphoneAddress *organizer = linphone_conference_info_get_organizer(info); + if (organizer) { + LinphoneAddress *addr = linphone_address_clone(organizer); + if (filter.empty() && withDomain.empty()) { + if (findAddress(currentList, addr)) { + linphone_address_unref(addr); + continue; + } + resultList.push_back( + SearchResult::create((unsigned int)0, addr, "", nullptr, LinphoneMagicSearchSourceConferencesInfo)); + } else { + unsigned int weight = searchInAddress(addr, filter, withDomain); + if (weight > getMinWeight()) { + if (findAddress(currentList, addr)) { + linphone_address_unref(addr); + continue; + } + resultList.push_back( + SearchResult::create(weight, addr, "", nullptr, LinphoneMagicSearchSourceConferencesInfo)); + } + } + linphone_address_unref(addr); + } + + const bctbx_list_t *participants = linphone_conference_info_get_participant_infos(info); + for (const bctbx_list_t *p = participants; p != nullptr; p = bctbx_list_next(p)) { + LinphoneParticipantInfo *participantInfo = static_cast<LinphoneParticipantInfo *>(p->data); + const LinphoneAddress *addr = + linphone_address_clone(linphone_participant_info_get_address(participantInfo)); + if (filter.empty() && withDomain.empty()) { + if (findAddress(currentList, addr)) { + linphone_address_unref(const_cast<LinphoneAddress *>(addr)); + continue; + } + resultList.push_back( + SearchResult::create((unsigned int)0, addr, "", nullptr, LinphoneMagicSearchSourceConferencesInfo)); + } else { + unsigned int weight = searchInAddress(addr, filter, withDomain); + if (weight > getMinWeight()) { + if (findAddress(currentList, addr)) { + linphone_address_unref(const_cast<LinphoneAddress *>(addr)); + continue; + } + resultList.push_back( + SearchResult::create(weight, addr, "", nullptr, LinphoneMagicSearchSourceConferencesInfo)); + } + } + if (addr) { + linphone_address_unref(const_cast<LinphoneAddress *>(addr)); + } + } + } + + lInfo() << "[Magic Search] Found " << resultList.size() << " results in conferences info"; + return resultList; +} + #ifdef LDAP_ENABLED void MagicSearch::getAddressFromLDAPServerStartAsync(const string &filter, const string &withDomain, @@ -595,6 +659,10 @@ void MagicSearch::beginNewSearchAsync(const SearchRequest &request, SearchAsyncD if ((request.getSourceFlags() & LinphoneMagicSearchSourceChatRooms) == LinphoneMagicSearchSourceChatRooms) asyncData->createResult(getAddressFromGroupChatRoomParticipants(request.getFilter(), request.getWithDomain(), list<std::shared_ptr<SearchResult>>())); + if ((request.getSourceFlags() & LinphoneMagicSearchSourceConferencesInfo) == + LinphoneMagicSearchSourceConferencesInfo) + asyncData->createResult(getAddressFromConferencesInfo(request.getFilter(), request.getWithDomain(), + list<std::shared_ptr<SearchResult>>())); } void MagicSearch::mergeResults(const SearchRequest &request, SearchAsyncData *asyncData) { @@ -646,6 +714,10 @@ MagicSearch::beginNewSearch(const string &filter, const string &withDomain, int crResults = getAddressFromGroupChatRoomParticipants(filter, withDomain, *resultList); addResultsToResultsList(crResults, *resultList); } + if ((sourceFlags & LinphoneMagicSearchSourceConferencesInfo) == LinphoneMagicSearchSourceConferencesInfo) { + crResults = getAddressFromConferencesInfo(filter, withDomain, *resultList); + addResultsToResultsList(crResults, *resultList); + } return resultList; } diff --git a/src/search/magic-search.h b/src/search/magic-search.h index 9b1ac46e88a7dc743941b8e7df7b6dc831796736..43ee81b5a3350ba2b14b4ba6b9d3162fbf6ffe42 100644 --- a/src/search/magic-search.h +++ b/src/search/magic-search.h @@ -203,6 +203,19 @@ private: const std::string &withDomain, const std::list<std::shared_ptr<SearchResult>> ¤tList) const; + /** + * Get all addresses from conferences info participants & organizer + * @param[in] filter word we search + * @param[in] withDomain domain which we want to search only + * @param[in] currentList current list where we will check if address already exist + * @return all addresses from conferences info organizer and participants which match in a SearchResult list + * @private + **/ + std::list<std::shared_ptr<SearchResult>> + getAddressFromConferencesInfo(const std::string &filter, + const std::string &withDomain, + const std::list<std::shared_ptr<SearchResult>> ¤tList) const; + #ifdef LDAP_ENABLED /** * Get all addresses from LDAP Server