videoscheduler/SchedulerServer/src/CCseSchedulerServer.cpp
branchRCL_3
changeset 23 13a33d82ad98
equal deleted inserted replaced
22:826cea16efd9 23:13a33d82ad98
       
     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         CSELOGSTRING_HIGH_LEVEL("CCseSchedulerServer::ThreadFunction - Could not create cleanupstack: %d");
       
   172         return KErrNone;
       
   173         }
       
   174 
       
   175     TRAPD( err, ThreadFunctionL( ) );
       
   176     if ( err )
       
   177         {
       
   178         CSELOGSTRING2_HIGH_LEVEL("CCseSchedulerServer::ThreadFunction - Main thread leaved: %d", err );
       
   179         }
       
   180 
       
   181     delete cleanupStack;    
       
   182     
       
   183     CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::ThreadFunction");
       
   184     return KErrNone;
       
   185     }
       
   186 
       
   187 // -----------------------------------------------------------------------------
       
   188 // CCseSchedulerServer::ThreadFunctionL()
       
   189 //
       
   190 // -----------------------------------------------------------------------------
       
   191 //
       
   192 void CCseSchedulerServer::ThreadFunctionL( )
       
   193     {
       
   194     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::ThreadFunctionL");
       
   195 
       
   196     // Construct active scheduler
       
   197     CActiveScheduler* activeScheduler = new ( ELeave ) CActiveScheduler;
       
   198     CleanupStack::PushL( activeScheduler ); // |-> 1
       
   199 
       
   200     // Install active scheduler. 
       
   201     // We don't need to check whether an active scheduler is already installed
       
   202     // as this is a new thread, so there won't be one
       
   203     CActiveScheduler::Install( activeScheduler );
       
   204 
       
   205     // Construct our server, pushed cleanup stack and leaved there
       
   206     CCseSchedulerServer* server = CCseSchedulerServer::NewLC( );  // |-> 2    
       
   207     
       
   208     // Signal server is up
       
   209     RProcess::Rendezvous( KErrNone );
       
   210 
       
   211     // Start handling requests
       
   212     CActiveScheduler::Start();
       
   213 
       
   214     CleanupStack::PopAndDestroy( server ); // 2<-|
       
   215     CleanupStack::PopAndDestroy( activeScheduler ); // 1<-|
       
   216     
       
   217     CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::ThreadFunctionL");
       
   218     }
       
   219 
       
   220 // -----------------------------------------------------------------------------
       
   221 // CCseSchedulerServer::PanicServer
       
   222 // Utility - panic the server
       
   223 // (other items were commented in a header).
       
   224 // -----------------------------------------------------------------------------
       
   225 void CCseSchedulerServer::PanicServer( TCseSchedulerServPanic aPanic )
       
   226     {
       
   227     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::PanicServer");
       
   228     _LIT( KSchedulerServer, "SchedulerServer" );
       
   229     User::Panic( KSchedulerServer, aPanic );
       
   230     CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::PanicServer");
       
   231     }
       
   232 
       
   233 // -----------------------------------------------------------------------------
       
   234 // CCseSchedulerServer::GetEngineObjectL()
       
   235 //
       
   236 // -----------------------------------------------------------------------------
       
   237 //
       
   238 CCseSchedulerServerEngine* CCseSchedulerServer::GetEngineObjectL()
       
   239     {
       
   240     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::GetEngineObjectL");
       
   241         
       
   242     if ( iObjectCon->Count() == 0 )
       
   243         {
       
   244         // Create scheduler engine
       
   245         iSchedulerEngine = CCseSchedulerServerEngine::NewL( *this );
       
   246        
       
   247         // Add our engine to container
       
   248         iObjectCon->AddL( iSchedulerEngine );
       
   249         }
       
   250     else
       
   251         {
       
   252         // default implementation return KErrNone.
       
   253         if ( KErrNone != iSchedulerEngine->Open() )
       
   254             {
       
   255             User::Leave( KErrGeneral );
       
   256             }
       
   257         }
       
   258     
       
   259 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::GetEngineObjectL");
       
   260     
       
   261     // We have only one object in our container
       
   262     return iSchedulerEngine;
       
   263     }
       
   264 
       
   265 // -----------------------------------------------------------------------------
       
   266 // CCseSchedulerServer::Inc()
       
   267 // 
       
   268 // -----------------------------------------------------------------------------
       
   269 //
       
   270 void CCseSchedulerServer::Inc()
       
   271     {
       
   272     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::Inc");
       
   273     if ( iSessionCount!=KErrNotFound )
       
   274         {
       
   275         iSessionCount++;
       
   276         }
       
   277 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::Inc");
       
   278     }
       
   279 
       
   280 // -----------------------------------------------------------------------------
       
   281 // CCseRTPServer::Dec()
       
   282 // 
       
   283 // -----------------------------------------------------------------------------
       
   284 //
       
   285 void CCseSchedulerServer::Dec()
       
   286     {
       
   287     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::Dec");
       
   288     iSessionCount--;
       
   289 
       
   290     if ( iSessionCount<=0 )
       
   291         {
       
   292         StopServer();
       
   293         }
       
   294     CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::Dec");
       
   295     }
       
   296     
       
   297 // -----------------------------------------------------------------------------
       
   298 // CCseSchedulerServer::DeleteSchedulerEngine
       
   299 // Stops active scheduler and deletes object container and other objects.
       
   300 // -----------------------------------------------------------------------------
       
   301 void CCseSchedulerServer::DeleteSchedulerEngine()
       
   302     {
       
   303 	CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::DeleteSchedulerEngine");
       
   304 		
       
   305     if ( iContainerIx )
       
   306         {
       
   307         if( iObjectCon->Count() > 0 )
       
   308             {
       
   309             iSchedulerEngine->Close();
       
   310             }
       
   311     
       
   312         iContainerIx->Remove( iObjectCon );
       
   313         delete iContainerIx; 
       
   314 		iContainerIx = NULL;
       
   315 		iSchedulerEngine = NULL;
       
   316         }
       
   317     
       
   318     if( iStarterBreaker && iStarterBreaker->IsActive() )
       
   319         {
       
   320         iStarterBreaker->Cancel();
       
   321         }
       
   322     delete iStarterBreaker;    
       
   323     iStarterBreaker = NULL;
       
   324     
       
   325     CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::DeleteSchedulerEngine");
       
   326     }
       
   327 
       
   328 // -----------------------------------------------------------------------------
       
   329 // CCseSchedulerServer::NewSessionL()
       
   330 // 
       
   331 // -----------------------------------------------------------------------------
       
   332 //
       
   333 
       
   334 CSession2* CCseSchedulerServer::NewSessionL( const TVersion& aVersion,
       
   335                                              const RMessage2& /*aMessage*/ ) const
       
   336     {
       
   337     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::NewSessionL");
       
   338     
       
   339     // Check version is ok
       
   340     TVersion v( KCseServMajorVersionNumber,
       
   341                 KCseServMinorVersionNumber,
       
   342                 KCseServBuildVersionNumber );
       
   343     
       
   344     if ( !User::QueryVersionSupported( v, aVersion ) )
       
   345         {
       
   346         User::Leave( KErrNotSupported );
       
   347         }
       
   348 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::NewSessionL");        
       
   349     
       
   350     // Make new session
       
   351 	return CCseSchedulerServerSession::NewL( ( CCseSchedulerServer* ) this );
       
   352     }
       
   353     
       
   354 // -----------------------------------------------------------------------------
       
   355 // CCseSchedulerServer::StopServer
       
   356 // Stops the server thread if no sessions active.
       
   357 // -----------------------------------------------------------------------------
       
   358 //
       
   359 void CCseSchedulerServer::StopServer()
       
   360     {
       
   361     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::StopServer");
       
   362     TBool schedulerActive( iSchedulerEngine->IsSchedulerActive() );    
       
   363     CSELOGSTRING2_HIGH_LEVEL("CCseSchedulerServer::StopServer - Session count: %d", iSessionCount);    
       
   364     if ( (iSessionCount<=0) && (schedulerActive == EFalse))
       
   365         {
       
   366         CSELOGSTRING_HIGH_LEVEL("CCseSchedulerServer::StopServer - Call ActiveScheduler::Stop()");
       
   367         CActiveScheduler::Stop();
       
   368         }        
       
   369 
       
   370     CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::StopServer");
       
   371     }
       
   372 
       
   373 // ========================== OTHER EXPORTED FUNCTIONS =========================
       
   374 // -----------------------------------------------------------------------------
       
   375 // StartThread()
       
   376 // Start the server thread. This is called from the client.
       
   377 // -----------------------------------------------------------------------------
       
   378 //
       
   379 TInt CCseSchedulerServer::StartThread()
       
   380     {
       
   381     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::StartThread");
       
   382 #if _DEBUG
       
   383     __UHEAP_MARK;
       
   384 #endif
       
   385        
       
   386     // Check server not already started
       
   387     TFindServer findCountServer( KCseSchedulerServerName );
       
   388     TFullName name;
       
   389     if ( findCountServer.Next( name ) == KErrNone )
       
   390         { 
       
   391         // Found server already
       
   392         RProcess::Rendezvous( KErrNone );
       
   393         CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::StartThread - Return value: KErrAlreadyExists");
       
   394         return KErrAlreadyExists;
       
   395         }
       
   396 
       
   397     ThreadFunction( );
       
   398 
       
   399 #if _DEBUG
       
   400     __UHEAP_MARKEND;
       
   401 #endif    
       
   402 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::StartThread - Server down!");
       
   403 	
       
   404     // All well
       
   405     return KErrNone;
       
   406     }
       
   407 
       
   408 // --------------------------------------------------------------------------
       
   409 // CCseSchedulerServer::CustomSecurityCheckL()
       
   410 // --------------------------------------------------------------------------
       
   411 //
       
   412 CPolicyServer::TCustomResult CCseSchedulerServer::CustomSecurityCheckL(
       
   413     const RMessage2& aMsg,
       
   414     TInt& /*aAction*/,
       
   415     TSecurityInfo& /*aMissing*/ )
       
   416     {
       
   417     CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::CustomSecurityCheckL");
       
   418     TCustomResult retVal ( EFail );
       
   419     
       
   420     // Check the messagge function range
       
   421     if ( aMsg.Function() > ECseRequestBase && 
       
   422          aMsg.Function() < ECseRequestLast )
       
   423         {
       
   424         
       
   425         // Check if the client has required capabilities
       
   426         // From .mmp-file capablity NetworkControl
       
   427         if( // From .mmp-file following are CAP_SERVER capabilities
       
   428             ! aMsg.HasCapability(ECapabilityNetworkServices ) ||
       
   429             ! aMsg.HasCapability(ECapabilityLocalServices ) ||
       
   430             ! aMsg.HasCapability(ECapabilityLocation ) ||
       
   431             ! aMsg.HasCapability(ECapabilityReadUserData ) ||
       
   432             ! aMsg.HasCapability(ECapabilityWriteUserData ) ||
       
   433             ! aMsg.HasCapability(ECapabilityReadDeviceData ) ||
       
   434             ! aMsg.HasCapability(ECapabilityWriteDeviceData ) ||        
       
   435             ! aMsg.HasCapability(ECapabilityUserEnvironment ) ||
       
   436             ! aMsg.HasCapability(ECapabilitySwEvent ) )
       
   437             {         
       
   438             CSELOGSTRING2_HIGH_LEVEL(
       
   439                 "CCseSchedulerServer::CustomSecurityCheckL() No capability for message %d!!!",
       
   440                 aMsg.Function() );                 
       
   441             }
       
   442         else
       
   443             {
       
   444             CSELOGSTRING2_HIGH_LEVEL(
       
   445                 "CCseSchedulerServer::CustomSecurityCheckL() Message %d inside range and capabilities ok",
       
   446                 aMsg.Function() );
       
   447             retVal = EPass;
       
   448             }
       
   449         }
       
   450     else
       
   451         {
       
   452         CSELOGSTRING2_HIGH_LEVEL(
       
   453             "CCseSchedulerServer::CustomSecurityCheckL() Message %d outside known range!!!",
       
   454             aMsg.Function() );            
       
   455         }
       
   456     
       
   457     if( retVal == EPass )
       
   458         {
       
   459         CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::CustomSecurityCheckL - Passed");
       
   460         }
       
   461     else
       
   462         {
       
   463         CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::CustomSecurityCheckL - Failed");
       
   464         }    
       
   465     return retVal;
       
   466     }
       
   467 
       
   468 // -----------------------------------------------------------------------------
       
   469 // CCseSchedulerServerEngine::StarterCallback
       
   470 // -----------------------------------------------------------------------------
       
   471 //
       
   472 TInt CCseSchedulerServer::StarterCallback( TAny* aPtr )
       
   473 	{
       
   474 	CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::StarterCallback");
       
   475 	TBool retVal( EFalse);
       
   476 	retVal = static_cast<CCseSchedulerServer*>( aPtr )->HandleStarterCallback();
       
   477 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::StarterCallback");
       
   478 	return retVal;
       
   479 	}
       
   480 
       
   481 // -----------------------------------------------------------------------------
       
   482 // CCseSchedulerServerEngine::HandleCompletitionCallback
       
   483 // -----------------------------------------------------------------------------
       
   484 //
       
   485 TInt CCseSchedulerServer::HandleStarterCallback() 
       
   486 	{
       
   487 	CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServer::HandleStarterCallback ");
       
   488 	
       
   489 	// We dont want to use periodic anymore, so we cancel it. We just wanted to
       
   490 	// make call here 2 secs after server has been created.
       
   491 	iStarterBreaker->Cancel();  
       
   492 	
       
   493 	// Check if server can be stopped.
       
   494     iSchedulerEngine->RequestReschedule();
       
   495 	
       
   496 	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServer::HandleStarterCallback ");
       
   497 	return EFalse;
       
   498 	}
       
   499 
       
   500 // -----------------------------------------------------------------------------
       
   501 // E32Main()
       
   502 // Server startup
       
   503 // Returns: KErrNone
       
   504 // -----------------------------------------------------------------------------
       
   505 //
       
   506 GLDEF_C TInt E32Main()
       
   507     {
       
   508     return CCseSchedulerServer::StartThread();
       
   509     }
       
   510 
       
   511 // End of File