qtmobility/plugins/contacts/symbian/tsrc/ut_symbian/ut_cntsymbianengine.cpp
changeset 4 90517678cc4f
parent 1 2b40d63a9c3d
child 5 453da2cfceef
--- a/qtmobility/plugins/contacts/symbian/tsrc/ut_symbian/ut_cntsymbianengine.cpp	Fri Apr 16 15:51:22 2010 +0300
+++ b/qtmobility/plugins/contacts/symbian/tsrc/ut_symbian/ut_cntsymbianengine.cpp	Mon May 03 13:18:40 2010 +0300
@@ -57,7 +57,7 @@
     QContactManager::Error error;
     QMap<QString, QString> emptyParameters;
 
-    m_engine = new CntSymbianEngine(emptyParameters, error);
+    m_engine = new CntSymbianEngine(emptyParameters, &error);
     if (error == QContactManager::NoError)
         removeAllContacts();
     else
@@ -83,13 +83,14 @@
 {
     if(m_engine) {
         // Empty cnt database
-        QContactManager::Error err;
+        QContactManager::Error err(QContactManager::NoError);
         QList<QContactSortOrder> sortOrders;
-        QList<QContactLocalId> cnts_ids = m_engine->contactIds(sortOrders, err);
+        QContactFilter defaultFilter = QContactFilter();
+        QList<QContactLocalId> cnts_ids = m_engine->contactIds(defaultFilter, sortOrders, &err);
         QVERIFY(err == QContactManager::NoError);
 
         for(int i=0; i<cnts_ids.count(); i++) {
-            QVERIFY(m_engine->removeContact(cnts_ids[i], err));
+            QVERIFY(m_engine->removeContact(cnts_ids[i], &err));
         }
     }
 }
@@ -101,7 +102,7 @@
 
     // Ctor
     CntSymbianEngine *ce;
