keepalive/flextimer/server/src/flextimersession.cpp
branchRCL_3
changeset 58 83ca720e2b9a
parent 57 05bc53fe583b
child 62 bb1f80fb7db2
--- a/keepalive/flextimer/server/src/flextimersession.cpp	Tue Aug 31 15:35:44 2010 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,509 +0,0 @@
-/*
- * 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 CFlexTimerSession class.
- *
- */
-/*
- * %version: 1 %
- */
-
-// System include files
-#include <e32def.h>
-#include <e32cmn.h>
-#include <hal.h>
-
-// User include files go here:
-#include "flextimercommon.h"
-#include "flextimersession.h"
-#include "mflextimerservice.h"
-#include "OstTraceDefinitions.h"
-#ifdef OST_TRACE_COMPILER_IN_USE
-#include "flextimersessionTraces.h"
-#endif
-
-// Constants
-
-// ======== MEMBER FUNCTIONS ========
-
-// --------------------------------------------------------------------------
-// Constructor
-// --------------------------------------------------------------------------
-//
-CFlexTimerSession::CFlexTimerSession( MFlexTimerService* aFlexTimerService )
-:   iService( aFlexTimerService ),
-    iTimerWinSize( 0 ),
-    iUseDefaultWin( ETrue )
-    {
-    OstTrace1( TRACE_INTERNAL,
-               CFLEXTIMERSESSION,
-               "CFlexTimerSession::CFlexTimerSession; this=%x",
-               ( TUint )this );
-    }
-
-// --------------------------------------------------------------------------
-// Destructor
-// --------------------------------------------------------------------------
-//
-CFlexTimerSession::~CFlexTimerSession()
-    {
-    OstTrace1( TRACE_INTERNAL,
-               CFLEXTIMERSESSIOND,
-               "CFlexTimerSession::~CFlexTimerSession; this=%x",
-               ( TUint )this );
-    }
-
-// --------------------------------------------------------------------------
-// Function called from CFlexTimerService::RunL for messages targeted to
-// this session
-// --------------------------------------------------------------------------
-//
-void CFlexTimerSession::ServiceL( const RMessage2& aMessage )
-    {
-    TInt msgType( aMessage.Function() );
-
-    OstTraceExt2( TRACE_INTERNAL,
-                  CFLEXTIMERSESSION_MSG,
-                  "CFlexTimerSession::ServiceL; this=%x; msgType=%d",
-                  ( TInt )this,
-                  msgType );
-
-    // Check message type and pass it to correct handler. Handler either 
-    // stores the message or completes it immediately.
-    switch ( msgType )
-        {
-        case EFlexTimerServCancelRequest:
-            CancelTimer( aMessage );
-            break;
-        case EFlexTimerServAtRequest:
-            NewAtTimer( aMessage );
-            break;
-        case EFlexTimerServAtUTCRequest:
-            NewAtUtcTimer( aMessage );
-            break;
-        case EFlexTimerServAfterRequest:
-            NewAfterTimer( aMessage );
-            break;
-        case EFlexTimerServAfterTicksRequest:
-            NewAfterTicksTimer( aMessage );
-            break;
-        case EFlexTimerServConfigureRequest:
-            ConfigureParameters( aMessage );
-            break;
-        default:
-            OstTrace1(
-                    TRACE_INTERNAL,
-                    CFLEXTIMERSESSION_ERROR,
-                    "CFlexTimerSession::ServiceL: Unknown message; this=%x",
-                    ( TUint )this );
-            aMessage.Complete( KErrNotSupported );
-        }
-    }
-
-// --------------------------------------------------------------------------
-// Timeout handler for triggering timers
-// --------------------------------------------------------------------------
-//
-void CFlexTimerSession::Timeout() const
-    {
-    // Check for the validity of pending timeout request
-    if ( !iPendingTimeoutMsg.IsNull() )
-        {
-        OstTraceExt2( TRACE_INTERNAL,
-                      CFLEXTIMERSESSION_TIMEOUT,
-                      "CFlexTimerSession::Timeout; this=%x; msg=%x",
-                      ( TUint )this,
-                      ( TUint )iPendingTimeoutMsg.Handle() );
-        // Complete message, this sets message pointer to NULL
-        iPendingTimeoutMsg.Complete( KErrNone );
-        }
-    else
-        {
-        // No valid message pointer, nothing we can do here
-        OstTrace1( TRACE_INTERNAL,
-                   CFLEXTIMERSESSION_TIMEOUT_ERROR,
-                   "CFlexTimerSession::Timeout: No Pending message; this=%x",
-                   ( TUint )this );
-        }
-    }
-
-// --------------------------------------------------------------------------
-// Function for aborting At-timer
-// --------------------------------------------------------------------------
-//
-void CFlexTimerSession::Abort( TInt aReason ) const
-    {
-    // Check for the validity of pending timeout request
-    if ( !iPendingTimeoutMsg.IsNull() )
-        {
-        OstTraceExt2( TRACE_INTERNAL,
-                      CFLEXTIMERSESSION_ABORT,
-                      "CFlexTimerSession::Abort; this=%x; msg=%x",
-                      ( TUint )this,
-                      ( TUint )iPendingTimeoutMsg.Handle() );
-        // Complete message, this sets message pointer to NULL
-        iPendingTimeoutMsg.Complete( aReason );
-        }
-    else
-        {
-        // No valid message pointer, nothing we can do here
-        OstTrace1(
-                TRACE_INTERNAL,
-                CFLEXTIMERSESSION_ABORT_ERROR,
-                "CFlexTimerSession::Abort: No Pending message; this=%x",
-                ( TUint )this );
-
-        }
-    }
-
-// --------------------------------------------------------------------------
-// Handler function for starting At() -timer
-// --------------------------------------------------------------------------
-//
-void CFlexTimerSession::NewAtTimer( const RMessage2& aMessage )
-    {
-
-    // Check that we do not have a pending timer request
-    if ( !iPendingTimeoutMsg.IsNull() )
-        {
-        OstTraceExt2( TRACE_INTERNAL,
-                      CFLEXTIMERSESSION_ATPANIC,
-                      "CFlexTimerSession::NewAtTimer: Already pending; "
-                      "this=%x; msg=%x",
-                      ( TUint )this,
-                      ( TUint )iPendingTimeoutMsg.Handle() );
-
-        aMessage.Panic( KRFlexTimerPanicCat,
-                        EFlexTimerServerErrorPendingTimer );
-        return;
-        }
-
-    // Get interval from current time to the requested timestamp
-    TTime refTime;
-    refTime.HomeTime();
-    TTimeIntervalMicroSeconds interval;
-    GetIntervalToMsgTime( aMessage, refTime, interval );
-
-    OstTraceExt2( TRACE_INTERNAL,
-                  CFLEXTIMERSESSION_ATTIMER,
-                  "CFlexTimerSession::NewAtTimer; this=%x; interval=%lld",
-                  ( TUint )this,
-                  interval.Int64() );
-
-    // Add the timer to engine
-    DoAddTimer( aMessage, interval, ETrue );
-
-    }
-
-// --------------------------------------------------------------------------
-// Handler function for starting AtUTC() -timer
-// --------------------------------------------------------------------------
-//
-void CFlexTimerSession::NewAtUtcTimer( const RMessage2& aMessage )
-    {
-
-    // Check that we do not have a pending timer request
-    if ( !iPendingTimeoutMsg.IsNull() )
-        {
-        OstTraceExt2( TRACE_INTERNAL,
-                      CFLEXTIMERSESSION_ATUTCPANIC,
-                      "CFlexTimerSession::NewAtUtcTimer: Already pending; "
-                      "this=%x; msg=%x",
-                      ( TUint )this,
-                      ( TUint )iPendingTimeoutMsg.Handle() );
-
-        aMessage.Panic( KRFlexTimerPanicCat,
-                        EFlexTimerServerErrorPendingTimer );
-        return;
-        }
-
-    TTime refTime;
-    refTime.UniversalTime();
-    TTimeIntervalMicroSeconds interval;
-    GetIntervalToMsgTime( aMessage, refTime, interval );
-    
-    OstTraceExt2( 
-            TRACE_INTERNAL,
-            CFLEXTIMERSESSION_ATUTCTIMER,
-            "CFlexTimerSession::NewAtUtcTimer; this=%x; interval=%lld",
-            ( TUint )this,
-            interval.Int64() );
-
-    // Add the timer to engine
-    DoAddTimer( aMessage, interval, ETrue );
-
-    }
-
-// --------------------------------------------------------------------------
-// Handler function for starting After()-timer
-// --------------------------------------------------------------------------
-//
-void CFlexTimerSession::NewAfterTimer( const RMessage2& aMessage )
-    {
-
-    // Check that we do not have a pending timer request
-    if ( !iPendingTimeoutMsg.IsNull() )
-        {
-        OstTraceExt2( TRACE_INTERNAL,
-                      CFLEXTIMERSESSION_AFTERPANIC,
-                      "CFlexTimerSession::NewAfterTimer: Already pending; "
-                      "this=%x; msg=%x",
-                      ( TUint )this,
-                      ( TUint )iPendingTimeoutMsg.Handle() );
-
-        aMessage.Panic( KRFlexTimerPanicCat,
-                        EFlexTimerServerErrorPendingTimer );
-        return;
-        }
-
-    TInt64 timeStamp = MAKE_TINT64( aMessage.Int1(), aMessage.Int0() );
-    TTimeIntervalMicroSeconds interval( timeStamp );
-
-    OstTraceExt2(
-            TRACE_INTERNAL,
-            CFLEXTIMERSESSION_AFTERTIMER,
-            "CFlexTimerSession::NewAfterTimer; this=%x; interval=%llu",
-            ( TUint )this,
-            interval.Int64() );
-
-    // Add the timer to engine, request cancellation if the secure time
-    // is not available
-    DoAddTimer( aMessage, interval, EFalse );
-    }
-
-// --------------------------------------------------------------------------
-// Handler function for starting AfterTicks()-timer
-// --------------------------------------------------------------------------
-//
-void CFlexTimerSession::NewAfterTicksTimer( const RMessage2& aMessage )
-    {
-
-    // Check that we do not have a pending timer request
-    if ( !iPendingTimeoutMsg.IsNull() )
-        {
-        OstTraceExt2(
-                TRACE_INTERNAL,
-                CFLEXTIMERSESSION_AFTERTICKSPANIC,
-                "CFlexTimerSession::NewAfterTicksTimer: Already pending; "
-                "this=%x; msg=%x",
-                ( TUint )this,
-                ( TUint )iPendingTimeoutMsg.Handle() );
-
-        aMessage.Panic( KRFlexTimerPanicCat,
-                        EFlexTimerServerErrorPendingTimer );
-        return;
-        }
-
-    // Get the tick period from HAL and convert ticks to microseconds
-    TInt tickUs;
-    HAL::Get( HAL::ESystemTickPeriod, tickUs );
-
-    TTimeIntervalMicroSeconds interval =
-            static_cast<TInt64> ( aMessage.Int0() ) * tickUs;
-
-    OstTraceExt2(
-            TRACE_INTERNAL,
-            CFLEXTIMERSESSION_AFTERTICKSTIMER,
-            "CFlexTimerSession::NewAfterTicksTimer; this=%x; interval=%llu",
-            ( TUint )this,
-            interval.Int64() );
-
-    // Add the timer to engine
-    DoAddTimer( aMessage, interval, EFalse );
-    }
-
-// --------------------------------------------------------------------------
-// Handler function for cancelling running timer
-// --------------------------------------------------------------------------
-//
-void CFlexTimerSession::CancelTimer( const RMessage2& aMessage )
-    {
-    TInt ret;
-    // Check that we have a pending timer request
-    if ( iPendingTimeoutMsg.IsNull() )
-        {
-        OstTrace1(
-                TRACE_INTERNAL,
-                CFLEXTIMERSESSION_CANCELERROR,
-                "CFlexTimerSession::CancelTimer: no pending msg; this=%x",
-                ( TUint )this );
-        ret = KErrNotFound;
-        }
-    else
-        {
-        ret = iService->CancelTimer( this );
-        OstTraceExt2( TRACE_INTERNAL,
-                      CFLEXTIMERSESSION_CANCEL,
-                      "CFlexTimerSession::CancelTimer; this=%x; ret=%d",
-                      ( TUint )this,
-                      ret );
-
-        // Complete pending message, this sets message pointer to NULL
-        iPendingTimeoutMsg.Complete( KErrCancel );
-        }
-
-    // Complete cancel message
-    aMessage.Complete( ret );
-    }
-
-// --------------------------------------------------------------------------
-// Handler function for configuring timer parameters
-// --------------------------------------------------------------------------
-//
-void CFlexTimerSession::ConfigureParameters( const RMessage2& aMessage )
-    {
-    TInt ret( KErrNone );
-
-    // Configuration is not allowed when there is a pending message
-    if ( !iPendingTimeoutMsg.IsNull() )
-        {
-        OstTrace1( TRACE_INTERNAL,
-                   CFLEXTIMERSESSION_CONFIGERROR,
-                   "CFlexTimerSession::ConfigureParameters: Timer pending; "
-                   "this=%x",
-                   ( TUint )this );
-        ret = KErrInUse;
-        }
-    else
-        {
-        TInt paramType( aMessage.Int0() );
-        OstTraceExt2( TRACE_INTERNAL,
-                      CFLEXTIMERSESSION_CONFIG,
-                      "CFlexTimerSession::ConfigureParameters; this=%x; "
-                      "paramType=%d",
-                      ( TUint )this,
-                      paramType );
-
-        switch ( paramType )
-            {
-            case EConfigureRequestWindowSize:
-                {
-                TInt winLo = aMessage.Int1();
-                TInt winHi = aMessage.Int2();
-
-                iTimerWinSize = MAKE_TINT64( winHi, winLo );
-                iUseDefaultWin = EFalse;
-
-                OstTraceExt1( TRACE_INTERNAL,
-                              CFLEXTIMERSESSION_CONFIGWIN,
-                              "CFlexTimerSession::ConfigureParameters; "
-                              "iTimerWinSize=%lld",
-                              iTimerWinSize.Int64() );
-                
-                if ( iTimerWinSize.Int64() < 0 ||
-                    iTimerWinSize.Int64() > KFlexTimerMaxTimerLength )
-                    {
-                    aMessage.Panic( KRFlexTimerPanicCat,
-                        EFlexTimerServerIllegalTimerValue );
-                    // Return after panicing the client -- completing the
-                    // message afterwards panics the server with USER 70.
-                    return;
-                    }
-                break;
-                }
-            default:
-                OstTrace0( TRACE_INTERNAL,
-                           CFLEXTIMERSESSION_CONFIGUNKNOWN,
-                           "CFlexTimerSession::ConfigureParameters: "
-                           "ERROR - Invalid parameter type" );
-                ret = KErrNotSupported;
-                break;
-            }
-        }
-    aMessage.Complete( ret );
-    }
-
-// --------------------------------------------------------------------------
-// Function for adding timer to engine and handling its return value
-// --------------------------------------------------------------------------
-//
-void CFlexTimerSession::DoAddTimer( const RMessage2& aMessage,
-                                    TTimeIntervalMicroSeconds& aWinEnd,
-                                    TBool aRequestAbort )
-    {
-    OstTraceExt4( TRACE_INTERNAL,
-               CFLEXTIMERSESSION_ADDTIMER,
-               "CFlexTimerSession::DoAddTimer; this=%x; msg=%x; aWinEnd=%llu;"
-               " aRequestAbort=%d",
-               ( TUint )this,
-               ( TUint )aMessage.Handle(),
-               aWinEnd.Int64(),
-               aRequestAbort );  
-    
-    // Check that the timer has valid values.
-    if ( aWinEnd.Int64() < 0 || aWinEnd.Int64() > KFlexTimerMaxTimerLength)
-        {
-        OstTraceExt4( TRACE_INTERNAL, 
-                      CFLEXTIMERSESSION_DOADDTIMER, 
-                      "CFlexTimerSession::DoAddTimer;Invalid parameters "
-                      "- panicing client;this=%x;aMessage=%x;aWinEnd=%llu;"
-                      "aRequestAbort=%d", 
-                      ( TUint )this, 
-                      ( TUint )aMessage.Handle(), 
-                      aWinEnd.Int64(),
-                      aRequestAbort );
-        aMessage.Panic( KRFlexTimerPanicCat,
-                        EFlexTimerServerIllegalTimerValue );
-        return;
-        }
-    
-    TTimeIntervalMicroSeconds winStart;
-    TTimeIntervalMicroSeconds window = iTimerWinSize;
-    
-    if ( iUseDefaultWin )
-        {
-        window = static_cast<TInt64> ( static_cast<TReal64> ( aWinEnd.Int64() )
-            * KDefaultWindowMultiplier );
-        }
-
-    winStart = aWinEnd.Int64() - window.Int64();
-
-    // Store pending message. Not completed until timer expires.
-    // Note that in case of zero or negative timer value, message can
-    // be completed through Timeout() even before AddTimer returns. This
-    // implementation saves some checks and timer stopping/starting in engine.
-    iPendingTimeoutMsg = aMessage;
-
-    // Add timer to engine
-    TInt ret = iService->AddTimer( winStart, aWinEnd, aRequestAbort, this );
-
-    if ( KErrNone != ret )
-        {
-        // Failed, pass error code to client side
-        OstTraceExt2( TRACE_INTERNAL,
-                   CFLEXTIMERSESSION_ADDERROR,
-                   "CFlexTimerSession::DoAddTimer: Error; this=%x, ret=%d",
-                   ( TUint )this,
-                   ret );
-        // Complete pending message, this sets message pointer to NULL
-        iPendingTimeoutMsg.Complete( ret );
-        }
-    }
-
-// --------------------------------------------------------------------------
-// From CSession2
-// Function for handling unintentional termination of the client
-// --------------------------------------------------------------------------
-//
-void CFlexTimerSession::Disconnect( const RMessage2 &aMessage )
-    {
-    // The client of this session has died.
-    
-    // Remove timer from engine.
-    iService->CancelTimer( this );
-
-    // Disconnect() must end with a call to the base class implementation, 
-    // which will delete the session object and complete the disconnect 
-    // message.
-    CSession2::Disconnect( aMessage );
-    }