videoscheduler/SchedulerServer/src/CCseSchedulerServer.cpp
changeset 0 822a42b6c3f1
child 20 e53284de66c2
equal deleted inserted replaced
-1:000000000000 0:822a42b6c3f1
       
     1 /*
       
     2 * Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of the License "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:    Implementation of Scheduler server's Server class*
       
    15 */
       
    16 
       
    17 
       
    18 
       
    19 
       
    20 // INCLUDE FILES
       
    21 #include "CCseSchedulerServer.h"                // Header file for this class
       
    22 #include "CCseSchedulerServerSession.h"         // Server session
       
    23 #include "CCseSchedulerServerEngine.h"          // Server intelligence aka engine
       
    24 #include <ipvideo/CseSchedulerClientServerCommon.h>     // Common defines for client and server
       
    25 #include "CseSchedulerServer.pan"               // Server panic codes
       
    26 #include "CseDebug.h"                           // Debug macros
       
    27 #include <e32svr.h>
       
    28 #include <e32math.h>
       
    29 #include <e32uid.h>
       
    30 #include <e32def.h>
       
    31 
       
    32 
       
    33 // EXTERNAL DATA STRUCTURES
       
    34 // None
       
    35 
       
    36 // EXTERNAL FUNCTION PROTOTYPES  
       
    37 // None
       
    38 
       
    39 // CONSTANTS
       
    40 // Platform security. Custom check is applied to all IPCs.
       
    41 static const int KRangeCount( 1 );
       
    42 
       
    43 static const TInt SecurityRanges[KRangeCount] =
       
    44     {
       
    45     0, // Range is from 0 to KMaxTInt
       
    46     };
       
    47 
       
    48 static const TUint8 SecurityRangesPolicy[KRangeCount] =
       
    49     {
       
    50     CPolicyServer::ECustomCheck
       
    51     };
       
    52 
       
    53 static const CPolicyServer::TPolicy Policy =
       
    54     {
       
    55     CPolicyServer::EAlwaysPass,
       
    56     KRangeCount,
       
    57     SecurityRanges,
       
    58     SecurityRangesPolicy,
       
    59     NULL,
       
    60     };
       
    61 
       
    62 
       
    63 // MACROS
       
    64 // None
       
    65 
       
    66 // LOCAL CONSTANTS AND MACROS
       
    67 const TInt KDbStartTimeout              = 2000000;
       
    68 
       
    69 // MODULE DATA STRUCTURES
       
    70 // None
       
    71 
       
    72 // LOCAL FUNCTION PROTOTYPES
       
    73 // None
       
    74 
       
    75 // FORWARD DECLARATIONS
       
    76 // None
       
    77 
       
    78 // ============================ MEMBER FUNCTIONS ===============================
       
    79 
       
    80 // -----------------------------------------------------------------------------
       
    81 // CCseSchedulerServer::CCseSchedulerServer()
       
    82 // C++ constructor 
       
    83 // -----------------------------------------------------------------------------
       
    84 //
       
    85 CCseSchedulerServer::CCseSchedulerServer()
       
    86     : CPolicyServer( EPriorityRealTimeServer, Policy, ESharableSessions ),
       
    87     iContainerIx( NULL ),
       
    88     iObjectCon( NULL ),
       
    89     iSessionCount( 0 ),
       
    90     iSchedulerEngine( NULL )
       
    91     {
       
    92     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::CCseSchedulerServer");
       
    93     __DECLARE_NAME( _S( "CCseSchedulerServer" ) );
       
    94     CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::CCseSchedulerServer");
       
    95     }
       
    96 
       
    97 // -----------------------------------------------------------------------------
       
    98 // CCseSchedulerServer::NewLC()
       
    99 // 
       
   100 // -----------------------------------------------------------------------------
       
   101 //
       
   102 CCseSchedulerServer* CCseSchedulerServer::NewLC( )
       
   103     {
       
   104     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::NewLC");
       
   105     
       
   106     CCseSchedulerServer* self = new ( ELeave ) CCseSchedulerServer;
       
   107     CleanupStack::PushL( self );
       
   108     
       
   109     self->ConstructL( );
       
   110     
       
   111     CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::NewLC");
       
   112     return self;
       
   113     }
       
   114 
       
   115 // -----------------------------------------------------------------------------
       
   116 // CCseSchedulerServer::ConstructL()
       
   117 // second-phase constructor; create the object container index.
       
   118 // -----------------------------------------------------------------------------
       
   119 //
       
   120 void CCseSchedulerServer::ConstructL( )
       
   121     {
       
   122     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::ConstructL");
       
   123     iContainerIx = CObjectConIx::NewL();
       
   124     iObjectCon = iContainerIx->CreateL(); 
       
   125     StartL( KCseSchedulerServerName );
       
   126     GetEngineObjectL();
       
   127     iStarterBreaker = CPeriodic::NewL( CActive::EPriorityStandard );
       
   128     
       
   129     // break call chain
       
   130 	if( !iStarterBreaker->IsActive() )
       
   131         {
       
   132         // Give client 2 secs to make server session before we check 
       
   133         // if server is needed or not.
       
   134         iStarterBreaker->Start( KDbStartTimeout,
       
   135                                 KDbStartTimeout,
       
   136                                 TCallBack( StarterCallback, this ));
       
   137         }
       
   138     else
       
   139         {
       
   140         CSELOGSTRING_HIGH_LEVEL(
       
   141             "CCseSchedulerServer::ConstructL - Breaker already active");
       
   142         }
       
   143     
       
   144     CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::ConstructL");    
       
   145     }
       
   146 
       
   147 // -----------------------------------------------------------------------------
       
   148 // CCseSchedulerServer::~CCseSchedulerServer()
       
   149 // Destructor.
       
   150 // -----------------------------------------------------------------------------
       
   151 //
       
   152 CCseSchedulerServer::~CCseSchedulerServer()
       
   153     {
       
   154     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::~CCseSchedulerServer");
       
   155     DeleteSchedulerEngine();
       
   156     CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::~CCseSchedulerServer");
       
   157     }
       
   158 
       
   159 // -----------------------------------------------------------------------------
       
   160 // CCseSchedulerServer::ThreadFunction()
       
   161 // The active scheduler is installed and started here.
       
   162 // (other items were commented in a header).
       
   163 // -----------------------------------------------------------------------------
       
   164 //
       
   165 TInt CCseSchedulerServer::ThreadFunction( )
       
   166     {
       
   167     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::ThreadFunction");
       
   168 	CTrapCleanup* cleanupStack = CTrapCleanup::New();    
       
   169     if ( !cleanupStack )
       
   170         {
       
   171         PanicServer( ECseCreateTrapCleanup );
       
   172         }
       
   173 
       
   174     TRAPD( err, ThreadFunctionL( ) );
       
   175     if ( err )
       
   176         {
       
   177         PanicServer( ECseSrvCreateServer );
       
   178         }
       
   179 
       
   180     delete cleanupStack;    
       
   181     
       
   182     CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::ThreadFunction");
       
   183     return KErrNone;
       
   184     }
       
   185 
       
   186 // -----------------------------------------------------------------------------
       
   187 // CCseSchedulerServer::ThreadFunctionL()
       
   188 //
       
   189 // -----------------------------------------------------------------------------
       
   190 //
       
   191 void CCseSchedulerServer::ThreadFunctionL( )
       
   192     {
       
   193     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::ThreadFunctionL");
       
   194 
       
   195     // Construct active scheduler
       
   196     CActiveScheduler* activeScheduler = new ( ELeave ) CActiveScheduler;
       
   197     CleanupStack::PushL( activeScheduler ); // |-> 1
       
   198 
       
   199     // Install active scheduler. 
       
   200     // We don't need to check whether an active scheduler is already installed
       
   201     // as this is a new thread, so there won't be one
       
   202     CActiveScheduler::Install( activeScheduler );
       
   203 
       
   204     // Construct our server, pushed cleanup stack and leaved there
       
   205     CCseSchedulerServer* server = CCseSchedulerServer::NewLC( );  // |-> 2    
       
   206     
       
   207     // Signal server is up
       
   208     RProcess::Rendezvous( KErrNone );
       
   209 
       
   210     // Start handling requests
       
   211     CActiveScheduler::Start();
       
   212 
       
   213     CleanupStack::PopAndDestroy( server ); // 2<-|
       
   214     CleanupStack::PopAndDestroy( activeScheduler ); // 1<-|
       
   215     
       
   216     CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::ThreadFunctionL");
       
   217     }
       
   218 
       
   219 // -----------------------------------------------------------------------------
       
   220 // CCseSchedulerServer::PanicServer
       
   221 // Utility - panic the server
       
   222 // (other items were commented in a header).
       
   223 // -----------------------------------------------------------------------------
       
   224 void CCseSchedulerServer::PanicServer( TCseSchedulerServPanic aPanic )
       
   225     {
       
   226     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::PanicServer");
       
   227     _LIT( KSchedulerServer, "SchedulerServer" );
       
   228     User::Panic( KSchedulerServer, aPanic );
       
   229     CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::PanicServer");
       
   230     }
       
   231 
       
   232 // -----------------------------------------------------------------------------
       
   233 // CCseSchedulerServer::GetEngineObjectL()
       
   234 //
       
   235 // -----------------------------------------------------------------------------
       
   236 //
       
   237 CCseSchedulerServerEngine* CCseSchedulerServer::GetEngineObjectL()
       
   238     {
       
   239     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::GetEngineObjectL");
       
   240         
       
   241     if ( iObjectCon->Count() == 0 )
       
   242         {
       
   243         // Create scheduler engine
       
   244         iSchedulerEngine = CCseSchedulerServerEngine::NewL( *this );
       
   245        
       
   246         // Add our engine to container
       
   247         iObjectCon->AddL( iSchedulerEngine );
       
   248         }
       
   249     else
       
   250         {
       
   251         // default implementation return KErrNone.
       
   252         if ( KErrNone != iSchedulerEngine->Open() )
       
   253             {
       
   254             User::Leave( KErrGeneral );
       
   255             }
       
   256         }
       
   257     
       
   258 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::GetEngineObjectL");
       
   259     
       
   260     // We have only one object in our container
       
   261     return iSchedulerEngine;
       
   262     }
       
   263 
       
   264 // -----------------------------------------------------------------------------
       
   265 // CCseSchedulerServer::Inc()
       
   266 // 
       
   267 // -----------------------------------------------------------------------------
       
   268 //
       
   269 void CCseSchedulerServer::Inc()
       
   270     {
       
   271     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::Inc");
       
   272     if ( iSessionCount!=KErrNotFound )
       
   273         {
       
   274         iSessionCount++;
       
   275         }
       
   276 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::Inc");
       
   277     }
       
   278 
       
   279 // -----------------------------------------------------------------------------
       
   280 // CCseRTPServer::Dec()
       
   281 // 
       
   282 // -----------------------------------------------------------------------------
       
   283 //
       
   284 void CCseSchedulerServer::Dec()
       
   285     {
       
   286     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::Dec");
       
   287     iSessionCount--;
       
   288 
       
   289     if ( iSessionCount<=0 )
       
   290         {
       
   291         StopServer();
       
   292         }
       
   293     CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::Dec");
       
   294     }
       
   295     
       
   296 // -----------------------------------------------------------------------------
       
   297 // CCseSchedulerServer::DeleteSchedulerEngine
       
   298 // Stops active scheduler and deletes object container and other objects.
       
   299 // -----------------------------------------------------------------------------
       
   300 void CCseSchedulerServer::DeleteSchedulerEngine()
       
   301     {
       
   302 	CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::DeleteSchedulerEngine");
       
   303     
       
   304     if ( iContainerIx )
       
   305         {
       
   306         iSchedulerEngine->Close();
       
   307         iContainerIx->Remove( iObjectCon );
       
   308         delete iContainerIx; 
       
   309 		iContainerIx = NULL;
       
   310 		iSchedulerEngine = NULL;
       
   311         }
       
   312 
       
   313     if( iStarterBreaker->IsActive() )
       
   314         {
       
   315         iStarterBreaker->Cancel();
       
   316         }
       
   317     delete iStarterBreaker;    
       
   318     iStarterBreaker = NULL;
       
   319     
       
   320     CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::DeleteSchedulerEngine");
       
   321     }
       
   322 
       
   323 // -----------------------------------------------------------------------------
       
   324 // CCseSchedulerServer::NewSessionL()
       
   325 // 
       
   326 // -----------------------------------------------------------------------------
       
   327 //
       
   328 
       
   329 CSession2* CCseSchedulerServer::NewSessionL( const TVersion& aVersion,
       
   330                                              const RMessage2& /*aMessage*/ ) const
       
   331     {
       
   332     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::NewSessionL");
       
   333     
       
   334     // Check version is ok
       
   335     TVersion v( KCseServMajorVersionNumber,
       
   336                 KCseServMinorVersionNumber,
       
   337                 KCseServBuildVersionNumber );
       
   338     
       
   339     if ( !User::QueryVersionSupported( v, aVersion ) )
       
   340         {
       
   341         User::Leave( KErrNotSupported );
       
   342         }
       
   343 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::NewSessionL");        
       
   344     
       
   345     // Make new session
       
   346 	return CCseSchedulerServerSession::NewL( ( CCseSchedulerServer* ) this );
       
   347     }
       
   348     
       
   349 // -----------------------------------------------------------------------------
       
   350 // CCseSchedulerServer::StopServer
       
   351 // Stops the server thread if no sessions active.
       
   352 // -----------------------------------------------------------------------------
       
   353 //
       
   354 void CCseSchedulerServer::StopServer()
       
   355     {
       
   356     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::StopServer");
       
   357     TBool schedulerActive( iSchedulerEngine->IsSchedulerActive() );    
       
   358     CSELOGSTRING2_HIGH_LEVEL("CCseSchedulerServer::StopServer - Session count: %d", iSessionCount);    
       
   359     if ( (iSessionCount<=0) && (schedulerActive == EFalse))
       
   360         {
       
   361         CSELOGSTRING_HIGH_LEVEL("CCseSchedulerServer::StopServer - Call ActiveScheduler::Stop()");
       
   362         CActiveScheduler::Stop();
       
   363         }        
       
   364 
       
   365     CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::StopServer");
       
   366     }
       
   367 
       
   368 // ========================== OTHER EXPORTED FUNCTIONS =========================
       
   369 // -----------------------------------------------------------------------------
       
   370 // StartThread()
       
   371 // Start the server thread. This is called from the client.
       
   372 // -----------------------------------------------------------------------------
       
   373 //
       
   374 TInt CCseSchedulerServer::StartThread()
       
   375     {
       
   376     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::StartThread");
       
   377 #if _DEBUG
       
   378     __UHEAP_MARK;
       
   379 #endif
       
   380        
       
   381     // Check server not already started
       
   382     TFindServer findCountServer( KCseSchedulerServerName );
       
   383     TFullName name;
       
   384     if ( findCountServer.Next( name ) == KErrNone )
       
   385         { 
       
   386         // Found server already
       
   387         RProcess::Rendezvous( KErrNone );
       
   388         CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::StartThread - Return value: KErrAlreadyExists");
       
   389         return KErrAlreadyExists;
       
   390         }
       
   391 
       
   392     ThreadFunction( );
       
   393 
       
   394 #if _DEBUG
       
   395     __UHEAP_MARKEND;
       
   396 #endif    
       
   397 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::StartThread - Server down!");
       
   398 	
       
   399     // All well
       
   400     return KErrNone;
       
   401     }
       
   402 
       
   403 // --------------------------------------------------------------------------
       
   404 // CCseSchedulerServer::CustomSecurityCheckL()
       
   405 // --------------------------------------------------------------------------
       
   406 //
       
   407 CPolicyServer::TCustomResult CCseSchedulerServer::CustomSecurityCheckL(
       
   408     const RMessage2& aMsg,
       
   409     TInt& /*aAction*/,
       
   410     TSecurityInfo& /*aMissing*/ )
       
   411     {
       
   412     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::CustomSecurityCheckL");
       
   413     TCustomResult retVal ( EFail );
       
   414     
       
   415     // Check the messagge function range
       
   416     if ( aMsg.Function() > ECseRequestBase && 
       
   417          aMsg.Function() < ECseRequestLast )
       
   418         {
       
   419         
       
   420         // Check if the client has required capabilities
       
   421         // From .mmp-file capablity NetworkControl
       
   422         if( // From .mmp-file following are CAP_SERVER capabilities
       
   423             ! aMsg.HasCapability(ECapabilityNetworkServices ) ||
       
   424             ! aMsg.HasCapability(ECapabilityLocalServices ) ||
       
   425             ! aMsg.HasCapability(ECapabilityLocation ) ||
       
   426             ! aMsg.HasCapability(ECapabilityReadUserData ) ||
       
   427             ! aMsg.HasCapability(ECapabilityWriteUserData ) ||
       
   428             ! aMsg.HasCapability(ECapabilityReadDeviceData ) ||
       
   429             ! aMsg.HasCapability(ECapabilityWriteDeviceData ) ||        
       
   430             ! aMsg.HasCapability(ECapabilityUserEnvironment ) ||
       
   431             ! aMsg.HasCapability(ECapabilitySwEvent ) )
       
   432             {         
       
   433             CSELOGSTRING2_HIGH_LEVEL(
       
   434                 "CCseSchedulerServer::CustomSecurityCheckL() No capability for message %d!!!",
       
   435                 aMsg.Function() );                 
       
   436             }
       
   437         else
       
   438             {
       
   439             CSELOGSTRING2_HIGH_LEVEL(
       
   440                 "CCseSchedulerServer::CustomSecurityCheckL() Message %d inside range and capabilities ok",
       
   441                 aMsg.Function() );
       
   442             retVal = EPass;
       
   443             }
       
   444         }
       
   445     else
       
   446         {
       
   447         CSELOGSTRING2_HIGH_LEVEL(
       
   448             "CCseSchedulerServer::CustomSecurityCheckL() Message %d outside known range!!!",
       
   449             aMsg.Function() );            
       
   450         }
       
   451     
       
   452     if( retVal == EPass )
       
   453         {
       
   454         CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::CustomSecurityCheckL - Passed");
       
   455         }
       
   456     else
       
   457         {
       
   458         CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::CustomSecurityCheckL - Failed");
       
   459         }    
       
   460     return retVal;
       
   461     }
       
   462 
       
   463 // -----------------------------------------------------------------------------
       
   464 // CCseSchedulerServerEngine::StarterCallback
       
   465 // -----------------------------------------------------------------------------
       
   466 //
       
   467 TInt CCseSchedulerServer::StarterCallback( TAny* aPtr )
       
   468 	{
       
   469 	CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::StarterCallback");
       
   470 	TBool retVal( EFalse);
       
   471 	retVal = static_cast<CCseSchedulerServer*>( aPtr )->HandleStarterCallback();
       
   472 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::StarterCallback");
       
   473 	return retVal;
       
   474 	}
       
   475 
       
   476 // -----------------------------------------------------------------------------
       
   477 // CCseSchedulerServerEngine::HandleCompletitionCallback
       
   478 // -----------------------------------------------------------------------------
       
   479 //
       
   480 TInt CCseSchedulerServer::HandleStarterCallback() 
       
   481 	{
       
   482 	CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::HandleStarterCallback ");
       
   483 	
       
   484 	// We dont want to use periodic anymore, so we cancel it. We just wanted to
       
   485 	// make call here 2 secs after server has been created.
       
   486 	iStarterBreaker->Cancel();  
       
   487 	
       
   488 	// Check if server can be stopped.
       
   489     iSchedulerEngine->RequestReschedule();
       
   490 	
       
   491 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::HandleStarterCallback ");
       
   492 	return EFalse;
       
   493 	}
       
   494 
       
   495 // -----------------------------------------------------------------------------
       
   496 // E32Main()
       
   497 // Server startup
       
   498 // Returns: KErrNone
       
   499 // -----------------------------------------------------------------------------
       
   500 //
       
   501 GLDEF_C TInt E32Main()
       
   502     {
       
   503     return CCseSchedulerServer::StartThread();
       
   504     }
       
   505 
       
   506 // End of File