omadrm/drmengine/drmclock/Src/DRMNitzObserver.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 16 Apr 2010 15:14:55 +0300
changeset 23 493788a4a8a4
parent 0 95b198f216e5
permissions -rw-r--r--
Revision: 201011 Kit: 201015

/*
* Copyright (c) 2003 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:  Implementation of the DRM Nitz Observer
*
*/



// INCLUDE FILES
#include "DRMNitzObserver.h"
#include "DRMClock.h"
#include "drmlog.h"

// EXTERNAL DATA STRUCTURES

// EXTERNAL FUNCTION PROTOTYPES

// CONSTANTS
const TInt KTimeZoneValidBit(0x3F);     // Time zone difference
const TInt KTimeZoneSignBit(0x80);      // Sign of time zone difference
const TInt KNitzYearOffset(2000);       // Adjusting the year value received
const TInt KMaximumTwoDigitValue(99);
// MACROS

// LOCAL CONSTANTS AND MACROS

// MODULE DATA STRUCTURES

// LOCAL FUNCTION PROTOTYPES

// FORWARD DECLARATIONS

// ============================= LOCAL FUNCTIONS ===============================


// ============================ MEMBER FUNCTIONS ===============================

// ---------------------------------------------------------
// CDRMNitzObserver::CDRMNitzObserver
// Default Constructor
// ---------------------------------------------------------
//
CDRMNitzObserver::CDRMNitzObserver( RMobilePhone& aMobilePhone, CDRMClock* aDRMClock) :
    CActive(EPriorityNormal) ,iDRMClock( aDRMClock ), iMobilePhone( &aMobilePhone ),
    iError( KErrNone )
    {
    }

// ---------------------------------------------------------
// CDRMNitzObserver::~CDRMNitzObserver
// Destructor
// ---------------------------------------------------------
//
CDRMNitzObserver::~CDRMNitzObserver()
    {
    Cancel();
    };


// ---------------------------------------------------------
// CDRMNitzObserver::ConstructL
// Two-phase Constructor
// ---------------------------------------------------------
//
void CDRMNitzObserver::ConstructL()
    {
    DRMLOG( _L("ConstructL "));

    // Get the NITZ info on the creation, might not be available yet
    iError = iMobilePhone->GetNITZInfo(iNitzInfo);


    DRMLOG2( _L("ConstructL: Error = %d"), iError );

    }


// ---------------------------------------------------------
// CDRMNitzObserver::NewL
// Two-phase constructor
// ---------------------------------------------------------
//
CDRMNitzObserver* CDRMNitzObserver::NewL( RMobilePhone& aMobilePhone,
                                         CDRMClock* aDRMClock)
    {
    CDRMNitzObserver* self = new(ELeave) CDRMNitzObserver(aMobilePhone,aDRMClock);
    CleanupStack::PushL(self);
    self->ConstructL();
    CleanupStack::Pop();
    return self;
    }

// ---------------------------------------------------------
// CDRMNitzObserver::Start
// Adds the active object into the ActiveScheduler
// and sets the object active, makes sure RunL is called
// atleast once
// ---------------------------------------------------------
//
void CDRMNitzObserver::Start()
    {
    TRequestStatus* status = 0;

    DRMLOG2( _L("iError == %d "), iError );

    if( iError == KErrNotSupported )
        {
        // NITZ never supported, kill the observer
        if( IsAdded() )
            {
            Deque();
            return;
            }
        return;
        }

    if( !IsAdded() )
        {
        CActiveScheduler::Add(this);
        }
    if ( !IsActive() )
        {
        SetActive();
        }
    status = &iStatus;
    User::RequestComplete(status,KErrNone);
    }


// Ignore the error:
TInt CDRMNitzObserver::RunError( TInt /*aError*/ )
    {
    SetActive();
    return KErrNone;
    }


