keepalive/flextimer/server/src/flextimersession.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 CFlexTimerSession 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
hgs
parents:
diff changeset
    21
// System include files
hgs
parents:
diff changeset
    22
#include <e32def.h>
hgs
parents:
diff changeset
    23
#include <e32cmn.h>
hgs
parents:
diff changeset
    24
#include <hal.h>
hgs
parents:
diff changeset
    25
hgs
parents:
diff changeset
    26
// User include files go here:
hgs
parents:
diff changeset
    27
#include "flextimercommon.h"
hgs
parents:
diff changeset
    28
#include "flextimersession.h"
hgs
parents:
diff changeset
    29
#include "mflextimerservice.h"
hgs
parents:
diff changeset
    30
#include "OstTraceDefinitions.h"
hgs
parents:
diff changeset
    31
#ifdef OST_TRACE_COMPILER_IN_USE
hgs
parents:
diff changeset
    32
#include "flextimersessionTraces.h"
hgs
parents:
diff changeset
    33
#endif
hgs
parents:
diff changeset
    34
hgs
parents:
diff changeset
    35
// Constants
hgs
parents:
diff changeset
    36
hgs
parents:
diff changeset
    37
// ======== MEMBER FUNCTIONS ========
hgs
parents:
diff changeset
    38
hgs
parents:
diff changeset
    39
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    40
// Constructor
hgs
parents:
diff changeset
    41
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    42
//
hgs
parents:
diff changeset
    43
CFlexTimerSession::CFlexTimerSession( MFlexTimerService* aFlexTimerService )
hgs
parents:
diff changeset
    44
:   iService( aFlexTimerService ),
hgs
parents:
diff changeset
    45
    iTimerWinSize( 0 ),
hgs
parents:
diff changeset
    46
    iUseDefaultWin( ETrue )
hgs
parents:
diff changeset
    47
    {
hgs
parents:
diff changeset
    48
    OstTrace1( TRACE_INTERNAL,
hgs
parents:
diff changeset
    49
               CFLEXTIMERSESSION,
hgs
parents:
diff changeset
    50
               "CFlexTimerSession::CFlexTimerSession; this=%x",
hgs
parents:
diff changeset
    51
               ( TUint )this );
hgs
parents:
diff changeset
    52
    }
hgs
parents:
diff changeset
    53
hgs
parents:
diff changeset
    54
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    55
// Destructor
hgs
parents:
diff changeset
    56
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    57
//
hgs
parents:
diff changeset
    58
CFlexTimerSession::~CFlexTimerSession()
hgs
parents:
diff changeset
    59
    {
hgs
parents:
diff changeset
    60
    OstTrace1( TRACE_INTERNAL,
hgs
parents:
diff changeset
    61
               CFLEXTIMERSESSIOND,
hgs
parents:
diff changeset
    62
               "CFlexTimerSession::~CFlexTimerSession; this=%x",
hgs
parents:
diff changeset
    63
               ( TUint )this );
hgs
parents:
diff changeset
    64
    }
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    67
// Function called from CFlexTimerService::RunL for messages targeted to
hgs
parents:
diff changeset
    68
// this session
hgs
parents:
diff changeset
    69
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    70
//
hgs
parents:
diff changeset
    71
