phonebookui/phonebookservices/src/cntservicehandler.cpp
changeset 31 2a11b5b00470
parent 27 de1630741fbe
child 46 efe85016a067
--- a/phonebookui/phonebookservices/src/cntservicehandler.cpp	Mon May 03 12:24:20 2010 +0300
+++ b/phonebookui/phonebookservices/src/cntservicehandler.cpp	Fri May 14 15:42:23 2010 +0300
@@ -24,6 +24,7 @@
 
 #include <QPixmap>
 #include <QFile>
+#include <QUrl>
 
 /* NOTE! THIS SERVICE WILL BE RENAMED TO com.nokia.services.phonebook.Services */
 CntServiceHandler::CntServiceHandler(QObject *parent):
@@ -33,23 +34,22 @@
     publishAll();
     
     // Definition names supported in symbian back-end
-    QString def("%1");
-    m_definitionNames << def.arg(QContactName::DefinitionName);
-    m_definitionNames << def.arg(QContactNickname::DefinitionName);
-    m_definitionNames << def.arg(QContactPhoneNumber::DefinitionName);
-    m_definitionNames << def.arg(QContactEmailAddress::DefinitionName);
-    m_definitionNames << def.arg(QContactAddress::DefinitionName);
-    m_definitionNames << def.arg(QContactUrl::DefinitionName);
-    m_definitionNames << def.arg(QContactBirthday::DefinitionName);
-    m_definitionNames << def.arg(QContactOrganization::DefinitionName);
-    m_definitionNames << def.arg(QContactSyncTarget::DefinitionName);
-    m_definitionNames << def.arg(QContactNote::DefinitionName);
-    m_definitionNames << def.arg(QContactFamily::DefinitionName);
-    m_definitionNames << def.arg(QContactAvatar::DefinitionName);
-    m_definitionNames << def.arg(QContactAnniversary::DefinitionName);
-    m_definitionNames << def.arg(QContactGeoLocation::DefinitionName);
-    m_definitionNames << def.arg(QContactGender::DefinitionName);
-    m_definitionNames << def.arg(QContactOnlineAccount::DefinitionName);
+    m_definitionNames << QContactName::DefinitionName;
+    m_definitionNames << QContactNickname::DefinitionName;
+    m_definitionNames << QContactPhoneNumber::DefinitionName;
+    m_definitionNames << QContactEmailAddress::DefinitionName;
+    m_definitionNames << QContactAddress::DefinitionName;
+    m_definitionNames << QContactUrl::DefinitionName;
+    m_definitionNames << QContactBirthday::DefinitionName;
+    m_definitionNames << QContactOrganization::DefinitionName;
+    m_definitionNames << QContactSyncTarget::DefinitionName;
+    m_definitionNames << QContactNote::DefinitionName;
+    m_definitionNames << QContactFamily::DefinitionName;
+    m_definitionNames << QContactAvatar::DefinitionName;
+    m_definitionNames << QContactAnniversary::DefinitionName;
+    m_definitionNames << QContactGeoLocation::DefinitionName;
+    m_definitionNames << QContactGender::DefinitionName;
+    m_definitionNames << QContactOnlineAccount::DefinitionName;
 }
 
 CntServiceHandler::~CntServiceHandler()
@@ -145,39 +145,35 @@
     // Use the resulting document(s)...
     QVersitContactImporter importer;
     QList<QVersitDocument> versitDocuments = reader.results();
-    if(versitDocuments.count() > 0)
-        {
-        contact = importer.importContacts(versitDocuments).first();
-        }
+    if (versitDocuments.count() > 0 
+        && importer.importDocuments(versitDocuments))
+    {
+        QList<QContact> contacts = importer.contacts();
+        if (contacts.count() > 0)
+            contact = contacts.first();
+    }
     file.close();
     
