diff -r 4697dfb2d7ad -r 238255e8b033 messagingapp/shareui/src/shareuiprivate.cpp --- /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 +#include +#include +#include +#include +#include +#include + +//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 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& 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(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; + }