securitysettings/cpeapuiplugins/cpeapsimakaui/src/cpeapsimakaui.cpp
branchRCL_3
changeset 45 bad0cc58d154
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/securitysettings/cpeapuiplugins/cpeapsimakaui/src/cpeapsimakaui.cpp	Tue Aug 31 15:16:37 2010 +0300
@@ -0,0 +1,417 @@
+/*
+ * 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 QT UI for EAP-SIM and EAP-AKA method configuration
+ *
+ */
+
+/*
+ * %version:  18 %
+ */
+
+// System includes
+#include <HbDataForm>
+#include <HbDataFormModel>
+#include <HbDataFormViewItem>
+#include <HbParameterLengthLimiter>
+#include <HbMessageBox> 
+#include <HbAction>
+#include <HbLineEdit>
+#include <cpsettingformitemdata.h>
+#include <cpitemdatahelper.h>
+#include <eapqtvalidator.h>
+#include <eapqtexpandedeaptype.h>
+
+// User includes
+#include "cpeapsimakaui.h"
+
+/*!
+ * \class CpEapSimAkaUi
+ * \brief Implementes EAP-SIM and EAP-AKA method configuration ui. 
+ */
+
+// External function prototypes
+
+// Local constants
+
+// ======== LOCAL FUNCTIONS ========
+
+// ======== MEMBER FUNCTIONS ========
+
+/*!
+ * Constructor.
+ * 
+ * @param bearer        Bearer type of the accessed configuration.
+ * @param iapId         IAP ID of the accessed configuration.
+ * @param plugin        Plugin.
+ * @param outerHandle   Outer handle.
+ */
+CpEapSimAkaUi::CpEapSimAkaUi(
+    const EapQtConfigInterface::EapBearerType bearer,
+    const int iapId,
+    const EapQtPluginInfo &plugin,
+    const EapQtPluginHandle& outerHandle) :
+        mConfigIf(NULL),
+        mPluginInfo(plugin),
+        mOuterHandle(outerHandle),
+        mForm(NULL),
+        mModel(NULL),
+        mItemDataHelper(NULL),
+        mGroupItem(NULL),
+        mUsernameAutomatic(NULL),
+        mUsername(NULL),
+        mRealmAutomatic(NULL),
+        mRealm(NULL),
+        mValidatorRealm(NULL),
+        mValidatorUsername(NULL)
+{
+    qDebug("CpEapSimAkaUi::CpEapSimAkaUi");
+
+    // IAP must be valid in construction (check includes
+    // EapQtConfigInterface::IapIdUndefined)
+    if (iapId < 0) {
+        QT_THROW(std::bad_alloc());
+        // scoped pointer gets deleted automaticaly on exception
+    }
+
+    // Get EAP config interface
+    mConfigIf.reset(new EapQtConfigInterface(bearer, iapId));
+    
+    createUi();
+}
+
+/*!
+ * Destructor.
+ */
+CpEapSimAkaUi::~CpEapSimAkaUi()
+{
+    qDebug("CpEapSimAkaUi::~CpEapSimAkaUi");
+
+    // mValidatorRealm, mValidatorUsername
+    // mConfigIf: scoped pointer deleted automatically
+}
+
+/*!
+ * Creates EAP-SIM/AKA UI and initilizes settings read via
+ * EapQtConfigInterface
+ */
+void CpEapSimAkaUi::createUi()
+{
+    qDebug("CpEapSimAkaUi::createUi");
+
+    // Read EAP Configurations
+    bool configurationRead = mConfigIf->readConfiguration(mOuterHandle, mPluginInfo.pluginHandle(),
+        mEapConfig);
+    if (!configurationRead) {
+        qDebug("CpEapSimAkaUi::initializeSimAkaUi - read configuration failed.");
+    }
+    
+    // Construct EAP-SIM/AKA settings UI 
+    mForm = new HbDataForm();
+    this->setWidget(mForm);
+    mModel = new HbDataFormModel(mForm);
+
+    mGroupItem = new HbDataFormModelItem(HbDataFormModelItem::GroupItem,
+        HbParameterLengthLimiter(
+            hbTrId("txt_occ_subhead_eap_module_settings")).arg(
+                mPluginInfo.localizationId()));
+    mModel->appendDataFormItem(mGroupItem);
+
+    // The parameter given as 0 is a HbDataForm pointer, not parent
+    mItemDataHelper = new CpItemDataHelper(0);
+    mItemDataHelper->setParent(this);
+
+    // Create UI components
+    createUsername();
+    createRealm();
+    
+    mItemDataHelper->bindToForm(mForm);
+    mForm->setModel(mModel);
+    
+    // Connect signal to add validators when items get activated (visualization created).
+    bool connected = connect(mForm, SIGNAL( itemShown(const QModelIndex&) ), this,
+        SLOT( setValidator(const QModelIndex) ));
+    Q_ASSERT(connected);
+
+    // Expand EAP-SIM/AKA settings group
+    mForm->setExpanded(mModel->indexFromItem(mGroupItem), true);
+}
+
+/*!
+ * Creates Username group:
+ * Generate automatically checkBox and username lineEdit
+ */
+void CpEapSimAkaUi::createUsername()
+{
+    qDebug("CpEapSimAkaUi::createUsername()");
+    // UsernameAutomatic
+    mUsernameAutomatic = new CpSettingFormItemData(HbDataFormModelItem::CheckBoxItem, hbTrId(
+        "txt_occ_setlabel_user_name"));
+    mUsernameAutomatic->setContentWidgetData("text", hbTrId(
+        "txt_occ_setlabel_user_name_val_generate_automatica"));
+    // Initialize the value from EapQtConfig
+    // Generate username automatically is selected by default
+    mUsernameAutomatic->setContentWidgetData("checkState", boolToCheckState(mEapConfig.value(
+        EapQtConfig::UsernameAutomatic).toBool()));
+    // Connect signal to disable/enable username when usernameAutomatic changed   
+    mForm->addConnection(mUsernameAutomatic, SIGNAL(stateChanged(int)), this,
+        SLOT(usernameAutomaticChanged(int)));
+    mGroupItem->appendChild(mUsernameAutomatic);
+
+    //Username
+    mUsername = new CpSettingFormItemData(HbDataFormModelItem::TextItem, hbTrId(
+        "txt_occ_setlabel_user_name"));
+    mUsername->setContentWidgetData("text", mEapConfig.value(EapQtConfig::Username));
+    // Dim username if usernameAutomatic selected
+    usernameAutomaticChanged(mUsernameAutomatic->contentWidgetData("checkState") == Qt::Checked);
+    mGroupItem->appendChild(mUsername);
+}
+
+/*!
+ * Creates Realm group:
+ * Generate automatically checkBox and realm lineEdit
+ */
+void CpEapSimAkaUi::createRealm()
+{
+    qDebug("CpEapSimAkaUi::createRealm()");
+    // RealmAutomatic
+    mRealmAutomatic = new CpSettingFormItemData(HbDataFormModelItem::CheckBoxItem, hbTrId(
+        "txt_occ_setlabel_realm"));
+    mRealmAutomatic->setContentWidgetData("text", hbTrId(
+        "txt_occ_setlabel_realm_val_generate_automatically"));
+    // Initialize the value from EapQtConfig
+    // Generate realm automatically is selected by default
+    mRealmAutomatic->setContentWidgetData("checkState", boolToCheckState(mEapConfig.value(
+        EapQtConfig::RealmAutomatic).toBool()));
+    // connect signal to disable/enable realm when realmAutomatic changed 
+    mForm->addConnection(mRealmAutomatic, SIGNAL(stateChanged(int)), this,
+        SLOT(realmAutomaticChanged(int)));
+    mGroupItem->appendChild(mRealmAutomatic);
+
+    //Realm
+    mRealm = new CpSettingFormItemData(HbDataFormModelItem::TextItem, hbTrId(
+        "txt_occ_setlabel_realm"));
+    mRealm->setContentWidgetData("text", mEapConfig.value(EapQtConfig::Realm));
+    // Dim realm if realmAutomatic selected
+    realmAutomaticChanged(mRealmAutomatic->contentWidgetData("checkState") == Qt::Checked);
+    mGroupItem->appendChild(mRealm);
+}
+
+/*!
+ * Adds validators.
+ * 
+ * @param modelIndex Model index
+ */
+void CpEapSimAkaUi::setValidator(const QModelIndex modelIndex)
+{
+    qDebug("CpEapUserPasswordUi::itemActivated");
+
+    HbDataFormViewItem *viewItem = qobject_cast<HbDataFormViewItem *>
+        (mForm->itemByIndex(modelIndex));
+    HbDataFormModelItem *modelItem = mModel->itemFromIndex(modelIndex);
+    
+    if (modelItem == mUsername) {
+        // When username lineEdit is activated (shown) first time, validator is added
+        mValidatorUsername.reset(mConfigIf->validatorEap(mPluginInfo.pluginHandle().type(),
+            EapQtConfig::Username));
+        HbLineEdit *edit = qobject_cast<HbLineEdit *> (viewItem->dataItemContentWidget());
+        mValidatorUsername->updateEditor(edit);
+    }
+    else if (modelItem == mRealm) {
+        // When realm lineEdit is activated (shown) first time, validator is added
+        mValidatorRealm.reset(mConfigIf->validatorEap(mPluginInfo.pluginHandle().type(),
+                EapQtConfig::Realm));
+        HbLineEdit *edit = qobject_cast<HbLineEdit *> (viewItem->dataItemContentWidget());
+        mValidatorRealm->updateEditor(edit);
+    }
+}
+
+/*!
+ * This is called when user is about to exit the view.
+ * Validates configuration and saves settings.
+ * If configuration is not valid prompts question dialog.
+ * If user chooses "OK" leaves without saving.
+ * 
+ */
+void CpEapSimAkaUi::close()
+{
+    qDebug("CpEapSimAkaUi::close");
+
+    // Validate configuration
+    if (validate()) {
+        qDebug("CpEapSimAkaUi::close - Validation OK");
+
+        // Store settings
+        if (storeSettings()){
+            qDebug("CpEapSimAkaUi::close - Settings stored, close view");
+            // Close view
+            CpBaseSettingView::close();   
+        }
+        else {
+            qDebug("CpEapSimAkaUi::close - Store settings failed, prompt warning");
+            // Store failed. Show error note to user
+            QScopedPointer<HbMessageBox> infoBox;
+            infoBox.reset(new HbMessageBox(
+                HbMessageBox::MessageTypeWarning));
+            infoBox->setAttribute(Qt::WA_DeleteOnClose);
+            infoBox->setText(hbTrId("txt_occ_info_unable_to_save_setting"));
+            infoBox->clearActions();
+            // Connect 'OK'-button to CpBaseSettingView 'aboutToClose'-signal
+            HbAction *okAction = new HbAction(hbTrId("txt_common_button_ok"));
+            infoBox->addAction(okAction);
+            bool connected = connect(
+                okAction,
+                SIGNAL(triggered()),
+                this,
+                SIGNAL(aboutToClose()));
+            Q_ASSERT(connected);
+            infoBox->open();
+            infoBox.take();
+        }
+    }
+    else {
+        qDebug("CpEapSimAkaUi::close - validation failed. Prompt question.");
+        QScopedPointer<HbMessageBox> messageBox;
+        messageBox.reset(new HbMessageBox(
+            HbMessageBox::MessageTypeQuestion));
+        messageBox->setAttribute(Qt::WA_DeleteOnClose);
+        messageBox->setText(hbTrId("txt_occ_info_incomplete_details_return_without_sa"));
+        messageBox->clearActions();
+        // Connect 'YES'-button to CpBaseSettingView 'aboutToClose'-signal
+        HbAction *okAction = new HbAction(hbTrId("txt_common_button_yes"));
+        messageBox->addAction(okAction);
+        bool connected = connect(
+            okAction,
+            SIGNAL(triggered()),
+            this,
+            SIGNAL(aboutToClose()));
+        Q_ASSERT(connected);
+        // Clicking 'NO'-button does nothing
+        HbAction *cancelAction = new HbAction(hbTrId("txt_common_button_no"));
+        messageBox->addAction(cancelAction);
+        messageBox->setTimeout(HbPopup::NoTimeout);
+        messageBox->open();
+        messageBox.take();
+    }
+}
+
+/*!
+ * Dims the realm if generate realm automatically has been selected.
+ * 
+ * @param state Tells is generate automatically checked.
+ */
+void CpEapSimAkaUi::realmAutomaticChanged(int state)
+{
+    qDebug("CpEapSimAkaUi::realmAutomaticChanged");
+
+    mRealm->setContentWidgetData("enabled", !checkStateToBool(state));
+}
+
+/*!
+ * Dims the username if generate username automatically has been selected.
+ * 
+ * @param state Tells is generate automatically checked.
+ */
+void CpEapSimAkaUi::usernameAutomaticChanged(int state)
+{
+    qDebug("CpEapSimAkaUi::usernameAutomaticChanged");
+
+    mUsername->setContentWidgetData("enabled", !checkStateToBool(state));
+}
+
+/*!
+ * Converts check box state to boolean.
+ * 
+ * @param state Check box state
+ * 
+ * @return true if Check box is checked, false otherwise.
+ */
+bool CpEapSimAkaUi::checkStateToBool(const int state)
+{
+    return (Qt::Unchecked == state ? false : true);
+}
+
+/*!
+ * Converts boolean to check box state.
+ * 
+ * @param state Tells is check box checked.
+ * 
+ * @return Qt check state
+ */
+int CpEapSimAkaUi::boolToCheckState(const bool state)
+{
+    return (false == state ? Qt::Unchecked : Qt::Checked);
+}
+
+/*!
+ * Validates settings configuration.
+ * 
+ * @return true if configuration OK, false otherwise.
+ */
+bool CpEapSimAkaUi::validate()
+{
+    bool valid = false;
+
+    if (validateGroup(mUsername, mUsernameAutomatic, mValidatorUsername.data()) 
+        && validateGroup(mRealm, mRealmAutomatic, mValidatorRealm.data())) {
+        valid = true;
+    }
+
+    return valid;
+}
+
+/*!
+ * Validates checkBox and lineEdit group.
+ * 
+ * @return true if OK, false otherwise.
+ */
+bool CpEapSimAkaUi::validateGroup(CpSettingFormItemData *edit, CpSettingFormItemData *checkBox,
+    EapQtValidator *validator)
+{
+    bool status = false;
+    // true if generate automatically is checked or given value is valid
+    if (checkBox->contentWidgetData("checkState") == Qt::Checked
+        || EapQtValidator::StatusOk == validator->validate(
+            edit->contentWidgetData("text"))) {
+        status = true;
+    }
+    return status;
+}
+
+/*!
+ * Stores settings given via SIM-AKA configuration UI
+ * 
+ * @return false if saving failed, true otherwise
+ */
+bool CpEapSimAkaUi::storeSettings()
+{
+    qDebug("CpEapSimAkaUi::storeSettings");
+
+    EapQtConfig eapConfig;
+
+    eapConfig.setValue(EapQtConfig::OuterType, qVariantFromValue(mOuterHandle));
+    eapConfig.setValue(EapQtConfig::UsernameAutomatic, checkStateToBool(
+        mUsernameAutomatic->contentWidgetData("checkState").toInt()));
+    eapConfig.setValue(EapQtConfig::Username, mUsername->contentWidgetData("text"));
+    eapConfig.setValue(EapQtConfig::RealmAutomatic, checkStateToBool(
+        mRealmAutomatic->contentWidgetData("checkState").toInt()));
+    eapConfig.setValue(EapQtConfig::Realm, mRealm->contentWidgetData("text"));
+
+    // Save configuration
+    if (!mConfigIf->saveConfiguration(mPluginInfo.pluginHandle(), eapConfig)) {
+        qDebug("CpEapSimAkaUi::storeSettings - configuration saving failed.");
+        return false;
+    }
+    return true;
+}