void CntSimContactFetchRequest::run() { QContactFetchRequest *r = req<QContactFetchRequest>(); if (!r->isActive()) return; // Get filter QContactLocalIdFilter lidFilter; if (r->filter().type() == QContactFilter::LocalIdFilter) { lidFilter = static_cast<QContactLocalIdFilter>(r->filter()); } // Fetch all contacts and filter the results. // Contacts are fetched starting from index 1, all slots are read // since slots may be not filled in a sequence. int index = 1; int numSlots = simStore()->storeInfo().m_totalEntries; if (lidFilter.ids().count() == 1) { // Optimization for performance. Fetch a single contact from store. // This is mainly for CntSymbianSimEngine::contact(). index = lidFilter.ids().at(0); numSlots = 1; } QContactManager::Error error = QContactManager::NoError; if (!simStore()->read(index, numSlots, &error)) { QContactManagerEngine::updateContactFetchRequest(r, QList<QContact>(), error, QContactAbstractRequest::FinishedState); } }
void CntSimContactFetchRequest::readComplete(QList<QContact> contacts, QContactManager::Error error) { QContactFetchRequest *r = req<QContactFetchRequest>(); if (!r->isActive()) return; // Sometimes the sim store will return server busy error. All we can do is // wait and try again. The error seems to occur if we try to read from the // store right after writing some contacts to it. // This was observed with S60 5.0 HW (Tube). if (simStore()->lastAsyncError() == KErrServerBusy) { if (waitAndRetry()) return; } // Filter & sort results QList<QContact> filteredAndSorted; for (int i=0; i<contacts.count(); i++) { if (engine()->filter(r->filter(), contacts.at(i))) QContactManagerEngine::addSorted(&filteredAndSorted, contacts.at(i), r->sorting()); } // Complete the request QContactManagerEngine::updateContactFetchRequest(r, filteredAndSorted, error, QContactAbstractRequest::FinishedState); }