cmmanager/cpwlanapplugin/src/cpwlanapview.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 27 May 2010 13:17:01 +0300
changeset 27 489cf6208544
parent 23 7ec726f93df1
child 44 a0c4ceac30d0
permissions -rw-r--r--
Revision: 201019 Kit: 2010121

/*
* 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:  
* Control Panel WLAN AP settings view implementation.
*
*/

// System includes
#include <QString>
#include <QVariant>
#include <QDir>
#include <QPluginLoader>
#include <HbMainWindow>
#include <HbMenu>
#include <HbDataForm>
#include <HbDataFormModel>
#include <HbDataFormViewItem>
#include <HbLineEdit>
#include <HbEditorInterface>
#include <HbUrlFilter>
#include <HbPopup>
#include <HbMessageBox>
#include <HbAction>
#include <HbStringUtil>
#include <wlanmgmtcommon.h>
#include <cpitemdatahelper.h>
#include <cpsettingformitemdata.h>
#include <cppluginutility.h>
#include <cmconnectionmethod_shim.h>
#include <cpwlansecurityplugininterface.h>

// User includes
#include "cpwlanapplugin.h"
#include "cpwlanapview.h"
#include "cpwlanapadvancedview.h"
#include "OstTraceDefinitions.h"
#ifdef OST_TRACE_COMPILER_IN_USE
#include "cpwlanapviewTraces.h"
#endif

/*!
    \class CpWlanApView
    \brief This class implements the WLAN AP Control Panel settings view.
*/

// External function prototypes

// Local constants

static const QString wlanSecurityPluginsDir =
    "\\resource\\qt\\plugins\\controlpanel\\wlansecurity";

// ======== LOCAL FUNCTIONS ========

// ======== MEMBER FUNCTIONS ========

/*!
    Constructor.
*/
CpWlanApView::CpWlanApView(
    CmConnectionMethodShim *cmConnectionMethod,
    QGraphicsItem *parent) :
        CpBaseSettingView(0, parent),
        mForm(0),
        mModel(0),
        mItemDataHelper(0),
        mApSettingsGroupItem(0),
        mConnectionNameItem(0),
        mWlanNetworkNameItem(0),
        mNetworkStatusItem(0),
        mNetworkModeItem(0),
        mAdHocChannelItem(0),
        mSecurityModeItem(0),
        mHomepageItem(0),
        mSecuritySettingsGroupItem(0),
        mAdvancedSettingsAction(0),
        mCmConnectionMethod(cmConnectionMethod),
        mMessageBox(0)
{
    OstTraceFunctionEntry0(CPWLANAPVIEW_CPWLANAPVIEW_ENTRY);
    
    // Add "Advanced settings" menu item
    HbMenu *menu = this->menu();
    mAdvancedSettingsAction = menu->addAction(
        hbTrId("txt_occ_opt_advanced_settings"));
    bool status = connect(
        menu,
        SIGNAL(triggered(HbAction*)),
        this,
        SLOT(menuActionTriggered(HbAction*)));
    Q_ASSERT(status);

    // Construct WLAN AP settings UI
    mForm = new HbDataForm();
    this->setWidget(mForm);
    CpPluginUtility::addCpItemPrototype(mForm);
    mModel = new HbDataFormModel(mForm);
    
    // The parameter given as 0 is a HbDataForm pointer, not parent
    mItemDataHelper = new CpItemDataHelper(0);
    mItemDataHelper->setParent(this);

    // Add access point settings group
    createAccessPointSettingsGroup();
        
    mItemDataHelper->bindToForm(mForm);
    mForm->setModel(mModel);

    status = connect(
        mForm,
        SIGNAL(itemShown(const QModelIndex)),
        this,
        SLOT(setEditorPreferences(const QModelIndex)));
    Q_ASSERT(status);

    // Expand access point settings group
    mForm->setExpanded(mModel->indexFromItem(mApSettingsGroupItem), TRUE);
        
    // Add security settings group if necessary
    updateSecurityGroup(
        mSecurityModeItem->contentWidgetData("currentIndex").toInt());
    
    OstTraceFunctionExit0(CPWLANAPVIEW_CPWLANAPVIEW_EXIT);
}

