phonebookui/phonebookservices/src/cntservices.cpp
changeset 53 e6aff7b69165
parent 50 77bc263e1626
child 54 47627ab5d7a4
--- a/phonebookui/phonebookservices/src/cntservices.cpp	Wed Jul 21 11:37:51 2010 +0300
+++ b/phonebookui/phonebookservices/src/cntservices.cpp	Fri Jul 23 12:43:48 2010 +0300
@@ -19,8 +19,10 @@
 #include "cntglobal.h"
 #include "cntdebug.h"
 #include <cntabstractviewmanager.h>
+#include "cntserviceviewmanager.h"
 #include "cntimageutility.h"
 #include "cntserviceviewparams.h"
+#include <cntservicescontact.h>
 
 #include <hbview.h>
 #include <hblistview.h>
@@ -37,7 +39,7 @@
 CntServices::CntServices() :
 mViewManager(NULL),
 mCurrentProvider(NULL),
-mIsQuitable(true)
+mIsQuittable(true)
 {
     CNT_ENTRY
 
@@ -73,6 +75,8 @@
 {
     CNT_LOG
     mViewManager = &aViewManager;
+    CntServiceViewManager* srvMng = static_cast<CntServiceViewManager*>(mViewManager);
+    connect(srvMng, SIGNAL(applicationClosed()), this, SLOT(terminateService()));
 }
 
 
@@ -112,9 +116,16 @@
     CNT_EXIT
 }
 
+void CntServices::editCreateNew(const QString &definitionName, const QString &value,
+    CntAbstractServiceProvider& aServiceProvider, bool defaultForOnlineAccountIsImpp )
+{
+    CNT_ENTRY
+    editCreateNew( definitionName, value, QString(), aServiceProvider, defaultForOnlineAccountIsImpp);
+    CNT_EXIT
+}
 
