syncmlfw/ds/hostserver/dshostserverbase/src/Nsmldshostserver.cpp
changeset 0 b497e44ab2fc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/syncmlfw/ds/hostserver/dshostserverbase/src/Nsmldshostserver.cpp	Thu Dec 17 09:07:52 2009 +0200
@@ -0,0 +1,250 @@
+/*
+* Copyright (c) 2005 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:  DS Host Server
+*
+*/
+
+
+// INCLUDE FILES
+#include <s32std.h>
+#include <data_caging_path_literals.hrh>
+#include <f32file.h>
+#include <e32math.h>
+
+#include <nsmldebug.h>
+#include "nsmldshostconstants.h"
+#include "Nsmldshostserver.h"
+#include "Nsmldshostsession.h"
+
+// CONSTANTS
+const TInt KNSmlMaxSessionCount = 200;
+
+// ======================================= MEMBER FUNCTIONS =======================================
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostServer::~CNSmlDSHostServer
+// ------------------------------------------------------------------------------------------------
+EXPORT_C CNSmlDSHostServer::~CNSmlDSHostServer()
+	{
+	_DBG_FILE("CNSmlDSHostServer::~CNSmlDSHostServer(): begin");
+	_DBG_FILE("CNSmlDSHostServer::~CNSmlDSHostServer(): end");
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostServer::InitHostServer
+// ------------------------------------------------------------------------------------------------
+EXPORT_C TInt CNSmlDSHostServer::InitHostServer( TNSmlHostServers aServer, TThreadFunction aFunction )
+    {
+	const TDesC& serverName = ServerName( aServer );
+	if ( serverName == KNullDesC )
+		{
+		return KErrArgument;
+		}
+    	
+    // check server not already started
+    TFindServer findHostServer( serverName );
+    TFullName name;
+    if ( findHostServer.Next( name ) == KErrNone )
+	    { // found server already 
+	    return KErrGeneral;
+	    }
+        
+	TInt error( KErrNone );
+    error = ThreadFunction( (TAny*) aFunction, aServer );
+    
+	return error;
+    }
+    
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostServer::ServerName
+// ------------------------------------------------------------------------------------------------
+const TDesC& CNSmlDSHostServer::ServerName( TNSmlHostServers aServer )
+	{
+	if ( aServer > ENSmlHostServerEnd )
+    	{
+    	aServer = ENSmlHostServerEnd;
+    	}
+    	
+    const TDesC* KNSmlHostServerNames[ENSmlHostServerEnd + 1] = 
+		{
+		&KNSmlDSHostServer1Name,
+		&KNSmlDSHostServer2Name,
+		&KNullDesC
+		};
+		
+    return *KNSmlHostServerNames[aServer];
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostServer::ServerModuleName
+// ------------------------------------------------------------------------------------------------	
+const TDesC& CNSmlDSHostServer::ServerModuleName( TNSmlHostServers aServer )
+	{
+	if ( aServer > ENSmlHostServerEnd )
+    	{
+    	aServer = ENSmlHostServerEnd;
+    	}
+    	
+    const TDesC* KNSmlHostServerModuleNames[ENSmlHostServerEnd + 1] =
+		{
+		&KNSmlDSHostServer1Exe,
+		&KNSmlDSHostServer2Exe,
+		&KNullDesC
+		};
+	
+	return *KNSmlHostServerModuleNames[aServer];
+	}
+    
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostServer::ThreadFunction
+// ------------------------------------------------------------------------------------------------ 
+TInt CNSmlDSHostServer::ThreadFunction( TAny* aStarted, TNSmlHostServers aServer )
+	{
+	__UHEAP_MARK;
+	
+	TThreadFunction function = reinterpret_cast<TThreadFunction>( aStarted );
+
+    CTrapCleanup* cleanup = CTrapCleanup::New();
+    __ASSERT_ALWAYS( cleanup, HandleLeaveOnStartup( &aServer ) );
+    TRAPD(err, HostServerStartUpL( function, aServer ) );
+    delete cleanup;
+    __UHEAP_MARKEND;
+    
+	return err;
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostServer::HostServerStartUpL
+// ------------------------------------------------------------------------------------------------    
+void CNSmlDSHostServer::HostServerStartUpL( TThreadFunction aFunction, TNSmlHostServers aServer )
+	{
+	CleanupStack::PushL( TCleanupItem ( HandleLeaveOnStartup, &aServer ) );
+	
+    CActiveScheduler* scheduler = new ( ELeave ) CActiveScheduler();
+	CActiveScheduler::Install( scheduler );
+	
+	__UHEAP_MARK;
+	aFunction( NULL );
+	__UHEAP_MARKEND;
+	
+	CActiveScheduler::Install( NULL );
+    delete scheduler;
+	
+	CleanupStack::Pop();
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostServer::ServerFromThread
+// ------------------------------------------------------------------------------------------------
+TNSmlHostServers CNSmlDSHostServer::ServerFromThread( const RThread &aThread )
+	{
+	TInt tmp;
+	TName thname = aThread.Name();
+	TPtrC serverid = thname.Left( 4 );
+	TLex lex( serverid );
+	lex.Val(tmp);
+	return static_cast<TNSmlHostServers>( tmp );
+	}
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostServer::NewSessionL
+// ------------------------------------------------------------------------------------------------
+CSession2* CNSmlDSHostServer::NewSessionL( const TVersion& aVersion, const RMessage2& aMessage ) const
+	{
+	_DBG_FILE("CNSmlDSHostServer::NewSessionL(): begin");
+	if( iSessionCount >= KNSmlMaxSessionCount )
+		{
+		User::Leave( KErrCouldNotConnect );
+		}
+
+	// check we're the right version
+	TVersion DSHostServerVersion( KNSmlDSHostServerVersionMajor, 
+		KNSmlDSHostServerVersionMinor, KNSmlDSHostServerVersionBuild );
+		
+	if( !User::QueryVersionSupported( DSHostServerVersion, aVersion ) )
+		{
+		_DBG_FILE("CNSmlDSHostServer::NewSessionL(): wrong version offered -> BAIL OUT!");
+		User::Leave(KErrNotSupported);
+		}
+	TSecureId id = aMessage.SecureId();
+	_LIT_SECURITY_POLICY_S0( mySidPolicy, KNSmlSOSServerSecureID );
+
+	if ( !mySidPolicy().CheckPolicy( aMessage ) )
+		{
+		User::Leave( KErrPermissionDenied );
+		}
+
+	_DBG_FILE("CNSmlDSHostServer::NewSessionL(): end");
+	return CNSmlDSHostSession::NewL( *const_cast<CNSmlDSHostServer*>( this ) );	
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostServer::CNSmlDSHostServer
+// ------------------------------------------------------------------------------------------------
+EXPORT_C CNSmlDSHostServer::CNSmlDSHostServer() : CServer2(EPriorityStandard)
+	{
+	_DBG_FILE("CNSmlDSHostServer::CNSmlDSHostServer(): begin");
+	_DBG_FILE("CNSmlDSHostServer::CNSmlDSHostServer(): end");
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostServer::IncSessionCount
+// ------------------------------------------------------------------------------------------------
+EXPORT_C void CNSmlDSHostServer::IncSessionCount()
+	{
+	_DBG_FILE("CNSmlDSHostServer::IncSessionCount(): begin");
+	++iSessionCount;
+	_DBG_FILE("CNSmlDSHostServer::IncSessionCount(): end");
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostServer::DecSessionCount
+// ------------------------------------------------------------------------------------------------
+EXPORT_C void CNSmlDSHostServer::DecSessionCount()
+	{
+	_DBG_FILE("CNSmlDSHostServer::DecSessionCount(): begin");
+	--iSessionCount;
+    if ( !iSessionCount )
+        {
+        CActiveScheduler::Stop();   
+        }
+	_DBG_FILE("CNSmlDSHostServer::DecSessionCount(): end");
+	}
+	
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostServer::CallNewSessionL
+// ------------------------------------------------------------------------------------------------
+EXPORT_C CSession2* CNSmlDSHostServer::CallNewSessionL( const TVersion& aVersion, const RMessage2& aMessage ) const
+    {
+    return CNSmlDSHostServer::NewSessionL( aVersion, aMessage );
+    }
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostServer::HandleLeaveOnStartup
+// ------------------------------------------------------------------------------------------------
+void CNSmlDSHostServer::HandleLeaveOnStartup( TAny* /*aP*/ )
+	{
+	RProcess::Rendezvous( KErrGeneral );
+	PanicServer( EMainSchedulerError );
+	}
+
+// ------------------------------------------------------------------------------------------------
+// CNSmlDSHostServer::PanicServer
+// ------------------------------------------------------------------------------------------------    
+void CNSmlDSHostServer::PanicServer( TNSmlHostServerErrors aPanic )
+	{
+	_LIT( KTxtDSHostServerBase, "NSmlDSHostServerBase" );
+	User::Panic( KTxtDSHostServerBase, aPanic );
+	}
+
+// End of File