void CFlexTimerSession::ServiceL( const RMessage2& aMessage )
hgs
parents:
diff changeset
    72
    {
hgs
parents:
diff changeset
    73
    TInt msgType( aMessage.Function() );
hgs
parents:
diff changeset
    74
hgs
parents:
diff changeset
    75
    OstTraceExt2( TRACE_INTERNAL,
hgs
parents:
diff changeset
    76
                  CFLEXTIMERSESSION_MSG,
hgs
parents:
diff changeset
    77
                  "CFlexTimerSession::ServiceL; this=%x; msgType=%d",
hgs
parents:
diff changeset
    78
                  ( TInt )this,
hgs
parents:
diff changeset
    79
                  msgType );
hgs
parents:
diff changeset
    80
hgs
parents:
diff changeset
    81
    // Check message type and pass it to correct handler. Handler either 
hgs
parents:
diff changeset
    82
    // stores the message or completes it immediately.
hgs
parents:
diff changeset
    83
    switch ( msgType )
hgs
parents:
diff changeset
    84
        {
hgs
parents:
diff changeset
    85
        case EFlexTimerServCancelRequest:
hgs
parents:
diff changeset
    86
            CancelTimer( aMessage );
hgs
parents:
diff changeset
    87
            break;
hgs
parents:
diff changeset
    88
        case EFlexTimerServAtRequest:
hgs
parents:
diff changeset
    89
            NewAtTimer( aMessage );
hgs
parents:
diff changeset
    90
            break;
hgs
parents:
diff changeset
    91
        case EFlexTimerServAtUTCRequest:
hgs
parents:
diff changeset
    92
            NewAtUtcTimer( aMessage );
hgs
parents:
diff changeset
    93
            break;
hgs
parents:
diff changeset
    94
        case EFlexTimerServAfterRequest:
hgs
parents:
diff changeset
    95
            NewAfterTimer( aMessage );
hgs
parents:
diff changeset
    96
            break;
hgs
parents:
diff changeset
    97
        case EFlexTimerServAfterTicksRequest:
hgs
parents:
diff changeset
    98
            NewAfterTicksTimer( aMessage );
hgs
parents:
diff changeset
    99
            break;
hgs
parents:
diff changeset
   100
        case EFlexTimerServConfigureRequest:
hgs
parents:
diff changeset
   101
            ConfigureParameters( aMessage );
hgs
parents:
diff changeset
   102
            break;
hgs
parents:
diff changeset
   103
        default:
hgs
parents:
diff changeset
   104
            OstTrace1(
hgs
parents:
diff changeset
   105
                    TRACE_INTERNAL,
hgs
parents:
diff changeset
   106
                    CFLEXTIMERSESSION_ERROR,
hgs
parents:
diff changeset
   107
                    "CFlexTimerSession::ServiceL: Unknown message; this=%x",
hgs
parents:
diff changeset
   108
                    ( TUint )this );
hgs
parents:
diff changeset
   109
            aMessage.Complete( KErrNotSupported );
hgs
parents:
diff changeset
   110
        }
hgs
parents:
diff changeset
   111
    }
hgs
parents:
diff changeset
   112
hgs
parents:
diff changeset
   113
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   114
// Timeout handler for triggering timers
hgs
parents:
diff changeset
   115
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   116
//
hgs
parents:
diff changeset
   117
void CFlexTimerSession::Timeout() const
hgs
parents:
diff changeset
   118
    {
hgs
parents:
diff changeset
   119
    // Check for the validity of pending timeout request
hgs
parents:
diff changeset
   120
    if ( !iPendingTimeoutMsg.IsNull() )
hgs
parents:
diff changeset
   121
        {
hgs
parents:
diff changeset
   122
        OstTraceExt2( TRACE_INTERNAL,
hgs
parents:
diff changeset
   123
                      CFLEXTIMERSESSION_TIMEOUT,
hgs
parents:
diff changeset
   124
                      "CFlexTimerSession::Timeout; this=%x; msg=%x",
hgs
parents:
diff changeset
   125
                      ( TUint )this,
hgs
parents:
diff changeset
   126
                      ( TUint )iPendingTimeoutMsg.Handle() );
hgs
parents:
diff changeset
   127
        // Complete message, this sets message pointer to NULL
hgs
parents:
diff changeset
   128
        iPendingTimeoutMsg.Complete( KErrNone );
hgs
parents:
diff changeset
   129
        }
hgs
parents:
diff changeset
   130
    else
hgs
parents:
diff changeset
   131
        {
hgs
parents:
diff changeset
   132
        // No valid message pointer, nothing we can do here
hgs
parents:
diff changeset
   133
        OstTrace1( TRACE_INTERNAL,
hgs
parents:
diff changeset
   134
                   CFLEXTIMERSESSION_TIMEOUT_ERROR,
hgs
parents:
diff changeset
   135
                   "CFlexTimerSession::Timeout: No Pending message; this=%x",
hgs
parents:
diff changeset
   136
                   ( TUint )this );
hgs
parents:
diff changeset
   137
        }
hgs
parents:
diff changeset
   138
    }
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   141
// Function for aborting At-timer
hgs
parents:
diff changeset
   142
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   143
//
hgs
parents:
diff changeset
   144
