PECengine/PresenceServer2/ServerSrc/CPEngServer.cpp
changeset 0 094583676ce7
--- /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    <e32svr.h>
+#include    <ecom/ecom.h>
+
+#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<CPEngServer&>( *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