// ---------------------------------------------------------
// CDRMNitzObserver::RunL
// Active object RunL
// ---------------------------------------------------------
//
void CDRMNitzObserver::RunL()
    {
    TTime timeData;
    TInt timeZone( 0 );

    // Check if the nitz has changed and is available, if so call update
    // otherwise just wait

    DRMLOG( _L("ObserverRunL Called\n\r ") );

    iStatus = KRequestPending;

    iMobilePhone->NotifyNITZInfoChange(iStatus, iNitzInfo);

    DRMLOG( _L("NotifyNITZInfoChange:"));
    if( GetNitzTime( timeData, timeZone ) )
        {
        DRMLOG( _L("Resetting secure time from NITZ observer:"));
        TRAPD(error, iDRMClock->ResetSecureTimeL( timeData, timeZone ) );
        if( error )
            {
            DRMLOG( _L("Resetting secure time from NITZ observer returned an error."));
            }
        DRMLOG( _L("Resetting secure time from NITZ observer successful."));

        if( error != KErrArgument )
            {
            if( error )
                {
                DRMLOG( _L("ObserverRunL Called error \n\r ") );
                }
            User::LeaveIfError( error );
            }
        }

    SetActive();
    };


// ---------------------------------------------------------
// CDRMNitzObserver::DoCancel
// Cancels the active object
// ---------------------------------------------------------
//
void CDRMNitzObserver::DoCancel()
    {
    // cancel the notify change
    iMobilePhone->CancelAsyncRequest(EMobilePhoneNotifyNITZInfoChange);
    };


// ---------------------------------------------------------
// CDRMNitzObserver::CheckDateTimeVal(const TDateTime& aDateTime)
// Check the date time value is valid.
// ---------------------------------------------------------
//
TInt CDRMNitzObserver::CheckDateTimeVal(const TDateTime& aDateTime)
    {
    TDateTime tmp;
    return tmp.Set(aDateTime.Year(),
                   aDateTime.Month(),
                   aDateTime.Day(),
                   aDateTime.Hour(),
                   aDateTime.Minute(),
                   aDateTime.Second(),
                   aDateTime.MicroSecond());
    }

// ---------------------------------------------------------
// CDRMNitzObserver::GetNitzTime(const TDateTime& aDateTime)
// Gets the nitz time from iNitzInfo
// ---------------------------------------------------------
//
TBool CDRMNitzObserver::GetNitzTime(TTime& aNitzTime, TInt& aTimeZone)
    {
    TInt32 nitzCaps(iNitzInfo.iNitzFieldsUsed);

    if (nitzCaps & RMobilePhone::KCapsTimezoneAvailable)
        {
        TInt timezone(iNitzInfo.iTimeZone & KTimeZoneValidBit);

        if (iNitzInfo.iTimeZone & KTimeZoneSignBit)
            {
            // Changes sign
            timezone = - timezone;
            }

        // TimeZone info
        aTimeZone = timezone;
        }

    if (nitzCaps & RMobilePhone::KCapsTimeAvailable)
        {
        TDateTime dateTime;
        TInt fourDigitYear(iNitzInfo.Year());

        //Check if our TSY returns 2 digits in stead of 4 digits for the year value
        if (fourDigitYear <= KMaximumTwoDigitValue)        // The maximum year value in UI applications is 2060
            {
           //The year received from TSY is 2 digits we make it 4 digits
            fourDigitYear = fourDigitYear + KNitzYearOffset;  // 2000
            }

        dateTime.Set(fourDigitYear,
                    TMonth(iNitzInfo.Month()),
                    iNitzInfo.Day(),
                    iNitzInfo.Hour(),
                    iNitzInfo.Minute(),
                    iNitzInfo.Second(),
                    iNitzInfo.MicroSecond());

        DRMLOG2( _L( "CDRMNitzObserver::GetNitzTime: DateTime: %d" ), fourDigitYear );
        DRMLOG2( _L( ":%d" ), iNitzInfo.Month() );
        DRMLOG2( _L( ":%d" ), iNitzInfo.Day() );
        DRMLOG2( _L( ":%d" ), iNitzInfo.Hour() );
        DRMLOG2( _L( ":%d" ), iNitzInfo.Minute() );
        DRMLOG2( _L( ":%d" ), iNitzInfo.Second() );

        if (KErrNone != CheckDateTimeVal(dateTime))
            {
            return EFalse;
            }
        // Transfer the time into a TTime object, UTC
        aNitzTime = dateTime;
        return ETrue;
        }

    return EFalse;

    };