--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/wlanutilities/wlanwizard/src/wlanwizardpagescanning.cpp Mon May 24 21:11:39 2010 +0300
@@ -0,0 +1,348 @@
+/*
+ * 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 Page: Scan processing.
+ */
+
+// System includes
+#include <HbMainWindow>
+#include <HbDocumentLoader>
+#include <HbWidget>
+#include <HbLabel>
+#include <HbProgressBar>
+#include <QDebug>
+#include <cmmanagerdefines_shim.h>
+#include <wlanqtutils.h>
+#include <wlanqtutilsap.h>
+
+// User includes
+#include "wlanwizard_p.h"
+#include "wlanwizardpagescanning.h"
+#include "OstTraceDefinitions.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "wlanwizardpagescanningTraces.h"
+#endif
+
+/*!
+ * Constructor. Member initialization.
+ */
+WlanWizardPageScanning::WlanWizardPageScanning(WlanWizardPrivate* parent) :
+ WlanWizardPageInternal(parent),
+ mWidget(NULL),
+ mLabel(NULL),
+ mBar(NULL),
+ mLoader(NULL),
+ mNextPageId(WlanWizardPage::PageNone),
+ mScanResultsAvailable(false)
+{
+ WlanQtUtils* utils = mWizard->wlanQtUtils();
+
+ // Connect normal scan completion signal from wlanQtUtils to result
+ // handler. Connect here instead of initializePage, since this signal may
+ // need to be caught event if the window is not active.
+ bool ok = connect(utils, SIGNAL(wlanScanApReady()), this,
+ SLOT(wlanScanResultPreCheck()));
+}
+
+/*!
+ * Destructor. Loader widget is deleted.
+ * All document widgets are deleted by wlanwizard_p destructor.
+ */
+WlanWizardPageScanning::~WlanWizardPageScanning()
+{
+ delete mLoader;
+}
+
+/*!
+ * Page initialization. If view is already loaded, does nothing.
+ */
+HbWidget* WlanWizardPageScanning::initializePage()
+{
+ OstTrace0( TRACE_NORMAL, WLANWIZARDPAGESCANNING_INITIALIZEPAGE,
+ "WlanWizardPageScanning::initializePage" );
+
+ // Next page id is reset with each initialization.
+ mNextPageId = WlanWizardPage::PageNone;
+
+ if (mWidget == NULL) {
+
+ mLoader = new HbDocumentLoader(mWizard->mainWindow());
+
+ bool ok;
+
+ mLoader->load(":/docml/occ_add_wlan_06.docml", &ok);
+ Q_ASSERT_X(ok, "WlanWizardPageScanning", "Invalid docml file");
+
+ // Initialize orientation
+ loadDocml(mWizard->mainWindow()->orientation());
+
+ // Load widgets
+ mWidget = qobject_cast<HbWidget*> (mLoader->findWidget(
+ "occ_add_wlan_06"));
+ Q_ASSERT_X(mWidget != NULL, "WlanWizardPageScanning", "View not found");
+
+ mLabel = qobject_cast<HbLabel*> (mLoader->findWidget("dialog"));
+ Q_ASSERT_X(mLabel != NULL, "WlanWizardPageScanning",
+ "textLabel not found");
+
+ mBar = qobject_cast<HbProgressBar*> (mLoader->findWidget("progressBar"));
+ Q_ASSERT_X(mBar != NULL, "WlanWizardPageScanning",
+ "progressBar not found");
+
+ WlanQtUtils* utils = mWizard->wlanQtUtils();
+
+ // Connect orientation signal from the main window to orientation
+ // loader.
+ ok &= connect(mWizard->mainWindow(),
+ SIGNAL(orientationChanged(Qt::Orientation)), this,
+ SLOT(loadDocml(Qt::Orientation)));
+
+ // Connect direct scan completion signal from wlanQtUtils to result
+ // handler.
+ ok &= connect(utils, SIGNAL(wlanScanDirectReady()), this,
+ SLOT(wlanScanDirectReady()));
+
+ Q_ASSERT(ok);
+
+ }
+
+ mLabel->setPlainText(hbTrId("txt_occ_dialog_searching").arg(
+ mWizard->configuration(WlanWizardPrivate::ConfSsid).toString()));
+
+ return mWidget;
+}
+
+/*!
+ * Sends the user to the next page.
+ */
+int WlanWizardPageScanning::nextId(bool &removeFromStack) const
+{
+ removeFromStack = true;
+
+ return mNextPageId;
+}
+
+/*!
+ * Always false. Moving to next page is not done manually.
+ * @see WlanWizardPage
+ */
+bool WlanWizardPageScanning::showPage()
+{
+ return false;
+}
+
+/*!
+ * Loads the document orientation-specific parameters.
+ */
+void WlanWizardPageScanning::loadDocml(Qt::Orientation orientation)
+{
+ OstTrace1( TRACE_NORMAL, WLANWIZARDPAGESCANNING_LOADDOCML,
+ "WlanWizardPageScanning::loadDocml - orientation ;orientation=%x",
+ ( TUint )( orientation ) );
+
+ bool ok;
+ // Then load the orientation specific section
+ if (orientation == Qt::Horizontal) {
+ mLoader->load(":/docml/occ_add_wlan_06.docml", "landscape_section", &ok);
+ Q_ASSERT(ok);
+ } else {
+ Q_ASSERT(orientation == Qt::Vertical);
+ mLoader->load(":/docml/occ_add_wlan_06.docml", "portrait_section", &ok);
+ Q_ASSERT(ok);
+ }
+}
+
+void WlanWizardPageScanning::wlanScanResultPreCheck()
+{
+ if (!mWidget) {
+ OstTrace1( TRACE_BORDER, WLANWIZARDPAGESCANNING_WLANSCANRESULTPRECHECK,
+ "WlanWizardPageScanning::wlanScanResultPreCheck no widget;this=%x",
+ this );
+
+ mScanResultsAvailable = true;
+ }
+ else {
+ if (mWizard->isCurrentPage(mWidget)) {
+ OstTrace0( TRACE_BORDER,
+ DUP1_WLANWIZARDPAGESCANNING_WLANSCANRESULTPRECHECK,
+ "WlanWizardPageScanning::wlanScanResultPreCheck go to results");
+
+ wlanScanApReady();
+ }
+ else {
+ OstTrace0( TRACE_BORDER,
+ DUP2_WLANWIZARDPAGESCANNING_WLANSCANRESULTPRECHECK,
+ "WlanWizardPageScanning::wlanScanResultPreCheck"
+ " not current widget" );
+
+ mScanResultsAvailable = true;
+ }
+ }
+}
+
+/*!
+ * Public networks did not reveal matches. Direct scan has been performed to
+ * find out if the network is hidden but in range. If network is found, proceed
+ * to next page according to scan results.
+ * If nothing is found, proceed to manual network
+ * mode selection page.
+ */
+void WlanWizardPageScanning::wlanScanDirectReady()
+{
+ OstTrace0( TRACE_NORMAL, WLANWIZARDPAGESCANNING_WLANSCANDIRECTREADY,
+ "WlanWizardPageScanning::wlanScanDirectReady" );
+
+ WlanQtUtils* utils = mWizard->wlanQtUtils();
+
+ Q_ASSERT(utils);
+
+ QList<QSharedPointer<WlanQtUtilsAp> > wlanApList;
+
+ utils->availableWlanAps(wlanApList);
+
+ qDebug("WlanWizardPageScanning::wlanScanDirectReady - results read");
+
+ QSharedPointer<WlanQtUtilsAp> item;
+
+ qDebug("%d APs found", wlanApList.size());
+ if(wlanApList.isEmpty()) {
+ qDebug("Match not found. Go to manual settings.");
+ mNextPageId = WlanWizardPageInternal::PageNetworkMode;
+ }
+ else {
+ int strongestSignal = 0;
+ int strongestIndex = 0;
+
+ for (int i = 0; i < wlanApList.size(); i++) {
+ // All direct scan results are matches. No need to compare ssids.
+ // In case there are multiple matches to direct scan, use the
+ // strongest signal on the result list.
+ item = wlanApList.at(i);
+ int str = item->value(WlanQtUtilsAp::ConfIdSignalStrength).toInt();
+ if (str > strongestSignal) {
+ qDebug("Strongest signal %d at %d", str, i);
+ strongestSignal = str;
+ strongestIndex = i;
+ }
+ }
+
+ item = wlanApList.at(strongestIndex);
+ qDebug("Select AP at %d", strongestIndex);
+ mNextPageId = mWizard->getNextPageId(
+ item->value(WlanQtUtilsAp::ConfIdSsid).toString(),
+ item->value(WlanQtUtilsAp::ConfIdConnectionMode).toInt(),
+ item->value(WlanQtUtilsAp::ConfIdSecurityMode).toInt(),
+ item->value(WlanQtUtilsAp::ConfIdWpaPskUse).toBool(),
+ true, // hidden
+ item->value(WlanQtUtilsAp::ConfIdWpsSupported).toBool());
+ }
+
+ mWizard->nextPage();
+
+}
+
+/*!
+ * All wlan channels have been scanned for public networks. Now process the
+ * results. If a network is found which matches the ssid set by the user,
+ * proceed to next page according to the network attributes.
+ * If no ssid match is found, proceed to a direct scan.
+ */
+void WlanWizardPageScanning::wlanScanApReady()
+{
+ OstTrace0( TRACE_NORMAL, WLANWIZARDPAGESCANNING_WLANSCANAPREADY,
+ "WlanWizardPageScanning::wlanScanApReady" );
+
+ WlanQtUtils* utils = mWizard->wlanQtUtils();
+ Q_ASSERT(utils);
+
+ QList<QSharedPointer<WlanQtUtilsAp> > wlanApList;
+
+ // Fetch the list of scan results.
+ utils->availableWlanAps(wlanApList);
+
+ qDebug("WlanWizardPageScanning::wlanScanApReady - results read");
+
+ QString ssid =
+ mWizard->configuration(WlanWizardPrivate::ConfSsid).toString();
+ qDebug() << "SSID scanned by user " << ssid;
+
+ bool matchFound = false;
+ int strongestSignal = -1;
+ int strongestIndex = 0;
+ QSharedPointer<WlanQtUtilsAp> item;
+
+ qDebug("%d APs found", wlanApList.size());
+
+ for (int i = 0; i < wlanApList.size(); i++) {
+ // In case there are multiple matches to direct scan, use the
+ // strongest signal on the result list.
+ item = wlanApList.at(i);
+ if (item->value(WlanQtUtilsAp::ConfIdSsid).toString() == ssid) {
+ qDebug("Match found");
+ matchFound = true;
+
+ int str = item->value(WlanQtUtilsAp::ConfIdSignalStrength).toInt();
+ if (str > strongestSignal) {
+ qDebug("Strongest signal %d at %d", str, i);
+ strongestSignal = str;
+ strongestIndex = i;
+ }
+ }
+ }
+
+ if (matchFound) {
+ qDebug("Select AP at %d", strongestIndex);
+ item = wlanApList.at(strongestIndex);
+ mNextPageId = mWizard->getNextPageId(
+ item->value(WlanQtUtilsAp::ConfIdSsid).toString(),
+ item->value(WlanQtUtilsAp::ConfIdConnectionMode).toInt(),
+ item->value(WlanQtUtilsAp::ConfIdSecurityMode).toInt(),
+ item->value(WlanQtUtilsAp::ConfIdWpaPskUse).toBool(),
+ false, // public
+ item->value(WlanQtUtilsAp::ConfIdWpsSupported).toBool());
+ // The ssid indicated by the user was found. Proceed to next page.
+ mWizard->nextPage();
+ }
+ else {
+ qDebug("Match not found. Perform direct scan.");
+ utils->scanWlanDirect(ssid);
+ }
+
+}
+
+/*!
+ * Overloaded function from WlanWizardPage. Indicates that this window requires
+ * post-initialization start operations.
+ */
+bool WlanWizardPageScanning::requiresStartOperation()
+{
+ return true;
+}
+
+/*!
+ * Wlan scan is performed as a "post-initialization" which is executed in a
+ * separate scheduler loop.
+ */
+void WlanWizardPageScanning::startOperation()
+{
+ OstTrace0( TRACE_NORMAL, WLANWIZARDPAGESCANNING_STARTOPERATION,
+ "WlanWizardPageScanning::startOperation - start AP scan if results"
+ " are available." );
+
+ if (mScanResultsAvailable) {
+ mScanResultsAvailable = false;
+ wlanScanApReady();
+ }
+}
+