diff -r 000000000000 -r ff3b6d0fd310 networkhandling/networkhandlingengine/NetworkHandlingSrc/CNWNetworkModeMonitor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/networkhandling/networkhandlingengine/NetworkHandlingSrc/CNWNetworkModeMonitor.cpp Tue Feb 02 01:11:09 2010 +0200 @@ -0,0 +1,379 @@ +/* +* 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 "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: This module contains the implementation of CNWNetworkModeMonitor class +* member functions. +* +*/ + + +// INCLUDE FILES +#include "CNWMessageHandler.h" +#include "CNWNetworkModeMonitor.h" +#include "NWHandlingEngine.h" +#include "NWPanic.pan" +#include "NWLogger.h" + + + +// ================= MEMBER FUNCTIONS ========================================= + +// ---------------------------------------------------------------------------- +// CNWNetworkModeMonitor::CNWNetworkModeMonitor +// C++ default constructor can NOT contain any code, that +// might leave. +// ---------------------------------------------------------------------------- +// +CNWNetworkModeMonitor::CNWNetworkModeMonitor + ( + CNWMessageHandler& aOwner, // ref. to class owner + RMobilePhone& aPhone, // ref. to mobile phone + TNWInfo& aNetworkInfo, // ref. to network info struct + RMmCustomAPI& aCustomAPI ) //ref. to customAPI + : CNWNetworkMonitorBase( aOwner, + aPhone, + aNetworkInfo, + aCustomAPI ) + { + NWLOGSTRING( KNWOBJECT, + "NW: CNWNetworkModeMonitor::CNWNetworkModeMonitor() Begin." ); + + CActiveScheduler::Add( this ); + + NWLOGSTRING( KNWOBJECT, + "NW: CNWNetworkModeMonitor::CNWNetworkModeMonitor() End" ); + } + +// ---------------------------------------------------------------------------- +// CNWNetworkModeMonitor::ConstructL +// Symbian 2nd phase constructor can leave. +// ---------------------------------------------------------------------------- +// +void CNWNetworkModeMonitor::ConstructL() + { + NWLOGSTRING( KNWOBJECT, + "NW: CNWNetworkModeMonitor::ConstructL() Begin." ); + + RProperty::TType type( RProperty::EInt ); + TSecurityPolicy readPolicy( ECapability_None ); + TSecurityPolicy writePolicy( ECapabilityWriteDeviceData ); + TInt error = RProperty::Define( KPSUidNetworkInfo, + KNWTelephonyNetworkMode, + type, + readPolicy, + writePolicy ); + + //An error of KErrAlready exists should be ignored, as this only + //indicates that some other code int system is also interested in the + //value and has created the property. + if ( (error != KErrNone) && (error != KErrAlreadyExists) ) + { + NWLOGSTRING2( KNWOBJECT, + "NW: CNWNetworkModeMonitor::CNWNetworkModeMonitor(), error\ + code = %d.", error ); + User::Leave(error); + } + + NWLOGSTRING( KNWOBJECT, + "NW: CNWNetworkModeMonitor::ConstructL() End." ); + } + +// ---------------------------------------------------------------------------- +// CNWNetworkModeMonitor::NewL +// Two-phased constructor. +// ---------------------------------------------------------------------------- +// +EXPORT_C CNWNetworkModeMonitor* CNWNetworkModeMonitor::NewL( + CNWMessageHandler& aOwner, + RMobilePhone& aPhone, + TNWInfo& aNetworkInfo, + RMmCustomAPI& aCustomAPI ) + { + NWLOGSTRING( KNWOBJECT, "NW: CNWNetworkModeMonitor::NewL() Begin." ); + CNWNetworkModeMonitor* self = + new( ELeave ) CNWNetworkModeMonitor( aOwner, + aPhone, + aNetworkInfo, + aCustomAPI ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + NWLOGSTRING( KNWOBJECT, "NW: CNWNetworkModeMonitor::NewL() End." ); + return self; + } + +// Destructor +CNWNetworkModeMonitor::~CNWNetworkModeMonitor() + { + NWLOGSTRING( KNWOBJECT, + "NW: CNWNetworkModeMonitor::~CNWNetworkModeMonitor start." ); + + Cancel(); + + NWLOGSTRING( KNWOBJECT, + "NW: CNWNetworkModeMonitor::~CNWNetworkModeMonitor complete." ); + } + +// ---------------------------------------------------------------------------- +// CNWNetworkModeMonitor::DoCancel +// Cancels the pending async. command. +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +void CNWNetworkModeMonitor::DoCancel() + { + NWLOGSTRING( KNWREQEND, + "NW: CNWNetworkModeMonitor::DoCancel: \ + Request RMobilePhone::CancelAsyncRequest(\ + EMobilePhoneNotifyModeChange)" ); + + iPhone.CancelAsyncRequest( EMobilePhoneNotifyModeChange ); + + NWLOGSTRING( KNWOBJECT, + "NW: CNWNetworkModeMonitor::DoCancel() End." ); + } + +// ---------------------------------------------------------------------------- +// CNWNetworkModeMonitor::RunL +// Receives the completion of the pending async. command, saves possible +// values from async. function call and sends notification to CNWSession object. +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +void CNWNetworkModeMonitor::RunL() + { + NWLOGSTRING2( KNWREQEND, + "CNWNetworkModeMonitor::RunL() Begin, iStatus = %d", iStatus.Int()); + + if ( iStatus != KErrNone ) + { + NWLOGSTRING2( KNWERROR, + "NW: CNWNetworkModeMonitor::RunL, Unknown error situation, \ + iStatus = %d", iStatus.Int() ); + iIsInitialised = EFalse; // Ensure we get current net info. + } + else + { + UpdateNetworkInfo(); + UpdateNetworkMode(); + iOwner.SendMessage ( MNWMessageObserver::ENWMessageNetworkModeChange ); + iOwner.SendMessage( MNWMessageObserver::ENWMessageNetworkInfoChange ); + iIsInitialised = ETrue; + } + // Check if monitor can be restarted. + if ( iStatus != KErrCancel && iStatus != KErrServerTerminated ) + { + IssueRequest(); + } + + NWLOGSTRING( KNWOBJECT, + "NW: CNWNetworkModeMonitor::RunL() End." ); + } + +// ---------------------------------------------------------------------------- +// CNWNetworkModeMonitor::UpdateNetworkInfo +// Updates MMEtel network mode value to NW value and assigns the value to +// the TNWInfo structure. +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +// +void CNWNetworkModeMonitor::UpdateNetworkInfo() + { + NWLOGSTRING2( KNWREQEND, + "CNWNetworkModeMonitor::UpdateNetworkInfo() Begin, iNetworkMode = %d", + iNetworkMode ); + + switch ( iNetworkMode ) + { + case RMobilePhone::ENetworkModeUnknown: + { + iNWNetworkInfo.iNetworkMode = ENWModeUnknown; + break; + } + case RMobilePhone::ENetworkModeUnregistered: + { + iNWNetworkInfo.iNetworkMode = ENWModeUnregistered; + break; + } + case RMobilePhone::ENetworkModeGsm: + { + iNWNetworkInfo.iNetworkMode = ENWModeGsm; + break; + } + case RMobilePhone::ENetworkModeAmps: + { + iNWNetworkInfo.iNetworkMode = ENWModeAmps; + break; + } + case RMobilePhone::ENetworkModeCdma95: + { + iNWNetworkInfo.iNetworkMode = ENWModeCdma95; + break; + } + case RMobilePhone::ENetworkModeCdma2000: + { + iNWNetworkInfo.iNetworkMode = ENWModeCdma2000; + break; + } + case RMobilePhone::ENetworkModeWcdma: + { + iNWNetworkInfo.iNetworkMode = ENWModeWcdma; + break; + } + case RMobilePhone::ENetworkModeTdcdma: + { + iNWNetworkInfo.iNetworkMode = ENWModeTdcdma; + break; + } + default: + { + iNWNetworkInfo.iNetworkMode = ENWModeUnknown; + __ASSERT_DEBUG( !iNetworkMode, Panic( ENWPanicInvalidMode ) ); + } + } + + NWLOGSTRING( KNWOBJECT, + "NW: CNWNetworkModeMonitor::UpdateNetworkInfo() End." ); + } + +// ---------------------------------------------------------------------------- +// CNWNetworkModeMonitor::IssueRequest +// Executes the async. NotifyModeChange function. +// If the network mode monitor is not yet initialised, gets the initial +// mode with sync. GetCurrentModen function. Then starts monitoring +// the mode changes. +// (other items were commented in a header). +// ---------------------------------------------------------------------------- +void CNWNetworkModeMonitor::IssueRequest() + { + NWLOGSTRING( KNWOBJECT, + "NW: CNWNetworkModeMonitor::IssueRequest() Begin." ); + + if ( !IsActive() ) + { + // Start monitoring mode changes. + NWLOGSTRING( KNWREQOUT, + "NW: CNWNetworkModeMonitor::IssueRequest: Request RMobilePhone::\ + NotifyModeChange" ); + iPhone.NotifyModeChange( iStatus, iNetworkMode ); + SetActive(); + + // Get initial value for the mode, if not initialised yet. + if ( !iIsInitialised ) + { + iIsInitialised = ETrue; + TInt error = iPhone.GetCurrentMode( iNetworkMode ); + if ( error ) + { + NWLOGSTRING2( KNWERROR, + "NW: CNWNetworkModeMonitor::IssueRequest > RMobilePhone::\ + GetCurrentMode, ErrorCode = %d", error ); + return; + } + else + { + UpdateNetworkMode(); + NWLOGSTRING2( KNWREQEND, "CNWNetworkModeMonitor::IssueRequest(), iNetworkMode = %d", iNetworkMode ); + } + } + } + else + { + NWLOGSTRING( KNWERROR, + "NW: CNWNetworkModeMonitor::IssueRequest: Already active" ); + } + + NWLOGSTRING( KNWOBJECT, + "NW: CNWNetworkModeMonitor::IssueRequest() End." ); + } + +// ---------------------------------------------------------------------------- +// CNWNetworkModeMonitor::UpdateNetworkModeL +// Update networkMode PS key +// ---------------------------------------------------------------------------- +void CNWNetworkModeMonitor::UpdateNetworkMode() + { + NWLOGSTRING( KNWOBJECT, + "NW: CNWNetworkModeMonitor::UpdateNetworkMode() Begin." ); + + TInt networkMode( ENWNetworkModeUnknown ); + + switch ( iNetworkMode ) + { + case RMobilePhone::ENetworkModeUnknown: + case RMobilePhone::ENetworkModeUnregistered: + { + networkMode = ENWNetworkModeUnknown; + break; + } + case RMobilePhone::ENetworkModeGsm: + { + networkMode = ENWNetworkModeGsm; + break; + } + case RMobilePhone::ENetworkModeAmps: + case RMobilePhone::ENetworkModeCdma95: + case RMobilePhone::ENetworkModeCdma2000: + { + networkMode = ENWNetworkModeCdma; + break; + } + case RMobilePhone::ENetworkModeWcdma: + case RMobilePhone::ENetworkModeTdcdma: + { + networkMode = ENWNetworkModeWcdma; + break; + } + default: + { + networkMode = ENWNetworkModeUnknown; + __ASSERT_DEBUG( !iNetworkMode, Panic( ENWPanicInvalidMode ) ); + } + } + + TInt err = RProperty::Set( + KPSUidNetworkInfo, KNWTelephonyNetworkMode, networkMode ); + + if ( err != KErrNone ) + { + NWLOGSTRING2( KNWOBJECT, + "NW: CNWNetworkModeMonitor::UpdateNetworkMode(), error code = \ + %d.", err ); + + RProperty::Delete( KPSUidNetworkInfo, KNWTelephonyNetworkMode ); + } + else + { + NWLOGSTRING( KNWREQIN, + "NW: CNWNetworkModeMonitor::RunL: RProperty::Set() called" ); + } + + NWLOGSTRING( KNWOBJECT, + "NW: CNWNetworkModeMonitor::UpdateNetworkMode() End." ); + } + +// ---------------------------------------------------------------------------- +// CNWNetworkModeMonitor::RunError +// ---------------------------------------------------------------------------- +// +TInt CNWNetworkModeMonitor::RunError( TInt /*aError*/ ) + { + NWLOGSTRING( KNWERROR, "NW:CNWNetworkModeMonitor::RunL() Called\ + : rproperty::set error" ); + + return KErrNone; + } + +// End of File