keepalive/flextimer/client/src/flexperiodic.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
 * Contributors:
hgs
parents:
diff changeset
    13
 *
hgs
parents:
diff changeset
    14
 * Description:  Implementation of CFlexPeriodic class
hgs
parents:
diff changeset
    15
 *
hgs
parents:
diff changeset
    16
 */
hgs
parents:
diff changeset
    17
/*
hgs
parents:
diff changeset
    18
 * %version: 1 %
hgs
parents:
diff changeset
    19
 */
hgs
parents:
diff changeset
    20
// System include files
hgs
parents:
diff changeset
    21
// User include files go here:
hgs
parents:
diff changeset
    22
#include "flexperiodic.h"
hgs
parents:
diff changeset
    23
#include "flextimercommon.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 "flexperiodicTraces.h"
hgs
parents:
diff changeset
    27
#endif
hgs
parents:
diff changeset
    28
hgs
parents:
diff changeset
    29
// ======== MEMBER FUNCTIONS ========
hgs
parents:
diff changeset
    30
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    31
// Constructs the object.
hgs
parents:
diff changeset
    32
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    33
//
hgs
parents:
diff changeset
    34
EXPORT_C CFlexPeriodic* CFlexPeriodic::NewL( TInt aPriority )
hgs
parents:
diff changeset
    35
    {
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
    CFlexPeriodic* self = new ( ELeave ) CFlexPeriodic( aPriority );
hgs
parents:
diff changeset
    38
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    39
    self->ConstructL();
hgs
parents:
diff changeset
    40
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
    41
    return self;
hgs
parents:
diff changeset
    42
    }
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    45
// Destructs the object.
hgs
parents:
diff changeset
    46
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    47
//
hgs
parents:
diff changeset
    48
EXPORT_C CFlexPeriodic::~CFlexPeriodic()
hgs
parents:
diff changeset
    49
    {
hgs
parents:
diff changeset
    50
    OstTrace1( TRACE_NORMAL, CFLEXPERIODIC_CFLEXPERIODIC,
hgs
parents:
diff changeset
    51
            "CFlexPeriodic::~CFlexPeriodic;this=%x", this );
hgs
parents:
diff changeset
    52
hgs
parents:
diff changeset
    53
    }
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    56
// Starts the periodic timer. 32-bit delay and interval parameters.
hgs
parents:
diff changeset
    57
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    58
//
hgs
parents:
diff changeset
    59
EXPORT_C void CFlexPeriodic::Start( TTimeIntervalMicroSeconds32 aDelay,
hgs
parents:
diff changeset
    60
                                    TTimeIntervalMicroSeconds32 anInterval,
hgs
parents:
diff changeset
    61
                                    TCallBack aCallBack,
hgs
parents:
diff changeset
    62
                                    TCallBack aCallBackError )
hgs
parents:
diff changeset
    63
    {
hgs
parents:
diff changeset
    64
    OstTraceExt4( TRACE_NORMAL, CFLEXPERIODIC_START32,
hgs
parents:
diff changeset
    65
            "CFlexPeriodic::Start32;this=%x;aDelay=%d;"
hgs
parents:
diff changeset
    66
            "anInterval=%d;aCallBack=%x", ( TUint )this,
hgs
parents:
diff changeset
    67
            aDelay.Int(), anInterval.Int(), ( TUint )&( aCallBack ) );
hgs
parents:
diff changeset
    68
hgs
parents:
diff changeset
    69
    TTimeIntervalMicroSeconds32 zero( 0 );
hgs
parents:
diff changeset
    70
    __ASSERT_ALWAYS(aDelay >= zero,
hgs
parents:
diff changeset
    71
            User::Panic(KCFlexPeriodicPanicCat,
hgs
parents:
diff changeset
    72
                    EFlexPeriodicDelayLessThanZero));
hgs
parents:
diff changeset
    73
    __ASSERT_ALWAYS(anInterval > zero,
hgs
parents:
diff changeset
    74
            User::Panic(KCFlexPeriodicPanicCat,
hgs
parents:
diff changeset
    75
                    EFlexPeriodicIntervalTooSmall));
hgs
parents:
diff changeset
    76
    __ASSERT_ALWAYS( aCallBack.iFunction != NULL,
hgs
parents:
diff changeset
    77
            User::Panic(KCFlexPeriodicPanicCat,
hgs
parents:
diff changeset
    78
                    EFlexPeriodicCallbackFunctionIsNull));
hgs
parents:
diff changeset
    79
    // aCallBackError is left unasserted on purpose.
hgs
parents:
diff changeset
    80
    // if error occurs and callback is null client is paniced.
hgs
parents:
diff changeset
    81
hgs
parents:
diff changeset
    82
    // Interval value is saved for later use, delay is sent immediately
hgs
parents:
diff changeset
    83
    // to the server.
hgs
parents:
diff changeset
    84
    iInterval = MAKE_TINT64( 0, anInterval.Int() );
hgs
parents:
diff changeset
    85
    iCallBack = aCallBack;
hgs
parents:
diff changeset
    86
    iCallBackError = aCallBackError;
hgs
parents:
diff changeset
    87
    CFlexTimer::After( aDelay );
hgs
parents:
diff changeset
    88
    }
