upnpavcontroller/upnpavcontrollerserver/src/upnpavcontrollerimpl.cpp
author Sampo Huttunen <sampo.huttunen@nokia.com>
Thu, 18 Nov 2010 15:46:57 +0200
branchIOP_Improvements
changeset 44 97caed2372ca
parent 38 5360b7ddc251
permissions -rw-r--r--
Fixed AVController, it was accidentally set to search only for renderers. Now also servers are added to device list. Also some minor changes in package definition xml and platform API xml definition files.

/*
* Copyright (c) 2006-2009 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:      AVController server side root class
*
*/






// INCLUDE FILES
// upnp stack api
#include <upnpaction.h>
#include <upnpdevice.h>
#include <upnpservice.h>
#include <upnpstatevariable.h>

// dlnasrv / mediaserver api
#include <upnpcontainer.h>
#include <upnpobjectlist.h>

// dlnasrv / avcontroller api
#include "upnpavdeviceobserver.h"
#include "upnpavdevicelist.h"

// dlnasrv / avcontroller internal
#include "upnpavcontrollerimpl.h"
#include "upnpavcontrollerserver.h"
#include "upnpavdispatcher.h"
#include "upnpavdeviceextended.h"
#include "upnpdevicerepository.h"
#include "upnpaverrorhandler.h"
#include "upnpplaybacksession.h"
#include "upnpbrowsingsession.h"
#include "upnpdevicediscoverymessage.h"

#include "upnpuploadsession.h"
#include "upnpdownloadsession.h"



#include "upnpsecaccesscontroller.h"

