keepalive/flextimer/server/engine/src/flextimerengine.cpp
author hgs
Mon, 24 May 2010 20:51:35 +0300
changeset 32 5c4486441ae6
permissions -rw-r--r--
201021
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
32
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). 
hgs
parents:
diff changeset
     3
 * All rights reserved.
hgs
parents:
diff changeset
     4
 * This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
 * under the terms of "Eclipse Public License v1.0"
hgs
parents:
diff changeset
     6
 * which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
 *
hgs
parents:
diff changeset
     9
 * Initial Contributors:
hgs
parents:
diff changeset
    10
 * Nokia Corporation - Initial contribution
hgs
parents:
diff changeset
    11
 *
hgs
parents:
diff changeset
    12
 * Description:
hgs
parents:
diff changeset
    13
 * This class contains implementation of CFlexTimerEngine.
hgs
parents:
diff changeset
    14
 *
hgs
parents:
diff changeset
    15
 */
hgs
parents:
diff changeset
    16
hgs
parents:
diff changeset
    17
// System include files
hgs
parents:
diff changeset
    18
// None
hgs
parents:
diff changeset
    19
hgs
parents:
diff changeset
    20
// User include files
hgs
parents:
diff changeset
    21
#include "flextimerengine.h"
hgs
parents:
diff changeset
    22
#include "flextimercontainer.h"
hgs
parents:
diff changeset
    23
#include "flextimerwakeuptimer.h"
hgs
parents:
diff changeset
    24
#include "OstTraceDefinitions.h"
hgs
parents:
diff changeset
    25
#ifdef OST_TRACE_COMPILER_IN_USE
hgs
parents:
diff changeset
    26
#include "flextimerengineTraces.h"
hgs
parents:
diff changeset
    27
#endif
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    31
// NewL
hgs
parents:
diff changeset
    32
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    33
//
hgs
parents:
diff changeset
    34
EXPORT_C CFlexTimerEngine* CFlexTimerEngine::NewL()
hgs
parents:
diff changeset
    35
    {
hgs
parents:
diff changeset
    36
    CFlexTimerEngine* self = new (ELeave) CFlexTimerEngine();
hgs
parents:
diff changeset
    37
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    38
    self->ConstructL();
hgs
parents:
diff changeset
    39
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
    40
    return self;
hgs
parents:
diff changeset
    41
    }
hgs
parents:
diff changeset
    42
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    43
// Destructor
hgs
parents:
diff changeset
    44
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    45
//
hgs
parents:
diff changeset
    46
CFlexTimerEngine::~CFlexTimerEngine()
hgs
parents:
diff changeset
    47
    {
hgs
parents:
diff changeset
    48
    OstTrace0( TRACE_INTERNAL,
hgs
parents:
diff changeset
    49
        CFLEXTIMERENGINE_CFLEXTIMERENGINE,
hgs
parents:
diff changeset
    50
        "CFlexTimerEngine::~CFlexTimerEngine" );
hgs
parents:
diff changeset
    51
hgs
parents:
diff changeset
    52
    delete iFlexTimerContainer;
hgs
parents:
diff changeset
    53
    delete iWakeUpTimer;
hgs
parents:
diff changeset
    54
    }
hgs
parents:
diff changeset
    55
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    56
// Add new timer and trap leave. Return Leave code to session.
hgs
parents:
diff changeset
    57
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    58
//
hgs
parents:
diff changeset
    59
EXPORT_C TInt CFlexTimerEngine::AddTimer(
hgs
parents:
diff changeset
    60
    const TTimeIntervalMicroSeconds& aWinStartInterval,
hgs
parents:
diff changeset
    61
    const TTimeIntervalMicroSeconds& aWinEndInterval,
hgs
parents:
diff changeset
    62
    TBool aCancelAtSystemTimeChange,
hgs
parents:
diff changeset
    63
    const MFlexTimerServiceCB* aFlexTimerServiceCB )
hgs
parents:
diff changeset
    64
    {
hgs
parents:
diff changeset
    65
    TRAPD( err,
hgs
parents:
diff changeset
    66
        iFlexTimerContainer->AddTimerL( aWinStartInterval,
hgs
parents:
diff changeset
    67
            aWinEndInterval,
hgs
parents:
diff changeset
    68
            aCancelAtSystemTimeChange,
hgs
parents:
diff changeset
    69
            aFlexTimerServiceCB ) );
hgs
parents:
diff changeset
    70
hgs
parents:
diff changeset
    71
    if ( KErrNone == err )
hgs
parents:
diff changeset
    72
        {
hgs
parents:
diff changeset
    73
        StartTimer();
hgs
parents:
diff changeset
    74
        }
hgs
parents:
diff changeset
    75
    return err;
hgs
parents:
diff changeset
    76
    }
hgs
parents:
diff changeset
    77
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    78
// Remove timer from container queue and start new wakeup watch timer
hgs
parents:
diff changeset
    79
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    80
//
hgs
parents:
diff changeset
    81
EXPORT_C TInt CFlexTimerEngine::CancelTimer(
hgs
parents:
diff changeset
    82
    const MFlexTimerServiceCB* aFlexTimerServiceCB )
hgs
parents:
diff changeset
    83
    {
hgs
parents:
diff changeset
    84
    TInt error = iFlexTimerContainer->RemoveTimer( aFlexTimerServiceCB );
hgs
parents:
diff changeset
    85
    StartTimer();
hgs
parents:
diff changeset
    86
    
hgs
parents:
diff changeset
    87
    return error;
hgs
parents:
diff changeset
    88
    }
hgs
parents:
diff changeset
    89
hgs
parents:
diff changeset
    90
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    91
// Wakeup timer expired, Fire timers according to some algorithm set and
hgs
parents:
diff changeset
    92
