QList<QContactLocalId> QContactMaemo5Engine::contactIds(const QContactFilter& filter, const QList<QContactSortOrder>& sortOrders, QContactManager::Error* error) const { Q_CHECK_PTR(d->m_abook); QList<QContactLocalId> rtn; // do this naively for now... QContactManager::Error tempError = QContactManager::NoError; QList<QContactLocalId> allIds = d->m_abook->contactIds(filter, sortOrders, error); QList<QContact> sortedAndFiltered; foreach (const QContactLocalId& currId, allIds) { QContact curr = contact(currId, QContactFetchHint(), &tempError); if (tempError != QContactManager::NoError) *error = tempError; if (QContactManagerEngine::testFilter(filter, curr)) { QContactManagerEngine::addSorted(&sortedAndFiltered, curr, sortOrders); } }
bool QContactWinCEEngine::saveContact(QContact* contact, QContactManager::Error* error) { if (contact == 0) { *error = QContactManager::BadArgumentError; return false; } QContactChangeSet cs; // ensure that the contact's details conform to their definitions if (!validateContact(*contact, error)) { *error = QContactManager::InvalidDetailError; return false; } SimpleComPointer<IItem> icontact; bool wasOld = false; // Figure out if this is a new or old contact if (d->m_ids.contains(contact->localId())) { // update existing contact HRESULT hr = d->m_app->GetItemFromOidEx(contact->localId(), 0, &icontact); if (SUCCEEDED(hr)) { wasOld = true; } else { if (HRESULT_CODE(hr) == ERROR_NOT_FOUND) { // Well, doesn't exist any more *error = QContactManager::DoesNotExistError; d->m_ids.removeAll(contact->localId()); } else { qWarning() << "Didn't get old contact" << HRESULT_CODE(hr); *error = QContactManager::UnspecifiedError; } } } else if (contact->localId() == 0) { // new contact! SimpleComPointer<IDispatch> idisp = 0; HRESULT hr = d->m_collection->Add(&idisp); if (SUCCEEDED(hr)) { // now get an actual item out of it (was IContact, which is not IItem) hr = idisp->QueryInterface<IItem>(&icontact); if (SUCCEEDED(hr)) { } else { qWarning() << "Failed to query interface" << HRESULT_CODE(hr); *error = QContactManager::UnspecifiedError; } } else { qWarning() << "Failed to create contact: "<< HRESULT_CODE(hr); *error = QContactManager::OutOfMemoryError; } } else { // Saving a contact with a non zero id, but that doesn't exist *error = QContactManager::DoesNotExistError; } if (icontact) { // Convert our QContact to the Icontact (via setProps) if (convertFromQContact(*contact, icontact, *error)) { HRESULT hr = icontact->Save(); if (SUCCEEDED(hr)) { // yay! we also need to set the new contact id long oid = 0; hr = icontact->get_Oid(&oid); if (SUCCEEDED(hr)) { *error = QContactManager::NoError; QContact c = this->contact((QContactLocalId)oid, QContactFetchHint(), error); if (*error == QContactManager::NoError) { *contact = c; if (wasOld) { cs.insertChangedContact(contact->localId()); } else { cs.insertAddedContact(contact->localId()); d->m_ids.append(contact->localId()); } } cs.emitSignals(this); return true; } qWarning() << "Saved contact, but couldn't retrieve id again??" << HRESULT_CODE(hr); // Blargh. *error = QContactManager::UnspecifiedError; } else { qWarning() << "Failed to save contact" << HRESULT_CODE(hr); } } else { qWarning() << "Failed to convert contact"; } } // error should have been set. return false; }
void SeasideCache::requestStateChanged(QContactAbstractRequest::State state) { if (state != QContactAbstractRequest::FinishedState) return; if (m_fetchFilter == SeasideFilteredModel::FilterFavorites) { // Next, query for all contacts m_fetchFilter = SeasideFilteredModel::FilterAll; if (!isPopulated(SeasideFilteredModel::FilterFavorites)) { qDebug() << "Favorites queried in" << m_timer.elapsed() << "ms"; #ifdef SEASIDE_SPARQL_QUERIES m_contactIdRequest.setFavoritesOnly(false); m_contactIdRequest.start(); #else m_fetchRequest.setFilter(QContactFilter()); m_fetchRequest.start(); #endif makePopulated(SeasideFilteredModel::FilterFavorites); } else { finalizeUpdate(SeasideFilteredModel::FilterFavorites); #ifdef SEASIDE_SPARQL_QUERIES m_contactIdRequest.setFavoritesOnly(false); #else m_contactIdRequest.setFilter(QContactFilter()); #endif m_contactIdRequest.start(); } } else if (m_fetchFilter == SeasideFilteredModel::FilterAll) { // Next, query for online contacts m_fetchFilter = SeasideFilteredModel::FilterOnline; if (!isPopulated(SeasideFilteredModel::FilterAll)) { qDebug() << "All queried in" << m_timer.elapsed() << "ms"; #ifdef SEASIDE_SPARQL_QUERIES m_contactIdRequest.setOnlineOnly(true); m_contactIdRequest.start(); #else // Not correct, but better than nothing... m_fetchRequest.setFilter(QContactGlobalPresence::match(QContactPresence::PresenceAvailable)); m_fetchRequest.start(); #endif makePopulated(SeasideFilteredModel::FilterNone); makePopulated(SeasideFilteredModel::FilterAll); } else { finalizeUpdate(SeasideFilteredModel::FilterAll); #ifdef SEASIDE_SPARQL_QUERIES m_contactIdRequest.setOnlineOnly(true); #else m_contactIdRequest.setFilter(QContactGlobalPresence::match(QContactPresence::PresenceAvailable)); #endif m_contactIdRequest.start(); } } else if (m_fetchFilter == SeasideFilteredModel::FilterOnline) { m_fetchFilter = SeasideFilteredModel::FilterNone; if (m_updatesPending) { QCoreApplication::postEvent(this, new QEvent(QEvent::UpdateRequest)); } if (!isPopulated(SeasideFilteredModel::FilterOnline)) { qDebug() << "Online queried in" << m_timer.elapsed() << "ms"; #ifdef SEASIDE_SPARQL_QUERIES m_contactIdRequest.setQueryData(false); #else m_fetchRequest.setFetchHint(QContactFetchHint()); #endif makePopulated(SeasideFilteredModel::FilterOnline); } else { finalizeUpdate(SeasideFilteredModel::FilterOnline); } } else if (m_fetchFilter == SeasideFilteredModel::FilterNone) { // Result of a specific query if (m_updatesPending) { QCoreApplication::postEvent(this, new QEvent(QEvent::UpdateRequest)); } } }
void TestSymbianEngine::saveContactWithPreferredDetails() { QContactManager::Error err; //save a contact with preferred details QContact c; c.setType(QContactType::TypeContact); QContactPhoneNumber number1; number1.setNumber("123"); number1.setSubTypes(QContactPhoneNumber::SubTypeMobile); c.saveDetail(&number1); c.setPreferredDetail("call", number1); QContactPhoneNumber number2; number2.setNumber("456"); number2.setSubTypes(QContactPhoneNumber::SubTypeMobile); c.saveDetail(&number2); c.setPreferredDetail("videocall", number2); QContactPhoneNumber number3; number3.setNumber("789"); number3.setSubTypes(QContactPhoneNumber::SubTypeMobile); c.saveDetail(&number3); c.setPreferredDetail("message", number3); QContactEmailAddress email; email.setEmailAddress("dummyemail"); c.saveDetail(&email); c.setPreferredDetail("email", email); QContactOnlineAccount onlineAccount; onlineAccount.setAccountUri("dummy"); onlineAccount.setSubTypes(QContactOnlineAccount::SubTypeImpp); c.saveDetail(&onlineAccount); c.setPreferredDetail("OnlineAccountActions", onlineAccount); QContactUrl url; url.setUrl("http://dummy"); c.saveDetail(&url); c.setPreferredDetail("url", url); QVERIFY(m_engine->saveContact(&c, &err)); QVERIFY(err == QContactManager::NoError); //fetch the saved contact and check preferred details QContactFetchHint hint = QContactFetchHint(); QContact fetched = m_engine->contact(c.localId(), hint, &err); QVERIFY(err == QContactManager::NoError); QContactDetail callDetail1 = fetched.preferredDetail("call"); QVERIFY(callDetail1.definitionName() == QContactPhoneNumber::DefinitionName); QContactPhoneNumber fetchedNumber1 = static_cast<QContactPhoneNumber>(callDetail1); QVERIFY(fetchedNumber1.number() == "123"); QContactDetail callDetail2 = fetched.preferredDetail("videocall"); QVERIFY(callDetail2.definitionName() == QContactPhoneNumber::DefinitionName); QContactPhoneNumber fetchedNumber2 = static_cast<QContactPhoneNumber>(callDetail2); QVERIFY(fetchedNumber2.number() == "456"); QContactDetail callDetail3 = fetched.preferredDetail("message"); QVERIFY(callDetail3.definitionName() == QContactPhoneNumber::DefinitionName); QContactPhoneNumber fetchedNumber3 = static_cast<QContactPhoneNumber>(callDetail3); QVERIFY(fetchedNumber3.number() == "789"); QContactDetail emailDetail = fetched.preferredDetail("email"); QVERIFY(emailDetail.definitionName() == QContactEmailAddress::DefinitionName); QContactEmailAddress fetchedEmail = static_cast<QContactEmailAddress>(emailDetail); QVERIFY(fetchedEmail.emailAddress() == "dummyemail"); QContactDetail onlineAccountDetail = fetched.preferredDetail("OnlineAccountActions"); QVERIFY(onlineAccountDetail.definitionName() == QContactOnlineAccount::DefinitionName); QContactOnlineAccount fetchedOnlineAccount = static_cast<QContactOnlineAccount>(onlineAccountDetail); QVERIFY(fetchedOnlineAccount.accountUri() == "dummy"); QContactDetail urlDetail = fetched.preferredDetail("url"); QVERIFY(urlDetail.definitionName() == QContactUrl::DefinitionName); QContactUrl fetchedUrl = static_cast<QContactUrl>(urlDetail); QVERIFY(fetchedUrl.url() == "http://dummy"); //save a contact with one preferred details for several actions QContact c2; c2.setType(QContactType::TypeContact); c2.saveDetail(&number1); c2.setPreferredDetail("call", number1); c2.setPreferredDetail("videocall", number1); c2.setPreferredDetail("message", number1); QVERIFY(m_engine->saveContact(&c2, &err)); QVERIFY(err == QContactManager::NoError); //fetch the saved contact and check preferred details QContact fetched2 = m_engine->contact(c2.localId(), hint, &err); QVERIFY(err == QContactManager::NoError); QContactDetail callDetail4 = fetched2.preferredDetail("call"); QVERIFY(callDetail4.definitionName() == QContactPhoneNumber::DefinitionName); QContactPhoneNumber fetchedNumber4 = static_cast<QContactPhoneNumber>(callDetail4); QVERIFY(fetchedNumber4.number() == "123"); QContactDetail callDetail5 = fetched2.preferredDetail("videocall"); QVERIFY(callDetail5.definitionName() == QContactPhoneNumber::DefinitionName); QContactPhoneNumber fetchedNumber5 = static_cast<QContactPhoneNumber>(callDetail5); QVERIFY(fetchedNumber5.number() == "123"); QContactDetail callDetail6 = fetched2.preferredDetail("message"); QVERIFY(callDetail6.definitionName() == QContactPhoneNumber::DefinitionName); QContactPhoneNumber fetchedNumber6 = static_cast<QContactPhoneNumber>(callDetail6); QVERIFY(fetchedNumber6.number() == "123"); }