/** * To return a valid contact item id. */ TContactItemId CSyncTestStep::GetValidUIDFromContactsDbL() { TContactItemId firstId(KNullContactId); CContactDatabase *iDb = NULL; TRAPD(err,iDb = CContactDatabase::OpenL()); // open existing database CleanupStack::PushL(iDb); if (err != KErrNone) { CleanupStack::PopAndDestroy(); // iDb return firstId; } iDb->SetDbViewContactType(KUidContactICCEntry); // to get the unique groupId for the phonebook TContactItemId groupId(KNullContactId); User::LeaveIfError(iSession.GetPhoneBookId(groupId, RPhoneBookSession::ESyncGroupId)); TESTCHECKCONDITIONL(groupId != KNullContactId); // based on the groupId, get an item belonging to the phonebook CContactGroup* group = static_cast<CContactGroup*>(iDb->ReadContactLC(groupId)); const CContactIdArray* array = group->ItemsContained(); TInt count(array->Count()); if (count > 0) firstId = (*array)[0]; CleanupStack::PopAndDestroy(group); CleanupStack::PopAndDestroy(); // iDb return firstId; }
/* In this section, we edit the desired number of groups in the database * Set label for them and associate them with contacts @ param aGroupSection - Desired Group Name @ param aContact - Contact to be updated */ void CTestContactViewCRUDOperationsStep::UpdateContactsInGroupL(const TInt aNumberOfContactsToBeUpdated, const TPtrC& aGroupSection) { RArray<TPtrC> listOfGroupsSections; CleanupClosePushL(listOfGroupsSections); ViewUtilityReference().TokenizeStringL(aGroupSection, listOfGroupsSections); for ( TInt i = 0; i < listOfGroupsSections.Count(); ++i ) { CCntFilter* filter = CCntFilter::NewL(); CleanupStack::PushL(filter); filter->SetContactFilterTypeGroup(ETrue); DatabaseReference().FilterDatabaseL(*filter); for ( TInt i = 0; i < filter->iIds->Count(); ++i ) { TContactItemId groupId = (*filter->iIds)[i]; CContactItem* group = DatabaseReference().OpenContactL(groupId); CContactGroup* newGroup = static_cast<CContactGroup*>(group); if(aGroupSection.Compare(newGroup->GetGroupLabelL()) == 0) { const CContactIdArray* listOfContacts = newGroup->ItemsContained(); for(TInt i(0); i < aNumberOfContactsToBeUpdated; i++) { TContactItemId contactItemId = (*listOfContacts)[i]; CContactItem* contactItem = DatabaseReference().ReadContactL(contactItemId); CleanupStack::PushL(contactItem); UpdateFieldsL(*contactItem); CContactItem* updatedContactItem = DatabaseReference().UpdateContactLC(contactItemId, contactItem); CleanupStack::PopAndDestroy(updatedContactItem); CleanupStack::PopAndDestroy(contactItem); } delete listOfContacts; DatabaseReference().CloseContactL(groupId); break; } DatabaseReference().CloseContactL(groupId); } CleanupStack::PopAndDestroy(filter); } CleanupStack::PopAndDestroy(&listOfGroupsSections); }
/* * Private implementation for fetching the members of a group. */ QSet<QContactLocalId> CntSymbianDatabase::groupMembersL(QContactLocalId groupId) { QSet<QContactLocalId> groupMembers; CContactItem *contactItem = m_contactDatabase->ReadContactLC(TContactItemId(groupId)); Q_ASSERT(contactItem && contactItem->Type() == KUidContactGroup); CContactGroup *group = static_cast<CContactGroup*>(contactItem); const CContactIdArray *idArray = group->ItemsContained(); //loop through all the contacts and add them to the list for (int i(0); i < idArray->Count(); i++) { groupMembers.insert((*idArray)[i]); } CleanupStack::PopAndDestroy(contactItem); return groupMembers; }
/* In this section, we edit the desired number of groups in the database * Set label for them and associate them with contacts @ param aGroupSection - Desired Group Name @ param aContact - Contact to be updated */ void CTestContactViewCRUDOperationsStep::IterateThroAllGroupSectionsAndUpdateContactL(const TPtrC& aGroupSection, CContactCard& aContact) { RArray<TPtrC> listOfGroupsSections; CleanupClosePushL(listOfGroupsSections); ViewUtilityReference().TokenizeStringL(aGroupSection, listOfGroupsSections); for ( TInt i = 0; i < listOfGroupsSections.Count(); ++i ) { CCntFilter* filter = CCntFilter::NewL(); CleanupStack::PushL(filter); filter->SetContactFilterTypeGroup(ETrue); DatabaseReference().FilterDatabaseL(*filter); for ( TInt i = 0; i < filter->iIds->Count(); ++i ) { TContactItemId groupId = (*filter->iIds)[i]; CContactItem* group = DatabaseReference().OpenContactL(groupId); CContactGroup* newGroup = static_cast<CContactGroup*>(group); if(aGroupSection.Compare(newGroup->GetGroupLabelL()) == 0) { TRAP_IGNORE(DatabaseReference().RemoveContactFromGroupL(aContact, *newGroup)); TRAP_IGNORE(DatabaseReference().AddContactToGroupL(aContact, *newGroup)); DatabaseReference().CommitContactL(*group); const CContactIdArray* listOfContacts = newGroup->ItemsContained(); const TInt count = listOfContacts->Count(); delete listOfContacts; DatabaseReference().CloseContactL(groupId); break; } DatabaseReference().CloseContactL(groupId); } CleanupStack::PopAndDestroy(filter); } CleanupStack::PopAndDestroy(&listOfGroupsSections); }
LOCAL_C void TestRemoveContactFromGroupL() { test.Next(_L("Remove a contact from the group")); CTestResources* res = CTestResources::NewLC(); CheckConsistentL(*res); // Need to open and commit the group to get any events from CContactDatabase! CContactGroup* group = static_cast<CContactGroup*>(res->iDb->OpenContactLX(res->iGroupId)); CleanupStack::PushL(group); // Commit the group to get group changed event from Contact Db res->iDb->CloseContactL(group->Id()); const TContactItemId contactId = (*group->ItemsContained())[0]; res->iDb->RemoveContactFromGroupL(contactId, group->Id()); // Listen to the event from the DB TContactDbObserverEvent dbEvent; test(res->iDbEventQueue->ListenForEvent(2,dbEvent)); test(dbEvent.iType == EContactDbObserverEventGroupChanged); test(dbEvent.iContactId == group->Id()); // Listen to the event from the group view TContactViewEvent groupViewEvent; test(res->iGroupViewEventQueue->ListenForEvent(2,groupViewEvent)); CleanupStack::PopAndDestroy(2); // group, lock // Eat away all events from queue to give iGroupView a chance to update itself while (res->iGroupViewEventQueue->ListenForEvent(2,groupViewEvent)) { } CheckConsistentL(*res); CleanupStack::PopAndDestroy(res); }