diff -r 000000000000 -r ff3b6d0fd310 satengine/SatServer/SystemState/src/csatnetworkregstatusmonitor.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/satengine/SatServer/SystemState/src/csatnetworkregstatusmonitor.cpp Tue Feb 02 01:11:09 2010 +0200 @@ -0,0 +1,226 @@ +/* +* 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: Network registration status monitor. +* +*/ + + +#include "csatnetworkregstatusmonitor.h" +#include "SatLog.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// C++ default constructor can NOT contain any code, that might leave. +// --------------------------------------------------------------------------- +// +CSatNetworkRegStatusMonitor::CSatNetworkRegStatusMonitor( + MSatMultiModeApi& aPhone ) : + CActive( CActive::EPriorityStandard ), + iRegistrationStatus( RMobilePhone::ERegistrationUnknown ), + iWaitingRegistrationStatus( EFalse ), + iPhone( aPhone ) + { + LOG( SIMPLE, "SATSYSTEMSTATE: \ + CSatNetworkRegStatusMonitor::CSatNetworkRegStatusMonitor calling" ) + + // Add to active scheduler. + CActiveScheduler::Add( this ); + + LOG( SIMPLE, "SATSYSTEMSTATE: \ + CSatNetworkRegStatusMonitor::CSatNetworkRegStatusMonitor exiting" ) + } + +// --------------------------------------------------------------------------- +// Two-phased constructor. +// --------------------------------------------------------------------------- +// +CSatNetworkRegStatusMonitor* CSatNetworkRegStatusMonitor::NewL( + MSatMultiModeApi& aPhone ) + { + LOG( SIMPLE, "SATSYSTEMSTATE: CSatNetworkRegStatusMonitor::NewL calling" ) + + CSatNetworkRegStatusMonitor* self = + new( ELeave ) CSatNetworkRegStatusMonitor( aPhone ); + + LOG( SIMPLE, "SATSYSTEMSTATE: CSatNetworkRegStatusMonitor::NewL exiting" ) + return self; + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CSatNetworkRegStatusMonitor::~CSatNetworkRegStatusMonitor() + { + LOG( SIMPLE, "SATSYSTEMSTATE: \ + CSatNetworkRegStatusMonitor::~CSatNetworkRegStatusMonitor calling" ) + + Cancel(); + + LOG( SIMPLE, "SATSYSTEMSTATE: \ + CSatNetworkRegStatusMonitor::~CSatNetworkRegStatusMonitor exiting" ) + } + +// --------------------------------------------------------------------------- +// Activate monitor. +// --------------------------------------------------------------------------- +// +void CSatNetworkRegStatusMonitor::Start() + { + LOG( SIMPLE, + "SATSYSTEMSTATE: CSatNetworkRegStatusMonitor::Start calling" ) + +#ifndef SAT_USE_DUMMY_TSY + if ( !IsActive() ) + { + iRegistrationStatus = RMobilePhone::ERegistrationUnknown; + + iPhone.GetNetworkRegistrationStatus( iStatus, iRegistrationStatus ); + SetActive(); + iWaitingRegistrationStatus = ETrue; + LOG( SIMPLE, "SATSYSTEMSTATE: Started" ) + } +#else + iRegistrationStatus = RMobilePhone::ERegisteredOnHomeNetwork; + iWaitingRegistrationStatus = EFalse; + LOG( SIMPLE, "SATSYSTEMSTATE: Set for WINS Emulator" ) +#endif + + LOG( SIMPLE, + "SATSYSTEMSTATE: CSatNetworkRegStatusMonitor::Start exiting" ) + } + +// --------------------------------------------------------------------------- +// Get current value of network registration status. +// --------------------------------------------------------------------------- +// +RMobilePhone::TMobilePhoneRegistrationStatus + CSatNetworkRegStatusMonitor::CurrentValue() + { + LOG( SIMPLE, + "SATSYSTEMSTATE: CSatNetworkRegStatusMonitor::CurrentValue calling" ) + + // In case network registration notification failed on startup, we need to + // check it again, if not registered on home network and we are observing + // changes in registration status ( iWaitingRegistrationStatus == EFalse ) + if ( !iWaitingRegistrationStatus && + ( RMobilePhone::ERegisteredOnHomeNetwork != iRegistrationStatus && + RMobilePhone::ERegisteredRoaming != iRegistrationStatus ) ) + { + LOG( NORMAL, "Not registered -> Going to check value again" ) + Cancel(); // Cancel pending request... + Start(); // ... and start again + } + + // Wait, initial value has not yet been got. + if ( iWaitingRegistrationStatus ) + { + LOG( SIMPLE, + "SATSYSTEMSTATE: CSatNetworkRegStatusMonitor::CurrentValue \ + iWaitingRegistrationStatus true" ) + if ( !iWait.IsStarted() ) + { + LOG( SIMPLE, + "SATSYSTEMSTATE: CSatNetworkRegStatusMonitor::CurrentValue \ + start iWait" ) + iWait.Start(); + } + } + + LOG2( SIMPLE, + "SATSYSTEMSTATE: CSatNetworkRegStatusMonitor::CurrentValue exiting \ + (%d)", iRegistrationStatus ) + return iRegistrationStatus; + } + +// ----------------------------------------------------------------------------- +// CRegistrationMonitor::DoCancel +// ----------------------------------------------------------------------------- +// +void CSatNetworkRegStatusMonitor::DoCancel() + { + LOG( SIMPLE, + "SATSYSTEMSTATE: CSatNetworkRegStatusMonitor::DoCancel calling" ) + + iPhone.CancelAsyncRequest( + EMobilePhoneNotifyNetworkRegistrationStatusChange ); + if ( iWait.IsStarted() ) + { + LOG( SIMPLE, + "SATSYSTEMSTATE: CSatNetworkRegStatusMonitor::DoCancel stop iWait" ) + iWait.AsyncStop(); + } + + LOG( SIMPLE, + "SATSYSTEMSTATE: CSatNetworkRegStatusMonitor::DoCancel exiting" ) + } + +// --------------------------------------------------------------------------- +// From class CActive. +// Marks status value valid and activates change notifier. +// --------------------------------------------------------------------------- +// +void CSatNetworkRegStatusMonitor::RunL() + { + const TInt status( iStatus.Int() ); // Asynchronous status + LOG2( SIMPLE, + "SATSYSTEMSTATE: CSatNetworkRegStatusMonitor::RunL calling (%d)", + status ) + + // Restart request + if ( KErrServerBusy == status ) + { + iPhone.GetNetworkRegistrationStatus( + iStatus, + iRegistrationStatus ); + SetActive(); + } + else if ( KErrCancel != status ) + { + // (Re)start observing + iPhone.NotifyNetworkRegistrationStatusChange( + iStatus, + iRegistrationStatus ); + SetActive(); + } + else + { + LOG( SIMPLE, " Request cancelled" ) + } + + // Still waiting first value after start. + if ( iWaitingRegistrationStatus ) + { + LOG( SIMPLE, + "SATSYSTEMSTATE: CSatNetworkRegStatusMonitor::RunL \ + iWaitingRegistrationStatus true" ) + iWaitingRegistrationStatus = EFalse; + if ( iWait.IsStarted() ) + { + LOG( SIMPLE, + "SATSYSTEMSTATE: CSatNetworkRegStatusMonitor::RunL \ + stop iWait" ) + iWait.AsyncStop(); + } + } + + LOG2( SIMPLE, + "SATSYSTEMSTATE: NetworkRegistrationStatus updated: %d", + iRegistrationStatus ) + + LOG( SIMPLE, "SATSYSTEMSTATE: CSatNetworkRegStatusMonitor::RunL exiting" ) + } + +// End of file