keepalive/flextimer/server/src/flextimerserver.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 CFlexTimerServer class.
hgs
parents:
diff changeset
    15
 *
hgs
parents:
diff changeset
    16
 */
hgs
parents:
diff changeset
    17
/*
hgs
parents:
diff changeset
    18
 * %version: 2 %
hgs
parents:
diff changeset
    19
 */
hgs
parents:
diff changeset
    20
hgs
parents:
diff changeset
    21
// System include files
hgs
parents:
diff changeset
    22
#include <e32cmn.h>
hgs
parents:
diff changeset
    23
#include <e32std.h>
hgs
parents:
diff changeset
    24
// User include files go here:
hgs
parents:
diff changeset
    25
#include "flextimercommon.h"
hgs
parents:
diff changeset
    26
#include "flextimerserver.h"
hgs
parents:
diff changeset
    27
#include "flextimersession.h"
hgs
parents:
diff changeset
    28
#include "flextimerengine.h"
hgs
parents:
diff changeset
    29
#include "OstTraceDefinitions.h"
hgs
parents:
diff changeset
    30
#ifdef OST_TRACE_COMPILER_IN_USE
hgs
parents:
diff changeset
    31
#include "flextimerserverTraces.h"
hgs
parents:
diff changeset
    32
#endif
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
// ======== MEMBER FUNCTIONS ========
hgs
parents:
diff changeset
    35
hgs
parents:
diff changeset
    36
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    37
// Two phased construction, 1st phase
hgs
parents:
diff changeset
    38
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    39
//
hgs
parents:
diff changeset
    40
EXPORT_C CFlexTimerServer* CFlexTimerServer::NewL(
hgs
parents:
diff changeset
    41
        CActive::TPriority aPriority )
hgs
parents:
diff changeset
    42
    {
hgs
parents:
diff changeset
    43
    CFlexTimerServer* self = new ( ELeave ) CFlexTimerServer( aPriority );
hgs
parents:
diff changeset
    44
    CleanupStack::PushL( self );
hgs
parents:
diff changeset
    45
    self->ConstructL();
hgs
parents:
diff changeset
    46
    CleanupStack::Pop( self );
hgs
parents:
diff changeset
    47
    return self;
hgs
parents:
diff changeset
    48
    }
hgs
parents:
diff changeset
    49
hgs
parents:
diff changeset
    50
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    51
// Destructor
hgs
parents:
diff changeset
    52
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    53
//
hgs
parents:
diff changeset
    54
CFlexTimerServer::~CFlexTimerServer()
hgs
parents:
diff changeset
    55
    {
hgs
parents:
diff changeset
    56
    // Free allocated resources, CServer2 shutdowns sessions
hgs
parents:
diff changeset
    57
    delete iTimerEngine;
hgs
parents:
diff changeset
    58
hgs
parents:
diff changeset
    59
    OstTrace0( TRACE_INTERNAL,
hgs
parents:
diff changeset
    60
            CFLEXTIMERSERVER_DEL,
hgs
parents:
diff changeset
    61
            "CFlexTimerServer::~CFlexTimerServer: exiting" );
hgs
parents:
diff changeset
    62
    }
hgs
parents:
diff changeset
    63
hgs
parents:
diff changeset
    64
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    65
// Creation of new sessions, called by server framework
hgs
parents:
diff changeset
    66
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    67
//
hgs
parents:
diff changeset
    68
CSession2* CFlexTimerServer::NewSessionL( const TVersion& aVersion,
hgs
parents:
diff changeset
    69
                                          const RMessage2& /*aMessage*/ ) const
hgs
parents:
diff changeset
    70
    {
hgs
parents:
diff changeset
    71
    // Version checking, according to two main principles
hgs
parents:
diff changeset
    72
    // 1. Newer server will always support older clients (change this if
hgs
parents:
diff changeset
    73
    //    compatibility is changed at some phase)
hgs
parents:
diff changeset
    74
    // 2. Guaranteed that newer client will be compatible with older server 
hgs
parents:
diff changeset
    75
    //    within the same major version
hgs
parents:
diff changeset
    76
    if ( aVersion.iMajor > KFlexTimerServMajorVersionNumber )
hgs
parents:
diff changeset
    77
        {
hgs
parents:
diff changeset
    78
        OstTrace1(
hgs
parents:
diff changeset
    79
                TRACE_INTERNAL,
hgs
parents:
diff changeset
    80
                CFLEXTIMERSERVER_NEWSESSIONLVER,
hgs
parents:
diff changeset
    81
                "CFlexTimerServer::NewSessionL: Invalid major version (%d)",
hgs
parents:
diff changeset
    82
                aVersion.iMajor );
hgs
parents:
diff changeset
    83
        User::Leave( KErrNotSupported );
hgs
parents:
diff changeset
    84
        }
hgs
parents:
diff changeset
    85
hgs
parents:
diff changeset
    86
    // Create and return session
hgs
parents:
diff changeset
    87
    CSession2* session = new ( ELeave ) CFlexTimerSession( iTimerEngine );
hgs
parents:
diff changeset
    88
hgs
parents:
diff changeset
    89
    OstTrace1( TRACE_INTERNAL,
hgs
parents:
diff changeset
    90
            CFLEXTIMERSERVER_NEWSESSIONL,
hgs
parents:
diff changeset
    91
            "CFlexTimerServer::NewSessionL: Created; session=%x",
hgs
parents:
diff changeset
    92
            ( TUint )session );
hgs
parents:
diff changeset
    93
hgs
parents:
diff changeset
    94
    return session;
hgs
parents:
diff changeset
    95
    }
