contextframework/cfw/src/cfserver/CFServer.cpp
changeset 0 2e3d3ce01487
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/contextframework/cfw/src/cfserver/CFServer.cpp	Tue Feb 02 10:12:00 2010 +0200
@@ -0,0 +1,237 @@
+/*
+* Copyright (c) 2002-2007 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "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:  CFServer class implementation.
+*
+*/
+
+
+#include <e32svr.h>
+#include <ecom/ecom.h>
+
+#include "CFServer.h"
+#include "CFEngine.h"
+#include "cftrace.h"
+#include "cfutils.h"
+#include "cfcommon.h"
+
+// CONSTANTS
+
+/**
+* Enable file trace macros
+*/
+#ifdef TRACE_INTO_FILE
+
+#include <f32file.h>
+
+    /**
+    * Enables logging by creating the log folder.
+    */
+    LOCAL_C void EnableLog()
+        {
+        RFs fs;
+        if( fs.Connect() == KErrNone )
+            {
+            fs.MkDirAll( KFullPath );
+            fs.Close();
+            }
+        }
+    #define ENABLE_LOG\
+        {\
+        EnableLog();\
+        }
+        
+#else//TRACE_INTO_FILE not defined
+
+    #define ENABLE_LOG
+
+#endif//TRACE_INTO_FILE
+ 
+// MEMBER FUNCTIONS
+
+CCFServer* CCFServer::NewL()
+    {
+    FUNC_LOG;
+    
+    CCFServer* self = CCFServer::NewLC();
+    CleanupStack::Pop( self );
+    
+    return self;
+    }
+
+CCFServer* CCFServer::NewLC()
+    {
+    FUNC_LOG;
+    
+    CCFServer* self = new( ELeave ) CCFServer( EPriorityNormal );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    
+    return self;
+    }
+
+CCFServer::~CCFServer()
+    {
+    FUNC_LOG;
+    
+    delete iCFEngine;
+    
+    // Call this from here to ease testing of other components
+    REComSession::FinalClose();
+    }
+
+void CCFServer::ConstructL()
+    {
+    FUNC_LOG;
+    
+    // Rename cfw thread
+    User::RenameThread( KContextServerName );
+    
+    iCFEngine = CCFEngine::NewL( *this );
+    
+    // Start server
+    StartL( KContextServerName );
+    }
+
+CCFServer::CCFServer( TInt aPriority ):
+    CServer2( aPriority )
+    {
+    FUNC_LOG;
+    }
+
+// METHODS
+
+//----------------------------------------------------------------------------
+// CCFServer::NewSessionL
+//----------------------------------------------------------------------------
+//
+CSession2* CCFServer::NewSessionL(
+    const TVersion &aVersion,
+    const RMessage2& /*aMessage*/) const
+    {
+    FUNC_LOG;
+    
+    // check we're the right version
+    TVersion version( KContextServMajorVersionNumber,
+        KContextServMinorVersionNumber,
+        KContextServBuildVersionNumber);
+        
+    if (!User::QueryVersionSupported( version, aVersion ) )
+        {
+        User::Leave(KErrNotSupported);
+        }
+    
+    CSession2* session = CCFServSession::NewL( 
+    	( MCFExtendedContextInterface& )*iCFEngine,
+        ( MCFActionInterface& )*iCFEngine,
+        ( MCFScriptInterface& )*iCFEngine );
+    
+    // make new session
+    return session;
+    }
+
+//----------------------------------------------------------------------------
+// CCFServer::NewSessionL
+//----------------------------------------------------------------------------
+//
+TBool CCFServer::CheckClientSecurity( const RThread& aClientThread,
+	const TSecurityPolicy& aSecurityPolicy )
+	{
+    FUNC_LOG;
+    
+    // Security check only needed if request is from other process than CF
+    TBool securityPassed = ETrue;
+    if( !CFUtils::RequestFromSameProcess( aClientThread ) )
+        {
+        securityPassed = aSecurityPolicy.CheckPolicy( aClientThread );
+        }
+
+    return securityPassed;
+	}
+        
+//----------------------------------------------------------------------------
+// CCFServer::PanicServer
+//----------------------------------------------------------------------------
+//
+void CCFServer::PanicServer( TContextServPanic aPanic )
+    {
+    FUNC_LOG;
+    
+    User::Panic( KContextServerName, aPanic );
+    }
+
+//----------------------------------------------------------------------------
+// CCFServer::ThreadFunctionL
+//----------------------------------------------------------------------------
+//
+void CCFServer::ThreadFunctionL( TAny* /*aThreadParms*/ )
+    {
+    FUNC_LOG;
+    
+    // Create scheduler
+    CActiveScheduler* activeScheduler = new( ELeave ) CActiveScheduler;
+    CleanupStack::PushL( activeScheduler );
+    CActiveScheduler::Install( activeScheduler );
+
+    // Create Context Framework Server and signal client that we are ready
+    CCFServer* server = CCFServer::NewLC();
+    RProcess::Rendezvous( KErrNone );
+    
+    TIMESTAMP( "CF server active scheduler start" );
+
+    // Start scheduler
+    CActiveScheduler::Start();
+
+    TIMESTAMP( "CF server process exit" );
+    
+    // Clean up
+    CleanupStack::PopAndDestroy( server );
+    CleanupStack::PopAndDestroy( activeScheduler );
+    }
+
+//----------------------------------------------------------------------------
+// CCFServer::ThreadFunction
+//----------------------------------------------------------------------------
+//
+TInt CCFServer::ThreadFunction( TAny* aThreadParms )
+    {
+    FUNC_LOG;
+    
+    CTrapCleanup* cleanupStack = CTrapCleanup::New();
+    if( cleanupStack )
+        {
+        TRAPD( err, ThreadFunctionL( aThreadParms ) );
+        if( err != KErrNone )
+            {
+            // Signal client that server creation failed
+            RProcess::Rendezvous( err );
+            }
+        }
+        
+    // Clean up        
+    delete cleanupStack;
+    cleanupStack = NULL;
+
+    return KErrNone;
+    }
+
+// Entry point
+GLDEF_C TInt E32Main()
+	{
+	ENABLE_LOG;
+
+    HEAP( "[START] CF server process entry" );
+    TIMESTAMP( "CF server process entry" );
+    
+	return CCFServer::ThreadFunction( NULL );
+	}