--- /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 );
+ }