qtmobility/plugins/contacts/symbian/src/cntsymbianengine.cpp
changeset 14 6fbed849b4f4
parent 11 06b8e2af4411
--- a/qtmobility/plugins/contacts/symbian/src/cntsymbianengine.cpp	Fri Jun 11 14:26:25 2010 +0300
+++ b/qtmobility/plugins/contacts/symbian/src/cntsymbianengine.cpp	Wed Jun 23 19:08:38 2010 +0300
@@ -75,6 +75,15 @@
 #endif
 
 CntSymbianEngine::CntSymbianEngine(const QMap<QString, QString>& parameters, QContactManager::Error* error)
+    : m_dataBase(0),
+      m_managerUri(0),
+      m_transformContact(0),
+      m_contactFilter(0),
+#ifndef SYMBIAN_BACKEND_USE_SQLITE
+      m_contactSorter(0),
+#endif
+      m_relationship(0),
+      m_displayLabel(0)
 {
     *error = QContactManager::NoError;
 
@@ -355,7 +364,7 @@
 /*!
  * Private leaving implementation for contact()
  */
-QContact CntSymbianEngine::fetchContactL(const QContactLocalId &localId, const QStringList& definitionRestrictions) const
+QContact CntSymbianEngine::fetchContactL(const QContactLocalId &localId, const QStringList& detailDefinitionsHint) const
 {
     // A contact with a zero id is not expected to exist.
     // Symbian contact database uses id 0 internally as the id of the
@@ -364,11 +373,28 @@
         User::Leave(KErrNotFound);
 
     // Read the contact from the CContactDatabase
-    CContactItem* contactItem = m_dataBase->contactDatabase()->ReadContactL(localId);
+    CContactItem* contactItem(0);
+    if (!detailDefinitionsHint.isEmpty()) {
+        // Create a view definition with only the fields that map to the fetch hint
+        CContactItemViewDef *viewDef = CContactItemViewDef::NewLC(
+            CContactItemViewDef::EIncludeFields, CContactItemViewDef::EMaskHiddenFields);
+        foreach (QString detailDefinitionHint, detailDefinitionsHint) {
+            QList<TUid> uids = m_transformContact->itemFieldUidsL(detailDefinitionHint);
+            foreach (TUid uid, uids) {
+                viewDef->AddL(uid);
+            }
+        }
+        contactItem = m_dataBase->contactDatabase()->ReadContactL(localId, *viewDef);
+        CleanupStack::PopAndDestroy(viewDef);
+    } else {
+        // The fetch hint does not contain detail definitions hint so get all
+        // the contact item fields that are available
+        contactItem = m_dataBase->contactDatabase()->ReadContactL(localId);
+    }
     CleanupStack::PushL(contactItem);
 
     // Convert to a QContact
-    QContact contact = m_transformContact->transformContactL(*contactItem, definitionRestrictions);
+    QContact contact = m_transformContact->transformContactL(*contactItem);
 
     // Transform details that are not available until the contact has been saved
     m_transformContact->transformPostSaveDetailsL(*contactItem, contact, *m_dataBase->contactDatabase(), m_managerUri);
@@ -392,13 +418,14 @@
     int err(0);
     QContactLocalId id(0);
     TRAP(err, id = addContactL(contact));
+#ifdef SYMBIAN_BACKEND_SIGNAL_EMISSION_TWEAK
     if(err == KErrNone)
     {
         changeSet.insertAddedContact(id);
         m_dataBase->appendContactEmitted(id);
     }
+#endif
     CntSymbianTransformError::transformError(err, qtError);
-
     return (err==KErrNone);
 }
 
@@ -418,12 +445,15 @@
         // Create a new contact card.
         CContactItem* contactItem = CContactCard::NewLC();
         m_transformContact->transformContactL(contact, *contactItem);
+
         // Add to the database
         id = m_dataBase->contactDatabase()->AddNewContactL(*contactItem);
+
         // Reload contact item
         CleanupStack::PopAndDestroy(contactItem);
         contactItem = 0;
         contactItem = m_dataBase->contactDatabase()->ReadContactLC(id);
+
         // Transform details that are not available until the contact has been saved
         m_transformContact->transformPostSaveDetailsL(*contactItem, contact, *m_dataBase->contactDatabase(), m_managerUri);
         CleanupStack::PopAndDestroy(contactItem);
@@ -445,10 +475,10 @@
 
         //update contact, will add the fields to the already saved group
         updateContactL(contact);
+
         // Transform details that are not available until the contact has been saved
         contactItem = m_dataBase->contactDatabase()->ReadContactLC(id);
         m_transformContact->transformPostSaveDetailsL(*contactItem, contact, *m_dataBase->contactDatabase(), m_managerUri);
-
         CleanupStack::PopAndDestroy(contactItem);
     }
     // Leave with an error
@@ -472,12 +502,14 @@
 {
     int err(0);
     TRAP(err, updateContactL(contact));
+#ifdef SYMBIAN_BACKEND_SIGNAL_EMISSION_TWEAK
     if(err == KErrNone)
     {
         //TODO: check what to do with groupsChanged
         changeSet.insertChangedContact(contact.localId());
         m_dataBase->appendContactEmitted(contact.localId());
     }
+#endif
     CntSymbianTransformError::transformError(err, qtError);
     return (err==KErrNone);
 }