-void CntServices::editCreateNew(const QString &definitionName, const QString &value,
-    CntAbstractServiceProvider& aServiceProvider)
+void CntServices::editCreateNew(const QString &definitionName, const QString &value, const QString& subType,
+    CntAbstractServiceProvider& aServiceProvider, bool defaultForOnlineAccountIsImpp )
 {
     CNT_ENTRY
     mCurrentProvider = &aServiceProvider;
@@ -122,25 +133,32 @@
     QContact contact;
     
     if (definitionName == QContactPhoneNumber::DefinitionName)
-        {
+    {
         QContactPhoneNumber phoneNumber;
         phoneNumber.setNumber(value);
-        phoneNumber.setSubTypes(QContactPhoneNumber::SubTypeMobile);
-        contact.saveDetail(&phoneNumber);
+        if (!subType.isEmpty())
+        {
+            phoneNumber.setSubTypes(subType);
         }
+        else
+        {
+            phoneNumber.setSubTypes(QContactPhoneNumber::SubTypeMobile); // Mobile is the default if subtype is not given.
+        }
+         contact.saveDetail(&phoneNumber);
+    }
     else if (definitionName == QContactEmailAddress::DefinitionName)
-        {
+    {
         QContactEmailAddress email;
         email.setEmailAddress(value);
+        // Email addresses can't have subtypes.
         contact.saveDetail(&email);
-        }
+    }
     else if (definitionName == QContactOnlineAccount::DefinitionName)
-        {
+    {
         QContactOnlineAccount account;
-        account.setAccountUri(value);
-        account.setSubTypes(QContactOnlineAccount::SubTypeSipVoip);
+        fillOnlineAccount( account, value, subType, defaultForOnlineAccountIsImpp);
         contact.saveDetail(&account);
-        }    
+    }    
 
     // Launch editor now
     CntViewParameters params;
@@ -212,9 +230,16 @@
     CNT_EXIT
 }
 
+void CntServices::editUpdateExisting(const QString &definitionName, const QString &value,
+    CntAbstractServiceProvider& aServiceProvider, bool defaultForOnlineAccountIsImpp )
+{
+    CNT_ENTRY
+    editUpdateExisting( definitionName, value, QString(), aServiceProvider, defaultForOnlineAccountIsImpp );
+    CNT_EXIT
+}
 
-void CntServices::editUpdateExisting(const QString &definitionName, const QString &value,
-    CntAbstractServiceProvider& aServiceProvider )
+void CntServices::editUpdateExisting(const QString &definitionName, const QString &value, const QString& subType,
+    CntAbstractServiceProvider& aServiceProvider, bool defaultForOnlineAccountIsImpp )
 {
     CNT_ENTRY
     mCurrentProvider = &aServiceProvider;
@@ -225,20 +250,27 @@
     {
         QContactPhoneNumber phoneNumber;
         phoneNumber.setNumber(value);
-        phoneNumber.setSubTypes(QContactPhoneNumber::SubTypeMobile);
+        if (!subType.isEmpty())
+        {        
+            phoneNumber.setSubTypes(subType);
+        }
+        else
+        {
+            phoneNumber.setSubTypes(QContactPhoneNumber::SubTypeMobile);    
+        }
         detail = phoneNumber;
     }
     else if (definitionName == QContactEmailAddress::DefinitionName)
     {
         QContactEmailAddress email;
         email.setEmailAddress(value);
+        // Email addresses can't have subtypes.
         detail = email;
     }
     else if (definitionName == QContactOnlineAccount::DefinitionName)
     {
         QContactOnlineAccount account;
-        account.setAccountUri(value);
-        account.setSubTypes(QContactOnlineAccount::SubTypeSipVoip);
+        fillOnlineAccount( account, value, subType, defaultForOnlineAccountIsImpp);
         detail = account;
     }
 
@@ -299,6 +331,10 @@
     QContact contact;
     QContactDetail detail;
     
+    QContactName name;
+    name.setFirstName(hbTrId("txt_phob_list_unknown"));
+    contact.saveDetail(&name);
+    
     if (definitionName == QContactPhoneNumber::DefinitionName)
     {
         QContactPhoneNumber phoneNumber;
@@ -337,6 +373,26 @@
 }
 
 
+void CntServices::setQuittable(bool quittable)
+{
+    mIsQuittable = quittable;
+}
+
+void CntServices::quitApp()
+{
+    CNT_ENTRY
+   
+    // Only embedded applications should be exited once a client
+    // disconnects. At the moments QtHighWay has unresolved issues
+    // when closing non-embedded applications. Error ou1cimx1#472852
+    // has more info
+    if ( mIsQuittable ) 
+    {
+       qApp->quit();
+    }   
+    CNT_EXIT
+}
+
 void CntServices::removeNotSupportedDetails(QContact& contact)
 {
     CNT_ENTRY
@@ -352,8 +408,6 @@
     CNT_EXIT
 }
 
-
-
 void CntServices::removeNotSupportedFields(QContact& contact)
 {
     CNT_ENTRY
@@ -415,6 +469,41 @@
     CNT_EXIT
 }
 
+void CntServices::fillOnlineAccount( QContactOnlineAccount& account, const QString& value,
+    const QString& subType, bool defaultForOnlineAccountIsImpp )
+    {
+        // The value should normally consist of two parts:
+        //    <service provider>:<user ID>
+        // for eg. "serviceprovider:jack@serviceprovider.com"
+        QStringList accountDetails = value.split(":");
+        if (accountDetails.count() == 1)
+        {
+            // For some reason it only had one part, so we're assuming it's the user ID.
+            account.setAccountUri(accountDetails.at(0));
+        }
+        else if (accountDetails.count() >= 2)
+        {
+            account.setServiceProvider(accountDetails.at(0));        
+            account.setAccountUri(accountDetails.at(1)); // the user ID
+        }
+
+        if (!subType.isEmpty())
+        {        
+            account.setSubTypes(subType);
+        }
+        else
+        {
+            if (defaultForOnlineAccountIsImpp)
+            {
+                account.setSubTypes( QContactOnlineAccount::SubTypeImpp );
+            }
+            else
+            {
+                account.setSubTypes( QContactOnlineAccount::SubTypeSipVoip );
+            }
+        }
+    }
+
 // This method is inherited from CntAbstractServiceProvider
 void CntServices::CompleteServiceAndCloseApp(const QVariant& retValue)
 {
@@ -426,26 +515,18 @@
     CNT_EXIT
 }
 
-void CntServices::setQuitable(bool quitable)
-{
-    mIsQuitable = quitable;
-}
-
-void CntServices::quitApp()
+void CntServices::terminateService()
 {
     CNT_ENTRY
-   
-    // Only embedded applications should be exited once a client
-    // disconnects. At the moments QtHighWay has unresolved issues
-    // when closing non-embedded applications. Error ou1cimx1#472852
-    // has more info
-    if ( mIsQuitable ) 
-    {
-       qApp->quit();
-    }
-   
+    if (  mCurrentProvider )
+        {
+        // Complete the service with KCntServicesTerminated return value
+        QVariant var(KCntServicesTerminated);
+        mCurrentProvider->CompleteServiceAndCloseApp( var );
+        }
     CNT_EXIT
 }
 
 Q_IMPLEMENT_USER_METATYPE(CntServicesContact)
 Q_IMPLEMENT_USER_METATYPE_NO_OPERATORS(CntServicesContactList)
+