--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/wlanutilities/wlansniffer/mainapplication/src/wsfconnecteddetailsmodel.cpp Wed Sep 01 12:20:32 2010 +0100
@@ -0,0 +1,573 @@
+/*
+* 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: Details view Model
+*
+*/
+
+
+// EXTERNAL INCLUDES
+#include <badesca.h>
+#include <StringLoader.h>
+#include <wlansniffer.rsg>
+#include <coemain.h>
+#include <AknUtils.h>
+#include <avkon.rsg>
+#include <nifvar.h>
+#include <rconnmon.h>
+
+// INTERNAL INCLUDES
+#include "wsfwlaninfo.h"
+#include "wsfconnecteddetailsmodel.h"
+#include "wsfwlaninfoarray.h"
+#include "wsfactivewaiter.h"
+#include "wsflogger.h"
+
+
+// LOCAL DEFINITIONS
+#ifdef _DEBUG
+ _LIT( KDetailsViewModelPanic, "CWsfConnectedDetailsModel" );
+ #define _ASSERTD( cond ) __ASSERT_DEBUG( (cond), \
+ User::Panic( KDetailsViewModelPanic, __LINE__) )
+#else
+ #define _ASSERTD( cond ) {}
+#endif //_DEBUG
+
+// the size of the Details Listbox's array
+const TInt KWlanInfoGranularity = 3;
+
+// Listbox element format string
+_LIT( KListItemFormat, "%S\t%S" );
+
+// invalid connection id
+const TInt KInvalidConnectionId = 0;
+
+
+// ---------------------------------------------------------------------------
+// CWsfConnectedDetailsModel::CWsfConnectedDetailsModel
+// ---------------------------------------------------------------------------
+//
+CWsfConnectedDetailsModel::CWsfConnectedDetailsModel():
+ iIsConnActive( EFalse ),
+ iConnectionId( KInvalidConnectionId ),
+ iCoeEnv( CCoeEnv::Static() )
+ {
+ }
+
+// ---------------------------------------------------------------------------
+// CWsfConnectedDetailsModel::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CWsfConnectedDetailsModel::ConstructL()
+ {
+ LOG_ENTERFN( "CWsfConnectedDetailsModel::ConstructL" );
+ iFormattedWlanInfo = new (ELeave) CDesCArrayFlat( KWlanInfoGranularity );
+ iConnectionMonitor.ConnectL();
+ FindWlanConnectionL();
+ }
+
+// ---------------------------------------------------------------------------
+// CWsfConnectedDetailsModel::NewL
+// ---------------------------------------------------------------------------
+//
+CWsfConnectedDetailsModel* CWsfConnectedDetailsModel::NewL()
+ {
+ LOG_ENTERFN( "CWsfConnectedDetailsModel::NewL" );
+ CWsfConnectedDetailsModel* self = CWsfConnectedDetailsModel::NewLC();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CWsfConnectedDetailsModel::NewLC
+// ---------------------------------------------------------------------------
+//
+CWsfConnectedDetailsModel* CWsfConnectedDetailsModel::NewLC()
+ {
+ LOG_ENTERFN( "CWsfConnectedDetailsModel::NewLC" );
+ CWsfConnectedDetailsModel* self = new( ELeave ) CWsfConnectedDetailsModel;
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ return self;
+ }
+
+// ---------------------------------------------------------------------------
+// CWsfConnectedDetailsModel::~CWsfConnectedDetailsModel
+// ---------------------------------------------------------------------------
+//
+CWsfConnectedDetailsModel::~CWsfConnectedDetailsModel()
+ {
+ LOG_ENTERFN(
+ "CWsfConnectedDetailsModel::~CWsfConnectedDetailsModel" );
+ iConnectionMonitor.CancelAsyncRequest(EConnMonGetUintAttribute);
+ iConnectionMonitor.CancelAsyncRequest(EConnMonGetIntAttribute);
+ iConnectionMonitor.Close();
+ delete iFormattedWlanInfo;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfConnectedDetailsModel::FindWlanConnectionL
+// ---------------------------------------------------------------------------
+//
+void CWsfConnectedDetailsModel::FindWlanConnectionL()
+ {
+ LOG_ENTERFN( "CWsfConnectedDetailsModel::FindWlanConnectionL" );
+
+#ifndef __WINS__
+ // first call, need to get the connection parameters
+ iConnectionId = KInvalidConnectionId;
+ TUint connectionCount( 0 );
+
+ CWsfActiveWaiter* waiter = CWsfActiveWaiter::NewL();
+ iConnectionMonitor.GetConnectionCount( connectionCount, waiter->iStatus );
+ waiter->WaitForRequest();
+
+ if ( waiter->iStatus.Int() == KErrNone )
+ {
+ LOG_WRITEF( "connectionCount = %d", connectionCount );
+ // find the connection with WLAN bearer
+ // that will be the selected WLAN
+ for ( TUint i = 1; i <= connectionCount; ++i )
+ {
+ TUint connectionId( KInvalidConnectionId );
+ TUint subConnectionCount( 0 );
+ TConnMonBearerType bearerType( EBearerUnknown );
+
+ iConnectionMonitor.GetConnectionInfo( i,
+ connectionId,
+ subConnectionCount );
+ iConnectionMonitor.GetIntAttribute( connectionId,
+ 0,
+ KBearer,
+ ( TInt& )bearerType,
+ waiter->iStatus );
+ waiter->WaitForRequest();
+
+ if ( waiter->iStatus.Int() == KErrNone &&
+ bearerType == EBearerWLAN )
+ {
+ LOG_WRITEF( "found connection id = %d", connectionId );
+ iConnectionId = connectionId;
+ break;
+ }
+ }
+ }
+
+ if ( iConnectionId != KInvalidConnectionId )
+ {
+ iIsConnActive = ETrue;
+
+ // now we have the connectiond ID, ask the start time
+ LOG_WRITE( "querying start time..." );
+
+ TConnMonTimeBuf timeBuf;
+ iConnectionMonitor.GetPckgAttribute( iConnectionId, 0, KStartTime,
+ timeBuf, waiter->iStatus );
+ waiter->WaitForRequest();
+
+ if ( waiter->iStatus.Int() == KErrNone )
+ {
+ iStartTime = timeBuf();
+ }
+ }
+
+ delete waiter;
+
+#else // __WINS__
+
+ // for testing
+ iStartTime.UniversalTime();
+ iIsConnActive = ETrue;
+
+#endif // __WINS__
+
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfConnectedDetailsModel::FormatWlanInfoL
+// ---------------------------------------------------------------------------
+//
+CDesCArrayFlat* CWsfConnectedDetailsModel::FormatWlanInfoL(
+ TWsfWlanInfo* aWlanInfo,
+ CWsfWlanInfoArray* aWlanArray )
+ {
+ LOG_ENTERFN( "CWsfConnectedDetailsModel::FormatWlanInfoL" );
+ _ASSERTD( aWlanArray );
+
+ // While the system loads the dialog and the connection lost that could
+ // cause problems eg.: "No data" displayed
+ if ( !aWlanInfo || !VisibleWlans( *aWlanArray ) )
+ {
+ // bad wlan info or no visible wlans
+ return iFormattedWlanInfo;
+ }
+
+ iWlanInfo = *aWlanInfo;
+ iWlanArray = aWlanArray;
+
+ RefreshCurrentWlanInfoL();
+
+
+ return GetWlanDetails();
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfConnectedDetailsModel::RefreshCurrentWlanInfoL
+// ---------------------------------------------------------------------------
+//
+CDesCArrayFlat* CWsfConnectedDetailsModel::RefreshCurrentWlanInfoL()
+ {
+ LOG_ENTERFN( "CWsfConnectedDetailsModel::RefreshCurrentWlanInfoL" );
+ LOG_WRITEF( "iIsConnActive: %d", iIsConnActive );
+ _ASSERTD( iWlanArray );
+ if ( iRefreshing )
+ {
+ return iFormattedWlanInfo;
+ }
+
+ // mutual exclusion
+ iRefreshing = ETrue;
+
+#ifndef __WINS__
+ if ( iIsConnActive )
+ {
+ LOG_WRITEF( "RefreshCurrentWlanInfoL - iConnectionId: %d",
+ iConnectionId );
+
+ CWsfActiveWaiter* waiter = CWsfActiveWaiter::NewL();
+ TInt connStat( 0 );
+ iConnectionMonitor.GetIntAttribute( iConnectionId,
+ 0,
+ KConnectionStatus,
+ connStat,
+ waiter->iStatus );
+ waiter->WaitForRequest();
+
+ LOG_WRITEF( "connStat: %d", connStat );
+ LOG_WRITEF( "status.Int(): %d", waiter->iStatus.Int() );
+
+ if ( waiter->iStatus.Int() != KErrNone )
+ {
+ delete waiter;
+ iRefreshing = EFalse;
+ return iFormattedWlanInfo;
+ }
+
+ delete waiter;
+
+ // set the connection status
+ LOG_WRITEF( "connStat: %d", connStat );
+ if ( ( connStat == KLinkLayerOpen ) ||
+ ( connStat == KConnectionOpen ) )
+ {
+ iIsConnActive = ETrue;
+ }
+ else
+ {
+ iIsConnActive = EFalse;
+ }
+ }
+
+#endif // __WINS__
+
+ iFormattedWlanInfo->Reset();
+
+ // create array of connected WLAN data
+ FormatAndAppendConnectedWlanSsidL();
+ FormatAndAppendDurationL();
+ FormatAndAppendTransferredL();
+
+ iRefreshing = EFalse;
+
+ return GetWlanDetails();
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfConnectedDetailsModel::GetWlanDetails
+// ---------------------------------------------------------------------------
+//
+CDesCArrayFlat* CWsfConnectedDetailsModel::GetWlanDetails()
+ {
+ LOG_ENTERFN( "CWsfConnectedDetailsModel::GetWlanDetails" );
+#ifdef _DEBUG
+ const TInt KThatLongBufferWillMakeDo = 100;
+ for( TInt i = 0; i < iFormattedWlanInfo->MdcaCount(); i++)
+ {
+ TPtrC temp = iFormattedWlanInfo->MdcaPoint( i );
+ TBuf<KThatLongBufferWillMakeDo> tempElement = temp;
+ LOG_WRITEF( "iFormattedWlanInfo: %S", &tempElement );
+ }
+#endif
+
+ return iFormattedWlanInfo;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfConnectedDetailsModel::WlanSsid
+// ---------------------------------------------------------------------------
+//
+const TDesC8& CWsfConnectedDetailsModel::WlanSsid() const
+ {
+ return iWlanInfo.iSsid;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfConnectedDetailsModel::FormatListBoxItemLC
+// ---------------------------------------------------------------------------
+//
+HBufC* CWsfConnectedDetailsModel::FormatListBoxItemLC(
+ const TUint aResourceId,
+ const TDesC& aValueText ) const
+ {
+ LOG_ENTERFN( "CWsfConnectedDetailsModel::FormatListBoxItemLC" );
+ // hold the column name on list item
+ HBufC* columnName = NULL;
+
+ if ( aResourceId )
+ {
+ columnName = StringLoader::LoadLC( aResourceId );
+ }
+ else
+ {
+ columnName = KNullDesC().AllocLC();
+ }
+
+
+ // Holds the list box item
+ HBufC* listBoxItem = HBufC::NewL( KListItemFormat().Length()+
+ columnName->Length() +
+ aValueText.Length() );
+
+ // For formating needs
+ TPtr listBoxItemPrt = listBoxItem->Des();
+
+ // Format string ( KListItemFormat = %S\t%S )
+ listBoxItemPrt.Format( KListItemFormat, columnName, &aValueText );
+ CleanupStack::PopAndDestroy( columnName );
+ CleanupStack::PushL( listBoxItem );
+ return listBoxItem;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfConnectedDetailsModel::FormatAndAppendConnectedWlanSsidL
+// ---------------------------------------------------------------------------
+//
+void CWsfConnectedDetailsModel::FormatAndAppendConnectedWlanSsidL()
+ {
+ LOG_ENTERFN(
+ "CWsfConnectedDetailsModel::FormatAndAppendConnectedWlanSsidL" );
+ HBufC* wlanName( NULL );
+
+ if ( iWlanInfo.iNetworkName.Length() ) // If there is IAP
+ {
+ wlanName = iWlanInfo.GetIapNameAsUnicodeLC();
+ }
+ else // If there no IAP
+ {
+ wlanName = iWlanInfo.GetSsidAsUnicodeLC();
+ }
+
+ HBufC* listBoxItem = FormatListBoxItemLC(
+ R_QTN_WLAN_ITEM_HEADING_TEXT_WLAN,
+ *wlanName );
+
+ iFormattedWlanInfo->AppendL( *listBoxItem );
+ CleanupStack::PopAndDestroy( listBoxItem );
+ CleanupStack::PopAndDestroy( wlanName );
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfConnectedDetailsModel::FormatAndAppendDurationL
+// ---------------------------------------------------------------------------
+//
+void CWsfConnectedDetailsModel::FormatAndAppendDurationL()
+ {
+ LOG_ENTERFN( "CWsfConnectedDetailsModel::FormatAndAppendDurationL" );
+ HBufC* duration = FormatDurationLC();
+ HBufC* listBoxItem = FormatListBoxItemLC(
+ R_QTN_WLAN_ITEM_HEADING_DURATION,
+ *duration );
+
+ iFormattedWlanInfo->AppendL( *listBoxItem );
+ CleanupStack::PopAndDestroy( listBoxItem );
+ CleanupStack::PopAndDestroy( duration );
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfConnectedDetailsModel::FormatAndAppendTransferredL
+// ---------------------------------------------------------------------------
+//
+void CWsfConnectedDetailsModel::FormatAndAppendTransferredL()
+ {
+ LOG_ENTERFN(
+ "CWsfConnectedDetailsModel::FormatAndAppendTransferredL" );
+ HBufC* transferredData = FormatTransferredLC();
+ HBufC* listBoxItem = FormatListBoxItemLC( R_QTN_WLAN_ITEM_HEADING_TRANSF,
+ *transferredData );
+
+ iFormattedWlanInfo->AppendL( *listBoxItem );
+ CleanupStack::PopAndDestroy( listBoxItem );
+ CleanupStack::PopAndDestroy( transferredData );
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfConnectedDetailsModel::FormatDurationLC
+// ---------------------------------------------------------------------------
+//
+HBufC* CWsfConnectedDetailsModel::FormatDurationLC()
+ {
+ LOG_ENTERFN( "CWsfConnectedDetailsModel::FormatDurationLC" );
+ const TUint KTimeStringLength = 64;
+
+ if ( iIsConnActive )
+ {
+ // if connection is still active, update the duration
+ TTime now;
+ now.UniversalTime();
+ iDuration = now.MicroSecondsFrom( iStartTime );
+ }
+
+ HBufC* timeString = HBufC::NewLC( KTimeStringLength );
+ TPtr16 tempBuf( timeString->Des() );
+
+ HBufC* temp = StringLoader::LoadLC( R_QTN_TIME_DURAT_LONG_WITH_ZERO );
+
+ TTime activeTime( iDuration.Int64() );
+ activeTime.FormatL( tempBuf, *temp );
+ CleanupStack::PopAndDestroy( temp );
+
+ TPtr timePtr = timeString->Des();
+ AknTextUtils::DisplayTextLanguageSpecificNumberConversion( timePtr );
+
+ return timeString;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfConnectedDetailsModel::FormatTransferredLC
+// ---------------------------------------------------------------------------
+//
+HBufC* CWsfConnectedDetailsModel::FormatTransferredLC()
+ {
+ LOG_ENTERFN( "CWsfConnectedDetailsModel::FormatTransferredLC" );
+
+#ifndef __WINS__
+ CWsfActiveWaiter* waiter = CWsfActiveWaiter::NewL();
+
+ TUint uplink( 0 );
+ TUint downlink( 0 );
+
+ if ( iIsConnActive && iConnectionId != KInvalidConnectionId )
+ {
+ // if connection is still active, update the transmitted bytes
+ iConnectionMonitor.GetUintAttribute( iConnectionId, 0, KUplinkData,
+ uplink, waiter->iStatus );
+ waiter->WaitForRequest();
+ }
+
+ if ( waiter->iStatus.Int() == KErrNone
+ && iIsConnActive
+ && iConnectionId != KInvalidConnectionId )
+ {
+ iConnectionMonitor.GetUintAttribute( iConnectionId, 0, KDownlinkData,
+ downlink, waiter->iStatus );
+ waiter->WaitForRequest();
+
+ }
+
+ iBytesTransmitted = uplink + downlink;
+ delete waiter;
+
+#endif
+
+ const TUint KTransferredBytesFormatBuf = 16;
+ const TUint KTransferredBytesWidth = 10;
+ const TUint KTransferredBytesDecimalPlaces = 2;
+ const TUint KKiloByte = 1024;
+ TUint resId;
+
+ TBuf<KTransferredBytesFormatBuf> buf;
+
+ TReal denom( KKiloByte );
+
+ if ( iBytesTransmitted < KKiloByte*KKiloByte )
+ {
+ denom = KKiloByte;
+ resId = R_QTN_WLAN_ITEM_KB;
+ }
+ else
+ {
+ denom = KKiloByte*KKiloByte;
+ resId = R_QTN_WLAN_ITEM_MB;
+ }
+
+ TReal value = TReal( iBytesTransmitted ) / denom;
+
+ TRealFormat realFormat( KTransferredBytesWidth,
+ KTransferredBytesDecimalPlaces );
+
+ HBufC* number = HBufC::NewLC( KTransferredBytesWidth );
+ number->Des().Num( value, realFormat );
+
+ _LIT( KUdFormatLarge, "%S" );
+ buf.Format( KUdFormatLarge, number );
+ CleanupStack::PopAndDestroy( number );
+
+ HBufC* loadedTxt = StringLoader::LoadLC( resId, buf, iCoeEnv );
+
+
+ // Convert digits
+ TPtr loadTextPtr( loadedTxt->Des() );
+ AknTextUtils::DisplayTextLanguageSpecificNumberConversion( loadTextPtr );
+
+ return loadedTxt;
+ }
+
+
+// ---------------------------------------------------------------------------
+// CWsfConnectedDetailsModel::VisibleWlans
+// ---------------------------------------------------------------------------
+//
+TInt CWsfConnectedDetailsModel::VisibleWlans( CWsfWlanInfoArray& aArray )
+ {
+ LOG_ENTERFN( "CWsfConnectedDetailsModel::VisibleWlans" );
+ TInt i = 0;
+ TBool hiddenFound = EFalse;
+ TWsfWlanInfo* wlanInfo;
+ while ( i < aArray.Count() && !hiddenFound )
+ {
+ wlanInfo = aArray[i];
+ if ( wlanInfo->Hidden() && !wlanInfo->Known() )
+ {
+ hiddenFound = ETrue;
+ }
+ else
+ {
+ ++i;
+ }
+ }
+ return i;
+ }
+
+// END OF FILE
+