hgs
parents:
diff changeset
    96
hgs
parents:
diff changeset
    97
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
    98
// Thread start function, loops in active scheduler
hgs
parents:
diff changeset
    99
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   100
//
hgs
parents:
diff changeset
   101
void CFlexTimerServer::StartServerL()
hgs
parents:
diff changeset
   102
    {
hgs
parents:
diff changeset
   103
    // Called when thread is created, create active scheduler
hgs
parents:
diff changeset
   104
    CActiveScheduler* sched = new CActiveScheduler;
hgs
parents:
diff changeset
   105
    if ( sched == NULL )
hgs
parents:
diff changeset
   106
        {
hgs
parents:
diff changeset
   107
        // Leave error code is used as a panic code
hgs
parents:
diff changeset
   108
        User::Leave( EFlexTimerServerActiveScheduler );
hgs
parents:
diff changeset
   109
        }
hgs
parents:
diff changeset
   110
    // Add active scheduler object to cleanup stack before installing it.
hgs
parents:
diff changeset
   111
    // It will be deleted, if any of the next operations fails.
hgs
parents:
diff changeset
   112
    CleanupStack::PushL( sched );
hgs
parents:
diff changeset
   113
    CActiveScheduler::Install( sched );
hgs
parents:
diff changeset
   114
hgs
parents:
diff changeset
   115
    // Create server object and start it
hgs
parents:
diff changeset
   116
    CFlexTimerServer* flexServer = NULL;
hgs
parents:
diff changeset
   117
    flexServer = CFlexTimerServer::NewL( EPriorityStandard );
hgs
parents:
diff changeset
   118
hgs
parents:
diff changeset
   119
    // Push the server object to cleanup stack before starting it
hgs
parents:
diff changeset
   120
    CleanupStack::PushL( flexServer );
hgs
parents:
diff changeset
   121
    
hgs
parents:
diff changeset
   122
    TInt err = KErrNone;
hgs
parents:
diff changeset
   123
    
hgs
parents:
diff changeset
   124
    err = flexServer->Start( KFlexTimerServerName );
hgs
parents:
diff changeset
   125
    if ( err != KErrNone )
hgs
parents:
diff changeset
   126
        {
hgs
parents:
diff changeset
   127
        // Leave error code is used as a panic code
hgs
parents:
diff changeset
   128
        User::Leave( EFlexTimerServerStartServer );
hgs
parents:
diff changeset
   129
        }
hgs
parents:
diff changeset
   130
hgs
parents:
diff changeset
   131
    // Complete open rendezvous in this process (syncs with creator)
hgs
parents:
diff changeset
   132
    RProcess::Rendezvous( KErrNone );
hgs
parents:
diff changeset
   133
hgs
parents:
diff changeset
   134
    // Active scheduler start will not leave, thus pop added objects
hgs
parents:
diff changeset
   135
    // from the cleanup stack. They will be deleted once the execution
hgs
parents:
diff changeset
   136
    // returns from the active scheduler (application is exiting)
hgs
parents:
diff changeset
   137
    CleanupStack::Pop( flexServer );
hgs
parents:
diff changeset
   138
    CleanupStack::Pop( sched );
hgs
parents:
diff changeset
   139
hgs
parents:
diff changeset
   140
    OstTrace0( TRACE_INTERNAL,
hgs
parents:
diff changeset
   141
            CFLEXTIMERSERVER_START,
hgs
parents:
diff changeset
   142
            "CFlexTimerServer::StartServerL: Call ActiveScheduler" );
hgs
parents:
diff changeset
   143
hgs
parents:
diff changeset
   144
    // Start active scheduler, thread stays in active scheduler loop
hgs
parents:
diff changeset
   145
    CActiveScheduler::Start();
hgs
parents:
diff changeset
   146
hgs
parents:
diff changeset
   147
    OstTrace0( TRACE_INTERNAL,
hgs
parents:
diff changeset
   148
            CFLEXTIMERSERVER_EXIT,
hgs
parents:
diff changeset
   149
            "CFlexTimerServer::StartServerL: ActiveScheduler exit" );
hgs
parents:
diff changeset
   150
hgs
parents:
diff changeset
   151
    // Delete allocated resources
hgs
parents:
diff changeset
   152
    delete flexServer;
hgs
parents:
diff changeset
   153
    delete sched;
hgs
parents:
diff changeset
   154
    }
