clock2/clockengines/clocknitzplugin/src/clocknitzpluginimpl.cpp
author Simon Howkins <simonh@symbian.org>
Mon, 22 Nov 2010 16:01:09 +0000
branchRCL_3
changeset 93 d216ae5a8733
parent 86 ed599363c2d7
permissions -rw-r--r--
Adjusted to avoid exports, etc, from a top-level bld.inf

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

// System includes
#include <e32const.h>
#include <e32base.h>

// User includes
#include "clocknitzplugin.h"
#include "clocknitzpluginimpl.h"
#include "clockpluginobserver.h"
#include "clock_debug.h"

// Constants
const TInt KQuaterHour( 15 );
const TInt KMinute( 60 );
const TInt KTimeZoneValidBit( 0x3F );
const TInt KTimeZoneSignBit( 0x80 );

// ---------------------------------------------------------
// CClockNitzPluginImpl::NewL
// rest of the details are commented in the header
// ---------------------------------------------------------
//
CClockNitzPluginImpl* CClockNitzPluginImpl::NewL( CClockNitzPlugin* aNitzPlugin )
	{
	__PRINTS( "CClockNitzPluginImpl::NewL - Entry" );
	
	CClockNitzPluginImpl* self = new ( ELeave ) CClockNitzPluginImpl( aNitzPlugin );
	CleanupStack::PushL( self );
	
	self->ConstructL();
	
	CleanupStack::Pop();
	
	__PRINTS( "CClockNitzPluginImpl::NewL - Exit" );
	
	return self;
	}
	
// ---------------------------------------------------------
// CClockNitzPluginImpl::~CClockNitzPluginImpl
// rest of the details are commented in the header
// ---------------------------------------------------------
//
CClockNitzPluginImpl::~CClockNitzPluginImpl()
	{
	__PRINTS( "CClockNitzPluginImpl::~CClockNitzPluginImpl - Entry" );
	
	if( iNitzSrv )
		{
		iNitzSrv->Stop();
		delete iNitzSrv;
		}
	
	__PRINTS( "CClockNitzPluginImpl::~CClockNitzPluginImpl - Exit" );
	}
	
// ---------------------------------------------------------
// CClockNitzPluginImpl::CClockNitzPluginImpl
// rest of the details are commented in the header
// ---------------------------------------------------------
//
CClockNitzPluginImpl::CClockNitzPluginImpl( CClockNitzPlugin* aNitzPlugin )
						                	: iNitzPlugin( aNitzPlugin )
	{
	__PRINTS( "CClockNitzPluginImpl::CClockNitzPluginImpl - Entry" );
	
	// No implementation yet.
	
	__PRINTS( "CClockNitzPluginImpl::CClockNitzPluginImpl - Exit" );
	}
	
// ---------------------------------------------------------
// CClockNitzPluginImpl::ConstructL
// rest of the details are commented in the header
// ---------------------------------------------------------
//
void CClockNitzPluginImpl::ConstructL()
	{
	__PRINTS( "CClockNitzPluginImpl::ConstructL - Entry" );
	
	// Construct the listener.
	iNitzSrv = CClockNitzListener::NewL( this );
	// Start the listener.
	iNitzSrv->Start();
	
	__PRINTS( "CClockNitzPluginImpl::ConstructL - Exit" );
	}
	
