diff -r 000000000000 -r 094583676ce7 PECengine/PresenceServer2/ServerSrc/CPEngServer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PECengine/PresenceServer2/ServerSrc/CPEngServer.cpp Thu Dec 17 08:41:52 2009 +0200 @@ -0,0 +1,398 @@ +/* +* Copyright (c) 2002 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: Presence Server class +* +*/ + + +// Include Files +#include +#include + +#include "CPEngServer.h" +#include "CPEngSession.h" +#include "CPEngSubSession.h" +#include "TPEngServerCommon.h" +#include "TPEngServerParams.h" +#include "CPEngCSPSessManager.h" +#include "CPengSessionSlotId.h" +#include "CPEngActiveScheduler.h" + +// Debug Prints +#include "PresenceDebugPrint.h" + +// CONSTANTS + +// Static data for Capability check configuration +static const TInt KPEngServerRangeCount = 2; + +/** + * Ranges for the Request values + * All requests will fall in one range + */ +static const TInt PEngServerRanges[ KPEngServerRangeCount ] = + { + 0, // Range from EMainSessShutdownServer to ESubSessFetchUpdateRqstResult + EHighestServerRequest // range is from EHighestServerRequest request to KMaxInt + }; + +/** + * Element indexes for the defined ranges + * we have only one range and for it is defined only one Element + */ +static const TUint8 KPEngServerElementsIndex[KPEngServerRangeCount] = + { + 0, // First element in the element array will be applied for this range + CPolicyServer::ENotSupported + }; + +// Policy elements +static const CPolicyServer::TPolicyElement KPEngServerElements[] = + { + { + _INIT_SECURITY_POLICY_C3( ECapabilityReadUserData, + ECapabilityWriteUserData, + ECapabilityNetworkServices ), + CPolicyServer::EFailClient + } + }; + +static const CPolicyServer::TPolicy KPEngServerPolicy = + { + // The index into Elements,that is used to check a connection attempt + + 0, + // Number of ranges in the iRanges array + KPEngServerRangeCount, + + // A pointer to an array of ordered ranges of request numbers + PEngServerRanges, + + // A pointer to an array of TUint8 values specifying + // the appropriate action to take for each range in iRanges + KPEngServerElementsIndex, + + // A pointer to an array of distinct policy elements + KPEngServerElements + }; + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CPEngServer::CPEngServer +// C++ default constructor can NOT contain any code, that might leave. +// ----------------------------------------------------------------------------- +// +CPEngServer::CPEngServer( + TInt aPriority ) + : CPolicyServer( aPriority, KPEngServerPolicy ), + iRunning( EFalse ), + iSessionsManagers( 1 ) // usually only one session + { + } + +// ----------------------------------------------------------------------------- +// CPEngServer::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CPEngServer::ConstructL() + { + StartL( KServerName ); + User::LeaveIfError( iStoreAdmin.Connect() ); + iContainer = CObjectCon::NewL(); + // we need to assign some unique ID to the container, to own the object + // stored in it + iContainer->iUniqueID = 1; + } + +// ----------------------------------------------------------------------------- +// CPEngServer::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPEngServer* CPEngServer::NewL( + TInt aPriority ) + { + CPEngServer* self = CPEngServer::NewLC( aPriority ); + CleanupStack::Pop(); + return self; + } + +// ----------------------------------------------------------------------------- +// CPEngServer::NewLC +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CPEngServer* CPEngServer::NewLC( + TInt aPriority ) + { + CPEngServer* self = new( ELeave ) CPEngServer( aPriority ); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// Destructor (virtual by CBase) +CPEngServer::~CPEngServer() + { + PENG_DP( D_PENG_LIT( "CPEngServer::~CPEngServer()" ) ); + delete iContainer; + iStoreAdmin.Close(); + iSessionsManagers.ResetAndDestroy(); + REComSession::FinalClose(); + } + + +// ============================================================================= +// =============== Functions from base class =================================== +// ============================================================================= + +// ----------------------------------------------------------------------------- +// CPEngServer::ExecuteServerL() +// ----------------------------------------------------------------------------- +// +TInt CPEngServer::ExecuteServerL( + TPEngServerParams& aParams ) + { + //Renaming must be done as early as possible + aParams.RenameMainThread( KServerName ); + + TInt res( KErrNone ); + + // start scheduler and server + CPEngActiveScheduler* pA = new( ELeave )CPEngActiveScheduler; + CleanupStack::PushL( pA ); + CPEngActiveScheduler::Install( pA ); + + //If exe server, call RunServerL directly. + TRAP( res, RunServerL( aParams ) ); + + CPEngActiveScheduler::Install( NULL ); + CleanupStack::PopAndDestroy();//pA + return res; + } + + +// ----------------------------------------------------------------------------- +// CPEngServer::StopServer() +// ----------------------------------------------------------------------------- +// +void CPEngServer::StopServer() + { + if ( iRunning ) + { + CPEngActiveScheduler::Stop(); + } + iRunning = EFalse; + } + +// ----------------------------------------------------------------------------- +// CPEngServer::RunServerL() +// ----------------------------------------------------------------------------- +// +void CPEngServer::RunServerL( + TPEngServerParams& aParams ) + { + PENG_DP( D_PENG_LIT( "CPEngServer::RunServerL()" ) ); + + //One instance of server must be allocated here. + CPEngServer* server = CPEngServer::NewLC( KServerPriority ); + + //must die if can't signal client + aParams.Signal( ); + // start fielding requests from clients + //Thread is ended when CPEngActiveScheduler::Stop is called. + server->StartServer(); + + + CleanupStack::PopAndDestroy();//server + // finished + PENG_DP( D_PENG_LIT( "CPEngServer::RunServerL() - End" ) ); + } + +// ============================================================================= +// =============== Functions from the MPEngServer class ================= +// ============================================================================= + +// ----------------------------------------------------------------------------- +// CPEngServer::SessionCreated() +// ----------------------------------------------------------------------------- +// +void CPEngServer::SessionCreated() + { + iSessCount++; + } + +// ----------------------------------------------------------------------------- +// CPEngServer::SessionDied() +// ----------------------------------------------------------------------------- +// +void CPEngServer::SessionDied() + { + iSessCount--; + CheckServerAccess(); + } + +// ----------------------------------------------------------------------------- +// CPEngServer::AddSubSessionL() +// ----------------------------------------------------------------------------- +// +void CPEngServer::AddSubSessionL( + CPEngSubSession& aSubSession ) + { + iContainer->AddL( &aSubSession ); + } + + +// ----------------------------------------------------------------------------- +// CPEngServer::RemoveSubSessionL() +// ----------------------------------------------------------------------------- +// +void CPEngServer::RemoveSubSessionL( + CPEngSubSession& aSubSession ) + { + iContainer->Remove( &aSubSession ); + } + + +// ----------------------------------------------------------------------------- +// CPEngServer::CSPSessionManagerL() +// ----------------------------------------------------------------------------- +// +CPEngCSPSessManager* CPEngServer::CSPSessionManagerLC( + CPEngSessionSlotId& aSessionId ) + { + // try to find session slot manager + TInt count( iSessionsManagers.Count() ); + for ( TInt x( 0 ) ; x < count ; ++x ) + { + if ( KErrNone == iSessionsManagers[ x ]->SessionId().Match( + aSessionId ) ) + { + // session manager exists, return it + CPEngCSPSessManager* sessManager = iSessionsManagers[ x ]; + sessManager->Open(); // CSI: 65 # + CleanupClosePushL( *sessManager ); + return sessManager; + } + } + // Session Manager does not exist, create it + CPEngCSPSessManager* sessManager = CPEngCSPSessManager::NewLC( + *this, + aSessionId, + iStoreAdmin ); + iSessionsManagers.AppendL( sessManager ); + return sessManager; + } + + +// ----------------------------------------------------------------------------- +// CPEngServer::RemoveStateMachine() +// ----------------------------------------------------------------------------- +// +void CPEngServer::RemoveCSPSessManager( + CPEngCSPSessManager* aManager ) + { + TInt index( iSessionsManagers.Find( aManager ) ); + if ( index != KErrNotFound ) + { + iSessionsManagers.Remove( index ); + } + CheckServerAccess(); + } + +// ----------------------------------------------------------------------------- +// CPEngServer::SessionOpened() +// ----------------------------------------------------------------------------- +// +void CPEngServer::SessionOpened() + { + iOpenedSessions++; + } + +// ----------------------------------------------------------------------------- +// CPEngServer::SessionClosed() +// ----------------------------------------------------------------------------- +// +void CPEngServer::SessionClosed() + { + iOpenedSessions--; + } + +// ============================================================================= +// =============== New private Functions of the main class ===================== +// ============================================================================= + + +// ============================================================================= +// =============== Functions from the CServer2 class =========================== +// ============================================================================= + +// ----------------------------------------------------------------------------- +// CPEngServer::NewSessionL() +// ----------------------------------------------------------------------------- +// +CSession2* CPEngServer::NewSessionL( + const TVersion &aVersion, + const RMessage2& /*aMessage*/ ) const + { + if ( !User::QueryVersionSupported( aVersion, + TVersion( KClientVersionMajor, + KClientVersionMinor, + KClientVersionBuild ) ) ) + { + User::Leave( KErrNotSupported ); + } + + return CPEngSession::NewL( const_cast( *this ) ); + } + +// ============================================================================= +// =============== New Private methods from class ============================== +// ============================================================================= + +// ----------------------------------------------------------------------------- +// CPEngServer::StartServer() +// Start Server +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CPEngServer::StartServer() + { + iRunning = ETrue; + PENG_DP( D_PENG_LIT( "PresenceServer::Started" ) ); + CPEngActiveScheduler::Start(); + PENG_DP( D_PENG_LIT( "PresenceServer::Stopped" ) ); + } + +// ----------------------------------------------------------------------------- +// CPEngServer::CheckServerAccess() +// Check server access count +// it also check is there is some active session +// if server is no more need, it is stoped +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CPEngServer::CheckServerAccess() + { + if ( ( iSessCount + iSessionsManagers.Count() ) == 0 ) + { + // stop server + StopServer(); + } + } + +// End of File