--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cmmanager/cpdestinationplugin/src/cpdestinationgroup.cpp Tue Aug 31 15:35:44 2010 +0300
@@ -0,0 +1,476 @@
+/*
+* 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:
+* CpDestinationGroup contains all destination UI items as well as
+* items for uncategorized access points and adding new destinations.
+*/
+
+// System includes
+
+#include <QDir>
+#include <QPluginLoader>
+#include <QStringList>
+
+#include <HbDataForm>
+#include <HbDataFormModel>
+#include <HbDataFormViewItem>
+#include <HbParameterLengthLimiter>
+
+#include <cpbasesettingview.h>
+#include <cpitemdatahelper.h>
+#include <cpsettingformentryitemdataimpl.h>
+#include <cpsettingformitemdata.h>
+#include <cmmanager_shim.h>
+#include <cmdestination_shim.h>
+#include <cmconnectionmethod_shim.h>
+#include <cmmanagerdefines_shim.h>
+
+// User includes
+
+#include "cpdestinationgroup.h"
+#include "cpdestinationentryitem.h"
+#include "cpadddestinationentryitemdata.h"
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "cpdestinationgroupTraces.h"
+#endif
+
+/*!
+ \class CpDestinationGroup
+ \brief This class contains all data items representing destinations
+ in commsdat.
+*/
+
+// External function prototypes
+
+// Local constants
+
+// ======== LOCAL FUNCTIONS ========
+
+// ======== MEMBER FUNCTIONS ========
+
+/*!
+
+ Constructor.
+
+ @param[in] itemDataHelper Helper for connecting signals and slots.
+ */
+CpDestinationGroup::CpDestinationGroup(CpItemDataHelper &itemDataHelper) :
+ CpSettingFormItemData(
+ HbDataFormModelItem::GroupItem,
+ hbTrId("txt_occ_subhead_destinations_access_points")),
+ mItemDataHelper(&itemDataHelper),
+ mUncategorisedShown(false),
+ mCmManager(new CmManagerShim()),
+ mBearerPlugins(new QList<CpBearerApPluginInterface *>())
+{
+ OstTraceFunctionEntry0(CPDESTINATIONGROUP_CPDESTINATIONGROUP_ENTRY);
+
+ this->loadBearerPlugins();
+
+ QList<QSharedPointer<CmDestinationShim> > destinationList;
+ fetchDestinations(destinationList);
+
+ // Create Destination list
+ for (int i = 0; i < destinationList.count(); i++) {
+ QString iapCount =
+ getDestinationAdditionalText(destinationList.at(i));
+
+ // Create new destination entry
+ CpDestinationEntryItemData *destDataItem;
+ destDataItem = new CpDestinationEntryItemData(itemDataHelper);
+ destDataItem->setContentWidgetData(QString("text"), destinationList.at(i)->name());
+ destDataItem->setContentWidgetData(QString("additionalText"),iapCount);
+ destDataItem->setDestinationId(destinationList.at(i)->id());
+ destDataItem->setDestinationName(destinationList.at(i)->name());
+ HbIcon destIcon(resolveDestinationIcon(destinationList.at(i)));
+ destDataItem->setEntryItemIcon(destIcon);
+ bool connected = connect(
+ destDataItem,
+ SIGNAL(destChanged()),
+ this,
+ SLOT(updateDestinationInformation()));
+ Q_ASSERT(connected);
+ this->appendChild(destDataItem);
+ }
+
+ // Add "Uncategorised Iaps" button
+ createUncategorisedDestination();
+
+ // "Add Destination" button
+ CpSettingFormEntryItemData *addDest = new CpAddDestinationEntryItemData(
+ itemDataHelper,
+ this);
+ addDest->setContentWidgetData(
+ QString("text"),
+ hbTrId("txt_occ_button_add_destination"));
+ this->appendChild(addDest);
+
+ OstTraceFunctionExit0(CPDESTINATIONGROUP_CPDESTINATIONGROUP_EXIT);
+}
+
+/*!
+ Destructor
+ */
+CpDestinationGroup::~CpDestinationGroup()
+{
+ OstTraceFunctionEntry0(DUP1_CPDESTINATIONGROUP_CPDESTINATIONGROUP_ENTRY);
+
+ delete mBearerPlugins;
+ delete mCmManager;
+
+ OstTraceFunctionExit0(DUP1_CPDESTINATIONGROUP_CPDESTINATIONGROUP_EXIT);
+}
+
+/*!
+ addDestination() creates new destination item to Destinations group item.
+ The new destination is shown in the UI immediately.
+ */
+void CpDestinationGroup::addDestination(
+ const QString &name,
+ QSharedPointer<CmDestinationShim> dest)
+{
+ OstTraceFunctionEntry0(CPDESTINATIONGROUP_ADDDESTINATION_ENTRY);
+
+ // Create UI item for new destination
+ CpDestinationEntryItemData *destDataItem;
+ destDataItem = new CpDestinationEntryItemData(*mItemDataHelper);
+ destDataItem->setContentWidgetData(QString("text"), name);
+ destDataItem->setContentWidgetData(
+ QString("additionalText"),
+ hbTrId("txt_occ_dblist_internet_val_no_access_points"));
+ destDataItem->setDestinationId(dest->id());
+ destDataItem->setDestinationName(name);
+ HbIcon destIcon(resolveDestinationIcon(dest));
+ destDataItem->setEntryItemIcon(destIcon);
+ connect(
+ destDataItem,
+ SIGNAL(destChanged()),
+ this,
+ SLOT(updateDestinationInformation()));
+
+ // Insert Child to correct position
+ QList<QSharedPointer<CmDestinationShim> > destinationList;
+ fetchDestinations(destinationList);
+ insertChild(destinationList.count() - 1, destDataItem);
+
+ OstTraceFunctionExit0(CPDESTINATIONGROUP_ADDDESTINATION_EXIT);
+}
+
+/*!
+ Deletes destination from commsdat and removes it from UI.
+ */
+void CpDestinationGroup::deleteDestination(int destId)
+{
+ OstTraceFunctionEntry0(CPDESTINATIONGROUP_DELETEDESTINATION_ENTRY);
+
+ // "Add Destination" child is removed from count (childCount() -1)
+ for (int i = 0; i < this->childCount() - 1; i++) {
+ CpDestinationEntryItemData *destDataItem =
+ static_cast<CpDestinationEntryItemData*>(this->childAt(i));
+
+ if (destDataItem->destinationId() == destId) {
+ int index = this->indexOf(destDataItem);
+ this->removeChild(index);
+
+ if (!mUncategorisedShown) {
+ // Return "Uncategorised" item to UI if necessary
+ createUncategorisedDestination();
+ }
+ }
+ }
+
+ OstTraceFunctionExit0(CPDESTINATIONGROUP_DELETEDESTINATION_EXIT);
+}
+
+/*!
+ Finds correct access point settings implementation according to
+ access point bearer type.
+
+ \return Returns pointer to CpBearerApPluginInterface which implements
+ access point settins.
+ */
+CpBearerApPluginInterface *CpDestinationGroup::findBearerPlugin(int apId)
+{
+ OstTraceFunctionEntry0(CPDESTINATIONGROUP_FINDBEARERPLUGIN_ENTRY);
+
+ CpBearerApPluginInterface *retVal = NULL;
+ try {
+ CmConnectionMethodShim *cm = mCmManager->connectionMethod(apId);
+ int apBearerType = cm->getIntAttribute(CMManagerShim::CmBearerType);
+
+ for (int i = 0; i < mBearerPlugins->count(); i++) {
+ if (mBearerPlugins->at(i)->bearerType() == apBearerType) {
+ retVal = mBearerPlugins->at(i);
+ break;
+ }
+ }
+ delete cm;
+ }
+ catch (const std::exception&) {
+ OstTrace0(
+ TRACE_NORMAL,
+ CPDESTINATIONGROUP_FINDBEARERPLUGIN,
+ "CpDestinationGroup::findBearerPlugin: Exception caught");
+ // Let return value be NULL.
+ }
+
+ OstTraceFunctionExit0(CPDESTINATIONGROUP_FINDBEARERPLUGIN_EXIT);
+ return retVal;
+}
+
+/*!
+ Updates all destination group items' destinations' information.
+ (Name and access point count)
+ */
+void CpDestinationGroup::updateDestinationInformation()
+{
+ OstTraceFunctionEntry0(CPDESTINATIONGROUP_UPDATEDESTINATIONINFORMATION_ENTRY);
+
+ // "Add Destination" child is removed from count (childCount() -1)
+ for (int i = 0; i < childCount() - 1; i++) {
+ CpDestinationEntryItemData *destDataItem =
+ static_cast<CpDestinationEntryItemData*>(this->childAt(i));
+
+ if (destDataItem->destinationId() == 0) {
+ // Uncategrised Iaps
+ QList<uint> apList;
+ mCmManager->connectionMethod(apList);
+ if (apList.count() == 0) {
+ // delete empty uncategorised IAPs destination
+ int index = this->indexOf(destDataItem);
+ this->removeChild(index);
+ mUncategorisedShown = false;
+ continue;
+ }
+ }
+ QString iapCount = getDestinationAdditionalText(destDataItem->destinationId());
+ destDataItem->setContentWidgetData(QString("additionalText"), iapCount);
+ destDataItem->setContentWidgetData(QString("text"), destDataItem->destinationName());
+ }
+
+ OstTraceFunctionExit0(CPDESTINATIONGROUP_UPDATEDESTINATIONINFORMATION_EXIT);
+}
+
+/*!
+ Creates item for uncategorized access points to destination group item
+ if there is any.
+ */
+void CpDestinationGroup::createUncategorisedDestination()
+{
+ OstTraceFunctionEntry0(CPDESTINATIONGROUP_CREATEUNCATEGORISEDDESTINATION_ENTRY);
+
+ QList<uint> apList;
+ mCmManager->connectionMethod(apList);
+ if (apList.count() > 0) {
+ // Create new destination entry
+ CpDestinationEntryItemData *destDataItem;
+ destDataItem = new CpDestinationEntryItemData(*mItemDataHelper);
+ destDataItem->setContentWidgetData(QString("text"), hbTrId("txt_occ_dblist_uncategorized"));
+ QString iapCount = getDestinationAdditionalText(0);
+ destDataItem->setContentWidgetData(QString("additionalText"),iapCount);
+ destDataItem->setDestinationId(0);
+ destDataItem->setDestinationName(hbTrId("txt_occ_dblist_uncategorized"));
+ HbIcon destIcon(mCmManager->getUncategorizedIcon());
+ destDataItem->setEntryItemIcon(destIcon);
+ bool connected = connect(
+ destDataItem,
+ SIGNAL(destChanged()),
+ this,
+ SLOT(updateDestinationInformation()));
+ Q_ASSERT(connected);
+ QList<QSharedPointer<CmDestinationShim> > destinationList;
+ fetchDestinations(destinationList);
+
+ insertChild(destinationList.count(), destDataItem);
+ mUncategorisedShown = true;
+ }
+
+ OstTraceFunctionExit0(CPDESTINATIONGROUP_CREATEUNCATEGORISEDDESTINATION_EXIT);
+}
+
+/*!
+ Searches all destinations from commsdat. List of representing
+ CmDestinationShim * items returned on completion.
+ */
+void CpDestinationGroup::fetchDestinations(
+ QList<QSharedPointer<CmDestinationShim> > &destinationList)
+{
+ OstTraceFunctionEntry0(CPDESTINATIONGROUP_FETCHDESTINATIONS_ENTRY);
+
+ try {
+ QList<uint> destArray;
+ mCmManager->allDestinations(destArray);
+
+ for (int i = 0; i < destArray.count(); i++) {
+ CmDestinationShim *destination;
+ destination = mCmManager->destination(destArray[i]);
+ if (!destination->isHidden()) {
+ destinationList.append(QSharedPointer<CmDestinationShim>(destination));
+ } else {
+ delete destination;
+ }
+ }
+ } catch (const std::exception&) {
+ OstTrace0(
+ TRACE_NORMAL,
+ CPDESTINATIONGROUP_FETCHDESTINATIONS,
+ "CpDestinationGroup::fetchDestinations: exception caught, Reading destinations");
+ }
+
+ OstTraceFunctionExit0(CPDESTINATIONGROUP_FETCHDESTINATIONS_EXIT);
+}
+
+/*!
+ Searches all bearer plugins from fixed location and loads them.
+
+ \sa findBearerPlugin()
+ */
+void CpDestinationGroup::loadBearerPlugins()
+{
+ OstTraceFunctionEntry0(CPDESTINATIONGROUP_LOADBEARERPLUGINS_ENTRY);
+
+ // Load bearer plugins
+ QDir pluginsDir("\\resource\\qt\\plugins\\controlpanel\\bearerap");
+ foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
+
+ QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));
+ CpBearerApPluginInterface *plugin =
+ qobject_cast<CpBearerApPluginInterface *>(loader.instance());
+ if (plugin) {
+ mBearerPlugins->append(plugin);
+ }
+ }
+
+ OstTraceFunctionExit0(CPDESTINATIONGROUP_LOADBEARERPLUGINS_EXIT);
+}
+
+/*!
+ Helper function to be used in localisation. (Overloaded)
+
+ \return Returns correct localized QString according to access point count.
+ */
+QString CpDestinationGroup::getDestinationAdditionalText(QSharedPointer<CmDestinationShim> destination)
+{
+ OstTraceFunctionEntry0(CPDESTINATIONGROUP_GETDESTINATIONADDITIONALTEXT_ENTRY);
+
+ QString result = "";
+ int iapCount = destination->connectionMethodCount();
+ int counter = 0;
+ for (int i = 0; i < iapCount; i++) {
+ CmConnectionMethodShim *cm = destination->connectionMethod(i);
+ if (cm->getBoolAttribute(CMManagerShim::CmDestination)
+ || cm->getBoolAttribute(CMManagerShim::CmHidden)) {
+ counter++;
+ }
+ delete cm;
+ }
+ iapCount = iapCount - counter;
+ if (iapCount > 0) {
+ result = hbTrId("txt_occ_dblist_internet_val_ln_access_points", iapCount);
+ } else {
+ result = hbTrId("txt_occ_dblist_internet_val_no_access_points");
+ }
+
+ OstTrace0(TRACE_FLOW, CPDESTINATIONGROUP_GETDESTINATIONADDITIONALTEXT_EXIT, "Exit");
+ return result;
+}
+
+/*!
+ Helper function to be used in localisation. (Overloaded)
+
+ \return Returns correct localized QString according to access point count.
+ */
+QString CpDestinationGroup::getDestinationAdditionalText(int destinationId)
+{
+ OstTraceFunctionEntry0(CPDESTINATIONGROUP_GETDESTINATIONADDITIONALTEXT2_ENTRY);
+
+ QString result = "";
+ int iapCount = 0;
+ int counter = 0;
+ if (destinationId == 0) {
+ QList<uint> apList;
+ mCmManager->connectionMethod(apList);
+ iapCount = apList.count();
+ for (int i = 0; i < iapCount; i++) {
+ CmConnectionMethodShim *cm = mCmManager->connectionMethod(apList[i]);
+ if (cm->getBoolAttribute(CMManagerShim::CmDestination)
+ || cm->getBoolAttribute(CMManagerShim::CmHidden)) {
+ counter++;
+ }
+ delete cm;
+ }
+ } else {
+ CmDestinationShim *destination = mCmManager->destination(destinationId);
+ iapCount = destination->connectionMethodCount();
+ for (int i = 0; i < iapCount; i++) {
+ CmConnectionMethodShim *cm = destination->connectionMethod(i);
+ if (cm->getBoolAttribute(CMManagerShim::CmDestination)
+ || cm->getBoolAttribute(CMManagerShim::CmHidden)) {
+ counter++;
+ }
+ delete cm;
+ }
+ delete destination;
+ }
+ iapCount = iapCount - counter;
+ if (iapCount > 0) {
+ result = hbTrId("txt_occ_dblist_internet_val_ln_access_points", iapCount);
+ } else {
+ result = hbTrId("txt_occ_dblist_internet_val_no_access_points");
+ }
+
+ OstTrace0(TRACE_FLOW, CPDESTINATIONGROUP_GETDESTINATIONADDITIONALTEXT2_EXIT, "Exit");
+ return result;
+}
+
+/*!
+ Helper function for showing icons.
+
+ \return Returns string representing given destination's icon
+ */
+QString CpDestinationGroup::resolveDestinationIcon(
+ QSharedPointer<CmDestinationShim> destination) const
+{
+ QString result(destination->getIcon());
+
+ if (result.isEmpty()) {
+ uint metaData = destination->metadata(CMManagerShim::SnapMetadataPurpose);
+ switch (metaData) {
+ case CMManagerShim::SnapPurposeInternet:
+ result = "qtg_small_internet";
+ break;
+
+ case CMManagerShim::SnapPurposeIntranet:
+ result = "qtg_small_intranet";
+ break;
+
+ case CMManagerShim::SnapPurposeMMS:
+ result = "qtg_small_mms";
+ break;
+
+ case CMManagerShim::SnapPurposeOperator:
+ result = "qtg_small_operator";
+ break;
+
+ default:
+ // CMManagerShim::SnapPurposeUnknown
+ result = "qtg_small_favorite";
+ break;
+ }
+ }
+
+ return result;
+}