videoscheduler/SchedulerServer/src/CCseSchedulerServerSession.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 09:14:38 +0200
changeset 0 822a42b6c3f1
child 15 6c92a12abac0
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of the License "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:    Implementation of Scheduler server's*
*/




// INCLUDE FILES
#include "CCseSchedulerServerSession.h"         // Header file for this class
#include "CCseSchedulerServer.h"                // Common methods for server
#include "CCseSchedulerServerEngine.h"          // Intelligence aka engine of server
#include "CseSchedulerServer.pan"               // Server panic codes
#include <ipvideo/CseSchedulerClientServerCommon.h>     // Common defines for client and server
#include "CseDebug.h"                           // Debug macros

// EXTERNAL DATA STRUCTURES
// None

// EXTERNAL FUNCTION PROTOTYPES  
// None

// CONSTANTS
// None

// MACROS
// None

// LOCAL CONSTANTS AND MACROS
// None

// MODULE DATA STRUCTURES
// None

// LOCAL FUNCTION PROTOTYPES
// None

// FORWARD DECLARATIONS
// None

// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// CCseSchedulerSession::CCseSchedulerSession()
// C++ constructor
// -----------------------------------------------------------------------------
//

CCseSchedulerServerSession::CCseSchedulerServerSession() : CSession2(),
    iResourceCount( 0 )
    {
    CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerSession::CCseSchedulerServerSession");
    
    CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerSession::CCseSchedulerServerSession");
    }

// -----------------------------------------------------------------------------
// CCseSchedulerSession::NewL()
// Two-phased constructor. 
// -----------------------------------------------------------------------------
//
CCseSchedulerServerSession* CCseSchedulerServerSession::NewL( CCseSchedulerServer* aServer )
    {
    CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerSession::NewL");
    
    CCseSchedulerServerSession* self = new ( ELeave ) CCseSchedulerServerSession();
    CleanupStack::PushL( self );
    self->ConstructL( aServer );
    CleanupStack::Pop( self );
    
    CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerSession::NewL");
    return self;
    }

// -----------------------------------------------------------------------------
// CCseSchedulerSession::ConstructL()
// second-phase C++ constructor
// -----------------------------------------------------------------------------
//
void CCseSchedulerServerSession::ConstructL( CCseSchedulerServer* aServer )
    {
    CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerSession::ConstructL");
    
	if ( aServer )
		{
		aServer->Inc();	
		}

    // Create new object index
    iObjects = CObjectIx::NewL();
    
    CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerSession::ConstructL");
    }
    
// -----------------------------------------------------------------------------
// CCseSchedulerSession::~CCseSchedulerSession()
// Destructor.
// -----------------------------------------------------------------------------
//
CCseSchedulerServerSession::~CCseSchedulerServerSession()
    {
    CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerSession::~CCseSchedulerServerSession");
    
    delete iObjects;
    
    CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerSession::~CCseSchedulerServerSession");
    }

// -----------------------------------------------------------------------------
// CCseSchedulerSession::ServiceL()
// 
// -----------------------------------------------------------------------------
//
void CCseSchedulerServerSession::ServiceL( const RMessage2& aMessage )
    {    
    CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerSession::ServiceL");
    
    switch ( aMessage.Function() )
        {
        case ECseServCreateSubSession:
        case ECseServCloseSubSession:
        case ECseServCloseSession:    
            {
            // "Common messages"
            TRAPD( err, DispatchMessageL( aMessage ) );
            aMessage.Complete( err );
            }
            break;

        default:
            {
            // Ok, but must be subsession relative
            CCseSchedulerServerEngine* engine = 
				(CCseSchedulerServerEngine*)iObjects->At( aMessage.Int3() );
            if ( !engine )
                {    
                aMessage.Complete( KErrBadHandle );
                PanicClient( ECsePanicBadSubSessionHandle );
                }
            else
                {
                // this is the normal route, 
                // all engine commands go this way
                TRAPD( error, engine->GeneralServiceL( aMessage ) );
				if ( error != KErrNone )
					{
					CSELOGSTRING2_HIGH_LEVEL("CCseSchedulerServerSession::ServiceL - engine->GeneralServiceL() LEAVED: %d", error);
					aMessage.Complete( error );
					}
                }
            }
            break;
        }
        
    CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerSession::ServiceL");
    }

