messagingapp/shareui/src/shareuiprivate.cpp
changeset 23 238255e8b033
child 25 84d9eb65b26f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/messagingapp/shareui/src/shareuiprivate.cpp	Fri Apr 16 14:56:15 2010 +0300
@@ -0,0 +1,346 @@
+/*
+* Copyright (c) 2009 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:  Offers message creation and sending services.
+ *
+*/
+
+
+#include "shareuiprivate.h"
+#include <QVariant>
+#include <QDir>
+#include <HbPushButton>
+#include <HbListWidget>
+#include <HbMainWindow>
+#include <HbNotificationDialog>
+#include <xqserviceglobal.h>
+
+//Localized Constants
+#define LOC_SEND_SELECTED_ITEM hbTrId("txt_messaging_title_send_selected_item")
+#define LOC_BUTTON_CANCEL hbTrId("txt_common_button_cancel")
+
+ShareUiPrivate::ShareUiPrivate()
+    {
+    
+    }
+
+/**
+ * Destructor.
+ */
+ShareUiPrivate::~ShareUiPrivate()
+    {
+    if(mContentItemModel)
+        {
+        delete mContentItemModel;
+        }
+    if(mContentListView)
+        {
+        delete mContentListView;
+        }
+    if(mSharePopup)
+        {
+        delete mSharePopup;
+        }
+    mIndexActionMap.clear();
+    mAiwRequestList.clear();
+    mFileList.clear();
+    }
+
+/**
+ * initialize and start the dialog
+ * 
+ * @param fileList list of tokens that would allow file manipulation
+ * @return bool error false if dialog initialization failed, true otherwise.
+ * 
+ */
+bool ShareUiPrivate::init(QStringList& fileList, bool embedded)
+    {    
+    bool retval = false;
+    mFileList.clear();
+    
+    if(fileList.count())
+        {
+        for(int i = 0; i < fileList.count(); i++)
+            {
+            mFileList.append(QDir::toNativeSeparators(fileList[i]));
+            }
+        
+        mIsEmbedded = embedded;
+    
+        initializeUi();
+    
+        QList<XQAiwInterfaceDescriptor> serviceDescriptorList;
+        mIndexActionMap.clear();
+        mAiwRequestList.clear();
+        if(fetchServiceDescriptors(serviceDescriptorList))
+            {
+            
+            HbAction* action;
+            
+            for(int i = 0; i < serviceDescriptorList.count() ; i++)
+                {
+
+                if((action = fetchServiceAction(serviceDescriptorList[i])) != NULL)
+                    {
+                    updateShareUiDialogList(action);
+                    }
+                }
+            retval = true;
+            }
+        else
+            {
+            updateShareUiDialogList(NULL);
+            }
+    
+        enableUi();
+        }
+    return retval;
+    }
+
+/**
+  * Creates the view for the sendui dialog.
+  *  
+  * @return bool true if initialization was successful, false otherwise.
+  */
+
+void ShareUiPrivate::initializeUi()
+    {
+    mSharePopup = new HbDialog();
+    mSharePopup->setHeadingWidget(new HbLabel(LOC_SEND_SELECTED_ITEM));
+    mSharePopup->setTimeout(HbDialog::NoTimeout);  
+    mContentListView = new HbListView(mSharePopup);
+
+    mContentItemModel = new QStandardItemModel(mSharePopup); 
+    mContentListView->setModel(mContentItemModel);
+    mSharePopup->setContentWidget(mContentListView);
+    mSharePopup->setFrameType(HbDialog::Strong);
+    mSharePopup->setPrimaryAction(new HbAction(LOC_BUTTON_CANCEL));
+    
+    connect(mContentListView, SIGNAL(activated(QModelIndex)),this,SLOT(itemActivated(QModelIndex)));
+    
+    }
+
+/**
+ * fetchServiceDescriptors
+ * 
+ * Fetches the service descriptors using the Application Manager api. 
+ * This function is in progress and will change.
+ * 
+ * @return error boolean true if successfully fetched.
+ */
+
+bool ShareUiPrivate::fetchServiceDescriptors(QList<XQAiwInterfaceDescriptor>& serviceDescriptorList)
+    {
+    bool retval = false;
+    
+    serviceDescriptorList = mAppManager.list(SERVICE_INTERFACE, SHARE_OP);
+    
+    if(serviceDescriptorList.size() > 0)
+        {
+        retval = true;
+        }
+    return retval;
+    }
+
+
+/**
+ * fetchServiceAction fetches the action associated with a specified interface descriptor.
+ * This is used after the fetchServiceDescriptors is called, and 
+ * 
+ * @param serviceDescriptor ServiceDescriptor fetched using fetchServiceDescriptors
+ * @return error boolean true if successfully fetched.
+ */
+
+HbAction* ShareUiPrivate::fetchServiceAction(XQAiwInterfaceDescriptor interfaceDescriptor)
+    {
+    
+    XQAiwRequest* request = mAppManager.create(interfaceDescriptor,SHARE_OP,mIsEmbedded);
+    mAiwRequestList.append(request);
+    HbAction* action = convertAction(request->createAction());
+    if(action)
+        {
+        connect(request, SIGNAL(triggered()), this, SLOT(onTriggered()));
+        connect(request, SIGNAL(requestOk(const QVariant&)), this, SLOT(handleOk(const QVariant&)));
+        connect(request, SIGNAL(requestError(int,const QString&)), this, SLOT(handleError(int,const QString&)));
+        }
+    return action;
+    }
+
+
+/**
+ * Update the SendUi Dialog (and associated list items) once the required
+ * information has been fetched.
+ * 
+ * @params action HbAction* The action that must be associated with the entry at that point in the list.
+ */
+
+
+bool ShareUiPrivate::updateShareUiDialogList(HbAction* action)
+    {
+    
+    bool retval = false;
+    QStandardItem* item = NULL;
+    if(action != NULL)
+        {
+        item = new QStandardItem(action->icon().qicon(),action->text());
+        mContentItemModel->appendRow(item);
+        QModelIndex index = item->index();
+        mIndexActionMap[index] = action;
+        retval = true;
+        }
+    else
+        {
+        item = new QStandardItem(QString("No Services Found"));
+        mContentItemModel->appendRow(item);
+        }
+    return retval;
+    
+    }
+
+
+/**
+ * 
+ * Enable the UI and show it on the screen.
+ * 
+ * 
+ */
+
+void ShareUiPrivate::enableUi()
+    {
+    mSharePopup->exec();
+    }
+
+/**
+ * Slot for handling send service selection on the UI
+ * 
+ */
+
+
+void ShareUiPrivate::onTriggered(void)
+    {
+    
+    XQAiwRequest* request = 0;
+    request = qobject_cast<XQAiwRequest*>(sender());
+    if(request)
+        {
+        request->setArguments(mFileList);
+        }
+    }
+
+/**
+ * Slot for handling valid returns from the framework.
+ * 
+ * @param result const QVariant&
+ */
+
+void ShareUiPrivate::handleOk(const QVariant& result)
+    {
+    Q_UNUSED(result)
+    }
+
+/**
+ * Slot for handling errors. Error ids are provided as 
+ * 32-bit integers. These are 
+ * 
+ * @param errorCode qint32
+ * 
+ * 
+ */
+void ShareUiPrivate::handleError(int errorCode, const QString& errorMessage)
+    {
+    Q_UNUSED(errorMessage)
+    QString errText("IPC Error: ");
+    HbNotificationDialog* dlg = new HbNotificationDialog();
+    dlg->setFocusPolicy(Qt::NoFocus);
+    dlg->setAttribute(Qt::WA_DeleteOnClose, true);
+
+    
+    switch(errorCode)
+        {
+        case XQService::EConnectionError:
+            errText.append(QString("EConnectionError: "));
+            break;
+        case XQService::EConnectionClosed:
+            errText.append(QString("EConnectionClosed: "));
+            break;
+        case XQService::EServerNotFound:
+            errText.append(QString("EServerNotFound: "));
+            break;
+        case XQService::EIPCError:
+            errText.append(QString("EIPCError: "));
+            break;
+        case XQService::EUnknownError:
+            errText.append(QString("EUnknownError: "));
+            break;
+        case XQService::ERequestPending:
+            errText.append(QString("ERequestPending: "));
+            break;
+        }
+    errText.append(errorMessage);
+    dlg->setText(errText);
+    dlg->show();
+    }
+
+
+
+/** 
+ * When a list box item is pressed, this slot should be invoked. The action
+ * corresponding to the clicked list item should be invoked with the stored lis
+ * of files.
+ * 
+ * @param index QModelIndex
+ * 
+ */
+
+void ShareUiPrivate::itemActivated(QModelIndex index)
+    {
+
+    HbAction* action = mIndexActionMap[index];
+    
+    if(action)
+        {
+        action->setEnabled(true);
+        action->activate(HbAction::Trigger);
+        }    
+    mSharePopup->close();
+
+    }
+
+
+/**
+ * Convert a qaction to hbaction.
+ * 
+ * @param action QAction*
+ * @return HbAction* 
+ */
+
+HbAction* ShareUiPrivate::convertAction(QAction *action)
+    {
+    HbAction *actionHb = 0;
+    if (action) 
+        {
+        actionHb = new HbAction(HbIcon(action->icon()), action->text());
+        actionHb->setVisible(action->isVisible());
+        actionHb->setCheckable(action->isCheckable());
+        actionHb->setEnabled(action->isEnabled());
+
+        connect(actionHb, SIGNAL(triggered()), action, SIGNAL(triggered()));
+        connect(actionHb, SIGNAL(changed()), action, SIGNAL(changed()));
+        connect(actionHb, SIGNAL(hovered()), action, SIGNAL(hovered()));
+        connect(actionHb, SIGNAL(toggled(bool)), action, SIGNAL(toggled(bool)));
+        
+        action->setParent(actionHb); 
+        }
+    
+    return actionHb;
+    }