diff -r 000000000000 -r b497e44ab2fc syncmlfw/dm/hostserver/dmhostserverbase/src/nsmldmhostserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/syncmlfw/dm/hostserver/dmhostserverbase/src/nsmldmhostserver.cpp Thu Dec 17 09:07:52 2009 +0200 @@ -0,0 +1,241 @@ +/* +* 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: Contains a common code for all dedicated dm host servers. +* +*/ + + +// ------------------------------------------------------------------------------------------------ +// Includes +// ------------------------------------------------------------------------------------------------ + +#include +#include +#include +#include +#include +#include +#include "nsmldmclientandserver.h" +#include "nsmldmhostserver.h" +#include "nsmldmhostsession.h" + + +// ------------------------------------------------------------------------------------------------ +// Constants +// ------------------------------------------------------------------------------------------------ +// +const TInt KNSmlMaxSessionCount = 2; // Allowed clients: Treemodule and another dm host server +_LIT ( KNSmlDmThreadAux, "_thread" ); +_LIT ( KTxtDmHostServerBase,"NSmlDmHostServerBase"); +const TUint32 KNSmlDMHostServer1ID = 270506498; // 0x101F9A02 +const TUint32 KNSmlDMHostServer2ID = 270506499; // 0x101F9A03 +const TUint32 KNSmlDMHostServer3ID = 270506500; // 0x101F9A04 +const TUint32 KNSmlDMHostServer4ID = 270506501; // 0x101F9A05 + + +// ------------------------------------------------------------------------------------------------ +// CNSmlDMHostServer::~CNSmlDMHostServer +// Destructor. +// ------------------------------------------------------------------------------------------------ +// +EXPORT_C CNSmlDMHostServer::~CNSmlDMHostServer() + { + _DBG_FILE("CNSmlDMHostServer::~CNSmlDMHostServer(): begin"); + _DBG_FILE("CNSmlDMHostServer::~CNSmlDMHostServer(): end"); + } +// ------------------------------------------------------------------------------------------------ +// CNSmlDMHostServer::InitHostServer +// Initializes the server, calls aFunction. +// ------------------------------------------------------------------------------------------------ +// +EXPORT_C TInt CNSmlDMHostServer::InitHostServer ( const TDesC& aServerName, TThreadFunction aFunction ) + { + // check server not already started + TFindServer findHostServer ( aServerName ); + TFullName name; + if ( findHostServer.Next ( name ) == KErrNone ) + { + return KErrAlreadyExists; + } + TInt error( KErrNone ); + error = ThreadFunction( (TAny*)aFunction ); +// _DBG_FILE("CNSmlDMHostServer::InitHostServer(): end"); + return error; + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDMHostServer::ThreadFunction +// Starting point of a server thread. +// ------------------------------------------------------------------------------------------------ +// +TInt CNSmlDMHostServer::ThreadFunction ( TAny* aStarted ) + { + __UHEAP_MARK; + CTrapCleanup* cleanup = CTrapCleanup::New(); + __ASSERT_ALWAYS ( cleanup, PanicServer ( EMainSchedulerError ) ); + CActiveScheduler* scheduler = new CActiveScheduler(); + __ASSERT_ALWAYS ( scheduler, PanicServer ( EMainSchedulerError ) ); + CActiveScheduler::Install ( scheduler ); + TThreadFunction function = reinterpret_cast( aStarted ); + + __UHEAP_MARK; + TInt ret( function( NULL ) ); + __UHEAP_MARKEND; + + CActiveScheduler::Install ( NULL ); + delete scheduler; + delete cleanup; + __UHEAP_MARKEND; + + return ret; + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDMHostServer::ServerName +// Server exe name is concluded from the current thread name. +// ------------------------------------------------------------------------------------------------ +// +TPtrC CNSmlDMHostServer::ServerName() + { + RThread th; + TName thname = th.Name(); + TInt offset = thname.Find ( KNSmlDmThreadAux ); + TPtrC serverExeName; + serverExeName.Set ( KNullDesC ); + if ( offset != KErrNotFound ) + { + TPtrC serverName = thname.Left ( offset ); + if ( !serverName.Compare ( KNSmlDmHostServer1Name ) ) + { + serverExeName.Set ( KNSmlDmHostServer1Exe ); + } + else if ( !serverName.Compare ( KNSmlDmHostServer2Name ) ) + { + serverExeName.Set ( KNSmlDmHostServer2Exe ); + } + else if ( !serverName.Compare ( KNSmlDmHostServer3Name ) ) + { + serverExeName.Set ( KNSmlDmHostServer3Exe ); + } + else if ( !serverName.Compare ( KNSmlDmHostServer4Name ) ) + { + serverExeName.Set ( KNSmlDmHostServer4Exe ); + } + } + return serverExeName; + } +// ------------------------------------------------------------------------------------------------ +// CNSmlDMHostServer::NewSessionL +// Returns a new session object, when security and version checkings are successfully passed. +// ------------------------------------------------------------------------------------------------ +// +CSession2* CNSmlDMHostServer::NewSessionL( const TVersion& aVersion, const RMessage2& aMessage ) const + { + _DBG_FILE("CNSmlDMHostServer::NewSessionL(): begin"); + if( iSessionCount >= KNSmlMaxSessionCount ) + { + User::Leave(KErrCouldNotConnect); + } + + // check we're the right version + TVersion ver ( KNSmlDmHostServerVerMajor, KNSmlDmHostServerVerMinor, KNSmlDmHostServerVerBuild ); + if( !User::QueryVersionSupported ( ver, aVersion) ) + { + _DBG_FILE("CNSmlDMHostServer::NewSessionL(): wrong version offered -> BAIL OUT!"); + User::Leave ( KErrNotSupported ); + } + + TUint32 idOfCaller = aMessage.SecureId().iId; + if ( idOfCaller != KNSmlDMHostServer1ID && idOfCaller != KNSmlDMHostServer2ID + && idOfCaller != KNSmlDMHostServer3ID && idOfCaller != KNSmlDMHostServer4ID ) + { + _LIT_SECURITY_POLICY_S0 ( mySidPolicy, KNSmlSOSServerSecureID ); + TBool status = mySidPolicy().CheckPolicy ( aMessage ); + } + + _DBG_FILE("CNSmlDMHostServer::NewSessionL(): end"); + return CNSmlDMHostSession::NewL ( *CONST_CAST ( CNSmlDMHostServer*, this ) ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDMHostServer::CNSmlDMHostServer() +// Constructor. Protected to prevent direct instantiation. +// ------------------------------------------------------------------------------------------------ +// +EXPORT_C CNSmlDMHostServer::CNSmlDMHostServer() : CServer2 ( EPriorityStandard ) + { + _DBG_FILE("CNSmlDMHostServer::CNSmlDMHostServer(): begin"); + _DBG_FILE("CNSmlDMHostServer::CNSmlDMHostServer(): end"); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDMHostServer::IncSessionCount +// Increments session count. +// ------------------------------------------------------------------------------------------------ +// +void CNSmlDMHostServer::IncSessionCount() + { + _DBG_FILE("CNSmlDMHostServer::IncSessionCount(): begin"); + iSessionCount++; + _DBG_FILE("CNSmlDMHostServer::IncSessionCount(): end"); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDMHostServer::DecSessionCount +// Decrements session count. When count reaches zero, stops active scheduler. +// ------------------------------------------------------------------------------------------------ +// +void CNSmlDMHostServer::DecSessionCount() + { + _DBG_FILE("CNSmlDMHostServer::DecSessionCount(): begin"); + iSessionCount--; + if ( iSessionCount < 1 ) + { + Cancel(); + CActiveScheduler::Stop(); + } + _DBG_FILE("CNSmlDMHostServer::DecSessionCount(): end"); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDMHostServer::CallNewSessionL +// Calls NewSessionL. +// ------------------------------------------------------------------------------------------------ +// +EXPORT_C CSession2* CNSmlDMHostServer::CallNewSessionL ( const TVersion& aVersion, const RMessage2& aMessage ) const + { + _DBG_FILE("CNSmlDMHostServer::CallNewSessionL()"); + return CNSmlDMHostServer::NewSessionL( aVersion, aMessage ); + } + +// ------------------------------------------------------------------------------------------------ +// CNSmlDMHostServer::PanicServer() +// Panics the server. Signals the semaphore in order to prevent dm client halting. +// ------------------------------------------------------------------------------------------------ +// +void CNSmlDMHostServer::PanicServer ( TNSmlDmHostServerPanic aPanic ) + { + _DBG_FILE("CNSmlDMHostServer::PanicServer()"); + RSemaphore s; + TBuf<64> semaphoreName ( ServerName() ); + if( s.OpenGlobal ( semaphoreName ) == KErrNone ) + { + s.Signal(); + s.Close(); + } + + User::Panic ( KTxtDmHostServerBase, aPanic ); + } + +// End of file