// ---------------------------------------------------------
// CClockNitzPluginImpl::GetTimeInformationL
// rest of the details are commented in the header
// ---------------------------------------------------------
//
void CClockNitzPluginImpl::GetTimeInformationL( TInterfaceAttribute aInterfaceAttribute, 
											  	STimeAttributes* aTimeAttributes )
	{
	__PRINTS( "CClockNitzPluginImpl::GetTimeInformationL - Entry" );
	
	__PRINT( "TInterfaceAttribute: %d", aInterfaceAttribute );
	
	if( !aTimeAttributes )
	    {
	    __PRINTS( "Time attributes holder is NULL" );
	    
	    return;
	    }
	
	TInt timeZone( NULL );
	
	STimeAttributes* nitzData( aTimeAttributes );
	
	TInt retVal( KErrNone );
	if( iNitzSrv )
	    {
	    // Get the NITZ information from the listener.
	    retVal = iNitzSrv->GetCurrentNITZInfoL( iNitzInfo );
	    }
	
	if( KErrNotFound == retVal )
	    {
	    __PRINTS( "Unable to get NITZ information" );
	    
	    return;
	    }
	
	// Get the capabilities sent by the n/w.
	TInt32 nitzCaps( iNitzInfo.iNitzFieldsUsed );
	
	switch( aInterfaceAttribute )
		{
		case EUTCTime:
		    {
			// Fetch UTC time.
			if( nitzCaps & RMobilePhone::KCapsTimeAvailable )
				{
				// We have a valid time.
				nitzData->iUtcDateTime.Set( iNitzInfo.Year(),
		            	  					TMonth( iNitzInfo.Month() ),
						  					iNitzInfo.Day(),
							  				iNitzInfo.Hour(),
							  				iNitzInfo.Minute(),
							  				iNitzInfo.Second(),
							  				iNitzInfo.MicroSecond() );
				}
			else
				{
				TTime invalidTime( -1 );
				nitzData->iUtcDateTime = invalidTime.DateTime();
				}
		    }
			break;
			
		case EDSTOffset:
		    {
			// Check if DST is available in the NITZ packet.
			if( nitzCaps & RMobilePhone::KCapsDSTAvailable )
				{
				// DST is supported by the n/w.
				nitzData->iDstOffset = iNitzInfo.iDST * KMinute;
				}
			else
				{
				// Reset the DST data.
				nitzData->iDstOffset = TTimeIntervalMinutes( -1 );
				}
		    }
			break;
			
		case ETZOffset:
		    {
			// Calculate std offset
			// We only accept a NitzInfo with time and zone info. We are very picky
		    if( nitzCaps & RMobilePhone::KCapsTimezoneAvailable )
		    	{
				timeZone = iNitzInfo.iTimeZone & KTimeZoneValidBit;

	        	if( iNitzInfo.iTimeZone & KTimeZoneSignBit )
	            	{
	            	// Changes sign
	            	timeZone = -timeZone;
	            	}
			
				// Calculate standard UTC offset
				nitzData->iTimeZoneOffset = timeZone * KQuaterHour;
				
				// Check if dst is available. If so, the standard offset above will already have
				// DST offset included. We've to remove it. The following check tells if dst is
				// available.
				if( nitzCaps & RMobilePhone::KCapsDSTAvailable )
					{
					// Deduct the DST offset from the standard offset.
					nitzData->iTimeZoneOffset = timeZone * KQuaterHour
												- iNitzInfo.iDST * KMinute;
					}
		    	}
		    else
		    	{
		    	// Invalid timezone. Reset the offset.
				nitzData->iTimeZoneOffset = TTimeIntervalMinutes( -1 );
		    	}
		    }
			break;
			
		default:
		    {
		    // No implementation yet.
		    }
			break;			
		}
	
	__PRINTS( "CClockNitzPluginImpl::GetTimeInformationL - Exit" );
	}

// ---------------------------------------------------------
// CClockNitzPluginImpl::NotifyOnNITZInfoChange
// rest of the details are commented in the header
// ---------------------------------------------------------
//		
void CClockNitzPluginImpl::NotifyOnNITZInfoChange( TInterfaceAttribute /*aInterfaceAttribute*/ )
	{
	__PRINTS( "CClockNitzPluginImpl::NotifyOnNITZInfoChange - Entry" );
	
	// Start the listener to get NITZ notifications.
	if( iNitzSrv )
	    {
	    iNitzSrv->Start();
	    }
	
	__PRINTS( "CClockNitzPluginImpl::NotifyOnNITZInfoChange - Exit" );
	}

// ---------------------------------------------------------
// CClockNitzPluginImpl::GetDataIfAlreadyAvailable
// rest of the details are commented in the header
// ---------------------------------------------------------
//		
void CClockNitzPluginImpl::GetDataIfAlreadyAvailableL()
	{
	__PRINTS( "CClockNitzPluginImpl::GetDataIfAlreadyAvailableL - Entry" );
	
	// Fetch the Nitz information if it is already available
	if( iNitzSrv )
	    {
	    iNitzSrv->FetchDataIfAlreadyAvailableL();
	    }

	__PRINTS( "CClockNitzPluginImpl::GetDataIfAlreadyAvailableL - Exit" );
	}

// ---------------------------------------------------------
// CClockNitzPluginImpl::NotifyNITZInfoChange
// rest of the details are commented in the header
// ---------------------------------------------------------
//
void CClockNitzPluginImpl::NotifyNITZInfoChangeL()
	{
	__PRINTS( "CClockNitzPluginImpl::NotifyNITZInfoChange - Entry" );
	
	// Notify the plugin that NITZ info has changed.
	if( iNitzPlugin )
	    {
	    iNitzPlugin->NotifyNITZInfoChangeL();
	    }
	
	__PRINTS( "CClockNitzPluginImpl::NotifyNITZInfoChange - Exit" );
	}

// End of file