cmmanager/cpdestinationplugin/src/cpdestinationgroup.cpp
branchRCL_3
changeset 57 05bc53fe583b
--- /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;
+}