QMap<int , ContactsStatus> ContactsBackend::deleteContacts(const QStringList &aContactIDList) { FUNCTION_CALL_TRACE; ContactsStatus status; QMap<int , QContactManager::Error> errors; QMap<int , ContactsStatus> statusMap; if (iMgr == NULL) { for (int i=0; i < aContactIDList.size(); i++) { errors.insert(i, QContactManager::UnspecifiedError); } LOG_WARNING("Contacts backend not available"); } else { QList<QContactLocalId> qContactIdList; foreach (QString id, aContactIDList ) { #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) qContactIdList.append(QContactLocalId::fromString (id)); #else qContactIdList.append(QContactLocalId(id.toUInt())); #endif } if(iMgr->removeContacts(qContactIdList , &errors)) { LOG_DEBUG("Successfully Removed all contacts "); } else { LOG_WARNING("Failed Removing Contacts"); } // QContactManager will populate errorMap only for errors, but we use this as a status map, // so populate NoError if there's no error. // TODO QContactManager populates indices from the qContactList, but we populate keys, is this OK? for (int i = 0; i < qContactIdList.size(); i++) { QContactLocalId contactId = qContactIdList.value(i); #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) status.id = contactId.toString (); #else status.id = (int)contactId; #endif if( !errors.contains(i) ) { LOG_DEBUG("No error for contact with id " << contactId << " and index " << i); status.errorCode = QContactManager::NoError; } else { LOG_DEBUG("contact with id " << contactId << " and index " << i <<" is in error"); QContactManager::Error errorCode = errors.value(i); status.errorCode = errorCode; } statusMap.insert(i, status); } }
void CntSymbianDatabase::initializeL() { User::LeaveIfNull(m_engine); #ifdef SYMBIAN_BACKEND_USE_CNTMODEL_V2 // 10.x platforms do not need some of CContactDatabase's concepts, so // they use the optimized OpenV2 and CreateV2. TRAPD(err, m_contactDatabase = CContactDatabase::OpenV2L()); // Database not found, create it if (err == KErrNotFound) { m_contactDatabase = CContactDatabase::CreateV2L(); } else { User::LeaveIfError(err); } #else TRAPD(err, m_contactDatabase = CContactDatabase::OpenL()); // Database not found, create it if (err == KErrNotFound) { m_contactDatabase = CContactDatabase::CreateL(); } else { User::LeaveIfError(err); } #endif #ifndef SYMBIAN_BACKEND_USE_CNTMODEL_V2 // In pre 10.1 platforms the AddObserverL & RemoveObserver functions are not // exported so we need to use CContactChangeNotifier. TRAP(err, m_contactChangeNotifier = CContactChangeNotifier::NewL(*m_contactDatabase, this)); #else TRAP(err, m_contactDatabase->AddObserverL(*this)); TRAP(err, m_contactDatabase->AddObserverV2L(*this)); #endif // Read current own card id (self contact id) TContactItemId myCard = m_contactDatabase->OwnCardId(); if (myCard > 0) m_currentOwnCardId = QContactLocalId(myCard); // Currently the group membership check is only used in pre-10.1 // platforms. In 10.1 we need to check the performance penalty // caused in the instantiation of QContactManager. If the // performance is too bad, then the MContactDbObserver API needs to // be changed in 10.1 so that we don't need the group membership // buffer in the engine level. In other words events like // EContactDbObserverEventGroupMembersAdded and // EContactDbObserverEventGroupMembersRemoved need to be added to // MContactDbObserver. #ifndef SYMBIAN_BACKEND_USE_CNTMODEL_V2 updateGroupMembershipsL(); #endif }
/*! * Respond to a contacts database event, delegating this event to * an appropriate signal as required. * * \param aEvent Contacts database event describing the change to the * database. */ void CntSymbianDatabase::HandleDatabaseEventL(TContactDbObserverEvent aEvent) { QContactChangeSet changeSet; TContactItemId id = aEvent.iContactId; #ifdef SYMBIAN_BACKEND_SIGNAL_EMISSION_TWEAK switch (aEvent.iType) { case EContactDbObserverEventContactAdded: if(m_contactsEmitted.contains(id)) m_contactsEmitted.removeOne(id); else changeSet.insertAddedContact(id); break; case EContactDbObserverEventOwnCardDeleted: if (m_contactsEmitted.contains(id)) { m_contactsEmitted.removeOne(id); } else { // signal selfContactIdChanged (from id to zero) QOwnCardPair ownCard(m_currentOwnCardId, QContactLocalId(0)); changeSet.setOldAndNewSelfContactId(ownCard); // signal contactsRemoved (the self contact was deleted) changeSet.insertRemovedContact(id); } // reset own card id m_currentOwnCardId = QContactLocalId(0); break; case EContactDbObserverEventContactDeleted: if(m_contactsEmitted.contains(id)) m_contactsEmitted.removeOne(id); else changeSet.insertRemovedContact(id); break; case EContactDbObserverEventContactChanged: if(m_contactsEmitted.contains(id)) m_contactsEmitted.removeOne(id); else changeSet.insertChangedContact(id); break; case EContactDbObserverEventGroupAdded: if(m_contactsEmitted.contains(id)) { // adding a group triggers also a "changed" event. The work-around // is to leave the id to m_contactsEmitted } else { changeSet.insertAddedContact(id); m_contactsEmitted.append(id); } break; case EContactDbObserverEventGroupDeleted: if(m_contactsEmitted.contains(id)) m_contactsEmitted.removeOne(id); else changeSet.insertRemovedContact(id); break; case EContactDbObserverEventGroupChanged: //handled in HandleDatabaseEventV2L break; case EContactDbObserverEventOwnCardChanged: if (m_contactsEmitted.contains(id)) { m_contactsEmitted.removeOne(id); } else { if (m_currentOwnCardId == QContactLocalId(id)) { //own card content was changed changeSet.insertChangedContact(m_currentOwnCardId); } QOwnCardPair ownCard(m_currentOwnCardId, QContactLocalId(id)); changeSet.setOldAndNewSelfContactId(ownCard); m_currentOwnCardId = QContactLocalId(id); } break; case EContactDbObserverEventRestoreBeginning: m_restoreStarted = true; break; case EContactDbObserverEventBackupRestoreCompleted: if (m_restoreStarted) { changeSet.setDataChanged(true); m_restoreStarted = false; } break; default: break; // ignore other events } #else // SYMBIAN_BACKEND_SIGNAL_EMISSION_TWEAK switch (aEvent.iType) { case EContactDbObserverEventContactAdded: changeSet.insertAddedContact(id); break; case EContactDbObserverEventOwnCardDeleted: { // signal selfContactIdChanged (from id to zero) QOwnCardPair ownCard(m_currentOwnCardId, QContactLocalId(0)); changeSet.setOldAndNewSelfContactId(ownCard); // signal contactsRemoved (the self contact was deleted) changeSet.insertRemovedContact(id); // reset own card id m_currentOwnCardId = QContactLocalId(0); } break; case EContactDbObserverEventContactDeleted: { changeSet.insertRemovedContact(id); // Check if contact was part of some group. // This check is needed because CContactDatabase will NOT // provide EContactDbObserverEventGroupChanged event in this case!!! QMap<QContactLocalId, QSet<QContactLocalId> >::iterator i; for (i=m_groupContents.begin(); i!=m_groupContents.end(); i++ ) { if (i->contains(id)) { changeSet.insertRemovedRelationshipsContact(i.key()); changeSet.insertRemovedRelationshipsContacts(i->toList()); i->remove(id); } } } break; case EContactDbObserverEventContactChanged: changeSet.insertChangedContact(id); break; case EContactDbObserverEventGroupAdded: // Creating a group will cause two events. // Emitting addedContact from EContactDbObserverEventGroupChanged. changeSet.insertAddedContact(id); break; case EContactDbObserverEventGroupDeleted: { changeSet.insertRemovedContact(id); // Check if there was any contacts in the group if (m_groupContents.value(id).count()) { changeSet.insertRemovedRelationshipsContact(id); changeSet.insertRemovedRelationshipsContacts(m_groupContents.value(id).toList()); } m_groupContents.remove(id); } break; case EContactDbObserverEventGroupChanged: { bool isOldGroup = m_groupContents.contains(id); // Contact DB observer API does not give information of contacts // possibly added to or removed from the group QSet<QContactLocalId> added; QSet<QContactLocalId> removed; TRAPD(err, updateGroupMembershipsL(id, added, removed)); if(err != KErrNone) changeSet.setDataChanged(true); if (removed.count()) { // The group changed event was caused by removing contacts // from the group changeSet.insertRemovedRelationshipsContact(id); changeSet.insertRemovedRelationshipsContacts(removed.toList()); } if (added.count()) { // The group changed event was caused by adding contacts // to the group changeSet.insertAddedRelationshipsContact(id); changeSet.insertAddedRelationshipsContacts(added.toList()); } if (added.count() == 0 && removed.count() == 0) { // The group changed event was caused by modifying the group // NOTE: Do not emit this for a new group. Creating a group // through the backend causes two events GroupAdded and // GroupChanged. if (isOldGroup) changeSet.insertChangedContact(id); } } break; case EContactDbObserverEventOwnCardChanged: if (m_currentOwnCardId == QContactLocalId(id)) changeSet.insertChangedContact(m_currentOwnCardId); else changeSet.setOldAndNewSelfContactId(QOwnCardPair(m_currentOwnCardId, QContactLocalId(id))); m_currentOwnCardId = QContactLocalId(id); break; case EContactDbObserverEventRestoreBeginning: m_restoreStarted = true; break; case EContactDbObserverEventBackupRestoreCompleted: if (m_restoreStarted) { changeSet.setDataChanged(true); m_restoreStarted = false; } break; default: break; // ignore other events } #endif // SYMBIAN_BACKEND_SIGNAL_EMISSION_TWEAK changeSet.emitSignals(m_engine); }