dvrengine/CommonRecordingEngine/src/CCRServer.cpp
branchRCL_3
changeset 48 13a33d82ad98
parent 0 822a42b6c3f1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dvrengine/CommonRecordingEngine/src/CCRServer.cpp	Wed Sep 01 12:20:37 2010 +0100
@@ -0,0 +1,392 @@
+/*
+* 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 <ipvideo/CRTypeDefs.h> // Constants exported from client library
+#include <e32svr.h>
+#include <e32math.h>
+#include <e32uid.h>
+#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
+