upnpavcontroller/upnpavcontrollerserver/src/upnpavcontrollerimpl.cpp
changeset 0 7f85d04be362
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/upnpavcontroller/upnpavcontrollerserver/src/upnpavcontrollerimpl.cpp	Thu Dec 17 08:52:00 2009 +0200
@@ -0,0 +1,2144 @@
+/*
+* 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 "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 <upnpdevice.h>
+#include <upnpcontainer.h>
+#include <upnpservice.h>
+#include <upnpstatevariable.h>
+#include <upnpaction.h>
+#include <upnpobjectlist.h>
+#include <upnpavcontrolpoint.h>
+
+// upnpframework / avcontroller api
+#include "upnpavdeviceobserver.h"
+#include "upnpavdevicelist.h"
+
+// 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(
+    RUpnpMediaServerClient& aClient,
+    CUpnpAVControllerServer& aServer )
+    {
+    CUPnPAVControllerImpl* self = new (ELeave) CUPnPAVControllerImpl( 
+        aClient, aServer );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// --------------------------------------------------------------------------
+// CUPnPAVControllerImpl::CUPnPAVControllerImpl
+// See upnpavcontrollerimpl.h
+// --------------------------------------------------------------------------
+CUPnPAVControllerImpl::CUPnPAVControllerImpl(
+    RUpnpMediaServerClient& aClient,
+    CUpnpAVControllerServer& aServer ) :
+    iMediaServer( aClient ),
+    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; iConnectionMsg = NULL;
+    delete iDeviceDiscoveryMsg; iDeviceDiscoveryMsg = NULL;        
+    }
+
+// --------------------------------------------------------------------------
+// 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;
+        
+        }
+    else
+        {
+        // No msg, no can do
+        }    
+    
+    }
+
+// --------------------------------------------------------------------------
+// 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
+            TPckg<TAVControllerDeviceDiscovery> resp0( EAVDeviceDiscovered );
+            TPckg<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
+            TPckg<TAVControllerDeviceDiscovery> resp0(
+                EAVDeviceDisappeared );
+            TPckg<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::EnableDeviceDiscoveryL
+// See upnpavcontrollerimpl.h
+// --------------------------------------------------------------------------
+void CUPnPAVControllerImpl::EnableDeviceDiscoveryL(
+    const RMessage2& aMessage )
+    {
+    __LOG( "CUPnPAVControllerImpl::EnableDeviceDiscoveryL" );
+    
+    __ASSERTD( !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;
+        }
+    else
+        {
+        // Empty else
+        }             
+    }
+
+// --------------------------------------------------------------------------
+// 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 );
+
+    TPckg<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] );
+                    // Ownership of tempDev transferred
+                    tempList->AppendDeviceL( *tempDev );
+                    }
+                }
+            }
+        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] );
+                    // Ownership of tempDev transferred
+                    tempList->AppendDeviceL( *tempDev );                    
+                    }
+                }
+            }
+        iDeviceListRespBuf = tempList->ToDes8L();
+        CleanupStack::PopAndDestroy( tempList ); 
+        }    
+    
+    // Write the size back to the client
+    TPckg<TInt> resp1( iDeviceListRespBuf->Length() );
+    aMessage.WriteL( 1, resp1 );
+    aMessage.Complete( KErrNone );
+    }
+
+// --------------------------------------------------------------------------
+// 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;    
+    }
+
+// --------------------------------------------------------------------------
+// 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(
+        iMediaServer, 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::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(
+        iMediaServer, 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 );
+        }        
+    }
+
+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 );
+        }                       
+    }
+
+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 );
+        }                       
+    }
+    
+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 );
+        }                           
+    }
+
+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 );
+        }                           
+    }
+    
+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 );
+        }                           
+    }
+
+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 );
+        }                           
+    }
+
+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 );
+        }                               
+    }
+    
+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