-    ce = new CntSymbianEngine(params, error);
+    ce = new CntSymbianEngine(params, &error);
     QVERIFY(ce != NULL);
     QVERIFY(error == QContactManager::NoError);
     if (error == QContactManager::NoError) {
@@ -123,8 +124,7 @@
     QVERIFY(ce->m_relationship == ce1->m_relationship);
     QVERIFY(ce->m_transformContact == ce1->m_transformContact);
 
-    // dref
-    ce->deref();
+    delete ce;
     /*
     QVERIFY(ce->m_contactFilter == 0xDEDEDEDE);
     QVERIFY(ce->m_contactSorter == 0xDEDEDEDE);
@@ -139,28 +139,29 @@
     QContactManager::Error err;
     QList<QContactSortOrder> sortOrders;
     QContactId empty;
+    QContactFilter defaultFilter = QContactFilter();
 
-    int init_count = m_engine->contactIds(sortOrders, err).count();
+    int init_count = m_engine->contactIds(defaultFilter, sortOrders, &err).count();
     QVERIFY(err == QContactManager::NoError);
 
     // Save a "NULL" contact
-    QVERIFY(!m_engine->saveContact(NULL, err));
+    QVERIFY(!m_engine->saveContact(NULL, &err));
     QVERIFY(err == QContactManager::BadArgumentError);
-    int current_count = m_engine->contactIds(sortOrders, err).count();
+    int current_count = m_engine->contactIds(defaultFilter, sortOrders, &err).count();
     QVERIFY(err == QContactManager::NoError);
     QVERIFY(init_count == current_count);
 
     // Save a contact that is not in database
     QContact invaId;
-    QVERIFY(m_engine->saveContact(&invaId, err));   // Add to db
+    QVERIFY(m_engine->saveContact(&invaId, &err));   // Add to db
     QVERIFY(err == QContactManager::NoError);
     QContactId cId = invaId.id();
-    m_engine->removeContact(invaId.localId(), err);   // Ensure not in db
+    m_engine->removeContact(invaId.localId(), &err);   // Ensure not in db
     QVERIFY(err == QContactManager::NoError);
     invaId.setId(cId);
-    QVERIFY(!m_engine->saveContact(&invaId, err));   // Update non existent contact
+    QVERIFY(!m_engine->saveContact(&invaId, &err));   // Update non existent contact
     QVERIFY(err == QContactManager::DoesNotExistError);
-    current_count = m_engine->contactIds(sortOrders, err).count();
+    current_count = m_engine->contactIds(defaultFilter, sortOrders, &err).count();
     QVERIFY(err == QContactManager::NoError);
     QVERIFY(init_count == current_count);
 
@@ -168,23 +169,23 @@
     alice.setType("Jargon");
 
     // Save a "non contact(Jargon) type" contact
-    QVERIFY(!m_engine->saveContact(&alice, err));
+    QVERIFY(!m_engine->saveContact(&alice, &err));
     QVERIFY(err == QContactManager::InvalidDetailError);
     QVERIFY(alice.id() == empty);
     QVERIFY(alice.localId() == 0);
-    current_count = m_engine->contactIds(sortOrders, err).count();
+    current_count = m_engine->contactIds(defaultFilter, sortOrders, &err).count();
     QVERIFY(err == QContactManager::NoError);
     QVERIFY(init_count == current_count);
 
     // Save a valid contact
     alice.setType(QContactType::TypeContact);
-    QVERIFY(m_engine->saveContact(&alice, err));
+    QVERIFY(m_engine->saveContact(&alice, &err));
     QVERIFY(err == QContactManager::NoError);
     QVERIFY(alice.id() != empty);
     QVERIFY(alice.localId() != 0);
     QString uri = QString(QLatin1String(CNT_SYMBIAN_MANAGER_NAME));
     QVERIFY(alice.id().managerUri().contains(uri, Qt::CaseInsensitive));
-    current_count = m_engine->contactIds(sortOrders, err).count();
+    current_count = m_engine->contactIds(defaultFilter, sortOrders, &err).count();
     QVERIFY(err == QContactManager::NoError);
     QVERIFY(init_count + 1 == current_count);
     
@@ -194,7 +195,7 @@
     QContactName en;
     en.setCustomLabel("ccc");
     QVERIFY(g.saveDetail(&en));
-    QVERIFY(m_engine->saveContact(&g, err));
+    QVERIFY(m_engine->saveContact(&g, &err));
     QVERIFY(err == QContactManager::NoError);
     QVERIFY(g.id() != empty);
     QVERIFY(g.localId() != 0);
@@ -232,11 +233,12 @@
     c.saveDetail(&email);
     c.setPreferredDetail("email", email);
 
-    QVERIFY(m_engine->saveContact(&c, err));
+    QVERIFY(m_engine->saveContact(&c, &err));
     QVERIFY(err == QContactManager::NoError);
 
     //fetch the saved contact and check preferred details
-    QContact fetched = m_engine->contact(c.localId(), QStringList(), err);
+    QContactFetchHint hint = QContactFetchHint();
+    QContact fetched = m_engine->contact(c.localId(), hint, &err);
     QVERIFY(err == QContactManager::NoError);
 
     QContactDetail callDetail1 = fetched.preferredDetail("call");
@@ -267,11 +269,11 @@
     c2.setPreferredDetail("videocall", number1);
     c2.setPreferredDetail("message", number1);
 
-    QVERIFY(m_engine->saveContact(&c2, err));
+    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(), QStringList(), err);
+    QContact fetched2 = m_engine->contact(c2.localId(), hint, &err);
     QVERIFY(err == QContactManager::NoError);
 
     QContactDetail callDetail4 = fetched2.preferredDetail("call");
@@ -293,20 +295,21 @@
 void TestSymbianEngine::saveContacts()
 {
     QContactManager::Error err;
+    QContactFilter defaultFilter = QContactFilter();
     QList<QContactSortOrder> sortOrders;
     QList<QContact> contacts;
     QContactId empty;
     int count = 5;
 
-    int init_count = m_engine->contactIds(sortOrders, err).count();
+    int init_count = m_engine->contactIds(defaultFilter, sortOrders, &err).count();
     QVERIFY(err == QContactManager::NoError);
 
     // NULL
     QMap<int, QContactManager::Error> errorMap;
-    QVERIFY(!m_engine->saveContacts(NULL, &errorMap, err));
+    QVERIFY(!m_engine->saveContacts(NULL, &errorMap, &err));
     QVERIFY(errorMap.count() == 0);
     QVERIFY(err == QContactManager::BadArgumentError);
-    int current_count = m_engine->contactIds(sortOrders, err).count();
+    int current_count = m_engine->contactIds(defaultFilter, sortOrders, &err).count();
     QVERIFY(err == QContactManager::NoError);
     QVERIFY(init_count == current_count);
 
@@ -316,16 +319,16 @@
         alice.setType("Jargon");
         contacts.append(alice);
     }
-    QVERIFY(!m_engine->saveContacts(&contacts, &errorMap, err));
+    QVERIFY(!m_engine->saveContacts(&contacts, &errorMap, &err));
     QVERIFY(err == QContactManager::InvalidDetailError);
     foreach(QContactManager::Error err, errorMap) {
         QVERIFY(err == QContactManager::InvalidDetailError);
     }
-    foreach(QContact c, contacts) {
+    foreach(const QContact& c, contacts) {
         QVERIFY(c.id() == empty);
         QVERIFY(c.localId() == 0);
     }
-    current_count = m_engine->contactIds(sortOrders, err).count();
+    current_count = m_engine->contactIds(defaultFilter, sortOrders, &err).count();
     QVERIFY(err == QContactManager::NoError);
     QVERIFY(init_count == current_count);
     contacts.clear();
@@ -336,24 +339,24 @@
         alice.setType(QContactType::TypeContact);
         contacts.append(alice);
     }
-    QVERIFY(m_engine->saveContacts(&contacts, &errorMap, err));
+    QVERIFY(m_engine->saveContacts(&contacts, &errorMap, &err));
     QVERIFY(err == QContactManager::NoError);
     foreach(QContactManager::Error err, errorMap) {
         QVERIFY(err == QContactManager::NoError);
     }
     QString uri = QString(QLatin1String(CNT_SYMBIAN_MANAGER_NAME));
-    foreach(QContact c, contacts) {
+    foreach(const QContact& c, contacts) {
         QVERIFY(c.id() != empty);
         QVERIFY(c.localId() != 0);
         QVERIFY(c.id().managerUri().contains(uri, Qt::CaseInsensitive));
     }
-    current_count = m_engine->contactIds(sortOrders, err).count();
+    current_count = m_engine->contactIds(defaultFilter, sortOrders, &err).count();
     QVERIFY(err == QContactManager::NoError);
     QVERIFY(init_count + count == current_count);
     contacts.clear();
 
     // Save with one invalid contact in list
-    init_count = m_engine->contactIds(sortOrders, err).count();
+    init_count = m_engine->contactIds(defaultFilter, sortOrders, &err).count();
     for(int i=0; i<count; i++) {
         QContact alice;
         alice.setType(QContactType::TypeContact);
@@ -363,7 +366,7 @@
     invalid.setType("Jasdfasd");
     contacts.insert(3, invalid);
 
-    QVERIFY(!m_engine->saveContacts(&contacts, &errorMap, err));
+    QVERIFY(!m_engine->saveContacts(&contacts, &errorMap, &err));
     QVERIFY(err == QContactManager::InvalidDetailError);
     foreach(QContactManager::Error err, errorMap) {
         QVERIFY(err == QContactManager::InvalidDetailError);
@@ -380,7 +383,7 @@
             QVERIFY(c.id().managerUri().contains(uri, Qt::CaseInsensitive));
         }
     }
-    current_count = m_engine->contactIds(sortOrders, err).count();
+    current_count = m_engine->contactIds(defaultFilter, sortOrders, &err).count();
     QVERIFY(err == QContactManager::NoError);
     QVERIFY(init_count + count == current_count);
     contacts.clear();
@@ -389,21 +392,22 @@
 void TestSymbianEngine::retrieveContact()
 {
     QContactManager::Error err;
+    QContactFetchHint hint = QContactFetchHint();
 
     QContact alice;
     alice.setType(QContactType::TypeContact);
-    QVERIFY(m_engine->saveContact(&alice, err));
+    QVERIFY(m_engine->saveContact(&alice, &err));
     QVERIFY(err == QContactManager::NoError);
 
     // Retrieve "non contact"
-    QContact c = m_engine->contact(0, QStringList(), err);
+    QContact c = m_engine->contact(0, hint, &err);
     QVERIFY(&c != NULL);
     QVERIFY(c.localId() == 0);
     QVERIFY(err == QContactManager::DoesNotExistError);
 
     // Retrieve valid existing contact
     QContactLocalId aid = alice.localId();
-    c = m_engine->contact(aid, QStringList(), err);
+    c = m_engine->contact(aid, hint, &err);
     QVERIFY(&c != NULL);
     QVERIFY(c.localId() == aid);
     QVERIFY(err == QContactManager::NoError);
@@ -413,6 +417,8 @@
 {
     QContactManager::Error err;
     QContactFilter f;
+    QContactFilter defaultFilter = QContactFilter();
+    QContactFetchHint hint = QContactFetchHint();
     QList<QContactSortOrder> s;
     QList<QContactLocalId> cnt_ids;
 
@@ -427,7 +433,7 @@
     number.setSubTypes("Mobile");
     number.setNumber("12345678");
     QVERIFY(c.saveDetail(&number));
-    QVERIFY(m_engine->saveContact(&c, err));
+    QVERIFY(m_engine->saveContact(&c, &err));
     QVERIFY(err == QContactManager::NoError);
 
     QContact d;
@@ -435,7 +441,7 @@
     QContactName dn;
     dn.setFirstName("bbb");
     QVERIFY(d.saveDetail(&dn));
-    QVERIFY(m_engine->saveContact(&d, err));
+    QVERIFY(m_engine->saveContact(&d, &err));
     QVERIFY(err == QContactManager::NoError);
 
     QContact e;
@@ -443,38 +449,47 @@
     QContactName en;
     en.setCustomLabel("ccc");
     QVERIFY(e.saveDetail(&en));
-    QVERIFY(m_engine->saveContact(&e, err));
+    QVERIFY(m_engine->saveContact(&e, &err));
     QVERIFY(err == QContactManager::NoError);
 
     // Retrieve all contacts
-    cnt_ids = m_engine->contactIds(f, s, err);
+    cnt_ids = m_engine->contactIds(f, s, &err);
     QVERIFY(err == QContactManager::NoError);
+    QVERIFY(cnt_ids.count() > 0);
 
     QContactDetailFilter mobileFilter;
     mobileFilter.setDetailDefinitionName(QContactPhoneNumber::DefinitionName, QContactPhoneNumber::FieldSubTypes);
     mobileFilter.setValue(QLatin1String(QContactPhoneNumber::SubTypeMobile));
 
     // Retrieve contacts with mobile number
-    cnt_ids = m_engine->contactIds(mobileFilter, s, err);
+    cnt_ids = m_engine->contactIds(mobileFilter, s, &err);
     QVERIFY(err == QContactManager::NoError);
+    QVERIFY(cnt_ids.count() > 0);
+    
+    // Slow filter
+    QList<QContactLocalId> fast_ids = m_engine->contactIds(mobileFilter, s, &err);
+    QList<QContactLocalId> all_ids = m_engine->contactIds(f, s, &err);
+    QList<QContactLocalId> slow_ids = m_engine->slowFilter(mobileFilter, all_ids, &err);
+    QVERIFY(err == QContactManager::NoError);
+    QVERIFY(slow_ids.count() == fast_ids.count());
 
     QContactDetailFilter invalidFilter;
     mobileFilter.setDetailDefinitionName("asfdasdf", "asdfasdf");
 
     // Retrieve contacts with invalid filter
-    cnt_ids = m_engine->contactIds(invalidFilter, s, err);
+    cnt_ids = m_engine->contactIds(invalidFilter, s, &err);
     QVERIFY(err == QContactManager::NotSupportedError);
 
     // Retrieve sorted contacts
     QContactSortOrder sortOrder;
     QList<QContactSortOrder> s1;
-    sortOrder.setDetailDefinitionName(QContactName::DefinitionName,  QContactName::FieldFirst);
+    sortOrder.setDetailDefinitionName(QContactName::DefinitionName,  QContactName::FieldFirstName);
     sortOrder.setBlankPolicy(QContactSortOrder::BlanksLast);
     sortOrder.setDirection(Qt::AscendingOrder);
     sortOrder.setCaseSensitivity(Qt::CaseInsensitive);
     s1.append(sortOrder);
 
-    cnt_ids = m_engine->contactIds(s1, err);
+    cnt_ids = m_engine->contactIds(defaultFilter, s1, &err);
     QVERIFY(err == QContactManager::NoError);
 
     // Retrieve with invalid sort order
@@ -482,16 +497,27 @@
     QList<QContactSortOrder> s2;
     sortOrder1.setDetailDefinitionName("asdfasdf", "asdfasd");
 
-    cnt_ids = m_engine->contactIds(s2, err);
+    cnt_ids = m_engine->contactIds(defaultFilter, s2, &err);
+    QVERIFY(err == QContactManager::NoError);
+    
+    // Retrieve full contacts (with all details)
+    QList<QContact> contactList;
+    QList<QContactSortOrder> sortOrders;
+    QStringList definitionRestrictions;
+    contactList = m_engine->contacts(defaultFilter, sortOrders, hint, &err);
+    QVERIFY(err == QContactManager::NoError);
+    QContactFilter filter;
+    contactList = m_engine->contacts(filter, sortOrders, hint, &err);
     QVERIFY(err == QContactManager::NoError);
 }
 
 void TestSymbianEngine::updateContact()
 {
     QContactManager::Error err;
+    QContactFetchHint hint = QContactFetchHint();
     QContact c;
 
-    QVERIFY(m_engine->saveContact(&c, err));
+    QVERIFY(m_engine->saveContact(&c, &err));
     QVERIFY(err == QContactManager::NoError);
 
     int details_before = c.details().count();
@@ -508,11 +534,11 @@
 
     // update the contact
     QContactLocalId id = c.localId();
-    QVERIFY(m_engine->saveContact(&c, err));
+    QVERIFY(m_engine->saveContact(&c, &err));
     QVERIFY(err == QContactManager::NoError);
 
     // Verify that contact has been updated
-    QContact d = m_engine->contact(id, QStringList(), err);
+    QContact d = m_engine->contact(id, hint, &err);
     QVERIFY(err == QContactManager::NoError);
     QVERIFY(d.localId() == id);
     QVERIFY(d.details().count() > details_before);
@@ -525,7 +551,7 @@
     QContactManager::Error err;
     QContact c;
 
-    QVERIFY(m_engine->saveContact(&c, err));
+    QVERIFY(m_engine->saveContact(&c, &err));
     QVERIFY(err == QContactManager::NoError);
     QContactLocalId initialId = c.localId();
     
@@ -549,7 +575,7 @@
     c.saveDetail(&number);
 
     //verify that the same contact was updated
-    QVERIFY(m_engine->saveContact(&c, err));
+    QVERIFY(m_engine->saveContact(&c, &err));
     QContactLocalId id = c.localId();
     QVERIFY(err == QContactManager::NoError);
     QVERIFY(initialId == id);
@@ -558,53 +584,50 @@
 void TestSymbianEngine::removeContact()
 {
     QContactManager::Error err;
+    QContactFetchHint hint = QContactFetchHint();
 
     QContact c;
     c.setType(QContactType::TypeContact);
-    QVERIFY(m_engine->saveContact(&c, err));
+    QVERIFY(m_engine->saveContact(&c, &err));
     QVERIFY(err == QContactManager::NoError);
 
     // Remove existing contact
     QContactLocalId id = c.localId();
-    QVERIFY(m_engine->removeContact(id, err));
+    QVERIFY(m_engine->removeContact(id, &err));
     QVERIFY(err == QContactManager::NoError);
 
     // Verify that contact has been removed
-    QContact f = m_engine->contact(id, QStringList(), err);
+    QContact f = m_engine->contact(id, hint, &err);
     QVERIFY(f.localId() == 0);
     QVERIFY(err == QContactManager::DoesNotExistError);
 
     // Remove non existent contact
-    QVERIFY(!m_engine->removeContact(0, err));
+    QVERIFY(!m_engine->removeContact(0, &err));
     QVERIFY(err == QContactManager::DoesNotExistError);
 }
 
 void TestSymbianEngine::removeContacts()
 {
     QContactManager::Error err;
+    QContactFetchHint hint = QContactFetchHint();
     QList<QContactLocalId> contacts;
     int count = 5;
 
     // Remove non existent contacts
     QMap<int, QContactManager::Error> errorMap;
-    QVERIFY(m_engine->removeContacts(&contacts, &errorMap, err));
+    QVERIFY(m_engine->removeContacts(contacts, &errorMap, &err));
     QVERIFY(err == QContactManager::NoError);
     QVERIFY(errorMap.count() == 0);
 
-    // NULL argument
-    QVERIFY(!m_engine->removeContacts(NULL, &errorMap, err));
-    QVERIFY(errorMap.count() == 0);
-    QVERIFY(err == QContactManager::BadArgumentError);
-
     // Remove existing contacts
     for(int i=0; i<count; i++) {
         QContact c;
         c.setType(QContactType::TypeContact);
-        QVERIFY(m_engine->saveContact(&c, err));
+        QVERIFY(m_engine->saveContact(&c, &err));
         QVERIFY(err == QContactManager::NoError);
         contacts.append(c.localId());
     }
-    QVERIFY(m_engine->removeContacts(&contacts, &errorMap, err));
+    QVERIFY(m_engine->removeContacts(contacts, &errorMap, &err));
     QVERIFY(err == QContactManager::NoError);
     foreach(QContactManager::Error e, errorMap) {
         QVERIFY(e == QContactManager::NoError);
@@ -612,7 +635,7 @@
 
     // Verify that contacts have been removed
     for(int i=0; i<contacts.count(); i++) {
-        QContact f = m_engine->contact(contacts[i], QStringList(), err);
+        QContact f = m_engine->contact(contacts[i], hint, &err);
         QVERIFY(f.localId() == 0);
         QVERIFY(err == QContactManager::DoesNotExistError);
     }
@@ -622,20 +645,20 @@
     for(int i=0; i<count; i++) {
         QContact c;
         c.setType(QContactType::TypeContact);
-        QVERIFY(m_engine->saveContact(&c, err));
+        QVERIFY(m_engine->saveContact(&c, &err));
         QVERIFY(err == QContactManager::NoError);
         contacts.append(c.localId());
     }
     contacts.insert(3, 0);
 
-    QVERIFY(!m_engine->removeContacts(&contacts, &errorMap, err));
+    QVERIFY(!m_engine->removeContacts(contacts, &errorMap, &err));
     QVERIFY(err == QContactManager::DoesNotExistError);
     foreach(QContactManager::Error e, errorMap) {
         QVERIFY(e == QContactManager::DoesNotExistError);
     }
 
     for(int i=0; i<contacts.count(); i++) {
-        QContact f = m_engine->contact(contacts[i], QStringList(), err);
+        QContact f = m_engine->contact(contacts[i], hint, &err);
         QVERIFY(f.localId() == 0);
         QVERIFY(err == QContactManager::DoesNotExistError);
     }
@@ -650,22 +673,22 @@
     QContactName ownName;
     ownName.setFirstName("Own");
     own.saveDetail(&ownName);
-    QVERIFY(m_engine->saveContact(&own, err));
+    QVERIFY(m_engine->saveContact(&own, &err));
     QVERIFY(err == QContactManager::NoError);
 
     // Set a non existent contact as own card and verify
     // ensure this contact does not exist in dbase
     QContactLocalId id(12);
-    m_engine->removeContact(id, err);   // Dont test err. May or may not be in dbase
-    QVERIFY(!m_engine->setSelfContactId(id, err)); // does not exist
+    m_engine->removeContact(id, &err);   // Don't test err. May or may not be in dbase
+    QVERIFY(!m_engine->setSelfContactId(id, &err)); // does not exist
     QVERIFY(err == QContactManager::DoesNotExistError);
 
     // Test a "0" contact id
-    QVERIFY(!m_engine->setSelfContactId(0, err)); // Bad argument
+    QVERIFY(!m_engine->setSelfContactId(0, &err)); // Bad argument
     QVERIFY(err == QContactManager::BadArgumentError);
 
     // Set an existent contact as own card
-    QVERIFY(m_engine->setSelfContactId(own.localId(), err));
+    QVERIFY(m_engine->setSelfContactId(own.localId(), &err));
     QVERIFY(err == QContactManager::NoError);
 }
 
@@ -678,19 +701,19 @@
     QContactName ownName;
     ownName.setFirstName("Own");
     own.saveDetail(&ownName);
-    QVERIFY(m_engine->saveContact(&own, err));
+    QVERIFY(m_engine->saveContact(&own, &err));
     QVERIFY(err == QContactManager::NoError);
-    QVERIFY(m_engine->setSelfContactId(own.localId(), err));
+    QVERIFY(m_engine->setSelfContactId(own.localId(), &err));
     QVERIFY(err == QContactManager::NoError);
 
     // Fetch existing self contact
-    QContactLocalId own_id = m_engine->selfContactId(err);
+    QContactLocalId own_id = m_engine->selfContactId(&err);
     QVERIFY(err == QContactManager::NoError);
     QVERIFY(own_id == own.localId());
 
     // Remove self contact and verify
-    QVERIFY(m_engine->removeContact(own.localId(), err));
-    QContactLocalId idr = m_engine->selfContactId(err);
+    QVERIFY(m_engine->removeContact(own.localId(), &err));
+    QContactLocalId idr = m_engine->selfContactId(&err);
     QVERIFY(err == QContactManager::DoesNotExistError);
     QVERIFY(idr == 0);
 }
@@ -765,7 +788,7 @@
     QContact g;
     g.setType(QContactType::TypeGroup);
 
-    QVERIFY(m_engine->saveContact(&g, err));
+    QVERIFY(m_engine->saveContact(&g, &err));
     QVERIFY(err == QContactManager::NoError);
     QVERIFY(g.id() != empty);
     QVERIFY(g.localId() != 0);
@@ -776,7 +799,7 @@
     QContact g1;
     g1.setType("Jargon");
 
-    QVERIFY(!m_engine->saveContact(&g1, err));
+    QVERIFY(!m_engine->saveContact(&g1, &err));
     QVERIFY(err == QContactManager::InvalidDetailError);
     QVERIFY(g1.id() == empty);
     QVERIFY(g1.localId() == 0);
@@ -792,16 +815,16 @@
     filter.setDetailDefinitionName(QContactType::DefinitionName, QContactType::FieldType);
     filter.setValue(QString(QLatin1String(QContactType::TypeGroup)));
     
-    QList<QContactLocalId> grp_ids = m_engine->contactIds(filter, s, err);
+    QList<QContactLocalId> grp_ids = m_engine->contactIds(filter, s, &err);
     QVERIFY(err == QContactManager::NoError);
     QVERIFY(err == QContactManager::NoError);
 
     QContact g;
     g.setType(QContactType::TypeGroup);
-    QVERIFY(m_engine->saveContact(&g, err));
+    QVERIFY(m_engine->saveContact(&g, &err));
     QVERIFY(err == QContactManager::NoError);
 
-    QList<QContactLocalId> grp_ids1 = m_engine->contactIds(filter, s, err);
+    QList<QContactLocalId> grp_ids1 = m_engine->contactIds(filter, s, &err);
     QVERIFY(err == QContactManager::NoError);
     QVERIFY(grp_ids.count() + 1 == grp_ids1.count());
 
@@ -814,9 +837,9 @@
     QContactManager::Error error;
 
     QContact a;
-    QVERIFY(m_engine->saveContact(&a, error));
+    QVERIFY(m_engine->saveContact(&a, &error));
     QContact b;
-    QVERIFY(m_engine->saveContact(&b, error));
+    QVERIFY(m_engine->saveContact(&b, &error));
 
     QContactRelationship rel;
     rel.setFirst(a.id());
@@ -824,7 +847,7 @@
     rel.setRelationshipType(QContactRelationship::HasSpouse);
 
     // Add relationship
-    m_engine->saveRelationship(&rel, error);
+    m_engine->saveRelationship(&rel, &error);
     bool isValid(false);
     if (error == QContactManager::NoError ||
         error == QContactManager::NotSupportedError)
@@ -833,17 +856,19 @@
     QVERIFY(isValid);
 
     // Remove relationship
-    m_engine->removeRelationship(rel, error);
+    m_engine->removeRelationship(rel, &error);
     if (error == QContactManager::NoError ||
         error == QContactManager::NotSupportedError)
         isValid = true;
     else
         isValid = false;
     QVERIFY(isValid);
-    
-    QStringList supportedRelationships =
+
+    // TODO: replacement?
+    /*QStringList supportedRelationships =
         m_engine->supportedRelationshipTypes(QContactType::TypeGroup);
     QVERIFY(supportedRelationships.contains(QContactRelationship::HasMember));
+    */
 }
 
 void TestSymbianEngine::batchRelationships()