/*!
    Destructor.
*/
CpWlanApView::~CpWlanApView()
{
    OstTraceFunctionEntry0(DUP1_CPWLANAPVIEW_CPWLANAPVIEW_ENTRY);
    
    OstTraceFunctionExit0(DUP1_CPWLANAPVIEW_CPWLANAPVIEW_EXIT);
}

/*!
    Creates the WLAN "Access point settings" group.
*/
void CpWlanApView::createAccessPointSettingsGroup()
{
    OstTraceFunctionEntry0(CPWLANAPVIEW_CREATEACCESSPOINTSETTINGSGROUP_ENTRY);
    
    // Access point settings group
    mApSettingsGroupItem = new HbDataFormModelItem(
        HbDataFormModelItem::GroupItem, 
        hbTrId("txt_occ_subhead_access_point_settings"));
    mModel->appendDataFormItem(mApSettingsGroupItem);
    
    // Connection name
    mConnectionNameItem = new CpSettingFormItemData(
        HbDataFormModelItem::TextItem,
        hbTrId("txt_occ_setlabel_connection_name"));
    // Connect signal and add item to group
    mForm->addConnection(
        mConnectionNameItem,
        SIGNAL(editingFinished()),
        this,
        SLOT(connectionNameChanged()));
    mApSettingsGroupItem->appendChild(mConnectionNameItem);
    
    // WLAN network name
    mWlanNetworkNameItem = new CpSettingFormItemData(
        HbDataFormModelItem::TextItem,
        hbTrId("txt_occ_setlabel_wlan_network_name"));
    // Connect signal and add item to group
    mForm->addConnection(
        mWlanNetworkNameItem,
        SIGNAL(editingFinished()),
        this,
        SLOT(wlanNetworkNameChanged()));
    mApSettingsGroupItem->appendChild(mWlanNetworkNameItem);
    
    // Network status
    mNetworkStatusItem = new CpSettingFormItemData(
        HbDataFormModelItem::ComboBoxItem,
        hbTrId("txt_occ_setlabel_network_status"));
    // Add items to combobox
    QStringList networkStatusItems;
    networkStatusItems
        << hbTrId("txt_occ_setlabel_network_status_val_public")
        << hbTrId("txt_occ_setlabel_network_status_val_hidden");
    mNetworkStatusItem->setContentWidgetData("items", networkStatusItems);
    // Construct map to link item indexes to setting values
    mNetworkStatusMap.insert(0, false); // public
    mNetworkStatusMap.insert(1, true); // hidden
    // Connect signal and add item to group
    mForm->addConnection(
        mNetworkStatusItem,
        SIGNAL(currentIndexChanged(int)),
        this,
        SLOT(networkStatusChanged(int)));
    mApSettingsGroupItem->appendChild(mNetworkStatusItem);
    
    // Network mode
    mNetworkModeItem = new CpSettingFormItemData(
        HbDataFormModelItem::ComboBoxItem,
        hbTrId("txt_occ_setlabel_wlan_network_mode"));
    // Add items to combobox
    QStringList networkModeItems;
    networkModeItems
        << hbTrId("txt_occ_setlabel_wlan_network_mode_val_infrastruct")
        << hbTrId("txt_occ_setlabel_wlan_network_mode_val_adhoc");
    mNetworkModeItem->setContentWidgetData("items", networkModeItems);
    // Construct map to link item indexes to setting values
    mNetworkModeMap.insert(0, CMManagerShim::Infra); // infrastructure
    mNetworkModeMap.insert(1, CMManagerShim::Adhoc); // adhoc
    // Connect signal and add item to group
    mForm->addConnection(
        mNetworkModeItem,
        SIGNAL(currentIndexChanged(int)),
        this,
        SLOT(networkModeChanged(int)));
    mApSettingsGroupItem->appendChild(mNetworkModeItem);
    
    // Ad-hoc channel
    // Added dynamically according to set network mode
    
    // Security mode
    mSecurityModeItem = new CpSettingFormItemData(
        HbDataFormModelItem::ComboBoxItem,
        hbTrId("txt_occ_setlabel_wlan_security_mode"));
    // Security modes added dynamically according to set network mode

    // Connect signal and add item to group
    mForm->addConnection(
        mSecurityModeItem,
        SIGNAL(currentIndexChanged(int)),
        this,
        SLOT(securityModeChanged(int)));
    mApSettingsGroupItem->appendChild(mSecurityModeItem);
    
    // Homepage
    mHomepageItem = new CpSettingFormItemData(
        HbDataFormModelItem::TextItem,
        hbTrId("txt_occ_setlabel_homepage"));
    // Connect signal and add item to group
    mForm->addConnection(
        mHomepageItem,
        SIGNAL(editingFinished()),
        this,
        SLOT(homepageChanged()));
    mApSettingsGroupItem->appendChild(mHomepageItem);
    
    // Read settings from CommsDat and update widgets
    updateAccessPointSettingsGroup();
    
    OstTraceFunctionExit0(CPWLANAPVIEW_CREATEACCESSPOINTSETTINGSGROUP_EXIT);
}

