alwayson_net_plugin/pdpcontextmanager2/src/caotimer.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:23:51 +0100
branchRCL_3
changeset 58 83ca720e2b9a
parent 57 05bc53fe583b
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2004,2006 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:  Implements the CAOTimer class
*
*/


// INCLUDE FILES
#include "caotimer.h"
#include "logger.h"
#include "maotimerobserver.h"
#include "maosettings.h"
#include "pdpcontextmanagerinternalcrkeys.h"

// UNNAMED NAMESPACE FOR LOCAL DEFINITIONS
namespace
    {
    // CONSTANTS
#ifdef _DEBUG
    _LIT( KPanicCat, "Timer" );
#endif
    const TInt KSecondsToMicro = 1000000; // one second
    const TInt KMaxTimerInSeconds = 1800; // 30 minutes
    
    // DATA TYPES
    enum TPanicReason
        {
        ERetryTimerAlreadyActive,
        EConnectionTimerAlreadyActive,
        EUnconnectTimerAlreadyActive
        };
    
    // LOCAL FUNCTIONS
#ifdef _DEBUG
    LOCAL_C void Panic( TPanicReason aReason )
        {
        User::Panic( KPanicCat, aReason );
        }
#endif
    }

// METHODS

// ---------------------------------------------------------------------------
// CAOTimer::NewL
// ---------------------------------------------------------------------------
//
CAOTimer* CAOTimer::NewL( MAOTimerObserver& aObserver,
                          MAOSettings& aSettings )
    {
    LOG_1( _L("CAOTimer::NewL") );
    
    CAOTimer* self = new( ELeave ) CAOTimer( aObserver, aSettings );
    
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    
    return self;
    }

// ---------------------------------------------------------------------------
// CAOTimer::~CAOTimer
// ---------------------------------------------------------------------------
//
CAOTimer::~CAOTimer()
    {
    LOG_1( _L("CAOTimer::~CAOTimer") );
    
    delete iUnconnectTimer;
    delete iConnectionTimer;
    delete iRetryTimer;
    }

// ---------------------------------------------------------------------------
// CAOTimer::HandleSettingsChangedL
// ---------------------------------------------------------------------------
//
void CAOTimer::HandleSettingsChangedL()
    {
    LOG_1( _L("CAOTimer::HandleSettingsChangedL") );
    
    // Nothing to do
    }

// ---------------------------------------------------------------------------
// CAOTimer::StartRetryTimer
// ---------------------------------------------------------------------------
//
void CAOTimer::StartRetryTimer()
    {
    LOG_1( _L("CAOTimer::StartRetryTimer") );
    
    __ASSERT_DEBUG( !iRetryTimer->IsActive(),
        Panic( ERetryTimerAlreadyActive ) );
        
    iRetryTimerCount = 0;
    
    // First check if the current retry timer value is more than 30 minutes
    iCurrentRetryTimerInterval = 0;
    if( iSettings.RetryTimerValue() > KMaxTimerInSeconds )
        {
        // First interval is 30 minutes
        iCurrentRetryTimerInterval = KMaxTimerInSeconds * KSecondsToMicro;
        }
    else
        {
        // use current value
        iCurrentRetryTimerInterval =
            iSettings.RetryTimerValue() * KSecondsToMicro;
        }
    
    TCallBack cb( RetryTimerCallBack, this );
    iRetryTimer->Start(
        iCurrentRetryTimerInterval, iCurrentRetryTimerInterval, cb );
    }

// ---------------------------------------------------------------------------
// CAOTimer::StartConnectionTimer
// ---------------------------------------------------------------------------
//
void CAOTimer::StartConnectionTimer()
    {
    LOG_1( _L("CAOTimer::StartConnectionTimer") );
    
    __ASSERT_DEBUG( !iConnectionTimer->IsActive(),
        Panic( EConnectionTimerAlreadyActive ) );
        
    TInt interval = ConfigureInterval( iSettings.ConnectionTimerValue() );
    TCallBack cb( ConnectionTimerCallBack, this );
    iConnectionTimer->Start( interval, interval, cb );
    }

// ---------------------------------------------------------------------------
// CAOTimer::StopRetryTimer
// ---------------------------------------------------------------------------
//
void CAOTimer::StopRetryTimer()
    {
    LOG_1( _L("CAOTimer::StopRetryTimer") );
    
    iRetryTimer->Cancel();
    }

// ---------------------------------------------------------------------------
// CAOTimer::StopConnectionTimer
// ---------------------------------------------------------------------------
//
void CAOTimer::StopConnectionTimer()
    {
    LOG_1( _L("CAOTimer::StopConnectionTimer") );
    
    iConnectionTimer->Cancel();
    }

// ---------------------------------------------------------------------------
// CAOTimer::StartUnconnectTimer
// ---------------------------------------------------------------------------
//
void CAOTimer::StartUnconnectTimer()
    {
    LOG_1( _L("CAOTimer::StartUnconnectTimer") );

    __ASSERT_DEBUG( !iUnconnectTimer->IsActive(),
        Panic( EUnconnectTimerAlreadyActive ) );
    
    TInt interval = ConfigureInterval( iSettings.UnconnectTimerValue() );
    TCallBack cb( UnconnectTimerCallBack, this );
    iUnconnectTimer->Start( interval, interval, cb );
    }

// ---------------------------------------------------------------------------
// CAOTimer::StopUnconnectTimer
// ---------------------------------------------------------------------------
//
void CAOTimer::StopUnconnectTimer()
    {
    LOG_1( _L("CAOTimer::StopUnconnectTimer") );
    
    iUnconnectTimer->Cancel();
    }