@@ -853,9 +878,9 @@
     QContactManager::Error error;
 
     QContact a;
-    QVERIFY(m_engine->saveContact(&a, error));
+    QVERIFY(m_engine->saveContact(&a, &error));
     QContact b;
-    QVERIFY(m_engine->saveContact(&b, error));
+    QVERIFY(m_engine->saveContact(&b, &error));
 
     QContactRelationship rel;
     rel.setFirst(a.id());
@@ -867,9 +892,9 @@
     bool isValid(false);
 
     // Add relationships
-    QList<QContactManager::Error> errors = m_engine->saveRelationships(&list, error);
-    QVERIFY(&errors != NULL);
-    foreach(QContactManager::Error err, errors) {
+    QMap<int, QContactManager::Error> errorMap;
+    QVERIFY(m_engine->saveRelationships(&list, &errorMap, &error));
+    foreach(QContactManager::Error err, errorMap) {
         if (err == QContactManager::NoError ||
                 err == QContactManager::NotSupportedError)
             isValid = true;
@@ -879,10 +904,10 @@
     }
 
     // fetch relationships
-    QContactRelationshipFilter::Role role;
-    role = QContactRelationshipFilter::First;
+    QContactRelationship::Role role;
+    role = QContactRelationship::First;
     list.clear();
-    list = m_engine->relationships(QContactRelationship::HasSpouse, a.id(), role, error);
+    list = m_engine->relationships(QContactRelationship::HasSpouse, a.id(), role, &error);
     QVERIFY(&list != NULL);
     if (error == QContactManager::NoError ||
         error == QContactManager::NotSupportedError)
@@ -892,9 +917,8 @@
     QVERIFY(isValid);
 
     // Remove relationships
-    errors = m_engine->removeRelationships(list, error);
-    QVERIFY(&errors != NULL);
-    foreach(QContactManager::Error err, errors) {
+    QVERIFY(m_engine->removeRelationships(list, &errorMap, &error));
+    foreach(QContactManager::Error err, errorMap) {
         if (err == QContactManager::NoError ||
                 err == QContactManager::NotSupportedError)
             isValid = true;
@@ -915,7 +939,7 @@
     QContactManager::Error err = QContactManager::NoError;
 
     QContact empty;
-    QString label = m_engine->synthesizedDisplayLabel(empty, err);
+    QString label = m_engine->synthesizedDisplayLabel(empty, &err);
     QVERIFY(err == QContactManager::NoError);
     QVERIFY(label == QString("Unnamed"));
 
@@ -923,7 +947,7 @@
     QContactName fn;
     fn.setFirstName("Alice");
     first.saveDetail(&fn);
-    label = m_engine->synthesizedDisplayLabel(first, err);
+    label = m_engine->synthesizedDisplayLabel(first, &err);
     QVERIFY(err == QContactManager::NoError);
     QVERIFY(label == QString("Alice"));
 
@@ -931,7 +955,7 @@
     QContactName ln;
     ln.setLastName("Jones");
     last.saveDetail(&ln);
-    label = m_engine->synthesizedDisplayLabel(last, err);
+    label = m_engine->synthesizedDisplayLabel(last, &err);
     QVERIFY(err == QContactManager::NoError);
     QVERIFY(label == QString("Jones"));
 
@@ -942,13 +966,13 @@
     org.setTitle("Assistant Manager");
     org.setLocation("Nokia Cyber Park");
     orgContact.saveDetail(&org);
-    label = m_engine->synthesizedDisplayLabel(orgContact, err);
+    label = m_engine->synthesizedDisplayLabel(orgContact, &err);
     QVERIFY(err == QContactManager::NoError);
     QVERIFY(label == QString("Nokia"));
 
     QContact jargon;
     jargon.setType("jargon");
-    label = m_engine->synthesizedDisplayLabel(jargon, err);
+    label = m_engine->synthesizedDisplayLabel(jargon, &err);
     QVERIFY(err == QContactManager::InvalidContactTypeError);
     QVERIFY(label.isEmpty());
 
@@ -957,7 +981,7 @@
     QContactName gn;
     gn.setCustomLabel("grouplable");
     group.saveDetail(&gn);
-    label = m_engine->synthesizedDisplayLabel(group, err);
+    label = m_engine->synthesizedDisplayLabel(group, &err);
     QVERIFY(err == QContactManager::NoError);
     QVERIFY(label == QString("grouplable"));
 }
@@ -968,13 +992,140 @@
     QContactManager::Error err;
 
     // Wrong contact type
-    defs = m_engine->detailDefinitions("aerafa", err);
+    defs = m_engine->detailDefinitions("aerafa", &err);
     QVERIFY(err = QContactManager::InvalidContactTypeError);
     QVERIFY(defs.count() == 0);
 
     // Valid defs
-    defs = m_engine->detailDefinitions(QContactType::TypeContact, err);
+    defs = m_engine->detailDefinitions(QContactType::TypeContact, &err);
     QVERIFY(err == QContactManager::NoError);
-    defs = m_engine->detailDefinitions(QContactType::TypeGroup, err);
+    defs = m_engine->detailDefinitions(QContactType::TypeGroup, &err);
     QVERIFY(err == QContactManager::NoError);
 }
+
+void TestSymbianEngine::asyncRequests()
+{
+    //create a contact
+    QContactManager::Error err;
+    QContact dummy;
+    dummy.setType(QContactType::TypeContact);
+    QContactName name;
+    name.setFirstName("dummy");
+    dummy.saveDetail(&name);
+    QVERIFY(m_engine->saveContact(&dummy, &err));
+    QVERIFY(err == QContactManager::NoError);
+    
+    //create a group with members 
+    QContact groupContact;
+    groupContact.setType(QContactType::TypeGroup);
+    m_engine->saveContact(&groupContact, &err);
+    QVERIFY(err == QContactManager::NoError);
+    QContactRelationship relationship;
+    relationship.setRelationshipType(QContactRelationship::HasMember);
+    relationship.setFirst(groupContact.id());
+    relationship.setSecond(dummy.id());
+    bool returnValue(false);
+    returnValue = m_engine->saveRelationship(&relationship, &err);
+    QVERIFY(returnValue == true);
+    QVERIFY(err == QContactManager::NoError);
+    
+    //fetch request
+    QContactFetchRequest fetch;
+    QVERIFY(m_engine->startRequest(&fetch));
+    QTest::qWait(1000); //1sec
+    QVERIFY(fetch.error() == QContactManager::NoError);
+    QVERIFY(fetch.state() == QContactFetchRequest::FinishedState);
+    QVERIFY(fetch.contacts().count() > 0);
+    
+    //fetch ids request
+    QContactLocalIdFetchRequest fetchIds;
+    QVERIFY(m_engine->startRequest(&fetchIds));
+    QTest::qWait(1000); //1sec
+    QVERIFY(fetchIds.error() == QContactManager::NoError);
+    QVERIFY(fetchIds.state() == QContactFetchRequest::FinishedState);
+    QVERIFY(fetchIds.ids().count() > 0);
+    
+    //save request
+    QContactSaveRequest saveReq;
+    QContact c;
+    c.setType(QContactType::TypeContact);
+    QList<QContact> contactList;
+    contactList += c;
+    saveReq.setContacts(contactList);
+    QVERIFY(m_engine->startRequest(&saveReq));
+    QTest::qWait(1000); //1sec
+    QVERIFY(saveReq.error() == QContactManager::NoError);
+    QVERIFY(saveReq.state() == QContactFetchRequest::FinishedState);
+    QVERIFY(saveReq.contacts().count() > 0);
+    
+    //remove request
+    QContactRemoveRequest removeReq;
+    QList<QContactLocalId> idList;
+    idList += saveReq.contacts().at(0).localId();
+    removeReq.setContactIds(idList);
+    QVERIFY(m_engine->startRequest(&removeReq));
+    QTest::qWait(1000); //1sec
+    int err_temp = removeReq.error();
+    QVERIFY(removeReq.error() == QContactManager::NoError);
+    QVERIFY(removeReq.state() == QContactFetchRequest::FinishedState);
+    
+    //detail definition request
+    QContactDetailDefinitionFetchRequest detDefReq;
+    detDefReq.setContactType(QContactType::TypeContact);
+    QStringList defList;
+    defList += QContactName::DefinitionName;
+    detDefReq.setDefinitionNames(defList);
+    QVERIFY(m_engine->startRequest(&detDefReq));
+    QTest::qWait(1000); //1sec
+    QVERIFY(detDefReq.error() == QContactManager::NoError);
+    QVERIFY(detDefReq.state() == QContactFetchRequest::FinishedState);
+    
+    //relationship fetch request
+    QContactRelationshipFetchRequest relFetchReq;
+    relFetchReq.setFirst(groupContact.id());
+    relFetchReq.setSecond(dummy.id());
+    relFetchReq.setRelationshipType(QContactRelationship::HasMember);
+    QVERIFY(m_engine->startRequest(&relFetchReq));
+    QTest::qWait(1000); //1sec
+    QVERIFY(relFetchReq.error() == QContactManager::NoError);
+    QVERIFY(relFetchReq.state() == QContactFetchRequest::FinishedState);
+    QVERIFY(relFetchReq.relationships().count() > 0);
+    
+    //relationship remove request
+    QContactRelationshipRemoveRequest relRemoveReq;
+    QList<QContactRelationship> relList;
+    relList += relationship;
+    relRemoveReq.setRelationships(relList);
+    QVERIFY(m_engine->startRequest(&relRemoveReq));
+    QTest::qWait(1000); //1sec
+    QVERIFY(relRemoveReq.error() == QContactManager::NoError);
+    QVERIFY(relRemoveReq.state() == QContactFetchRequest::FinishedState);
+
+    //relationship save request
+    QContactRelationshipSaveRequest relSaveReq;
+    relSaveReq.setRelationships(relList);
+    QVERIFY(m_engine->startRequest(&relSaveReq));
+    QTest::qWait(1000); //1sec
+    QVERIFY(relSaveReq.error() == QContactManager::NoError);
+    QVERIFY(relSaveReq.state() == QContactFetchRequest::FinishedState);
+    
+    //cancel request
+    QVERIFY(m_engine->startRequest(&relRemoveReq));
+    m_engine->cancelRequest(&relRemoveReq);
+    QTest::qWait(1000); //1sec
+    QVERIFY(relRemoveReq.error() == QContactManager::NoError);
+    QVERIFY(relRemoveReq.state() == QContactFetchRequest::CanceledState);
+    
+    //wait for a request finish
+    QVERIFY(!m_engine->waitForRequestFinished(&relSaveReq, 1000));
+    QVERIFY(m_engine->startRequest(&relRemoveReq));
+    QVERIFY(m_engine->waitForRequestFinished(&relRemoveReq, 1000));
+    QTest::qWait(1000); //1sec
+    QVERIFY(relRemoveReq.error() == QContactManager::NoError);
+    QVERIFY(relRemoveReq.state() == QContactFetchRequest::FinishedState);
+    
+    //destroy request
+    QVERIFY(m_engine->startRequest(&relRemoveReq));
+    m_engine->requestDestroyed(&relRemoveReq);
+    QVERIFY(!m_engine->m_asynchronousOperations.contains(&relRemoveReq));
+}