/*!
    Reads attribute values and updates "Access point settings" group settings.
*/
void CpWlanApView::updateAccessPointSettingsGroup()
{
    OstTraceFunctionEntry0(CPWLANAPVIEW_UPDATEACCESSPOINTSETTINGSGROUP_ENTRY);
    
    // Get attributes from CommsDat and set values to UI widgets
    
    // Connection name
    QString connectionName = mCmConnectionMethod->getStringAttribute(
        CMManagerShim::CmName);
    mConnectionNameItem->setContentWidgetData("text", connectionName);
    
    // WLAN network name
    QString networkName = mCmConnectionMethod->getStringAttribute(
        CMManagerShim::WlanSSID);
    mWlanNetworkNameItem->setContentWidgetData("text", networkName);
    
    // Network status
    bool scanSsid = mCmConnectionMethod->getBoolAttribute(
        CMManagerShim::WlanScanSSID);
    mNetworkStatusItem->setContentWidgetData(
        "currentIndex",
        mNetworkStatusMap.key(scanSsid));
    
    // Network mode
    CMManagerShim::WlanConnMode networkMode =
		static_cast<CMManagerShim::WlanConnMode>
      	(mCmConnectionMethod->getIntAttribute(
            CMManagerShim::WlanConnectionMode));
    mNetworkModeItem->setContentWidgetData(
        "currentIndex",
        mNetworkModeMap.key(networkMode));
    
    // Ad-hoc channel
    updateAdHocChannelItem(networkMode);
    
    // Security mode
    updateSecurityModeItem(networkMode);
    
    // Homepage
    QString homepage = mCmConnectionMethod->getStringAttribute(
        CMManagerShim::CmStartPage);
    mHomepageItem->setContentWidgetData("text", homepage);
    
    OstTraceFunctionExit0(CPWLANAPVIEW_UPDATEACCESSPOINTSETTINGSGROUP_EXIT);
}