void CFlexTimerSession::Abort( TInt aReason ) const
hgs
parents:
diff changeset
   145
    {
hgs
parents:
diff changeset
   146
    // Check for the validity of pending timeout request
hgs
parents:
diff changeset
   147
    if ( !iPendingTimeoutMsg.IsNull() )
hgs
parents:
diff changeset
   148
        {
hgs
parents:
diff changeset
   149
        OstTraceExt2( TRACE_INTERNAL,
hgs
parents:
diff changeset
   150
                      CFLEXTIMERSESSION_ABORT,
hgs
parents:
diff changeset
   151
                      "CFlexTimerSession::Abort; this=%x; msg=%x",
hgs
parents:
diff changeset
   152
                      ( TUint )this,
hgs
parents:
diff changeset
   153
                      ( TUint )iPendingTimeoutMsg.Handle() );
hgs
parents:
diff changeset
   154
        // Complete message, this sets message pointer to NULL
hgs
parents:
diff changeset
   155
        iPendingTimeoutMsg.Complete( aReason );
hgs
parents:
diff changeset
   156
        }
hgs
parents:
diff changeset
   157
    else
hgs
parents:
diff changeset
   158
        {
hgs
parents:
diff changeset
   159
        // No valid message pointer, nothing we can do here
hgs
parents:
diff changeset
   160
        OstTrace1(
hgs
parents:
diff changeset
   161
                TRACE_INTERNAL,
hgs
parents:
diff changeset
   162
                CFLEXTIMERSESSION_ABORT_ERROR,
hgs
parents:
diff changeset
   163
                "CFlexTimerSession::Abort: No Pending message; this=%x",
hgs
parents:
diff changeset
   164
                ( TUint )this );
hgs
parents:
diff changeset
   165
hgs
parents:
diff changeset
   166
        }
hgs
parents:
diff changeset
   167
    }
hgs
parents:
diff changeset
   168
hgs
parents:
diff changeset
   169
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   170
// Handler function for starting At() -timer
hgs
parents:
diff changeset
   171
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   172
//
hgs
parents:
diff changeset
   173
void CFlexTimerSession::NewAtTimer( const RMessage2& aMessage )
hgs
parents:
diff changeset
   174
    {
hgs
parents:
diff changeset
   175
hgs
parents:
diff changeset
   176
    // Check that we do not have a pending timer request
hgs
parents:
diff changeset
   177
    if ( !iPendingTimeoutMsg.IsNull() )
hgs
parents:
diff changeset
   178
        {
hgs
parents:
diff changeset
   179
        OstTraceExt2( TRACE_INTERNAL,
hgs
parents:
diff changeset
   180
                      CFLEXTIMERSESSION_ATPANIC,
hgs
parents:
diff changeset
   181
                      "CFlexTimerSession::NewAtTimer: Already pending; "
hgs
parents:
diff changeset
   182
                      "this=%x; msg=%x",
hgs
parents:
diff changeset
   183
                      ( TUint )this,
hgs
parents:
diff changeset
   184
                      ( TUint )iPendingTimeoutMsg.Handle() );
hgs
parents:
diff changeset
   185
hgs
parents:
diff changeset
   186
        aMessage.Panic( KRFlexTimerPanicCat,
hgs
parents:
diff changeset
   187
                        EFlexTimerServerErrorPendingTimer );
hgs
parents:
diff changeset
   188
        return;
hgs
parents:
diff changeset
   189
        }
hgs
parents:
diff changeset
   190
hgs
parents:
diff changeset
   191
    // Get interval from current time to the requested timestamp
hgs
parents:
diff changeset
   192
    TTime refTime;
hgs
parents:
diff changeset
   193
    refTime.HomeTime();
hgs
parents:
diff changeset
   194
    TTimeIntervalMicroSeconds interval;
hgs
parents:
diff changeset
   195
    GetIntervalToMsgTime( aMessage, refTime, interval );
hgs
parents:
diff changeset
   196
hgs
parents:
diff changeset
   197
    OstTraceExt2( TRACE_INTERNAL,
hgs
parents:
diff changeset
   198
                  CFLEXTIMERSESSION_ATTIMER,
hgs
parents:
diff changeset
   199
                  "CFlexTimerSession::NewAtTimer; this=%x; interval=%lld",
hgs
parents:
diff changeset
   200
                  ( TUint )this,
hgs
parents:
diff changeset
   201
                  interval.Int64() );
hgs
parents:
diff changeset
   202
hgs
parents:
diff changeset
   203
    // Add the timer to engine
hgs
parents:
diff changeset
   204
    DoAddTimer( aMessage, interval, ETrue );
hgs
parents:
diff changeset
   205
hgs
parents:
diff changeset
   206
    }
hgs
parents:
diff changeset
   207
hgs
parents:
diff changeset
   208
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   209
// Handler function for starting AtUTC() -timer
hgs
parents:
diff changeset
   210
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   211
//
hgs
parents:
diff changeset
   212
