check if safe connection is being destroyed before trying lock

Add apply button and success/error toast for managing chatroom participants

debug logs
This commit is contained in:
Gaelle Braud 2026-01-30 16:17:21 +01:00
parent bdca7f3f03
commit d234a6c3d4
9 changed files with 168 additions and 45 deletions

View file

@ -231,10 +231,8 @@ void ChatCore::setSelf(const QSharedPointer<ChatCore> &me) {
return;
}
if (mChatModel->getMonitor() != chatRoom) return;
lDebug() << log().arg("CHAT MESSAGE RECEIVED IN CHATROOM") << this << mChatModel->getTitle();
lInfo() << log().arg("Chat message received in chatroom") << this << mChatModel->getTitle();
lInfo() << log().arg("Safe Connection =") << mChatModelConnection.get();
lInfo() << log().arg("this =") << this;
lInfo() << log().arg("Connection =") << mChatModelConnection.get();
QList<QSharedPointer<EventLogCore>> list;
for (auto &e : eventsLog) {
if (!e) {
@ -391,6 +389,15 @@ void ChatCore::setSelf(const QSharedPointer<ChatCore> &me) {
setMeAdmin(meAdmin);
});
});
mChatModelConnection->makeConnectToModel(
&ChatModel::participantAddressesChanged,
[this](const std::shared_ptr<linphone::ChatRoom> &chatRoom, bool success) {
if (!success) {
auto participants = buildParticipants(chatRoom);
mChatModelConnection->invokeToCore([this, participants] { setParticipants(participants); });
}
mChatModelConnection->invokeToCore([this, success] { emit participantAddressesChanged(success); });
});
mChatModelConnection->makeConnectToCore(&ChatCore::lRemoveParticipantAtIndex, [this](int index) {
mChatModelConnection->invokeToModel([this, index]() { mChatModel->removeParticipantAtIndex(index); });
});

View file

@ -175,6 +175,7 @@ signals:
void fileListChanged();
void isSecuredChanged();
void conferenceJoined();
void participantAddressesChanged(bool success);
void lDeleteMessage(ChatMessageGui *message);
void lDelete();

View file

@ -2472,44 +2472,44 @@ Error</extracomment>
<context>
<name>ChatMessagesListView</name>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="110"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="121"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="111"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="122"/>
<source>popup_info_find_message_title</source>
<extracomment>Find message</extracomment>
<translation>Nachricht suchen</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="123"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="124"/>
<source>info_popup_no_result_message</source>
<extracomment>No result found</extracomment>
<translation>Keine Ergebnisse gefunden</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="115"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="116"/>
<source>info_popup_first_result_message</source>
<extracomment>First result reached</extracomment>
<translation>Erstes Ergebnis erreicht</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="113"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="114"/>
<source>info_popup_last_result_message</source>
<extracomment>Last result reached</extracomment>
<translation>Letztes Ergebnis erreicht</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="160"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="161"/>
<source>chat_message_list_encrypted_header_title</source>
<extracomment>End to end encrypted chat</extracomment>
<translation>Ende-zu-Ende-verschlüsselter Chat</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="162"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="163"/>
<source>unencrypted_conversation_warning</source>
<extracomment>This conversation is not encrypted !</extracomment>
<translation>Dieser Chat ist nicht verschlüsselt!</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="173"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="174"/>
<source>chat_message_list_encrypted_header_message</source>
<extracomment>Messages in this conversation are e2e encrypted.
Only your correspondent can decrypt them.</extracomment>
@ -2517,7 +2517,7 @@ Error</extracomment>
Nur Ihr Gesprächspartner kann sie entschlüsseln.</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="175"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="176"/>
<source>chat_message_list_not_encrypted_header_message</source>
<extracomment>Messages are not end to end encrypted,
may sure you don&apos;t share any sensitive information !</extracomment>
@ -2525,7 +2525,7 @@ Nur Ihr Gesprächspartner kann sie entschlüsseln.</translation>
Stellen Sie sicher, dass Sie keine sensiblen Informationen teilen!</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="215"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="216"/>
<source>chat_message_is_writing_info</source>
<extracomment>%1 is writing</extracomment>
<translation>%1 schreibt</translation>
@ -4362,7 +4362,7 @@ Ablauf: %1</translation>
<context>
<name>MagicSearchList</name>
<message>
<location filename="../../core/search/MagicSearchList.cpp" line="145"/>
<location filename="../../core/search/MagicSearchList.cpp" line="146"/>
<source>device_id</source>
<translation>Telefon</translation>
</message>
@ -4606,10 +4606,38 @@ Ablauf: %1</translation>
<context>
<name>ManageParticipants</name>
<message>
<location filename="../../view/Page/Layout/Chat/ManageParticipants.qml" line="44"/>
<location filename="../../view/Page/Layout/Chat/ManageParticipants.qml" line="29"/>
<source>info_popup_error_title</source>
<translation type="unfinished">Fehler</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ManageParticipants.qml" line="31"/>
<source>info_popup_manage_participant_error_message</source>
<extracomment>Error while setting participants !</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ManageParticipants.qml" line="34"/>
<source>info_popup_success_title</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ManageParticipants.qml" line="36"/>
<source>info_popup_manage_participant_updated_message</source>
<extracomment>Participants updated</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ManageParticipants.qml" line="59"/>
<source>group_infos_manage_participants</source>
<translation>Teilnehmer</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ManageParticipants.qml" line="68"/>
<source>apply_button_text</source>
<extracomment>Apply</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MeetingForm</name>

