diff -r 30e048a7b597 -r bad0cc58d154 securitysettings/cpeapuiplugins/cpeapuserpasswordui/src/cpeapuserpasswordui.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/securitysettings/cpeapuiplugins/cpeapuserpasswordui/src/cpeapuserpasswordui.cpp Tue Aug 31 15:16:37 2010 +0300 @@ -0,0 +1,480 @@ +/* + * 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 username-password based EAP method configuration + * + */ + +/* + * %version: 27 % + */ + +// System includes +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// 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(NULL), + mPluginInfo(plugin), + mOuterHandle(outerHandle), + mForm(NULL), + mModel(NULL), + mItemDataHelper(NULL), + mGroupItem(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 + } + + // Get EAP config interface + mConfigIf.reset(new EapQtConfigInterface(bearer, iapId)); + + createUi(); +} + +/*! + * Destructor. + */ +CpEapUserPasswordUi::~CpEapUserPasswordUi() +{ + qDebug("CpEapUserPasswordUi::~CpEapUserPasswordUi"); + + // mValidatorUsername, mValidatorPassword + // mConfigIf: scoped pointer deleted automatically +} + +/*! + * Creates username-password UI and initilizes settings read via + * EapQtConfigInterface + */ +void CpEapUserPasswordUi::createUi() +{ + qDebug("CpEapUserPasswordUi::createUi"); + + // Read Configurations + bool configurationRead = mConfigIf->readConfiguration(mOuterHandle, mPluginInfo.pluginHandle(), + mEapConfig); + if (!configurationRead) { + qDebug("CpEapUserPasswordUi::initializeUserPasswordUi - read configuration failed."); + } + + // Construct username-password UI + mForm = new HbDataForm(); + this->setWidget(mForm); + mModel = new HbDataFormModel(mForm); + + // Create settings group + 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(); + createPassword(); + + 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 username-password settings group + mForm->setExpanded(mModel->indexFromItem(mGroupItem), true); +} + +/*! + * Creates Username lineEdit + */ +void CpEapUserPasswordUi::createUsername() +{ + qDebug("CpEapUserPasswordUi::createUsername()"); + // Username + mUsername = new CpSettingFormItemData(HbDataFormModelItem::TextItem, hbTrId( + "txt_occ_setlabel_user_name")); + // Initialize the value from EapQtConfig + mUsername->setContentWidgetData("text", mEapConfig.value(EapQtConfig::Username)); + mGroupItem->appendChild(mUsername); +} + +/*! + * Creates Password group: + * Prompt checkBox and password lineEdit + */ +void CpEapUserPasswordUi::createPassword() +{ + qDebug("CpEapUserPasswordUi::createPassword()"); + // 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(mEapConfig.value( + EapQtConfig::PasswordPrompt).toBool())); + // Connect signal to disable/enable password when passwordPrompt changed + mForm->addConnection(mPasswordPrompt, SIGNAL(stateChanged(int)), this, + SLOT(passwordPromptChanged(int))); + mGroupItem->appendChild(mPasswordPrompt); + + // Password + mPassword = new CpSettingFormItemData(HbDataFormModelItem::TextItem, hbTrId( + "txt_occ_setlabel_password")); + mPasswordStored = mEapConfig.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); + // Dim 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())); + mGroupItem->appendChild(mPassword); +} + +/*! + * 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 + (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 *usernameEdit = qobject_cast (viewItem->dataItemContentWidget()); + mValidatorUsername->updateEditor(usernameEdit); + } + else if (modelItem == mPassword) { + // When password lineEdit is activated (shown) first time, validator is added + mValidatorPassword.reset(mConfigIf->validatorEap(mPluginInfo.pluginHandle().type(), + EapQtConfig::Password)); + mPasswordEdit = qobject_cast (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"); + + // Validate configuration + if (validate()) { + qDebug("CpEapUserPasswordUi::close - Validation OK"); + + // Store settings + if (storeSettings()){ + qDebug("CpEapUserPasswordUi::close - Settings stored, close view"); + // Close view + CpBaseSettingView::close(); + } + else { + qDebug("CpEapUserPasswordUi::close - Store settings failed, prompt warning"); + // Store failed. Show error note to user + QScopedPointer 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("CpEapUserPasswordUi::close - validation failed. Prompt question."); + + // Validate failed. Request user to exit anyway + QScopedPointer 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(); + } +} + +/*! + * 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").toString().length() > 0) { + // 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 (validateUsername() + && validatePasswordGroup()) { + qDebug("CpEapUserPasswordUi::validate - OK"); + valid = true; + } + + return valid; +} + +/*! + * Validates username + * + * @return true if OK, false otherwise + */ +bool CpEapUserPasswordUi::validateUsername() +{ + qDebug("CpEapUserPasswordUi::validateUsername"); + bool status = false; + // true if (given username is valid) or + // (password prompt is on and username is empty) + if ((EapQtValidator::StatusOk == mValidatorUsername->validate( + mUsername->contentWidgetData("text"))) + || (mPasswordPrompt->contentWidgetData("checkState") == Qt::Checked + && mUsername->contentWidgetData("text").toString().length() == 0)) { + qDebug("CpEapUserPasswordUi::validateUsername - OK"); + status = true; + } + return status; +} + +/*! + * 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 + * + * @return false if saving failed, true otherwisev + */ +bool 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()); + } + } + + // Save configuration + if (!mConfigIf->saveConfiguration(mPluginInfo.pluginHandle(), eapConfig)) { + qDebug("CpEapUserPasswordUi::storeSettings - configuration saving failed."); + return false; + } + return true; +}