diff --git a/src/jamidht/conversation.cpp b/src/jamidht/conversation.cpp index 0cb915f561ec6a75f1eda692a05f617ab591db39..7a0daa0127553a11c16eb0c7e93dfca2ce16fe26 100644 --- a/src/jamidht/conversation.cpp +++ b/src/jamidht/conversation.cpp @@ -161,14 +161,24 @@ public: const std::string& conversationId) : account_(account) { + std::vector<ConversationCommit> commits; repository_ = ConversationRepository::cloneConversation(account, remoteDevice, - conversationId); + conversationId, + std::move([&](auto c) { + commits = std::move(c); + })); if (!repository_) { emitSignal<libjami::ConversationSignal::OnConversationError>( account->getAccountID(), conversationId, EFETCH, "Couldn't clone repository"); throw std::logic_error("Couldn't clone repository"); } + // To detect current active calls, we need to check history + conversationDataPath_ = fileutils::get_data_dir() / account->getAccountID() + / "conversation_data" / conversationId; + activeCallsPath_ = conversationDataPath_ / ConversationMapKeys::ACTIVE_CALLS; + for (const auto& c: repository_->convCommitToMap(commits)) + updateActiveCalls(c); init(); } @@ -271,10 +281,11 @@ public: * Update activeCalls_ via announced commits (in load or via new commits) * @param commit Commit to check * @param eraseOnly If we want to ignore added commits + * @param emitSig If we want to emit to client * @note eraseOnly is used by loadMessages. This is a fail-safe, this SHOULD NOT happen */ void updateActiveCalls(const std::map<std::string, std::string>& commit, - bool eraseOnly = false) const + bool eraseOnly = false, bool emitSig = true) const { if (!repository_) return; @@ -296,9 +307,10 @@ public: } if (updateActives) { saveActiveCalls(); - emitSignal<libjami::ConfigurationSignal::ActiveCallsChanged>(accountId_, - repository_->id(), - activeCalls_); + if (emitSig) + emitSignal<libjami::ConfigurationSignal::ActiveCallsChanged>(accountId_, + repository_->id(), + activeCalls_); } return; } @@ -331,9 +343,10 @@ public: activeCall["device"] = device; activeCalls_.emplace_back(activeCall); saveActiveCalls(); - emitSignal<libjami::ConfigurationSignal::ActiveCallsChanged>(accountId_, - repository_->id(), - activeCalls_); + if (emitSig) + emitSignal<libjami::ConfigurationSignal::ActiveCallsChanged>(accountId_, + repository_->id(), + activeCalls_); } } else { if (itActive != activeCalls_.end()) { @@ -366,9 +379,10 @@ public: } } saveActiveCalls(); - emitSignal<libjami::ConfigurationSignal::ActiveCallsChanged>(accountId_, - repository_->id(), - activeCalls_); + if (emitSig) + emitSignal<libjami::ConfigurationSignal::ActiveCallsChanged>(accountId_, + repository_->id(), + activeCalls_); } } } diff --git a/src/jamidht/conversationrepository.cpp b/src/jamidht/conversationrepository.cpp index 16963cfe9ed39de5813469ad4929bfebb6963179..8bcb71a52aa67a19e04e5174d4430222a9f13e5d 100644 --- a/src/jamidht/conversationrepository.cpp +++ b/src/jamidht/conversationrepository.cpp @@ -2524,7 +2524,8 @@ ConversationRepository::createConversation(const std::shared_ptr<JamiAccount>& a std::unique_ptr<ConversationRepository> ConversationRepository::cloneConversation(const std::shared_ptr<JamiAccount>& account, const std::string& deviceId, - const std::string& conversationId) + const std::string& conversationId, + std::function<void(std::vector<ConversationCommit>)>&& checkCommitCb) { auto conversationsPath = fileutils::get_data_dir() / account->getAccountID() / "conversations"; dhtnet::fileutils::check_dir(conversationsPath); @@ -2570,7 +2571,7 @@ ConversationRepository::cloneConversation(const std::shared_ptr<JamiAccount>& ac git_repository_free(rep); auto repo = std::make_unique<ConversationRepository>(account, conversationId); repo->pinCertificates(true); // need to load certificates to validate non known members - if (!repo->validClone()) { + if (!repo->validClone(std::move(checkCommitCb))) { repo->erase(); JAMI_ERROR("Error when validating remote conversation"); return nullptr; @@ -3635,9 +3636,15 @@ ConversationRepository::validFetch(const std::string& remoteDevice) const } bool -ConversationRepository::validClone() const +ConversationRepository::validClone(std::function<void(std::vector<ConversationCommit>)>&& checkCommitCb) const { - return pimpl_->validCommits(log({})); + auto commits = log({}); + auto res = pimpl_->validCommits(commits); + if (!res) + return false; + if (checkCommitCb) + checkCommitCb(std::move(commits)); + return true; } void diff --git a/src/jamidht/conversationrepository.h b/src/jamidht/conversationrepository.h index 937c7517b44d3efc3b9d5497b368ffcccdfa9367..2202227dcf2a6df2f7e3fe2eca97df8d39ca9d85 100644 --- a/src/jamidht/conversationrepository.h +++ b/src/jamidht/conversationrepository.h @@ -158,12 +158,13 @@ public: * @param account The account getting the conversation * @param deviceId Remote device * @param conversationId Conversation to clone - * @param socket Socket used to clone + * @param checkCommitCb Used if commits should be treated */ static LIBJAMI_TESTABLE std::unique_ptr<ConversationRepository> cloneConversation( const std::shared_ptr<JamiAccount>& account, const std::string& deviceId, - const std::string& conversationId); + const std::string& conversationId, + std::function<void(std::vector<ConversationCommit>)>&& checkCommitCb = {}); /** * Open a conversation repository for an account and an id @@ -334,7 +335,7 @@ public: */ std::pair<std::vector<ConversationCommit>, bool> validFetch( const std::string& remoteDevice) const; - bool validClone() const; + bool validClone(std::function<void(std::vector<ConversationCommit>)>&& checkCommitCb) const; /** * Delete branch with remote