// ---------------------------------------------------------------------------
// CAOTimer::RetryTimerDisabled
// ---------------------------------------------------------------------------
//
TBool CAOTimer::RetryTimerDisabled() const
    {
    LOG_1( _L("CAOTimer::RetryTimerDisabled") );
    
    return iSettings.RetryTimerValue() == 0;
    }

// ---------------------------------------------------------------------------
// CAOTimer::UnconnectTimerDisabled
// ---------------------------------------------------------------------------
//
TBool CAOTimer::UnconnectTimerDisabled() const
    {
    LOG_1( _L("CAOTimer::UnconnectTimerDisabled") );
    
    if ( iSettings.IsCellularAllowedByUser() )
        {
        return iSettings.UnconnectTimerValue() == 0;
        }
    else
        {
        // There should be no retries because user
        // does not allow cellular connections.
        return ETrue;
        }
    }

// ---------------------------------------------------------------------------
// CAOTimer::CAOTimer
// ---------------------------------------------------------------------------
//
CAOTimer::CAOTimer( MAOTimerObserver& aObserver, MAOSettings& aSettings ):
    iObserver( aObserver ),
    iSettings( aSettings )
    {
    LOG_1( _L("CAOTimer::CAOTimer") );
    }

// ---------------------------------------------------------------------------
// CAOTimer::ConstructL
// ---------------------------------------------------------------------------
//
void CAOTimer::ConstructL()
    {
    LOG_1( _L("CAOTimer::ConstructL") );
    
    // Create timers
    iRetryTimer = CPeriodic::NewL( CActive::EPriorityStandard );
    iConnectionTimer = CPeriodic::NewL( CActive::EPriorityStandard );
    iUnconnectTimer = CPeriodic::NewL( CActive::EPriorityStandard );
    }

// ---------------------------------------------------------------------------
// CAOTimer::RetryTimerCallBack
// ---------------------------------------------------------------------------
//
TInt CAOTimer::RetryTimerCallBack( TAny* aSelf )
    {
    LOG_1( _L("CAOTimer::RetryTimerCallBack") );
    
    CAOTimer* self = static_cast<CAOTimer*>( aSelf );
    TRAPD( err, self->HandleRetryTimerCallBackL() );
    return err;
    }

// ---------------------------------------------------------------------------
// CAOTimer::ConnectionTimerCallBack
// ---------------------------------------------------------------------------
//
TInt CAOTimer::ConnectionTimerCallBack( TAny* aSelf )
    {
    LOG_1( _L("CAOTimer::ConnectionTimerCallBack") );
    
    CAOTimer* self = static_cast<CAOTimer*>( aSelf );
    self->StopConnectionTimer();
    TRAPD( err, self->iObserver.HandleConnectionTimerExpiredL() );
    return err;
    }
    
// ---------------------------------------------------------------------------
// CAOTimer::HandleRetryTimerCallBackL
// ---------------------------------------------------------------------------
//
void CAOTimer::HandleRetryTimerCallBackL()
    {
    LOG_1( _L("CAOTimer::HandleRetryTimerCallBackL") );
    
    // Stop retry timer and increase timer count
    iRetryTimerCount++;
    StopRetryTimer();
    
    // Check if we still need to continue
    // If retry timer has been set longer than 30min
    TInt currentlyRanInSec = ( iCurrentRetryTimerInterval / KSecondsToMicro ) 
         + ( ( iRetryTimerCount - 1 ) * KMaxTimerInSeconds );
    if( iSettings.RetryTimerValue() != currentlyRanInSec )
        {
        // Get remaining time in seconds
        TInt timeRemainingInSec =
            iSettings.RetryTimerValue() - currentlyRanInSec;
            
        // Check if remaining time is longer than 30 minutes
        if ( timeRemainingInSec > KMaxTimerInSeconds )
            {
            // Current interval is 30 minutes
            iCurrentRetryTimerInterval = KMaxTimerInSeconds * KSecondsToMicro;
            }
        else
            {
            // use time that is left
            iCurrentRetryTimerInterval = timeRemainingInSec * KSecondsToMicro;
            }
            
        // Restart timer
        TCallBack cb( RetryTimerCallBack, this );
        if( !iRetryTimer->IsActive())
            {
            
            iRetryTimer->Start(
                iCurrentRetryTimerInterval, iCurrentRetryTimerInterval, cb );
            }
        }
    else
        {
        // Retry timer expired, notify observer
        iObserver.HandleRetryTimerExpiredL();
        }
    }

// ---------------------------------------------------------------------------
// CAOTimer::UnconnectTimerCallBack
// ---------------------------------------------------------------------------
//
TInt CAOTimer::UnconnectTimerCallBack( TAny* aSelf )
    {
    LOG_1( _L("CAOTimer::UnconnectTimerCallBack") );
    
    CAOTimer* self = static_cast<CAOTimer*>( aSelf );
    self->StopUnconnectTimer();
    TRAPD( err, self->iObserver.HandleUnconnectTimerExpiredL() );
    
    return err;
    }

// ---------------------------------------------------------------------------
// CAOTimer::ConfigureInterval
// ---------------------------------------------------------------------------
//
TInt CAOTimer::ConfigureInterval( const TInt& aIntervalInSec )
    {
    LOG_2( _L("CAOTimer::ConfigureInterval: aIntervalInSec: %d"),
        aIntervalInSec );
        
    // Interval maximum value is 30 minutes
    TInt interval = 0;
    if( aIntervalInSec > KMaxTimerInSeconds )
        {
        interval = KMaxTimerInSeconds * KSecondsToMicro;
        }
    else
        {
        interval = aIntervalInSec * KSecondsToMicro;
        }
        
    return interval;
    }

// End of file