emailservices/nmregister/src/nmmailboxregisterinterface.cpp
branchRCL_3
changeset 63 d189ee25cf9d
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/emailservices/nmregister/src/nmmailboxregisterinterface.cpp	Tue Aug 31 15:04:17 2010 +0300
@@ -0,0 +1,348 @@
+/*
+ * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved.
+ * This component and the accompanying materials are made available
+ * under the terms of "Eclipse Public License v1.0"
+ * which accompanies this distribution, and is available
+ * at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ *
+ * Initial Contributors:
+ * Nokia Corporation - initial contribution.
+ *
+ * Contributors:
+ *
+ * Description:
+ *
+ */
+
+#include "emailtrace.h"
+
+#include <qservicemanager.h>
+#include <qserviceinterfacedescriptor.h>
+#include <hbicon.h>
+#include <HbApplication>
+#include <QTranslator>
+#include "nmicons.h"
+#include "nmmailboxregisterinterface.h" 
+#include "nmmailboxregisterinterface_p.h" 
+
+//mandatory keys 
+const QString hsItemName("item:name");
+const QString hsItemLocName("item:locname");
+const QString hsitemLaunchUri("item:launchuri");
+const QString hsitemPublisherId("item:publisherId");
+//not mandatory 
+const QString hsItemWidgetUri("widget:uri");
+const QString hsItemDescription("item:description");
+const QString hsItemLocDescription("item:locdescription");
+//for icon - not mandatory 
+const QString hsIconFileName("icon:filename");//to display specific icon from file 
+const QString hsIconName("icon:name");// HbIcon 
+const QString hsIconApplicationId("icon:applicationid"); // icon from associated application 
+
+//Custom for nmHsWidgets
+//NmHsWidgetParamAccountId is used to identify what email account will be monitored by 
+//the registered hs widget
+const QString NmHsWidgetParamAccountId("widgetparam:accountId");
+//same as above but for pushing the widget to homescreen
+const QString NmHsAccountId("accountId");
+//NmHsWidgetParamAccountIconName is used to identify mailbox icon in application library
+const QString NmHsWidgetParamAccountIconName("widgetparam:accountIconName");
+//same as above but for pushing the widget to homescreen
+const QString NmHsAccountIconName("accountIconName");
+//This is used to identify nmhswidget in homescreen
+const QString NmHsWidget("nmhswidget");
+
+//parameter values
+const QString NmPublisherName("NmMailboxRegisterInterface");
+const QString NmLaunchUri("appto://0x200255BA?activityname=EmailInboxView");
+//URI for the defined service
+const QLatin1String interfaceUri("com.nokia.symbian.IEmailRegisterAccount");
+
+/** Localization file name*/
+const QString KNmRegisterLocFileName = "nmregister_";
+/** Localization file location*/
+const QString KNmRegisterLocLocation = "/translations/";
+
+/*!
+ Constructor
+ */
+NmMailboxRegisterInterface::NmMailboxRegisterInterface(QObject *parent) :
+    QObject(parent), m_d(new NmMailboxRegisterInterfacePrivate(this))
+{
+    NM_FUNCTION;
+}
+
+/*!
+ Destructor
+ */
+NmMailboxRegisterInterface::~NmMailboxRegisterInterface()
+{
+    NM_FUNCTION;
+    
+    delete m_d;
+}
+
+/*!
+ registerNewMailbox
+ */
+bool NmMailboxRegisterInterface::registerNewMailbox(
+    quint64 accountId,
+    QString accountName,
+    QString accountIconName)
+{
+    NM_FUNCTION;
+    
+    return m_d->registerNewMailbox(accountId, accountName, accountIconName);
+}
+
+/*!
+ updateMailboxName
+ */
+bool NmMailboxRegisterInterface::updateMailboxName(quint64 accountId, QString newName)
+{
+    NM_FUNCTION;
+    
+    return m_d->updateMailboxName(accountId, newName);
+}
+
+/*!
+ unregisterMailbox
+ */
+bool NmMailboxRegisterInterface::unregisterMailbox(quint64 accountId)
+{
+    NM_FUNCTION;
+    
+    return m_d->unregisterMailbox(accountId);
+}
+
+/*!
+ Constructor
+ */
+NmMailboxRegisterInterfacePrivate::NmMailboxRegisterInterfacePrivate(QObject *parent) :
+    XQServiceProvider(interfaceUri, parent), 
+    mManager(new QServiceManager()), 
+    mService(0),
+    mTranslator(new QTranslator())
+{
+    NM_FUNCTION;
+}
+
+/*!
+ loadMenuClientService()
+ Loads the Menu client service to mService. 
+ \return true if mService exists or is succesfully loaded, otherwise false.
+ */
+bool NmMailboxRegisterInterfacePrivate::loadMenuClientService()
+{
+    if (mService){ 
+        return true; //service is already loaded
+    }
+    
+    QServiceFilter filter("com.nokia.symbian.IMenuClient");
+    QList<QServiceInterfaceDescriptor> interfaces = mManager->findInterfaces(filter);
+    if(interfaces.isEmpty()){
+        return false; //no maching interfaces available
+    }
+    
+    mService = mManager->loadInterface(interfaces.first());
+    if(!mService){
+        return false; //loading interface failed
+    }
+    
+    return true; //succesfully loaded the service
+}
+
+/*!
+ Destructor
+ */
+NmMailboxRegisterInterfacePrivate::~NmMailboxRegisterInterfacePrivate()
+{
+    NM_FUNCTION;
+
+    delete mTranslator;
+    mTranslator = NULL;
+
+    delete mService;
+    mService = NULL;
+
+    delete mManager;
+    mManager = NULL;
+}
+
+bool NmMailboxRegisterInterfacePrivate::registerNewMailbox(
+    quint64 accountId,
+    QString accountName,
+    QString accountIconName)
+{
+    NM_FUNCTION;
+	
+    if(!loadMenuClientService()){
+        NM_ERROR(1,"loadService() failed!");
+        return false; 
+    }
+    
+    //localization
+    QString lang = QLocale::system().name();
+    bool loadSucceed = mTranslator->load(KNmRegisterLocFileName + lang, KNmRegisterLocLocation);
+    QCoreApplication::installTranslator(mTranslator);
+    
+    //check that accountIconName is valid otherwise pass default mailbox icon
+    HbIcon mailBoxIcon(accountIconName);
+    if (mailBoxIcon.pixmap().height() == 0) {
+        mailBoxIcon = NmIcons::getIcon(NmIcons::NmIconDefaultMailbox);
+        accountIconName = mailBoxIcon.iconName();
+    }
+
+    QMap<QString, QVariant> map;
+    //------------------------------
+    map[hsItemLocName] = "loc://" + KNmRegisterLocFileName + "/txt_mailwdgt_dblist_mail";
+    map[hsitemLaunchUri] = formLaunchUri(accountId);
+    map[hsitemPublisherId] = NmPublisherName;
+    map[hsItemWidgetUri] = NmHsWidget;
+    map[hsItemDescription] = accountName;
+    map[hsIconFileName] = accountIconName;
+    // to add widget params that are mapped to widgets properties
+    map[NmHsWidgetParamAccountId] = QString::number(accountId);
+    map[NmHsWidgetParamAccountIconName] = accountIconName;
+    //------------------------------
+
+    bool retVal(false);
+    bool ret(false);
+    ret = QMetaObject::invokeMethod( mService,"add",
+        Qt::DirectConnection,
+        Q_RETURN_ARG(bool, retVal),
+        Q_ARG(QVariantMap, map));
+
+    //Push the registered widget also to homescreen right away
+    bool pushRetVal = pushWidgetToHomescreen(accountId, accountIconName);
+
+    return (retVal && ret && pushRetVal);
+}
+
+bool NmMailboxRegisterInterfacePrivate::updateMailboxName(quint64 accountId, QString newName)
+{
+    NM_FUNCTION;
+
+    if(!loadMenuClientService()){
+    	NM_ERROR(1,"loadService() failed!");
+        return false; 
+    }
+    
+    QMap<QString, QVariant> map;
+    //------------------------------
+    map[hsitemLaunchUri] = formLaunchUri(accountId);
+    map[hsitemPublisherId] = NmPublisherName;
+    map[hsItemWidgetUri] = NmHsWidget;
+    map[NmHsWidgetParamAccountId] = QString::number(accountId);
+    //------------------------------
+
+    QList<QVariantMap> list; //list of items that mach the query
+    bool retVal(false);
+    bool ret(false);
+    ret = QMetaObject::invokeMethod(mService, "getList", 
+        Qt::DirectConnection, 
+        Q_RETURN_ARG(QList<QVariantMap> , list),
+        Q_ARG(QVariantMap, map));
+
+    //Normally there should be only one instance, but just in case
+    while (!list.isEmpty()) {
+        //update the account name
+        list.first()[hsItemDescription] = newName;
+        //commit changes
+        ret = QMetaObject::invokeMethod( mService,"add",
+            Qt::DirectConnection,
+            Q_RETURN_ARG(bool, retVal),
+            Q_ARG(QVariantMap, list.first()));
+        list.removeFirst();
+    }
+    //if either invoke or "getList" or "add" return failure
+    return (retVal && ret);
+}
+
+bool NmMailboxRegisterInterfacePrivate::unregisterMailbox(quint64 accountId)
+{
+    NM_FUNCTION;
+
+    if(!loadMenuClientService()){
+    	NM_ERROR(1,"loadService() failed!");
+        return false; 
+    }
+    
+    QMap<QString, QVariant> map;
+    //------------------------------
+    map[hsitemLaunchUri] = formLaunchUri(accountId);
+    map[hsitemPublisherId] = NmPublisherName;
+    map[hsItemWidgetUri] = NmHsWidget;
+    map[NmHsWidgetParamAccountId] = QString::number(accountId);
+    //------------------------------
+
+    QList<QVariantMap> list; //list of items that mach the query
+    bool retVal(false);
+    bool ret(false);
+    ret = QMetaObject::invokeMethod(mService, "getList", 
+        Qt::DirectConnection, 
+        Q_RETURN_ARG(QList<QVariantMap> , list), 
+        Q_ARG(QVariantMap, map));
+
+    //Normally there should be only one instance, but just in case
+    //Otherwise there will be ghost instances in the application list
+    while (!list.isEmpty()) {
+
+        //commit changes
+        ret = QMetaObject::invokeMethod( mService,"remove",
+            Qt::DirectConnection,
+            Q_RETURN_ARG(bool, retVal),
+            Q_ARG(QVariantMap, list.first()));
+        list.removeFirst();
+    }
+
+    return (retVal && ret);
+}
+
+bool NmMailboxRegisterInterfacePrivate::pushWidgetToHomescreen(
+    quint64 accountId,
+    QString accountIconName)
+{
+    NM_FUNCTION;
+    
+    // load plugin
+    QServiceManager manager;
+    QServiceFilter filter("com.nokia.symbian.IHomeScreenClient");
+    filter.setServiceName("hshomescreenclientplugin");
+    QList<QServiceInterfaceDescriptor> interfaces = manager.findInterfaces(filter);
+
+    if (interfaces.isEmpty()) {
+        return false;
+    }
+    QObject* service = manager.loadInterface(interfaces.first());
+    if (!service) {
+        NM_ERROR(1,"service is null ");
+        return false;
+    }
+
+    //--------------------------------
+    QVariantHash map;
+    map[NmHsAccountId] = QString::number(accountId);
+    map[NmHsAccountIconName] = accountIconName;
+    //--------------------------------
+
+    // invoke function synchronously
+    bool retVal(false);
+    bool ret(false);
+    ret = QMetaObject::invokeMethod( service, "addWidget",
+        Qt::DirectConnection,
+        Q_RETURN_ARG(bool, retVal),
+        Q_ARG(QString, NmHsWidget),
+        Q_ARG(QVariantHash, map));
+
+    delete service;
+    service = NULL;
+
+    return (retVal && ret);
+}
+
+QString NmMailboxRegisterInterfacePrivate::formLaunchUri(quint64 accountId) const
+{
+    return NmLaunchUri + QString::number(accountId);
+}