hgs
parents:
diff changeset
    89
hgs
parents:
diff changeset
    90
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    91
// Starts the periodic timer. 64-bit delay and interval parameters.
hgs
parents:
diff changeset
    92
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
    93
//
hgs
parents:
diff changeset
    94
EXPORT_C void CFlexPeriodic::Start( TTimeIntervalMicroSeconds aDelay,
hgs
parents:
diff changeset
    95
                                    TTimeIntervalMicroSeconds anInterval,
hgs
parents:
diff changeset
    96
                                    TCallBack aCallBack,
hgs
parents:
diff changeset
    97
                                    TCallBack aCallBackError )
hgs
parents:
diff changeset
    98
    {
hgs
parents:
diff changeset
    99
    OstTraceExt4( TRACE_NORMAL, CFLEXPERIODIC_START64,
hgs
parents:
diff changeset
   100
            "CFlexPeriodic::Start64;this=%x;aDelay=%lld;"
hgs
parents:
diff changeset
   101
            "anInterval=%lld;aCallBack=%x", ( TUint )this,
hgs
parents:
diff changeset
   102
            aDelay.Int64(), anInterval.Int64(), ( TUint )&( aCallBack ) );
hgs
parents:
diff changeset
   103
hgs
parents:
diff changeset
   104
    TTimeIntervalMicroSeconds zero( 0 );
hgs
parents:
diff changeset
   105
    __ASSERT_ALWAYS(aDelay >= zero,
hgs
parents:
diff changeset
   106
            User::Panic(KCFlexPeriodicPanicCat,
hgs
parents:
diff changeset
   107
                    EFlexPeriodicDelayLessThanZero));
hgs
parents:
diff changeset
   108
    __ASSERT_ALWAYS(anInterval > zero,
hgs
parents:
diff changeset
   109
            User::Panic(KCFlexPeriodicPanicCat,
hgs
parents:
diff changeset
   110
                    EFlexPeriodicIntervalTooSmall));
hgs
parents:
diff changeset
   111
    __ASSERT_ALWAYS( aCallBack.iFunction != NULL,
hgs
parents:
diff changeset
   112
            User::Panic(KCFlexPeriodicPanicCat,
hgs
parents:
diff changeset
   113
                    EFlexPeriodicCallbackFunctionIsNull));
hgs
parents:
diff changeset
   114
    // aCallBackError is left unasserted on purpose.
hgs
parents:
diff changeset
   115
    // if error occurs and callback is null client is paniced.
hgs
parents:
diff changeset
   116
    
hgs
parents:
diff changeset
   117
    // Interval value is saved for later use, delay is sent immediately
hgs
parents:
diff changeset
   118
    // to the server.
hgs
parents:
diff changeset
   119
    iInterval = anInterval.Int64();
hgs
parents:
diff changeset
   120
    iCallBack = aCallBack;
hgs
parents:
diff changeset
   121
    iCallBackError = aCallBackError;
hgs
parents:
diff changeset
   122
    CFlexTimer::After( aDelay );
hgs
parents:
diff changeset
   123
    }
hgs
parents:
diff changeset
   124
hgs
parents:
diff changeset
   125
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   126
// Configures the flex window sizes for both the initial delay and the
hgs
parents:
diff changeset
   127
// consequent intervals after that.
hgs
parents:
diff changeset
   128
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   129
//
hgs
parents:
diff changeset
   130
EXPORT_C TInt CFlexPeriodic::Configure(
hgs
parents:
diff changeset
   131
                                 TTimeIntervalMicroSeconds32 aDelayWindow,
hgs
parents:
diff changeset
   132
                                 TTimeIntervalMicroSeconds32 aIntervalWindow )
