clock/clockengines/clockserver/server/src/clockservermcclistener.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 06 Jul 2010 14:14:56 +0300
changeset 50 579cc610882e
parent 18 c198609911f9
permissions -rw-r--r--
Revision: 201025 Kit: 2010127

/*
* Copyright (c) 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:   The source file of the CClkMccListener class.
*
*/

// System includes
#include <mmtsy_names.h>
#include <e32property.h>

// User includes
#include "clockservermcclistener.h"
#include "clockservermccobserver.h"
#include "clock_debug.h"

// Constants
const TInt KZeroIndex( 0 );
const TInt KMinMccValue( 199 );
const TInt KMaxMccValue( 800 );

// Literals
_LIT( KNoName, "" );

// ---------------------------------------------------------
// CClkMccListener::NewL()
// rest of the details are commented in the header
// ---------------------------------------------------------
//
CClkMccListener* CClkMccListener::NewL( MClkSrvMccObserver* aObserver )
    {
    __PRINTS( "CClkMccListener::NewL - Entry" );
    
    CClkMccListener* mccListener = new( ELeave ) CClkMccListener( aObserver );
    CleanupStack::PushL( mccListener );
    
    mccListener->ConstructL();
        
    CleanupStack::Pop( mccListener );
    
    __PRINTS( "CClkMccListener::NewL - Exit" );
    
    return mccListener;
    }

// ---------------------------------------------------------
// CClkMccListener::~CClkMccListener()
// rest of the details are commented in the header
// ---------------------------------------------------------
//
CClkMccListener::~CClkMccListener()
	{
	__PRINTS( "CClkMccListener::~CClkMccListener - Entry" );
	
	// No implementation yet.
	
	__PRINTS( "CClkMccListener::~CClkMccListener - Exit" );
	}

// ---------------------------------------------------------
// CClkMccListener::CClkMccListener()
// rest of the details are commented in the header
// ---------------------------------------------------------
//
CClkMccListener::CClkMccListener( MClkSrvMccObserver* aObserver ) 
						: CActive( EPriorityStandard ),
						  iIsInitialized( EFalse ),
						  iNetworkInfoPckg( iNetworkInfo ),
						  iCurrentMcc( KNoName ),
						  iObserver( aObserver )
	{
	__PRINTS( "CClkMccListener::CClkMccListener - Entry" );
	
	// No implementation yet.
	
	__PRINTS( "CClkMccListener::CClkMccListener - Exit" );
	}

// ---------------------------------------------------------
// CClkMccListener::ConstructL()
// rest of the details are commented in the header
// ---------------------------------------------------------
//
void CClkMccListener::ConstructL()
	{
	__PRINTS( "CClkMccListener::ConstructL - Entry" );
	
	// Add the active object to the scheduler.
	CActiveScheduler::Add( this );
	
	// Constants
	const TInt KTriesToConnectServer( 10 );
	const TInt KTimeBeforeRetryingServerConnection( 100000 );
	
	TInt thisTry( 0 );
	TInt returnVal( KErrNone );
	
	// Connect to the ETelServer.
	while ( ( returnVal = iEtelServer.Connect() ) != KErrNone &&
			( thisTry++ ) <= KTriesToConnectServer )
		{
		User::After( KTimeBeforeRetryingServerConnection );
		}
	User::LeaveIfError( returnVal );
	
	// Load the phone module.
	User::LeaveIfError( iEtelServer.LoadPhoneModule( KMmTsyModuleName ) );
	
	RTelServer::TPhoneInfo phoneInfo;
	TInt numPhone;
	User::LeaveIfError( iEtelServer.EnumeratePhones( numPhone ) );
	TName tsyName;
	
	// 
	for( TInt index( KZeroIndex ); index < numPhone; index++ )
		{
		// Get phone info.
		User::LeaveIfError( iEtelServer.GetPhoneInfo( index, phoneInfo ) );
		// Get Tsy name.
		User::LeaveIfError( iEtelServer.GetTsyName( index, tsyName ) );
		
		if( tsyName.CompareF( KMmTsyModuleName ) == 0 )
			{
			// We have the required Tsy.
			break;
			}
		}
	
	// Open a connection to the tsy.		
	User::LeaveIfError( iMobilePhone.Open( iEtelServer, phoneInfo.iName ) );
	
	__PRINTS( "CClkMccListener::ConstructL - Exit" );
	}
	