/*!
    Loads all WLAN security plugins.
*/
void CpWlanApView::loadSecurityPlugins(
    CMManagerShim::WlanConnMode networkMode)
{
    OstTraceFunctionEntry0(CPWLANAPVIEW_LOADSECURITYPLUGINS_ENTRY);
    
    // Load security plugins
    QList<CpWlanSecurityPluginInterface *> plugins;
    QDir pluginsDir(wlanSecurityPluginsDir);
    foreach (QString fileName, pluginsDir.entryList(QDir::Files)) {
        QPluginLoader loader(pluginsDir.absoluteFilePath(fileName));
        CpWlanSecurityPluginInterface *plugin = 
            qobject_cast<CpWlanSecurityPluginInterface *>(loader.instance());
        if (plugin) {
            // Sort items based on the orderNumber()
            QList<CpWlanSecurityPluginInterface *>::iterator i;
            for (i = plugins.begin(); i != plugins.end(); ++i) {
                if ((*i)->orderNumber() > plugin->orderNumber()) {
                    plugins.insert(i, plugin);
                    plugin = NULL;
                    break;
                }
            }
            if (plugin) {
                plugins.append(plugin);
            }
        }
    }
    
    // Add security plugins to map. If network mode is ad-hoc, only WEP
    // is allowed.
    int i;
    i = mSecurityModeMap.size();
    foreach (CpWlanSecurityPluginInterface *plugin, plugins) {
        if (networkMode != CMManagerShim::Adhoc
            || plugin->securityMode() == CMManagerShim::WlanSecModeWep) {
            mSecurityModeMap.insert(i, plugin);
            i++;
        }
    }
    
    OstTraceFunctionExit0(CPWLANAPVIEW_LOADSECURITYPLUGINS_EXIT);
}

/*!
    Updates the "Security settings" group.
*/
void CpWlanApView::updateSecurityGroup(int index)
{
    OstTraceFunctionEntry0(CPWLANAPVIEW_UPDATESECURITYGROUP_ENTRY);
    
    // Remove old security settings group
    if (mSecuritySettingsGroupItem) {
        mModel->removeItem(mSecuritySettingsGroupItem);
        mSecuritySettingsGroupItem = NULL;
    }

    // Add new security settings group
    if (index > 0) {
        // Get correct security plugin
        CpWlanSecurityPluginInterface *plugin = mSecurityModeMap.value(index);
        if (plugin) {
            // Ask plugin to create the security group
            plugin->setReference(
                mCmConnectionMethod,
                mCmConnectionMethod->getIntAttribute(CMManagerShim::CmId));
            mSecuritySettingsGroupItem = plugin->uiInstance(*mItemDataHelper);
            if (mSecuritySettingsGroupItem) {
                // And add it to dataform
                mModel->appendDataFormItem(mSecuritySettingsGroupItem);
            }
        }
    }
    
    OstTraceFunctionExit0(CPWLANAPVIEW_UPDATESECURITYGROUP_EXIT);
}

/*!
    Shows message box with "OK" button using given text.
*/
void CpWlanApView::showMessageBox(
    HbMessageBox::MessageBoxType type,
    const QString &text)
{
    OstTraceFunctionEntry0(CPWLANAPVIEW_SHOWMESSAGEBOX_ENTRY);
    
    // Create a message box
    mMessageBox = QSharedPointer<HbMessageBox>(new HbMessageBox(type));
    mMessageBox->setText(text);
    mMessageBox->setModal(true);
    mMessageBox->setTimeout(HbPopup::NoTimeout);
    mMessageBox->open();
    
    OstTraceFunctionExit0(CPWLANAPVIEW_SHOWMESSAGEBOX_EXIT);
}

/*!
    Tries to update connection method changes to CommsDat.
    Returns "true" if success, "false" if some error happened. 
*/
bool CpWlanApView::tryUpdate()
{
    OstTraceFunctionEntry0(CPWLANAPVIEW_TRYUPDATE_ENTRY);
    
    // Try update
    try {
        mCmConnectionMethod->update();
    }
    catch (const std::exception&) {
        // Handle error
        handleUpdateError();
        
        OstTraceFunctionExit0(CPWLANAPVIEW_TRYUPDATE_EXIT);
        return false;
    }

    OstTraceFunctionExit0(DUP1_CPWLANAPVIEW_TRYUPDATE_EXIT);
    return true;
}

/*!
    Handles failed CommsDat update.
 */
