diff -r 63be7eb3fc78 -r f28ada11abbf wlanutilities/wlansniffer/mainapplication/src/wsfconnecteddetailsmodel.cpp --- /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 +#include +#include +#include +#include +#include +#include +#include + +// 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 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 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 +