View file

@ -2430,44 +2430,44 @@ Error</extracomment>
<context>
<name>ChatMessagesListView</name>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="110"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="121"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="111"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="122"/>
<source>popup_info_find_message_title</source>
<extracomment>Find message</extracomment>
<translation>Find message</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="123"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="124"/>
<source>info_popup_no_result_message</source>
<extracomment>No result found</extracomment>
<translation>No result found</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="115"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="116"/>
<source>info_popup_first_result_message</source>
<extracomment>First result reached</extracomment>
<translation>First result reached</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="113"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="114"/>
<source>info_popup_last_result_message</source>
<extracomment>Last result reached</extracomment>
<translation>Last result reached</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="160"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="161"/>
<source>chat_message_list_encrypted_header_title</source>
<extracomment>End to end encrypted chat</extracomment>
<translation>End to end encrypted chat</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="162"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="163"/>
<source>unencrypted_conversation_warning</source>
<extracomment>This conversation is not encrypted !</extracomment>
<translation>This conversation is not encrypted !</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="173"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="174"/>
<source>chat_message_list_encrypted_header_message</source>
<extracomment>Messages in this conversation are e2e encrypted.
Only your correspondent can decrypt them.</extracomment>
@ -2475,7 +2475,7 @@ Error</extracomment>
Only your correspondent can decrypt them.</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="175"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="176"/>
<source>chat_message_list_not_encrypted_header_message</source>
<extracomment>Messages are not end to end encrypted,
may sure you don&apos;t share any sensitive information !</extracomment>
@ -2483,7 +2483,7 @@ Only your correspondent can decrypt them.</translation>
may sure you don&apos;t share any sensitive information !</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="215"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="216"/>
<source>chat_message_is_writing_info</source>
<extracomment>%1 is writing</extracomment>
<translation>%1 is writing</translation>
@ -4260,7 +4260,7 @@ Expiration : %1</translation>
<context>
<name>MagicSearchList</name>
<message>
<location filename="../../core/search/MagicSearchList.cpp" line="145"/>
<location filename="../../core/search/MagicSearchList.cpp" line="146"/>
<source>device_id</source>
<translation>Phone</translation>
</message>
@ -4504,10 +4504,38 @@ Expiration : %1</translation>
<context>
<name>ManageParticipants</name>
<message>
<location filename="../../view/Page/Layout/Chat/ManageParticipants.qml" line="44"/>
<location filename="../../view/Page/Layout/Chat/ManageParticipants.qml" line="29"/>
<source>info_popup_error_title</source>
<translation type="unfinished">Error</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ManageParticipants.qml" line="31"/>
<source>info_popup_manage_participant_error_message</source>
<extracomment>Error while setting participants !</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ManageParticipants.qml" line="34"/>
<source>info_popup_success_title</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ManageParticipants.qml" line="36"/>
<source>info_popup_manage_participant_updated_message</source>
<extracomment>Participants updated</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ManageParticipants.qml" line="59"/>
<source>group_infos_manage_participants</source>
<translation>Participants</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ManageParticipants.qml" line="68"/>
<source>apply_button_text</source>
<extracomment>Apply</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MeetingForm</name>

