diff -r 000000000000 -r 094583676ce7 IMPSengine/engsrv/src/impstimer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/IMPSengine/engsrv/src/impstimer.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,525 @@ +/* +* Copyright (c) 2002-2005 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: Timers assemble for imps engine base function. +* +* CImpsIdleTimer +* Idle timer to lauch Poll requests in CSP protocol. +* CImpsPDPIdleTimer +* Idle timer to close idle PDP-context (IAP). +* CImpsPDPOpenTimer +* Timer to open idle PDP-context. +* CImpsShutdownTimer +* Idle timer to lauch keep-alive and Poll requests in CSP protocol. +* +*/ + + +// INCLUDE FILES +#include +#include +#include "impsutils.h" +#include "impsTimer.h" +#include "ImpsServer.h" + +// MACROS +#ifndef _DEBUG +#define _NO_IMPS_LOGGING_ +#endif + +const TInt KImpsUseAfterLimit = 240; + +//********************************** +// CImpsBaseTimer +//********************************** +CImpsBaseTimer::CImpsBaseTimer( + TInt aPriority ) + : CActive( aPriority ), + iReset( EFalse ) + { + // Add this to the scheduler + ( void ) iTimer.CreateLocal(); + CActiveScheduler::Add( this ); + } + +CImpsBaseTimer::~CImpsBaseTimer() + { + Cancel(); + iTimer.Close(); + } + +// ----------------------------------------------------------------------------- +// CImpsBaseTimer::Start +// ----------------------------------------------------------------------------- +void CImpsBaseTimer::Start( TInt aWaitSeconds ) + { + iReset = EFalse; + + // Cancel is needed because of the timer may be reset. + Cancel(); + + if ( aWaitSeconds <= 0 ) + { + return; + } + + iSeconds = aWaitSeconds; + + // The At function caused a CUserbase-Panic 46 in very small + // time values. 1-4 seconds. Now if the KeepAlive time + // is smaller than UseAfterLimit, then we use the After function + // If it is larger then use the At function + // The reason not to use the After function for every situation is + // that the TInt overflows after 35 minutes. 1000000*60*36 > 2^31 + if ( iSeconds <= KImpsUseAfterLimit ) + { + iTimer.After( iStatus, iSeconds * 1000000 ); + } + else + { + TTime myKeepAlive; + myKeepAlive.HomeTime(); + myKeepAlive += TTimeIntervalSeconds( iSeconds ); + iTimer.At( iStatus, myKeepAlive ); + } + iStatus = KRequestPending; + SetActive(); + + } + +// ----------------------------------------------------------------------------- +// CImpsBaseTimer::Stop +// ----------------------------------------------------------------------------- +void CImpsBaseTimer::Stop( ) + { + iReset = ETrue; + Cancel(); + } + +// ----------------------------------------------------------------------------- +// CImpsBaseTimer::Reset +// ----------------------------------------------------------------------------- +void CImpsBaseTimer::Reset( ) + { + // Avoid continuos cancelling, therefore just set flag on + iReset = ETrue; + } + +// ----------------------------------------------------------------------------- +// CImpsBaseTimer::DoCancel +// ----------------------------------------------------------------------------- +void CImpsBaseTimer::DoCancel() + { + iTimer.Cancel(); + } + +//********************************** +// CImpsIdleTimer +//********************************** + +CImpsIdleTimer::CImpsIdleTimer( + MImpsCSPSession& aServer, + TInt aPriority ) + : CImpsBaseTimer( aPriority ), + iServer( aServer ) + { + } + +CImpsIdleTimer::~CImpsIdleTimer() + { + } + +// ----------------------------------------------------------------------------- +// CImpsIdleTimer::Start +// ----------------------------------------------------------------------------- +void CImpsIdleTimer::Start( TInt aWaitSeconds ) + { +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( _L( "CImpsIdleTimer: Start sec=%d" ), aWaitSeconds ); +#endif + CImpsBaseTimer::Start( aWaitSeconds ); + } + +// ----------------------------------------------------------------------------- +// CImpsIdleTimer::Stop +// ----------------------------------------------------------------------------- +void CImpsIdleTimer::Stop() + { +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( _L( "CImpsIdleTimer: Stop" ) ); +#endif + CImpsBaseTimer::Stop(); + } + +// ----------------------------------------------------------------------------- +// CImpsIdleTimer::RunL +// ----------------------------------------------------------------------------- +void CImpsIdleTimer::RunL() + { +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( _L( "IdleTimer: RunL" ) ); +#endif + TInt err = KErrNone; + TRAP( err, iServer.SendPollL() ); + Start( iSeconds ); + } + + +//********************************** +// CImpsPDPIdleTimer +//********************************** + +CImpsPDPIdleTimer::CImpsPDPIdleTimer( + MImpsCSPSession& aServer, + TInt aPriority ) + : CImpsBaseTimer( aPriority ), + iServer( aServer ) + { + } + +CImpsPDPIdleTimer::~CImpsPDPIdleTimer() + { + } + +// ----------------------------------------------------------------------------- +// CImpsPDPIdleTimer::Reset +// ----------------------------------------------------------------------------- +void CImpsPDPIdleTimer::Reset( ) + { +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( _L( "CImpsPDPIdleTimer: Reset" ) ); +#endif + // Reset re-starts this timer only if already runnig + if ( IsActive() ) + { + CImpsBaseTimer::Start( iSeconds ); + } + } + +// ----------------------------------------------------------------------------- +// CImpsPDPIdleTimer::Start +// ----------------------------------------------------------------------------- +void CImpsPDPIdleTimer::Start( TInt aWaitSeconds ) + { +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( _L( "CImpsPDPIdleTimer: Start sec =%d" ), aWaitSeconds ); +#endif + CImpsBaseTimer::Start( aWaitSeconds ); + } + +// ----------------------------------------------------------------------------- +// CImpsPDPIdleTimer::Stop +// ----------------------------------------------------------------------------- +void CImpsPDPIdleTimer::Stop() + { +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( _L( "CImpsPDPIdleTimer: Stop" ) ); +#endif + CImpsBaseTimer::Stop(); + } + +// ----------------------------------------------------------------------------- +// CImpsPDPIdleTimer::RunL +// ----------------------------------------------------------------------------- +void CImpsPDPIdleTimer::RunL() + { +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( _L( "PDPIdleTimer: RunL" ) ); +#endif + // This timer only calls ClosePDP() + if ( iStatus.Int() != KErrCancel ) + { + iServer.ClosePDP(); + } + iReset = EFalse; + Start( iSeconds ); + } + +//********************************** +// CImpsPDPOpenTimer +//********************************** + +CImpsPDPOpenTimer::CImpsPDPOpenTimer( + MImpsCSPSession& aServer, + TInt aPriority ) + : CImpsBaseTimer( aPriority ), + iServer( aServer ) + { + } + +CImpsPDPOpenTimer::~CImpsPDPOpenTimer() + { +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( _L( "CImpsPDPOpenTimer: DELETE" ) ); +#endif + } + +// ----------------------------------------------------------------------------- +// CImpsPDPOpenTimer::Start +// ----------------------------------------------------------------------------- +void CImpsPDPOpenTimer::Start( TInt aWaitSeconds ) + { +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( _L( "CImpsPDPOpenTimer: Start sec=%d" ), aWaitSeconds ); +#endif + CImpsBaseTimer::Start( aWaitSeconds ); + } +// ----------------------------------------------------------------------------- +// CImpsPDPOpenTimer::Stop +// ----------------------------------------------------------------------------- +void CImpsPDPOpenTimer::Stop() + { +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( _L( "CImpsPDPOpenTimer: Stop" ) ); +#endif + CImpsBaseTimer::Stop(); + } + +// ----------------------------------------------------------------------------- +// CImpsPDPOpenTimer::RunL +// ----------------------------------------------------------------------------- +void CImpsPDPOpenTimer::RunL() + { +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( _L( "CImpsPDPOpenTimer: RunL" ) ); +#endif + if ( iStatus.Int() != KErrCancel ) + { + TInt ret = iServer.OpenPDP(); + // if already open then do not start + if ( ret == KErrAlreadyExists ) + { +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( _L( "CImpsPDPOpenTimer: not started anymore ***" ) ); +#endif + return; + } + } + Start( iSeconds ); + } + +//********************************** +// CImpsShutdownTimer +//********************************** + +CImpsShutdownTimer::CImpsShutdownTimer( + CImpsServer& aServer, + TInt aPriority ) + : CImpsBaseTimer( aPriority ), + iServer( aServer ) + { + } + +CImpsShutdownTimer::~CImpsShutdownTimer() + { + iStatus = KErrNone; + } + +// ----------------------------------------------------------------------------- +// CImpsShutdownTimer::RunL +// ----------------------------------------------------------------------------- +void CImpsShutdownTimer::RunL() + { +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( _L( "ShutDownTimer: RunL" ) ); +#endif + if ( iStatus != KErrNone ) + { +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( _L( "ShutDownTimer: RunL ignored" ) ); +#endif + return; + } + if ( !iReset ) + { + iServer.DoShutDown(); + } + // It is extremely important that after the previous call this + // method does nothing since DoShutDown actully deletes the + // current entity if this class! + } + +// ----------------------------------------------------------------------------- +// CImpsShutdownTimer::Stop +// ----------------------------------------------------------------------------- +void CImpsShutdownTimer::Stop() + { +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( _L( "ShutDownTimer: Stop" ) ); +#endif + CImpsBaseTimer::Stop(); + } + +// ----------------------------------------------------------------------------- +// CImpsShutdownTimer::Start +// ----------------------------------------------------------------------------- +void CImpsShutdownTimer::Start( TInt aWaitSeconds ) + { +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( _L( "ShutDownTimer: Start sec=%d" ), aWaitSeconds ); +#endif + + Cancel(); + + if ( !aWaitSeconds ) + { + // Do the shut down ASAP + iStatus = KRequestPending; + SetActive(); + iReset = EFalse; + TRequestStatus* s = &iStatus; + User::RequestComplete( s, KErrNone ); +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( _L( "ShutDownTimer: RequestComplete" ) ); +#endif + } + else + { +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( _L( "ShutDownTimer: BaseTimer:Start begins" ) ); +#endif + CImpsBaseTimer::Start( aWaitSeconds ); + } +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( _L( "ShutDownTimer: Start ends" ) ); +#endif + } + +//********************************** +// CImpsExpiryTimer +//********************************** + +CImpsExpiryTimer::CImpsExpiryTimer( + CImpsServer& aServer, + TImpsEventType aType, + TInt aPriority ) + : CImpsBaseTimer( aPriority ), + iServer( aServer ), + iType ( aType ) + { + } + +CImpsExpiryTimer::~CImpsExpiryTimer() + { + } + +// ----------------------------------------------------------------------------- +// CImpsExpiryTimer::Start +// ----------------------------------------------------------------------------- +void CImpsExpiryTimer::Start( TInt aWaitSeconds ) + { +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( _L( "CImpsExpiryTimer: Start sec=%d" ), aWaitSeconds ); +#endif + CImpsBaseTimer::Start( aWaitSeconds ); + } + +// ----------------------------------------------------------------------------- +// CImpsExpiryTimer::Stop +// ----------------------------------------------------------------------------- +void CImpsExpiryTimer::Stop() + { +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( _L( "CImpsExpiryTimer: Stop" ) ); +#endif + CImpsBaseTimer::Stop(); + } + +// ----------------------------------------------------------------------------- +// CImpsExpiryTimer::RunL +// ----------------------------------------------------------------------------- +void CImpsExpiryTimer::RunL() + { +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( _L( "ExpiryTimer: RunL" ) ); +#endif + if ( iStatus == KErrNone ) + { + iServer.CheckExpiryL( iType ); + iTimer.After( iStatus, iSeconds * 1000000 ); + SetActive(); + } + else + { +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( _L( "ExpiryTimer: RunL ignored" ) ); +#endif + } + } + +//********************************** +// CImpsSendQueued +//********************************** + +CImpsSendQueued::CImpsSendQueued( + MImpsCSPSession& aServer, + TInt aPriority ) + : CActive( aPriority ), + iServer( aServer ), + iCanceled ( EFalse ) + { + // Add this to the scheduler + CActiveScheduler::Add( this ); + } + +CImpsSendQueued::~CImpsSendQueued() + { + Cancel(); + } + +// ----------------------------------------------------------------------------- +// CImpsSendQueued::Send +// ----------------------------------------------------------------------------- +void CImpsSendQueued::Send( ) + { +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( _L( "SendQueued: Send" ) ); +#endif + // This yields the control to the server thread active scheduler + if ( !IsActive() ) + { + iStatus = KRequestPending; + SetActive(); + iCanceled = EFalse; + TRequestStatus* s = &iStatus; + User::RequestComplete( s, KErrNone ); + } + } + +// ----------------------------------------------------------------------------- +// CImpsSendQueued::DoCancel +// ----------------------------------------------------------------------------- +void CImpsSendQueued::DoCancel() + { + iCanceled = ETrue; + } + +// ----------------------------------------------------------------------------- +// CImpsSendQueued::RunL +// ----------------------------------------------------------------------------- +void CImpsSendQueued::RunL() + { +#ifndef _NO_IMPS_LOGGING_ + CImpsClientLogger::Log( _L( "SendQueued: RunL" ) ); +#endif + if ( iCanceled || iStatus.Int() != KErrNone ) + { + return; + } + // Trigger a server thread to send a queued message + TInt errx = KErrNone; + TRAP( errx, iServer.DoSendAllQueuedL() ); + } + + +// End of File