--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/wlanutilities/wlanwizard/src/wlanwizard_p.cpp Mon May 24 21:11:39 2010 +0300
@@ -0,0 +1,1066 @@
+/*
+* 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:
+* WLAN Wizard: Private implementation.
+*/
+
+// System includes
+#include <QLocale>
+#include <QApplication>
+#include <QGraphicsWidget>
+#include <QTimer>
+#include <QDebug>
+#include <HbTranslator>
+#include <HbDocumentLoader>
+#include <HbMainWindow>
+#include <HbDialog>
+#include <HbStackedWidget>
+#include <HbLabel>
+#include <HbAction>
+#include <HbStyleLoader>
+
+// User includes
+#ifdef WLAN_WIZARD_RND_EAP
+#include "eapwizard.h"
+#endif
+
+#ifdef WLAN_WIZARD_RND_WPS
+#include "wpswizard.h"
+#endif
+#include "wlanqtutils.h"
+#include "wlanqtutilsap.h"
+#include "wlanwizardplugin.h"
+#include "wlanwizard.h"
+#include "wlanwizard_p.h"
+#include "wlanwizardutils.h"
+#include "wlanwizardpagekeyquery.h"
+#include "wlanwizardpagesummary.h"
+#include "wlanwizardpageprocessingsettings.h"
+#include "wlanwizardpagegenericerror.h"
+
+#ifdef WLAN_WIZARD_RND
+#include "wlanwizardpagessid.h"
+#include "wlanwizardpagenetworkmode.h"
+#include "wlanwizardpagescanning.h"
+#include "wlanwizardpagesecuritymode.h"
+#endif
+
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "wlanwizard_pTraces.h"
+#endif
+
+/*!
+ \class WlanWizardPrivate
+ \brief Private implementation of WlanWizard. Implements the interface
+ WlanWizardHelper to the wizard plugins.
+ */
+
+// External function prototypes
+
+// Local constants
+
+/*!
+ \var PageTimeout Timeout for timer protected pages. 1.5sec
+ */
+
+// ======== LOCAL FUNCTIONS ========
+
+// ======== MEMBER FUNCTIONS ========
+
+/*!
+ Constructor of private implementation.
+
+ @param [in] wizard Pointer to the API class.
+ @param [in] mainWindow pointer to mainwindow.
+ */
+WlanWizardPrivate::WlanWizardPrivate(
+ WlanWizard* wizard,
+ HbMainWindow *mainWindow) :
+ QObject(wizard),
+ q_ptr(wizard),
+ mMainWindow(mainWindow),
+ mPageTimer(new QTimer(this)),
+ mTitle(NULL),
+ mActionNext(NULL),
+ mActionPrevious(NULL),
+ mActionFinish(NULL),
+ mActionCancel(NULL),
+ mStackedWidget(NULL),
+ mDialog(NULL),
+ mTranslator(new HbTranslator("wlanwizard")),
+ mWlanQtUtils(new WlanQtUtils()),
+ mDocLoader(new HbDocumentLoader(mainWindow)),
+ mEapWizard(NULL),
+ mWpsWizard(NULL),
+ mFirstPageId(WlanWizardPageInternal::PageNone),
+ mPageFinished(false),
+ mClosed(false)
+{
+ OstTrace1( TRACE_BORDER, WLANWIZARDPRIVATE_WLANWIZARDPRIVATE,
+ "WlanWizardPrivate::WlanWizardPrivate;this=%x",
+ this );
+
+ // Set initial values for configurations
+ setConfiguration(ConfIapId, WlanQtUtils::IapIdNone);
+ setConfiguration(ConfConnected, false);
+ setConfiguration(ConfHiddenWlan, false);
+ setConfiguration(ConfProcessSettings, false);
+ setConfiguration(ConfIctStatus, false);
+
+ // Initialize timer for timer protected pages
+ mPageTimer->setSingleShot(true);
+
+ // Load the wizard frame (title, content, actions) from docml
+ loadDocml();
+
+ // Creates the control object of the wlan wizard pages.
+ createPages();
+
+ // First page is SSID query, unless client sets configurations via
+ // setParameters(), which decides the first page..
+ mFirstPageId = WlanWizardPageInternal::PageSsid;
+
+ OstTraceExt2( TRACE_BORDER, WLANWIZARDPRIVATE_WLANWIZARDPRIVATE_DONE,
+ "WlanWizardPrivate::WlanWizardPrivate - done;"
+ "this=%x;mFirstPageId=%{PageIds}",
+ ( unsigned )this, mFirstPageId );
+}
+
+/*!
+ Destructor.
+ */
+WlanWizardPrivate::~WlanWizardPrivate()
+{
+ OstTrace1( TRACE_BORDER, WLANWIZARDPRIVATE_DWLANWIZARDPRIVATE,
+ "WlanWizardPrivate::~WlanWizardPrivate;this=%x",
+ this );
+
+ // Remove wizard pages from stackedwidgets, since stackedwidget owns the
+ // objects and all pages are deleted below.
+ while (mStackedWidget->count()) {
+ mStackedWidget->removeAt(0);
+ }
+
+ // Delete UI instances (HbWidget) of pages
+ QHashIterator<HbWidget*, WlanWizardPage*> i(mPageMapper);
+ while (i.hasNext()) {
+ i.next();
+ delete i.key();
+ }
+ mPageMapper.clear();
+
+ // WlanWizardPage objects are automatically deleted since this is the
+ // parent of the objects.
+ mPages.clear();
+
+#ifdef WLAN_WIZARD_RND_EAP
+ delete mEapWizard;
+#endif
+#ifdef WLAN_WIZARD_RND_WPS
+ delete mWpsWizard;
+#endif
+ // timer is cancelled/deleted automatically when the parent (this) is deleted
+
+ // TODO: See TSW Error: MTAA-854DK8 and loadDocml()
+ HbStyleLoader::unregisterFilePath(":/css/custom.css");
+
+ OstTrace1( TRACE_BORDER, WLANWIZARDPRIVATE_DWLANWIZARDPRIVATE_DONE,
+ "WlanWizardPrivate::~WlanWizardPrivate-Done;this=%x",
+ this );
+}
+
+/*!
+ See WlanWizard::setParameters().
+ */
+void WlanWizardPrivate::setParameters(
+ const QString &ssid,
+ int networkMode,
+ int securityMode,
+ bool usePsk,
+ bool hidden,
+ bool wps)
+{
+ OstTrace1( TRACE_BORDER, WLANWIZARDPRIVATE_SETPARAMETERS,
+ "WlanWizardPrivate::setParameters;this=%x",
+ this );
+
+ mFirstPageId = getNextPageId(
+ ssid, networkMode, securityMode, usePsk, hidden, wps);
+
+ OstTrace1( TRACE_BORDER, WLANWIZARDPRIVATE_SETPARAMETERS_DONE,
+ "WlanWizardPrivate::setParameters - Done;this=%x",
+ this );
+}
+
+/*!
+ See WlanWizard::show().
+ */
+void WlanWizardPrivate::show()
+{
+ OstTraceExt2( TRACE_BORDER, WLANWIZARDPRIVATE_SHOW,
+ "WlanWizardPrivate::show;this=%x;mFirstPageId=%{PageIds}",
+ ( unsigned )this, mFirstPageId );
+
+ Q_ASSERT(mClosed == false);
+ showPage(mFirstPageId, false);
+ mDialog->show();
+
+ OstTrace1( TRACE_BORDER, WLANWIZARDPRIVATE_SHOW_DONE,
+ "WlanWizardPrivate::show - Done;this=%x;",
+ (unsigned)this );
+}
+
+/*!
+ See WlanWizard::setParameters() for descriptions of parameters.
+
+ Based on the provided parameters next page id is returned.
+
+ @return next page id based on provided configurations.
+ */
+int WlanWizardPrivate::getNextPageId(
+ const QString &ssid,
+ int networkMode,
+ int securityMode,
+ bool usePsk,
+ bool hidden,
+ bool wps)
+{
+ setConfiguration(ConfProcessSettings, true);
+ setConfiguration(ConfSsid, ssid);
+ setConfiguration(ConfNetworkMode, networkMode);
+ setConfiguration(ConfSecurityMode, securityMode);
+ setConfiguration(ConfUsePsk, usePsk);
+ setConfiguration(ConfHiddenWlan, hidden);
+
+ OstTrace1( TRACE_NORMAL, WLANWIZARDPRIVATE_GETNEXTPAGEID,
+ "WlanWizardPrivate::getNextPageId;wps=%u",
+ wps );
+
+ return nextPageId(wps);
+}
+
+/*!
+ Utility method for WLAN Wizard pages to query the wlanqtutils class.
+
+ @return a valid pointer to WlanQtUtils class.
+ */
+WlanQtUtils* WlanWizardPrivate::wlanQtUtils() const
+{
+ Q_ASSERT(mWlanQtUtils);
+ return mWlanQtUtils.data();
+}
+
+/*!
+ Utility method for WLAN Wizard pages to query active wizard plugin object
+
+ @return NULL in case plugin is not active.
+ */
+WlanWizardPlugin* WlanWizardPrivate::wlanWizardPlugin() const
+{
+ WlanWizardPlugin* plugin = NULL;
+
+ if (isEapEnabled()) {
+#ifdef WLAN_WIZARD_RND_EAP
+ plugin = mEapWizard;
+ Q_ASSERT(plugin);
+#endif
+ }
+
+ OstTrace1( TRACE_NORMAL, WLANWIZARDPRIVATE_WLANWIZARDPLUGIN,
+ "WlanWizardPrivate::wlanWizardPlugin;plugin=%x",
+ plugin );
+
+ return plugin;
+}
+
+/*!
+ Utility method for WLAN Wizard pages to query if EAP mode is active at the
+ moment
+
+ @return true in case EAP is currently activated.
+ */
+bool WlanWizardPrivate::isEapEnabled() const
+{
+ bool ret = false;
+ int secMode = configuration(ConfSecurityMode).toInt();
+
+ if (((secMode == CMManagerShim::WlanSecModeWpa ||
+ secMode == CMManagerShim::WlanSecModeWpa2) &&
+ !configuration(ConfUsePsk).toBool()) ||
+ secMode == CMManagerShim::WlanSecMode802_1x) {
+ ret = true;
+ }
+
+ OstTrace1( TRACE_NORMAL, WLANWIZARDPRIVATE_ISEAPENABLED,
+ "WlanWizardPrivate::isEapEnabled;ret=%u",
+ ret );
+
+ return ret;
+}
+
+/*!
+ Creates new iap or updates existing iap.
+
+ @return false in case IAP creation/update failed.
+ */
+bool WlanWizardPrivate::handleIap()
+{
+ OstTrace0( TRACE_FLOW, WLANWIZARDPRIVATE_HANDLEIAP,
+ "WlanWizardPrivate::handleIap" );
+
+ bool ret = true;
+ bool usePsk = true;
+ int securityMode = configuration(ConfSecurityMode).toInt();
+ WlanQtUtilsAp wlanAp;
+
+ // Set configuration
+ wlanAp.setValue(WlanQtUtilsAp::ConfIdSsid, configuration(ConfSsid));
+ wlanAp.setValue(WlanQtUtilsAp::ConfIdConnectionMode,
+ configuration(ConfNetworkMode));
+ wlanAp.setValue(WlanQtUtilsAp::ConfIdSecurityMode, securityMode );
+ wlanAp.setValue(WlanQtUtilsAp::ConfIdHidden, configuration(ConfHiddenWlan));
+
+ switch (securityMode) {
+ case CMManagerShim::WlanSecModeWep:
+ wlanAp.setValue(WlanQtUtilsAp::ConfIdWepKey1, configuration(ConfKeyWep1));
+ wlanAp.setValue(WlanQtUtilsAp::ConfIdWepKey2, configuration(ConfKeyWep2));
+ wlanAp.setValue(WlanQtUtilsAp::ConfIdWepKey3, configuration(ConfKeyWep3));
+ wlanAp.setValue(WlanQtUtilsAp::ConfIdWepKey4, configuration(ConfKeyWep4));
+ wlanAp.setValue(
+ WlanQtUtilsAp::ConfIdWepDefaultIndex,
+ configuration(ConfKeyWepDefault));
+ break;
+
+ case CMManagerShim::WlanSecModeWpa:
+ case CMManagerShim::WlanSecModeWpa2:
+ usePsk = configuration(ConfUsePsk).toBool();
+ wlanAp.setValue(WlanQtUtilsAp::ConfIdWpaPskUse, usePsk);
+ if (usePsk){
+ wlanAp.setValue(WlanQtUtilsAp::ConfIdWpaPsk, configuration(ConfKeyWpa));
+ }
+ break;
+
+ default:
+ Q_ASSERT(securityMode == CMManagerShim::WlanSecModeOpen ||
+ securityMode == CMManagerShim::WlanSecMode802_1x);
+ // No WLAN Specific configuration
+ break;
+ }
+
+ // Create IAP if does not exists or update the existing IAP
+ int referenceId = configuration(ConfIapId).toInt();
+ if (referenceId == WlanQtUtils::IapIdNone) {
+ OstTrace0( TRACE_FLOW, WLANWIZARDPRIVATE_HANDLEIAP_CREATE,
+ "WlanWizardPrivate::handleIap: Create IAP" );
+
+ referenceId = mWlanQtUtils->createIap(&wlanAp);
+ setConfiguration(ConfIapId, referenceId);
+
+ if (referenceId == WlanQtUtils::IapIdNone) {
+ ret = false;
+ }
+ } else {
+ OstTrace0( TRACE_FLOW, WLANWIZARDPRIVATE_HANDLEIAP_UPDATE,
+ "WlanWizardPrivate::handleIap: Update IAP" );
+
+ ret = mWlanQtUtils->updateIap(referenceId, &wlanAp);
+ }
+
+ if (ret) {
+ // Store Wizard plugin specific settings here.
+ WlanWizardPlugin* plugin = wlanWizardPlugin();
+ if (plugin) {
+ OstTrace0( TRACE_FLOW, WLANWIZARDPRIVATE_HANDLEIAP_PLUGIN,
+ "WlanWizardPrivate::handleIap: Plugin" );
+ // Plugin gets the IAP ID from configuration
+ ret = plugin->storeSettings();
+ }
+ }
+
+ OstTrace1( TRACE_FLOW, WLANWIZARDPRIVATE_HANDLEIAP_DONE,
+ "WlanWizardPrivate::handleIap: Done;ret=%d",
+ ret );
+
+ return ret;
+}
+
+/*!
+ See WlanWizardHelper::configuration().
+ */
+QVariant WlanWizardPrivate::configuration(ConfigurationId confId) const
+{
+ Q_ASSERT(mConfigurations.contains(confId));
+
+#ifdef OST_TRACE_COMPILER_IN_USE
+ QString tmp;
+ QDebug tmpStream(&tmp);
+ tmpStream << mConfigurations[confId];
+ TPtrC16 string( tmp.utf16(), tmp.length() );
+
+ OstTraceExt2( TRACE_NORMAL, WLANWIZARDPRIVATE_CONFIGURATIONS,
+ "WlanWizardPrivate::configuration;confId=%{ConfigurationId};string=%S",
+ (uint)confId, string );
+#endif
+
+ return mConfigurations[confId];
+}
+
+/*!
+ See WlanWizardHelper::setConfiguration().
+ */
+void WlanWizardPrivate::setConfiguration(
+ ConfigurationId confId,
+ const QVariant &value)
+{
+#ifdef OST_TRACE_COMPILER_IN_USE
+ QString tmp;
+ QDebug tmpStream(&tmp);
+ tmpStream << value;
+ TPtrC16 string( tmp.utf16(), tmp.length() );
+
+ OstTraceExt2( TRACE_NORMAL, WLANWIZARDPRIVATE_SETCONFIGURATION,
+ "WlanWizardPrivate::setConfiguration;"
+ "confId=%{ConfigurationId};string=%S",
+ (uint)confId, string );
+#endif
+
+ mConfigurations[confId] = value;
+}
+
+/*!
+ See WlanWizardHelper::enableNextButton().
+ */
+void WlanWizardPrivate::enableNextButton(bool enable)
+{
+ OstTraceExt2( TRACE_FLOW, WLANWIZARDPRIVATE_ENABLENEXTBUTTON,
+ "WlanWizardPrivate::enableNextButton;this=%x;enable=%x",
+ (unsigned)this, (uint)enable );
+ mActionNext->setEnabled(enable);
+}
+
+/*!
+ See WlanWizardHelper::enablePrevButton().
+ */
+void WlanWizardPrivate::enablePrevButton(bool enable)
+{
+ OstTraceExt2( TRACE_FLOW, WLANWIZARDPRIVATE_ENABLEPREVBUTTON,
+ "WlanWizardPrivate::enablePrevButton;this=%x;enable=%x",
+ (unsigned)this, (uint)(enable) );
+
+ mActionPrevious->setEnabled(enable);
+}
+
+/*!
+ See WlanWizardHelper::addPage().
+ */
+void WlanWizardPrivate::addPage(int pageId, WlanWizardPage *page)
+{
+ OstTraceExt3( TRACE_FLOW, WLANWIZARDPRIVATE_ADDPAGE,
+ "WlanWizardPrivate::addPage;this=%x;pageId=%{PageIds};page=%x",
+ (unsigned)this, pageId, (uint)(page) );
+
+ Q_ASSERT(!mPages.contains(pageId));
+ mPages[pageId] = page;
+}
+
+/*!
+ See WlanWizardHelper::nextPage().
+ */
+void WlanWizardPrivate::nextPage()
+{
+ OstTrace1( TRACE_FLOW, WLANWIZARDPRIVATE_NEXTPAGE,
+ "WlanWizardPrivate::nextPage;this=%x",
+ this );
+
+ mPageFinished = true;
+ toNextPage();
+}
+
+/*!
+ See WlanWizardHelper::mainWindow().
+ */
+HbMainWindow* WlanWizardPrivate::mainWindow() const
+{
+ return mMainWindow;
+}
+
+/*!
+ See WlanWizardHelper::isCurrentPage().
+ */
+bool WlanWizardPrivate::isCurrentPage(const HbWidget *page) const
+{
+ bool ret = false;
+ if (mStackedWidget->currentWidget() == page) {
+ ret = true;
+ }
+
+ OstTraceExt2( TRACE_FLOW, WLANWIZARDPRIVATE_ISCURRENTPAGE,
+ "WlanWizardPrivate::isCurrentPage;page=%x;ret=%d",
+ (uint)page, ret);
+
+ return ret;
+}
+
+/*!
+ See WlanWizardHelper::nextPageId()
+ */
+int WlanWizardPrivate::nextPageId(bool useWps)
+{
+ int ret;
+ int secMode = configuration(WlanWizardHelper::ConfSecurityMode).toInt();
+ switch (secMode) {
+ case CMManagerShim::WlanSecModeWep:
+ ret = WlanWizardPageInternal::PageKeyQuery;
+ break;
+
+ case CMManagerShim::WlanSecModeWpa:
+ case CMManagerShim::WlanSecModeWpa2:
+ if (configuration(WlanWizardHelper::ConfUsePsk).toBool()) {
+ ret = WlanWizardPageInternal::PageKeyQuery;
+ } else {
+#ifdef WLAN_WIZARD_RND_EAP
+ ret = WlanWizardPage::PageEapStart;
+#else
+ ret = WlanWizardPageInternal::PageProcessSettings;
+ setConfiguration(ConfSecurityMode, CMManagerShim::WlanSecModeOpen);
+#endif
+
+ }
+ break;
+
+ case CMManagerShim::WlanSecMode802_1x:
+#ifdef WLAN_WIZARD_RND_EAP
+ ret = WlanWizardPage::PageEapStart;
+#else
+ ret = WlanWizardPageInternal::PageProcessSettings;
+ setConfiguration(ConfSecurityMode, CMManagerShim::WlanSecModeOpen);
+#endif
+ break;
+
+ case CMManagerShim::WlanSecModeWapi:
+ case CMManagerShim::WlanSecModeOpen:
+ default:
+ Q_ASSERT(
+ secMode == CMManagerShim::WlanSecModeOpen ||
+ secMode == CMManagerShim::WlanSecModeWapi);
+
+ setConfiguration(ConfSecurityMode, CMManagerShim::WlanSecModeOpen);
+ ret = WlanWizardPageInternal::PageProcessSettings;
+ break;
+ }
+
+ Q_UNUSED(useWps);
+#ifdef WLAN_WIZARD_RND_WPS
+ // TODO: WPS: and switch case above to else branch
+ if (useWps) {
+ ret = WlanWizardPage::PageWpsStart;
+ }
+#endif
+
+ OstTraceExt3( TRACE_NORMAL, WLANWIZARDPRIVATE_NEXTPAGEID,
+ "WlanWizardPrivate::nextPageId;this=%x;useWps=%x;ret=%{PageIds}",
+ ( unsigned )this, ( TUint )( useWps ), ret );
+
+ return ret;
+}
+
+/*!
+ Called when Cancel toolbar button is pressed. In case IAP has been created
+ it will be disconnected and the IAP settings are deleted and finally the
+ wizard is closed.
+
+ Indicates also to the current wizard page that cancel has been pressed.
+ */
+void WlanWizardPrivate::cancelTriggered()
+{
+ OstTrace1( TRACE_BORDER, WLANWIZARDPRIVATE_CANCELTRIGGERED,
+ "WlanWizardPrivate::cancelTriggered;this=%x",
+ this );
+
+ // Disconnect receiving more signals from any actions
+ disconnectActions();
+
+ mPageTimer->stop();
+
+ HbWidget *widget = qobject_cast<HbWidget*>(mStackedWidget->currentWidget());
+ Q_ASSERT(widget);
+ mPageMapper[widget]->cancelTriggered();
+
+ int referenceId = configuration(ConfIapId).toInt();
+ if (referenceId != WlanQtUtils::IapIdNone) {
+ // call disconnect even if
+ // - connection is not open
+ // - connection establishment is ongoing
+ mWlanQtUtils->disconnectIap(referenceId);
+
+ // if IAP deletion fails, there is nothing we can do with it
+ mWlanQtUtils->deleteIap(referenceId);
+ WlanWizardPlugin* plugin = wlanWizardPlugin();
+ if (plugin) {
+ // if deletion of plugin specific configuration fails we are not
+ // able to do anything
+ plugin->deleteSettings();
+ }
+ setConfiguration(ConfIapId, WlanQtUtils::IapIdNone);
+ }
+ closeViews();
+ Q_ASSERT(q_ptr);
+
+ OstTrace0( TRACE_BORDER, WLANWIZARDPRIVATE_CANCELTRIGGERED_EMIT,
+ "WlanWizardPrivate::cancelTriggered - emit cancelled()" );
+
+ emit q_ptr->cancelled();
+
+ OstTrace1( TRACE_BORDER, WLANWIZARDPRIVATE_CANCELTRIGGERED_DONE,
+ "WlanWizardPrivate::cancelTriggered - Done;this=%x", this );
+}
+
+/*!
+ Called when Previous toolbar button is pressed. Shows the previous wizard
+ page in stacked widget and indicates wizard page that previous has been
+ pressed.
+ */
+void WlanWizardPrivate::previousTriggered()
+{
+ OstTrace1( TRACE_BORDER, WLANWIZARDPRIVATE_PREVIOUSTRIGGERED,
+ "WlanWizardPrivate::previousTriggered;this=%x",
+ this );
+
+ mPageTimer->stop();
+
+ int index = mStackedWidget->currentIndex();
+ HbWidget *widget = qobject_cast<HbWidget*>(mStackedWidget->currentWidget());
+ Q_ASSERT(widget);
+ int back = mPageMapper[widget]->previousTriggered();
+
+ // check that at least one page is left in the stack
+ Q_ASSERT( back < mStackedWidget->count());
+
+ // When a widget which is last in the stack is removed the currentindex
+ // is automatically updated.
+ for (int i = 0; i < back; ++i) {
+ mStackedWidget->removeAt(index - i);
+ }
+
+ widget = qobject_cast<HbWidget*> (mStackedWidget->currentWidget());
+ Q_ASSERT(widget);
+ WlanWizardPage* page = mPageMapper[widget];
+ Q_ASSERT(page);
+ // In error case if page (value) is not found default contructed key is
+ // returned, in this case default value for int is 0 which means PageNone.
+ updateFrame(mPages.key(page));
+ enableNextButton(page->showPage());
+
+ OstTrace1( TRACE_BORDER, WLANWIZARDPRIVATE_PREVIOUSTRIGGERED_DONE,
+ "WlanWizardPrivate::previousTriggered - Done;this=%x",
+ this );
+}
+
+/*!
+ Next toolbar button has been pressed. Wizard framework asks from the current
+ page what should be the next page id and shows it.
+ */
+void WlanWizardPrivate::nextTriggered()
+{
+ OstTrace1( TRACE_BORDER, WLANWIZARDPRIVATE_NEXTTRIGGERED,
+ "WlanWizardPrivate::nextTriggered;this=%x",
+ this );
+
+ mPageTimer->stop();
+
+ HbWidget *widget = qobject_cast<HbWidget*>(mStackedWidget->currentWidget());
+ Q_ASSERT(widget);
+
+ bool removeFromStack;
+ int pageId = mPageMapper[widget]->nextId(removeFromStack);
+ showPage(pageId, removeFromStack);
+
+ OstTrace1( TRACE_BORDER, WLANWIZARDPRIVATE_NEXTTRIGGERED_DONE,
+ "WlanWizardPrivate::nextTriggered - Done;this=%x",
+ this );
+}
+
+/*!
+ Finish button has been pressed. Closes the wizard and sends finished()
+ signal to the client.
+ */
+void WlanWizardPrivate::finishTriggered()
+{
+ OstTrace1( TRACE_BORDER, WLANWIZARDPRIVATE_FINISHTRIGGERED,
+ "WlanWizardPrivate::finishTriggered;this=%x",
+ this );
+
+ // Disconnect receiving more signals from any actions
+ disconnectActions();
+
+ mPageTimer->stop();
+ closeViews();
+
+ Q_ASSERT(q_ptr);
+ emit q_ptr->finished(
+ configuration(ConfIapId).toInt(),
+ configuration(ConfConnected).toBool());
+
+ OstTrace1( TRACE_BORDER, WLANWIZARDPRIVATE_FINISHTRIGGERED_DONE,
+ "WlanWizardPrivate::finishTriggered - Done;this=%x",
+ this );
+}
+
+/*!
+ In case wizard page is using timer protection for the page, this is the
+ slot to handle the callback from the timer.
+ */
+void WlanWizardPrivate::onTimeOut()
+{
+ OstTrace1( TRACE_BORDER, WLANWIZARDPRIVATE_ONTIMEOUT,
+ "WlanWizardPrivate::onTimeOut;this=%x",
+ this );
+
+ toNextPage();
+
+ OstTrace1( TRACE_BORDER, WLANWIZARDPRIVATE_ONTIMEOUT_DONE,
+ "WlanWizardPrivate::onTimeOut - Done;this=%x",
+ this );
+}
+
+/*!
+ Slot to start wizard page operation asynchronous. Starts also the timer
+ to protect the wizard page.
+ */
+void WlanWizardPrivate::startPageOperation()
+{
+ // Process this if wizard has not been closed
+ if (mClosed == false) {
+ OstTrace1( TRACE_BORDER, WLANWIZARDPRIVATE_STARTPAGEOPERATION,
+ "WlanWizardPrivate::startPageOperation;this=%x",
+ this );
+
+ HbWidget *widget =
+ qobject_cast<HbWidget*>(mStackedWidget->currentWidget());
+ Q_ASSERT(widget);
+ mPageFinished = false;
+ mPageTimer->start(PageTimeout);
+ mPageMapper[widget]->startOperation();
+
+ OstTrace1( TRACE_BORDER, WLANWIZARDPRIVATE_STARTPAGEOPERATION_DONE,
+ "WlanWizardPrivate::startPageOperation - DONE;this=%x",
+ this );
+ }
+}
+
+/*!
+ In case the wizard page uses timer protection this method determines when
+ the next page is shown.
+ */
+void WlanWizardPrivate::toNextPage()
+{
+ if (mPageFinished && !(mPageTimer->isActive())) {
+ OstTrace1( TRACE_FLOW, WLANWIZARDPRIVATE_TONEXTPAGE,
+ "WlanWizardPrivate::toNextPage;this=%x",
+ this );
+
+ // process this asynchronous. Main purpose is to release the current
+ // call stack and process the page change using new call stack
+ QMetaObject::invokeMethod(this, "nextTriggered", Qt::QueuedConnection);
+ }
+}
+
+/*!
+ Show requested page and removes the current wizard page from the stack if
+ required. This method updates the title and toolbar accordingly.
+
+ See WlanWizardPage::nextId()
+
+ @param [in] pageId Wizard Page ID to be shown
+ @param [in] removeFromStack if true the current wizard page is removed from
+ the stackedwidget.
+ */
+void WlanWizardPrivate::showPage(int pageId, bool removeFromStack)
+{
+ OstTraceExt3( TRACE_FLOW, WLANWIZARDPRIVATE_SHOWPAGE,
+ "WlanWizardPrivate::showPage;this=%x;"
+ "pageId=%{PageIds};removeFromStack=%x",
+ ( unsigned )this, pageId, ( TUint )( removeFromStack ) );
+
+ // PageNone is returned by wizard pages when some validation of page content
+ // has not passed and the page does not want to process wizard to next page
+ if (pageId == WlanWizardPage::PageNone) {
+ return;
+ }
+
+ // PageProcessSettings is shown only when WLAN AP is found in scanning
+ // 1/ when client calls setParameters()
+ // 2/ scanning page has found match with given SSID
+ if (pageId == WlanWizardPage::PageProcessSettings) {
+ if (configuration(ConfProcessSettings).toBool() == false) {
+ if (handleIap()){
+ pageId = WlanWizardPageInternal::PageSummary;
+ } else {
+ pageId = WlanWizardPage::PageGenericError;
+ setConfiguration(
+ ConfGenericErrorString,
+ hbTrId("txt_occ_dialog_unable_to_save_settings_please_ret"));
+ }
+ OstTraceExt2( TRACE_FLOW, WLANWIZARDPRIVATE_SHOWPAGE_UPDATE,
+ "WlanWizardPrivate::showPage - change page;this=%x;"
+ "pageId=%{PageIds}",
+ ( unsigned )this, pageId);
+ }
+ }
+
+#ifdef WLAN_WIZARD_RND_EAP
+ if (pageId == WlanWizardPage::PageEapStart) {
+ if (!mEapWizard) {
+ // EAP Wizard will add wizard pages at construction phase using
+ // WlanWizardHelper::addPage()
+ mEapWizard = new EapWizard(this);
+ }
+ }
+#endif
+#ifdef WLAN_WIZARD_RND_WPS
+ if (pageId == WlanWizardPage::PageWpsStart) {
+ if (!mWpsWizard) {
+ // WPS Wizard will add wizard pages at construction phase using
+ // WlanWizardHelper::addPage()
+ mWpsWizard = new WpsWizard(this);
+ }
+ }
+#endif
+
+ // Create visualization of next page and store it to mappers
+ WlanWizardPage* page = mPages[pageId];
+ Q_ASSERT(page);
+ HbWidget* widget = page->initializePage();
+ Q_ASSERT(widget);
+ mPageMapper[widget] = page;
+
+ // index calculation has to be happened before adding new widget into
+ // the stacked widget. Since the internal implementation of stackedwidget
+ // sets the first widget in the stack to current widget..
+ // and when there are not any widgets in the stack the current index is
+ // -1. Valid index starts from 0.
+ int index = mStackedWidget->currentIndex();
+
+ if (removeFromStack) {
+ // widget is removed from the stacked widget, not deleted
+ mStackedWidget->removeAt(index);
+ } else {
+ index++;
+ }
+ mStackedWidget->addWidget(widget);
+ mStackedWidget->setCurrentIndex(index);
+ updateFrame(pageId);
+ enableNextButton(page->showPage());
+
+ // If wizard page needs to start some control operation trigger it
+ // asyncronously so that the UI gets more priority to get painted correctly
+ // before any operation takes place in wizard page. This is important for
+ // timer protected pages. Makes wizard to work smother from UI perspective
+ if (page->requiresStartOperation()) {
+ OstTrace0( TRACE_FLOW, WLANWIZARDPRIVATE_SHOWPAGE_INVOKE,
+ "WlanWizardPrivate::showPage - Invoke startOperation" );
+
+ QMetaObject::invokeMethod(this, "startPageOperation", Qt::QueuedConnection);
+ }
+}
+
+/*!
+ Creates all control objects of WLAN wizard pages which are inherited from
+ WlanWizardPage and adds those into a internal database.
+ */
+void WlanWizardPrivate::createPages()
+{
+ OstTrace0( TRACE_NORMAL, WLANWIZARDPRIVATE_CREATEPAGES,
+ "WlanWizardPrivate::createPages" );
+
+ addPage(WlanWizardPageInternal::PageKeyQuery,
+ new WlanWizardPageKeyQuery(this));
+
+ addPage(WlanWizardPageInternal::PageProcessSettings,
+ new WlanWizardPageProcessingSettings(this));
+
+ addPage(WlanWizardPageInternal::PageSummary,
+ new WlanWizardPageSummary(this));
+
+ addPage(WlanWizardPageInternal::PageGenericError,
+ new WlanWizardPageGenericError(this));
+
+#ifdef WLAN_WIZARD_RND
+ addPage(WlanWizardPageInternal::PageSsid, new WlanWizardPageSsid(this));
+
+ addPage(WlanWizardPageInternal::PageScanning,
+ new WlanWizardPageScanning(this));
+
+ addPage(WlanWizardPageInternal::PageNetworkMode,
+ new WlanWizardPageNetworkMode(this));
+
+ addPage(WlanWizardPageInternal::PageNetworkSecurity,
+ new WlanWizardPageSecurityMode(this));
+#endif
+}
+
+/*!
+ Called when wizard is closed
+ - cancelled by the user
+ - finished by the user
+ */
+void WlanWizardPrivate::closeViews()
+{
+ mClosed = true;
+ mDialog->close();
+}
+
+/*!
+ This method takes care of the title of wizard and toolbutton. Correct items
+ are selected based on the \a pageId and the amount of objects in the stacked
+ widget.
+
+ @param [in] pageId Wizard Page Id
+ */
+void WlanWizardPrivate::updateFrame(int pageId)
+{
+ int currentIndex = mStackedWidget->currentIndex();
+
+ OstTraceExt3( TRACE_FLOW, WLANWIZARDPRIVATE_UPDATEFRAME,
+ "WlanWizardPrivate::updateFrame;this=%x;pageId=%{PageIds};currentIndex=%d",
+ (unsigned)this, pageId, (uint)(currentIndex) );
+
+ // For last page (summary) show Finish instead of Next button
+ if (pageId == WlanWizardPageInternal::PageSummary) {
+ mTitle->setPlainText(hbTrId("txt_occ_title_wlan_setup_wizard_summary"));
+ mActionFinish->setVisible(true);
+ mActionNext->setVisible(false);
+ mActionPrevious->setVisible(false);
+ } else {
+ // Index starts from zero, wizard page numbering starts from one.
+ mTitle->setPlainText(
+ hbTrId("txt_occ_title_wlan_setup_wizard_step_l1").arg(
+ currentIndex + 1));
+ mActionFinish->setVisible(false);
+ mActionNext->setVisible(true);
+
+ // If first page is shown then Previous button is disabled
+ if (currentIndex < 1) {
+ mActionPrevious->setVisible(false);
+ } else {
+ mActionPrevious->setVisible(true);
+ if (pageId == WlanWizardPage::PageProcessSettings) {
+ mActionPrevious->setEnabled(false);
+ } else {
+ mActionPrevious->setEnabled(true);
+ }
+ }
+ }
+}
+
+/*!
+ Loads widgets and objects from the docml file.
+ */
+void WlanWizardPrivate::loadDocml()
+{
+ bool ok = true;
+
+ mDocLoader->load(":/docml/occ_wlan_wizard_main.docml", &ok);
+ Q_ASSERT(ok);
+
+ mDialog.reset( qobject_cast<HbDialog*> (mDocLoader->findWidget("dialog")) );
+ Q_ASSERT(mDialog != NULL);
+
+ mTitle = qobject_cast<HbLabel*> (mDocLoader->findWidget("title"));
+ Q_ASSERT(mTitle != NULL);
+
+ mStackedWidget =
+ qobject_cast<HbStackedWidget*> (mDocLoader->findWidget("stackedWidget"));
+ Q_ASSERT(mStackedWidget != NULL);
+
+ mActionNext = qobject_cast<HbAction*> (mDocLoader->findObject("actionNext"));
+ Q_ASSERT(mActionNext != NULL);
+
+ mActionPrevious =
+ qobject_cast<HbAction*> (mDocLoader->findObject("actionPrevious"));
+ Q_ASSERT(mActionPrevious != NULL);
+
+ mActionFinish =
+ qobject_cast<HbAction*> (mDocLoader->findObject("actionFinish"));
+ Q_ASSERT(mActionFinish != NULL);
+
+ mActionCancel =
+ qobject_cast<HbAction*> (mDocLoader->findObject("actionCancel"));
+ Q_ASSERT(mActionCancel != NULL);
+
+ // Actions are added from left to right to the toolbar of dialog
+ mDialog->addAction(mActionPrevious);
+ mDialog->addAction(mActionCancel);
+ mDialog->addAction(mActionNext);
+ mDialog->addAction(mActionFinish);
+
+ // TODO: workaround to prevent action to close the dialog
+ disconnect(mActionPrevious, SIGNAL(triggered()), mDialog.data(), SLOT(close()));
+ disconnect(mActionCancel, SIGNAL(triggered()), mDialog.data(), SLOT(close()));
+ disconnect(mActionNext, SIGNAL(triggered()), mDialog.data(), SLOT(close()));
+ disconnect(mActionFinish, SIGNAL(triggered()), mDialog.data(), SLOT(close()));
+
+ ok = true;
+ ok = connect(mPageTimer, SIGNAL(timeout()), this, SLOT(onTimeOut()));
+ Q_ASSERT(ok);
+
+ ok = connect(
+ mActionNext, SIGNAL(triggered()),
+ this, SLOT(nextTriggered()));
+ Q_ASSERT(ok);
+
+ ok = connect(
+ mActionPrevious, SIGNAL(triggered()),
+ this, SLOT(previousTriggered()));
+ Q_ASSERT(ok);
+
+ ok = connect(
+ mActionFinish, SIGNAL(triggered()),
+ this, SLOT(finishTriggered()));
+ Q_ASSERT(ok);
+
+ ok = connect(
+ mActionCancel, SIGNAL(triggered()),
+ this, SLOT(cancelTriggered()));
+ Q_ASSERT(ok);
+
+ // TODO: workaround for full screen dialog, with docml it is possible to
+ // define fullscreen dialog, mut resize is not done correctly when orientation
+ // is changed. See TSW Error: MTAA-854DK8
+ ok = HbStyleLoader::registerFilePath(":/css/custom.css");
+ Q_ASSERT(ok);
+}
+
+/*!
+ Disconnect receiving triggered() signal from any toolbar action.
+ */
+void WlanWizardPrivate::disconnectActions()
+{
+ disconnect(
+ mActionNext, SIGNAL(triggered()),
+ this, SLOT(nextTriggered()));
+
+ disconnect(
+ mActionPrevious, SIGNAL(triggered()),
+ this, SLOT(previousTriggered()));
+
+ disconnect(
+ mActionFinish, SIGNAL(triggered()),
+ this, SLOT(finishTriggered()));
+
+ disconnect(
+ mActionCancel, SIGNAL(triggered()),
+ this, SLOT(cancelTriggered()));
+}