diff --git a/daemon b/daemon index 8c1c74f0f3dff84361302d65e724c899eb708f91..9991ff8153e321b7abd5080cb3b250b822991552 160000 --- a/daemon +++ b/daemon @@ -1 +1 @@ -Subproject commit 8c1c74f0f3dff84361302d65e724c899eb708f91 +Subproject commit 9991ff8153e321b7abd5080cb3b250b822991552 diff --git a/src/libclient/conversationmodel.cpp b/src/libclient/conversationmodel.cpp index e2660bdfa2c4e47bd9bc9d41bd3ccf05706d6bc6..de2df8a4143d5bbc2e4e966cd3f49d96f5777dc1 100644 --- a/src/libclient/conversationmodel.cpp +++ b/src/libclient/conversationmodel.cpp @@ -2895,65 +2895,47 @@ ConversationModelPimpl::slotActiveCallsChanged(const QString& accountId, void ConversationModelPimpl::slotContactAdded(const QString& contactUri) { - auto conv = storage::getConversationsWithPeer(db, contactUri); - bool addConversation = false; - bool removeConversation = false; + + QString convId; try { - auto& conversation = getConversationForPeerUri(contactUri).get(); - // swarm conversation we update when receive conversation ready signal. - if (conversation.isSwarm()) { - MapStringString details = ConfigurationManager::instance() - .conversationInfos(linked.owner.id, conversation.uid); - bool needsSyncing = details["syncing"] == "true"; - if (conversation.needsSyncing != needsSyncing) { - conversation.isRequest = false; - conversation.needsSyncing = needsSyncing; - Q_EMIT linked.dataChanged(indexOf(conversation.uid)); - Q_EMIT linked.conversationUpdated(conversation.uid); - invalidateModel(); - Q_EMIT linked.modelChanged(); - } - return; - } else { - conversation.isRequest = false; - } - if (conv.empty()) { - conv.push_back(storage::beginConversationWithPeer(db, contactUri)); - } - // remove temporary conversation that was added when receiving an incoming request - removeConversation = indexOf(contactUri) != -1 && indexOf(conv[0]) == -1; + convId = linked.owner.contactModel->getContact(contactUri).conversationId; + } catch (std::out_of_range& e) { + return; + } - // add a conversation if not exists - addConversation = indexOf(conv[0]) == -1; - } catch (std::out_of_range&) { - /* - if the conversation does not exists we save it to DB and add non-swarm - conversation to the conversion list. After receiving a conversation request or - conversation ready signal swarm conversation should be updated and removed from DB. - */ - addConversation = true; - if (conv.empty()) { - conv.push_back(storage::beginConversationWithPeer(db, + auto isSwarm = !convId.isEmpty(); + auto conv = !isSwarm? storage::getConversationsWithPeer(db, contactUri) : VectorString {convId}; + if (conv.isEmpty()) { + if (linked.owner.profileInfo.type == profile::Type::SIP) { + auto convId = storage::beginConversationWithPeer(db, contactUri, true, linked.owner.contactModel->getAddedTs( - contactUri))); + contactUri)); + addConversationWith(convId, contactUri, false); + Q_EMIT linked.conversationReady(convId, contactUri); + Q_EMIT linked.newConversation(convId); } + return; } - if (addConversation) { - addConversationWith(conv[0], contactUri, false); - Q_EMIT linked.conversationReady(conv[0], contactUri); - Q_EMIT linked.newConversation(conv[0]); - } - if (removeConversation) { - eraseConversation(indexOf(contactUri)); - invalidateModel(); - Q_EMIT linked.conversationRemoved(contactUri); - Q_EMIT linked.modelChanged(); - } else if (!addConversation) { - invalidateModel(); - Q_EMIT linked.modelChanged(); - Q_EMIT linked.conversationReady(conv[0], contactUri); + convId = conv[0]; + try { + auto& conversation = getConversationForUid(convId).get(); + MapStringString details = ConfigurationManager::instance() + .conversationInfos(linked.owner.id, conversation.uid); + bool needsSyncing = details["syncing"] == "true"; + if (conversation.needsSyncing != needsSyncing) { + conversation.isRequest = false; + conversation.needsSyncing = needsSyncing; + Q_EMIT linked.dataChanged(indexOf(conversation.uid)); + Q_EMIT linked.conversationUpdated(conversation.uid); + invalidateModel(); + Q_EMIT linked.modelChanged(); + } + } catch (...) { + if (isSwarm) { + addSwarmConversation(convId); + } } }