void CpWlanApView::handleUpdateError()
{
    OstTraceFunctionEntry0(CPWLANAPVIEW_HANDLEUPDATEERROR_ENTRY);
    
    // Show error note to user
    showMessageBox(
        HbMessageBox::MessageTypeWarning,
        hbTrId("txt_occ_info_unable_to_save_setting"));
    // Reload settings from CommsDat and update UI
    try {
        mCmConnectionMethod->refresh();
    }
    catch (const std::exception&) {
        // Ignore error from refresh. Most likely this will not happen, but
        // if it does, there isn't very much we can do.
        OstTrace0(
            TRACE_ERROR,
            CPWLANAPPLUGIN_HANDLEUPDATEERROR,
            "Refresh failed");
    };
    updateAccessPointSettingsGroup();
    
    OstTraceFunctionExit0(CPWLANAPVIEW_HANDLEUPDATEERROR_EXIT);
}

/*!
    Updates Ad-hoc channel item. Setting item is shown if network mode is
    ad-hoc, otherwise it is not shown.
 */
void CpWlanApView::updateAdHocChannelItem(
    CMManagerShim::WlanConnMode networkMode)
{
    if (networkMode == CMManagerShim::Infra) {
        // Infrastructure
        if (mAdHocChannelItem) {
            mApSettingsGroupItem->removeChild(
                mApSettingsGroupItem->indexOf(mAdHocChannelItem));
            mAdHocChannelItem = NULL;
        }
    } else {
        // Ad-hoc
        if (!mAdHocChannelItem) {
            // Ad-hoc channel item not shown, add it
            mAdHocChannelItem = new CpSettingFormItemData(
                HbDataFormModelItem::ComboBoxItem,
                hbTrId("txt_occ_setlabel_adhoc_channel"));
            // Add items to combobox
            QStringList adHocChannelItems;
            adHocChannelItems
                << hbTrId("txt_occ_setlabel_adhoc_channel_val_automatic");
            for (int i = WlanAdHocChannelMinValue;
                i <= WlanAdHocChannelMaxValue;
                i++) {
                QString channel;
                channel.setNum(i);
                adHocChannelItems << HbStringUtil::convertDigits(channel);
            }
            mAdHocChannelItem->setContentWidgetData(
                "items",
                adHocChannelItems);
            // Connect signal and add item to group
            mForm->addConnection(
                mAdHocChannelItem,
                SIGNAL(currentIndexChanged(int)),
                this,
                SLOT(adHocChannelChanged(int)));
            // Add item after the network mode item
            mApSettingsGroupItem->insertChild(
                mApSettingsGroupItem->indexOf(mNetworkModeItem) + 1,
                mAdHocChannelItem);
        }
        // Update ad-hoc item
        int adHocChannelId = mCmConnectionMethod->getIntAttribute(
            CMManagerShim::WlanChannelID);
        mAdHocChannelItem->setContentWidgetData(
            "currentIndex",
            adHocChannelId);
    }
}

/*!
    Updates security mode item.
 */