-    // Save photo to image file
-    // image file used in phonebook to generate thumbnail
-    QList<QContactAvatar> details = contact.details<QContactAvatar>();
-    if (details.count() > 0)
+    // Save thumbnail images
+    QList<QContactThumbnail> details = contact.details<QContactThumbnail>();
+    for (int i = 0;i < details.count();i++)
+    {
+        if (!details.at(i).thumbnail().isNull())
         {
-        for (int i = 0;i < details.count();i++)
+            QString imagepath;
+            QPixmap pixmap = QPixmap::fromImage(details.at(i).thumbnail());
+            if (imageUtility.createImage(pixmap,imagepath))
             {
-            if (details.at(i).subType() == QContactAvatar::SubTypeImage)
-                {
-                if(!details.at(i).pixmap().isNull())
-                    {
-                    int err;
-                    QString imagepath;
-                    QPixmap pixmap(details.at(i).pixmap());
-                    if(imageUtility.createImage(pixmap,imagepath,err))
-                        {
-                        // Update contact detail
-                        QContactAvatar detail=details.at(i);
-                        detail.setAvatar(imagepath);
-                        contact.saveDetail(&detail);
-                        }
-                    }
-                }
+                // Update contact detail
+                QContactAvatar detail=details.at(i);
+                detail.setImageUrl(imagepath);
+                contact.saveDetail(&detail);
             }
         }
-    removeDetails(contact);
-    removeFields(contact);
+    }
+    
+    removeNotSupportedDetails(contact);
+    removeNotSupportedFields(contact);
     emit launchEditor(contact);
 
     mCurrentRequestIndex = setCurrentRequestAsync();
@@ -186,245 +182,85 @@
 /*
 * Remove details not supported in symbian back-end.
 */
