qtmobility/plugins/contacts/symbian/src/cntsymbianengine.cpp
changeset 4 90517678cc4f
parent 1 2b40d63a9c3d
child 5 453da2cfceef
--- a/qtmobility/plugins/contacts/symbian/src/cntsymbianengine.cpp	Fri Apr 16 15:51:22 2010 +0300
+++ b/qtmobility/plugins/contacts/symbian/src/cntsymbianengine.cpp	Mon May 03 13:18:40 2010 +0300
@@ -74,14 +74,14 @@
 #define QT_TRYCATCH_LEAVING QT_TRANSLATE_EXCEPTION_TO_SYMBIAN_LEAVE
 #endif
 
-CntSymbianEngine::CntSymbianEngine(const QMap<QString, QString>& parameters, QContactManager::Error& error)
+CntSymbianEngine::CntSymbianEngine(const QMap<QString, QString>& parameters, QContactManager::Error* error)
 {
-    error = QContactManager::NoError;
+    *error = QContactManager::NoError;
 
     m_dataBase = new CntSymbianDatabase(this, error);
 
     //Database opened successfully
-    if(error == QContactManager::NoError) {
+    if(*error == QContactManager::NoError) {
         m_managerUri = QContactManager::buildUri(CNT_SYMBIAN_MANAGER_NAME, parameters);
         m_transformContact = new CntTransformContact;
 #ifdef SYMBIAN_BACKEND_USE_SQLITE
@@ -117,11 +117,6 @@
     delete m_displayLabel;
 }
 
-void CntSymbianEngine::deref()
-{
-    delete this;
-}
-
 /*!
  * Returns a list of the ids of contacts that match the supplied \a filter, sorted according to the given \a sortOrders.
  * Any error that occurs will be stored in \a error. Uses either the Symbian backend native filtering or in case of an
@@ -130,51 +125,57 @@
 QList<QContactLocalId> CntSymbianEngine::contactIds(
         const QContactFilter& filter,
         const QList<QContactSortOrder>& sortOrders,
-        QContactManager::Error& error) const
+        QContactManager::Error* error) const
 {
-    error = QContactManager::NoError;
+    *error = QContactManager::NoError;
     QList<QContactLocalId> result;
     
     
     if (filter.type() == QContactFilter::RelationshipFilter)
     {
         QContactRelationshipFilter rf = static_cast<QContactRelationshipFilter>(filter);
+        // XXX enum changed classes - engine API will reflect this eventually
         QList<QContactRelationship> relationshipsList = relationships(
             rf.relationshipType(), rf.relatedContactId(), rf.relatedContactRole(), error);
-        if(error == QContactManager::NoError) {
-            foreach(QContactRelationship r, relationshipsList) {
-                if(rf.relatedContactRole() == QContactRelationshipFilter::First) {
+        if(*error == QContactManager::NoError) {
+            foreach(const QContactRelationship& r, relationshipsList) {
+                if(rf.relatedContactRole() == QContactRelationship::First) {
                     result += r.second().localId();
-                } else if (rf.relatedContactRole() == QContactRelationshipFilter::Second) {
+                } else if (rf.relatedContactRole() == QContactRelationship::Second) {
                     result += r.first().localId();
-                } else if (rf.relatedContactRole() == QContactRelationshipFilter::Either) {
+                } else if (rf.relatedContactRole() == QContactRelationship::Either) {
                     result += r.first().localId();
                     result += r.second().localId();
                 }
             }
+            
+            //slow sorting until it's supported in SQL requests
+            result = slowSort(result, sortOrders, error);
         }
     }
     else
     {
         bool filterSupported(true);
         result = m_contactFilter->contacts(filter, sortOrders, filterSupported, error);
-        
-        //slow sorting until it's supported in SQL requests
-        result = slowSort(result, sortOrders, error);
             
 #ifdef SYMBIAN_BACKEND_USE_SQLITE
     
         // Remove possible false positives
-        if(!filterSupported && error == QContactManager::NotSupportedError)
+        if(!filterSupported && *error == QContactManager::NotSupportedError)
+            {
             result = slowFilter(filter, result, error);
-
+            
+            //slow sorting until it's supported in SQL requests
+            result = slowSort(result, sortOrders, error);
+            }
+        
 #else
         // Remove possible false positives
-        if(!filterSupported && error == QContactManager::NoError)
+        if(!filterSupported && *error == QContactManager::NoError)
             result = slowFilter(filter, result, error);
         
         // Sort the matching contacts
-        if(!sortOrders.isEmpty()&& error == QContactManager::NoError ) {
+        if(!sortOrders.isEmpty()&& *error == QContactManager::NoError ) {
             if(m_contactSorter->sortOrderSupported(sortOrders)) {
                 result = m_contactSorter->sort(result, sortOrders, error);
             } else {
@@ -186,7 +187,9 @@
     return result;
 }
 
-QList<QContactLocalId> CntSymbianEngine::contactIds(const QList<QContactSortOrder>& sortOrders, QContactManager::Error& error) const
+#if 0
+// These functions are not used anymore - there is always a filter (which may be the default filter)
+QList<QContactLocalId> CntSymbianEngine::contactIds(const QList<QContactSortOrder>& sortOrders, QContactManager::Error* error) const
 {
     // Check if sorting is supported by backend
     if(m_contactSorter->sortOrderSupported(sortOrders))
@@ -198,22 +201,22 @@
     // Get unsorted contact ids
     QList<QContactSortOrder> noSortOrders;
     QList<QContactLocalId> unsortedIds = m_contactSorter->contacts(noSortOrders, error);
-    if (error != QContactManager::NoError)
+    if (*error != QContactManager::NoError)
         return QList<QContactLocalId>();
 
     // Sort contacts
     return slowSort(unsortedIds, sortOrders, error);
 }
 
-QList<QContact> CntSymbianEngine::contacts(const QList<QContactSortOrder>& sortOrders, const QStringList& definitionRestrictions, QContactManager::Error& error) const
+QList<QContact> CntSymbianEngine::contacts(const QList<QContactSortOrder>& sortOrders, const QStringList& definitionRestrictions, QContactManager::Error* error) const
 {
-    error = QContactManager::NoError;
+    *error = QContactManager::NoError;
     QList<QContact> contacts;
     QList<QContactLocalId> contactIds = this->contactIds(sortOrders, error);
-    if (error == QContactManager::NoError ) {
+    if (*error == QContactManager::NoError ) {
         foreach (QContactLocalId id, contactIds) {
             QContact contact = this->contact(id, definitionRestrictions, error);
-            if (error != QContactManager::NoError) {
+            if (*error != QContactManager::NoError) {
                 return QList<QContact>(); // return empty list if error occurred
             }
             contacts.append(contact);
@@ -221,16 +224,17 @@
     }
     return contacts;
 }
+#endif
 
-QList<QContact> CntSymbianEngine::contacts(const QContactFilter& filter, const QList<QContactSortOrder>& sortOrders, const QStringList& definitionRestrictions, QContactManager::Error& error) const
+QList<QContact> CntSymbianEngine::contacts(const QContactFilter& filter, const QList<QContactSortOrder>& sortOrders, const QContactFetchHint& fh, QContactManager::Error* error) const
 {
-    error = QContactManager::NoError;
+    *error = QContactManager::NoError;
     QList<QContact> contacts;
     QList<QContactLocalId> contactIds = this->contactIds(filter, sortOrders, error);
-    if (error == QContactManager::NoError ) {
+    if (*error == QContactManager::NoError ) {
         foreach (QContactLocalId id, contactIds) {
-            QContact contact = this->contact(id, definitionRestrictions, error);
-            if (error != QContactManager::NoError) {
+            QContact contact = this->contact(id, fh, error);
+            if (*error != QContactManager::NoError) {
                 return QList<QContact>(); // return empty list if error occurred
             }
             contacts.append(contact);
@@ -247,22 +251,23 @@
  * \return A QContact for the requested QContactLocalId value or 0 if the read
  *  operation was unsuccessful (e.g. contact not found).
  */
-QContact CntSymbianEngine::contact(const QContactLocalId& contactId, const QStringList& definitionRestrictions, QContactManager::Error& error) const
+QContact CntSymbianEngine::contact(const QContactLocalId& contactId, const QContactFetchHint& fetchHint, QContactManager::Error* error) const
 {
     QContact* contact = new QContact();
-    TRAPD(err, *contact = fetchContactL(contactId, definitionRestrictions));
+    TRAPD(err, *contact = fetchContactL(contactId, fetchHint.detailDefinitionsHint()));
     CntSymbianTransformError::transformError(err, error);
 
-    if(error == QContactManager::NoError) { 
+    if(*error == QContactManager::NoError) {
         updateDisplayLabel(*contact);
         //check relationship only if there are no definition restrictions, otherwise
         //skip this time expensive operation.       
-        if( definitionRestrictions.isEmpty()) {
+        if( (!fetchHint.optimizationHints() & QContactFetchHint::NoRelationships)) {
             QContactManager::Error relationshipError;
-            QList<QContactRelationship> relationships = this->relationships(QString(), contact->id(), QContactRelationshipFilter::Either, relationshipError);
+            // XXX can also consult fetchHint.relationships list
+            QList<QContactRelationship> relationships = this->relationships(QString(), contact->id(), QContactRelationship::Either, &relationshipError);
             if (relationshipError != QContactManager::NoError &&
                 relationshipError != QContactManager::DoesNotExistError) { // means that no relationships found
-                error = relationshipError;
+                *error = relationshipError;
             }
             QContactManagerEngine::setContactRelationships(contact, relationships);
         }
@@ -270,7 +275,7 @@
     return *QScopedPointer<QContact>(contact);
 }
 
-bool CntSymbianEngine::saveContact(QContact* contact, QContactManager::Error& error)
+bool CntSymbianEngine::saveContact(QContact* contact, QContactManager::Error* error)
 {
     QContactChangeSet changeSet;
     TBool ret = doSaveContact(contact, changeSet, error);
@@ -279,9 +284,9 @@
 }
 
 /*! \reimp */
-bool CntSymbianEngine::saveContacts(QList<QContact> *contacts, QMap<int, QContactManager::Error> *errorMap, QContactManager::Error& error)
+bool CntSymbianEngine::saveContacts(QList<QContact> *contacts, QMap<int, QContactManager::Error> *errorMap, QContactManager::Error* error)
 {
-    error = QContactManager::NoError;
+    *error = QContactManager::NoError;
     
     if (errorMap) {
         // if the errormap argument is null, we just don't do fine-grained reporting.            
@@ -289,7 +294,7 @@
     }    
     
     if (!contacts) {
-        error = QContactManager::BadArgumentError;
+        *error = QContactManager::BadArgumentError;
         return false;
     }
 
@@ -297,8 +302,8 @@
     for (int i = 0; i < contacts->count(); i++) {
         QContact current = contacts->at(i);
         QContactManager::Error functionError = QContactManager::NoError;
-        if (!doSaveContact(&current, changeSet, functionError)) {
-            error = functionError;
+        if (!doSaveContact(&current, changeSet, &functionError)) {
+            *error = functionError;
             if (errorMap) {
                 errorMap->insert(i, functionError);
             }
@@ -307,7 +312,7 @@
         }
     }
     changeSet.emitSignals(this);
-    return (error == QContactManager::NoError);
+    return (*error == QContactManager::NoError);
 }
 
 /*!
@@ -318,7 +323,7 @@
 QList<QContactLocalId> CntSymbianEngine::slowFilter(
         const QContactFilter& filter,
         const QList<QContactLocalId>& contacts,
-        QContactManager::Error& error
+        QContactManager::Error* error
         ) const
 {
     QList<QContactLocalId> result;
@@ -326,7 +331,7 @@
         QContactLocalId id = contacts.at(i);
 
         // Check if this is a false positive. If not, add to the result set.
-        if(QContactManagerEngine::testFilter(filter, contact(id, QStringList(), error)))
+        if(QContactManagerEngine::testFilter(filter, contact(id, QContactFetchHint(), error)))
             result << id;
     }
     return result;
@@ -335,20 +340,20 @@
 QList<QContactLocalId> CntSymbianEngine::slowSort(
         const QList<QContactLocalId>& contactIds,
         const QList<QContactSortOrder>& sortOrders,
-        QContactManager::Error& error) const
+        QContactManager::Error* error) const
 {
     // Get unsorted contacts
     QList<QContact> unsortedContacts;
     foreach (QContactLocalId id, contactIds) {
-        QContact c = contact(id, QStringList(), error);
-        if (error != QContactManager::NoError)
+        QContact c = contact(id, QContactFetchHint(), error);
+        if (*error != QContactManager::NoError)
             return QList<QContactLocalId>();
         unsortedContacts << c;
     }
     return QContactManagerEngine::sortContacts(unsortedContacts, sortOrders);
 }
 
-bool CntSymbianEngine::doSaveContact(QContact* contact, QContactChangeSet& changeSet, QContactManager::Error& error)
+bool CntSymbianEngine::doSaveContact(QContact* contact, QContactChangeSet& changeSet, QContactManager::Error* error)
 {
     bool ret = false;
     if(contact && !validateContact(*contact, error))
@@ -364,7 +369,7 @@
 
         QContactManager::Error err;
         QList<QContactLocalId> localIdList = contactIds(guidFilter,
-                QList<QContactSortOrder>(), err);
+                QList<QContactSortOrder>(), &err);
         if (err == QContactManager::NoError && localIdList.count() > 0) {
             QScopedPointer<QContactId> contactId(new QContactId());
             contactId->setLocalId(localIdList.at(0));
@@ -375,14 +380,14 @@
 
     // Check parameters
     if(!contact) {
-        error = QContactManager::BadArgumentError;
+        *error = QContactManager::BadArgumentError;
         ret = false;
     // Update an existing contact
     } else if(contact->localId()) {
         if(contact->id().managerUri() == m_managerUri) {
             ret = updateContact(*contact, changeSet, error);
         } else {
-            error = QContactManager::BadArgumentError;
+            *error = QContactManager::BadArgumentError;
             ret = false;
         }
     // Create new contact
@@ -430,7 +435,7 @@
  * \param qtError Qt error code.
  * \return Error status
  */
-bool CntSymbianEngine::addContact(QContact& contact, QContactChangeSet& changeSet, QContactManager::Error& qtError)
+bool CntSymbianEngine::addContact(QContact& contact, QContactChangeSet& changeSet, QContactManager::Error* qtError)
 {
     // Attempt to persist contact, trapping errors
     int err(0);
@@ -438,7 +443,7 @@
     TRAP(err, id = addContactL(contact));
     if(err == KErrNone)
     {
-        changeSet.addedContacts().insert(id);
+        changeSet.insertAddedContact(id);
         m_dataBase->appendContactEmitted(id);
     }
     CntSymbianTransformError::transformError(err, qtError);
@@ -509,14 +514,14 @@
  * \param qtError Qt error code.
  * \return Error status.
  */
-bool CntSymbianEngine::updateContact(QContact& contact, QContactChangeSet& changeSet, QContactManager::Error& qtError)
+bool CntSymbianEngine::updateContact(QContact& contact, QContactChangeSet& changeSet, QContactManager::Error* qtError)
 {
     int err(0);
     TRAP(err, updateContactL(contact));
     if(err == KErrNone)
     {
         //TODO: check what to do with groupsChanged
-        changeSet.changedContacts().insert(contact.localId());
+        changeSet.insertChangedContact(contact.localId());
         m_dataBase->appendContactEmitted(contact.localId());
     }
     CntSymbianTransformError::transformError(err, qtError);
@@ -567,14 +572,14 @@
  * \param qtError Qt error code.
  * \return Error status.
  */
-bool CntSymbianEngine::removeContact(const QContactLocalId &id, QContactChangeSet& changeSet, QContactManager::Error& qtError)
+bool CntSymbianEngine::removeContact(const QContactLocalId &id, QContactChangeSet& changeSet, QContactManager::Error* qtError)
 {
     // removeContactL() can't throw c++ exception
     TRAPD(err, removeContactL(id));
     if(err == KErrNone)
     {
         //TODO: check what to do with groupsChanged?
-        changeSet.removedContacts().insert(id);
+        changeSet.insertRemovedContact(id);
         m_dataBase->appendContactEmitted(id);
     }
     CntSymbianTransformError::transformError(err, qtError);
@@ -613,15 +618,15 @@
     return 0;
 }
 
-bool CntSymbianEngine::removeContact(const QContactLocalId& contactId, QContactManager::Error& error)
+bool CntSymbianEngine::removeContact(const QContactLocalId& contactId, QContactManager::Error* error)
 {
     QContactManager::Error err;
-    QContactLocalId selfCntId = selfContactId(err); // err ignored
+    QContactLocalId selfCntId = selfContactId(&err); // err ignored
     QContactChangeSet changeSet;
     TBool ret = removeContact(contactId, changeSet, error);
     if (ret && contactId == selfCntId ) {
         QOwnCardPair ownCard(selfCntId, QContactLocalId(0));
-        changeSet.oldAndNewSelfContactId() = ownCard;
+        changeSet.setOldAndNewSelfContactId(ownCard);
     }
     changeSet.emitSignals(this);
     return ret;
@@ -630,73 +635,74 @@
 void CntSymbianEngine::updateDisplayLabel(QContact& contact) const
 {
     QContactManager::Error error(QContactManager::NoError);
-    QString label = synthesizedDisplayLabel(contact, error);
+    QString label = synthesizedDisplayLabel(contact, &error);
     if(error == QContactManager::NoError) {
-        contact = setContactDisplayLabel(label, contact);
+        setContactDisplayLabel(&contact, label);
     }
 }
 
-bool CntSymbianEngine::removeContacts(QList<QContactLocalId> *contactIds, QMap<int, QContactManager::Error> *errorMap, QContactManager::Error& error)
+bool CntSymbianEngine::removeContacts(const QList<QContactLocalId>& contactIds, QMap<int, QContactManager::Error> *errorMap, QContactManager::Error* error)
 {
-    error = QContactManager::NoError;
+    *error = QContactManager::NoError;
     
     if (errorMap) {
         // if the errormap argument is null, we just don't do fine-grained reporting.            
         errorMap->clear();
-    }    
+    }
     
-    if (!contactIds) {
-        error = QContactManager::BadArgumentError;
+    if (contactIds.count() == 0) {
+        *error = QContactManager::BadArgumentError;
         return false;
     }
-   
+    
     QContactManager::Error err;
-    QContactLocalId selfCntId = selfContactId(err); // err ignored
+    QContactLocalId selfCntId = selfContactId(&err); // err ignored
 
     QContactChangeSet changeSet;
-    for (int i = 0; i < contactIds->count(); i++) {
-        QContactLocalId current = contactIds->at(i);
+    for (int i = 0; i < contactIds.count(); i++) {
+        QContactLocalId current = contactIds.at(i);
         QContactManager::Error functionError = QContactManager::NoError;
-        if (!removeContact(current, changeSet, functionError)) {
-            error = functionError;
+        if (!removeContact(current, changeSet, &functionError)) {
+            *error = functionError;
             if (errorMap) {
                 errorMap->insert(i, functionError);
             }
         } else {
-            (*contactIds)[i] = 0;
             if (current == selfCntId ) {
                 QOwnCardPair ownCard(selfCntId, QContactLocalId(0));
-                changeSet.oldAndNewSelfContactId() = ownCard;
+                changeSet.setOldAndNewSelfContactId(ownCard);
             }
         }
     }
     changeSet.emitSignals(this);
-    return (error == QContactManager::NoError);
+    return (*error == QContactManager::NoError);
 }
 
 /* relationships */
 
-QStringList CntSymbianEngine::supportedRelationshipTypes(const QString& contactType) const
+bool CntSymbianEngine::isRelationshipTypeSupported(const QString &relationshipType, const QString &contactType) const
 {
-    return m_relationship->supportedRelationshipTypes(contactType);
+    return m_relationship->isRelationshipTypeSupported(relationshipType, contactType);
 }
 
-QList<QContactRelationship> CntSymbianEngine::relationships(const QString& relationshipType, const QContactId& participantId, QContactRelationshipFilter::Role role, QContactManager::Error& error) const
+QList<QContactRelationship> CntSymbianEngine::relationships(const QString& relationshipType, const QContactId& participantId, QContactRelationship::Role role, QContactManager::Error* error) const
 {
     //retrieve the relationships
     return m_relationship->relationships(relationshipType, participantId, role, error);
 }
 
-bool CntSymbianEngine::saveRelationship(QContactRelationship* relationship, QContactManager::Error& error)
+bool CntSymbianEngine::saveRelationship(QContactRelationship* relationship, QContactManager::Error* error)
 {
     //affected contacts
     QContactChangeSet changeSet;
 
     //save the relationship
-    bool returnValue = m_relationship->saveRelationship(&changeSet.addedRelationshipsContacts(), relationship, error);
+    QSet<QContactLocalId> affectedContactIds;
+    bool returnValue = m_relationship->saveRelationship(&affectedContactIds, relationship, error);
+    changeSet.insertAddedRelationshipsContacts(affectedContactIds.toList());
 
     //add contacts to the list that shouldn't be emitted
-    m_dataBase->appendContactsEmitted(changeSet.addedRelationshipsContacts().toList());
+    m_dataBase->appendContactsEmitted(affectedContactIds.toList());
 
     //emit signals
     changeSet.emitSignals(this);
@@ -704,16 +710,18 @@
     return returnValue;
 }
 
-QList<QContactManager::Error> CntSymbianEngine::saveRelationships(QList<QContactRelationship>* relationships, QContactManager::Error& error)
+bool CntSymbianEngine::saveRelationships(QList<QContactRelationship>* relationships, QMap<int, QContactManager::Error>* errorMap, QContactManager::Error* error)
 {
     //affected contacts
     QContactChangeSet changeSet;
 
     //save the relationships
-    QList<QContactManager::Error> returnValue = m_relationship->saveRelationships(&changeSet.addedRelationshipsContacts(), relationships, error);
+    QSet<QContactLocalId> affectedContactIds;
+    bool returnValue = m_relationship->saveRelationships(&affectedContactIds, relationships, errorMap, error);
+    changeSet.insertAddedRelationshipsContacts(affectedContactIds.toList());
 
     //add contacts to the list that shouldn't be emitted
-    m_dataBase->appendContactsEmitted(changeSet.addedRelationshipsContacts().toList());
+    m_dataBase->appendContactsEmitted(affectedContactIds.toList());
 
     //emit signals
     changeSet.emitSignals(this);
@@ -721,16 +729,18 @@
     return returnValue;
 }
 
-bool CntSymbianEngine::removeRelationship(const QContactRelationship& relationship, QContactManager::Error& error)
+bool CntSymbianEngine::removeRelationship(const QContactRelationship& relationship, QContactManager::Error* error)
 {
     //affected contacts
     QContactChangeSet changeSet;
 
     //remove the relationship
-    bool returnValue = m_relationship->removeRelationship(&changeSet.removedRelationshipsContacts(), relationship, error);
+    QSet<QContactLocalId> affectedContactIds;
+    bool returnValue = m_relationship->removeRelationship(&affectedContactIds, relationship, error);
+    changeSet.insertRemovedRelationshipsContacts(affectedContactIds.toList());
 
     //add contacts to the list that shouldn't be emitted
-    m_dataBase->appendContactsEmitted(changeSet.removedRelationshipsContacts().toList());
+    m_dataBase->appendContactsEmitted(affectedContactIds.toList());
 
     //emit signals
     changeSet.emitSignals(this);
@@ -738,16 +748,18 @@
     return returnValue;
 }
 
-QList<QContactManager::Error> CntSymbianEngine::removeRelationships(const QList<QContactRelationship>& relationships, QContactManager::Error& error)
+bool CntSymbianEngine::removeRelationships(const QList<QContactRelationship>& relationships, QMap<int, QContactManager::Error>* errorMap, QContactManager::Error* error)
 {
     //affected contacts
     QContactChangeSet changeSet;
 
     //remove the relationships
-    QList<QContactManager::Error> returnValue = m_relationship->removeRelationships(&changeSet.removedRelationshipsContacts(), relationships, error);
+    QSet<QContactLocalId> affectedContactIds;
+    bool returnValue = m_relationship->removeRelationships(&affectedContactIds, relationships, errorMap, error);
+    changeSet.insertRemovedRelationshipsContacts(affectedContactIds.toList());
 
     //add contacts to the list that shouldn't be emitted
-    m_dataBase->appendContactsEmitted(changeSet.removedRelationshipsContacts().toList());
+    m_dataBase->appendContactsEmitted(affectedContactIds.toList());
 
     //emit signals
     changeSet.emitSignals(this);
@@ -755,15 +767,15 @@
     return returnValue;
 }
 
-QMap<QString, QContactDetailDefinition> CntSymbianEngine::detailDefinitions(const QString& contactType, QContactManager::Error& error) const
+QMap<QString, QContactDetailDefinition> CntSymbianEngine::detailDefinitions(const QString& contactType, QContactManager::Error* error) const
 {
     // TODO: update for SIM contacts later
     if (contactType != QContactType::TypeContact && contactType != QContactType::TypeGroup) {
-        error = QContactManager::InvalidContactTypeError;
+        *error = QContactManager::InvalidContactTypeError;
         return QMap<QString, QContactDetailDefinition>();
     }
 
-    error = QContactManager::NoError;
+    *error = QContactManager::NoError;
 
     // First get the default definitions
     QMap<QString, QMap<QString, QContactDetailDefinition> > schemaDefinitions = QContactManagerEngine::schemaDefinitions();
@@ -818,16 +830,16 @@
 }
 
 /* Synthesise the display label of a contact */
-QString CntSymbianEngine::synthesizedDisplayLabel(const QContact& contact, QContactManager::Error& error) const
+QString CntSymbianEngine::synthesizedDisplayLabel(const QContact& contact, QContactManager::Error* error) const
 {
-    error = QContactManager::NoError;
+    *error = QContactManager::NoError;
     return m_displayLabel->synthesizedDisplayLabel(contact, error);
 }
 
-bool CntSymbianEngine::setSelfContactId(const QContactLocalId& contactId, QContactManager::Error& error)
+bool CntSymbianEngine::setSelfContactId(const QContactLocalId& contactId, QContactManager::Error* error)
 {
     if (contactId <= 0) {
-        error = QContactManager::BadArgumentError;
+        *error = QContactManager::BadArgumentError;
         return false;
     }
 
@@ -842,14 +854,14 @@
     return (err==KErrNone);
 }
 
-QContactLocalId CntSymbianEngine::selfContactId(QContactManager::Error& error) const
+QContactLocalId CntSymbianEngine::selfContactId(QContactManager::Error* error) const
 {
-    error = QContactManager::NoError;
+    *error = QContactManager::NoError;
     QContactLocalId id = 0;
 
     TContactItemId myCard = m_dataBase->contactDatabase()->OwnCardId();
     if (myCard < 0) {
-    error = QContactManager::DoesNotExistError;
+    *error = QContactManager::DoesNotExistError;
     }
     else {
         id = myCard;
@@ -957,15 +969,13 @@
             QContactFetchRequest* r = static_cast<QContactFetchRequest*>(currentRequest);
             QContactFilter filter = r->filter();
             QList<QContactSortOrder> sorting = r->sorting();
-            QStringList defs = r->definitionRestrictions();
+            QContactFetchHint fh = r->fetchHint();
 
             QContactManager::Error operationError;
-            QList<QContact> requestedContacts = QContactManagerEngine::contacts(filter, sorting, defs, operationError);
+            QList<QContact> requestedContacts = contacts(filter, sorting, fh, &operationError);
 
             // update the request with the results.
-            if (!requestedContacts.isEmpty() || operationError != QContactManager::NoError)
-                updateContactFetchRequest(r, requestedContacts, operationError); // emit resultsAvailable()
-            updateRequestState(currentRequest, QContactAbstractRequest::FinishedState);
+            updateContactFetchRequest(r, requestedContacts, operationError, QContactAbstractRequest::FinishedState); // emit resultsAvailable()
         }
         break;
 
@@ -976,11 +986,9 @@
             QList<QContactSortOrder> sorting = r->sorting();
 
             QContactManager::Error operationError = QContactManager::NoError;
-            QList<QContactLocalId> requestedContactIds = QContactManagerEngine::contactIds(filter, sorting, operationError);
+            QList<QContactLocalId> requestedContactIds = contactIds(filter, sorting, &operationError);
 
-            if (!requestedContactIds.isEmpty() || operationError != QContactManager::NoError)
-                updateContactLocalIdFetchRequest(r, requestedContactIds, operationError); // emit resultsAvailable()
-            updateRequestState(currentRequest, QContactAbstractRequest::FinishedState);
+            updateContactLocalIdFetchRequest(r, requestedContactIds, operationError, QContactAbstractRequest::FinishedState);
         }
         break;
 
@@ -991,10 +999,9 @@
 
             QContactManager::Error operationError = QContactManager::NoError;
             QMap<int, QContactManager::Error> errorMap;
-            saveContacts(&contacts, &errorMap, operationError);
+            saveContacts(&contacts, &errorMap, &operationError);
 
-            updateContactSaveRequest(r, contacts, operationError, errorMap); // there will always be results of some form.  emit resultsAvailable().
-            updateRequestState(currentRequest, QContactAbstractRequest::FinishedState);
+            updateContactSaveRequest(r, contacts, operationError, errorMap, QContactAbstractRequest::FinishedState); // there will always be results of some form.  emit resultsAvailable().
         }
         break;
 
@@ -1012,17 +1019,15 @@
 
             for (int i = 0; i < contactsToRemove.size(); i++) {
                 QContactManager::Error tempError;
-                removeContact(contactsToRemove.at(i), changeSet, tempError);
+                removeContact(contactsToRemove.at(i), changeSet, &tempError);
 
+                errorMap.insert(i, tempError);                
                 if (tempError != QContactManager::NoError) {
-                    errorMap.insert(i, tempError);
                     operationError = tempError;
                 }
             }
 
-            if (!errorMap.isEmpty() || operationError != QContactManager::NoError)
-                updateContactRemoveRequest(r, operationError, errorMap); // emit resultsAvailable()
-            updateRequestState(currentRequest, QContactAbstractRequest::FinishedState);
+            updateContactRemoveRequest(r, operationError, errorMap, QContactAbstractRequest::FinishedState);
         }
         break;
 
@@ -1034,84 +1039,41 @@
             QMap<QString, QContactDetailDefinition> requestedDefinitions;
             QStringList names = r->definitionNames();
             if (names.isEmpty())
-                names = detailDefinitions(r->contactType(), operationError).keys(); // all definitions.
+                names = detailDefinitions(r->contactType(), &operationError).keys(); // all definitions.
 
             QContactManager::Error tempError;
             for (int i = 0; i < names.size(); i++) {
-                QContactDetailDefinition current = detailDefinition(names.at(i), r->contactType(), tempError);
+                QContactDetailDefinition current = detailDefinition(names.at(i), r->contactType(), &tempError);
                 requestedDefinitions.insert(names.at(i), current);
 
+                errorMap.insert(i, tempError);              
                 if (tempError != QContactManager::NoError) {
-                    errorMap.insert(i, tempError);
                     operationError = tempError;
                 }
             }
 
-            if (!errorMap.isEmpty() || !requestedDefinitions.isEmpty() || operationError != QContactManager::NoError)
-                updateDefinitionFetchRequest(r, requestedDefinitions, operationError, errorMap); // emit resultsAvailable()
-            updateRequestState(currentRequest, QContactAbstractRequest::FinishedState);
+            updateDefinitionFetchRequest(r, requestedDefinitions, operationError, errorMap, QContactAbstractRequest::FinishedState);
         }
         break;
 
-// symbian engine currently does not support mutable definitions.
-//
-//        case QContactAbstractRequest::DetailDefinitionSaveRequest:
-//        {
-//            QContactDetailDefinitionSaveRequest* r = static_cast<QContactDetailDefinitionSaveRequest*>(currentRequest);
-//            QContactManager::Error operationError = QContactManager::NoError;
-//            QMap<int, QContactManager::Error> errorMap;
-//            QList<QContactDetailDefinition> definitions = r->definitions();
-//            QList<QContactDetailDefinition> savedDefinitions;
-//
-//            QContactManager::Error tempError;
-//            for (int i = 0; i < definitions.size(); i++) {
-//                QContactDetailDefinition current = definitions.at(i);
-//                saveDetailDefinition(current, r->contactType(), changeSet, tempError);
-//                savedDefinitions.append(current);
-//
-//                if (tempError != QContactManager::NoError) {
-//                    errorMap.insert(i, tempError);
-//                    operationError = tempError;
-//                }
-//            }
-//
-//            // update the request with the results.
-//            updateDefinitionSaveRequest(r, savedDefinitions, operationError, errorMap); // there will always be results of some form.  emit resultsAvailable().
-//            updateRequestState(currentRequest, QContactAbstractRequest::FinishedState);
-//        }
-//        break;
-//
-//        case QContactAbstractRequest::DetailDefinitionRemoveRequest:
-//        {
-//            QContactDetailDefinitionRemoveRequest* r = static_cast<QContactDetailDefinitionRemoveRequest*>(currentRequest);
-//            QStringList names = r->definitionNames();
-//
-//            QContactManager::Error operationError = QContactManager::NoError;
-//            QMap<int, QContactManager::Error> errorMap;
-//
-//            for (int i = 0; i < names.size(); i++) {
-//                QContactManager::Error tempError;
-//                removeDetailDefinition(names.at(i), r->contactType(), changeSet, tempError);
-//
-//                if (tempError != QContactManager::NoError) {
-//                    errorMap.insert(i, tempError);
-//                    operationError = tempError;
-//                }
-//            }
-//
-//            // there are no results, so just update the status with the error.
-//            if (!errorMap.isEmpty() || operationError != QContactManager::NoError)
-//                updateDefinitionRemoveRequest(r, operationError, errorMap); // emit resultsAvailable()
-//            updateRequestState(currentRequest, QContactAbstractRequest::FinishedState);
-//        }
-//        break;
+        case QContactAbstractRequest::DetailDefinitionSaveRequest:
+        {
+            // symbian engine currently does not support mutable definitions.
+        }
+        break;
+
+        case QContactAbstractRequest::DetailDefinitionRemoveRequest:
+        {
+            // symbian engine currently does not support mutable definitions.
+        }
+        break;
 
         case QContactAbstractRequest::RelationshipFetchRequest:
         {
             QContactRelationshipFetchRequest* r = static_cast<QContactRelationshipFetchRequest*>(currentRequest);
             QContactManager::Error operationError = QContactManager::NoError;
             QList<QContactManager::Error> operationErrors;
-            QList<QContactRelationship> allRelationships = relationships(QString(), QContactId(), QContactRelationshipFilter::Either, operationError);
+            QList<QContactRelationship> allRelationships = relationships(QString(), QContactId(), QContactRelationship::Either, &operationError);
             QList<QContactRelationship> requestedRelationships;
 
             // select the requested relationships.
@@ -1127,9 +1089,7 @@
             }
 
             // update the request with the results.
-            if (!requestedRelationships.isEmpty() || operationError != QContactManager::NoError)
-                updateRelationshipFetchRequest(r, requestedRelationships, operationError); // emit resultsAvailable()
-            updateRequestState(currentRequest, QContactAbstractRequest::FinishedState);
+            updateRelationshipFetchRequest(r, requestedRelationships, operationError, QContactAbstractRequest::FinishedState);
         }
         break;
 
@@ -1140,23 +1100,17 @@
             QList<QContactRelationship> relationshipsToRemove = r->relationships();
             QMap<int, QContactManager::Error> errorMap;
 
-            bool foundMatch = false;
             for (int i = 0; i < relationshipsToRemove.size(); i++) {
                 QContactManager::Error tempError;
-                removeRelationship(relationshipsToRemove.at(i), tempError);
+                removeRelationship(relationshipsToRemove.at(i), &tempError);
 
+                errorMap.insert(i, tempError);
                 if (tempError != QContactManager::NoError) {
-                    errorMap.insert(i, tempError);
                     operationError = tempError;
                 }
             }
 
-            if (foundMatch == false && operationError == QContactManager::NoError)
-                operationError = QContactManager::DoesNotExistError;
-
-            if (!errorMap.isEmpty() || operationError != QContactManager::NoError)
-                updateRelationshipRemoveRequest(r, operationError, errorMap); // emit resultsAvailable()
-            updateRequestState(currentRequest, QContactAbstractRequest::FinishedState);
+            updateRelationshipRemoveRequest(r, operationError, errorMap, QContactAbstractRequest::FinishedState);
         }
         break;
 
@@ -1171,18 +1125,17 @@
             QContactManager::Error tempError;
             for (int i = 0; i < requestRelationships.size(); i++) {
                 QContactRelationship current = requestRelationships.at(i);
-                saveRelationship(&current, tempError);
+                saveRelationship(&current, &tempError);
                 savedRelationships.append(current);
 
+                errorMap.insert(i, tempError);
                 if (tempError != QContactManager::NoError) {
-                    errorMap.insert(i, tempError);
                     operationError = tempError;
                 }
             }
 
             // update the request with the results.
-            updateRelationshipSaveRequest(r, savedRelationships, operationError, errorMap); // there will always be results of some form.  emit resultsAvailable().
-            updateRequestState(currentRequest, QContactAbstractRequest::FinishedState);
+            updateRelationshipSaveRequest(r, savedRelationships, operationError, errorMap, QContactAbstractRequest::FinishedState);
         }
         break;
 
@@ -1196,7 +1149,7 @@
 
 #ifndef PBK_UNIT_TEST
 /* Factory lives here in the basement */
-QContactManagerEngine* CntSymbianFactory::engine(const QMap<QString, QString>& parameters, QContactManager::Error& error)
+QContactManagerEngine* CntSymbianFactory::engine(const QMap<QString, QString>& parameters, QContactManager::Error* error)
 {
     return new CntSymbianEngine(parameters, error);
 }