void CpWlanApView::updateSecurityModeItem(
    CMManagerShim::WlanConnMode networkMode)
{
    // Load WLAN security plugins and construct map
    mSecurityModeMap.clear();
    mSecurityModeMap.insert(0, NULL); // open mode
    loadSecurityPlugins(networkMode);
    
    // Add items to combobox
    QStringList securityModeItems;
    foreach (CpWlanSecurityPluginInterface *plugin, mSecurityModeMap) {
        if (plugin) {
            // Add security mode from plugin
            securityModeItems
                << hbTrId(plugin->securityModeTextId().toLatin1());
        } else {
            // Add open mode
            securityModeItems
                << hbTrId("txt_occ_setlabel_wlan_security_mode_val_open");
        }
    }
    // Remove connection before setting new content, because combobox
    // will emit currentIndexChanged signal and we don't want that.
    mForm->removeConnection(
        mSecurityModeItem,
        SIGNAL(currentIndexChanged(int)),
        this,
        SLOT(securityModeChanged(int)));
    mSecurityModeItem->setContentWidgetData("items", securityModeItems);
    mForm->addConnection(
        mSecurityModeItem,
        SIGNAL(currentIndexChanged(int)),
        this,
        SLOT(securityModeChanged(int)));
    
    uint securityMode = mCmConnectionMethod->getIntAttribute(
        CMManagerShim::WlanSecurityMode);
    // Iterate through the map to find correct security plugin and set
    // mode index
    int securityModeIndex = 0;
    QMapIterator<int, CpWlanSecurityPluginInterface *> i(mSecurityModeMap);
    while (i.hasNext()) {
        i.next();
        if (i.value()
            && i.value()->securityMode() == securityMode) {
            securityModeIndex = i.key();
        }
    }
    mSecurityModeItem->setContentWidgetData("currentIndex",
        securityModeIndex);
    
    if (securityMode != CMManagerShim::WlanSecModeOpen
        && securityModeIndex == 0) {
        // Security plugin implementing the selected security mode not found,
        // set security mode to open also in CommsDat  
        mCmConnectionMethod->setIntAttribute(
            CMManagerShim::WlanSecurityMode,
            CMManagerShim::WlanSecModeOpen);
        // Try update
        try {
            mCmConnectionMethod->update();
        }
        catch (const std::exception&) {
            // Error in update, but can't show error notes at this point
        }
    }
}

/*!
    Stores connection name.
*/
void CpWlanApView::connectionNameChanged()
{
    OstTraceFunctionEntry0(CPWLANAPVIEW_CONNECTIONNAMECHANGED_ENTRY);
    
    QString connectionName =
        mConnectionNameItem->contentWidgetData("text").toString();
    if (!connectionName.isEmpty()) {
        // Update to CommsDat
        mCmConnectionMethod->setStringAttribute(
            CMManagerShim::CmName,
            connectionName);
        if (tryUpdate()) {
            // Update successful
            // Read name because in case the name already exists it will
            // be made unique by CMManager
            connectionName = mCmConnectionMethod->getStringAttribute(
                CMManagerShim::CmName);
            mConnectionNameItem->setContentWidgetData("text", connectionName);
        }
    } else {
        // Inform user of invalid name
        showMessageBox(
            HbMessageBox::MessageTypeInformation,
            hbTrId("txt_occ_info_invalid_name"));

        // Empty name not allowed, revert back to old value
        connectionName = mCmConnectionMethod->getStringAttribute(
            CMManagerShim::CmName);
        mConnectionNameItem->setContentWidgetData("text", connectionName);
    }
    
    OstTraceFunctionExit0(CPWLANAPVIEW_CONNECTIONNAMECHANGED_EXIT);
}

/*!
    Stores WLAN network name.
*/
void CpWlanApView::wlanNetworkNameChanged()
{
    OstTraceFunctionEntry0(CPWLANAPVIEW_WLANNETWORKNAMECHANGED_ENTRY);
    
    // Update to CommsDat
    QString wlanNetworkName =
        mWlanNetworkNameItem->contentWidgetData("text").toString();
    if (!wlanNetworkName.isEmpty()) {
        mCmConnectionMethod->setStringAttribute(
            CMManagerShim::WlanSSID,
            wlanNetworkName);
        (void)tryUpdate();
    } else {
        // Inform user of invalid name
        showMessageBox(
            HbMessageBox::MessageTypeInformation,
            hbTrId("txt_occ_info_invalid_name"));

        // Empty name not allowed, revert back to old value
        wlanNetworkName = mCmConnectionMethod->getStringAttribute(
            CMManagerShim::WlanSSID);
        mWlanNetworkNameItem->setContentWidgetData("text", wlanNetworkName);
    }
    
    OstTraceFunctionExit0(CPWLANAPVIEW_WLANNETWORKNAMECHANGED_EXIT);
}

