diff -r 000000000000 -r 7f85d04be362 upnpavcontroller/upnpavcontrollerclient/src/upnpavcontrolleractive.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/upnpavcontroller/upnpavcontrollerclient/src/upnpavcontrolleractive.cpp Thu Dec 17 08:52:00 2009 +0200 @@ -0,0 +1,651 @@ +/* +* 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: AO that monitors for device events +* +*/ + + + + + + +// INCLUDES +// upnp stack api +#include + +// upnpframework / avcontroller api +#include "upnpavdevice.h" +#include "upnpavdeviceobserver.h" +#include "upnpavdevicelist.h" + +// avcontroller internal +#include "upnpavcontrolleractive.h" +#include "upnpavrenderingsessionimpl.h" +#include "upnpavbrowsingsessionimpl.h" +#include "upnpavconnectionactive.h" +#include "upnpfileuploadsessionimpl.h" +#include "upnpfiledownloadsessionimpl.h" + +_LIT( KComponentLogfile, "upnpavcontrollerclient.txt"); +#include "upnplog.h" + + +// ======== MEMBER FUNCTIONS ======== + +// -------------------------------------------------------------------------- +// CUPnPAVControllerActive::NewL +// Two-phase construct +// -------------------------------------------------------------------------- +CUPnPAVControllerActive* CUPnPAVControllerActive::NewL() + { + CUPnPAVControllerActive* self = CUPnPAVControllerActive::NewLC(); + CleanupStack::Pop( self ); + return self; + } + +// -------------------------------------------------------------------------- +// CUPnPAVControllerActive::NewLC +// Two-phase construct +// -------------------------------------------------------------------------- +CUPnPAVControllerActive* CUPnPAVControllerActive::NewLC() + { + CUPnPAVControllerActive* self = new (ELeave) CUPnPAVControllerActive; + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// -------------------------------------------------------------------------- +// CUPnPAVControllerActive::CUPnPAVControllerActive +// Two-phase construct +// -------------------------------------------------------------------------- +CUPnPAVControllerActive::CUPnPAVControllerActive() : + CActive( EPriorityStandard ), + iRespBufSizePkg( iRespBufSize ), + iDiscoveredPkg( iDiscovered ), + iAlive( ETrue ), + iReleaseState( EStateReleasable ) + { + CActiveScheduler::Add( this ); + } + +// -------------------------------------------------------------------------- +// CUPnPAVControllerActive::Release +// Destructor +// -------------------------------------------------------------------------- +void CUPnPAVControllerActive::Release() + { + __LOG( "CUPnPAVControllerActive::Release" ); + + if( iReleaseState == EStateReleasable ) + { + __LOG( "Release - ok to delete" ); + delete this; + } + else if( iReleaseState == EStateWLANLost ) + { + __LOG( "Release - waiting for release" ); + // Still sending WLAN lost messages, cannot delete + // To be released + iReleaseState = EStateWaitingForRelease; + } + else + { + __LOG( "Release - do nothing, double release" ); + } + } + +// -------------------------------------------------------------------------- +// CUPnPAVControllerActive::~CUPnPAVControllerActive +// Destructor +// -------------------------------------------------------------------------- +CUPnPAVControllerActive::~CUPnPAVControllerActive() + { + __LOG( "CUPnPAVControllerActive::~CUPnPAVControllerActive" ); + Cancel(); + delete iConnectionActive; + iBrowsingSessions.ResetAndDestroy(); + iRenderingSessions.ResetAndDestroy(); + iDownloadSessions.ResetAndDestroy(); + iUploadSessions.ResetAndDestroy(); + + iServer.Close(); + } + +// -------------------------------------------------------------------------- +// CUPnPAVControllerActive::ConstructL +// Two-phase construct +// -------------------------------------------------------------------------- +void CUPnPAVControllerActive::ConstructL() + { + __LOG( "CUPnPAVControllerActive::ConstructL" ); + + // Check the aip + TInt iap = 0; + CUpnpSettings* settings = CUpnpSettings::NewL( KCRUidUPnPStack ); + settings->Get( CUpnpSettings::KUPnPStackIapId, iap ); + delete settings; + User::LeaveIfError( iap ); + User::LeaveIfError( iServer.Connect() ); + + iConnectionActive = CUPnPAVConnectionActive::NewL( iServer, *this ); + iConnectionActive->StartMonitoring(); + + iServer.StartUp( iStatus ); // Start up the AV Control Point and wait + // until it has been started. + SetActive(); + iWait.Start(); + __LOG1( "ConstructL - iStatus = %d", iStatus.Int() ); + User::LeaveIfError( iStatus.Int() ); + } + +// -------------------------------------------------------------------------- +// CUPnPAVControllerActive::RunL +// From CActive +// -------------------------------------------------------------------------- +void CUPnPAVControllerActive::RunL() + { + __LOG( "CUPnPAVControllerActive::RunL" ); + + if( iWait.IsStarted() ) + { + iWait.AsyncStop(); // AV Control Point has been started, continue + // Construction + return; + } + + switch( iStatus.Int() ) + { + case EAVControllerDeviceCompleted: + { + HBufC8* tempBuf = HBufC8::NewLC( iRespBufSize ); + TPtr8 ptr = tempBuf->Des(); + if( iServer.GetDevice( ptr ) == KErrNone ) + { + // Create a device and make a callback + CUpnpAVDevice* tempDev = CUpnpAVDevice::NewLC(); + RDesReadStream stream( ptr ); + CleanupClosePushL( stream ); + stream >> *tempDev; + CleanupStack::PopAndDestroy( &stream ); + + if( iDiscovered == EAVDeviceDiscovered ) + { + // Discovered a device + iDeviceObserver->UPnPDeviceDiscovered( *tempDev ); + } + else + { + // Device disappeared + iDeviceObserver->UPnPDeviceDisappeared( *tempDev ); + } + CleanupStack::PopAndDestroy( tempDev ); + + // Activate again if needed (it's possible to remove and set + // the device obs from the UPnPDeviceDiscovered or + // UPnPDeviceDisappeared callbacks + if( !IsActive() ) + { + iServer.DeviceRequest( iDiscoveredPkg, iRespBufSizePkg, + iStatus ); + SetActive(); + } + } + else + { + // Can't handle the error anyhow, just log it + __LOG1( "RunL - error: %d", iStatus.Int() ); + } + CleanupStack::PopAndDestroy( tempBuf ); + } + break; + + default: + { + __PANICD( __FILE__, __LINE__ ); + } + } + } + +// -------------------------------------------------------------------------- +// CUPnPAVControllerActive::DoCancel +// From CActive +// -------------------------------------------------------------------------- +void CUPnPAVControllerActive::DoCancel() + { + __LOG( "CUPnPAVControllerActive::DoCancel" ); + if( !iDeviceObserver ) + { + __LOG( "iServer.CancelStartUp()" ); + // Not a real cancel, but if this is the last session, we'll shut + // down the server immidiately + iServer.CancelStartUp(); + } + else + { + iServer.CancelDeviceRequest(); + } + } + +// -------------------------------------------------------------------------- +// CUPnPAVControllerActive::RunError +// From CActive +// -------------------------------------------------------------------------- +TInt CUPnPAVControllerActive::RunError( + TInt aError + ) + { + // Can't handle the error anyhow, just log it + __LOG1( "CUPnPAVControllerActive::RunError: %d", aError ); + + return KErrNone; + } + +// -------------------------------------------------------------------------- +// CUPnPAVControllerActive::SetDeviceObserver +// Sets device observer +// -------------------------------------------------------------------------- +void CUPnPAVControllerActive::SetDeviceObserver( + MUPnPAVDeviceObserver& aObserver ) + { + __LOG( "CUPnPAVControllerActive::SetDeviceObserver" ); + + // Set the observer and make an async request to the server to receive + // device callbacks + __ASSERTD( !iDeviceObserver, __FILE__, __LINE__ ); + + if( iAlive ) + { + iDeviceObserver = &aObserver; + + iServer.DeviceRequest( iDiscoveredPkg, iRespBufSizePkg, iStatus ); + SetActive(); + } + } + +// -------------------------------------------------------------------------- +// CUPnPAVControllerActive::DeviceObserver +// Returns device observer +// -------------------------------------------------------------------------- +MUPnPAVDeviceObserver* CUPnPAVControllerActive::DeviceObserver() + { + __LOG( "CUPnPAVControllerActive::DeviceObserver" ); + + return iDeviceObserver; + } + +// -------------------------------------------------------------------------- +// CUPnPAVControllerActive::RemoveDeviceObserver +// Removes device observer +// -------------------------------------------------------------------------- +void CUPnPAVControllerActive::RemoveDeviceObserver() + { + __LOG( "CUPnPAVControllerActive::RemoveDeviceObserver" ); + + Cancel(); + + iDeviceObserver = NULL; + } + +// -------------------------------------------------------------------------- +// CUPnPAVControllerActive::GetMediaServersL +// Returns a list of media servers +// -------------------------------------------------------------------------- +CUpnpAVDeviceList* CUPnPAVControllerActive::GetMediaServersL() + { + __LOG( "CUPnPAVControllerActive::GetMediaServersL" ); + + if( !iAlive ) + { + User::Leave( KErrDisconnected ); + } + + CUpnpAVDeviceList* tempList = NULL; + + TPckg type( EAVMediaServer ); + + TInt respBufSize = 0; + TPckg respBufSizePkg( respBufSize ); + TInt err = iServer.GetDeviceListSize( type, respBufSizePkg ); + + if( err == KErrNone ) + { + + HBufC8* tempBuf = HBufC8::NewLC( respBufSize ); + TPtr8 ptr = tempBuf->Des(); + + err = iServer.GetDeviceList( ptr ); + if( err == KErrNone ) + { + // Create a device and make a callback + tempList = CUpnpAVDeviceList::NewL(); + RDesReadStream stream( ptr ); + stream >> *tempList; + stream.Close(); + } + else + { + User::Leave( err ); + } + CleanupStack::PopAndDestroy( tempBuf ); + } + else + { + User::Leave( err ); + } + return tempList; + } + +// -------------------------------------------------------------------------- +// CUPnPAVControllerActive::GetMediaRenderersL +// Returns a list of media renderes +// -------------------------------------------------------------------------- +CUpnpAVDeviceList* CUPnPAVControllerActive::GetMediaRenderersL() + { + __LOG( "CUPnPAVControllerActive::GetMediaRenderersL" ); + + if( !iAlive ) + { + User::Leave( KErrDisconnected ); + } + + CUpnpAVDeviceList* tempList = NULL; + + TPckg type( EAVMediaRenderer ); + + TInt respBufSize = 0; + TPckg respBufSizePkg( respBufSize ); + TInt err = iServer.GetDeviceListSize( type, respBufSizePkg ); + + if( err == KErrNone ) + { + + HBufC8* tempBuf = HBufC8::NewLC( respBufSize ); + TPtr8 ptr = tempBuf->Des(); + + err = iServer.GetDeviceList( ptr ); + if( err == KErrNone ) + { + // Create a device and make a callback + tempList = CUpnpAVDeviceList::NewL(); + RDesReadStream stream( ptr ); + stream >> *tempList; + stream.Close(); + } + else + { + User::Leave( err ); + } + CleanupStack::PopAndDestroy( tempBuf ); + } + else + { + User::Leave( err ); + } + return tempList; + } + +// -------------------------------------------------------------------------- +// CUPnPAVControllerActive::StartBrowsingSessionL +// Starts a browsing session +// -------------------------------------------------------------------------- +MUPnPAVBrowsingSession& CUPnPAVControllerActive::StartBrowsingSessionL( + const CUpnpAVDevice& aDevice ) + { + __LOG( "CUPnPAVControllerActive::StartBrowsingSessionL" ); + + if( !iAlive ) + { + User::Leave( KErrDisconnected ); + } + + if( aDevice.DeviceType() != CUpnpAVDevice::EMediaServer ) + { + User::Leave( KErrNotSupported ); + } + CUPnPAVBrowsingSessionImpl* sessionImpl = + CUPnPAVBrowsingSessionImpl::NewL( iServer, aDevice ); + iBrowsingSessions.Append( sessionImpl ); + return *sessionImpl; + } + +// -------------------------------------------------------------------------- +// CUPnPAVControllerActive::StopBrowsingSession +// Stops a browsing session +// -------------------------------------------------------------------------- +void CUPnPAVControllerActive::StopBrowsingSession( + MUPnPAVBrowsingSession& aSession ) + { + __LOG( "CUPnPAVControllerActive::StopBrowsingSession" ); + + CUPnPAVBrowsingSessionImpl* sessionImpl = + static_cast(&aSession); + TInt count = iBrowsingSessions.Count(); + for( TInt i = 0; i < count; i++ ) + { + if( iBrowsingSessions[ i ] == sessionImpl ) + { + delete iBrowsingSessions[ i ]; + iBrowsingSessions[ i ] = NULL; + i = count; + } + } + } + +// -------------------------------------------------------------------------- +// CUPnPAVControllerActive::StartRenderingSessionL +// Starts a rendering session +// -------------------------------------------------------------------------- +MUPnPAVRenderingSession& CUPnPAVControllerActive::StartRenderingSessionL( + const CUpnpAVDevice& aDevice ) + { + __LOG( "CUPnPAVControllerActive::StartRenderingSessionL" ); + + if( !iAlive ) + { + User::Leave( KErrDisconnected ); + } + + if( aDevice.DeviceType() != CUpnpAVDevice::EMediaRenderer ) + { + User::Leave( KErrNotSupported ); + } + CUPnPAVRenderingSessionImpl* sessionImpl = + CUPnPAVRenderingSessionImpl::NewL( iServer, aDevice ); + iRenderingSessions.Append( sessionImpl ); + return *sessionImpl; + } + +// -------------------------------------------------------------------------- +// CUPnPAVControllerActive::StopRenderingSession +// Stops a rendering session +// -------------------------------------------------------------------------- +void CUPnPAVControllerActive::StopRenderingSession( + MUPnPAVRenderingSession& aSession ) + { + __LOG( "CUPnPAVControllerActive::StopRenderingSession" ); + + CUPnPAVRenderingSessionImpl* sessionImpl = + static_cast(&aSession); + TInt count = iRenderingSessions.Count(); + for( TInt i = 0; i < count; i++ ) + { + if( iRenderingSessions[ i ] == sessionImpl ) + { + delete iRenderingSessions[ i ]; + iRenderingSessions[ i ] = NULL; + i = count; + } + } + } + +// -------------------------------------------------------------------------- +// CUPnPAVControllerActive::StartUploadSessionL +// Starts an upload session +// -------------------------------------------------------------------------- +MUPnPFileUploadSession& CUPnPAVControllerActive::StartUploadSessionL( + const CUpnpAVDevice& aDevice ) + { + __LOG( "CUPnPAVControllerActive::StartUploadSessionL" ); + + if( !iAlive ) + { + User::Leave( KErrDisconnected ); + } + + if( aDevice.DeviceType() != CUpnpAVDevice::EMediaServer ) + { + User::Leave( KErrNotSupported ); + } + CUPnPFileUploadSessionImpl* sessionImpl = + CUPnPFileUploadSessionImpl::NewL( iServer, aDevice ); + iUploadSessions.Append( sessionImpl ); + return *sessionImpl; + } + +// -------------------------------------------------------------------------- +// CUPnPAVControllerActive::StopUploadSession +// Stops an upload session +// -------------------------------------------------------------------------- +void CUPnPAVControllerActive::StopUploadSession( + MUPnPFileUploadSession& aSession ) + { + __LOG( "CUPnPAVControllerActive::StopUploadSession" ); + + CUPnPFileUploadSessionImpl* sessionImpl = + static_cast(&aSession); + TInt count = iUploadSessions.Count(); + for( TInt i = 0; i < count; i++ ) + { + if( iUploadSessions[ i ] == sessionImpl ) + { + delete iUploadSessions[ i ]; + iUploadSessions[ i ] = NULL; + i = count; + } + } + + } + +// -------------------------------------------------------------------------- +// CUPnPAVControllerActive::StartDownloadSessionL +// Starts a download session +// -------------------------------------------------------------------------- +MUPnPFileDownloadSession& CUPnPAVControllerActive::StartDownloadSessionL( + const CUpnpAVDevice& aDevice ) + { + __LOG( "CUPnPAVControllerActive::StartDownloadSessionL" ); + + if( !iAlive ) + { + User::Leave( KErrDisconnected ); + } + + if( aDevice.DeviceType() != CUpnpAVDevice::EMediaServer ) + { + User::Leave( KErrNotSupported ); + } + CUPnPFileDownloadSessionImpl* sessionImpl = + CUPnPFileDownloadSessionImpl::NewL( iServer, aDevice ); + iDownloadSessions.Append( sessionImpl ); + return *sessionImpl; + } + +// -------------------------------------------------------------------------- +// CUPnPAVControllerActive::StopDownloadSession +// Stops a download session +// -------------------------------------------------------------------------- +void CUPnPAVControllerActive::StopDownloadSession( + MUPnPFileDownloadSession& aSession ) + { + __LOG( "CUPnPAVControllerActive::StopDownloadSession" ); + + CUPnPFileDownloadSessionImpl* sessionImpl = + static_cast(&aSession); + TInt count = iDownloadSessions.Count(); + for( TInt i = 0; i < count; i++ ) + { + if( iDownloadSessions[ i ] == sessionImpl ) + { + delete iDownloadSessions[ i ]; + //iRenderingSessions.Remove( i ); + iDownloadSessions[ i ] = NULL; + i = count; + } + } + + } + +// -------------------------------------------------------------------------- +// CUPnPAVControllerActive::ConnectionLost +// Wlan disconnected +// -------------------------------------------------------------------------- +void CUPnPAVControllerActive::ConnectionLost() + { + __LOG( "CUPnPAVControllerActive::ConnectionLost" ); + + iAlive = EFalse; + + iReleaseState = EStateWLANLost; + + TInt count = iRenderingSessions.Count(); + for( TInt i = 0; i < count; i++ ) + { + if( iRenderingSessions.Count() && iRenderingSessions[ i ] ) + { + iRenderingSessions[ i ]->WLANConnectionLost(); + } + } + + count = iBrowsingSessions.Count(); + for( TInt i = 0; i < count; i++ ) + { + if( iBrowsingSessions.Count() && iBrowsingSessions[ i ] ) + { + iBrowsingSessions[ i ]->WLANConnectionLost(); + } + } + + count = iUploadSessions.Count(); + for( TInt i = 0; i < count; i++ ) + { + if( iUploadSessions.Count() && iUploadSessions[ i ] ) + { + iUploadSessions[ i ]->WLANConnectionLost(); + } + } + + count = iDownloadSessions.Count(); + for( TInt i = 0; i < count; i++ ) + { + if( iDownloadSessions.Count() && iDownloadSessions[ i ] ) + { + iDownloadSessions[ i ]->WLANConnectionLost(); + } + } + + if( iDeviceObserver ) + { + iDeviceObserver->WLANConnectionLost(); + } + + if( iReleaseState == EStateWaitingForRelease ) + { + __LOG( "ConnectionLost - release" ); + delete this; + } + + iReleaseState = EStateReleasable; + } +// end of file