--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/wlanutilities/wlansniffer/mainapplication/src/wsfmainview.cpp Wed Sep 01 12:20:32 2010 +0100
@@ -0,0 +1,551 @@
+/*
+* 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 CWsfMainView.
+*
+*/
+
+//External Includes
+#include <coemain.h>
+#include <eikmenub.h>
+#include <aknViewAppUi.h>
+#include <wlansniffer.rsg>
+#include <featmgr.h>
+#include <rconnmon.h>
+#include <apgcli.h>
+
+//Internal Includes
+#include "wsfdocument.h"
+#include "wsfwlaninfoarrayvisitor.h"
+#include "wsfwlaninfoarray.h"
+#include "wsfmainview.h"
+#include "wsfmainviewmodel.h"
+#include "wsfmainviewcontainer.h"
+#include "wsfmainapplication.hrh"
+#include "wsfactivewaiter.h"
+#include "wsfappui.h"
+#include "wsfmodel.h"
+
+#include "wsflogger.h"
+
+
+// Standard construction sequence
+
+// ---------------------------------------------------------------------------
+// CWsfMainView::NewL
+// ---------------------------------------------------------------------------
+//
+CWsfMainView* CWsfMainView::NewL( TBool aIsEmbedded )
+ {
+ LOG_ENTERFN( "CWsfMainView::NewL" );
+ CWsfMainView* self = CWsfMainView::NewLC( aIsEmbedded );
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfMainView::NewLC
+// ---------------------------------------------------------------------------
+//
+CWsfMainView* CWsfMainView::NewLC( TBool aIsEmbedded )
+ {
+ LOG_ENTERFN( "CWsfMainView::NewLC" );
+ CWsfMainView* self = new ( ELeave ) CWsfMainView;
+ CleanupStack::PushL( self );
+ self->ConstructL( aIsEmbedded );
+ return self;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfMainView::CWsfMainView
+// ---------------------------------------------------------------------------
+//
+CWsfMainView::CWsfMainView(): iBrowserIapId( KErrNotFound )
+ {
+ // no implementation required
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfMainView::~CWsfMainView
+// ---------------------------------------------------------------------------
+//
+CWsfMainView::~CWsfMainView()
+ {
+ LOG_ENTERFN( "CWsfMainView::~CWsfMainView" );
+ if ( iContainer )
+ {
+ AppUi()->RemoveFromViewStack( *this, iContainer );
+ }
+
+ delete iContainer;
+ delete iModel;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfMainView::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CWsfMainView::ConstructL( TBool aIsEmbedded )
+ {
+ LOG_ENTERFN( "CWsfMainView::ConstructL" );
+ TInt actView( NULL );
+
+ if ( aIsEmbedded ) // started from CP
+ {
+ actView = R_SNIFFER_CP_MAINVIEW;
+ }
+ else
+ {
+ actView = R_SNIFFER_MAINVIEW;
+ }
+
+ BaseConstructL( actView );
+ iModel = CWsfMainViewModel::NewL();
+ iController.SetModel( iModel );
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfMainView::Id
+// ---------------------------------------------------------------------------
+//
+TUid CWsfMainView::Id() const
+ {
+ return TUid::Uid( EMainViewId );
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfMainView::HandleCommandL
+// ---------------------------------------------------------------------------
+//
+void CWsfMainView::HandleCommandL( TInt aCommand )
+ {
+ switch ( aCommand )
+ {
+ case EAknSoftkeyOk:
+ {
+ break;
+ }
+ case EAknSoftkeyBack:
+ {
+ AppUi()->HandleCommandL( EAknCmdExit );
+ break;
+ }
+ case EAknSoftkeyContextOptions:
+ {
+ LOG_WRITE( "CWsfMainView::HandleCommandL, Options" );
+ MenuBar()->SetMenuTitleResourceId( R_SNIFFER_CONTEXT_MENUBAR );
+ MenuBar()->SetMenuType( CEikMenuBar::EMenuContext );
+ MenuBar()->TryDisplayMenuBarL();
+ MenuBar()->SetMenuTitleResourceId( R_SNIFFER_MENUBAR );
+ MenuBar()->SetMenuType( CEikMenuBar::EMenuOptions );
+ break;
+ }
+ default:
+ {
+ AppUi()->HandleCommandL( aCommand );
+ break;
+ }
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfMainView::DoActivateL
+// ---------------------------------------------------------------------------
+//
+void CWsfMainView::DoActivateL( const TVwsViewId& /*aPrevViewId*/,
+ TUid /*aCustomMessageId*/,
+ const TDesC8& /*aCustomMessage*/)
+ {
+ LOG_ENTERFN( "CWsfMainView::DoActivateL" );
+ if ( !iContainer )
+ {
+ iContainer = CWsfMainViewContainer::NewL( ClientRect(), this );
+ // set icons array to list
+ iContainer->SetMopParent( this );
+ iContainer->SetPartner( iController );
+ iContainer->ListBox()->SetListBoxObserver( this );
+ AppUi()->AddToViewStackL( *this, iContainer );
+ iController.SetContainer( iContainer );
+ }
+
+ iContainer->MakeVisible( ETrue );
+ iController.RefreshL();
+ MenuBar()->SetContextMenuTitleResourceId( R_SNIFFER_CONTEXT_MENUBAR );
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfMainView::DoDeactivate
+// ---------------------------------------------------------------------------
+//
+void CWsfMainView::DoDeactivate()
+ {
+ LOG_ENTERFN( "CWsfMainView::DoDeactivate" );
+ if ( iContainer )
+ {
+ AppUi()->RemoveFromViewStack( *this, iContainer );
+ iController.SetContainer( NULL );
+ delete iContainer;
+ iContainer = NULL;
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfMainView::Controller
+// ---------------------------------------------------------------------------
+//
+MWsfMainViewControllerIf& CWsfMainView::Controller()
+ {
+ return iController;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfMainView::DynInitMenuPaneL
+// ---------------------------------------------------------------------------
+//
+void CWsfMainView::DynInitMenuPaneL( TInt aResourceId,
+ CEikMenuPane* aMenuPane )
+ {
+ LOG_ENTERFN( "CWsfMainView::DynInitMenuPaneL" );
+ LOG_WRITEF( "resource id = %d", aResourceId );
+ iController.UpdateSelectedItemL();
+
+ if ( aResourceId == R_SNIFFER_MENU )
+ {
+ LOG_WRITE( "CWsfMainView::DynInitMenuPaneL, R_SNIFFER_MENU" );
+ const CWsfDocument* doc = static_cast<const CWsfDocument*>(
+ AppUi()->Document() );
+ TBool blacklistEmpty( !doc->WlanInfoBranding().BlackListItemCount() );
+ TWsfWlanInfo *selectedItem = iController.SelectedItem();
+ CWsfWlanInfoArray *infoArray = iModel->GetInfoArray();
+
+ TBool connecting( doc->Model().IsConnecting() );
+
+ if ( !selectedItem )
+ {
+ // no real items available, but hidden item is present
+ aMenuPane->SetItemDimmed( ESnifferCmdStartBrowsing, EFalse );
+ aMenuPane->SetItemDimmed( ESnifferCmdContinueBrowsing, ETrue );
+ aMenuPane->SetItemDimmed( ESnifferCmdConnect, EFalse );
+ aMenuPane->SetItemDimmed( ESnifferCmdDisconnect, ETrue );
+ aMenuPane->SetItemDimmed( ESnifferCmdRefresh, connecting );
+
+ // dim filtering if connecting or there are no WLAN networks
+ // in coverage or there is only one network which is connected,
+ // and the filtering list does not contain any networks marked
+ // to be filtered out.
+ aMenuPane->SetItemDimmed( ESnifferCmdFilterWlans,
+ connecting ||
+ !infoArray ||
+ ( blacklistEmpty &&
+ ( !infoArray->Count() ||
+ ( infoArray->Count() == 1 &&
+ (*infoArray)[0]->Connected() ) ) ) );
+ aMenuPane->SetItemDimmed( ESnifferCmdDetails, ETrue );
+ aMenuPane->SetItemDimmed( ESnifferCmdSettings, connecting );
+ return;
+ }
+
+ TBool connected( selectedItem->Connected() );
+ TBool connectedAndUsed( EFalse );
+ if ( connected && iBrowserIapId == selectedItem->iIapId )
+ {
+ connectedAndUsed = ETrue;
+ }
+ TBool known( selectedItem->Known() );
+
+ TBool selectedItemConnecting (
+ selectedItem->ConnectionStatus() == EConnecting );
+
+ LOG_WRITEF( "connectedAndUsed = %d", connectedAndUsed );
+ LOG_WRITEF( "connected = %d", connected );
+ LOG_WRITEF( "known = %d", known );
+ LOG_WRITEF( "selectedItemConnecting = %d", selectedItemConnecting );
+ LOG_WRITEF( "connecting = %d", connecting );
+
+ aMenuPane->SetItemDimmed( ESnifferCmdStartBrowsing,
+ connectedAndUsed || selectedItemConnecting );
+ aMenuPane->SetItemDimmed( ESnifferCmdContinueBrowsing,
+ !connectedAndUsed || selectedItemConnecting );
+
+ aMenuPane->SetItemDimmed( ESnifferCmdConnect,
+ connected || selectedItemConnecting );
+
+ aMenuPane->SetItemDimmed( ESnifferCmdDisconnect,
+ !connected && !selectedItemConnecting);
+
+ aMenuPane->SetItemDimmed( ESnifferCmdRefresh, connecting );
+
+ // dim filtering if connecting or there are no WLAN networks
+ // in coverage or there is only one network which is connected,
+ // and the filtering list does not contain any networks marked
+ // to be filtered out.
+ aMenuPane->SetItemDimmed( ESnifferCmdFilterWlans,
+ connecting ||
+ !infoArray ||
+ ( blacklistEmpty &&
+ ( !infoArray->Count() ||
+ ( infoArray->Count() == 1 &&
+ (*infoArray)[0]->Connected() ) ) ) );
+
+ aMenuPane->SetItemDimmed( ESnifferCmdDetails,
+ connecting ||
+ selectedItem->Hidden() && !known );
+ aMenuPane->SetItemDimmed( ESnifferCmdSettings, connecting );
+ }
+ else if ( aResourceId == R_SNIFFER_CONTEXT_MENU )
+ {
+ LOG_WRITE( "CWsfMainView::DynInitMenuPaneL, R_SNIFFER_CONTEXT_MENU" );
+ TWsfWlanInfo *selectedItem = iController.SelectedItem();
+
+ // there must be always at least one item: "Other (unlisted)..."
+ TBool connectedAndUsed( EFalse );
+ TBool connected( EFalse );
+ TBool known( EFalse );
+ TBool hidden( ETrue );
+
+ const CWsfDocument* doc = static_cast<const CWsfDocument*>(
+ AppUi()->Document() );
+
+ TBool connecting( doc->Model().IsConnecting() );
+ TBool selectedItemConnecting( EFalse );
+
+
+ if ( selectedItem )
+ {
+ // workaround: even if the model reports no elements, we know that
+ // the hidden item must always be there
+ connected = selectedItem->Connected();
+ if ( connected && iBrowserIapId == selectedItem->iIapId )
+ {
+ connectedAndUsed = ETrue;
+ }
+ known = selectedItem->Known();
+ hidden = selectedItem->Hidden();
+ selectedItemConnecting =
+ ( selectedItem->ConnectionStatus() == EConnecting );
+ }
+
+ LOG_WRITEF( "connectedAndUsed = %d", connectedAndUsed );
+ LOG_WRITEF( "connected = %d", connected );
+ LOG_WRITEF( "known = %d", known );
+ LOG_WRITEF( "selectedItemConnecting = %d", selectedItemConnecting );
+ LOG_WRITEF( "connecting = %d", connecting );
+
+
+ aMenuPane->SetItemDimmed( ESnifferCmdStartBrowsing,
+ connectedAndUsed || selectedItemConnecting );
+ aMenuPane->SetItemDimmed( ESnifferCmdContinueBrowsing,
+ !connectedAndUsed || selectedItemConnecting );
+
+ aMenuPane->SetItemDimmed( ESnifferCmdConnect,
+ connected || selectedItemConnecting );
+ aMenuPane->SetItemDimmed( ESnifferCmdDisconnect,
+ !connected && !selectedItemConnecting );
+ aMenuPane->SetItemDimmed( ESnifferCmdDetails,
+ connecting || hidden && !known );
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfMainView::HandleListBoxEventL
+// ---------------------------------------------------------------------------
+//
+void CWsfMainView::HandleListBoxEventL( CEikListBox* /*aListBox*/,
+ TListBoxEvent aEventType )
+ {
+ LOG_ENTERFN( "CWsfMainView::HandleListBoxEventL" );
+ LOG_WRITEF( "aEventType = %d", aEventType );
+ switch ( aEventType )
+ {
+ case EEventEnterKeyPressed:
+ case EEventItemSingleClicked:
+ {
+ HandleCommandL( EAknSoftkeyContextOptions );
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfMainView::SelectionKeyPressed
+// ---------------------------------------------------------------------------
+//
+void CWsfMainView::SelectionKeyPressed()
+ {
+ iSelectionKey = ETrue;
+ }
+
+// ---------------------------------------------------------------------------
+// CWsfMainView::UpdateBrowserUsageInfoL
+// ---------------------------------------------------------------------------
+//
+void CWsfMainView::UpdateBrowserUsageInfoL()
+ {
+ LOG_ENTERFN( "CWsfMainView::UpdateBrowserUsageInfoL" );
+ iBrowserIapId = BrowserIapIdL();
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfMainView::BrowserIapIdL
+// ---------------------------------------------------------------------------
+//
+TInt CWsfMainView::BrowserIapIdL()
+ {
+ LOG_ENTERFN( "CWsfMainView::BrowserIapIdL" );
+
+ const TInt KBrowserUid = 0x10008D39;
+ TUid id( TUid::Uid( KBrowserUid ) );
+
+ // Check if the Browser application is already running.
+ TApaTaskList taskList( iEikonEnv->WsSession() );
+ TApaTask task = taskList.FindApp( id );
+ TInt browserIapId( KErrNotFound );
+
+#ifndef __WINS__
+
+ if ( task.Exists() )
+ {
+ LOG_WRITE( "The Browser is running." );
+ // The Browser is already running.
+ TWsfWlanInfo* firstItem = NULL;
+
+ CWsfWlanInfoArray *infoArray = iModel->GetInfoArray();
+ if ( infoArray )
+ {
+ firstItem = infoArray->At( 0 );
+ }
+
+ TBool connected( EFalse );
+ if( firstItem )
+ {
+ // first item always holds the connected network
+ connected = firstItem->Connected();
+ }
+ LOG_WRITEF("Selected network Connected? %d", connected);
+
+ if ( connected )
+ {
+ RConnectionMonitor connectionMonitor;
+ connectionMonitor.ConnectL();
+ CleanupClosePushL( connectionMonitor );
+ // 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 );
+
+ TConnMonClientEnumBuf clientBuf;
+
+ connectionMonitor.GetPckgAttribute( connectionId,
+ 0,
+ KClientInfo,
+ clientBuf,
+ waiter->iStatus );
+ waiter->WaitForRequest();
+ TInt count( 0 );
+ if ( !waiter->iStatus.Int() )
+ {
+ count = clientBuf().iCount;
+ }
+
+ RApaLsSession appSess;
+ TApaAppInfo appInfo;
+
+ // The connection could be shared by several applications
+ User::LeaveIfError( appSess.Connect() );
+ // No need for CleanupClosePushL(appSess) cause nothing leaves.
+
+ for ( TInt 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 )
+ {
+ browserIapId = firstItem->iIapId;
+ }
+ }
+ appSess.Close();
+
+ CleanupStack::PopAndDestroy( waiter );
+ CleanupStack::PopAndDestroy( &connectionMonitor );
+ }
+ }
+ else
+ {
+ LOG_WRITE( "No Browser running." );
+ }
+
+#endif // __WINS__
+
+ LOG_WRITEF( "browserIapId: %d", browserIapId );
+ return browserIapId;
+ }
+
+
+
+// End of file