/*!
    Stores WLAN network status.
*/
void CpWlanApView::networkStatusChanged(int index)
{
    OstTraceFunctionEntry0(CPWLANAPVIEW_NETWORKSTATUSCHANGED_ENTRY);
    
    // Update to CommsDat
    mCmConnectionMethod->setBoolAttribute(
        CMManagerShim::WlanScanSSID,
        mNetworkStatusMap.value(index));
    (void)tryUpdate();
    
    OstTraceFunctionExit0(CPWLANAPVIEW_NETWORKSTATUSCHANGED_EXIT);
}

/*!
    Stores WLAN network mode.
*/
void CpWlanApView::networkModeChanged(int index)
{
    OstTraceFunctionEntry0(CPWLANAPVIEW_NETWORKMODECHANGED_ENTRY);
    
    // Update to CommsDat
    mCmConnectionMethod->setIntAttribute(
        CMManagerShim::WlanConnectionMode,
        mNetworkModeMap.value(index));
    if (tryUpdate()) {
        // If mode is ad-hoc, ad-hoc channel item must be shown
        CMManagerShim::WlanConnMode networkMode =
            static_cast<CMManagerShim::WlanConnMode>
                (mNetworkModeMap.value(index));
        updateAdHocChannelItem(networkMode);
		// Also security mode list may need updating
        updateSecurityModeItem(networkMode);
    }
    
    OstTraceFunctionExit0(CPWLANAPVIEW_NETWORKMODECHANGED_EXIT);
}

/*!
    Stores ad-hoc channel ID.
*/
void CpWlanApView::adHocChannelChanged(int index)
{
    OstTraceFunctionEntry0(CPWLANAPVIEW_ADHOCCHANNELCHANGED_ENTRY);
    
    // Update to CommsDat
    mCmConnectionMethod->setIntAttribute(
        CMManagerShim::WlanChannelID,
        index);
    (void)tryUpdate();
    
    OstTraceFunctionExit0(CPWLANAPVIEW_ADHOCCHANNELCHANGED_EXIT);
}

/*!
    Stores WLAN security mode.
*/
void CpWlanApView::securityModeChanged(int index)
{
    OstTraceFunctionEntry0(CPWLANAPVIEW_SECURITYMODECHANGED_ENTRY);
    
    // Get security plugin
    CpWlanSecurityPluginInterface *plugin = mSecurityModeMap.value(index);
    // Update to CommsDat
    if (plugin) {
        mCmConnectionMethod->setIntAttribute(
            CMManagerShim::WlanSecurityMode,
            plugin->securityMode());
    } else {
        mCmConnectionMethod->setIntAttribute(
            CMManagerShim::WlanSecurityMode,
            CMManagerShim::WlanSecModeOpen);
    }
    (void)tryUpdate();
    
    // Update UI
    updateSecurityGroup(
        mSecurityModeItem->contentWidgetData("currentIndex").toInt());
    
    OstTraceFunctionExit0(CPWLANAPVIEW_SECURITYMODECHANGED_EXIT);
}

/*!
    Stores homepage.
*/
void CpWlanApView::homepageChanged()
{
    OstTraceFunctionEntry0(CPWLANAPVIEW_HOMEPAGECHANGED_ENTRY);
    
    // Update to CommsDat
    QString homepage = mHomepageItem->contentWidgetData("text").toString();
    mCmConnectionMethod->setStringAttribute(
        CMManagerShim::CmStartPage,
        homepage);
    (void)tryUpdate();
    
    OstTraceFunctionExit0(CPWLANAPVIEW_HOMEPAGECHANGED_EXIT);
}

