diff --git a/src/conversationmodel.cpp b/src/conversationmodel.cpp index cbdd113aa5a889b498ba98b3ee4d44d5c5f9f177..e0248959bd8142438cc13c09e6fa592e702716f5 100644 --- a/src/conversationmodel.cpp +++ b/src/conversationmodel.cpp @@ -138,7 +138,7 @@ public: * @param convId * @param contactUri */ - void addConversationWith(const QString& convId, const QString& contactUri); + void addConversationWith(const QString& convId, const QString& contactUri, bool isRequest); /** * Add a swarm conversation to conversation list * @param convId @@ -1924,16 +1924,17 @@ ConversationModelPimpl::initConversations() auto conv = storage::getConversationsWithPeer(db, c.second.profileInfo.uri); if (hasOneOneSwarmWith(c.second.profileInfo.uri)) continue; + bool isRequest = c.second.profileInfo.type == profile::Type::PENDING; if (conv.empty()) { // Can't find a conversation with this contact // add pending not swarm conversation - if (c.second.profileInfo.type == profile::Type::PENDING) { + if (isRequest) { addContactRequest(c.second.profileInfo.uri); continue; } conv.push_back(storage::beginConversationWithPeer(db, c.second.profileInfo.uri)); } - addConversationWith(conv[0], c.first); + addConversationWith(conv[0], c.first, isRequest); auto convIdx = indexOf(conv[0]); @@ -2464,7 +2465,7 @@ ConversationModelPimpl::slotConversationRemoved(const QString& accountId, if (conv.empty()) { conv.push_back(storage::beginConversationWithPeer(db, contactId)); } - addConversationWith(conv[0], contactId); + addConversationWith(conv[0], contactId, false); emit linked.newConversation(conv[0]); } else { removeConversation(); @@ -2547,12 +2548,14 @@ ConversationModelPimpl::slotContactAdded(const QString& contactUri) 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; + removeConversation = indexOf(contactUri) != -1 && indexOf(conv[0]) == -1; // add a conversation if not exists addConversation = indexOf(conv[0]) == -1; @@ -2568,7 +2571,7 @@ ConversationModelPimpl::slotContactAdded(const QString& contactUri) } } if (addConversation) { - addConversationWith(conv[0], contactUri); + addConversationWith(conv[0], contactUri, false); emit linked.conversationReady(conv[0], contactUri); emit linked.newConversation(conv[0]); } @@ -2577,6 +2580,10 @@ ConversationModelPimpl::slotContactAdded(const QString& contactUri) invalidateModel(); Q_EMIT linked.conversationRemoved(contactUri); emit linked.modelChanged(); + } else if (!addConversation) { + invalidateModel(); + emit linked.modelChanged(); + emit linked.conversationReady(conv[0], contactUri); } } @@ -2807,7 +2814,7 @@ ConversationModelPimpl::addSwarmConversation(const QString& convId) } void -ConversationModelPimpl::addConversationWith(const QString& convId, const QString& contactUri) +ConversationModelPimpl::addConversationWith(const QString& convId, const QString& contactUri, bool isRequest) { conversation::Info conversation; conversation.uid = convId; @@ -2815,6 +2822,8 @@ ConversationModelPimpl::addConversationWith(const QString& convId, const QString conversation.participants = {contactUri}; conversation.mode = conversation::Mode::NON_SWARM; conversation.needsSyncing = false; + conversation.isRequest = isRequest; + try { conversation.confId = linked.owner.callModel->getConferenceFromURI(contactUri).id; } catch (...) { @@ -3059,10 +3068,15 @@ ConversationModelPimpl::addOrUpdateCallMessage(const QString& callId, auto contact = linked.owner.contactModel->getContact(from); if (contact.profileInfo.type == profile::Type::PENDING && !contact.isBanned) { addContactRequest(from); + convIds.push_back(storage::beginConversationWithPeer(db, contact.profileInfo.uri)); + auto& conv = getConversationForPeerUri(contact.profileInfo.uri).get(); + conv.uid = convIds[0]; + } else { + return; } } catch (const std::out_of_range&) { + return; } - return; } // Get conversation auto conv_it = std::find_if(conversations.begin(), @@ -3153,17 +3167,24 @@ ConversationModelPimpl::addIncomingMessage(const QString& peerId, const QString& daemonId) { auto convIds = storage::getConversationsWithPeer(db, peerId); + bool isRequest = false; if (convIds.empty()) { // in case if we receive a message after removing contact, add a conversation request try { auto contact = linked.owner.contactModel->getContact(peerId); - if (contact.profileInfo.type == profile::Type::PENDING && !contact.isBanned + isRequest = contact.profileInfo.type == profile::Type::PENDING; + 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(); + conv.uid = convIds[0]; + } else { + return ""; } } catch (const std::out_of_range&) { + return""; } - return ""; } auto msg = interaction::Info {peerId, body, @@ -3180,7 +3201,7 @@ ConversationModelPimpl::addIncomingMessage(const QString& peerId, auto conversationIdx = indexOf(convIds[0]); // Add the conversation if not already here if (conversationIdx == -1) { - addConversationWith(convIds[0], peerId); + addConversationWith(convIds[0], peerId, isRequest); emit linked.newConversation(convIds[0]); } else { { @@ -3576,18 +3597,24 @@ ConversationModelPimpl::slotTransferStatusCreated(const QString& fileId, datatra return; // create a new conversation if needed auto convIds = storage::getConversationsWithPeer(db, info.peerUri); + bool isRequest = false; if (convIds.empty()) { // in case if we receive file after removing contact add conversation request. If we have // swarm request this function will do nothing. try { auto contact = linked.owner.contactModel->getContact(info.peerUri); - if (contact.profileInfo.type == profile::Type::PENDING && !contact.isBanned - && info.peerUri != linked.owner.profileInfo.uri) { + isRequest = contact.profileInfo.type == profile::Type::PENDING; + if (isRequest && !contact.isBanned && info.peerUri != linked.owner.profileInfo.uri) { addContactRequest(info.peerUri); + convIds.push_back(storage::beginConversationWithPeer(db, contact.profileInfo.uri)); + auto& conv = getConversationForPeerUri(contact.profileInfo.uri).get(); + conv.uid = convIds[0]; + } else { + return; } } catch (const std::out_of_range&) { + return; } - return; } // add interaction to the db @@ -3608,7 +3635,7 @@ ConversationModelPimpl::slotTransferStatusCreated(const QString& fileId, datatra // prepare interaction Info and emit signal for the client auto conversationIdx = indexOf(convId); if (conversationIdx == -1) { - addConversationWith(convId, info.peerUri); + addConversationWith(convId, info.peerUri, isRequest); emit linked.newConversation(convId); } else { {