void CFlexTimerSession::NewAtUtcTimer( const RMessage2& aMessage )
hgs
parents:
diff changeset
   213
    {
hgs
parents:
diff changeset
   214
hgs
parents:
diff changeset
   215
    // Check that we do not have a pending timer request
hgs
parents:
diff changeset
   216
    if ( !iPendingTimeoutMsg.IsNull() )
hgs
parents:
diff changeset
   217
        {
hgs
parents:
diff changeset
   218
        OstTraceExt2( TRACE_INTERNAL,
hgs
parents:
diff changeset
   219
                      CFLEXTIMERSESSION_ATUTCPANIC,
hgs
parents:
diff changeset
   220
                      "CFlexTimerSession::NewAtUtcTimer: Already pending; "
hgs
parents:
diff changeset
   221
                      "this=%x; msg=%x",
hgs
parents:
diff changeset
   222
                      ( TUint )this,
hgs
parents:
diff changeset
   223
                      ( TUint )iPendingTimeoutMsg.Handle() );
hgs
parents:
diff changeset
   224
hgs
parents:
diff changeset
   225
        aMessage.Panic( KRFlexTimerPanicCat,
hgs
parents:
diff changeset
   226
                        EFlexTimerServerErrorPendingTimer );
hgs
parents:
diff changeset
   227
        return;
hgs
parents:
diff changeset
   228
        }
hgs
parents:
diff changeset
   229
hgs
parents:
diff changeset
   230
    TTime refTime;
hgs
parents:
diff changeset
   231
    refTime.UniversalTime();
hgs
parents:
diff changeset
   232
    TTimeIntervalMicroSeconds interval;
hgs
parents:
diff changeset
   233
    GetIntervalToMsgTime( aMessage, refTime, interval );
hgs
parents:
diff changeset
   234
    
hgs
parents:
diff changeset
   235
    OstTraceExt2( 
hgs
parents:
diff changeset
   236
            TRACE_INTERNAL,
hgs
parents:
diff changeset
   237
            CFLEXTIMERSESSION_ATUTCTIMER,
hgs
parents:
diff changeset
   238
            "CFlexTimerSession::NewAtUtcTimer; this=%x; interval=%lld",
hgs
parents:
diff changeset
   239
            ( TUint )this,
hgs
parents:
diff changeset
   240
            interval.Int64() );
hgs
parents:
diff changeset
   241
hgs
parents:
diff changeset
   242
    // Add the timer to engine
hgs
parents:
diff changeset
   243
    DoAddTimer( aMessage, interval, ETrue );
hgs
parents:
diff changeset
   244
hgs
parents:
diff changeset
   245
    }
hgs
parents:
diff changeset
   246
hgs
parents:
diff changeset
   247
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   248
// Handler function for starting After()-timer
hgs
parents:
diff changeset
   249
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   250
//
hgs
parents:
diff changeset
   251
void CFlexTimerSession::NewAfterTimer( const RMessage2& aMessage )
hgs
parents:
diff changeset
   252
    {
hgs
parents:
diff changeset
   253
hgs
parents:
diff changeset
   254
    // Check that we do not have a pending timer request
hgs
parents:
diff changeset
   255
    if ( !iPendingTimeoutMsg.IsNull() )
hgs
parents:
diff changeset
   256
        {
hgs
parents:
diff changeset
   257
        OstTraceExt2( TRACE_INTERNAL,
hgs
parents:
diff changeset
   258
                      CFLEXTIMERSESSION_AFTERPANIC,
hgs
parents:
diff changeset
   259
                      "CFlexTimerSession::NewAfterTimer: Already pending; "
hgs
parents:
diff changeset
   260
                      "this=%x; msg=%x",
hgs
parents:
diff changeset
   261
                      ( TUint )this,
hgs
parents:
diff changeset
   262
                      ( TUint )iPendingTimeoutMsg.Handle() );
hgs
parents:
diff changeset
   263
hgs
parents:
diff changeset
   264
        aMessage.Panic( KRFlexTimerPanicCat,
hgs
parents:
diff changeset
   265
                        EFlexTimerServerErrorPendingTimer );
hgs
parents:
diff changeset
   266
        return;
hgs
parents:
diff changeset
   267
        }
hgs
parents:
diff changeset
   268
hgs
parents:
diff changeset
   269
    TInt64 timeStamp = MAKE_TINT64( aMessage.Int1(), aMessage.Int0() );
hgs
parents:
diff changeset
   270
    TTimeIntervalMicroSeconds interval( timeStamp );
hgs
parents:
diff changeset
   271
hgs
parents:
diff changeset
   272
    OstTraceExt2(
hgs
parents:
diff changeset
   273
            TRACE_INTERNAL,
hgs
parents:
diff changeset
   274
            CFLEXTIMERSESSION_AFTERTIMER,
hgs
parents:
diff changeset
   275
            "CFlexTimerSession::NewAfterTimer; this=%x; interval=%llu",
hgs
parents:
diff changeset
   276
            ( TUint )this,
hgs
parents:
diff changeset
   277
            interval.Int64() );
hgs
parents:
diff changeset
   278
hgs
parents:
diff changeset
   279
    // Add the timer to engine, request cancellation if the secure time
hgs
parents:
diff changeset
   280
    // is not available
hgs
parents:
diff changeset
   281
    DoAddTimer( aMessage, interval, EFalse );
hgs
parents:
diff changeset
   282
    }