// -----------------------------------------------------------------------------
// CCseSchedulerServerSession::DispatchMessageL()
// 
// -----------------------------------------------------------------------------
//
void CCseSchedulerServerSession::DispatchMessageL( const RMessage2& aMessage )
    {
    CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerSession::DispatchMessageL");
    
    // Check for session-relative requests
    switch ( aMessage.Function() )
        {
        case ECseServCreateSubSession:
            NewObjectL( aMessage );
            break;

        case ECseServCloseSubSession:
            DeleteObject( aMessage.Int3() );
            break;
        
        case ECseServCloseSession:
            Server()->Dec();
            break;
        
        default:
            break;
        }
        
    CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerSession::DispatchMessageL");
    }

// -----------------------------------------------------------------------------
// CCseSchedulerServerSession::NewObjectL()
//
// -----------------------------------------------------------------------------
//
void CCseSchedulerServerSession::NewObjectL( const RMessage2& aMessage )
    {
    CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerSession::NewObjectL");
    
    CObject* obj = Server()->GetEngineObjectL();
    TInt handle( iObjects->AddL( obj ) );
    // Write the handle to client
    TPckg<TInt> handlePckg( handle );
    TRAPD( err, aMessage.WriteL( 3, handlePckg ) );
    
    if ( err )
        {
        PanicClient( ECsePanicBadRequest );
        return;
        }
        
    // Notch up another resource
    iResourceCount++;
    
    CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerSession::NewObjectL");
    }

// -----------------------------------------------------------------------------
// CCseSchedulerSession::DeleteObject()
// 
// -----------------------------------------------------------------------------
//
void CCseSchedulerServerSession::DeleteObject( TUint aHandle )
    {
    CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerSession::DeleteObject");
    
    // Panic if bad handle
    CCseSchedulerServerEngine* engine = ( CCseSchedulerServerEngine* )iObjects->At( aHandle );
    if ( !engine )
        {
        PanicClient( ECsePanicBadSubSessionHandle ); 
        }
        
    iResourceCount--;
    // Deletes engine
    iObjects->Remove( aHandle );

	CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerSession::DeleteObject");
    }

// -----------------------------------------------------------------------------
// CCseSchedulerServerSession::CountResources()
//
// -----------------------------------------------------------------------------
//
TInt CCseSchedulerServerSession::CountResources()
    {
    CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerSession::CountResources");
    CSELOGSTRING_HIGH_LEVEL("<<<CCseSchedulerServerSession::CountResources");
    return iResourceCount;
    }

// -----------------------------------------------------------------------------
// CCseSchedulerSession::PanicClient()
// 
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//
void CCseSchedulerServerSession::PanicClient( TCseSchedulerServPanic aPanic ) const
    {
    CSELOGSTRING_HIGH_LEVEL(">>>CCseSchedulerServerSession::PanicClient");
    
    _LIT( KTxtSessionPanic, "SchedulerSession" );
    CSELOGSTRING2_HIGH_LEVEL("CCseSchedulerServerSession::PanicClient - panic code: %d", aPanic);
    User::Panic( KTxtSessionPanic, aPanic );
    }

// -----------------------------------------------------------------------------
// CCseSchedulerSession::PanicClient()
// 
// (other items were commented in a header).
// -----------------------------------------------------------------------------
//    
CCseSchedulerServer* CCseSchedulerServerSession::Server()
    {
    return reinterpret_cast< CCseSchedulerServer* > ( 
                   const_cast< CServer2* > ( CSession2::Server( ) ) );
    }
//  End of File