_LIT( KComponentLogfile, "upnpavcontrollerserver.txt");
#include "upnplog.h"

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

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::NewL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
CUPnPAVControllerImpl* CUPnPAVControllerImpl::NewL(
    CUpnpAVControllerServer& aServer )
    {
    CUPnPAVControllerImpl* self = new (ELeave) CUPnPAVControllerImpl( 
        aServer );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop( self );
    return self;
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::CUPnPAVControllerImpl
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
CUPnPAVControllerImpl::CUPnPAVControllerImpl(
    CUpnpAVControllerServer& aServer ) :
    iServer( aServer ),
    iDeviceDiscoveryEnabled( EFalse),
    iDeviceMsgQue( CUpnpDeviceDiscoveryMessage::LinkOffset() ),
    iDeviceMsgQueIter( iDeviceMsgQue )
    {
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::~CUPnPAVControllerImpl
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
CUPnPAVControllerImpl::~CUPnPAVControllerImpl()
    {
    __LOG( "CUPnPAVControllerImpl::~CUPnPAVControllerImpl" );
    
    delete iDeviceRespBuf;
    delete iDeviceListRespBuf;
    
    iPlaybackSessions.ResetAndDestroy();
    iBrowsingSessions.ResetAndDestroy();
    
    iUploadSessions.ResetAndDestroy();
    iDownloadSessions.ResetAndDestroy();
    
    CUpnpDeviceDiscoveryMessage* devMsg = NULL;
    iDeviceMsgQueIter.SetToFirst(); 
    while ( ( devMsg = iDeviceMsgQueIter++ ) != NULL )
        {
        iDeviceMsgQue.Remove( *devMsg );
        delete devMsg;
        };    

    delete iConnectionMsg;
    delete iDeviceDiscoveryMsg;
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::ConstructL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::ConstructL()
    {
    __LOG( "CUPnPAVControllerImpl::ConstructL" );    
       
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::ConnectionLost
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::ConnectionLost()
    {
    if( iConnectionMsg )
        {
        iConnectionMsg->Complete( EAVControllerConnectionLost );
        delete iConnectionMsg; iConnectionMsg = NULL;
        }
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::DeviceDiscoveredL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::DeviceDiscoveredL(
    CUpnpAVDeviceExtended& aDevice )
    {
    __LOG( "CUPnPAVControllerImpl::DeviceDiscoveredL" );

    if( aDevice.DeviceType() == CUpnpAVDevice::EMediaServer &&
        ( aDevice.Local() ) )
        {
        TInt i;
        TInt count = iPlaybackSessions.Count();
        for( i = 0; i < count; i++ )
            {
            iPlaybackSessions[ i ]->SetLocalMSUuidL( aDevice.Uuid() );
            }
        
        count = iBrowsingSessions.Count();
        for( i = 0; i < count; i++ )
            {
            iBrowsingSessions[ i ]->SetLocalMSUuidL( aDevice.Uuid() );
            }

        }
    else if( iDeviceDiscoveryEnabled )
        {
        CUpnpAVDevice* tempDev = CUpnpAVDevice::NewL( aDevice ); 
                             
        if( iDeviceDiscoveryMsg )
            {
            CleanupStack::PushL( tempDev );
            
            delete iDeviceRespBuf; iDeviceRespBuf = NULL;
            iDeviceRespBuf = tempDev->ToDes8L();
            
            CleanupStack::PopAndDestroy( tempDev );
            
            // Write back to the client that a device was discovered
            // of the device and the size
            TPckgBuf<TAVControllerDeviceDiscovery> resp0( EAVDeviceDiscovered );
            TPckgBuf<TInt> resp1( iDeviceRespBuf->Length() );
            
            iDeviceDiscoveryMsg->WriteL( 0, resp0 );
            iDeviceDiscoveryMsg->WriteL( 1, resp1 );
            
            iDeviceDiscoveryMsg->Complete( EAVControllerDeviceCompleted );
            delete iDeviceDiscoveryMsg; iDeviceDiscoveryMsg = NULL;
            }
        else
            {
            // Msg not valid, client is still processing.. 
            //add the discovered device to queue
            CUpnpDeviceDiscoveryMessage* tmpDevMsg = 
                    CUpnpDeviceDiscoveryMessage::NewL( 
                    tempDev, EAVDeviceDiscovered );
            iDeviceMsgQue.AddLast( *tmpDevMsg );
            }
        }
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::DeviceDisappearedL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::DeviceDisappearedL(
    CUpnpAVDeviceExtended& aDevice )
    {
    __LOG( "CUPnPAVControllerImpl::DeviceDisappearedL" );
  
    // Go through browsing and rendering sessions and report if their
    // device or the local MS disappeared
    TBool localMs = EFalse;
    if( aDevice.DeviceType() == CUpnpAVDevice::EMediaServer &&
        ( aDevice.Local() ) )
        {
        __LOG( "CUPnPAVControllerImpl::DeviceDisappearedL\
        - Local MS disappeared!" );
        
         // Local MS disappeared
         localMs = ETrue;
        }
        
    TInt i;
    TInt count = iPlaybackSessions.Count();
    for( i = 0; i < count; i++ )
        {
        if( ( iPlaybackSessions[ i ]->Uuid() == aDevice.Uuid() ) ||
            ( localMs ) )
            {
            iPlaybackSessions[ i ]->DeviceDisappearedL( aDevice );
            }     
        }
    
    count = iBrowsingSessions.Count();
    for( i = 0; i < count; i++ )
        {
        if( ( iBrowsingSessions[ i ]->Uuid() == aDevice.Uuid() ) ||
            ( localMs ) )
            {
            iBrowsingSessions[ i ]->DeviceDisappearedL( aDevice );
            }     
        }
        
    count = iUploadSessions.Count();
    for( i = 0; i < count; i++ )
        {
        if( iUploadSessions[ i ]->Uuid() == aDevice.Uuid() )
            {
            iUploadSessions[ i ]->DeviceDisappearedL( aDevice );
            }     
        }

    count = iDownloadSessions.Count();
    for( i = 0; i < count; i++ )
        {
        if( iDownloadSessions[ i ]->Uuid() == aDevice.Uuid() )
            {
            iDownloadSessions[ i ]->DeviceDisappearedL( aDevice );
            }     
        }

    if( iDeviceDiscoveryEnabled )
        {       
        // Create a device (buffer)
        CUpnpAVDevice* tempDev = CUpnpAVDevice::NewL( aDevice );
            
         if( iDeviceDiscoveryMsg )
            {
            CleanupStack::PushL( tempDev );
                   
            delete iDeviceRespBuf; iDeviceRespBuf = NULL;
            iDeviceRespBuf = tempDev->ToDes8L();
            CleanupStack::PopAndDestroy( tempDev );
            
            // Write back to the client that a device was discovered
            // and the size of the device
            TPckgBuf<TAVControllerDeviceDiscovery> resp0(
                EAVDeviceDisappeared );
            TPckgBuf<TInt> resp1( iDeviceRespBuf->Length() );
            
            iDeviceDiscoveryMsg->WriteL( 0, resp0 );
            iDeviceDiscoveryMsg->WriteL( 1, resp1 );
            
            iDeviceDiscoveryMsg->Complete( EAVControllerDeviceCompleted );
            delete iDeviceDiscoveryMsg; iDeviceDiscoveryMsg = NULL;
            }
        else
            {
            // Msg not valid, client is still processing.. 
            //add the disappeared device to queue

            CUpnpDeviceDiscoveryMessage* tmpDevMsg = 
                    CUpnpDeviceDiscoveryMessage::NewL( 
                    tempDev, EAVDeviceDisappeared );
            iDeviceMsgQue.AddLast( *tmpDevMsg );
            }
        }
    }    

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::DeviceIconDownloadedL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::DeviceIconDownloadedL( CUpnpAVDeviceExtended& aDevice )
    {
    if( iDeviceDiscoveryEnabled )
        {
        CUpnpAVDevice* tempDev = CUpnpAVDevice::NewL( aDevice );
        if( iDeviceDiscoveryMsg )
            {
            CleanupStack::PushL( tempDev );
            delete iDeviceRespBuf;
            iDeviceRespBuf = NULL;
            iDeviceRespBuf = tempDev->ToDes8L();
            CleanupStack::PopAndDestroy( tempDev );
            TPckgBuf<TAVControllerDeviceDiscovery> resp0( EAVDeviceIconDownloaded );
            TPckgBuf<TInt> resp1( iDeviceRespBuf->Length() );
            iDeviceDiscoveryMsg->WriteL( 0, resp0 );
            iDeviceDiscoveryMsg->WriteL( 1, resp1 );
            iDeviceDiscoveryMsg->Complete( EAVControllerDeviceCompleted );
            delete iDeviceDiscoveryMsg;
            iDeviceDiscoveryMsg = NULL;
            }
        else
            {
            CUpnpDeviceDiscoveryMessage* tmpDevMsg = CUpnpDeviceDiscoveryMessage::NewL(
                tempDev, EAVDeviceIconDownloaded );
            iDeviceMsgQue.AddLast( *tmpDevMsg );
            }
        }
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::EnableDeviceDiscoveryL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::EnableDeviceDiscoveryL(
    const RMessage2& aMessage )
    {
    __LOG( "CUPnPAVControllerImpl::EnableDeviceDiscoveryL" );
    
    __ASSERT( !iDeviceDiscoveryMsg, __FILE__, __LINE__ );
    
    if( !iDeviceDiscoveryEnabled )
        {
        //iDispatcher.RegisterForDeviceDiscoveryL( *this );
        iDeviceDiscoveryEnabled = ETrue;    
        }
       
    iDeviceDiscoveryMsg = new (ELeave) RMessage2( aMessage );

    // Check queu's
    if( !iDeviceMsgQue.IsEmpty() )
        {
        CUpnpDeviceDiscoveryMessage* devMsg = iDeviceMsgQue.First();
        __ASSERTD( devMsg, __FILE__, __LINE__ );
        CUpnpAVDevice* dev = devMsg->Device();
        TAVControllerDeviceDiscovery devMsgType = devMsg->MsgType();
        DequeDeviceL( *dev, devMsgType );
        iDeviceMsgQue.Remove( *devMsg );
        delete devMsg;
        }
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::DequeDeviceL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::DequeDeviceL( const CUpnpAVDevice& aDevice,
    TAVControllerDeviceDiscovery aType )
    {
    __LOG( "CUPnPAVControllerImpl::DequeDeviceL" );
    
    TPckg<TAVControllerDeviceDiscovery> resp0( aType );
    iDeviceDiscoveryMsg->WriteL( 0, resp0 );
    
    HBufC8* tmp = aDevice.ToDes8L();
    CleanupStack::PushL( tmp );

    TPckgBuf<TInt> resp1( tmp->Length() );            
    iDeviceDiscoveryMsg->WriteL( 1, resp1 );
    
    CleanupStack::Pop( tmp );
     
    delete iDeviceRespBuf; iDeviceRespBuf = NULL;
    iDeviceRespBuf = tmp;
            
    iDeviceDiscoveryMsg->Complete( EAVControllerDeviceCompleted );
    delete iDeviceDiscoveryMsg; iDeviceDiscoveryMsg = NULL;
    }
    
// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::GetDeviceL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::GetDeviceL( const RMessage2& aMessage )
    {
    __LOG1( "CUPnPAVControllerImpl::GetDeviceL, 0x%d", iDeviceRespBuf );
    
    aMessage.WriteL( 0, *iDeviceRespBuf );
    aMessage.Complete( KErrNone );
    delete iDeviceRespBuf; iDeviceRespBuf = NULL;
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::DisableDeviceDiscoveryL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::DisableDeviceDiscoveryL(
    /*const RMessage2& aMessage*/ )
    {
    __LOG( "CUPnPAVControllerImpl::DisableDeviceDiscoveryL" );
    
    if( iDeviceDiscoveryEnabled )
        {
        //iDispatcher.UnRegisterDeviceDiscovery( *this );
        iDeviceDiscoveryEnabled = EFalse;    
        }
    
    if( iDeviceDiscoveryMsg )
        { 
        iDeviceDiscoveryMsg->Complete( KErrCancel );
        delete iDeviceDiscoveryMsg; iDeviceDiscoveryMsg = NULL;        
        }
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::GetDeviceListSizeL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::GetDeviceListSizeL( const RMessage2& aMessage )
    {
    __LOG( "CUPnPAVControllerImpl::GetDeviceListSizeL" );
    
    // Get the device list from the av control point, create a response buffer
    // and write the size of the list back to the client
    TAVControllerDeviceListType deviceListType;
    TPckg<TAVControllerDeviceListType> resp0( deviceListType );
    aMessage.ReadL( 0, resp0 );
    
    delete iDeviceListRespBuf; iDeviceListRespBuf = NULL;
    
    const RPointerArray<CUpnpAVDeviceExtended>& devList =
        iServer.DeviceRepository().DeviceList();
    
    if( deviceListType == EAVMediaServer )
        {
        CUpnpAVDeviceList* tempList = CUpnpAVDeviceList::NewLC();
                
        TInt count = devList.Count();
        for( TInt i = 0; i < count; i++ )
            {
            if( devList[ i ]->DeviceType() == CUpnpAVDevice::EMediaServer )
                {
                if( devList[ i ]->PInfoReceived() &&
                    !devList[ i ]->Local() )
                    {
                    CUpnpAVDevice* tempDev = CUpnpAVDevice::NewL(
                        *devList[i] );
                    CleanupStack::PushL( tempDev );
                    // Ownership of tempDev transferred
                    tempList->AppendDeviceL( *tempDev );
                    CleanupStack::Pop( tempDev );
                    }
                }
            }
        __LOG1( "CUPnPAVControllerImpl::GetDeviceListSizeL servers: %d", tempList->Count() );
        iDeviceListRespBuf = tempList->ToDes8L();
        CleanupStack::PopAndDestroy( tempList );
        }
    else
        {
        CUpnpAVDeviceList* tempList = CUpnpAVDeviceList::NewLC();
                
        TInt count = devList.Count();
        for( TInt i = 0; i < count; i++ )
            {
            if( devList[ i ]->DeviceType() == CUpnpAVDevice::EMediaRenderer )
                {
                if( devList[ i ]->PInfoReceived() )
                    {
                    CUpnpAVDevice* tempDev = CUpnpAVDevice::NewL(
                        *devList[i] );
                    CleanupStack::PushL( tempDev );
                    // Ownership of tempDev transferred
                    tempList->AppendDeviceL( *tempDev );
                    CleanupStack::Pop( tempDev );
                    }
                }
            }
        __LOG1( "CUPnPAVControllerImpl::GetDeviceListSizeL renderers: %d", tempList->Count() );
        iDeviceListRespBuf = tempList->ToDes8L();
        CleanupStack::PopAndDestroy( tempList ); 
        }    
    
    // Write the size back to the client
    TPckgBuf<TInt> resp1( iDeviceListRespBuf->Length() );
    aMessage.WriteL( 1, resp1 );
    aMessage.Complete( KErrNone );

    __LOG( "CUPnPAVControllerImpl::GetDeviceListSizeL end" );
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::GetDeviceListL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::GetDeviceListL( const RMessage2& aMessage )
    {
    __LOG1( "CUPnPAVControllerImpl::GetDeviceListL, 0x%d",
        iDeviceListRespBuf );
    
    // Write the device list back to the client
    aMessage.WriteL( 0, *iDeviceListRespBuf );
    aMessage.Complete( KErrNone );
    delete iDeviceListRespBuf; iDeviceListRespBuf = NULL;    

    __LOG( "CUPnPAVControllerImpl::GetDeviceListL end" );
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::GetDeviceIconRequestL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::GetDeviceIconRequestL( const RMessage2& aMessage )
    {
    __LOG( "CUPnPAVControllerImpl::GetDeviceIconRequestL" );

    TInt uuidLen = aMessage.GetDesLengthL( 0 );
    if ( uuidLen < 0 || uuidLen > KMaxTInt/2 ) // to avoid alloc panic
        {
        User::Leave( KErrArgument );
        }
    HBufC8* uuid = HBufC8::NewLC( uuidLen );
    TPtr8 uuidPtr = uuid->Des();
    aMessage.ReadL( 0, uuidPtr );
    // Message is completed by the transfer
    iServer.TransferDeviceIconFileToClientL( aMessage, 1, uuidPtr );
    CleanupStack::PopAndDestroy( uuid );

    __LOG( "CUPnPAVControllerImpl::GetDeviceIconRequestL end" );
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::CreateRenderingSessionL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::CreateRenderingSessionL(
    const RMessage2& aMessage )
    {
    __LOG1( "CUPnPAVControllerImpl::CreateRenderingSessionL, 0x%d",
        aMessage.Int0() );
    
    // Create a rendering session
    TInt id = aMessage.Int0();
    
    // Read the device UID
    TInt len = aMessage.GetDesMaxLength( 1 );
    HBufC8* buf = HBufC8::NewLC( len );
    TPtr8 ptr( buf->Des() );
    User::LeaveIfError( aMessage.Read( 1, ptr ) );

    CUPnPPlaybackSession* tempPtr = CUPnPPlaybackSession::NewL(
        iServer, id, *buf );

    CleanupStack::PopAndDestroy( buf );
    iPlaybackSessions.Append( tempPtr );
    
    aMessage.Complete( KErrNone );
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::DestroyRenderingSessionL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::DestroyRenderingSessionL(
    const RMessage2& aMessage )
    {
    __LOG1( "CUPnPAVControllerImpl::DestroyRenderingSessionL, 0x%d",
        aMessage.Int0() );
    
    // Find and delete a rendering session
    TInt id = aMessage.Int0();
    TInt count = iPlaybackSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iPlaybackSessions[ i ]->SessionId() == id )
            {
            delete iPlaybackSessions[ i ];
            iPlaybackSessions.Remove( i );
            found = ETrue;
            i = count;
            }
        }
    if( found )
        {
        aMessage.Complete( KErrNone );
        }
    else
        {
        aMessage.Complete( KErrNotFound );
        }    
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::EventRequestL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::EventRequestL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    // Find the session
    TInt count = iPlaybackSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iPlaybackSessions[ i ]->SessionId() == id )
            {
            iPlaybackSessions[ i ]->EventRequestL( aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }    
    }
    
// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::CancelEventRequestL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::CancelEventRequestL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    // Find the session
    TInt count = iPlaybackSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iPlaybackSessions[ i ]->SessionId() == id )
            {
            iPlaybackSessions[ i ]->CancelEventRequestL();
            found = ETrue;
            i = count;
            }
        }
    if( found )
        {
        aMessage.Complete( KErrNone );
        }
    else
        {
        aMessage.Complete( KErrNotFound );
        }        
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::SetURIL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::SetURIL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iPlaybackSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iPlaybackSessions[ i ]->SessionId() == id )
            {
            iPlaybackSessions[ i ]->SetURIL( aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }        
    }
    
// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::CancelSetURIL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::CancelSetURIL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iPlaybackSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iPlaybackSessions[ i ]->SessionId() == id )
            {
            iPlaybackSessions[ i ]->CancelSetURIL();
            found = ETrue;
            i = count;
            aMessage.Complete( KErrNone );
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }            
    }
    
// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::SetNextURIL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::SetNextURIL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iPlaybackSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iPlaybackSessions[ i ]->SessionId() == id )
            {
            iPlaybackSessions[ i ]->SetNextURIL( aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }            
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::CancelSetNextURIL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::CancelSetNextURIL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iPlaybackSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iPlaybackSessions[ i ]->SessionId() == id )
            {
            iPlaybackSessions[ i ]->CancelSetNextURIL();
            found = ETrue;
            i = count;
            aMessage.Complete( KErrNone );
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }            
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::PlayL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::PlayL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iPlaybackSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iPlaybackSessions[ i ]->SessionId() == id )
            {
            iPlaybackSessions[ i ]->PlayL( aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }    
    }
   
// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::CancelPlayL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::CancelPlayL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iPlaybackSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iPlaybackSessions[ i ]->SessionId() == id )
            {
            iPlaybackSessions[ i ]->CancelPlayL();
            found = ETrue;
            i = count;
            aMessage.Complete( KErrNone );
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }                
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::StopL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::StopL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iPlaybackSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iPlaybackSessions[ i ]->SessionId() == id )
            {
            iPlaybackSessions[ i ]->StopL( aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }    
    }
   
// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::CancelStopL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::CancelStopL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iPlaybackSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iPlaybackSessions[ i ]->SessionId() == id )
            {
            iPlaybackSessions[ i ]->CancelStopL();
            found = ETrue;
            i = count;
            aMessage.Complete( KErrNone );
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }                
    }
   
// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::PauseL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::PauseL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iPlaybackSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iPlaybackSessions[ i ]->SessionId() == id )
            {
            iPlaybackSessions[ i ]->PauseL( aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }    
    }
    
// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::CancelPauseL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::CancelPauseL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iPlaybackSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iPlaybackSessions[ i ]->SessionId() == id )
            {
            iPlaybackSessions[ i ]->CancelPauseL();
            found = ETrue;
            i = count;
            aMessage.Complete( KErrNone );
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }                
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::SetVolumeL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::SetVolumeL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iPlaybackSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iPlaybackSessions[ i ]->SessionId() == id )
            {
            iPlaybackSessions[ i ]->SetVolumeL( aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }    
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::CancelSetVolumeL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::CancelSetVolumeL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iPlaybackSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iPlaybackSessions[ i ]->SessionId() == id )
            {
            iPlaybackSessions[ i ]->CancelSetVolumeL();
            found = ETrue;
            i = count;
            aMessage.Complete( KErrNone );
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }                
    }  
    
// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::GetVolumeL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::GetVolumeL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iPlaybackSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iPlaybackSessions[ i ]->SessionId() == id )
            {
            iPlaybackSessions[ i ]->GetVolumeL( aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }        
    }
    
// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::CancelGetVolumeL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::CancelGetVolumeL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iPlaybackSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iPlaybackSessions[ i ]->SessionId() == id )
            {
            iPlaybackSessions[ i ]->CancelGetVolumeL();
            found = ETrue;
            i = count;
            aMessage.Complete( KErrNone );
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }    
    }
    
// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::SetMuteL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::SetMuteL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iPlaybackSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iPlaybackSessions[ i ]->SessionId() == id )
            {
            iPlaybackSessions[ i ]->SetMuteL( aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }        
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::CancelSetMuteL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::CancelSetMuteL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iPlaybackSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iPlaybackSessions[ i ]->SessionId() == id )
            {
            iPlaybackSessions[ i ]->CancelSetMuteL();
            found = ETrue;
            i = count;
            aMessage.Complete( KErrNone );
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }                
    }  
    
// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::GetMuteL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::GetMuteL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iPlaybackSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iPlaybackSessions[ i ]->SessionId() == id )
            {
            iPlaybackSessions[ i ]->GetMuteL( aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }        
    }
    
// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::CancelGetMuteL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::CancelGetMuteL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iPlaybackSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iPlaybackSessions[ i ]->SessionId() == id )
            {
            iPlaybackSessions[ i ]->CancelGetMuteL();
            found = ETrue;
            i = count;
            aMessage.Complete( KErrNone );
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }    
    }
    
// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::GetPositionInfoL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::GetPositionInfoL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iPlaybackSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iPlaybackSessions[ i ]->SessionId() == id )
            {
            iPlaybackSessions[ i ]->GetPositionInfoL( aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }        
    }
    
// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::CancelGetPositionInfoL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::CancelGetPositionInfoL(
    const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iPlaybackSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iPlaybackSessions[ i ]->SessionId() == id )
            {
            iPlaybackSessions[ i ]->CancelGetPositionInfoL();
            found = ETrue;
            i = count;
            aMessage.Complete( KErrNone );
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }                    
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::SeekRelTimeL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::SeekRelTimeL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iPlaybackSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iPlaybackSessions[ i ]->SessionId() == id )
            {
            iPlaybackSessions[ i ]->SeekRelTimeL( aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }        
    }
    
// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::CancelSeekRelTimeL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::CancelSeekRelTimeL(
    const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iPlaybackSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iPlaybackSessions[ i ]->SessionId() == id )
            {
            iPlaybackSessions[ i ]->CancelSeekRelTimeL();
            found = ETrue;
            i = count;
            aMessage.Complete( KErrNone );
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }                    
    }


// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::GetRendererStateL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::GetRendererStateL( const RMessage2& aMessage)
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iPlaybackSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iPlaybackSessions[ i ]->SessionId() == id )
            {
            iPlaybackSessions[ i ]->GetRendererStateL( aMessage );
            found = ETrue;
            i = count;
            //aMessage.Complete( KErrNone );
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }    
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::CreateBrowsingSessionL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::CreateBrowsingSessionL(
    const RMessage2& aMessage )
    {
    __LOG1( "CUPnPAVControllerImpl::CreateBrowsingSessionL, 0x%d",
        aMessage.Int0() );
    
    // Create a rendering session
    TInt id = aMessage.Int0();
    
    // Read the device UID
    TInt len = aMessage.GetDesMaxLength( 1 );
    HBufC8* buf = HBufC8::NewLC( len );
    TPtr8 ptr( buf->Des() );
    User::LeaveIfError( aMessage.Read( 1, ptr ) );
    
    CUPnPBrowsingSession* tempPtr = CUPnPBrowsingSession::NewL(
        iServer, id, *buf );

    CleanupStack::PopAndDestroy( buf );
    iBrowsingSessions.Append( tempPtr );
    
    aMessage.Complete( KErrNone );    
    }
    
// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::DestroyBrowsingSessionL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::DestroyBrowsingSessionL(
    const RMessage2& aMessage )
    {
    __LOG1( "CUPnPAVControllerImpl::DestroyBrowsingSessionL, 0x%d",
        aMessage.Int0() );
    
    // Find and delete a rendering session
    TInt id = aMessage.Int0();
    TInt count = iBrowsingSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iBrowsingSessions[ i ]->SessionId() == id )
            {
            delete iBrowsingSessions[ i ];
            iBrowsingSessions.Remove( i );
            found = ETrue;
            i = count;
            }
        }
    if( found )
        {
        aMessage.Complete( KErrNone );
        }
    else
        {
        aMessage.Complete( KErrNotFound );
        }        
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::GetBrowseResponseSizeL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::GetBrowseResponseSizeL(
    const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iBrowsingSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iBrowsingSessions[ i ]->SessionId() == id )
            {
            iBrowsingSessions[ i ]->GetBrowseResponseSizeL( aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }    
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::CancelGetBrowseResponseSizeL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::CancelGetBrowseResponseSizeL(
    const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iBrowsingSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iBrowsingSessions[ i ]->SessionId() == id )
            {
            iBrowsingSessions[ i ]->CancelGetBrowseResponseSizeL();
            found = ETrue;
            i = count;
            aMessage.Complete( KErrNone );
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }    
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::GetBrowseResponseL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::GetBrowseResponseL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iBrowsingSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iBrowsingSessions[ i ]->SessionId() == id )
            {
            iBrowsingSessions[ i ]->GetBrowseResponseL( aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }    
    }
    
// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::GetSearchResponseSizeL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::GetSearchResponseSizeL(
    const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iBrowsingSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iBrowsingSessions[ i ]->SessionId() == id )
            {
            iBrowsingSessions[ i ]->GetSearchResponseSizeL( aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::CancelGetSearchResponseSizeL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::CancelGetSearchResponseSizeL(
    const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iBrowsingSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iBrowsingSessions[ i ]->SessionId() == id )
            {
            iBrowsingSessions[ i ]->CancelGetSearchResponseSizeL();
            found = ETrue;
            i = count;
            aMessage.Complete( KErrNone );
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }    
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::GetSearchResponseL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::GetSearchResponseL(
    const RMessage2& aMessage )
    {
     TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iBrowsingSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iBrowsingSessions[ i ]->SessionId() == id )
            {
            iBrowsingSessions[ i ]->GetSearchResponseL( aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }   
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::GetSearchCapabitiesSizeL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::GetSearchCapabitiesSizeL(
    const RMessage2& aMessage )
    {
     TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iBrowsingSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iBrowsingSessions[ i ]->SessionId() == id )
            {
            iBrowsingSessions[ i ]->GetSearchCapabitiesSizeL( aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }       
    }
    
// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::CancelGetSearchCapabitiesSizeL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::CancelGetSearchCapabitiesSizeL(
    const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iBrowsingSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iBrowsingSessions[ i ]->SessionId() == id )
            {
            iBrowsingSessions[ i ]->CancelGetSearchCapabitiesSizeL();
            found = ETrue;
            i = count;
            aMessage.Complete( KErrNone );
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }    
    }
    
// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::GetSearchCapabitiesL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::GetSearchCapabitiesL( const RMessage2& aMessage )
    {
     TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iBrowsingSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iBrowsingSessions[ i ]->SessionId() == id )
            {
            iBrowsingSessions[ i ]->GetSearchCapabitiesL( aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }           
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::CreateContainerL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::CreateContainerL( const RMessage2& aMessage )
    {
     TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iBrowsingSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iBrowsingSessions[ i ]->SessionId() == id )
            {
            iBrowsingSessions[ i ]->CreateContainerL( aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }               
    }
    
// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::CancelCreateContainerL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::CancelCreateContainerL(
    const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iBrowsingSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iBrowsingSessions[ i ]->SessionId() == id )
            {
            iBrowsingSessions[ i ]->CancelCreateContainerL();
            found = ETrue;
            i = count;
            aMessage.Complete( KErrNone );
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }            
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::DeleteObjectL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::DeleteObjectL( const RMessage2& aMessage )
    {
     TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iBrowsingSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iBrowsingSessions[ i ]->SessionId() == id )
            {
            iBrowsingSessions[ i ]->DeleteObjectL( aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }                   
    }
    
// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::CancelDeleteObjectL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::CancelDeleteObjectL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iBrowsingSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iBrowsingSessions[ i ]->SessionId() == id )
            {
            iBrowsingSessions[ i ]->CancelDeleteObjectL();
            found = ETrue;
            i = count;
            aMessage.Complete( KErrNone );
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }                
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::DeviceDisappearedRequestL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::DeviceDisappearedRequestL(
    const RMessage2& aMessage )
    {
     TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iBrowsingSessions.Count();
    TBool found = EFalse;
    TInt i;
    for( i = 0; i < count; i++ )
        {
        if( iBrowsingSessions[ i ]->SessionId() == id )
            {
            iBrowsingSessions[ i ]->DeviceDisappearedRequestL( aMessage );
            found = ETrue;
            i = count;
            }
        }
        
    if( !found )
        {
        count = iPlaybackSessions.Count();
        for( i = 0; i < count; i++ )
            {
            if( iPlaybackSessions[ i ]->SessionId() == id )
                {
                iPlaybackSessions[ i ]->DeviceDisappearedRequestL(
                    aMessage );
                found = ETrue;
                i = count;
                }
            }
        }                       

    if( !found )
        {  
        aMessage.Complete( KErrNotFound );
        }                       
    }
    
// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::CancelDeviceDisappearedRequestL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::CancelDeviceDisappearedRequestL(
    const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iBrowsingSessions.Count();
    TBool found = EFalse;
    TInt i;
    for( i = 0; i < count; i++ )
        {
        if( iBrowsingSessions[ i ]->SessionId() == id )
            {
            iBrowsingSessions[ i ]->CancelDeviceDisappearedRequestL();
            found = ETrue;
            i = count;
            aMessage.Complete( KErrNone );
            }
        }
    if( !found )
        {
        count = iPlaybackSessions.Count();
        for( i = 0; i < count; i++ )
            {
            if( iPlaybackSessions[ i ]->SessionId() == id )
                {
                iPlaybackSessions[ i ]->CancelDeviceDisappearedRequestL();
                found = ETrue;
                i = count;
                aMessage.Complete( KErrNone );
                }
            }        
        }                    

    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }                    
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::MonitorConnectionL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::MonitorConnectionL( const RMessage2& aMessage )
    {
    
    if( iConnectionMsg )
        {
        User::Leave( KErrInUse );
        }
    else
        {
        iConnectionMsg = new (ELeave) RMessage2( aMessage );
        }  
    }
    
// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::CancelMonitorConnectionL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::CancelMonitorConnectionL(
    const RMessage2& aMessage )
    {
    
    if( iConnectionMsg )
        {
        iConnectionMsg->Complete( KErrCancel );
        delete iConnectionMsg; iConnectionMsg = NULL;
        }
    aMessage.Complete( KErrNone );       
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::CreateDownloadSessionL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::CreateDownloadSessionL(
    const RMessage2& aMessage )
    {
    __LOG1( "CUPnPAVControllerImpl::CreateDownloadSessionL, 0x%d",
        aMessage.Int0() );
    
    // Create a downloading session
    TInt id = aMessage.Int0();
    
    // Read the device UID
    TInt len = aMessage.GetDesMaxLength( 1 );
    HBufC8* buf = HBufC8::NewLC( len );
    TPtr8 ptr( buf->Des() );
    User::LeaveIfError( aMessage.Read( 1, ptr ) );

    CUPnPDownloadSession* tempPtr = CUPnPDownloadSession::NewL(
        iServer, id, *buf );
    CleanupStack::PopAndDestroy( buf );
    iDownloadSessions.Append( tempPtr );
    
    aMessage.Complete( KErrNone );    
    }
    
// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::DestroyDownloadSessionL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::DestroyDownloadSessionL(
    const RMessage2& aMessage )
    {
    __LOG1( "CUPnPAVControllerImpl::DestroyDownloadSessionL, 0x%d",
        aMessage.Int0() );
    
    // Find and delete a downloading session
    TInt id = aMessage.Int0();
    TInt count = iDownloadSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iDownloadSessions[ i ]->SessionId() == id )
            {
            delete iDownloadSessions[ i ];
            iDownloadSessions.Remove( i );
            found = ETrue;
            i = count;
            }
        }
    if( found )
        {
        aMessage.Complete( KErrNone );
        }
    else
        {
        aMessage.Complete( KErrNotFound );
        }        
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::StartDownloadL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::StartDownloadL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iDownloadSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iDownloadSessions[ i ]->SessionId() == id )
            {
            iDownloadSessions[ i ]->StartDownloadL( aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }                       
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::StartDownloadFHL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::StartDownloadFHL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iDownloadSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iDownloadSessions[ i ]->SessionId() == id )
            {
            iDownloadSessions[ i ]->StartDownloadFHL( aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }                       
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::CancelDownloadL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::CancelDownloadL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iDownloadSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iDownloadSessions[ i ]->SessionId() == id )
            {
            iDownloadSessions[ i ]->CancelDownloadL( aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }                           
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::CancelAllDownloadsL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::CancelAllDownloadsL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iDownloadSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iDownloadSessions[ i ]->SessionId() == id )
            {
            iDownloadSessions[ i ]->CancelAllDownloadsL( aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }                           
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::StartTrackingDownloadProgressL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------    
void CUPnPAVControllerImpl::StartTrackingDownloadProgressL(
    const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iDownloadSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iDownloadSessions[ i ]->SessionId() == id )
            {
            iDownloadSessions[ i ]->StartTrackingDownloadProgressL(
                aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }                           
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::StopTrackingDownloadProgressL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::StopTrackingDownloadProgressL(
    const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iDownloadSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iDownloadSessions[ i ]->SessionId() == id )
            {
            iDownloadSessions[ i ]->StopTrackingDownloadProgressL(
                aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }                           
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::GetDownloadEventL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::GetDownloadEventL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iDownloadSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iDownloadSessions[ i ]->SessionId() == id )
            {
            iDownloadSessions[ i ]->GetDownloadEventL(
                aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }                               
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::CancelGetDownloadEventL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------    
void CUPnPAVControllerImpl::CancelGetDownloadEventL(
    const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iDownloadSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iDownloadSessions[ i ]->SessionId() == id )
            {
            iDownloadSessions[ i ]->CancelGetDownloadEventL(
                aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }    
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::DestroyUploadSessionL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::CreateUploadSessionL(
    const RMessage2& aMessage )
    {
    __LOG1( "CUPnPAVControllerImpl::CreateUploadSessionL, 0x%d",
        aMessage.Int0() );
    
    // Create a downloading session
    TInt id = aMessage.Int0();
    
    // Read the device UID
    TInt len = aMessage.GetDesMaxLength( 1 );
    HBufC8* buf = HBufC8::NewLC( len );
    TPtr8 ptr( buf->Des() );
    User::LeaveIfError( aMessage.Read( 1, ptr ) );

    CUPnPUploadSession* tempPtr = CUPnPUploadSession::NewL(
        iServer, id, *buf );
    CleanupStack::PopAndDestroy( buf );
    iUploadSessions.Append( tempPtr );
    
    aMessage.Complete( KErrNone );        
    }

// --------------------------------------------------------------------------
// CUPnPAVControllerImpl::DestroyUploadSessionL
// See upnpavcontrollerimpl.h
// --------------------------------------------------------------------------
void CUPnPAVControllerImpl::DestroyUploadSessionL(
    const RMessage2& aMessage )
    {
    __LOG1( "CUPnPAVControllerImpl::DestroyUploadSessionL, 0x%d",
        aMessage.Int0() );
    
    // Find and delete an uploading session
    TInt id = aMessage.Int0();
    TInt count = iUploadSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iUploadSessions[ i ]->SessionId() == id )
            {
            delete iUploadSessions[ i ];
            iUploadSessions.Remove( i );
            found = ETrue;
            i = count;
            }
        }
    if( found )
        {
        aMessage.Complete( KErrNone );
        }
    else
        {
        aMessage.Complete( KErrNotFound );
        }        
    }

void CUPnPAVControllerImpl::StartUploadL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iUploadSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iUploadSessions[ i ]->SessionId() == id )
            {
            iUploadSessions[ i ]->StartUploadL(
                aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }        
    }
    
void CUPnPAVControllerImpl::CancelUploadL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iUploadSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iUploadSessions[ i ]->SessionId() == id )
            {
            iUploadSessions[ i ]->CancelUploadL(
                aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }            
    }