hgs
parents:
diff changeset
   155
hgs
parents:
diff changeset
   156
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   157
// Constructor
hgs
parents:
diff changeset
   158
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   159
//
hgs
parents:
diff changeset
   160
CFlexTimerServer::CFlexTimerServer( CActive::TPriority aPriority ) :
hgs
parents:
diff changeset
   161
    CServer2( aPriority ), iTimerEngine( NULL )
hgs
parents:
diff changeset
   162
    {
hgs
parents:
diff changeset
   163
hgs
parents:
diff changeset
   164
    }
hgs
parents:
diff changeset
   165
hgs
parents:
diff changeset
   166
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   167
// Two phased construction, 2nd phase
hgs
parents:
diff changeset
   168
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   169
//
hgs
parents:
diff changeset
   170
void CFlexTimerServer::ConstructL()
hgs
parents:
diff changeset
   171
    {
hgs
parents:
diff changeset
   172
    // Create engine, leaving is handled in server creation
hgs
parents:
diff changeset
   173
    iTimerEngine = CFlexTimerEngine::NewL();
hgs
parents:
diff changeset
   174
    OstTrace0( TRACE_INTERNAL,
hgs
parents:
diff changeset
   175
            CFLEXTIMERSERVER_CONSTRUCTL,
hgs
parents:
diff changeset
   176
            "CFlexTimerServer::ConstructL: Created engine" );
hgs
parents:
diff changeset
   177
    }
hgs
parents:
diff changeset
   178
hgs
parents:
diff changeset
   179
// ======== GLOBAL FUNCTIONS ========
hgs
parents:
diff changeset
   180
hgs
parents:
diff changeset
   181
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   182
// Main function of the server executable.
hgs
parents:
diff changeset
   183
// --------------------------------------------------------------------------
hgs
parents:
diff changeset
   184
//
hgs
parents:
diff changeset
   185
GLDEF_C TInt E32Main()
hgs
parents:
diff changeset
   186
    {
hgs
parents:
diff changeset
   187
    // Mark memory allocation check 
hgs
parents:
diff changeset
   188
    __UHEAP_MARK;
hgs
parents:
diff changeset
   189
hgs
parents:
diff changeset
   190
    // Create cleanup stack
hgs
parents:
diff changeset
   191
    CTrapCleanup* cleanup = CTrapCleanup::New();
hgs
parents:
diff changeset
   192
    __ASSERT_ALWAYS( cleanup, User::Panic( KFlexTimerServerPanicCat,
hgs
parents:
diff changeset
   193
                    EFlexTimerServerCleanupStack ) );
hgs
parents:
diff changeset
   194
    // Start server
hgs
parents:
diff changeset
   195
    TRAPD( panicCode, CFlexTimerServer::StartServerL() );
hgs
parents:
diff changeset
   196
    if ( panicCode != KErrNone )
hgs
parents:
diff changeset
   197
        {
hgs
parents:
diff changeset
   198
        OstTrace1( TRACE_INTERNAL,
hgs
parents:
diff changeset
   199
                CFLEXTIMERSERVER_MAINERROR,
hgs
parents:
diff changeset
   200
                "CFlexTimerServer - Main: Start server failed (%d)",
hgs
parents:
diff changeset
   201
                panicCode );
hgs
parents:
diff changeset
   202
        delete cleanup;
hgs
parents:
diff changeset
   203
        User::Panic( KFlexTimerServerPanicCat, panicCode );
hgs
parents:
diff changeset
   204
        }
hgs
parents:
diff changeset
   205
    else
hgs
parents:
diff changeset
   206
        {
hgs
parents:
diff changeset
   207
        OstTrace0( TRACE_INTERNAL,
hgs
parents:
diff changeset
   208
                CFLEXTIMERSERVER_MAINEXIT,
hgs
parents:
diff changeset
   209
                "CFlexTimerServer - Main: Application exiting" );
hgs
parents:
diff changeset
   210
hgs
parents:
diff changeset
   211
        // Delete cleanup stack
hgs
parents:
diff changeset
   212
        delete cleanup;
hgs
parents:
diff changeset
   213
        }
hgs
parents:
diff changeset
   214
hgs
parents:
diff changeset
   215
    // Memory allocation check, panic in UDEB case of memory leak
hgs
parents:
diff changeset
   216
    __UHEAP_MARKEND;
hgs
parents:
diff changeset
   217
hgs
parents:
diff changeset
   218
    return KErrNone;
hgs
parents:
diff changeset
   219
    }