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