void CUPnPAVControllerImpl::CancelAllUploadsL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iUploadSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iUploadSessions[ i ]->SessionId() == id )
            {
            iUploadSessions[ i ]->CancelAllUploadsL(
                aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }                
    }
    
void CUPnPAVControllerImpl::StartTrackingUploadProgressL( const RMessage2&
    aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iUploadSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iUploadSessions[ i ]->SessionId() == id )
            {
            iUploadSessions[ i ]->StartTrackingUploadProgressL(
                aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }                    
    }

void CUPnPAVControllerImpl::StopTrackingUploadProgressL( const RMessage2&
    aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iUploadSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iUploadSessions[ i ]->SessionId() == id )
            {
            iUploadSessions[ i ]->StopTrackingUploadProgressL(
                aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }                        
    }

void CUPnPAVControllerImpl::GetUploadEventL( const RMessage2& aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iUploadSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iUploadSessions[ i ]->SessionId() == id )
            {
            iUploadSessions[ i ]->GetUploadEventL(
                aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }                            
    }
    
void CUPnPAVControllerImpl::CancelGetUploadEventL( const RMessage2&
    aMessage )
    {
    TInt id = aMessage.Int0();
    
    // Find the session
    TInt count = iUploadSessions.Count();
    TBool found = EFalse;
    for( TInt i = 0; i < count; i++ )
        {
        if( iUploadSessions[ i ]->SessionId() == id )
            {
            iUploadSessions[ i ]->CancelGetUploadEventL(
                aMessage );
            found = ETrue;
            i = count;
            }
        }
    if( !found )
        {
        aMessage.Complete( KErrNotFound );
        }                                
    }

// end of file