hgs
parents:
diff changeset
   133
    {
hgs
parents:
diff changeset
   134
hgs
parents:
diff changeset
   135
    OstTraceExt3( TRACE_NORMAL, CFLEXPERIODIC_CONFIGURE,
hgs
parents:
diff changeset
   136
            "CFlexPeriodic::Configure32;this=%x;"
hgs
parents:
diff changeset
   137
            "aDelayWindow=%d;aIntervalWindow=%d", ( TUint )this,
hgs
parents:
diff changeset
   138
            aDelayWindow.Int(), aIntervalWindow.Int() );
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
    TTimeIntervalMicroSeconds32 zero( 0 );
hgs
parents:
diff changeset
   141
    __ASSERT_ALWAYS(aDelayWindow >= zero,
hgs
parents:
diff changeset
   142
            User::Panic(KCFlexPeriodicPanicCat,
hgs
parents:
diff changeset
   143
                    EFlexPeriodicDelayWindowLessThanZero));
hgs
parents:
diff changeset
   144
    __ASSERT_ALWAYS(aIntervalWindow >= zero,
hgs
parents:
diff changeset
   145
            User::Panic(KCFlexPeriodicPanicCat,
hgs
parents:
diff changeset
   146
                    EFlexPeriodicIntervalWindowLessThanZero));
hgs
parents:
diff changeset
   147
hgs
parents:
diff changeset
   148
    // interval window is saved for later use. Delay window is sent
hgs
parents:
diff changeset
   149
    // immediately to server. 
hgs
parents:
diff changeset
   150
    TInt ret = CFlexTimer::Configure( aDelayWindow );
hgs
parents:
diff changeset
   151
    if ( ret == KErrNone )
hgs
parents:
diff changeset
   152
        {
hgs
parents:
diff changeset
   153
        // Interval window is changed only, if configuration is successful.
hgs
parents:
diff changeset
   154
        iIntervalWindow = MAKE_TINT64( 0, aIntervalWindow.Int() );
hgs
parents:
diff changeset
   155
        iSendConfigure = ETrue;
hgs
parents:
diff changeset
   156
        }
hgs
parents:
diff changeset
   157
    return ret;
hgs
parents:
diff changeset
   158
    }
hgs
parents:
diff changeset
   159
hgs
parents:
diff changeset
   160
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   161
// Configures the flex window sizes for both the initial delay and the
hgs
parents:
diff changeset
   162
// consequent intervals after that. 64-bit version.
hgs
parents:
diff changeset
   163
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   164
//
hgs
parents:
diff changeset
   165
EXPORT_C TInt CFlexPeriodic::Configure( 
hgs
parents:
diff changeset
   166
                                   TTimeIntervalMicroSeconds aDelayWindow,
hgs
parents:
diff changeset
   167
                                   TTimeIntervalMicroSeconds aIntervalWindow )
hgs
parents:
diff changeset
   168
    {
hgs
parents:
diff changeset
   169
    OstTraceExt3( TRACE_NORMAL, DUP1_CFLEXPERIODIC_CONFIGURE,
hgs
parents:
diff changeset
   170
            "CFlexPeriodic::Configure64;this=%x;"
hgs
parents:
diff changeset
   171
            "aDelayWindow=%lld;aIntervalWindow=%lld", ( TUint )this,
hgs
parents:
diff changeset
   172
            aDelayWindow.Int64(), aIntervalWindow.Int64() );
hgs
parents:
diff changeset
   173
hgs
parents:
diff changeset
   174
    TTimeIntervalMicroSeconds zero( 0 );
hgs
parents:
diff changeset
   175
    __ASSERT_ALWAYS(aDelayWindow >= zero,
hgs
parents:
diff changeset
   176
            User::Panic(KCFlexPeriodicPanicCat,
hgs
parents:
diff changeset
   177
                    EFlexPeriodicDelayWindowLessThanZero));
hgs
parents:
diff changeset
   178
    __ASSERT_ALWAYS(aIntervalWindow >= zero,
hgs
parents:
diff changeset
   179
            User::Panic(KCFlexPeriodicPanicCat,
hgs
parents:
diff changeset
   180
                    EFlexPeriodicIntervalWindowLessThanZero));
hgs
parents:
diff changeset
   181
hgs
parents:
diff changeset
   182
    // interval window is saved for later use. Delay window is sent
hgs
parents:
diff changeset
   183
    // immediately to server. 
hgs
parents:
diff changeset
   184
    TInt ret = CFlexTimer::Configure( aDelayWindow );
hgs
parents:
diff changeset
   185
    if ( ret == KErrNone )
hgs
parents:
diff changeset
   186
        {
hgs
parents:
diff changeset
   187
        // Interval window is changed only, if configuration is successful.
hgs
parents:
diff changeset
   188
        iIntervalWindow = aIntervalWindow;
hgs
parents:
diff changeset
   189
        
hgs
parents:
diff changeset
   190
        // This is set to true only, if the server is able to receive the
hgs
parents:
diff changeset
   191
        // delay window configuration.
hgs
parents:
diff changeset
   192
        iSendConfigure = ETrue;
hgs
parents:
diff changeset
   193
        }
hgs
parents:
diff changeset
   194
    return ret;
hgs
parents:
diff changeset
   195
    }
