diff -r 000000000000 -r c40eb8fe8501 wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlmplatformdata.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wlan_bearer/wlanengine/wlan_symbian/wlanengine_symbian_3.1/src/wlmplatformdata.cpp Tue Feb 02 02:03:13 2010 +0200 @@ -0,0 +1,382 @@ +/* +* Copyright (c) 2002-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Interface class to CenRep and PubSub +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include "wlaninternalpskeys.h" +#include "wlmplatformdata.h" +#include "am_debug.h" + +// ================= MEMBER FUNCTIONS ======================= + +// C++ default constructor can NOT contain any code, that +// might leave. +// +CWlmPlatformData::CWlmPlatformData( MWlmSystemNotify& aCallback ) : + iBtConnections( NULL ), + iCallback( aCallback ), + iSystemMode( EWlanSystemStartupInProgress ), + iBtConnectionCount( 0 ), + iCurrentIcon( EWlmIconStatusNotAvailable ), + iIsStartupComplete( EFalse ), + iIsInOffline( EFalse ), + iIsEmergencyCall( EFalse ) + { + DEBUG( "CWlmPlatformData::CWlmPlatformData()" ); + } + +// Symbian 2nd phase constructor can leave. +void CWlmPlatformData::ConstructL() + { + DEBUG( "CWlmPlatformData::ConstructL()" ); + + // Allow everyone to read the P&S properties. + _LIT_SECURITY_POLICY_PASS(KWlmPSReadPolicy); //lint !e648 + // Require SID for writing the P&S properties. + _LIT_SECURITY_POLICY_S0(KWlmPSWritePolicy, KPSUidWlan.iUid); //lint !e648 + + // Create subscriber for system state + iPropertySystemState = CWlmPlatformSubscriber::NewL( + EWlmSubscribeTypePubSub, *this, + KPSUidStartup, KPSGlobalSystemState ); + iPropertySystemState->IssueRequest(); + + // Create subscriber for BT connections + iBtConnections = CWlmPlatformSubscriber::NewL( + EWlmSubscribeTypePubSub, *this, + KPropertyUidBluetoothCategory, KPropertyKeyBluetoothGetPHYCount ); + iBtConnections->IssueRequest(); + + // Create subscriber for Emergency Call Info. + iEmergencyCall = CWlmPlatformSubscriber::NewL( + EWlmSubscribeTypePubSub, *this, + KPSUidCtsyEmergencyCallInfo, KCTSYEmergencyCallInfo ); + iEmergencyCall->IssueRequest(); + + // Create PubSub property for publishing MAC address + TInt ret( KErrNone ); + ret = RProperty::Define( KPSWlanMacAddress, KPSWlanMacAddressType, + KWlmPSReadPolicy, KWlmPSWritePolicy, KPSWlanMacAddressLength ); + if ( ret != KErrAlreadyExists ) + { + User::LeaveIfError( ret ); + } + User::LeaveIfError( iPsMacAddress.Attach( KPSUidWlan, + KPSWlanMacAddress, EOwnerThread ) ); + + // Create PubSub property for publishing WLAN indicator information + ret = RProperty::Define( KPSWlanIndicator, KPSWlanIndicatorType, + KWlmPSReadPolicy, KWlmPSWritePolicy ); + if ( ret != KErrAlreadyExists ) + { + User::LeaveIfError( ret ); + } + User::LeaveIfError( iPsIndicator.Attach( KPSUidWlan, + KPSWlanIndicator, EOwnerThread ) ); + } + +// --------------------------------------------------------- +// CWlmPlatformData::NewL +// --------------------------------------------------------- +// +CWlmPlatformData* CWlmPlatformData::NewL( MWlmSystemNotify& aCallback ) + { + CWlmPlatformData* self = new (ELeave) CWlmPlatformData( aCallback ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------- +// CWlmPlatformData::~CWlmPlatformData +// --------------------------------------------------------- +// +CWlmPlatformData::~CWlmPlatformData() + { + DEBUG( "CWlmPlatformData::~CWlmPlatformData()" ); + + iPsIndicator.Close(); + RProperty::Delete( KPSUidWlan, KPSWlanIndicator ); + iPsMacAddress.Close(); + RProperty::Delete( KPSUidWlan, KPSWlanMacAddress ); + delete iPropertySystemState; + delete iBtConnections; + delete iEmergencyCall; + } + +// --------------------------------------------------------- +// CWlmPlatformData::SetIconState +// Status : Draft +// --------------------------------------------------------- +// +TInt CWlmPlatformData::SetIconState( TWlmIconStatus aStatus ) + { + DEBUG( "CWlmPlatformData::SetIconState()" ); + + TInt ret( KErrNone ); + if ( aStatus != iCurrentIcon ) + { + switch ( aStatus ) + { + case EWlmIconStatusNotAvailable: + DEBUG( "Setting icon to EPSWlanIndicatorNone" ); + ret = iPsIndicator.Set( EPSWlanIndicatorNone ); + break; + case EWlmIconStatusAvailable: + DEBUG( "Setting icon to EPSWlanIndicatorAvailable" ); + ret = iPsIndicator.Set( EPSWlanIndicatorAvailable ); + break; + case EWlmIconStatusConnected: + DEBUG( "Setting icon to EPSWlanIndicatorActive" ); + ret = iPsIndicator.Set( EPSWlanIndicatorActive ); + break; + case EWlmIconStatusConnectedSecure: + DEBUG( "Setting icon to EPSWlanIndicatorActiveSecure" ); + ret = iPsIndicator.Set( EPSWlanIndicatorActiveSecure ); + break; + default: + DEBUG( "CWlmPlatformData::SetIconState() - unsupported status" ); + ret = KErrNotSupported; + break; + } + iCurrentIcon = aStatus; + } + return ret; + } + +// --------------------------------------------------------- +// CWlmPlatformData::HandlePropertyChangedL +// Status : Draft +// --------------------------------------------------------- +// +void CWlmPlatformData::HandlePropertyChangedL( + const TUid& aCategory, + const TUint aKey ) + { + DEBUG( "CWlmPlatformData::HandlePropertyChangedL()" ); + DEBUG2( "CWlmPlatformData::HandlePropertyChangedL() - aCategory = %08x, aKey = %08x", + aCategory.iUid, aKey ); + + if ( aCategory == KPropertyUidBluetoothCategory && + aKey == KPropertyKeyBluetoothGetPHYCount ) + { + TInt value( 0 ); + iBtConnections->Get( value ); + + DEBUG2( "CWlmPlatformData::HandlePropertyChangedL() - BT count has changed from %u to %u", + iBtConnectionCount, value ); + + if ( !iBtConnectionCount && value ) + { + DEBUG( "CWlmPlatformData::HandlePropertyChangedL() - BT connection established" ); + iCallback.BtConnectionEstablished(); + } + else if ( iBtConnectionCount && !value ) + { + DEBUG( "CWlmPlatformData::HandlePropertyChangedL() - BT connection disconnected" ); + iCallback.BtConnectionDisabled(); + } + iBtConnectionCount = value; + } + else if ( aCategory == KPSUidStartup && + aKey == KPSGlobalSystemState ) + { + TInt value( 0 ); + iPropertySystemState->Get( value ); + + TWlanSystemMode enumValue( iSystemMode ); + + switch ( value ) + { + case ESwStateNormalRfOn: + enumValue = EWlanSystemNormal; + iIsStartupComplete = ETrue; + iIsInOffline = EFalse; + break; + case ESwStateNormalRfOff: + enumValue = EWlanSystemFlight; + iIsStartupComplete = ETrue; + iIsInOffline = ETrue; + break; + case ESwStateNormalBTSap: + enumValue = EWlanSystemNormal; + iIsStartupComplete = ETrue; + iIsInOffline = EFalse; + break; + } + + /** + * Do not change the SystemMode during emergency call, + * it will be updated after emergency call. + */ + if ( !iIsEmergencyCall && iSystemMode != enumValue ) + { + DEBUG2( "CWlmPlatformData::HandlePropertyChangedL() - system mode has changed from %u to %u", + iSystemMode, enumValue ); + + iCallback.SystemModeChanged( iSystemMode, enumValue ); + iSystemMode = enumValue; + } + } + else if( aCategory == KPSUidCtsyEmergencyCallInfo && + aKey == KCTSYEmergencyCallInfo ) + { + TInt value( 0 ); + iEmergencyCall->Get( value ); + + DEBUG1( "CWlmPlatformData::HandlePropertyChangedL() - KCTSYEmergencyCallInfo changed to %u", + value ); + + /** + * Emergency call has been established + */ + if( value && !iIsEmergencyCall) + { + iIsEmergencyCall = ETrue; + TWlanSystemMode enumValue( EWlanSystemNormal ); + iCallback.EmergencyCallEstablished(); + DEBUG2( "CWlmPlatformData::HandlePropertyChangedL() - system mode has been changed from %u to %u", + iSystemMode, enumValue ); + iSystemMode = enumValue; + } + /** + * Emergency call has ended + */ + else if (!value && iIsEmergencyCall ) + { + iIsEmergencyCall = EFalse; + /** + * Startup is not yet done + */ + if ( !iIsStartupComplete ) + { + iCallback.EmergencyCallCompleted ( EWlanSystemStartupInProgress ); + DEBUG2( "CWlmPlatformData::HandlePropertyChangedL() - system mode has been changed from %u to %u", + iSystemMode, EWlanSystemStartupInProgress ); + iSystemMode = EWlanSystemStartupInProgress; + } + else + { + TWlanSystemMode enumValue( EWlanSystemNormal ); + if ( iIsInOffline ) + { + enumValue = EWlanSystemFlight; + } + iCallback.EmergencyCallCompleted ( enumValue ); + DEBUG2( "CWlmPlatformData::HandlePropertyChangedL() - system mode has been changed from %u to %u", + iSystemMode, enumValue ); + iSystemMode = enumValue; + } + } + } + } + +// --------------------------------------------------------- +// CWlmPlatformData::GetCurrentOperatorMccL +// Status : Draft +// --------------------------------------------------------- +// +void CWlmPlatformData::GetCurrentOperatorMccL( TUint& aCountryCode ) + { + DEBUG( "CWlmPlatformData::GetCurrentOperatorMccL()" ); + + RTelServer server; + TInt error = server.Connect(); + DEBUG1( "Connect returned with %d", error ); + User::LeaveIfError( error ); + CleanupClosePushL( server ); + + error = server.LoadPhoneModule( KMmTsyModuleName ); + DEBUG1( "LoadPhoneModule returned with %d", error ); + User::LeaveIfError( error ); + + TInt numPhones( 0 ); + error = server.EnumeratePhones( numPhones ); + DEBUG1( "EnumeratePhones returned with %d", error ); + DEBUG1( "Number of phones enumerated = %d", numPhones ); + User::LeaveIfError( error ); + if ( !numPhones ) + { + User::Leave( KErrNotFound ); + } + + RTelServer::TPhoneInfo phoneInfo; + error = server.GetPhoneInfo( 0, phoneInfo ); + DEBUG1( "GetPhoneInfo returned with %d", error ); + User::LeaveIfError( error ); + + RMobilePhone phone; + error = phone.Open( server, phoneInfo.iName ); + DEBUG1( "Open returned with %d", error ); + User::LeaveIfError( error ); + CleanupClosePushL( phone ); + + TRequestStatus status; + RMobilePhone::TMobilePhoneNetworkInfoV1 network; + RMobilePhone::TMobilePhoneNetworkInfoV1Pckg networkPckg( network ); + RMobilePhone::TMobilePhoneLocationAreaV1 area; + phone.GetCurrentNetwork( status, networkPckg, area ); + User::WaitForRequest( status ); + DEBUG1( "GetCurrentNetwork returned with %d", status.Int() ); + User::LeaveIfError( status.Int() ); + + TLex lex( network.iCountryCode ); + User::LeaveIfError( lex.Val( aCountryCode ) ); + + CleanupStack::PopAndDestroy( &phone ); + CleanupStack::PopAndDestroy( &server ); + + DEBUG( "CWlmPlatformData::GetCurrentOperatorMccL() done" ); + } + +// --------------------------------------------------------- +// CWlmPlatformData::UpdateSystemStatuses +// Status : Draft +// --------------------------------------------------------- +// +void CWlmPlatformData::UpdateSystemStatuses() + { + DEBUG( "CWlmPlatformData::UpdateSystemStatuses()" ); + + TRAP_IGNORE( HandlePropertyChangedL( KPropertyUidBluetoothCategory, + KPropertyKeyBluetoothGetPHYCount ) ); + TRAP_IGNORE( HandlePropertyChangedL( KPSUidStartup, + KPSGlobalSystemState ) ); + } + +// --------------------------------------------------------- +// CWlmPlatformData::PublishMacAddress +// Status : Draft +// --------------------------------------------------------- +// +TInt CWlmPlatformData::PublishMacAddress( TMacAddress& aMacAddr ) + { + DEBUG( "CWlmPlatformData::PublishMacAddress()" ); + + DEBUG( "BSSID:" ); + DEBUG_MAC( aMacAddr.iMacAddress ); + + TPtrC8 mac( aMacAddr.iMacAddress, KPSWlanMacAddressLength ); + return iPsMacAddress.Set( mac ); + }