hgs
parents:
diff changeset
   283
hgs
parents:
diff changeset
   284
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   285
// Handler function for starting AfterTicks()-timer
hgs
parents:
diff changeset
   286
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   287
//
hgs
parents:
diff changeset
   288
void CFlexTimerSession::NewAfterTicksTimer( const RMessage2& aMessage )
hgs
parents:
diff changeset
   289
    {
hgs
parents:
diff changeset
   290
hgs
parents:
diff changeset
   291
    // Check that we do not have a pending timer request
hgs
parents:
diff changeset
   292
    if ( !iPendingTimeoutMsg.IsNull() )
hgs
parents:
diff changeset
   293
        {
hgs
parents:
diff changeset
   294
        OstTraceExt2(
hgs
parents:
diff changeset
   295
                TRACE_INTERNAL,
hgs
parents:
diff changeset
   296
                CFLEXTIMERSESSION_AFTERTICKSPANIC,
hgs
parents:
diff changeset
   297
                "CFlexTimerSession::NewAfterTicksTimer: Already pending; "
hgs
parents:
diff changeset
   298
                "this=%x; msg=%x",
hgs
parents:
diff changeset
   299
                ( TUint )this,
hgs
parents:
diff changeset
   300
                ( TUint )iPendingTimeoutMsg.Handle() );
hgs
parents:
diff changeset
   301
hgs
parents:
diff changeset
   302
        aMessage.Panic( KRFlexTimerPanicCat,
hgs
parents:
diff changeset
   303
                        EFlexTimerServerErrorPendingTimer );
hgs
parents:
diff changeset
   304
        return;
hgs
parents:
diff changeset
   305
        }
hgs
parents:
diff changeset
   306
hgs
parents:
diff changeset
   307
    // Get the tick period from HAL and convert ticks to microseconds
hgs
parents:
diff changeset
   308
    TInt tickUs;
hgs
parents:
diff changeset
   309
    HAL::Get( HAL::ESystemTickPeriod, tickUs );
hgs
parents:
diff changeset
   310
hgs
parents:
diff changeset
   311
    TTimeIntervalMicroSeconds interval =
hgs
parents:
diff changeset
   312
            static_cast<TInt64> ( aMessage.Int0() ) * tickUs;
hgs
parents:
diff changeset
   313
hgs
parents:
diff changeset
   314
    OstTraceExt2(
hgs
parents:
diff changeset
   315
            TRACE_INTERNAL,
hgs
parents:
diff changeset
   316
            CFLEXTIMERSESSION_AFTERTICKSTIMER,
hgs
parents:
diff changeset
   317
            "CFlexTimerSession::NewAfterTicksTimer; this=%x; interval=%llu",
hgs
parents:
diff changeset
   318
            ( TUint )this,
hgs
parents:
diff changeset
   319
            interval.Int64() );
hgs
parents:
diff changeset
   320
hgs
parents:
diff changeset
   321
    // Add the timer to engine
hgs
parents:
diff changeset
   322
    DoAddTimer( aMessage, interval, EFalse );
hgs
parents:
diff changeset
   323
    }
hgs
parents:
diff changeset
   324
hgs
parents:
diff changeset
   325
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   326
// Handler function for cancelling running timer
hgs
parents:
diff changeset
   327
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   328
//
hgs
parents:
diff changeset
   329
