diff -r 2b40d63a9c3d -r 90517678cc4f qtmobility/plugins/contacts/symbiansim/src/cntsimcontactlocalidfetchrequest.cpp --- a/qtmobility/plugins/contacts/symbiansim/src/cntsimcontactlocalidfetchrequest.cpp Fri Apr 16 15:51:22 2010 +0300 +++ b/qtmobility/plugins/contacts/symbiansim/src/cntsimcontactlocalidfetchrequest.cpp Mon May 03 13:18:40 2010 +0300 @@ -45,8 +45,7 @@ #include CntSimContactLocalIdFetchRequest::CntSimContactLocalIdFetchRequest(CntSymbianSimEngine *engine, QContactLocalIdFetchRequest *req) - :CntAbstractSimRequest(engine), - m_req(req) + :CntAbstractSimRequest(engine, req) { connect( simStore(), SIGNAL(readComplete(QList, QContactManager::Error)), this, SLOT(readComplete(QList, QContactManager::Error)), Qt::QueuedConnection ); @@ -57,37 +56,47 @@ cancel(); } -bool CntSimContactLocalIdFetchRequest::start() +void CntSimContactLocalIdFetchRequest::run() { + QContactLocalIdFetchRequest *r = req(); + + if (!r->isActive()) + return; + // Contacts are fetched starting from index 1, all slots are read - // since slots may be not filled in a sequence. + // since slots may be not filled in a sequence. + int index = 1; int numSlots = simStore()->storeInfo().iTotalEntries; - QContactManager::Error error = simStore()->read(1, numSlots); - if (error == QContactManager::NoError) - QContactManagerEngine::updateRequestState(m_req, QContactAbstractRequest::ActiveState); - return (error == QContactManager::NoError); -} - -bool CntSimContactLocalIdFetchRequest::cancel() -{ - if (m_req->isActive()) { - simStore()->cancel(); - QContactManagerEngine::updateRequestState(m_req, QContactAbstractRequest::CanceledState); - return true; + + QContactManager::Error error = QContactManager::NoError; + if (!simStore()->read(index, numSlots, &error)) { + QContactManagerEngine::updateContactLocalIdFetchRequest(r, QList(), error, QContactAbstractRequest::FinishedState); } - return false; } void CntSimContactLocalIdFetchRequest::readComplete(QList contacts, QContactManager::Error error) { - if (!m_req->isActive()) + QContactLocalIdFetchRequest *r = req(); + + 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 (error == QContactManager::UnspecifiedError && + simStore()->lastAsyncError() == KErrServerBusy) + { + if (waitAndRetry()) + return; + } + // Filter & sort results QList filteredAndSorted; for (int i=0; ifilter(), contacts.at(i))) - QContactManagerEngine::addSorted(&filteredAndSorted, contacts.at(i), m_req->sorting()); + if (QContactManagerEngine::testFilter(r->filter(), contacts.at(i))) + QContactManagerEngine::addSorted(&filteredAndSorted, contacts.at(i), r->sorting()); } // Convert to QContactLocalId-list @@ -97,6 +106,5 @@ } // Complete the request - QContactManagerEngine::updateRequestState(m_req, QContactAbstractRequest::FinishedState); - QContactManagerEngine::updateContactLocalIdFetchRequest(m_req, filteredAndSortedIds, error); + QContactManagerEngine::updateContactLocalIdFetchRequest(r, filteredAndSortedIds, error, QContactAbstractRequest::FinishedState); }