// ---------------------------------------------------------
// CClkMccListener::Start()
// rest of the details are commented in the header
// ---------------------------------------------------------
//	
void CClkMccListener::Start()
	{
	__PRINTS( "CClkMccListener::Start - Entry" );
	
	// Send a request and set the object active.
	if( !IsActive() )
		{
		// Object not active yet.
		if ( !iIsInitialized )
			{
			// This is for the first registration. 
			iMobilePhone.GetCurrentNetwork( iStatus, iNetworkInfoPckg );
			}
		else
			{
			// For subsequent ones, subscribe only for changes.
			iMobilePhone.NotifyCurrentNetworkChange( iStatus, iNetworkInfoPckg );
			}
		
		SetActive();
		}
	else
		{
		// Object already active.
		}
	
	__PRINTS( "CClkMccListener::Start - Exit" );
	}

// ---------------------------------------------------------
// CClkMccListener::Start()
// rest of the details are commented in the header
// ---------------------------------------------------------
//	
void CClkMccListener::RunL()
	{
	__PRINTS( "CClkMccListener::RunL - Entry" );
	
	if( iStatus == KErrNone )
		{
		// If iStatus is KErrNone or iStatus is not KRequestPending
		iIsInitialized = ETrue;
		
		// Get the Mcc.	
		TLex lexNetInfo( iNetworkInfo.iCountryCode );
				
		TInt networkError;
		TUint32 networkResult;				
		
		// Get the int of Mcc.
		networkError = lexNetInfo.Val( networkResult, EDecimal );		
		
		// If no error		
		if( KErrNone == networkError )
			{
			// Here we check if the iNetworkInfo.iCountryCode is a valid number 
			// and if it is a valid country code. 
			// According to http://en.wikipedia.org/wiki/Mobile_Country_Code, country codes
			// ranging from 200 to 799 are valid and used commercially.
			// MCC 1  is an exception for 3GPP conformance test.
			if( ( ( KMinMccValue < networkResult ) && ( KMaxMccValue > networkResult ) )
															 || ( 1 == networkResult ) )
				{						        
				// We have received a new Country Code
				iCurrentMcc = iNetworkInfo.iCountryCode;

				// Notify the observers about the new mcc.
				if( iObserver )
				    {
				    iObserver->NotifyMccChangeL();
				    }
				}
			}
		}
	
	// Re-subscribe for notfication on change of Mcc.	
	Start();
	
	__PRINTS( "CClkMccListener::RunL - Exit" );
	}

// ---------------------------------------------------------
// CClkMccListener::Stop()
// rest of the details are commented in the header
// ---------------------------------------------------------
//	
void CClkMccListener::Stop()	
	{
	__PRINTS( "CClkMccListener::Stop - Entry" );
	
	// Stop the active object.
	Cancel();
	
	__PRINTS( "CClkMccListener::Stop - Exit" );
	}
	
// ---------------------------------------------------------
// CClkMccListener::DoCancel()
// rest of the details are commented in the header
// ---------------------------------------------------------
//	
void CClkMccListener::DoCancel()	
	{
	__PRINTS( "CClkMccListener::DoCancel - Entry" );
	
	// Cancel for notification upon change.
	iMobilePhone.CancelAsyncRequest(EMobilePhoneNotifyCurrentNetworkChange);
	
	__PRINTS( "CClkMccListener::DoCancel - Exit" );
	}

// ---------------------------------------------------------
// CClkMccListener::GetCurrentMcc()
// rest of the details are commented in the header
// ---------------------------------------------------------
//	
TInt CClkMccListener::GetCurrentMcc( RMobilePhone::TMobilePhoneNetworkCountryCode& aMcc )
	{
	__PRINTS( "CClkMccListener::GetCurrentMcc - Entry" );
	
	TInt returnVal( KErrNone );
	
	if( 0 < iIsInitialized && iCurrentMcc.Length() ) 
		{
		// If initialized and a valid MCC is available.
		aMcc = iCurrentMcc;
		returnVal = KErrNone;
		}
	else
		{
		// Else no MCC yet.
		returnVal = KErrNotFound;
		}
	
	__PRINTS( "CClkMccListener::GetCurrentMcc - Exit" );
	
	return returnVal;
	}	
	
// End of file