wlanutilities/wlansniffer/aiplugin/src/wsfaicontroller.cpp
branchRCL_3
changeset 25 f28ada11abbf
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/wlanutilities/wlansniffer/aiplugin/src/wsfaicontroller.cpp	Wed Sep 01 12:20:32 2010 +0100
@@ -0,0 +1,1207 @@
+/*
+* Copyright (c) 2007-2008 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:  Implementation of TWsfAiController.
+*
+*/
+
+
+
+//  EXTERNAL INCLUDES
+#include <apgcli.h>
+#include <centralrepository.h>
+#include <browseruisdkcrkeys.h>
+#include <AknIconArray.h>
+#include <AknQueryDialog.h>
+#include <cmpluginwlandef.h>
+#include <ErrorUI.h>
+#include <StringLoader.h>
+#include <aknnotewrappers.h>
+#include <wsfaipluginrsc.rsg>
+#include <rconnmon.h>
+#include <utf.h>
+#include <cmmanager.h>
+#include <internetconnectivitycrkeys.h>
+#include <wlanerrorcodes.h>
+#include <ConnectionUiUtilities.h>
+
+//  CLASS HEADER
+#include "wsfaicontroller.h"
+
+//  INTERNAL INCLUDES
+#include "wsfwlaninfo.h"
+#include "wsfwlaninfoarray.h"
+#include "wsfaiuiobserver.h"
+#include "wsfaimodel.h"
+#include "wsficonarraycreator.h"
+#include "wsfmodel.h"
+#include "wsfsearchwlansdialog.h"
+#include "wsfaicontrollercmds.h"
+#include "wsfactivewaiter.h"
+#include "wsflogger.h"
+#include "wsfdbobserver.h"
+#include "wsfactivewrappers.h"
+
+
+//  MACROS
+#ifdef _DEBUG
+    _LIT( KControllerPanic, "CWsfAiController" );
+    #define _ASS_D( cond ) __ASSERT_DEBUG( (cond), \
+            User::Panic( KControllerPanic, __LINE__) )
+#else
+    #define _ASS_D( cond )
+#endif //_DEBUG
+
+
+//  LOCAL DEFINITIONS
+LOCAL_D const TInt KFirstItemArrayIndex = 0;
+
+// index value to suppress 1 second refreshing state
+static const TInt KSuppressRefreshIndex = 1024;
+
+
+
+// --------------------------------------------------------------------------
+// TWsfAiController::TWsfAiController
+// --------------------------------------------------------------------------
+//
+TWsfAiController::TWsfAiController():
+    iModel( NULL ),
+    iAiModel( NULL ),
+    iUi( NULL ),
+    iDbObserver( NULL ),
+    iConnectOnly( EFalse )
+    {
+    // null the pointers
+    iConnectedWlan.iConnectionState = ENotConnected;
+    }
+
+
+// ---------------------------------------------------------
+// CWsfActiveWaiter::DeInitializeL
+// ---------------------------------------------------------
+//    
+void TWsfAiController::DeInitializeL()
+    {
+    LOG_ENTERFN( "TWsfAiController::DeInitializeL" );
+    }
+
+
+// --------------------------------------------------------------------------
+// TWsfAiController::Initialize
+// --------------------------------------------------------------------------
+//
+void TWsfAiController::InitializeL( CEikonEnv* aEnv, CWsfModel* aModel, 
+                                    CWsfAiModel* aAiModel, 
+                                    CWsfDbObserver* aObserver, 
+                   					CWsfActiveWrappers* aActiveWrappers )
+    {
+    LOG_ENTERFN( "TWsfAiController::InitializeL" );
+    iEnv = aEnv;
+    iModel = aModel;
+    iAiModel = aAiModel;
+    iDbObserver = aObserver;
+    iActiveWrappers = aActiveWrappers;
+    iDbObserver->SetController( this );
+    iDbObserver->ActivateItL();
+    iModel->SetEngineObserver( this );
+    }
+
+
+// ---------------------------------------------------------------------------
+// TWsfMainController::BrowserLaunchCompleteL
+// ---------------------------------------------------------------------------
+// 
+void TWsfAiController::BrowserLaunchCompleteL()
+    {
+    LOG_ENTERFN( "TWsfAiController::BrowserLaunchCompleteL" );
+    // no implementation required
+    }
+
+
+// ---------------------------------------------------------------------------
+// TWsfMainController::BrowserExitL
+// ---------------------------------------------------------------------------
+// 
+void TWsfAiController::BrowserExitL()
+    {
+    LOG_ENTERFN( "TWsfAiController::BrowserExitL" ); 
+    // no implementation required
+    }
+
+
+// ---------------------------------------------------------------------------
+// TWsfMainController::BrowserLaunchFailed
+// ---------------------------------------------------------------------------
+//
+#ifdef _DEBUG
+void TWsfAiController::BrowserLaunchFailed( TInt aError )
+    {
+    LOG_ENTERFN( "TWsfAiController::BrowserLaunchFailed" ); 
+    LOG_WRITEF( "error = %d", aError );
+#else
+void TWsfAiController::BrowserLaunchFailed( TInt /*aError*/ )
+    {   
+    // no implementation required
+#endif
+    }
+
+
+// ---------------------------------------------------------------------------
+// TWsfMainController::ConnectingL
+// ---------------------------------------------------------------------------
+//
+void TWsfAiController::ConnectingL( TUint32 /*aIapId*/ )
+    {
+    LOG_ENTERFN( "TWsfAiController::ConnectingL" ); 
+    iModel->SetConnecting( ETrue );
+    iAiModel->SetConnecting( ETrue );
+    iUi->StartConnectingAnimationL();
+    RefreshUiL();
+    }
+
+
+// ---------------------------------------------------------------------------
+// TWsfMainController::ConnectingFinishedL
+// ---------------------------------------------------------------------------
+//
+#ifdef _DEBUG
+void TWsfAiController::ConnectingFinishedL( TInt aResult )
+    {
+    LOG_ENTERFN( "TWsfAiController::ConnectingFinishedL" );
+    LOG_WRITEF( "aResult = %d", aResult );
+#else
+void TWsfAiController::ConnectingFinishedL( TInt /*aResult*/ )
+    {
+#endif
+    if ( iModel->IsConnecting() )
+        {
+        iModel->SetConnecting( EFalse );
+        }
+    iAiModel->SetConnecting( EFalse );
+    RefreshUiL();
+    }
+
+
+// --------------------------------------------------------------------------
+// TWsfAiController::StartupRefresh
+// --------------------------------------------------------------------------
+//
+void TWsfAiController::StartupRefresh()
+    {
+    LOG_ENTERFN( "TWsfAiController::StartupRefresh" );
+    iActiveWrappers->RefreshWLANList( ETrue );
+    }
+
+
+// --------------------------------------------------------------------------
+// TWsfAiController::StartupRefreshDataReadyL
+// --------------------------------------------------------------------------
+//
+void TWsfAiController::StartupRefreshDataReadyL()
+    {
+    LOG_ENTERFN( "TWsfAiController::StartupRefreshDataReadyL" );
+    
+    iInfoArray = iActiveWrappers->GetWLANList();
+    iConnectedWlan = iActiveWrappers->GetConnectedWLANNetwork();
+    iAiModel->SetConnected( iConnectedWlan.Connected() );
+    iAiModel->SetConnectedWlanInfo( iConnectedWlan );
+    
+    LOG_WRITEF( "Connected = %d", iConnectedWlan.Connected() );
+    
+    MDesCArray* data = iAiModel->FormatSingleLineWlanListL( iInfoArray );
+    
+    iUi->UpdateHotSpotsL( data, KSuppressRefreshIndex );    
+    }
+
+
+// --------------------------------------------------------------------------
+// TWsfAiController::SetUi
+// --------------------------------------------------------------------------
+//
+void TWsfAiController::SetUi( MWsfAiUiObserver& aUi )
+    {
+    LOG_ENTERFN( "TWsfAiController::SetUi" );
+    iUi = &aUi;    
+    }
+
+
+// --------------------------------------------------------------------------
+// TWsfAiController::HandleSelectionKeyL
+// --------------------------------------------------------------------------
+//
+void TWsfAiController::HandleSelectionKeyL()
+    {
+    LOG_ENTERFN( "TWsfAiController::HandleSelectionKeyL" );
+    _ASS_D( iAiModel );
+    
+    if ( !iAiModel->ScanningOn() && !iAiModel->Connected() )
+        {
+        // scanning was off and there wasn't a connected network
+        EnableScanL();
+        }
+    else
+        {
+        // scanning was on
+        // menu contents depend on the connection and browser status
+        if ( iModel->IsConnecting() )
+            {
+            // connecting
+            HandleMskIfConnectingL();
+            }
+        else if ( !iAiModel->Connected() )
+            {
+            // not connected
+            HandleMskIfOfflineL();
+            }
+        else
+            {
+            // connected
+            if ( IsWlanUsedByBrowserL() )
+                {
+                // browser is using active WLAN connection
+                HandleMskIfBrowsingL();
+                }
+            else
+                {
+                // browser is not running or not using the WLAN
+                HandleMskIfConnectedL();
+                }
+            }
+        }
+    }
+
+
+// --------------------------------------------------------------------------
+// TWsfAiController::WlanListChangedL
+// --------------------------------------------------------------------------
+//
+void TWsfAiController::WlanListChangedL()
+    {
+    LOG_ENTERFN("TWsfAiController::WlanListChangedL" );
+ 
+    _ASS_D( iAiModel );
+    
+    if ( !iAiModel->ScanningOn() )
+        {
+        return;
+        }
+    
+    iActiveWrappers->RefreshWLANList( EFalse );
+    }
+
+
+// --------------------------------------------------------------------------
+// TWsfAiController::WlanListDataReadyL
+// --------------------------------------------------------------------------
+//
+void TWsfAiController::WlanListDataReadyL()
+    {
+    LOG_ENTERFN("TWsfAiController::WlanListDataReadyL" );
+ 
+    _ASS_D( iAiModel );
+    
+    iInfoArray = iActiveWrappers->GetWLANList();
+    iConnectedWlan = iActiveWrappers->GetConnectedWLANNetwork();
+    iAiModel->SetConnected( iConnectedWlan.Connected() );
+    iAiModel->SetConnectedWlanInfo( iConnectedWlan );
+    
+    LOG_WRITEF( "Connected = %d", iConnectedWlan.Connected() );
+    
+    if ( !iAiModel->ScanningOn() && !iAiModel->Connected() )
+        {
+        return;
+        }
+    
+    _ASS_D( iModel );
+    _ASS_D( iUi );
+    
+    TBool match( EFalse );    
+    TWsfWlanInfo previousSelected;        
+    CWsfWlanInfoArray* modelArr = iAiModel->GetInfoArray();   
+    
+    if ( modelArr )
+        {
+        TInt selectedItem = iUi->SelectedItem();
+        if ( selectedItem >= KFirstItemArrayIndex && 
+             selectedItem < modelArr->Count() )
+            {
+            TWsfWlanInfo* temp = modelArr->At( selectedItem );
+            if ( temp )
+                {
+                match = ETrue;
+                previousSelected = *temp;
+                }                
+            }
+        }
+        
+    MDesCArray* data = iUi->MultilineControl() ? 
+            iAiModel->FormatWlanListL( iInfoArray, ETrue ): 
+            iAiModel->FormatSingleLineWlanListL( iInfoArray );
+    
+    
+    TInt index( KErrNotFound );
+    if ( match )
+        {            
+        TWsfWlanInfo* currentMatch = iInfoArray->Match( 
+                                                    previousSelected.iSsid, 
+                                                    iInfoArray->Count() );
+        if ( currentMatch )
+            {
+            index = iInfoArray->GetArrayIndex( currentMatch );
+            }
+        }
+    
+    if ( !iUi->MultilineControl() && iModel->IsConnecting() )
+        {
+        index = KSuppressRefreshIndex;
+        }
+    
+    iUi->UpdateHotSpotsL( data, index );
+    }
+
+
+// --------------------------------------------------------------------------
+// TWsfAiController::NotifyEngineError
+// --------------------------------------------------------------------------
+//
+void TWsfAiController::NotifyEngineError( TInt aError )
+    {
+    LOG_ENTERFN( "TWsfAiController::NotifyEngineError" );
+    //Let the user know about the error.
+    LOG_WRITEF( "error = %d", aError );
+    TRAP_IGNORE( DoHandleEngineErrorL( aError ) ); 
+    }
+
+
+// --------------------------------------------------------------------------
+// TWsfAiController::ScanDisabledL
+// --------------------------------------------------------------------------
+//
+void TWsfAiController::ScanDisabledL()
+    {
+    LOG_ENTERFN( "TWsfAiController::ScanDisabledL" );
+    // no implementation required
+    }
+
+
+// --------------------------------------------------------------------------
+// TWsfAiController::ScanEnabledL
+// --------------------------------------------------------------------------
+//
+void TWsfAiController::ScanEnabledL()
+    {
+    LOG_ENTERFN( "TWsfAiController::ScanEnabledL" );
+    iActiveWrappers->RefreshScan();
+    }
+
+
+// --------------------------------------------------------------------------
+// TWsfAiController::WlanConnectionActivatedL
+// --------------------------------------------------------------------------
+//
+void TWsfAiController::WlanConnectionActivatedL()
+    {
+    LOG_ENTERFN( "TWsfAiController::WlanConnectionActivatedL" );
+    iModel->SetConnecting( EFalse );
+    iAiModel->SetConnected( ETrue );
+    iAiModel->SetConnecting( EFalse );
+
+    iActiveWrappers->RefreshWLANList( EFalse ); 
+    } 
+
+
+// --------------------------------------------------------------------------
+// TWsfAiController::WlanConnectionClosedL
+// --------------------------------------------------------------------------
+//
+void TWsfAiController::WlanConnectionClosedL()
+    {
+    LOG_ENTERFN( "TWsfAiController::WlanConnectionClosedL" );
+    iModel->SetConnecting( EFalse );
+    iAiModel->SetConnected( EFalse );
+    iAiModel->SetConnecting( EFalse );
+    if ( iAiModel->ScanningOn() )
+        {
+        iActiveWrappers->RefreshWLANList( EFalse ); 
+        }
+    else
+        {
+        iUi->DisplayEngineOffL();
+        }
+    }
+
+
+// ---------------------------------------------------------------------------
+// TWsfMainController::ConnectionCreationProcessFinished
+// ---------------------------------------------------------------------------
+//
+void TWsfAiController::ConnectionCreationProcessFinishedL( TInt aResult )
+    {
+    LOG_ENTERFN( "TWsfAiController::ConnectionCreationProcessFinished" );
+    LOG_WRITEF( "aResult = %d", aResult );
+    // release flags if we leave occures
+    CleanupStack::PushL( TCleanupItem( CleanUpConnectingL, this ) );
+    if ( iModel->IsConnecting() )
+        {
+        iModel->SetConnecting( EFalse );
+        }
+    iAiModel->SetConnecting( EFalse );
+    if ( aResult == KErrNone )
+        {
+        iAiModel->SetConnected( ETrue );
+        if ( !iConnectOnly )
+            {
+            StartWebBrowserL( iUsedInfo );
+            }
+        }
+    else
+        {
+        iAiModel->SetConnected( EFalse );
+        }
+    // pop cleanup item 
+    CleanupStack::Pop();
+    }
+
+
+// --------------------------------------------------------------------------
+// TWsfAiController::StartBrowsingL
+// --------------------------------------------------------------------------
+//
+void TWsfAiController::StartBrowsingL( TWsfWlanInfo& aInfo )
+    {
+    LOG_ENTERFN( "TWsfAiController::StartBrowsingL" );
+    
+    _ASS_D( iModel );
+    
+    iUsedInfo = aInfo;
+    
+    // Prevent connections to ad-hoc + WPA 
+    if ( iUsedInfo.iNetMode == CMManager::EAdhoc 
+            && iUsedInfo.iSecurityMode == CMManager::EWlanSecModeWpa )
+        {
+        CErrorUI* errorUi = CErrorUI::NewLC();
+        errorUi->ShowGlobalErrorNoteL( KErrNotSupported );
+        CleanupStack::PopAndDestroy( errorUi ); // errorUi
+        return;
+        }
+    
+    // make sure we don't show connecting stuff forever
+    CleanupStack::PushL( TCleanupItem( CleanUpConnectingL, this ) );
+    
+    if ( !iUsedInfo.Connected() )
+        {
+        ConnectL( iUsedInfo, EFalse, EFalse );
+        }
+    else
+        {
+        LOG_WRITE("Start browser to connected network...");
+        iConnectOnly = EFalse;
+        StartWebBrowserL( iUsedInfo );
+        }
+    
+    // pop cleanup item 
+    CleanupStack::Pop();
+    }
+
+
+// --------------------------------------------------------------------------
+// TWsfAiController::StartWebBrowserL
+// --------------------------------------------------------------------------
+//
+void TWsfAiController::StartWebBrowserL( TWsfWlanInfo& aInfo )
+    {
+    LOG_ENTERFN( "TWsfAiController::StartWebBrowserL" );
+    
+    _ASS_D( iModel );
+    
+    TUint32 passedIap( aInfo.iIapId );
+
+    if ( aInfo.Connected() && !passedIap )
+        {
+        // in case we have an EasyWLAN here
+        RCmManager cmmanager;
+        cmmanager.OpenLC();
+
+        passedIap = cmmanager.EasyWlanIdL();
+
+        CleanupStack::PopAndDestroy( &cmmanager );
+        }
+    
+    // launch the browser
+    iModel->LaunchBrowserL( passedIap );
+    }
+
+
+// --------------------------------------------------------------------------
+// TWsfAiController::ConnectL
+// --------------------------------------------------------------------------
+//
+void TWsfAiController::ConnectL( TWsfWlanInfo& aInfo, TBool aConnectOnly, 
+                                 TBool aTestAccessPoint )
+    {
+    LOG_ENTERFN( "TWsfAiController::ConnectL" );
+    
+    _ASS_D( iModel );
+    TBool testAccessPoint = aTestAccessPoint;
+    iConnectOnly = aConnectOnly;
+    iUsedInfo = aInfo;
+    
+    // Prevent connections to ad-hoc + WPA 
+    if ( iUsedInfo.iNetMode == CMManager::EAdhoc 
+            && iUsedInfo.iSecurityMode == CMManager::EWlanSecModeWpa )
+        {
+        CErrorUI* errorUi = CErrorUI::NewLC();
+        errorUi->ShowGlobalErrorNoteL(KErrNotSupported);
+        CleanupStack::PopAndDestroy(errorUi); // errorUi
+        return;
+        }
+    
+    // make sure we don't show connecting stuff forever
+    CleanupStack::PushL( TCleanupItem( CleanUpConnectingL, this ) );
+    
+    if ( !iUsedInfo.iIapId && !iUsedInfo.Hidden() &&
+            iUsedInfo.iSecurityMode == CMManager::EWlanSecModeOpen )
+        {
+        TBool success( EFalse );
+        // just create the IAP
+        TRAPD( accessPointCreatedError, 
+                success = iModel->CreateAccessPointL( 
+                iUsedInfo, EFalse ); 
+        );
+        
+        // notify user that Disk is full or creation of a WAPI IAP 
+        // is not supported on-the-fly and leave
+        if ( accessPointCreatedError == KErrDiskFull ||
+             accessPointCreatedError == KErrWlanProtectedSetupSetupLocked )
+            {
+            LOG_WRITE( "showing error note" );
+            CErrorUI* errorUi = CErrorUI::NewLC();
+            errorUi->ShowGlobalErrorNoteL( accessPointCreatedError );
+            CleanupStack::PopAndDestroy( errorUi );
+            User::Leave( accessPointCreatedError );
+            }
+        // just leave because we failed to create accesspoint
+        else if ( accessPointCreatedError != KErrNone || !success )
+            {
+            User::Leave( accessPointCreatedError );
+            }
+        ConnectingL( iUsedInfo.iIapId );
+        testAccessPoint = ETrue;
+        }
+    else if ( !iUsedInfo.iIapId )
+        {
+        testAccessPoint = ETrue;
+        // let the helper app do the query if necessary
+        LOG_WRITE("AiHelper needs to be launched");
+        iActiveWrappers->LaunchHelperApplicationL( iUsedInfo, 
+                                                   iConnectOnly,
+                                                   testAccessPoint );
+        }
+    
+    // Connect
+    if ( iUsedInfo.iIapId )
+        {
+        if ( testAccessPoint )
+            {
+            iActiveWrappers->Connect( iUsedInfo.iIapId, iConnectOnly, 
+                                      EIapExpireOnDisconnect );
+            
+            }
+        else
+            {
+            iActiveWrappers->Connect( iUsedInfo.iIapId, iConnectOnly, 
+                                      EIapPersistent );
+            }
+        }
+    // pop cleanup item 
+    CleanupStack::Pop();
+    }
+
+
+// ---------------------------------------------------------------------------
+// TWsfAiController::CleanUpConnectingL
+// ---------------------------------------------------------------------------
+//
+void TWsfAiController::CleanUpConnectingL( TAny* aPtr )
+    {
+    LOG_ENTERFN( "TWsfAiController::CleanUpConnectingL" );
+    TWsfAiController* self = static_cast<TWsfAiController*>( aPtr );
+    self->iModel->SetConnecting( EFalse );
+    self->iAiModel->SetConnecting( EFalse );
+    TRAP_IGNORE( self->RefreshUiL());
+    }
+
+
+// --------------------------------------------------------------------------
+// TWsfAiController::ContinueBrowsingL
+// --------------------------------------------------------------------------
+//
+void TWsfAiController::ContinueBrowsingL()
+    {
+    LOG_ENTERFN( "TWsfAiController::ContinueBrowsingL" );
+
+    _ASS_D( iModel );
+
+    iModel->ContinueBrowsingL();
+    }
+
+
+// --------------------------------------------------------------------------
+// TWsfAiController::LaunchSearchDialogL
+// --------------------------------------------------------------------------
+//
+TBool TWsfAiController::LaunchSearchDialogL( TWsfWlanInfo& aInfo )
+    {
+    LOG_ENTERFN( "TWsfAiController::LaunchSearchDialogL" );
+    
+    _ASS_D( iAiModel );
+    _ASS_D( iUi );
+    
+    MWsfAiUiObserver* temp = iUi;
+    TInt selectedWlan( KFirstItemArrayIndex );
+    TBool success( EFalse );
+
+    TRAPD( err, success = DoLaunchSearchDialogL( selectedWlan ) );
+    
+    iUi = temp;
+    User::LeaveIfError( err );
+    
+    if ( success )
+        {
+        if ( iAiModel->Connected() )
+            {
+            // show the error note of double connections
+            HBufC* txt = StringLoader::LoadLC( 
+                                 R_QTN_WLAN_INFO_CONNECTION_ALREADY_ACTIVE );
+            
+            CAknErrorNote* errorNote = new (ELeave) CAknErrorNote;
+            errorNote->ExecuteLD( *txt );
+            
+            CleanupStack::PopAndDestroy( txt );
+            success = EFalse;
+            }
+        else
+            {
+            CWsfWlanInfoArray* wlanArray = iAiModel->GetInfoArray(); 
+            // check that the model still has the entry
+            if ( wlanArray && selectedWlan < wlanArray->Count() )
+                {
+                // get wlan info
+                aInfo = *wlanArray->At( selectedWlan );
+                }
+            else
+                {
+                // other unlisted item was selected
+                }
+            }
+        }
+    return success;
+    }
+
+
+// --------------------------------------------------------------------------
+// TWsfAiController::DoLaunchSearchDialogL
+// --------------------------------------------------------------------------
+//
+TBool TWsfAiController::DoLaunchSearchDialogL( TInt& aSelectedItem )
+    {
+    LOG_ENTERFN( "TWsfAiController::DoLaunchSearchDialogL" );
+    
+    _ASS_D( iAiModel );
+    _ASS_D( iModel );
+    
+    CWsfSearchWlansDialog* dialog = CWsfSearchWlansDialog::NewL( 
+                                                             aSelectedItem );
+    dialog->PrepareLC( R_QTN_PLUGIN_SEARCH_WLAN_NETWORKS );
+
+    // ownership of the icon array is passed
+    CAknIconArray* icons = CWsfIconArrayCreator::CreateArrayL();
+    CleanupStack::PushL( icons );
+    iAiModel->AppendBrandIconsL( *icons );
+    dialog->SetIconArrayL( icons ); // ownership of the icon array is passed
+    CleanupStack::Pop( icons );
+
+    // the dialog is ready to receive data...
+    iUi = dialog;           
+    iUi->UpdateHotSpotsL( iAiModel->FormatWlanListL( 
+									iActiveWrappers->GetWLANList(), EFalse ),
+                          			KFirstItemArrayIndex );
+    
+    return dialog->RunLD();
+    }
+    
+
+// --------------------------------------------------------------------------
+// TWsfAiController::RefreshUiL
+// --------------------------------------------------------------------------
+//
+void TWsfAiController::RefreshUiL()
+    {
+    LOG_ENTERFN( "TWsfAiController::RefreshUiL" );
+
+    _ASS_D( iAiModel );
+    _ASS_D( iUi );
+
+    if ( !iInfoArray )
+        {
+        return;
+        }
+    
+    MDesCArray* data = iUi->MultilineControl() ? 
+            iAiModel->FormatWlanListL( iInfoArray, ETrue ): 
+            iAiModel->FormatSingleLineWlanListL( iInfoArray );
+            
+    TInt currentItem = ( iModel->IsConnecting() )? 
+                          KSuppressRefreshIndex: KFirstItemArrayIndex;  
+
+    iUi->UpdateHotSpotsL( data, currentItem );    
+    }
+
+
+// --------------------------------------------------------------------------
+// TWsfAiController::EnableScanL
+// --------------------------------------------------------------------------
+//
+void TWsfAiController::EnableScanL()
+    {
+    LOG_ENTERFN( "TWsfAiController::EnableScanL" );
+    
+    _ASS_D( iAiModel );
+    _ASS_D( iModel );
+    _ASS_D( iUi );
+    
+    if ( iAiModel->ScanningOn() )
+        {
+        return;
+        }
+    iModel->EnableScanL();
+    iAiModel->SetScanningOn();
+    
+    LOG_WRITE( "DbObserver enable scan" );
+    iDbObserver->EnableScanL();
+
+    MDesCArray *data = iAiModel->FormatRefreshingL();
+    iUi->UpdateHotSpotsL( data, KFirstItemArrayIndex );
+    }
+
+
+// --------------------------------------------------------------------------
+// TWsfAiController::DisableScanL
+// --------------------------------------------------------------------------
+//
+void TWsfAiController::DisableScanL()
+    {
+    LOG_ENTERFN( "TWsfAiController::DisableScanL" );
+    
+    _ASS_D( iAiModel );
+    _ASS_D( iModel );
+    _ASS_D( iUi );
+
+    if ( !iAiModel->ScanningOn() )
+        {
+        return;
+        } 
+    iModel->DisableScanL();
+    iAiModel->SetScanningOff();
+    iDbObserver->DisableScanL();
+    iUi->DisplayEngineOffL();
+    }
+
+
+// --------------------------------------------------------------------------
+// TWsfAiController::DoHandleEngineErrorL
+// --------------------------------------------------------------------------
+//
+void TWsfAiController::DoHandleEngineErrorL( TInt aError )
+    {
+    LOG_ENTERFN( "TWsfAiController::DoHandleEngineErrorL" );
+    // start by freeing some resources... 
+    // we could start by freeing wlan search results
+    _ASS_D( iAiModel );
+
+    // show error to user...
+    iEnv->ResolveError( aError );
+    }
+
+
+// ---------------------------------------------------------------------------
+// TWsfAiController::IsWlanUsedByBrowserL
+// ---------------------------------------------------------------------------
+//
+TBool TWsfAiController::IsWlanUsedByBrowserL()
+    {
+    LOG_ENTERFN( "CWsfMainView::IsWlanUsedByBrowserL" );
+    
+    _ASS_D( iAiModel );
+    
+    const TInt KBrowserUid = 0x10008D39;
+    TUid id( TUid::Uid( KBrowserUid ) );
+    
+    // Check if the Browser application is already running.
+    TApaTaskList taskList( iEnv->WsSession() );
+    TApaTask task = taskList.FindApp( id );
+    TBool isWlanUsed( EFalse );
+    
+#ifndef __WINS__
+
+    if ( task.Exists() )
+        {
+        LOG_WRITE( "The Browser is running." );
+        // The Browser is already running.
+        // Check if the selected WLAN is connected.
+        TBool connected( iAiModel->Connected() );
+        LOG_WRITEF("Connected? %d", connected);
+
+        if ( connected )
+            {
+            RConnectionMonitor connectionMonitor;
+            connectionMonitor.ConnectL();
+            // We have to check if the Browser using the selected 
+            // connection.
+            // We have get the connectiond ID first.
+            CWsfActiveWaiter* waiter = CWsfActiveWaiter::NewL();
+            CleanupStack::PushL( waiter );
+            
+            // first call, need to get the connection parameters
+            TUint connectionCount( 0 );
+            
+            connectionMonitor.GetConnectionCount( connectionCount, 
+                                                  waiter->iStatus );
+            waiter->WaitForRequest();
+            
+            // find the connection with WLAN bearer 
+            // that will be the selected WLAN
+            TUint connectionId( 0 );
+            for ( TUint i = 1; i <= connectionCount; ++i )
+                {
+                TUint tmpConnectionId( 0 );
+                TUint subConnectionCount( 0 );
+                TConnMonBearerType bearerType( EBearerUnknown );
+                
+                connectionMonitor.GetConnectionInfo( i, 
+                                                     tmpConnectionId, 
+                                                     subConnectionCount );
+                connectionMonitor.GetIntAttribute( tmpConnectionId, 
+                                                   0, 
+                                                   KBearer, 
+                                                   ( TInt& )bearerType, 
+                                                   waiter->iStatus );
+                waiter->WaitForRequest();
+                if ( bearerType == EBearerWLAN )
+                    {
+                    connectionId = tmpConnectionId;
+                    break;
+                    }
+                }
+            // Now we have the connectiond ID.
+            LOG_WRITEF( "connectionId: %d", connectionId );
+            
+            TInt count( 0 );
+            TConnMonClientEnumBuf clientBuf;
+                
+            connectionMonitor.GetPckgAttribute( connectionId,
+                                                0,
+                                                KClientInfo,
+                                                clientBuf,
+                                                waiter->iStatus );
+            waiter->WaitForRequest();
+            if ( !waiter->iStatus.Int() )
+                {
+                count = clientBuf().iCount;
+                }
+            
+            RApaLsSession appSess;
+            TApaAppInfo appInfo;
+            
+            // The connection could be shared by several applications
+            User::LeaveIfError( appSess.Connect() );
+            
+            for ( TUint i = 0; i < count; i++ )
+                {
+                appInfo.iCaption.Zero();
+                TInt result = appSess.GetAppInfo( appInfo, 
+                                                  clientBuf().iUid[i] );
+                
+                LOG_WRITEF( "result: %d", result ); 
+                LOG_WRITEF( "iClientInfo.iUid[i].iUid: %x", 
+                             clientBuf().iUid[i].iUid );
+                
+                if ( clientBuf().iUid[i].iUid == KBrowserUid )
+                    {
+                    isWlanUsed = ETrue;
+                    }
+                }
+            CleanupStack::PopAndDestroy( waiter );
+            appSess.Close();
+            connectionMonitor.Close();
+            }                
+        }
+    else 
+        {
+        LOG_WRITE( "No Browser running." );
+        }
+        
+#endif // __WINS__
+    
+    LOG_WRITEF( "isWlanUsedByBrowser: %d", isWlanUsed ); 
+    return isWlanUsed;
+    }
+
+
+// --------------------------------------------------------------------------
+// TWsfAiController::HandleMskIfOfflineL
+// --------------------------------------------------------------------------
+//
+void TWsfAiController::HandleMskIfOfflineL()
+    {
+    LOG_ENTERFN( "TWsfAiController::HandleMskIfOfflineL" );
+    
+    // create the dialog with options
+    TInt selectedMode( 0 );
+    CAknListQueryDialog* listQuery = new (ELeave) CAknListQueryDialog( 
+                                                           &selectedMode );
+    listQuery->PrepareLC( R_QTN_AIPLUGIN_OPTIONS_OFFLINE );
+
+    if ( !listQuery->RunLD() )
+        {
+        // cancelled
+        return;
+        }
+    
+    CWsfWlanInfoArray* wlanArray = iAiModel->GetInfoArray(); 
+    
+    switch ( selectedMode )
+        {
+        case EAiOfflineStartBrowsing:
+            {
+            // Start web browsing was selected
+            if ( !wlanArray || !wlanArray->Count() ||
+                 !wlanArray->At( KFirstItemArrayIndex )->Known() )
+                {
+                // no known networks, let the user choose one
+                TWsfWlanInfo info;
+                
+                if ( LaunchSearchDialogL( info ) )
+                    {
+                    StartBrowsingL( info );
+                    }
+                }
+            else
+                {
+                // there are known networks
+                StartBrowsingL( *wlanArray->At( KFirstItemArrayIndex ) );
+                }
+            
+            break;
+            }
+            
+        case EAiOfflineConnect:
+            {
+            // Connect was selected
+            if ( !wlanArray || !wlanArray->Count() ||
+                 !wlanArray->At( KFirstItemArrayIndex )->Known() )
+                {
+                // no known networks, let the user choose one
+                TWsfWlanInfo info;
+                
+                if ( LaunchSearchDialogL( info ) )
+                    {
+                    ConnectL( info, ETrue, EFalse );
+                    }
+                }
+            else
+                {
+                // there are known networks
+                ConnectL( *wlanArray->At( KFirstItemArrayIndex ), ETrue, 
+                          EFalse );
+                }
+            
+            break;
+            }
+            
+        case EAiOfflineSearchWlans:
+            {
+            // Search for wlans was selected
+            if ( !wlanArray || !wlanArray->Count() )
+                {
+                // there are no available networks
+                CConnectionUiUtilities* connUiUtils = CConnectionUiUtilities::NewL();        
+                connUiUtils->NoWLANNetworksAvailableNote();
+                delete connUiUtils;
+                }
+
+            // launch the search dialog
+            TWsfWlanInfo info;
+            
+            if ( LaunchSearchDialogL( info ) )
+                {
+                ConnectL( info, ETrue, EFalse );
+                }
+            else
+                {
+                // User canceled Search Wlans dialog and probably did not 
+                // find anything interesting from the list - request scan
+                iActiveWrappers->RefreshScan();
+                }
+
+            break;
+            }
+            
+        case EAiOfflineDisableScan:
+            {
+            // disable the scan
+            DisableScanL();
+            break;
+            }
+            
+        default:
+            {
+            }
+        }
+    }
+
+
+
+// --------------------------------------------------------------------------
+// TWsfAiController::HandleMskIfConnectedL
+// --------------------------------------------------------------------------
+//
+void TWsfAiController::HandleMskIfConnectedL()
+    {
+    LOG_ENTERFN( "TWsfAiController::HandleMskIfConnectedL" );
+    
+    _ASS_D( iModel );
+    
+    TInt selectedMode( 0 );
+    CAknListQueryDialog* listQuery = new (ELeave) CAknListQueryDialog( 
+                                                           &selectedMode );
+    listQuery->PrepareLC( R_QTN_AIPLUGIN_OPTIONS_CONNECTED );
+    
+    if ( listQuery->RunLD() )
+        {
+        if ( selectedMode == EAiConnectedStartBrowsing )
+            {
+            StartBrowsingL( iConnectedWlan );
+            }
+        else if ( selectedMode == EAiConnectedDisconnect )
+            {
+            // disconnect wlan
+            iActiveWrappers->Disconnect();     
+            }
+        }
+    }
+
+
+// --------------------------------------------------------------------------
+// TWsfAiController::HandleMskIfConnectingL
+// --------------------------------------------------------------------------
+//
+void TWsfAiController::HandleMskIfConnectingL()
+    {
+    LOG_ENTERFN( "TWsfAiController::HandleMskIfConnectingL" );
+    
+    _ASS_D( iModel );
+    
+    TInt selectedMode( 0 );
+    CAknListQueryDialog* listQuery = new (ELeave) CAknListQueryDialog( 
+                                                           &selectedMode );
+    listQuery->PrepareLC( R_QTN_AIPLUGIN_OPTIONS_CONNECTING );
+    
+    if ( listQuery->RunLD() )
+        {
+        if ( selectedMode == EAiConnectingDisconnect )
+            {
+            if ( !iModel->IsConnecting() )
+                {
+                // disconnect wlan
+                iActiveWrappers->Disconnect();
+                }
+            else
+                {
+                // disconnect wlan
+                iModel->AbortConnectingL(); 
+                ConnectingFinishedL( KErrCancel );
+                }
+            }
+        }
+    }
+
+
+// --------------------------------------------------------------------------
+// TWsfAiController::HandleMskIfBrowsingL
+// --------------------------------------------------------------------------
+//
+void TWsfAiController::HandleMskIfBrowsingL()
+    {
+    LOG_ENTERFN( "TWsfAiController::HandleMskIfBrowsingL" );
+    
+    _ASS_D( iModel );
+    
+    TInt selectedMode( KFirstItemArrayIndex );
+    CAknListQueryDialog* listQuery = new (ELeave) CAknListQueryDialog( 
+                                                           &selectedMode );
+    listQuery->PrepareLC( R_QTN_AIPLUGIN_OPTIONS_BROWSING );
+
+    if ( listQuery->RunLD() )
+        {
+        if ( selectedMode == EAiBrowsingContinueBrowsing )
+            {
+            // launch the browser...
+            ContinueBrowsingL();
+            }
+        else if ( selectedMode == EAiBrowsingDisconnect )
+            {
+            // disconnect wlan
+            iActiveWrappers->Disconnect();
+            }
+        }
+    }
+
+// --------------------------------------------------------------------------
+// TWsfAiController::RefreshRefreshingL
+// --------------------------------------------------------------------------
+//
+void TWsfAiController::RefreshRefreshingL()
+	{
+	LOG_ENTERFN( "TWsfAiController::RefreshRefreshingL" );
+	if ( !iUi->MultilineControl() )
+	    {
+        MDesCArray *data = iAiModel->FormatRefreshingL();
+        iUi->UpdateViewL( data );
+	    }
+	else
+	    {
+        LOG_WRITE( "Multiline control in use - no update done" );
+	    }
+	}
+
+// --------------------------------------------------------------------------
+// TWsfAiController::RefreshConnectingL
+// --------------------------------------------------------------------------
+//
+void TWsfAiController::RefreshConnectingL()
+    {
+    LOG_ENTERFN( "TWsfAiController::RefreshConnectingL" );
+    if ( !iUi->MultilineControl() )
+        {
+        MDesCArray *data = iAiModel->FormatConnectingL();
+        iUi->UpdateViewL( data );
+        }
+    else       
+        {
+        LOG_WRITE( "Multiline control in use - no update done" );
+        }
+    }
+
+// End of file