View file

@ -2405,44 +2405,44 @@ Error</extracomment>
<context>
<name>ChatMessagesListView</name>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="110"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="121"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="111"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="122"/>
<source>popup_info_find_message_title</source>
<extracomment>Find message</extracomment>
<translation>Trouver un message</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="123"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="124"/>
<source>info_popup_no_result_message</source>
<extracomment>No result found</extracomment>
<translation>Aucun résultat trouvé</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="115"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="116"/>
<source>info_popup_first_result_message</source>
<extracomment>First result reached</extracomment>
<translation>Premier résultat atteint</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="113"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="114"/>
<source>info_popup_last_result_message</source>
<extracomment>Last result reached</extracomment>
<translation>Dernier résultat atteint</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="160"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="161"/>
<source>chat_message_list_encrypted_header_title</source>
<extracomment>End to end encrypted chat</extracomment>
<translation>Conversation chiffrée de bout en bout</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="162"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="163"/>
<source>unencrypted_conversation_warning</source>
<extracomment>This conversation is not encrypted !</extracomment>
<translation>Cette conversation n&apos;est pas chiffrée !</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="173"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="174"/>
<source>chat_message_list_encrypted_header_message</source>
<extracomment>Messages in this conversation are e2e encrypted.
Only your correspondent can decrypt them.</extracomment>
@ -2450,7 +2450,7 @@ Error</extracomment>
en bout. Seul votre correspondant peut les déchiffrer.</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="175"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="176"/>
<source>chat_message_list_not_encrypted_header_message</source>
<extracomment>Messages are not end to end encrypted,
may sure you don&apos;t share any sensitive information !</extracomment>
@ -2458,7 +2458,7 @@ en bout. Seul votre correspondant peut les déchiffrer.</translation>
assurez-vous de ne pas partager dinformations sensibles !</translation>
</message>
<message>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="215"/>
<location filename="../../view/Control/Display/Chat/ChatMessagesListView.qml" line="216"/>
<source>chat_message_is_writing_info</source>
<extracomment>%1 is writing</extracomment>
<translation>%1 est en train d&apos;écrire</translation>
@ -4235,7 +4235,7 @@ Expiration : %1</translation>
<context>
<name>MagicSearchList</name>
<message>
<location filename="../../core/search/MagicSearchList.cpp" line="145"/>
<location filename="../../core/search/MagicSearchList.cpp" line="146"/>
<source>device_id</source>
<translation>Téléphone</translation>
</message>
@ -4475,10 +4475,38 @@ Expiration : %1</translation>
<context>
<name>ManageParticipants</name>
<message>
<location filename="../../view/Page/Layout/Chat/ManageParticipants.qml" line="44"/>
<location filename="../../view/Page/Layout/Chat/ManageParticipants.qml" line="29"/>
<source>info_popup_error_title</source>
<translation>Erreur</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ManageParticipants.qml" line="31"/>
<source>info_popup_manage_participant_error_message</source>
<extracomment>Error while setting participants !</extracomment>
<translation>Erreur lors de la modification des participants !</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ManageParticipants.qml" line="34"/>
<source>info_popup_success_title</source>
<translation>Enregistré</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ManageParticipants.qml" line="36"/>
<source>info_popup_manage_participant_updated_message</source>
<extracomment>Participants updated</extracomment>
<translation>Participants mis à jour</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ManageParticipants.qml" line="59"/>
<source>group_infos_manage_participants</source>
<translation>Participants</translation>
</message>
<message>
<location filename="../../view/Page/Layout/Chat/ManageParticipants.qml" line="68"/>
<source>apply_button_text</source>
<extracomment>Apply</extracomment>
<translation>Appliquer</translation>
</message>
</context>
<context>
<name>MeetingForm</name>