/*!
    Handles view menu actions.
*/
void CpWlanApView::menuActionTriggered(HbAction *action)
{
    OstTraceFunctionEntry0(CPWLANAPVIEW_MENUACTIONTRIGGERED_ENTRY);
    
    if (action == mAdvancedSettingsAction) {
        HbMainWindow *mainWindow = this->mainWindow();

        // Create the advanced settings view
        HbView *newView = new CpWlanApAdvancedView(mCmConnectionMethod);
        // Connect signal to return back to the previous view
        bool status = QObject::connect(
            newView,
            SIGNAL(aboutToClose()),
            this,
            SLOT(restoreCurrentView()));
        Q_ASSERT(status);
        
        mainWindow->addView(newView);
        mainWindow->setCurrentView(newView);
    }
    
    OstTraceFunctionExit0(CPWLANAPVIEW_MENUACTIONTRIGGERED_EXIT);
}

/*!
    Removes current view from main window and sets this view as the
    current view. Used when "back" button is pressed in "Advanced settings"
    view.
*/
void CpWlanApView::restoreCurrentView()
{
    OstTraceFunctionEntry0(CPWLANAPVIEW_RESTORECURRENTVIEW_ENTRY);
    
    HbMainWindow *mainWindow = this->mainWindow();
    
    // Remove the previous view and delete it
    HbView *prevView = mainWindow->currentView();
    mainWindow->removeView(prevView);
    prevView->deleteLater();
    
    // Set this view on top
    mainWindow->setCurrentView(this);
    
    OstTraceFunctionExit0(CPWLANAPVIEW_RESTORECURRENTVIEW_EXIT);
}

/*!
    Sets editor preferences for all HbLineEdit items.
*/
void CpWlanApView::setEditorPreferences(const QModelIndex modelIndex)
{
    OstTraceFunctionEntry0(CPWLANAPVIEW_SETEDITORPREFERENCES_ENTRY);
    
    HbDataFormViewItem *viewItem = qobject_cast<HbDataFormViewItem *>
        (mForm->itemByIndex(modelIndex));
    HbDataFormModelItem *modelItem = mModel->itemFromIndex(modelIndex);
    
    if (modelItem == mConnectionNameItem
        || modelItem == mWlanNetworkNameItem
        || modelItem == mHomepageItem ) {
        // HbLineEdit items, get editor and editor interface
        HbLineEdit *edit = qobject_cast<HbLineEdit *>
            (viewItem->dataItemContentWidget());
        HbEditorInterface editInterface(edit);
        
        if (modelItem == mConnectionNameItem) {
            // Setup editor for connection name
            editInterface.setInputConstraints(HbEditorConstraintLatinAlphabetOnly);
            edit->setInputMethodHints(Qt::ImhNoPredictiveText); 
            edit->setMaxLength(CMManagerShim::CmNameLength);
        } else if (modelItem == mWlanNetworkNameItem) {
            // Setup editor for WLAN SSID
            editInterface.setMode(HbInputModeNone);
            editInterface.setInputConstraints(HbEditorConstraintLatinAlphabetOnly);
            editInterface.setEditorClass(HbInputEditorClassNetworkName); 
            editInterface.setDigitType(HbDigitTypeNone);
            edit->setInputMethodHints(
                Qt::ImhNoPredictiveText | Qt::ImhPreferLowercase);
            edit->setMaxLength(CMManagerShim::WlanSSIDLength);
        } else { /* mHomepageItem */
            // Setup editor for URL
            editInterface.setMode(HbInputModeNone);
            editInterface.setInputConstraints(HbEditorConstraintLatinAlphabetOnly);
            editInterface.setFilter(HbUrlFilter::instance());
            editInterface.setEditorClass(HbInputEditorClassUrl);
            editInterface.setDigitType(HbDigitTypeNone);
            edit->setInputMethodHints(
                Qt::ImhNoPredictiveText | Qt::ImhPreferLowercase);
            edit->setMaxLength(CMManagerShim::CmStartPageLength);
        }
    }
    
    OstTraceFunctionExit0(CPWLANAPVIEW_SETEDITORPREFERENCES_EXIT);
}