void CFlexTimerSession::CancelTimer( const RMessage2& aMessage )
hgs
parents:
diff changeset
   330
    {
hgs
parents:
diff changeset
   331
    TInt ret;
hgs
parents:
diff changeset
   332
    // Check that we have a pending timer request
hgs
parents:
diff changeset
   333
    if ( iPendingTimeoutMsg.IsNull() )
hgs
parents:
diff changeset
   334
        {
hgs
parents:
diff changeset
   335
        OstTrace1(
hgs
parents:
diff changeset
   336
                TRACE_INTERNAL,
hgs
parents:
diff changeset
   337
                CFLEXTIMERSESSION_CANCELERROR,
hgs
parents:
diff changeset
   338
                "CFlexTimerSession::CancelTimer: no pending msg; this=%x",
hgs
parents:
diff changeset
   339
                ( TUint )this );
hgs
parents:
diff changeset
   340
        ret = KErrNotFound;
hgs
parents:
diff changeset
   341
        }
hgs
parents:
diff changeset
   342
    else
hgs
parents:
diff changeset
   343
        {
hgs
parents:
diff changeset
   344
        ret = iService->CancelTimer( this );
hgs
parents:
diff changeset
   345
        OstTraceExt2( TRACE_INTERNAL,
hgs
parents:
diff changeset
   346
                      CFLEXTIMERSESSION_CANCEL,
hgs
parents:
diff changeset
   347
                      "CFlexTimerSession::CancelTimer; this=%x; ret=%d",
hgs
parents:
diff changeset
   348
                      ( TUint )this,
hgs
parents:
diff changeset
   349
                      ret );
hgs
parents:
diff changeset
   350
hgs
parents:
diff changeset
   351
        // Complete pending message, this sets message pointer to NULL
hgs
parents:
diff changeset
   352
        iPendingTimeoutMsg.Complete( KErrCancel );
hgs
parents:
diff changeset
   353
        }
hgs
parents:
diff changeset
   354
hgs
parents:
diff changeset
   355
    // Complete cancel message
hgs
parents:
diff changeset
   356
    aMessage.Complete( ret );
hgs
parents:
diff changeset
   357
    }
hgs
parents:
diff changeset
   358
hgs
parents:
diff changeset
   359
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   360
// Handler function for configuring timer parameters
hgs
parents:
diff changeset
   361
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   362
//
hgs
parents:
diff changeset
   363
