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); } }
CntSimContactRemoveRequest::CntSimContactRemoveRequest(CntSymbianSimEngine *engine, QContactRemoveRequest *req) :CntAbstractSimRequest(engine, req) { connect( simStore(), SIGNAL(removeComplete(QContactManager::Error)), this, SLOT(removeComplete(QContactManager::Error)), Qt::QueuedConnection ); connect( simStore(), SIGNAL(getReservedSlotsComplete(QList<int>, QContactManager::Error)), this, SLOT(getReservedSlotsComplete(QList<int>, QContactManager::Error)), Qt::QueuedConnection ); }
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); }
void CntSimContactRemoveRequest::removeNext() { QContactRemoveRequest *r = req<QContactRemoveRequest>(); if (!r->isActive()) return; if (r->contactIds().count() == 0) { QContactManagerEngine::updateContactRemoveRequest(r, QContactManager::BadArgumentError, m_errorMap, QContactAbstractRequest::FinishedState); return; } // All contacts removed? if (m_index >= m_contactIds.count()) { // Take first error from errormap (if any) QContactManager::Error error = QContactManager::NoError; if (m_errorMap.count()) error = m_errorMap.begin().value(); QContactManagerEngine::updateContactRemoveRequest(r, error, m_errorMap, QContactAbstractRequest::FinishedState); return; } // Remove next contact QContactLocalId contactId = m_contactIds.at(m_index); QContactManager::Error error = QContactManager::NoError; #ifdef SYMBIANSIM_BACKEND_CHECK_BEFORE_REMOVE if (m_reservedSlots.contains(contactId)) simStore()->remove(contactId, &error); else error = QContactManager::DoesNotExistError; #else simStore()->remove(contactId, &error); #endif if (error) { m_errorMap.insert(m_index, error); m_index++; singleShotTimer(KRequestDelay, this, SLOT(removeNext())); } }
bool CntAbstractSimRequest::cancel() { if (m_request->isActive()) { cancelTimer(); simStore()->cancel(); QContactManagerEngine::updateRequestState(m_request, QContactAbstractRequest::CanceledState); return true; } return false; }
void CntSimContactRemoveRequest::getReservedSlots() { QContactRemoveRequest *r = req<QContactRemoveRequest>(); if (!r->isActive()) return; QContactManager::Error error = QContactManager::NoError; if (!simStore()->getReservedSlots(&error)) { QContactManagerEngine::updateContactRemoveRequest(r, error, m_errorMap, QContactAbstractRequest::FinishedState); } }
void CntSimContactSaveRequest::writeNext() { QContactSaveRequest *r = req<QContactSaveRequest>(); if (!r->isActive()) return; if (r->contacts().count() == 0) { QContactManagerEngine::updateContactSaveRequest(r, QList<QContact>(), QContactManager::BadArgumentError, m_errorMap, QContactAbstractRequest::FinishedState); return; } // All contacts written? if (m_index >= m_contacts.count()) { // Take first error from errormap (if any) QContactManager::Error error = QContactManager::NoError; if (m_errorMap.count()) error = m_errorMap.begin().value(); QContactManagerEngine::updateContactSaveRequest(r, m_contacts, error, m_errorMap, QContactAbstractRequest::FinishedState); return; } // Get next contact QContact contact = m_contacts.at(m_index); // Validate & write contact QContactManager::Error error = QContactManager::NoError; if (engine()->validateContact(contact, &error)) simStore()->write(contact, &error); if (error) { m_errorMap.insert(m_index, error); m_index++; singleShotTimer(KRequestDelay, this, SLOT(writeNext())); } }
CntSimContactFetchRequest::CntSimContactFetchRequest(CntSymbianSimEngine *engine, QContactFetchRequest *req) :CntAbstractSimRequest(engine, req) { connect( simStore(), SIGNAL(readComplete(QList<QContact>, QContactManager::Error)), this, SLOT(readComplete(QList<QContact>, QContactManager::Error)), Qt::QueuedConnection ); }
CntSimContactSaveRequest::CntSimContactSaveRequest(CntSymbianSimEngine *engine, QContactSaveRequest *req) :CntAbstractSimRequest(engine, req) { connect( simStore(), SIGNAL(writeComplete(QContact, QContactManager::Error)), this, SLOT(writeComplete(QContact, QContactManager::Error)), Qt::QueuedConnection ); }