mirror of
https://gitlab.linphone.org/BC/public/linphone-desktop.git
synced 2026-01-29 17:59:21 +00:00
fix(src/components/sip-addresses/SipAddressesModel): try to map to other contact when a contact of one sip address is removed
This commit is contained in:
parent
24878cf2b2
commit
1b6788f005
5 changed files with 39 additions and 17 deletions
|
|
@ -112,6 +112,16 @@ bool ContactsListModel::removeRows (int row, int count, const QModelIndex &paren
|
|||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
ContactModel *ContactsListModel::findContactModelFromSipAddress (const QString &sipAddress) const {
|
||||
auto it = find_if(mList.begin(), mList.end(), [sipAddress](ContactModel *contactModel) {
|
||||
return contactModel->getVcardModel()->getSipAddresses().contains(sipAddress);
|
||||
});
|
||||
|
||||
return it != mList.end() ? *it : nullptr;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
ContactModel *ContactsListModel::addContact (VcardModel *vcard) {
|
||||
ContactModel *contact = new ContactModel(this, vcard);
|
||||
App::getInstance()->getEngine()->setObjectOwnership(contact, QQmlEngine::CppOwnership);
|
||||
|
|
|
|||
|
|
@ -47,6 +47,8 @@ public:
|
|||
bool removeRow (int row, const QModelIndex &parent = QModelIndex());
|
||||
bool removeRows (int row, int count, const QModelIndex &parent = QModelIndex()) override;
|
||||
|
||||
ContactModel *findContactModelFromSipAddress (const QString &sipAddress) const;
|
||||
|
||||
Q_INVOKABLE ContactModel *addContact (VcardModel *vcard);
|
||||
Q_INVOKABLE void removeContact (ContactModel *contact);
|
||||
|
||||
|
|
|
|||
|
|
@ -76,7 +76,9 @@ void CoreManager::init (QObject *parent, const QString &configPath) {
|
|||
// -----------------------------------------------------------------------------
|
||||
|
||||
VcardModel *CoreManager::createDetachedVcardModel () {
|
||||
return new VcardModel(linphone::Factory::get()->createVcard());
|
||||
VcardModel *vcardModel = new VcardModel(linphone::Factory::get()->createVcard(), false);
|
||||
qInfo() << QStringLiteral("Create detached vcard:") << vcardModel;
|
||||
return vcardModel;
|
||||
}
|
||||
|
||||
void CoreManager::forceRefreshRegisters () {
|
||||
|
|
|
|||
|
|
@ -47,9 +47,10 @@ SipAddressesModel::SipAddressesModel (QObject *parent) : QAbstractListModel(pare
|
|||
QObject::connect(contacts, &ContactsListModel::sipAddressAdded, this, &SipAddressesModel::handleSipAddressAdded);
|
||||
QObject::connect(contacts, &ContactsListModel::sipAddressRemoved, this, &SipAddressesModel::handleSipAddressRemoved);
|
||||
|
||||
QObject::connect(mCoreHandlers.get(), &CoreHandlers::messageReceived, this, &SipAddressesModel::handleMessageReceived);
|
||||
QObject::connect(mCoreHandlers.get(), &CoreHandlers::callStateChanged, this, &SipAddressesModel::handleCallStateChanged);
|
||||
QObject::connect(mCoreHandlers.get(), &CoreHandlers::presenceReceived, this, &SipAddressesModel::handlePresenceReceived);
|
||||
CoreHandlers *intHandlers = mCoreHandlers.get();
|
||||
QObject::connect(intHandlers, &CoreHandlers::messageReceived, this, &SipAddressesModel::handleMessageReceived);
|
||||
QObject::connect(intHandlers, &CoreHandlers::callStateChanged, this, &SipAddressesModel::handleCallStateChanged);
|
||||
QObject::connect(intHandlers, &CoreHandlers::presenceReceived, this, &SipAddressesModel::handlePresenceReceived);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
|
@ -183,12 +184,10 @@ QString SipAddressesModel::addTransportToSipAddress (const QString &sipAddress,
|
|||
return ::Utils::linphoneStringToQString(address->asString());
|
||||
}
|
||||
|
||||
bool SipAddressesModel::sipAddressIsValid (const QString &sipAddress) const {
|
||||
shared_ptr<linphone::Address> address = linphone::Factory::get()->createAddress(
|
||||
::Utils::qStringToLinphoneString(sipAddress)
|
||||
);
|
||||
|
||||
return !!address;
|
||||
bool SipAddressesModel::sipAddressIsValid (const QString &sipAddress) {
|
||||
return !!linphone::Factory::get()->createAddress(
|
||||
::Utils::qStringToLinphoneString(sipAddress)
|
||||
);
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
|
@ -347,8 +346,14 @@ void SipAddressesModel::handleMessagesCountReset (const QString &sipAddress) {
|
|||
// -----------------------------------------------------------------------------
|
||||
|
||||
void SipAddressesModel::addOrUpdateSipAddress (QVariantMap &map, ContactModel *contact) {
|
||||
map["contact"] = QVariant::fromValue(contact);
|
||||
updateObservers(map["sipAddress"].toString(), contact);
|
||||
QString sipAddress = map["sipAddress"].toString();
|
||||
|
||||
if (contact)
|
||||
map["contact"] = QVariant::fromValue(contact);
|
||||
else if (map.remove("contact") == 0)
|
||||
qWarning() << QStringLiteral("`contact` field is empty on sip address: `%1`.").arg(sipAddress);
|
||||
|
||||
updateObservers(sipAddress, contact);
|
||||
}
|
||||
|
||||
void SipAddressesModel::addOrUpdateSipAddress (QVariantMap &map, const shared_ptr<linphone::Call> &call) {
|
||||
|
|
@ -406,16 +411,18 @@ void SipAddressesModel::removeContactOfSipAddress (const QString &sipAddress) {
|
|||
return;
|
||||
}
|
||||
|
||||
updateObservers(sipAddress, nullptr);
|
||||
// Try to map other contact on this sip address.
|
||||
ContactModel *contactModel = CoreManager::getInstance()->getContactsListModel()->findContactModelFromSipAddress(sipAddress);
|
||||
updateObservers(sipAddress, contactModel);
|
||||
|
||||
if (it->remove("contact") == 0)
|
||||
qWarning() << QStringLiteral("`contact` field is empty on sip address: `%1`.").arg(sipAddress);
|
||||
qInfo() << QStringLiteral("Map new contact on sip address: `%1`.").arg(sipAddress) << contactModel;
|
||||
addOrUpdateSipAddress(*it, contactModel);
|
||||
|
||||
int row = mRefs.indexOf(&(*it));
|
||||
Q_ASSERT(row != -1);
|
||||
|
||||
// History exists, signal changes.
|
||||
if (it->contains("timestamp")) {
|
||||
if (it->contains("timestamp") || contactModel) {
|
||||
emit dataChanged(index(row, 0), index(row, 0));
|
||||
return;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -58,7 +58,8 @@ public:
|
|||
|
||||
Q_INVOKABLE QString getTransportFromSipAddress (const QString &sipAddress) const;
|
||||
Q_INVOKABLE QString addTransportToSipAddress (const QString &sipAddress, const QString &transport) const;
|
||||
Q_INVOKABLE bool sipAddressIsValid (const QString &sipAddress) const;
|
||||
|
||||
Q_INVOKABLE static bool sipAddressIsValid (const QString &sipAddress);
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue