diff --git a/src/conversationmodel.cpp b/src/conversationmodel.cpp index e0248959bd8142438cc13c09e6fa592e702716f5..ee94d4902589548d584e971893bd5656bb20797c 100644 --- a/src/conversationmodel.cpp +++ b/src/conversationmodel.cpp @@ -108,14 +108,14 @@ public: */ std::reference_wrapper<conversation::Info> getConversationForPeerUri( const QString& uri, const bool searchResultIncluded = false) const; - /** - * return a conversation index from conversations or -1 if no index is found. - * @param uri of the contact to search. - * @return an int. + * return a vector of conversation indices for the given contact uri empty + * if no index is found + * @param uri of the contact to search + * @param writable whether or not to exclude read-only conversations(use for interactions) + * @return an vector of indices */ - int indexOfContact(const QString& uri) const; - + std::vector<int> getIndicesForContact(const QString& uri, bool writable = false) const; /** * Initialize conversations_ and filteredConversations_ */ @@ -1986,9 +1986,12 @@ ConversationModelPimpl::peersForConversation(const conversation::Info& conversat // Note: for one to one, we must return self if (conversation.participants.size() == 1) return conversation.participants; - for (const auto& participant : conversation.participants) + for (const auto& participant : conversation.participants) { + if (participant.isNull()) + continue; if (participant != linked.owner.profileInfo.uri) result.push_back(participant); + } return result; } @@ -2694,16 +2697,20 @@ ConversationModelPimpl::slotPendingContactAccepted(const QString& uri) void ConversationModelPimpl::slotContactRemoved(const QString& uri) { - auto conversationIdx = indexOfContact(uri); - if (conversationIdx == -1) { - qDebug() << "ConversationModelPimpl::slotContactRemoved, but conversation not found"; - return; // Not a contact + std::vector<QString> convIdsToRemove; + + // save the ids to remove from the list + for (auto i : getIndicesForContact(uri)) { + convIdsToRemove.emplace_back(conversations[i].uid); + } + + // actually remove them from the list + for (auto id : convIdsToRemove) { + eraseConversation(id); + emit linked.conversationRemoved(id); } - auto& conversationId = conversations[conversationIdx].uid; - eraseConversation(conversationIdx); invalidateModel(); - emit linked.conversationRemoved(conversationId); emit linked.modelChanged(); } @@ -2814,7 +2821,9 @@ ConversationModelPimpl::addSwarmConversation(const QString& convId) } void -ConversationModelPimpl::addConversationWith(const QString& convId, const QString& contactUri, bool isRequest) +ConversationModelPimpl::addConversationWith(const QString& convId, + const QString& contactUri, + bool isRequest) { conversation::Info conversation; conversation.uid = convId; @@ -2924,20 +2933,21 @@ ConversationModelPimpl::getConversationForPeerUri(const QString& uri, searchResultIncluded); } -int -ConversationModelPimpl::indexOfContact(const QString& uri) const +std::vector<int> +ConversationModelPimpl::getIndicesForContact(const QString& uri, bool writable) const { + std::vector<int> ret; for (unsigned int i = 0; i < conversations.size(); ++i) { - if (!conversations.at(i).isCoreDialog()) { + const auto& convInfo = conversations.at(i); + if (!convInfo.isCoreDialog() || (writable && convInfo.readOnly)) { continue; } - auto peers = peersForConversation(conversations.at(i)); - if (peers.isEmpty()) - continue; - if (peers.front() == uri) - return i; + auto peers = peersForConversation(convInfo); + if (!peers.isEmpty() && peers.front() == uri) { + ret.emplace_back(i); + } } - return -1; + return ret; } void @@ -2955,14 +2965,14 @@ ConversationModelPimpl::slotIncomingCall(const QString& fromId, const QString& c } catch (const std::out_of_range&) { } } - auto conversationIdx = indexOfContact(fromId); - if (conversationIdx == -1) { + auto conversationIndices = getIndicesForContact(fromId); + if (conversationIndices.empty()) { qDebug() << "ConversationModelPimpl::slotIncomingCall, but conversation not found"; return; // Not a contact } - auto& conversation = conversations.at(conversationIdx); + auto& conversation = conversations.at(conversationIndices.at(0)); qDebug() << "Add call to conversation with " << fromId; conversation.callId = callId; @@ -3173,8 +3183,7 @@ ConversationModelPimpl::addIncomingMessage(const QString& peerId, try { auto contact = linked.owner.contactModel->getContact(peerId); isRequest = contact.profileInfo.type == profile::Type::PENDING; - if (isRequest && !contact.isBanned - && peerId != linked.owner.profileInfo.uri) { + if (isRequest && !contact.isBanned && peerId != linked.owner.profileInfo.uri) { addContactRequest(peerId); convIds.push_back(storage::beginConversationWithPeer(db, contact.profileInfo.uri)); auto& conv = getConversationForPeerUri(contact.profileInfo.uri).get(); @@ -3183,7 +3192,7 @@ ConversationModelPimpl::addIncomingMessage(const QString& peerId, return ""; } } catch (const std::out_of_range&) { - return""; + return ""; } } auto msg = interaction::Info {peerId,