View file

@ -232,17 +232,23 @@ void ChatModel::toggleParticipantAdminStatusAtIndex(int index) const {
mMonitor->setParticipantAdminStatus(participant, !participant->isAdmin());
}
void ChatModel::setParticipantAddresses(const QStringList &addresses) const {
void ChatModel::setParticipantAddresses(const QStringList &addresses) {
QSet<QString> s{addresses.cbegin(), addresses.cend()};
bool soFarSoGood = true;
for (auto p : mMonitor->getParticipants()) {
auto address = Utils::coreStringToAppString(p->getAddress()->asStringUriOnly());
if (s.contains(address)) s.remove(address);
else mMonitor->removeParticipant(p);
else {
mMonitor->removeParticipants({p});
}
}
for (const auto &a : s) {
auto address = linphone::Factory::get()->createAddress(Utils::appStringToCoreString(a));
if (address) mMonitor->addParticipant(address);
if (address) {
soFarSoGood &= mMonitor->addParticipants({address});
}
}
emit participantAddressesChanged(mMonitor, soFarSoGood);
}
//---------------------------------------------------------------//

View file

@ -83,7 +83,7 @@ public:
void setEphemeralLifetime(int time);
void setSubject(QString subject) const;
void removeParticipantAtIndex(int index) const;
void setParticipantAddresses(const QStringList &addresses) const;
void setParticipantAddresses(const QStringList &addresses);
void toggleParticipantAdminStatusAtIndex(int index) const;
signals:
@ -93,6 +93,7 @@ signals:
void mutedChanged(bool muted);
void ephemeralEnableChanged(bool enable);
void ephemeralLifetimeChanged(int time);
void participantAddressesChanged(const std::shared_ptr<linphone::ChatRoom> &chatRoom, bool success);
private:
DECLARE_ABSTRACT_OBJECT

View file

@ -66,7 +66,7 @@ template <class A, class B>
class SafeConnection : public QObject {
// Use create functions.
protected:
SafeConnection(const QSharedPointer<A> &a, std::shared_ptr<B> b)
SafeConnection(QSharedPointer<A> a, std::shared_ptr<B> b)
: mCore(a), mModel(b), mCoreObject(a.get()), mModelObject(b.get()) {
}
SafeConnection(QSharedPointer<A> a, QSharedPointer<B> b)
@ -150,6 +150,7 @@ public:
}
bool tryLock() {
if (!this) return false;
mLocker.lock();
auto coreLocked = mCore.lock();
auto modelLocked = mModel.lock();

View file

@ -22,6 +22,22 @@ Rectangle {
height: participantAddColumn.implicitHeight
signal done()
Connections {
enabled: chatGui !== null
target: chatGui.core
function onParticipantAddressesChanged(success) {
if (!success) UtilsCpp.showInformationPopup(qsTr("info_popup_error_title"),
//: Error while setting participants !
qsTr("info_popup_manage_participant_error_message"), false)
else {
mainItem.done()
UtilsCpp.showInformationPopup(qsTr("info_popup_success_title"),
//: Participants updated
qsTr("info_popup_manage_participant_updated_message"), true)
}
}
}
ColumnLayout {
id: participantAddColumn
anchors.fill: parent
@ -36,7 +52,6 @@ Rectangle {
style: ButtonStyle.noBackground
icon.source: AppIcons.leftArrow
onClicked: {
mainItem.chatGui.core.lSetParticipantsAddresses(manageParticipantsLayout.selectedParticipants)
mainItem.done()
}
}
@ -47,6 +62,14 @@ Rectangle {
font: Typography.h4
Layout.fillWidth: true
}
MediumButton {
id: manageParticipantsApplyButton
//: Apply
text: qsTr("apply_button_text")
onClicked: {
mainItem.chatGui.core.lSetParticipantsAddresses(manageParticipantsLayout.selectedParticipants)
}
}
}
AddParticipantsForm {
id: manageParticipantsLayout