-void CntServiceHandler::removeDetails(QContact& contact)
+void CntServiceHandler::removeNotSupportedDetails(QContact& contact)
 {
     // Check definition map, remove details not supported
     for (int i=0; i < contact.details().count(); i++)
-        {
+    {
         if (!m_definitionNames.contains(contact.details().at(i).definitionName()))
-            {
+        {
             QContactDetail detail= contact.details().at(i);
             contact.removeDetail(&detail);
-            }
         }
+    }
 }
 /*
 * Remove fields not supported in symbian back-end.
 */
-void CntServiceHandler::removeFields(QContact& contact)
+void CntServiceHandler::removeNotSupportedFields(QContact& contact)
 {
-    // Replace contact
     QContactManager cm("symbian");
+    
+    // Not all fields are supported in symbian back-end
+    // Remove not supported fields
     for (int i=0; i < contact.details().count(); i++)
-        {
+    {
         QContactDetail detail = contact.details().at(i);
-        if(detail.definitionName() == QContactBirthday::DefinitionName)
-            {
-            // Not all fields are supported in symbian back-end, replace
-            QContactBirthday saveBod;
-            QContactBirthday bodDetail = static_cast<QContactBirthday>(detail);
-            
-            if(!bodDetail.date().isNull())
-                saveBod.setDate(bodDetail.date());
-            
-            contact.removeDetail(&bodDetail);
-            contact.saveDetail(&saveBod);
-            }
-        else if(detail.definitionName() == QContactNickname::DefinitionName)
-            {
-            // Not all fields are supported in symbian back-end, replace
-            QContactNickname saveName;
-            QContactNickname nameDetail = static_cast<QContactNickname>(detail);
-            
-            if(!nameDetail.nickname().isEmpty())
-                saveName.setNickname(nameDetail.nickname());
-            
-            contact.removeDetail(&nameDetail);
-            contact.saveDetail(&saveName);
-            }
-        else if(detail.definitionName() == QContactNote::DefinitionName)
-            {
-            // Not all fields are supported in symbian back-end, replace
-            QContactNote saveNote;
-            QContactNote noteDetail = static_cast<QContactNote>(detail);
-            
-            if(!noteDetail.note().isEmpty())
-                saveNote.setNote(noteDetail.note());
-            
-            contact.removeDetail(&noteDetail);
-            contact.saveDetail(&saveNote);
-            }
-        else if(detail.definitionName() == QContactOrganization::DefinitionName)
-            {
-            // Not all fields are supported in symbian back-end, replace
-            QContactOrganization saveOrg;
-            QContactOrganization orgDetail = static_cast<QContactOrganization>(detail);
-            
-            if(!orgDetail.name().isEmpty())
-                saveOrg.setName(orgDetail.name());
-            if(!orgDetail.title().isEmpty())
-                saveOrg.setTitle(orgDetail.title());
-            if(!orgDetail.assistantName().isEmpty())
-                saveOrg.setAssistantName(orgDetail.assistantName());
-            if(!orgDetail.department().isEmpty())
-                saveOrg.setDepartment(orgDetail.department());
-            
-            if(orgDetail.contexts().size() > 0
-               && (orgDetail.contexts().contains(QContactDetail::ContextHome)
-                   || orgDetail.contexts().contains(QContactDetail::ContextWork)))
-	            {
-	            saveOrg.setContexts(orgDetail.contexts());
-	            }
-            
-            contact.removeDetail(&orgDetail);
-            contact.saveDetail(&saveOrg);
-            }
-        else if(detail.definitionName() == QContactAddress::DefinitionName)
-            {
-            // Not all fields are supported in symbian back-end, replace
-            QContactAddress saveAddr;
+        if (detail.definitionName() == QContactAddress::DefinitionName)
+        {
             QContactAddress addrDetail = static_cast<QContactAddress>(detail);
             
-            if(!addrDetail.street().isEmpty())
-               saveAddr.setStreet(addrDetail.street());
-            if(!addrDetail.locality().isEmpty())
-               saveAddr.setLocality(addrDetail.locality());
-            if(!addrDetail.region().isEmpty())
-               saveAddr.setRegion(addrDetail.region());
-            if(!addrDetail.postcode().isEmpty())
-               saveAddr.setPostcode(addrDetail.postcode());
-            if(!addrDetail.country().isEmpty())
-               saveAddr.setCountry(addrDetail.country());
-            if(!addrDetail.postOfficeBox().isEmpty())
-               saveAddr.setPostOfficeBox(addrDetail.postOfficeBox());
-            
-            if(addrDetail.contexts().size() > 0
-               && (addrDetail.contexts().contains(QContactDetail::ContextHome)
-                   || addrDetail.contexts().contains(QContactDetail::ContextWork)))
-	            {
-	            saveAddr.setContexts(addrDetail.contexts());
-	            }
-            
-            contact.removeDetail(&addrDetail);
-            contact.saveDetail(&saveAddr);
-            }
-        else if(detail.definitionName() == QContactAnniversary::DefinitionName)
-            {
-            // Not all fields are supported in symbian back-end, replace
-            QContactAnniversary saveAnniv;
+            // Sub-types not supported
+            if (detail.removeValue(QContactAddress::FieldSubTypes))
+                contact.saveDetail(&detail);
+        }
+        else if (detail.definitionName() == QContactAnniversary::DefinitionName)
+        {
             QContactAnniversary annivDetail = static_cast<QContactAnniversary>(detail);
             
-            if(!annivDetail.originalDate().isNull())
-                saveAnniv.setOriginalDate(annivDetail.originalDate());
-            if(!annivDetail.event().isEmpty())
-                saveAnniv.setEvent(annivDetail.event());
-            
-            contact.removeDetail(&annivDetail);
-            contact.saveDetail(&saveAnniv);
-            }
-        else if(detail.definitionName() == QContactGender::DefinitionName)
-            {
-            // Not all fields are supported in symbian back-end, replace
-            QContactGender saveGender;
-            QContactGender genderDetail = static_cast<QContactGender>(detail);
-            
-            if(!genderDetail.gender().isEmpty())
-                saveGender.setGender(genderDetail.gender());
+            // Sub-types not supported
+            if (detail.removeValue(QContactAnniversary::FieldSubType))
+                contact.saveDetail(&detail);
             
-            contact.removeDetail(&genderDetail);
-            contact.saveDetail(&saveGender);
-            }
-        else if(detail.definitionName() == QContactGeoLocation::DefinitionName)
-            {
-            // Not all fields are supported in symbian back-end, replace
-            QContactGeoLocation saveGeo;
-            QContactGeoLocation geoDetail = static_cast<QContactGeoLocation>(detail);
-
-            QString latitude,longitude;
-            latitude.setNum(geoDetail.latitude());
-            longitude.setNum(geoDetail.longitude());
-            
-            if(!latitude.isEmpty())
-                saveGeo.setLatitude(geoDetail.latitude());
-            if(!longitude.isEmpty())
-                saveGeo.setLongitude(geoDetail.longitude());
-            
-            if(geoDetail.contexts().size() > 0
-               && (geoDetail.contexts().contains(QContactDetail::ContextHome)
-                    || geoDetail.contexts().contains(QContactDetail::ContextWork)))
-	            {
-	            saveGeo.setContexts(geoDetail.contexts());  
-	            }
-            
-            contact.removeDetail(&geoDetail);
-            contact.saveDetail(&saveGeo);
-            }
-        else if(detail.definitionName() == QContactPhoneNumber::DefinitionName)
-            {
-            // Not all fields are supported in symbian back-end, replace
-            QContactPhoneNumber savePhone;
+            // Context not supported
+            if (detail.removeValue(QContactDetail::FieldContext))
+                contact.saveDetail(&detail);
+        }
+        else if (detail.definitionName() == QContactPhoneNumber::DefinitionName)
+        {
             QContactPhoneNumber phoneDetail = static_cast<QContactPhoneNumber>(detail);
             
-            if(!phoneDetail.number().isEmpty())
-                savePhone.setNumber(phoneDetail.number());
-            
-            if(phoneDetail.subTypes().size() > 0)
-                savePhone.setSubTypes(phoneDetail.subTypes());
-            
-            if(phoneDetail.contexts().size() > 0
-               && (phoneDetail.contexts().contains(QContactDetail::ContextHome)
-                   || phoneDetail.contexts().contains(QContactDetail::ContextWork)))
-	            {
-	            savePhone.setContexts(phoneDetail.contexts());
-	            }
-            
-            contact.removeDetail(&phoneDetail);
-            contact.saveDetail(&savePhone);
+            if (phoneDetail.subTypes().size() == 0)
+            {
+                // No Sub-type found, set as SubTypeMobile
+                phoneDetail.setSubTypes(QContactPhoneNumber::SubTypeMobile);
+                contact.saveDetail(&phoneDetail);
             }
-        else if(detail.definitionName() == QContactOnlineAccount::DefinitionName)
+            else if (phoneDetail.subTypes().size() > 0 )
             {
-            // Not all fields are supported in symbian back-end, replace
-            QContactOnlineAccount saveOnlineAcc;
-            QContactOnlineAccount onlineAccDetail = static_cast<QContactOnlineAccount>(detail);
-
-            if(!onlineAccDetail.accountUri().isEmpty())
-                saveOnlineAcc.setAccountUri(onlineAccDetail.accountUri());
-            if(!onlineAccDetail.serviceProvider().isEmpty())
-                saveOnlineAcc.setServiceProvider(onlineAccDetail.serviceProvider());
-            if(!onlineAccDetail.presence().isEmpty())
-                saveOnlineAcc.setPresence(onlineAccDetail.presence());
-            if(!onlineAccDetail.statusMessage().isEmpty())
-                saveOnlineAcc.setStatusMessage(onlineAccDetail.statusMessage());
-            
-            if(onlineAccDetail.subTypes().size() > 0)
-                saveOnlineAcc.setSubTypes(onlineAccDetail.subTypes());
-            
-            if(onlineAccDetail.contexts().size() > 0
-               && (onlineAccDetail.contexts().contains(QContactDetail::ContextHome)
-                   || onlineAccDetail.contexts().contains(QContactDetail::ContextWork)))
+                // Sub-types not supported
+                if (phoneDetail.subTypes().contains(QContactPhoneNumber::SubTypeVoice)
+                    || phoneDetail.subTypes().contains(QContactPhoneNumber::SubTypeMessagingCapable)
+                    || phoneDetail.subTypes().contains(QContactPhoneNumber::SubTypeVideo))
                 {
-                saveOnlineAcc.setContexts(onlineAccDetail.contexts());
+                    // Replace as SubTypeMobile
+                    phoneDetail.setSubTypes(QContactPhoneNumber::SubTypeMobile);
+                    contact.saveDetail(&phoneDetail);
                 }
-            
-            contact.removeDetail(&onlineAccDetail);
-            contact.saveDetail(&saveOnlineAcc);
             }
-        else if(detail.definitionName() == QContactUrl::DefinitionName)
-            {
-            // Not all fields are supported in symbian back-end, replace
-            QContactUrl saveUrl;
+        }
+        else if (detail.definitionName() == QContactUrl::DefinitionName)
+        {
             QContactUrl urlDetail = static_cast<QContactUrl>(detail);
             
-            if(!urlDetail.url().isEmpty())
-                saveUrl.setUrl(urlDetail.url());
-            
             QString stype=QContactUrl::SubTypeHomePage;
-            if(urlDetail.subType().compare(stype) == 0)
-                {
-                saveUrl.setSubType(stype);
-                }
-            
-            if(urlDetail.contexts().size() > 0
-               && (urlDetail.contexts().contains(QContactDetail::ContextHome)
-                   || urlDetail.contexts().contains(QContactDetail::ContextWork)))
-                {
-                saveUrl.setContexts(urlDetail.contexts());
-                }
-            
-            contact.removeDetail(&urlDetail);
-            contact.saveDetail(&saveUrl);
+            if (urlDetail.subType().compare(stype) != 0)
+            {
+                detail.removeValue(QContactUrl::FieldSubType);
+                contact.saveDetail(&detail);
             }
         }
+    }
 }
 /*
 Launch contact selection view with a given detail (selecting detail there opens the editor and adds the new detail)