void CFlexTimerSession::ConfigureParameters( const RMessage2& aMessage )
hgs
parents:
diff changeset
   364
    {
hgs
parents:
diff changeset
   365
    TInt ret( KErrNone );
hgs
parents:
diff changeset
   366
hgs
parents:
diff changeset
   367
    // Configuration is not allowed when there is a pending message
hgs
parents:
diff changeset
   368
    if ( !iPendingTimeoutMsg.IsNull() )
hgs
parents:
diff changeset
   369
        {
hgs
parents:
diff changeset
   370
        OstTrace1( TRACE_INTERNAL,
hgs
parents:
diff changeset
   371
                   CFLEXTIMERSESSION_CONFIGERROR,
hgs
parents:
diff changeset
   372
                   "CFlexTimerSession::ConfigureParameters: Timer pending; "
hgs
parents:
diff changeset
   373
                   "this=%x",
hgs
parents:
diff changeset
   374
                   ( TUint )this );
hgs
parents:
diff changeset
   375
        ret = KErrInUse;
hgs
parents:
diff changeset
   376
        }
hgs
parents:
diff changeset
   377
    else
hgs
parents:
diff changeset
   378
        {
hgs
parents:
diff changeset
   379
        TInt paramType( aMessage.Int0() );
hgs
parents:
diff changeset
   380
        OstTraceExt2( TRACE_INTERNAL,
hgs
parents:
diff changeset
   381
                      CFLEXTIMERSESSION_CONFIG,
hgs
parents:
diff changeset
   382
                      "CFlexTimerSession::ConfigureParameters; this=%x; "
hgs
parents:
diff changeset
   383
                      "paramType=%d",
hgs
parents:
diff changeset
   384
                      ( TUint )this,
hgs
parents:
diff changeset
   385
                      paramType );
hgs
parents:
diff changeset
   386
hgs
parents:
diff changeset
   387
        switch ( paramType )
hgs
parents:
diff changeset
   388
            {
hgs
parents:
diff changeset
   389
            case EConfigureRequestWindowSize:
hgs
parents:
diff changeset
   390
                {
hgs
parents:
diff changeset
   391
                TInt winLo = aMessage.Int1();
hgs
parents:
diff changeset
   392
                TInt winHi = aMessage.Int2();
hgs
parents:
diff changeset
   393
hgs
parents:
diff changeset
   394
                iTimerWinSize = MAKE_TINT64( winHi, winLo );
hgs
parents:
diff changeset
   395
                iUseDefaultWin = EFalse;
hgs
parents:
diff changeset
   396
hgs
parents:
diff changeset
   397
                OstTraceExt1( TRACE_INTERNAL,
hgs
parents:
diff changeset
   398
                              CFLEXTIMERSESSION_CONFIGWIN,
hgs
parents:
diff changeset
   399
                              "CFlexTimerSession::ConfigureParameters; "
hgs
parents:
diff changeset
   400
                              "iTimerWinSize=%lld",
hgs
parents:
diff changeset
   401
                              iTimerWinSize.Int64() );
hgs
parents:
diff changeset
   402
                
hgs
parents:
diff changeset
   403
                if ( iTimerWinSize.Int64() < 0 ||
hgs
parents:
diff changeset
   404
                    iTimerWinSize.Int64() > KFlexTimerMaxTimerLength )
hgs
parents:
diff changeset
   405
                    {
hgs
parents:
diff changeset
   406
                    aMessage.Panic( KRFlexTimerPanicCat,
hgs
parents:
diff changeset
   407
                        EFlexTimerServerIllegalTimerValue );
hgs
parents:
diff changeset
   408
                    // Return after panicing the client -- completing the
hgs
parents:
diff changeset
   409
                    // message afterwards panics the server with USER 70.
hgs
parents:
diff changeset
   410
                    return;
hgs
parents:
diff changeset
   411
                    }
hgs
parents:
diff changeset
   412
                break;
hgs
parents:
diff changeset
   413
                }
hgs
parents:
diff changeset
   414
            default:
hgs
parents:
diff changeset
   415
                OstTrace0( TRACE_INTERNAL,
hgs
parents:
diff changeset
   416
                           CFLEXTIMERSESSION_CONFIGUNKNOWN,
hgs
parents:
diff changeset
   417
                           "CFlexTimerSession::ConfigureParameters: "
hgs
parents:
diff changeset
   418
                           "ERROR - Invalid parameter type" );
hgs
parents:
diff changeset
   419
                ret = KErrNotSupported;
hgs
parents:
diff changeset
   420
                break;
hgs
parents:
diff changeset
   421
            }
hgs
parents:
diff changeset
   422
        }
hgs
parents:
diff changeset
   423
    aMessage.Complete( ret );
hgs
parents:
diff changeset
   424
    }
hgs
parents:
diff changeset
   425
hgs
parents:
diff changeset
   426
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   427
// Function for adding timer to engine and handling its return value
hgs
parents:
diff changeset
   428
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   429
//
hgs
parents:
diff changeset
   430
void CFlexTimerSession::DoAddTimer( const RMessage2& aMessage,
hgs
parents:
diff changeset
   431
                                    TTimeIntervalMicroSeconds& aWinEnd,
hgs
parents:
diff changeset
   432
                                    TBool aRequestAbort )