hgs
parents:
diff changeset
   196
hgs
parents:
diff changeset
   197
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   198
// Handles the active objects request completion event.
hgs
parents:
diff changeset
   199
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   200
//
hgs
parents:
diff changeset
   201
void CFlexPeriodic::RunL()
hgs
parents:
diff changeset
   202
    {
hgs
parents:
diff changeset
   203
    if ( KErrNone == iStatus.Int() )
hgs
parents:
diff changeset
   204
        {
hgs
parents:
diff changeset
   205
        if ( iSendConfigure )
hgs
parents:
diff changeset
   206
            {
hgs
parents:
diff changeset
   207
            OstTrace1( TRACE_NORMAL, CFLEXPERIODIC_RUNL,
hgs
parents:
diff changeset
   208
                    "CFlexPeriodic::RunL;this=%x", ( TUint )this );
hgs
parents:
diff changeset
   209
    
hgs
parents:
diff changeset
   210
            CFlexTimer::Configure( iIntervalWindow );
hgs
parents:
diff changeset
   211
            // Reset the iSendConfigure to false so that this is sent only once.
hgs
parents:
diff changeset
   212
            iSendConfigure = EFalse;
hgs
parents:
diff changeset
   213
            }
hgs
parents:
diff changeset
   214
        CFlexTimer::After( iInterval );
hgs
parents:
diff changeset
   215
        iCallBack.CallBack();
hgs
parents:
diff changeset
   216
        }
hgs
parents:
diff changeset
   217
    // Error happended in server. timer is not restarted and
hgs
parents:
diff changeset
   218
    // iCallBackError is called to inform user
hgs
parents:
diff changeset
   219
    else
hgs
parents:
diff changeset
   220
        {
hgs
parents:
diff changeset
   221
        if ( NULL != iCallBackError.iFunction )
hgs
parents:
diff changeset
   222
            {
hgs
parents:
diff changeset
   223
            iCallBackError.CallBack();
hgs
parents:
diff changeset
   224
            }
hgs
parents:
diff changeset
   225
        // User has not defined iCallBackError
hgs
parents:
diff changeset
   226
        // Panic client.
hgs
parents:
diff changeset
   227
        else
hgs
parents:
diff changeset
   228
            {
hgs
parents:
diff changeset
   229
            OstTrace1( TRACE_NORMAL, CFLEXPERIODIC_RUNL_PANIC,
hgs
parents:
diff changeset
   230
            "CFlexPeriodic::RunL;this=%x;"
hgs
parents:
diff changeset
   231
            "Error returned from FlexTimerServer and no Error CallBack"
hgs
parents:
diff changeset
   232
            " is defined. Panicing client.", ( TUint )this );
hgs
parents:
diff changeset
   233
            User::Panic( KCFlexPeriodicPanicCat,
hgs
parents:
diff changeset
   234
                        EFlexPeriodicErrorCallbackFunctionIsNull );
hgs
parents:
diff changeset
   235
            }
hgs
parents:
diff changeset
   236
        }
hgs
parents:
diff changeset
   237
    }
hgs
parents:
diff changeset
   238
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   239
// Second part of the two-phase construction.
hgs
parents:
diff changeset
   240
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   241
//
hgs
parents:
diff changeset
   242
EXPORT_C void CFlexPeriodic::ConstructL()
hgs
parents:
diff changeset
   243
    {
hgs
parents:
diff changeset
   244
    CFlexTimer::ConstructL();
hgs
parents:
diff changeset
   245
hgs
parents:
diff changeset
   246
    CActiveScheduler::Add( this );
hgs
parents:
diff changeset
   247
    }
hgs
parents:
diff changeset
   248
hgs
parents:
diff changeset
   249
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   250
// Private constructor with priority.
hgs
parents:
diff changeset
   251
// ---------------------------------------------------------------------------
hgs
parents:
diff changeset
   252
//
hgs
parents:
diff changeset
   253
EXPORT_C CFlexPeriodic::CFlexPeriodic( TInt aPriority ) :
hgs
parents:
diff changeset
   254
    CFlexTimer( aPriority ), iSendConfigure( EFalse )
hgs
parents:
diff changeset
   255
    {
hgs
parents:
diff changeset
   256
hgs
parents:
diff changeset
   257
    }