qtmobility/plugins/contacts/symbian/src/transform/cnttransformcontact.cpp
changeset 14 6fbed849b4f4
parent 11 06b8e2af4411
--- a/qtmobility/plugins/contacts/symbian/src/transform/cnttransformcontact.cpp	Fri Jun 11 14:26:25 2010 +0300
+++ b/qtmobility/plugins/contacts/symbian/src/transform/cnttransformcontact.cpp	Wed Jun 23 19:08:38 2010 +0300
@@ -49,6 +49,7 @@
 #include "cnttransformaddress.h"
 #include "cnttransformbirthday.h"
 #include "cnttransformonlineaccount.h"
+#include "cnttransformonlineaccountsimple.h"
 #include "cnttransformorganisation.h"
 #include "cnttransformavatar.h"
 #include "cnttransformringtone.h"
@@ -83,6 +84,8 @@
     delete m_tzConverter;
     m_tzoneServer.Close();
 
+    m_fieldTypeToTransformContact.clear();
+
     QMap<ContactData, CntTransformContactData*>::iterator itr;
 
     for (itr = m_transformContactData.begin(); itr != m_transformContactData.end(); ++itr)
@@ -132,6 +135,7 @@
 
     // variated transform classes
     m_transformContactData.insert(Anniversary, new CntTransformAnniversarySimple);
+    m_transformContactData.insert(OnlineAccount, new CntTransformOnlineAccount);
 #endif
 }
 
@@ -143,7 +147,7 @@
  * \param contact A reference to a symbian contact item to be converted.
  * \return Qt Contact
  */
-QContact CntTransformContact::transformContactL(CContactItem &contact, const QStringList& definitionRestrictions) const
+QContact CntTransformContact::transformContactL(CContactItem &contact)
 {
     // Create a new QContact
     QContact newQtContact;
@@ -170,11 +174,7 @@
 
         if(detail)
         {
-            // add detail if user requested it.
-            if(definitionRestrictions.isEmpty() || definitionRestrictions.contains(detail->definitionName())) 
-            {
-                newQtContact.saveDetail(detail);
-            }
+            newQtContact.saveDetail(detail);
             delete detail;
             detail = 0;
         }
@@ -288,6 +288,25 @@
     return uids;
 }
 
+QList<TUid> CntTransformContact::itemFieldUidsL(const QString detailDefinitionName) const
+{
+    QList<TUid> fieldUids;
+    QMap<ContactData, CntTransformContactData*>::const_iterator i = m_transformContactData.constBegin();
+
+    while (i != m_transformContactData.constEnd()) {
+        if (i.value()->supportsDetail(detailDefinitionName)) {
+            // The leaf class supports this detail, so check which field type
+            // uids it supports, use empty field name to get all the supported uids
+            fieldUids << i.value()->supportedFields();
+
+            // Assume there are no more leaf classes for this detail
+            break;
+        }
+        i++;
+    }
+    return fieldUids;
+}
+
 TUint32 CntTransformContact::GetIdForDetailL(const QContactDetailFilter& detailFilter, bool& isSubtype) const
     {
     isSubtype = false;
@@ -359,24 +378,34 @@
 	return itemFieldList;
 }
 
-QContactDetail *CntTransformContact::transformItemField(const CContactItemField& field, const QContact &contact) const
+QContactDetail *CntTransformContact::transformItemField(const CContactItemField& field, const QContact &contact)
 {
 	QContactDetail *detail(0);
 
-	if(field.ContentType().FieldTypeCount()) {
-	    TUint32 fieldType(field.ContentType().FieldType(0).iUid);
+    if(field.ContentType().FieldTypeCount()) {
+        TUint32 fieldType(field.ContentType().FieldType(0).iUid);
 
-	    QMap<ContactData, CntTransformContactData*>::const_iterator i = m_transformContactData.constBegin();
-	    while (i != m_transformContactData.constEnd()) {
-	        if (i.value()->supportsField(fieldType)) {
-	            detail = i.value()->transformItemField(field, contact);
-	            break;
-	        }
-	        ++i;
-	     }
-	}
+        // Check if the mapping from field type to transform class pointer is available
+        // (this is faster than iterating through all the transform classes)
+        if (m_fieldTypeToTransformContact.contains(fieldType)) {
+            detail = m_fieldTypeToTransformContact[fieldType]->transformItemField(field, contact);
+        } else {
+            // Mapping from field type to transform class pointer not found,
+            // find the correct transform class by iterating through all the
+            // transform classes
+            QMap<ContactData, CntTransformContactData*>::const_iterator i = m_transformContactData.constBegin();
+            while (i != m_transformContactData.constEnd()) {
+                if (i.value()->supportsField(fieldType)) {
+                    detail = i.value()->transformItemField(field, contact);
+                    m_fieldTypeToTransformContact.insert(fieldType, i.value());
+                    break;
+                }
+                i++;
+            }
+        }
+    }
 
-	return detail;
+    return detail;
 }
 
 QContactDetail* CntTransformContact::transformGuidItemFieldL(const CContactItem &contactItem, const CContactDatabase &contactDatabase) const