upnpavcontrolpoint/avcpengine/src/upnpavcpenginesession.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 17 Sep 2010 08:31:21 +0300
changeset 32 3785f754ee62
parent 0 7f85d04be362
permissions -rw-r--r--
Revision: 201035 Kit: 201037

/** @file
* Copyright (c) 2005-2006 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:  CUpnpAVCPEngineSession
*
*/


// INCLUDE FILES
#include "upnpavcpenginesession.h"
#include "upnpavcpmanager.h"
#include "upnpavcontrolpoint.h"
#include "upnpcommand.h"



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

// -----------------------------------------------------------------------------
// CUpnpAVCPEngineSession::CContentControlSession
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
CUpnpAVCPEngineSession::CUpnpAVCPEngineSession( const RThread& /*aClient*/, 
                                                CUpnpAVCPEngine& aAVCPEngine, 
                                                CUpnpAVCPManager& aManager)
    : CSession2(),
    iAVCPEngine( aAVCPEngine ),
    iAVCPManager( aManager )
    {
    }

// -----------------------------------------------------------------------------
// CUpnpAVCPEngineSession::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CUpnpAVCPEngineSession::ConstructL()
    {    
    iAVCPEngine.IncrementSessions(this);
    }

// -----------------------------------------------------------------------------
// CUpnpAVCPEngineSession::~CUpnpAVCPEngineSession
// Destructor.
// -----------------------------------------------------------------------------
//
CUpnpAVCPEngineSession::~CUpnpAVCPEngineSession()
    {
    iAVCPEngine.DecrementSessions(this);
    iCommandList.ResetAndDestroy();
    }

// -----------------------------------------------------------------------------
// CUpnpAVCPEngineSession::ServiceL
// Handle client requests.
// -----------------------------------------------------------------------------
//
void CUpnpAVCPEngineSession::ServiceL( const RMessage2& aMessage )
    {
	TInt index = KErrNotFound;
    switch ( aMessage.Function() )
        {
        // getting result from previous invoked command
        case EDownloadDeviceList:  
        case EDownloadDirList:                    
        case EDownloadMetadata:   
        	DEBUGSTRING(("Command for results with id %d", aMessage.Int0()));
            index = CommandById(aMessage.Int0());
            
            if (index != KErrNotFound) 
            {
                CUpnpCommand* resultCommand =  iCommandList[index];
                CleanupStack::PushL(resultCommand);
                resultCommand->SetResultL(aMessage);
                CleanupStack::PopAndDestroy(resultCommand);
                aMessage.Complete(KErrNone);
            }
            else 
            {
            	DEBUGSTRING(("Results not found %d", aMessage.Int0()));
                aMessage.Complete(KErrNotFound);
            }
            break;
        // all else commands
        default:
            CUpnpCommand* command = CUpnpCommand::NewL(iAVCPManager, *this, aMessage);            
            if (command) 
            {            	
                iCommandList.AppendL(command);
                CleanupStack::PushL(command);
                command->ExecuteL();
                CleanupStack::Pop(command); // it will be destroyed after completion
            }
            else 
            {                            
                PanicClient( aMessage, EAVCPEngineBadRequest );
            }
            break;
        }
        
	}

// -----------------------------------------------------------------------------
// CUpnpAVCPEngineSession::RemoveCommand
// remove command
// -----------------------------------------------------------------------------
//
void CUpnpAVCPEngineSession::RemoveCommand(CUpnpCommand* aCommand) 
	{
    TInt index = iCommandList.Find(aCommand); 
    if (index != KErrNotFound) 
	    {
	    DEBUGSTRING8(("CUpnpAVCPEngineSession::RemoveCommand with index %d", index));
	    iCommandList.Remove(index); 
	    }
	}

// -----------------------------------------------------------------------------
// CUpnpAVCPEngineSession::CommandById
//  Index of command with given id
// -----------------------------------------------------------------------------
//
TInt CUpnpAVCPEngineSession::CommandById(TInt aId) 
	{
    TInt i = KErrNotFound;

    for ( i=0; i < iCommandList.Count() && iCommandList[i]->Id() != aId; i++ )
    {}

    if ( i != iCommandList.Count() )
	    {
        return i;
	    }
    return KErrNotFound;   
	}

// -----------------------------------------------------------------------------
// CUpnpAVCPEngineSession::PanicClient
//  Panic client
// -----------------------------------------------------------------------------
//
void CUpnpAVCPEngineSession::PanicClient( const RMessage2 &aMessage, TInt aPanic ) const
	{
	aMessage.Panic( KAVCPEngine, aPanic ) ; // Note: this panics the client thread, not server
	}

// -----------------------------------------------------------------------------
// CUpnpAVCPEngineSession::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CUpnpAVCPEngineSession* CUpnpAVCPEngineSession::NewL( 
                                             const RThread& aClient, 
                                             CUpnpAVCPEngine& aServer, 
                                             CUpnpAVCPManager& aManager )
    {
    CUpnpAVCPEngineSession* self = new (ELeave) CUpnpAVCPEngineSession( 
        aClient, aServer, aManager);
    CleanupStack::PushL( self );
    self->ConstructL() ;
    CleanupStack::Pop( self ) ;
    return self ;
    }


// End of File