--- /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 <e32base.h>
+#include <etelmm.h>
+#include <mmtsy_names.h>
+#include <bt_subscribe.h>
+#include <startupdomainpskeys.h>
+#include <ctsydomainpskeys.h>
+#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 );
+ }