@@ -537,12 +569,14 @@
 {
     // removeContactL() can't throw c++ exception
     TRAPD(err, removeContactL(id));
+#ifdef SYMBIAN_BACKEND_SIGNAL_EMISSION_TWEAK
     if(err == KErrNone)
     {
         //TODO: check what to do with groupsChanged?
         changeSet.insertRemovedContact(id);
         m_dataBase->appendContactEmitted(id);
     }
+#endif
     CntSymbianTransformError::transformError(err, qtError);
     return (err==KErrNone);
 }
@@ -550,7 +584,7 @@
 /*!
  * Private leaving implementation for removeContact
  */
-int CntSymbianEngine::removeContactL(QContactLocalId id)
+void CntSymbianEngine::removeContactL(QContactLocalId id)
 {
     // A contact with a zero id is not expected to exist.
     // Symbian contact database uses id 0 internally as the id of the
@@ -575,8 +609,6 @@
     // TODO: A better solution must be found.
     m_dataBase->contactDatabase()->CompactL();
 #endif
-
-    return 0;
 }
 
 bool CntSymbianEngine::removeContact(const QContactLocalId& contactId, QContactManager::Error* error)
@@ -585,11 +617,13 @@
     QContactLocalId selfCntId = selfContactId(&err); // err ignored
     QContactChangeSet changeSet;
     TBool ret = removeContact(contactId, changeSet, error);
+#ifdef SYMBIAN_BACKEND_SIGNAL_EMISSION_TWEAK
     if (ret && contactId == selfCntId ) {
         QOwnCardPair ownCard(selfCntId, QContactLocalId(0));
         changeSet.setOldAndNewSelfContactId(ownCard);
     }
     changeSet.emitSignals(this);
+#endif
     return ret;
 }
 
@@ -628,12 +662,15 @@
             if (errorMap) {
                 errorMap->insert(i, functionError);
             }
-        } else {
+        }
+#ifdef SYMBIAN_BACKEND_SIGNAL_EMISSION_TWEAK
+        else {
             if (current == selfCntId ) {
                 QOwnCardPair ownCard(selfCntId, QContactLocalId(0));
                 changeSet.setOldAndNewSelfContactId(ownCard);
             }
         }
+#endif
     }
     changeSet.emitSignals(this);
     return (*error == QContactManager::NoError);
@@ -654,12 +691,13 @@
 
 bool CntSymbianEngine::saveRelationship(QContactRelationship* relationship, QContactManager::Error* error)
 {
-    //affected contacts
-    QContactChangeSet changeSet;
-
     //save the relationship
     QSet<QContactLocalId> affectedContactIds;
     bool returnValue = m_relationship->saveRelationship(&affectedContactIds, relationship, error);
+
+#ifdef SYMBIAN_BACKEND_SIGNAL_EMISSION_TWEAK
+    //affected contacts
+    QContactChangeSet changeSet;
     changeSet.insertAddedRelationshipsContacts(affectedContactIds.toList());
 
     //add contacts to the list that shouldn't be emitted
@@ -667,18 +705,20 @@
 
     //emit signals
     changeSet.emitSignals(this);
+#endif
 
     return returnValue;
 }
 
 bool CntSymbianEngine::saveRelationships(QList<QContactRelationship>* relationships, QMap<int, QContactManager::Error>* errorMap, QContactManager::Error* error)
 {
-    //affected contacts
-    QContactChangeSet changeSet;
-
     //save the relationships
     QSet<QContactLocalId> affectedContactIds;
     bool returnValue = m_relationship->saveRelationships(&affectedContactIds, relationships, errorMap, error);
+    
+#ifdef SYMBIAN_BACKEND_SIGNAL_EMISSION_TWEAK
+    //affected contacts
+    QContactChangeSet changeSet;
     changeSet.insertAddedRelationshipsContacts(affectedContactIds.toList());
 
     //add contacts to the list that shouldn't be emitted
@@ -686,18 +726,20 @@
 
     //emit signals
     changeSet.emitSignals(this);
+#endif
 
     return returnValue;
 }
 
 bool CntSymbianEngine::removeRelationship(const QContactRelationship& relationship, QContactManager::Error* error)
 {
-    //affected contacts
-    QContactChangeSet changeSet;
-
     //remove the relationship
     QSet<QContactLocalId> affectedContactIds;
     bool returnValue = m_relationship->removeRelationship(&affectedContactIds, relationship, error);
+    
+#ifdef SYMBIAN_BACKEND_SIGNAL_EMISSION_TWEAK
+    //affected contacts
+    QContactChangeSet changeSet;
     changeSet.insertRemovedRelationshipsContacts(affectedContactIds.toList());
 
     //add contacts to the list that shouldn't be emitted
@@ -705,18 +747,20 @@
 
     //emit signals
     changeSet.emitSignals(this);
+#endif
 
     return returnValue;
 }
 
 bool CntSymbianEngine::removeRelationships(const QList<QContactRelationship>& relationships, QMap<int, QContactManager::Error>* errorMap, QContactManager::Error* error)
 {
-    //affected contacts
-    QContactChangeSet changeSet;
-
     //remove the relationships
     QSet<QContactLocalId> affectedContactIds;
     bool returnValue = m_relationship->removeRelationships(&affectedContactIds, relationships, errorMap, error);
+    
+#ifdef SYMBIAN_BACKEND_SIGNAL_EMISSION_TWEAK
+    //affected contacts
+    QContactChangeSet changeSet;
     changeSet.insertRemovedRelationshipsContacts(affectedContactIds.toList());
 
     //add contacts to the list that shouldn't be emitted
@@ -724,13 +768,13 @@
 
     //emit signals
     changeSet.emitSignals(this);
+#endif
 
     return returnValue;
 }
 
 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;
         return QMap<QString, QContactDetailDefinition>();