hgs
parents:
diff changeset
   433
    {
hgs
parents:
diff changeset
   434
    OstTraceExt4( TRACE_INTERNAL,
hgs
parents:
diff changeset
   435
               CFLEXTIMERSESSION_ADDTIMER,
hgs
parents:
diff changeset
   436
               "CFlexTimerSession::DoAddTimer; this=%x; msg=%x; aWinEnd=%llu;"
hgs
parents:
diff changeset
   437
               " aRequestAbort=%d",
hgs
parents:
diff changeset
   438
               ( TUint )this,
hgs
parents:
diff changeset
   439
               ( TUint )aMessage.Handle(),
hgs
parents:
diff changeset
   440
               aWinEnd.Int64(),
hgs
parents:
diff changeset
   441
               aRequestAbort );  
hgs
parents:
diff changeset
   442
    
hgs
parents:
diff changeset
   443
    // Check that the timer has valid values.
hgs
parents:
diff changeset
   444
    if ( aWinEnd.Int64() < 0 || aWinEnd.Int64() > KFlexTimerMaxTimerLength)
hgs
parents:
diff changeset
   445
        {
hgs
parents:
diff changeset
   446
        OstTraceExt4( TRACE_INTERNAL, 
hgs
parents:
diff changeset
   447
                      CFLEXTIMERSESSION_DOADDTIMER, 
hgs
parents:
diff changeset
   448
                      "CFlexTimerSession::DoAddTimer;Invalid parameters "
hgs
parents:
diff changeset
   449
                      "- panicing client;this=%x;aMessage=%x;aWinEnd=%llu;"
hgs
parents:
diff changeset
   450
                      "aRequestAbort=%d", 
hgs
parents:
diff changeset
   451
                      ( TUint )this, 
hgs
parents:
diff changeset
   452
                      ( TUint )aMessage.Handle(), 
hgs
parents:
diff changeset
   453
                      aWinEnd.Int64(),
hgs
parents:
diff changeset
   454
                      aRequestAbort );
hgs
parents:
diff changeset
   455
        aMessage.Panic( KRFlexTimerPanicCat,
hgs
parents:
diff changeset
   456
                        EFlexTimerServerIllegalTimerValue );
hgs
parents:
diff changeset
   457
        return;
hgs
parents:
diff changeset
   458
        }
hgs
parents:
diff changeset
   459
    
hgs
parents:
diff changeset
   460
    TTimeIntervalMicroSeconds winStart;
hgs
parents:
diff changeset
   461
    TTimeIntervalMicroSeconds window = iTimerWinSize;
hgs
parents:
diff changeset
   462
    
hgs
parents:
diff changeset
   463
    if ( iUseDefaultWin )
hgs
parents:
diff changeset
   464
        {
hgs
parents:
diff changeset
   465
        window = static_cast<TInt64> ( static_cast<TReal64> ( aWinEnd.Int64() )
hgs
parents:
diff changeset
   466
            * KDefaultWindowMultiplier );
hgs
parents:
diff changeset
   467
        }
hgs
parents:
diff changeset
   468
hgs
parents:
diff changeset
   469
    winStart = aWinEnd.Int64() - window.Int64();
hgs
parents:
diff changeset
   470
hgs
parents:
diff changeset
   471
    // Store pending message. Not completed until timer expires.
hgs
parents:
diff changeset
   472
    // Note that in case of zero or negative timer value, message can
hgs
parents:
diff changeset
   473
    // be completed through Timeout() even before AddTimer returns. This
hgs
parents:
diff changeset
   474
    // implementation saves some checks and timer stopping/starting in engine.
hgs
parents:
diff changeset
   475
    iPendingTimeoutMsg = aMessage;
hgs
parents:
diff changeset
   476
hgs
parents:
diff changeset
   477
    // Add timer to engine
hgs
parents:
diff changeset
   478
    TInt ret = iService->AddTimer( winStart, aWinEnd, aRequestAbort, this );
hgs
parents:
diff changeset
   479
hgs
parents:
diff changeset
   480
    if ( KErrNone != ret )
hgs
parents:
diff changeset
   481
        {
hgs
parents:
diff changeset
   482
        // Failed, pass error code to client side
hgs
parents:
diff changeset
   483
        OstTraceExt2( TRACE_INTERNAL,
hgs
parents:
diff changeset
   484
                   CFLEXTIMERSESSION_ADDERROR,
hgs
parents:
diff changeset
   485
                   "CFlexTimerSession::DoAddTimer: Error; this=%x, ret=%d",
hgs
parents:
diff changeset
   486
                   ( TUint )this,
hgs
parents:
diff changeset
   487
                   ret );
hgs
parents:
diff changeset
   488
        // Complete pending message, this sets message pointer to NULL
hgs
parents:
diff changeset
   489
        iPendingTimeoutMsg.Complete( ret );
hgs
parents:
diff changeset
   490
        }
hgs
parents:
diff changeset
   491
    }
hgs
parents:
diff changeset
   492
hgs
parents:
diff changeset
   493
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   494
// From CSession2
hgs
parents:
diff changeset
   495
// Function for handling unintentional termination of the client
hgs
parents:
diff changeset
   496
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   497
//
hgs
parents:
diff changeset
   498
void CFlexTimerSession::Disconnect( const RMessage2 &aMessage )
hgs
parents:
diff changeset
   499
    {
hgs
parents:
diff changeset
   500
    // The client of this session has died.
hgs
parents:
diff changeset
   501
    
hgs
parents:
diff changeset
   502
    // Remove timer from engine.
hgs
parents:
diff changeset
   503
    iService->CancelTimer( this );
hgs
parents:
diff changeset
   504
hgs
parents:
diff changeset
   505
    // Disconnect() must end with a call to the base class implementation, 
hgs
parents:
diff changeset
   506
    // which will delete the session object and complete the disconnect 
hgs
parents:
diff changeset
   507
    // message.
hgs
parents:
diff changeset
   508
    CSession2::Disconnect( aMessage );
hgs
parents:
diff changeset
   509
    }