diff -r fc7b30ed2058 -r 05bc53fe583b keepalive/flextimer/client/src/flexperiodic.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/keepalive/flextimer/client/src/flexperiodic.cpp Tue Aug 31 15:35:44 2010 +0300 @@ -0,0 +1,257 @@ +/* + * Copyright (c) 2010 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 CFlexPeriodic class + * + */ +/* + * %version: 1 % + */ +// System include files +// User include files go here: +#include "flexperiodic.h" +#include "flextimercommon.h" +#include "OstTraceDefinitions.h" +#ifdef OST_TRACE_COMPILER_IN_USE +#include "flexperiodicTraces.h" +#endif + +// ======== MEMBER FUNCTIONS ======== +// --------------------------------------------------------------------------- +// Constructs the object. +// --------------------------------------------------------------------------- +// +EXPORT_C CFlexPeriodic* CFlexPeriodic::NewL( TInt aPriority ) + { + + CFlexPeriodic* self = new ( ELeave ) CFlexPeriodic( aPriority ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + return self; + } + +// --------------------------------------------------------------------------- +// Destructs the object. +// --------------------------------------------------------------------------- +// +EXPORT_C CFlexPeriodic::~CFlexPeriodic() + { + OstTrace1( TRACE_NORMAL, CFLEXPERIODIC_CFLEXPERIODIC, + "CFlexPeriodic::~CFlexPeriodic;this=%x", this ); + + } + +// --------------------------------------------------------------------------- +// Starts the periodic timer. 32-bit delay and interval parameters. +// --------------------------------------------------------------------------- +// +EXPORT_C void CFlexPeriodic::Start( TTimeIntervalMicroSeconds32 aDelay, + TTimeIntervalMicroSeconds32 anInterval, + TCallBack aCallBack, + TCallBack aCallBackError ) + { + OstTraceExt4( TRACE_NORMAL, CFLEXPERIODIC_START32, + "CFlexPeriodic::Start32;this=%x;aDelay=%d;" + "anInterval=%d;aCallBack=%x", ( TUint )this, + aDelay.Int(), anInterval.Int(), ( TUint )&( aCallBack ) ); + + TTimeIntervalMicroSeconds32 zero( 0 ); + __ASSERT_ALWAYS(aDelay >= zero, + User::Panic(KCFlexPeriodicPanicCat, + EFlexPeriodicDelayLessThanZero)); + __ASSERT_ALWAYS(anInterval > zero, + User::Panic(KCFlexPeriodicPanicCat, + EFlexPeriodicIntervalTooSmall)); + __ASSERT_ALWAYS( aCallBack.iFunction != NULL, + User::Panic(KCFlexPeriodicPanicCat, + EFlexPeriodicCallbackFunctionIsNull)); + // aCallBackError is left unasserted on purpose. + // if error occurs and callback is null client is paniced. + + // Interval value is saved for later use, delay is sent immediately + // to the server. + iInterval = MAKE_TINT64( 0, anInterval.Int() ); + iCallBack = aCallBack; + iCallBackError = aCallBackError; + CFlexTimer::After( aDelay ); + } + +// --------------------------------------------------------------------------- +// Starts the periodic timer. 64-bit delay and interval parameters. +// --------------------------------------------------------------------------- +// +EXPORT_C void CFlexPeriodic::Start( TTimeIntervalMicroSeconds aDelay, + TTimeIntervalMicroSeconds anInterval, + TCallBack aCallBack, + TCallBack aCallBackError ) + { + OstTraceExt4( TRACE_NORMAL, CFLEXPERIODIC_START64, + "CFlexPeriodic::Start64;this=%x;aDelay=%lld;" + "anInterval=%lld;aCallBack=%x", ( TUint )this, + aDelay.Int64(), anInterval.Int64(), ( TUint )&( aCallBack ) ); + + TTimeIntervalMicroSeconds zero( 0 ); + __ASSERT_ALWAYS(aDelay >= zero, + User::Panic(KCFlexPeriodicPanicCat, + EFlexPeriodicDelayLessThanZero)); + __ASSERT_ALWAYS(anInterval > zero, + User::Panic(KCFlexPeriodicPanicCat, + EFlexPeriodicIntervalTooSmall)); + __ASSERT_ALWAYS( aCallBack.iFunction != NULL, + User::Panic(KCFlexPeriodicPanicCat, + EFlexPeriodicCallbackFunctionIsNull)); + // aCallBackError is left unasserted on purpose. + // if error occurs and callback is null client is paniced. + + // Interval value is saved for later use, delay is sent immediately + // to the server. + iInterval = anInterval.Int64(); + iCallBack = aCallBack; + iCallBackError = aCallBackError; + CFlexTimer::After( aDelay ); + } + +// --------------------------------------------------------------------------- +// Configures the flex window sizes for both the initial delay and the +// consequent intervals after that. +// --------------------------------------------------------------------------- +// +EXPORT_C TInt CFlexPeriodic::Configure( + TTimeIntervalMicroSeconds32 aDelayWindow, + TTimeIntervalMicroSeconds32 aIntervalWindow ) + { + + OstTraceExt3( TRACE_NORMAL, CFLEXPERIODIC_CONFIGURE, + "CFlexPeriodic::Configure32;this=%x;" + "aDelayWindow=%d;aIntervalWindow=%d", ( TUint )this, + aDelayWindow.Int(), aIntervalWindow.Int() ); + + TTimeIntervalMicroSeconds32 zero( 0 ); + __ASSERT_ALWAYS(aDelayWindow >= zero, + User::Panic(KCFlexPeriodicPanicCat, + EFlexPeriodicDelayWindowLessThanZero)); + __ASSERT_ALWAYS(aIntervalWindow >= zero, + User::Panic(KCFlexPeriodicPanicCat, + EFlexPeriodicIntervalWindowLessThanZero)); + + // interval window is saved for later use. Delay window is sent + // immediately to server. + TInt ret = CFlexTimer::Configure( aDelayWindow ); + if ( ret == KErrNone ) + { + // Interval window is changed only, if configuration is successful. + iIntervalWindow = MAKE_TINT64( 0, aIntervalWindow.Int() ); + iSendConfigure = ETrue; + } + return ret; + } + +// --------------------------------------------------------------------------- +// Configures the flex window sizes for both the initial delay and the +// consequent intervals after that. 64-bit version. +// --------------------------------------------------------------------------- +// +EXPORT_C TInt CFlexPeriodic::Configure( + TTimeIntervalMicroSeconds aDelayWindow, + TTimeIntervalMicroSeconds aIntervalWindow ) + { + OstTraceExt3( TRACE_NORMAL, DUP1_CFLEXPERIODIC_CONFIGURE, + "CFlexPeriodic::Configure64;this=%x;" + "aDelayWindow=%lld;aIntervalWindow=%lld", ( TUint )this, + aDelayWindow.Int64(), aIntervalWindow.Int64() ); + + TTimeIntervalMicroSeconds zero( 0 ); + __ASSERT_ALWAYS(aDelayWindow >= zero, + User::Panic(KCFlexPeriodicPanicCat, + EFlexPeriodicDelayWindowLessThanZero)); + __ASSERT_ALWAYS(aIntervalWindow >= zero, + User::Panic(KCFlexPeriodicPanicCat, + EFlexPeriodicIntervalWindowLessThanZero)); + + // interval window is saved for later use. Delay window is sent + // immediately to server. + TInt ret = CFlexTimer::Configure( aDelayWindow ); + if ( ret == KErrNone ) + { + // Interval window is changed only, if configuration is successful. + iIntervalWindow = aIntervalWindow; + + // This is set to true only, if the server is able to receive the + // delay window configuration. + iSendConfigure = ETrue; + } + return ret; + } + +// --------------------------------------------------------------------------- +// Handles the active objects request completion event. +// --------------------------------------------------------------------------- +// +void CFlexPeriodic::RunL() + { + if ( KErrNone == iStatus.Int() ) + { + if ( iSendConfigure ) + { + OstTrace1( TRACE_NORMAL, CFLEXPERIODIC_RUNL, + "CFlexPeriodic::RunL;this=%x", ( TUint )this ); + + CFlexTimer::Configure( iIntervalWindow ); + // Reset the iSendConfigure to false so that this is sent only once. + iSendConfigure = EFalse; + } + CFlexTimer::After( iInterval ); + iCallBack.CallBack(); + } + // Error happended in server. timer is not restarted and + // iCallBackError is called to inform user + else + { + if ( NULL != iCallBackError.iFunction ) + { + iCallBackError.CallBack(); + } + // User has not defined iCallBackError + // Panic client. + else + { + OstTrace1( TRACE_NORMAL, CFLEXPERIODIC_RUNL_PANIC, + "CFlexPeriodic::RunL;this=%x;" + "Error returned from FlexTimerServer and no Error CallBack" + " is defined. Panicing client.", ( TUint )this ); + User::Panic( KCFlexPeriodicPanicCat, + EFlexPeriodicErrorCallbackFunctionIsNull ); + } + } + } +// --------------------------------------------------------------------------- +// Second part of the two-phase construction. +// --------------------------------------------------------------------------- +// +EXPORT_C void CFlexPeriodic::ConstructL() + { + CFlexTimer::ConstructL(); + + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------------------------- +// Private constructor with priority. +// --------------------------------------------------------------------------- +// +EXPORT_C CFlexPeriodic::CFlexPeriodic( TInt aPriority ) : + CFlexTimer( aPriority ), iSendConfigure( EFalse ) + { + + }