// restart wakeup timer.
hgs
parents:
diff changeset
    93
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    94
//
hgs
parents:
diff changeset
    95
void CFlexTimerEngine::WakeUp()
hgs
parents:
diff changeset
    96
    {
hgs
parents:
diff changeset
    97
    OstTrace0( TRACE_INTERNAL,
hgs
parents:
diff changeset
    98
        CFLEXTIMERENGINE_WAKEUP,
hgs
parents:
diff changeset
    99
        "CFlexTimerEngine::WakeUp" );
hgs
parents:
diff changeset
   100
    
hgs
parents:
diff changeset
   101
    iFlexTimerContainer->FireTimers(
hgs
parents:
diff changeset
   102
        CFlexTimerContainer::EFlexTimerAlgorithmLatestPossible );
hgs
parents:
diff changeset
   103
hgs
parents:
diff changeset
   104
    StartTimer();
hgs
parents:
diff changeset
   105
    }
hgs
parents:
diff changeset
   106
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   107
// System time is changed. Abort all timers that need to be aborted and
hgs
parents:
diff changeset
   108
// restart wakeup timer.
hgs
parents:
diff changeset
   109
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   110
//
hgs
parents:
diff changeset
   111
void CFlexTimerEngine::SystemTimeChanged()
hgs
parents:
diff changeset
   112
    {
hgs
parents:
diff changeset
   113
    OstTrace0( TRACE_INTERNAL,
hgs
parents:
diff changeset
   114
        CFLEXTIMERENGINE_SYSTEMTIMECHANGED,
hgs
parents:
diff changeset
   115
        "CFlexTimerEngine::SystemTimeChanged" );
hgs
parents:
diff changeset
   116
    
hgs
parents:
diff changeset
   117
    iFlexTimerContainer->AbortTimersDueToTimeChange( KErrAbort );
hgs
parents:
diff changeset
   118
    StartTimer();
hgs
parents:
diff changeset
   119
    }
hgs
parents:
diff changeset
   120
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   121
// Private constructor
hgs
parents:
diff changeset
   122
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   123
//
hgs
parents:
diff changeset
   124
CFlexTimerEngine::CFlexTimerEngine() : iFlexTimerContainer( NULL ),
hgs
parents:
diff changeset
   125
    iWakeUpTimer( NULL )
hgs
parents:
diff changeset
   126
    {
hgs
parents:
diff changeset
   127
    OstTrace0( TRACE_INTERNAL,
hgs
parents:
diff changeset
   128
        DUP_CFLEXTIMERENGINE_CFLEXTIMERENGINE,
hgs
parents:
diff changeset
   129
        "CFlexTimerEngine::CFlexTimerEngine" );
hgs
parents:
diff changeset
   130
    //Nothing to do here
hgs
parents:
diff changeset
   131
    }
hgs
parents:
diff changeset
   132
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   133
// Private 2nd phase construction
hgs
parents:
diff changeset
   134
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   135
//
hgs
parents:
diff changeset
   136
void CFlexTimerEngine::ConstructL()
hgs
parents:
diff changeset
   137
    {
hgs
parents:
diff changeset
   138
    iFlexTimerContainer = CFlexTimerContainer::NewL();
hgs
parents:
diff changeset
   139
    iWakeUpTimer = CFlexTimerWakeUpTimer::NewL( *this );
hgs
parents:
diff changeset
   140
    }
hgs
parents:
diff changeset
   141
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   142
// Stop timer just in case it is already running (e.g. after AddTimer())
hgs
parents:
diff changeset
   143
// and Start new wakeup timer according to current situation in container
hgs
parents:
diff changeset
   144
// queues If timeout window has passed fire timers right now.
hgs
parents:
diff changeset
   145
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   146
//
hgs
parents:
diff changeset
   147
void CFlexTimerEngine::StartTimer()
hgs
parents:
diff changeset
   148
    {
hgs
parents:
diff changeset
   149
    TTimeIntervalMicroSeconds nextTimeout;
hgs
parents:
diff changeset
   150
hgs
parents:
diff changeset
   151
    // Stop the timer, because, if there are no more pending timeouts, the
hgs
parents:
diff changeset
   152
    // wake-up timer needs to be stopped. If timeouts are found, the timer is
hgs
parents:
diff changeset
   153
    // is restarted below.
hgs
parents:
diff changeset
   154
    iWakeUpTimer->StopTimer();
hgs
parents:
diff changeset
   155
hgs
parents:
diff changeset
   156
    if ( iFlexTimerContainer->GetNextTimeout( nextTimeout ) )
hgs
parents:
diff changeset
   157
        {
hgs
parents:
diff changeset
   158
        // If timeout is in the future, timer is started to wake up at that
hgs
parents:
diff changeset
   159
        // moment.
hgs
parents:
diff changeset
   160
        if ( nextTimeout > TTimeIntervalMicroSeconds( 0 ) )
hgs
parents:
diff changeset
   161
            {
hgs
parents:
diff changeset
   162
            iWakeUpTimer->StartTimer( nextTimeout );
hgs
parents:
diff changeset
   163
            }
hgs
parents:
diff changeset
   164
        // If timer is due now or in the past, Lets fire those right now.
hgs
parents:
diff changeset
   165
        else
hgs
parents:
diff changeset
   166
            {
hgs
parents:
diff changeset
   167
            WakeUp();
hgs
parents:
diff changeset
   168
            }
hgs
parents:
diff changeset
   169
        }
hgs
parents:
diff changeset
   170
    // Else no timers, so no need for timeouts. Server is propably about to be
hgs
parents:
diff changeset
   171
    // deleted.
hgs
parents:
diff changeset
   172
    }