diff -r 798ee5f1972c -r 826cea16efd9 dvrengine/CommonRecordingEngine/src/CCRServer.cpp --- a/dvrengine/CommonRecordingEngine/src/CCRServer.cpp Thu Aug 19 10:54:18 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,392 +0,0 @@ -/* -* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: Implementation of CR servers server class* -*/ - - - - -// INCLUDE FILES -#include "CCRServer.h" -#include "CCRSession.h" -#include "CCREngine.h" -#include // Constants exported from client library -#include -#include -#include -#include "videoserviceutilsLogger.h" - -// CONSTANTS -// Platform security. Custom check is applied to all IPCs. -static const int KRangeCount( 1 ); - -static const TInt SecurityRanges[KRangeCount] = - { - 0, // Range is from 0 to KMaxTInt - }; - -static const TUint8 SecurityRangesPolicy[KRangeCount] = - { - CPolicyServer::ECustomCheck - }; - -static const CPolicyServer::TPolicy Policy = - { - CPolicyServer::EAlwaysPass, - KRangeCount, - SecurityRanges, - SecurityRangesPolicy, - NULL, - }; - -// ============================ MEMBER FUNCTIONS =============================== - -// ----------------------------------------------------------------------------- -// CCRServer::NewLC() -// -// ----------------------------------------------------------------------------- -// -CCRServer* CCRServer::NewLC( ) - { - CCRServer* self = new( ELeave ) CCRServer; - CleanupStack::PushL( self ); - self->ConstructL( ); - return self; - } - -// ----------------------------------------------------------------------------- -// CCRServer::CCRServer() -// C++ constructor -// ----------------------------------------------------------------------------- -// -CCRServer::CCRServer() - : CPolicyServer( EPriorityRealTimeServer, Policy, ESharableSessions ), - iSessionCount( 0 ) - { - __DECLARE_NAME( _S( "CCRServer" ) ); - } - -// ----------------------------------------------------------------------------- -// CCRServer::ConstructL() -// second-phase constructor; create the object container index. -// ----------------------------------------------------------------------------- -// -void CCRServer::ConstructL( ) - { - LOG( "CCRServer::ConstructL()" ); - - iContainerIx = CObjectConIx::NewL(); - iObjectCon = iContainerIx->CreateL(); - - StartL( KCRServerNameExe ); - } - -// ----------------------------------------------------------------------------- -// CCRServer::~CCRServer() -// Destructor. -// ----------------------------------------------------------------------------- -// -CCRServer::~CCRServer() - { - LOG( "CCRServer::~CCRServer()" ); - - DeleteRtpEngine(); - } - -// ----------------------------------------------------------------------------- -// CCRServer::ThreadFunction() -// The active scheduler is installed and started here. -// ----------------------------------------------------------------------------- -// -TInt CCRServer::ThreadFunction( ) - { - CTrapCleanup* cleanupStack = CTrapCleanup::New(); - if ( !cleanupStack ) - { - PanicServer( KErrNoMemory ); - } - - TRAPD( err, ThreadFunctionL( ) ); - if ( err ) - { - PanicServer( KErrServerTerminated ); - } - - delete cleanupStack; - cleanupStack = NULL; - - return KErrNone; - } - -// ----------------------------------------------------------------------------- -// CCRServer::ThreadFunctionL() -// -// ----------------------------------------------------------------------------- -// -void CCRServer::ThreadFunctionL( ) - { - LOG( "CCRServer::ThreadFunctionL() - In" ); - - // Construct active scheduler - CActiveScheduler* activeScheduler = new ( ELeave ) CActiveScheduler; - CleanupStack::PushL( activeScheduler ); // |-> 1 - - // Install active scheduler. - // We don't need to check whether an active scheduler is already installed - // as this is a new thread, so there won't be one - CActiveScheduler::Install( activeScheduler ); - - // Construct our server, pushed cleanup stack and leaved there - CCRServer* server = CCRServer::NewLC( ); // |-> 2 - - // Signal server is up - RProcess::Rendezvous( KErrNone ); - - // Start handling requests - CActiveScheduler::Start(); - - CleanupStack::PopAndDestroy( server ); // 2<-| - CleanupStack::PopAndDestroy( activeScheduler ); // 1<-| - - LOG( "CCRServer::ThreadFunctionL() - Out" ); - } - -// ----------------------------------------------------------------------------- -// CCRServer::SignalClientL -// Signal the client that server is running. -// ----------------------------------------------------------------------------- -void CCRServer::SignalClientL() - { - RSemaphore semaphore; - User::LeaveIfError( semaphore.OpenGlobal( KCRServerSemaphoreName ) ); - semaphore.Signal(); - semaphore.Close(); - } - -// ----------------------------------------------------------------------------- -// CCRServer::PanicServer -// Utility - panic the server -// ----------------------------------------------------------------------------- -void CCRServer::PanicServer( TInt aPanic ) - { - LOG1( "CCRServer::PanicServer(), aPanic: %d", aPanic ); - - User::Panic( KCRServerNameExe, aPanic ); - } - -// ----------------------------------------------------------------------------- -// CCRServer::GetEngineObjectL() -// -// ----------------------------------------------------------------------------- -// -CCREngine* CCRServer::GetEngineObjectL() - { - if ( iObjectCon->Count() == 0 ) - { - // Create CR engine - iEngine = CCREngine::NewL( ); - - // Add our engine to container - iObjectCon->AddL( iEngine ); - } - else - { - // default implementation return KErrNone. - if ( KErrNone != iEngine->Open() ) - { - User::Leave( KErrGeneral ); - } - } - - // We have only one object in our container - return iEngine; - } - -// ----------------------------------------------------------------------------- -// CCRServer::Inc() -// -// ----------------------------------------------------------------------------- -// -void CCRServer::Inc() - { - iSessionCount++; - LOG1( "CCRServer::Inc(), New iSessionCount: %d", iSessionCount ); - } - -// ----------------------------------------------------------------------------- -// CCRServer::Dec() -// -// ----------------------------------------------------------------------------- -// -void CCRServer::Dec() - { - iSessionCount--; - LOG1( "CCRServer::Dec(), New iSessionCount: %d", iSessionCount ); - - if ( iSessionCount <= 0 ) - { - StopServer(); - } - } - -// ----------------------------------------------------------------------------- -// CCRServer::NewSessionL() -// -// ----------------------------------------------------------------------------- -// -CSession2* CCRServer::NewSessionL( - const TVersion& aVersion, - const RMessage2& /*aMessage*/ ) const - { - // Check version is ok - TVersion v( KCRServMajorVersionNumber, - KCRServMinorVersionNumber, - KCRServBuildVersionNumber ); - - if ( !User::QueryVersionSupported( v, aVersion ) ) - { - User::Leave( KErrNotSupported ); - } - - // Make new session - return CCRSession::NewL( ( CCRServer* ) this ); - } - -// ----------------------------------------------------------------------------- -// CCRServer::StopServer -// Stops the server thread if no sessions active. -// ----------------------------------------------------------------------------- -// -void CCRServer::StopServer() - { - LOG( "CCRServer::StopServer()" ); - - CActiveScheduler::Stop(); - } - -// ----------------------------------------------------------------------------- -// CCRServer::DeleteRtpEngine -// Stops active scheduler and deletes object container and other objects. -// ----------------------------------------------------------------------------- -// -void CCRServer::DeleteRtpEngine() - { - LOG1( "CCRServer::DeleteRtpEngine(), iContainerIx: %d", iContainerIx ); - - if ( iContainerIx ) - { - iContainerIx->Remove( iObjectCon ); - delete iContainerIx; iContainerIx = NULL; - } - } - -// ========================== OTHER EXPORTED FUNCTIONS ========================= - -// ----------------------------------------------------------------------------- -// StartThread() -// Start the server thread. This is called from the client. -// ----------------------------------------------------------------------------- -// -TInt CCRServer::StartThread() - { -#ifdef _DEBUG - __UHEAP_MARK; -#endif - - LOG( "CCRServer::StartThread() - In" ); - // Check server not already started - TFindServer findCountServer( KCRServerNameExe ); - TFullName name; - if ( findCountServer.Next( name ) == KErrNone ) - { - // Found server already - TRAP_IGNORE( CCRServer::SignalClientL() ); - return KErrAlreadyExists; - } - - ThreadFunction( ); - - LOG( "CCRServer::StartThread() - Out" ); - -#ifdef _DEBUG - __UHEAP_MARKEND; -#endif - - return KErrNone; - } - -// ----------------------------------------------------------------------------- -// E32Main() -// Server startup -// Returns: KErrNone -// ----------------------------------------------------------------------------- -// -GLDEF_C TInt E32Main() - { - return CCRServer::StartThread(); - } - -// -------------------------------------------------------------------------- -// CCRServer::CustomSecurityCheckL() -// -------------------------------------------------------------------------- -// -CPolicyServer::TCustomResult CCRServer::CustomSecurityCheckL( - const RMessage2& aMsg, - TInt& /*aAction*/, - TSecurityInfo& /*aMissing*/ ) - { - - TCustomResult retVal ( EFail ); - - // Check the messagge function range - if ( ( aMsg.Function() > ECRServBase && - aMsg.Function() < ECRServLastEnum ) || - ( aMsg.Function() > ECRLiveTvBase && - aMsg.Function() < ECRLiveTvLastEnum ) ) - { - // Check if the client has required capabilities - // From .mmp-file following are CAP_APPLICATION capabilities - if( ! aMsg.HasCapability(ECapabilityNetworkServices ) || - ! aMsg.HasCapability(ECapabilityLocalServices ) || - ! aMsg.HasCapability(ECapabilityLocation ) || - ! aMsg.HasCapability(ECapabilityReadUserData ) || - ! aMsg.HasCapability(ECapabilityWriteUserData ) || - ! aMsg.HasCapability(ECapabilityReadDeviceData ) || - ! aMsg.HasCapability(ECapabilityWriteDeviceData ) || - ! aMsg.HasCapability(ECapabilitySwEvent ) ) - { - LOG1( - "CCRServer::CustomSecurityCheckL() No capability for message %d!!!", - aMsg.Function() ); - } - else - { - LOG1( - "CCRServer::CustomSecurityCheckL() Message %d inside range and capabilities ok", - aMsg.Function() ); - retVal = EPass; - } - } - else - { - LOG1( - "CCRServer::CustomSecurityCheckL() Message %d outside known range!!!", - aMsg.Function() ); - } - - return retVal; - - } -// End of File -