securitysettings/cpeapuiplugins/cpeapuserpasswordui/src/cpeapuserpasswordui.cpp
changeset 26 9abfd4f00d37
child 27 9660a5eb236f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/securitysettings/cpeapuiplugins/cpeapuserpasswordui/src/cpeapuserpasswordui.cpp	Mon May 24 20:32:47 2010 +0300
@@ -0,0 +1,401 @@
+/*
+ * 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 the License "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 username-password based EAP method configuration
+ *
+ */
+
+/*
+ * %version: 23 %
+ */
+
+// System includes
+#include <HbDataForm>
+#include <HbDataFormModel>
+#include <HbDataFormViewItem>
+#include <HbMessageBox> 
+#include <HbAction>
+#include <HbLineEdit>
+#include <cpsettingformitemdata.h>
+#include <cpitemdatahelper.h>
+#include <eapqtvalidator.h>
+#include <eapqtexpandedeaptype.h>
+
+// User includes
+#include "cpeapuserpasswordui.h"
+
+/*!
+ * \class CpEapUserPasswordUi
+ * \brief Implementes username-password based EAP method configuration ui. 
+ */
+
+// External function prototypes
+
+// Local constants
+
+/*! 
+ * If password has already been stored into the database
+ * user is shown dummy password (fixed number of asterisks)
+ */
+static const QVariant passwordExistString = "xxxx";
+
+// ======== 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.
+ */
+CpEapUserPasswordUi::CpEapUserPasswordUi(
+    const EapQtConfigInterface::EapBearerType bearer,
+    const int iapId,
+    const EapQtPluginInfo &plugin, 
+    const EapQtPluginHandle& outerHandle) :
+        mConfigIf(new EapQtConfigInterface(bearer, iapId)),
+        mPluginInfo(plugin), 
+        mOuterHandle(outerHandle), 
+        mForm(NULL),
+        mModel(NULL), 
+        mUsername(NULL), 
+        mPasswordPrompt(NULL), 
+        mPassword(NULL), 
+        mValidatorUsername(NULL),
+        mValidatorPassword(NULL), 
+        mPasswordStored(false), 
+        mPasswordChanged(false), 
+        mPasswordEdit(NULL)
+{
+    qDebug("CpEapUserPasswordUi::CpEapUserPasswordUi");
+
+    // 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
+    }
+
+    initializeUserPasswordUi();
+}
+
+/*!
+ * Destructor.
+ */
+CpEapUserPasswordUi::~CpEapUserPasswordUi()
+{
+    qDebug("CpEapUserPasswordUi::~CpEapUserPasswordUi");
+
+    delete mValidatorUsername;
+    delete mValidatorPassword;
+
+    // mConfigIf: scoped pointer deleted automatically
+}
+
+/*!
+ * Initializes the password-username ui and initializes objects based on configuration
+ * read from the database.
+ */
+void CpEapUserPasswordUi::initializeUserPasswordUi()
+{
+    qDebug("CpEapUserPasswordUi::initializeUserPasswordUi");
+
+    CpItemDataHelper itemDataHelper;
+
+    // Read Configurations
+    EapQtConfig eapConfig;
+    bool configurationRead = mConfigIf->readConfiguration(mOuterHandle, mPluginInfo.pluginHandle(),
+        eapConfig);
+    if (!configurationRead) {
+        qDebug("CpEapUserPasswordUi::initializeUserPasswordUi - read configuration failed.");
+    }
+
+    // Create UI objects and group 
+    mForm = new HbDataForm();
+    this->setWidget(mForm);
+    
+    mModel = new HbDataFormModel;
+
+    HbDataFormModelItem *groupItem = new HbDataFormModelItem(HbDataFormModelItem::GroupItem,
+        hbTrId("txt_occ_subhead_eap_module_settings").arg(mPluginInfo.localizationId()));
+    mModel->appendDataFormItem(groupItem);
+
+    // 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);
+    
+    // Username
+    mUsername = new CpSettingFormItemData(HbDataFormModelItem::TextItem, hbTrId(
+        "txt_occ_setlabel_username"));
+    // Initialize the value from EapQtConfig
+    mUsername->setContentWidgetData("text", eapConfig.value(EapQtConfig::Username));
+    groupItem->appendChild(mUsername);
+
+    // Password prompting
+    mPasswordPrompt = new CpSettingFormItemData(HbDataFormModelItem::CheckBoxItem, hbTrId(
+        "txt_occ_setlabel_password"));
+    mPasswordPrompt->setContentWidgetData("text", hbTrId("txt_occ_setlabel_password_val_prompt"));
+    mPasswordPrompt->setContentWidgetData("checkState", boolToCheckState(eapConfig.value(
+        EapQtConfig::PasswordPrompt).toBool()));
+    // Connect signal to disable/enable password when passwordPrompt changed 
+    mForm->addConnection(mPasswordPrompt, SIGNAL(stateChanged(int)), this,
+        SLOT(passwordPromptChanged(int)));
+    groupItem->appendChild(mPasswordPrompt);
+
+    // Password
+    mPassword = new CpSettingFormItemData(HbDataFormModelItem::TextItem, hbTrId(
+        "txt_occ_setlabel_password"));
+    mPasswordStored = eapConfig.value(EapQtConfig::PasswordStored).toBool();
+    // If password has already been stored into the databse
+    // fixed number of asterisks are shown in UI
+    if (mPasswordStored) {
+        mPassword->setContentWidgetData("text", passwordExistString);
+    }
+    // Set password echo mode
+    mPassword->setContentWidgetData("echoMode", HbLineEdit::Password);
+    // Dimmed password if passwordPrompt is selected
+    passwordPromptChanged(mPasswordPrompt->contentWidgetData("checkState") == Qt::Checked);
+    // Connect signal to get info that user has changed the password
+    mForm->addConnection(mPassword, SIGNAL(editingFinished()), this, SLOT(passwordChanged()));
+    groupItem->appendChild(mPassword);
+
+    // Set the model
+    mForm->setModel(mModel);
+    itemDataHelper.bindToForm(mForm);
+
+    // Expand userpasswordui settings group
+    mForm->setExpanded(mModel->indexFromItem(groupItem), TRUE);
+}
+
+/*!
+ * Adds validators and connects focusIn event to the Password.
+ * 
+ * @param modelIndex Model index
+ */
+void CpEapUserPasswordUi::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
+        if (NULL == mValidatorUsername) {
+            mValidatorUsername = mConfigIf->validatorEap(mPluginInfo.pluginHandle().type(),
+                EapQtConfig::Username);
+        }
+        HbLineEdit *usernameEdit = qobject_cast<HbLineEdit *> (viewItem->dataItemContentWidget());
+        mValidatorUsername->updateEditor(usernameEdit);
+    }
+    else if (modelItem == mPassword) {
+        // When password lineEdit is activated (shown) first time, validator is added
+        if (NULL == mValidatorPassword){
+            mValidatorPassword = mConfigIf->validatorEap(mPluginInfo.pluginHandle().type(),
+                EapQtConfig::Password);            
+        }
+        mPasswordEdit = qobject_cast<HbLineEdit *> (viewItem->dataItemContentWidget());
+        mValidatorPassword->updateEditor(mPasswordEdit);
+        // Install event filter to clear dummy password, when password is started to edit.
+        mPasswordEdit->installEventFilter(this);
+    }
+}
+
+/*!
+ * 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 CpEapUserPasswordUi::close()
+{
+    qDebug("CpEapUserPasswordUi::close");
+    if (validate()) {
+        qDebug("CpEapUserPasswordUi::close - Store settings");
+        storeSettings();
+        qDebug("CpEapUserPasswordUi::close - Settings stored, exit");
+        CpBaseSettingView::close();
+    }
+    else {
+        qDebug("CpEapUserPasswordUi::close - validation failed. Prompt question.");
+        HbMessageBox *note = new HbMessageBox(HbMessageBox::MessageTypeQuestion);
+        note->setAttribute(Qt::WA_DeleteOnClose);
+        note->setText(hbTrId("txt_occ_info_incomplete_details_return_without_sa"));
+        note->clearActions();
+        // Connect 'YES'-button to CpBaseSettingView 'aboutToClose'-signal
+        HbAction *okAction = new HbAction(hbTrId("txt_common_button_yes"));
+        note->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"));
+        note->addAction(cancelAction);
+        note->setTimeout(HbPopup::NoTimeout);
+        note->open();
+    }
+}
+
+/*!
+ * Converts check box state to boolean.
+ * 
+ * @param state Check box state
+ * 
+ * @return true if Check box is checked, false otherwise.
+ */
+bool CpEapUserPasswordUi::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 CpEapUserPasswordUi::boolToCheckState(const bool state)
+{
+    return (false == state ? Qt::Unchecked : Qt::Checked);
+}
+
+/*!
+ * Dims the password if passwordPrompt has been selected.
+ * 
+ * @param state Tells is password prompt checked.
+ */
+void CpEapUserPasswordUi::passwordPromptChanged(int state)
+{
+    qDebug("CpEapUserPasswordUi::passwordPromptChanged - state: %d", state);
+
+    mPassword->setContentWidgetData("enabled", !checkStateToBool(state));
+}
+
+/*!
+ * Saves information that password has been changed and must be stored.
+ * If the new password is not given, the stored password is kept (if exists).
+ */
+void CpEapUserPasswordUi::passwordChanged()
+{
+    if (mPassword->contentWidgetData("text") != "") {
+        // Stored password is considered as changed only if user
+        // gives new unempty password
+        qDebug("CpEapUserPasswordUi::passwordChanged");
+        mPasswordChanged = true;
+    }
+}
+
+/*!
+ * When a focus moves into the password editor, possible dummy password is cleared.
+ */
+bool CpEapUserPasswordUi::eventFilter(QObject *obj, QEvent *event)
+{
+    
+    if (obj == mPasswordEdit && event->type() == QEvent::FocusIn 
+        && mPasswordStored && !mPasswordChanged) {
+        qDebug("CpEapUserPasswordUi::eventFilter - mPasswordEdit and FocusIn");
+        mPassword->setContentWidgetData("text", "");
+    }
+    return false;
+}
+
+/*!
+ * Validates settings configuration.
+ * 
+ * @return true if configuration OK, false otherwise.
+ */
+bool CpEapUserPasswordUi::validate()
+{
+    qDebug("CpEapUserPasswordUi::validate");
+    bool valid = false;
+
+    if ((EapQtValidator::StatusOk == mValidatorUsername->validate(mUsername->contentWidgetData(
+        "text"))) && validatePasswordGroup()) {
+        qDebug("CpEapUserPasswordUi::validate - OK");
+        valid = true;
+    }
+
+    return valid;
+}
+
+/*!
+ * Validates password and passwordPrompt.
+ * 
+ * @return true if OK, false otherwise.
+ */
+bool CpEapUserPasswordUi::validatePasswordGroup()
+{
+    qDebug("CpEapUserPasswordUi::validatePasswordGroup");
+    bool status = false;
+    // true if password prompt is checked, stored password has not changed
+    // or changed/given passrword is valid
+    if (mPasswordPrompt->contentWidgetData("checkState") == Qt::Checked 
+        || (mPasswordStored && !mPasswordChanged) 
+        || (mPasswordStored && mPasswordChanged && EapQtValidator::StatusOk
+            == mValidatorPassword->validate(mPassword->contentWidgetData("text").toString()))
+        || (!mPasswordStored && EapQtValidator::StatusOk
+            == mValidatorPassword->validate(mPassword->contentWidgetData("text").toString()))) {
+        qDebug("CpEapUserPasswordUi::validatePasswordGroup - OK");
+        status = true;
+    }
+    return status;
+}
+
+/*!
+ * Stores settings given via username-password configuration UI
+ */
+void CpEapUserPasswordUi::storeSettings()
+{
+    qDebug("CpEapUserPasswordUi::storeSettings");
+
+    EapQtConfig eapConfig;
+
+    eapConfig.setValue(EapQtConfig::OuterType, qVariantFromValue(mOuterHandle));
+    eapConfig.setValue(EapQtConfig::Username, mUsername->contentWidgetData("text"));
+    eapConfig.setValue(EapQtConfig::PasswordPrompt, checkStateToBool(
+        mPasswordPrompt->contentWidgetData("checkState").toInt()));
+    if (mPasswordPrompt->contentWidgetData("checkState") == Qt::Checked) {
+        if(mPasswordStored) {
+            // Stored password is cleared if prompting has been enabled
+            eapConfig.setValue(EapQtConfig::PasswordClear, true);
+            eapConfig.setValue(EapQtConfig::Password, "");
+        }
+        // else do nothing (password is not saved)
+    }
+    else {
+        // Password prompt is disabled
+        if (!mPasswordChanged && mPasswordStored) {
+            // Stored password has not been changed
+            eapConfig.setValue(EapQtConfig::PasswordStored, true);
+        }
+        else if (mPasswordChanged || !mPasswordStored) {
+            // Store the new password
+            eapConfig.setValue(EapQtConfig::Password, mPassword->contentWidgetData("text").toString());
+        }
+    }
+    
+    if (!mConfigIf->saveConfiguration(mPluginInfo.pluginHandle(), eapConfig)) {
+        qDebug("CpEapUserPasswordUi::storeSettings - configuration saving failed.");
+    }
+}