diff -r 3785f754ee62 -r 5360b7ddc251 upnpavcontroller/upnpavcontrollerserver/src/upnpavdeviceextended.cpp --- a/upnpavcontroller/upnpavcontrollerserver/src/upnpavdeviceextended.cpp Fri Sep 17 08:31:21 2010 +0300 +++ b/upnpavcontroller/upnpavcontrollerserver/src/upnpavdeviceextended.cpp Mon Nov 01 12:37:49 2010 +0200 @@ -1,874 +1,981 @@ -/* -* Copyright (c) 2005-2006 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: device with extended information - used in AVC server -* -*/ - - - - - - -// INCLUDES -// upnp stack api -#include -#include - -// upnpframework / avcontroller helper api -#include "upnpitemutility.h" -#include "upnpconstantdefs.h" // for upnp-specific stuff - -// upnpframework / internal api's -#include "upnpcommonutils.h" - -// avcontroller internal -#include "upnpavdeviceextended.h" - - -_LIT8( KAudioSupport, "audio/" ); -_LIT8( KImageSupport, "image/" ); -_LIT8( KVideoSupport, "video/" ); -_LIT8( KDlnaPn, "DLNA.ORG_PN" ); - - -const TInt KProtocolInfoDelimeter = 44; -const TInt KUnicodeC0RangeStart = 0;// the begin character of C0 range -const TInt KUnicodeC0RangeEnd = 32;// the end character of C0 range -const TInt KUnicodeC1RangeStart = 127;// the begin character of C1 range -const TInt KUnicodeC1RangeEnd = 159;// the end character of C1 range -const TInt KSlash = 92; -_LIT8( KProtocolInfo, "protocolInfo" ); -_LIT8( KAsterisk, "*" ); - -_LIT( KComponentLogfile, "upnpavcontrollerserver.txt"); -#include "upnplog.h" - -// ============================ MEMBER FUNCTIONS ============================ - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::NewL -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -CUpnpAVDeviceExtended* CUpnpAVDeviceExtended::NewL( - const CUpnpAVDevice& aDevice ) - { - CUpnpAVDeviceExtended* dev = new(ELeave) CUpnpAVDeviceExtended(); - CleanupStack::PushL( dev ); - - dev->iDeviceType = aDevice.DeviceType(); - dev->SetFriendlyNameL( aDevice.FriendlyName() ); - dev->SetUuidL( aDevice.Uuid() ); - dev->iCopyCapability = aDevice.CopyCapability(); - dev->iSearchCapability = aDevice.SearchCapability(); - dev->iPauseCapability = aDevice.PauseCapability(); - dev->iVolumeCapability = aDevice.VolumeCapability(); - dev->iMuteCapability = aDevice.MuteCapability(); - dev->iAudioMediaCapability = aDevice.AudioCapability(); - dev->iImageMediaCapability = aDevice.ImageCapability(); - dev->iVideoMediaCapability = aDevice.VideoCapability(); - dev->iNextAVTransportUri = aDevice.NextAVTransportUri(); - dev->iMaxVolume = aDevice.MaxVolume(); - dev->iDlnaCompatible = aDevice.DlnaCompatible(); - - dev->ConstructL(); - CleanupStack::Pop(); - return dev; - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::NewL -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -CUpnpAVDeviceExtended* CUpnpAVDeviceExtended::NewL( - const CUpnpAVDeviceExtended& aDevice ) - { - CUpnpAVDeviceExtended* dev = new(ELeave) CUpnpAVDeviceExtended(); - CleanupStack::PushL( dev ); - - dev->iDeviceType = aDevice.DeviceType(); - dev->SetFriendlyNameL( aDevice.FriendlyName() ); - dev->SetUuidL( aDevice.Uuid() ); - dev->iCopyCapability = aDevice.CopyCapability(); - dev->iSearchCapability = aDevice.SearchCapability(); - dev->iPauseCapability = aDevice.PauseCapability(); - dev->iVolumeCapability = aDevice.VolumeCapability(); - dev->iMuteCapability = aDevice.MuteCapability(); - dev->iAudioMediaCapability = aDevice.AudioCapability(); - dev->iImageMediaCapability = aDevice.ImageCapability(); - dev->iVideoMediaCapability = aDevice.VideoCapability(); - dev->iNextAVTransportUri = aDevice.NextAVTransportUri(); - dev->iMaxVolume = aDevice.MaxVolume(); - dev->iDlnaCompatible = aDevice.DlnaCompatible(); - - dev->SetSinkProtocolInfoL( aDevice.SinkProtocolInfo() ); - dev->SetSourceProtocolInfoL( aDevice.SourceProtocolInfo() ); - dev->iSubscriptionCount = aDevice.SubscriptionCount(); - dev->iLocal = aDevice.Local(); - dev->iAudioUpload = aDevice.AudioUpload(); - dev->iImageUpload = aDevice.ImageUpload(); - dev->iVideoUpload = aDevice.VideoUpload(); - dev->iCreateChildContainer = aDevice.CreateChildContainer(); - dev->iDestroyObject = aDevice.DestroyObject(); - dev->iPInfoReceived = aDevice.PInfoReceived(); - dev->iDLNADeviceType = aDevice.DLNADeviceType(); - - dev->ConstructL(); - CleanupStack::Pop(); - return dev; - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::NewL -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -CUpnpAVDeviceExtended* CUpnpAVDeviceExtended::NewL() - { - CUpnpAVDeviceExtended* dev = new(ELeave) CUpnpAVDeviceExtended(); - CleanupStack::PushL( dev ); - dev->ConstructL(); - CleanupStack::Pop(); - return dev; - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::~CUpnpAVDeviceExtended -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -CUpnpAVDeviceExtended::~CUpnpAVDeviceExtended() - { - iSinkProtocolInfo.ResetAndDestroy(); - iSourceProtocolInfo.ResetAndDestroy(); - } - - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::CUpnpAVDeviceExtended -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -CUpnpAVDeviceExtended::CUpnpAVDeviceExtended() : - CUpnpAVDevice() - { - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::IncreaseSubscriptionCount -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -TInt CUpnpAVDeviceExtended::IncreaseSubscriptionCount() - { - return ++iSubscriptionCount; - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::DecreaseSubscriptionCount -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -TInt CUpnpAVDeviceExtended::DecreaseSubscriptionCount() - { - iSubscriptionCount--; - if( iSubscriptionCount < 0 ) - { - iSubscriptionCount = 0; - } - return iSubscriptionCount; - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::SubscriptionCount -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -TInt CUpnpAVDeviceExtended::SubscriptionCount() const - { - return iSubscriptionCount; - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::ConstructL -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -void CUpnpAVDeviceExtended::ConstructL() - { - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::SetSinkProtocolInfoL -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -void CUpnpAVDeviceExtended::SetSinkProtocolInfoL( - const TDesC8& aProtocolInfo ) - { - __LOG( "CUpnpAVDeviceExtended::SetSinkProtocolInfoL" ); - HBufC8* buffer = RemoveIllegalCharactersL( aProtocolInfo ); - if( buffer ) - { - CleanupStack::PushL( buffer ); - TLex8 input( *buffer ); - - while( !input.Eos() ) - { - ParseToDelimeter( input, TChar( KProtocolInfoDelimeter ) ); - CUpnpDlnaProtocolInfo* tmpInfo = NULL; - TRAPD( err, tmpInfo = CUpnpDlnaProtocolInfo::NewL( - input.MarkedToken() ) ); - - if( err == KErrNone && tmpInfo ) - { - // Transfer ownership of tmpInfo - iSinkProtocolInfo.AppendL( tmpInfo ); - } - else - { - __LOG1( "CUpnpDlnaProtocolInfo::NewL failed: %d", err ); - } - - if( !input.Eos() ) - { - input.SkipAndMark( 1 ); // Skip the delimeter - } - } - CleanupStack::PopAndDestroy( buffer ); - } - __LOG( "CUpnpAVDeviceExtended::SetSinkProtocolInfoL end" ); - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::SinkProtocolInfo -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -const RPointerArray& - CUpnpAVDeviceExtended::SinkProtocolInfo() const - { - return iSinkProtocolInfo; - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::SetSourceProtocolInfoL -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -void CUpnpAVDeviceExtended::SetSourceProtocolInfoL( - const TDesC8& aProtocolInfo ) - { - __LOG( "CUpnpAVDeviceExtended::SetSourceProtocolInfoL" ); - HBufC8* buffer = RemoveIllegalCharactersL( aProtocolInfo ); - if( buffer ) - { - CleanupStack::PushL( buffer ); - TLex8 input( *buffer ); - - while( !input.Eos() ) - { - ParseToDelimeter( input, TChar( KProtocolInfoDelimeter ) ); - CUpnpDlnaProtocolInfo* tmpInfo = NULL; - TRAPD( err, tmpInfo = CUpnpDlnaProtocolInfo::NewL( - input.MarkedToken() ) ); - - if( err == KErrNone && tmpInfo ) - { - // Transfer ownership of tmpInfo - iSourceProtocolInfo.AppendL( tmpInfo ); - } - else - { - __LOG1( "CUpnpDlnaProtocolInfo::NewL failed: %d", err ); - } - - if( !input.Eos() ) - { - input.SkipAndMark( 1 ); // Skip the delimeter - } - } - CleanupStack::PopAndDestroy( buffer ); - } - __LOG( "CUpnpAVDeviceExtended::SetSourceProtocolInfoL end" ); - } -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::SourceProtocolInfo -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -const RPointerArray& - CUpnpAVDeviceExtended::SourceProtocolInfo() const - { - return iSourceProtocolInfo; - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::SetLocal -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -void CUpnpAVDeviceExtended::SetLocal( TBool aLocal ) - { - iLocal = aLocal; - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::Local -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -TBool CUpnpAVDeviceExtended::Local() const - { - return iLocal; - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::MatchSinkProtocolInfo -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -TBool CUpnpAVDeviceExtended::MatchSinkProtocolInfo( - const TDesC8& aInfo ) const - { - __LOG( "CUpnpAVDeviceExtended::MatchSinkProtocolInfo" ); - - TBool match = EFalse; - - if( DlnaCompatible() ) - { - // The device is DLNA compatible - - // Try try find PN parameter to determine if it's dlna content - if( aInfo.Find( KDlnaPn ) != KErrNotFound ) - { - __LOG( "MatchSinkProtocolInfo - DLNA content and the renderer \ -is DLNA compatible, start matching..." ); - - match = MatchSinkProfileId( aInfo ); - } - else - { - __LOG( "MatchSinkProtocolInfo - Non DLNA content and the \ -renderer is DLNA compatible, start matching..." ); - match = MatchSinkMime( aInfo ); - } - } - else - { - __LOG( "MatchSinkProtocolInfo - Renderer is not DLNA compatible, \ -start matching..." ); - match = MatchSinkMime( aInfo ); - } - - return match; - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::MatchSourceProtocolInfo -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -TBool CUpnpAVDeviceExtended::ValidateTransfer( - const TDesC8& aInfo ) const - { - __LOG( "CUpnpAVDeviceExtended::MatchSourceProtocolInfo" ); - - // Try try find PN parameter to determine if it's dlna content - TBool match = EFalse; - if( aInfo.Find( KDlnaPn ) != KErrNotFound ) - { - match = MatchSourceProfileId( aInfo ); - } - - return match; - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::MatchSinkProfileId -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -TBool CUpnpAVDeviceExtended::MatchSinkProfileId( - const TDesC8& aInfo ) const - { - __LOG( "CUpnpAVDeviceExtended::MatchSinkProfileId" ); - - TBool match = EFalse; - CUpnpDlnaProtocolInfo* tmpInfo = NULL; - TRAPD( err, tmpInfo = CUpnpDlnaProtocolInfo::NewL( aInfo ) ); - if ( err == KErrNone ) - { - // Match the first parameter and PN parameter - TInt count = iSinkProtocolInfo.Count(); - for( TInt i = 0; i < count; i++ ) - { - if( iSinkProtocolInfo[ i ]->PnParameter() == - tmpInfo->PnParameter() || - iSinkProtocolInfo[ i ]->FourthField() == KAsterisk ) - { - // PN parameter matches, try matching the first - // parameter - if( iSinkProtocolInfo[ i ]->FirstField() == - tmpInfo->FirstField() || - iSinkProtocolInfo[ i ]->FirstField() == - KAsterisk ) - { - __LOG( "MatchSinkProfileId - a match" ); - - // We have a match! - i = count; - match = ETrue; - } - } - } - delete tmpInfo; - } - return match; - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::MatchSourceProfileId -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -TBool CUpnpAVDeviceExtended::MatchSourceProfileId( - const TDesC8& aInfo ) const - { - __LOG( "CUpnpAVDeviceExtended::MatchSourceProfileId" ); - - TBool match = EFalse; - CUpnpDlnaProtocolInfo* tmpInfo = NULL; - TRAPD( err, tmpInfo = CUpnpDlnaProtocolInfo::NewL( aInfo ) ); - if ( err == KErrNone ) - { - // Match the first parameter and PN parameter - TInt count = iSourceProtocolInfo.Count(); - for( TInt i = 0; i < count; i++ ) - { - if( iSourceProtocolInfo[ i ]->PnParameter() == - tmpInfo->PnParameter() ) - { - // PN parameter matches, try matching the first - // parameter - if( iSourceProtocolInfo[ i ]->FirstField() == - tmpInfo->FirstField() || - iSourceProtocolInfo[ i ]->FirstField() == - KAsterisk ) - { - __LOG( "MatchSourceProfileId - a match" ); - - // We have a match! - i = count; - match = ETrue; - } - } - } - delete tmpInfo; - } - return match; - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::MatchSinkMime -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -TBool CUpnpAVDeviceExtended::MatchSinkMime( const TDesC8& aInfo ) const - { - __LOG( "CUpnpAVDeviceExtended::MatchSinkMime" ); - - TBool match = EFalse; - CUpnpDlnaProtocolInfo* tmpInfo = NULL; - TRAPD( err, tmpInfo = CUpnpDlnaProtocolInfo::NewL( aInfo ) ); - if ( err == KErrNone ) - { - // Match the first parameter and mime-type - TInt count = iSinkProtocolInfo.Count(); - for( TInt i = 0; i < count; i++ ) - { - if( iSinkProtocolInfo[ i ]->ThirdField() == - tmpInfo->ThirdField() ) - { - // Mime-parameter matches, try matching the first - // parameter - if( iSinkProtocolInfo[ i ]->FirstField() == - tmpInfo->FirstField() ) - { - __LOG( "MatchSinkMime - a match" ); - - // We have a match! - i = count; - match = ETrue; - } - } - } - delete tmpInfo; - } - return match; - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::FindFirstMatchingInSinkL -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -const TDesC8& CUpnpAVDeviceExtended::FindFirstMatchingInSinkL( - const CUpnpItem& aItem ) const - { - __LOG( "CUpnpAVDeviceExtended::FindFirstMatchingInSinkL" ); - - RUPnPElementsArray array; - CleanupClosePushL( array ); - - UPnPItemUtility::GetResElements( aItem, array ); - TBool match = EFalse; - TInt i; - - TInt count = array.Count(); - for( i = 0; i < count; i ++ ) - { - const CUpnpAttribute& protocolInfo = - UPnPItemUtility::FindAttributeByNameL( - *array[ i ], KProtocolInfo ); - - if( MatchType( aItem.ObjectClass(), protocolInfo.Value() ) ) - { - if( MatchSinkProtocolInfo( protocolInfo.Value() ) ) - { - // We have a match! - __LOG( "FindFirstMatchingInSinkL - a match" ); - - match = ETrue; - break; - } - else - { - __LOG( "FindFirstMatchingInSinkL - not a match" ); - } - } - else - { - // Res-elements mime-type does not match to object-class - // Ignore - __LOG( "FindFirstMatchingInSinkL - Res doesn't match \ -to objectclass" ); - } - } - - if( !match ) - { - __LOG( "FindFirstMatchingInSinkL - No match" ); - - User::Leave( KErrNotSupported ); - } - - const TDesC8& uri = array[ i ]->Value(); - - CleanupStack::PopAndDestroy( &array ); - - return uri; - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::MatchType -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -TBool CUpnpAVDeviceExtended::MatchType( const TDesC8& aObjectClass, - const TDesC8& aProtocolInfo ) const - { - __LOG( "CUpnpAVDeviceExtended::MatchType" ); - - TBool retVal = EFalse; - if( aObjectClass.Find( KClassAudio ) == 0 ) - { - if( aProtocolInfo.Find( KAudioSupport ) >= 0 ) - { - retVal = ETrue; - } - } - else if( aObjectClass.Find( KClassImage ) == 0 ) - { - if( aProtocolInfo.Find( KImageSupport ) >= 0 ) - { - retVal = ETrue; - } - } - else if( aObjectClass.Find( KClassVideo ) == 0 ) - { - if( aProtocolInfo.Find( KVideoSupport ) >= 0 ) - { - retVal = ETrue; - } - } - else - { - __PANICD( __FILE__, __LINE__ ); - } - return retVal; - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::SetCapabilitiesBySupportedMimeTypesL -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -void CUpnpAVDeviceExtended::SetCapabilitiesBySupportedMimeTypesL( - const TDesC8& aListOfMimeTypes ) - { - __LOG( "CUpnpAVDeviceExtended::SetCapabilitiesBySupportedMimeTypesL" ); - - if( aListOfMimeTypes != KNullDesC8 ) - { - // Update the audio media capability - if( UPnPCommonUtils::IsAudioSupported( aListOfMimeTypes ) ) - { - iAudioMediaCapability = ETrue; - } - else - { - iAudioMediaCapability = EFalse; - } - - // Update the audio media capability - if( UPnPCommonUtils::IsImageSupported( aListOfMimeTypes ) ) - { - iImageMediaCapability = ETrue; - } - else - { - iImageMediaCapability = EFalse; - } - - // Update the video media capability - if( UPnPCommonUtils::IsVideoSupported( aListOfMimeTypes ) ) - { - iVideoMediaCapability = ETrue; - } - else - { - iVideoMediaCapability = EFalse; - } - } - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::SetSourceProtocolInfoL -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -void CUpnpAVDeviceExtended::SetSourceProtocolInfoL( - const RPointerArray& aProtocolInfo ) - { - __LOG( "CUpnpAVDeviceExtended::SetSourceProtocolInfoL" ); - - for( TInt i = 0; i < aProtocolInfo.Count(); i++ ) - { - CUpnpDlnaProtocolInfo* tmpInfo = CUpnpDlnaProtocolInfo::NewL( - aProtocolInfo[ i ]->ProtocolInfoL() ); - iSourceProtocolInfo.AppendL( tmpInfo ); // Ownership is transferred - } - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::SetSinkProtocolInfoL -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -void CUpnpAVDeviceExtended::SetSinkProtocolInfoL( - const RPointerArray& aProtocolInfo ) - { - __LOG( "CUpnpAVDeviceExtended::SetSinkProtocolInfoL" ); - - for( TInt i = 0; i < aProtocolInfo.Count(); i++ ) - { - CUpnpDlnaProtocolInfo* tmpInfo = CUpnpDlnaProtocolInfo::NewL( - aProtocolInfo[ i ]->ProtocolInfoL() ); - iSinkProtocolInfo.AppendL( tmpInfo ); // Ownership is transferred - } - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::ParseToDelimeter -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -void CUpnpAVDeviceExtended::ParseToDelimeter( TLex8& aLex, TChar aDelimeter ) - { - aLex.Mark(); - - TChar chr = 0; - TChar edchr = 0; - - while( !aLex.Eos() ) - { - edchr = chr; - - chr = aLex.Peek(); - if( chr == aDelimeter && edchr != TChar( KSlash ) ) - { - break; - } - - aLex.Inc(); - } - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::RemoveIllegalCharactersL -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- - HBufC8* CUpnpAVDeviceExtended::RemoveIllegalCharactersL( - const TDesC8& aPtr ) const - { - HBufC8* ptrResult = NULL; - TInt i = KErrNotFound; - if ( aPtr.Length() != 0 ) - { - ptrResult = aPtr.AllocL(); - CleanupStack::PushL( ptrResult ); - TPtr8 ptr = ptrResult->Des(); - while( ++i < ptr.Length() ) - { - if( IsIllegalCharacter( ptr[i] ) ) - { - ptr.Delete( i, 1 ); - i--; - } - - } - CleanupStack::Pop( ptrResult ); - } - return ptrResult; - - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::IsIllegalCharacter -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -TBool CUpnpAVDeviceExtended::IsIllegalCharacter( TChar aCharacter ) const - { - - TBool retVal = EFalse; - if ( ( ( aCharacter >= TChar( KUnicodeC0RangeStart ) - && aCharacter <= TChar( KUnicodeC0RangeEnd ) ) - || ( aCharacter >= TChar( KUnicodeC1RangeStart ) - && aCharacter <= TChar( KUnicodeC1RangeEnd ) ) ) ) - { - retVal = ETrue; - } - return retVal; - - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::SetAudioUpload -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -void CUpnpAVDeviceExtended::SetAudioUpload( TBool aAudioUpload ) - { - iAudioUpload = aAudioUpload; - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::AudioUpload -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -TBool CUpnpAVDeviceExtended::AudioUpload() const - { - return iAudioUpload; - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::SetImageUpload -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -void CUpnpAVDeviceExtended::SetImageUpload( TBool aImageUpload ) - { - iImageUpload = aImageUpload; - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::ImageUpload -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -TBool CUpnpAVDeviceExtended::ImageUpload() const - { - return iImageUpload; - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::SetVideoUpload -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -void CUpnpAVDeviceExtended::SetVideoUpload( TBool aVideoUpload ) - { - iVideoUpload = aVideoUpload; - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::VideoUpload -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -TBool CUpnpAVDeviceExtended::VideoUpload() const - { - return iVideoUpload; - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::SetCreateChildContainer -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -void CUpnpAVDeviceExtended::SetCreateChildContainer( - TBool aCreateChildContainer ) - { - iCreateChildContainer = aCreateChildContainer; - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::CreateChildContainer -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -TBool CUpnpAVDeviceExtended::CreateChildContainer() const - { - return iCreateChildContainer; - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::SetDestroyObject -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -void CUpnpAVDeviceExtended::SetDestroyObject( TBool aDestroyObject ) - { - iDestroyObject = aDestroyObject; - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::DestroyObject -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -TBool CUpnpAVDeviceExtended::DestroyObject() const - { - return iDestroyObject; - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::SetPInfoReceived -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -void CUpnpAVDeviceExtended::SetPInfoReceived( TBool aPInfoReceived ) - { - iPInfoReceived = aPInfoReceived; - } - -// -------------------------------------------------------------------------- -// CUpnpAVDeviceExtended::PInfoReceived -// See upnpavdeviceextended.h -// -------------------------------------------------------------------------- -TBool CUpnpAVDeviceExtended::PInfoReceived() const - { - return iPInfoReceived; - } - -void CUpnpAVDeviceExtended::SetDLNADeviceType( TDLNADeviceType aDeviceType ) - { - iDLNADeviceType = aDeviceType; - } - -CUpnpAVDeviceExtended::TDLNADeviceType - CUpnpAVDeviceExtended::DLNADeviceType() const - { - return iDLNADeviceType; - } - - - -// end of file +/* +* Copyright (c) 2005-2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: device with extended information - used in AVC server +* +*/ + + + + + + +// INCLUDES +#include + +// dlnasrv / mediaserver api +#include +#include + +// dlnasrv / avcontroller helper api +#include "upnpitemutility.h" +#include "upnpconstantdefs.h" // for upnp-specific stuff + +// dlnasrv / internal api's +#include "upnpcommonutils.h" + +// dlnasrv / avcontroller internal +#include "upnpavdeviceextended.h" + + +_LIT8( KAudioSupport, "audio/" ); +_LIT8( KImageSupport, "image/" ); +_LIT8( KVideoSupport, "video/" ); +_LIT8( KDlnaPn, "DLNA.ORG_PN" ); + + +const TInt KProtocolInfoDelimeter = 44; +const TInt KUnicodeC0RangeStart = 0;// the begin character of C0 range +const TInt KUnicodeC0RangeEnd = 32;// the end character of C0 range +const TInt KUnicodeC1RangeStart = 127;// the begin character of C1 range +const TInt KUnicodeC1RangeEnd = 159;// the end character of C1 range +const TInt KSlash = 92; +_LIT8( KProtocolInfo, "protocolInfo" ); +_LIT8( KAsterisk, "*" ); + +const TInt KUrlIpBufLen = 16; // For IP address e.g. xxx.xxx.xxx.xxx +const TInt KUrlPortLen = 11; // For HTTP port e.g. yyyyy +_LIT8( KUrlColon, ":" ); +_LIT8( KUrlSlash, "/" ); +_LIT8( KUrlHttp, "http://" ); + +_LIT( KComponentLogfile, "upnpavcontrollerserver.txt"); +#include "upnplog.h" + +// -------------------------------------------------------------------------- +// EnsureFinalSlash +// -------------------------------------------------------------------------- +static void EnsureFinalSlash( TDes8& aUrl ) + { + TInt len( aUrl.Length() ); + if ( len > 0 && aUrl[ len - 1 ] != KUrlSlash()[ 0 ] ) + { + aUrl.Append( KUrlSlash ); + } + } + +// -------------------------------------------------------------------------- +// RemoveInitial +// -------------------------------------------------------------------------- +static TPtrC8 RemoveInitial( const TDesC8& aUrl, const TDesC8& aInitial ) + { + return aUrl.Find( aInitial ) == 0 ? aUrl.Mid( aInitial.Length() ) : aUrl; + } + +// ============================ MEMBER FUNCTIONS ============================ + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::NewL +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +CUpnpAVDeviceExtended* CUpnpAVDeviceExtended::NewL( + const CUpnpAVDevice& aDevice ) + { + CUpnpAVDeviceExtended* dev = new(ELeave) CUpnpAVDeviceExtended(); + CleanupStack::PushL( dev ); + + dev->iDeviceType = aDevice.DeviceType(); + dev->SetFriendlyNameL( aDevice.FriendlyName() ); + dev->SetUuidL( aDevice.Uuid() ); + dev->iCopyCapability = aDevice.CopyCapability(); + dev->iSearchCapability = aDevice.SearchCapability(); + dev->iPauseCapability = aDevice.PauseCapability(); + dev->iVolumeCapability = aDevice.VolumeCapability(); + dev->iMuteCapability = aDevice.MuteCapability(); + dev->iAudioMediaCapability = aDevice.AudioCapability(); + dev->iImageMediaCapability = aDevice.ImageCapability(); + dev->iVideoMediaCapability = aDevice.VideoCapability(); + dev->iNextAVTransportUri = aDevice.NextAVTransportUri(); + dev->iMaxVolume = aDevice.MaxVolume(); + dev->iDlnaCompatible = aDevice.DlnaCompatible(); + dev->iSeekCapability = aDevice.SeekCapability(); + + dev->ConstructL(); + CleanupStack::Pop(); + return dev; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::NewL +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +CUpnpAVDeviceExtended* CUpnpAVDeviceExtended::NewL( + const CUpnpAVDeviceExtended& aDevice ) + { + CUpnpAVDeviceExtended* dev = new(ELeave) CUpnpAVDeviceExtended(); + CleanupStack::PushL( dev ); + + dev->iDeviceType = aDevice.DeviceType(); + dev->SetFriendlyNameL( aDevice.FriendlyName() ); + dev->SetUuidL( aDevice.Uuid() ); + dev->iCopyCapability = aDevice.CopyCapability(); + dev->iSearchCapability = aDevice.SearchCapability(); + dev->iPauseCapability = aDevice.PauseCapability(); + dev->iVolumeCapability = aDevice.VolumeCapability(); + dev->iMuteCapability = aDevice.MuteCapability(); + dev->iAudioMediaCapability = aDevice.AudioCapability(); + dev->iImageMediaCapability = aDevice.ImageCapability(); + dev->iVideoMediaCapability = aDevice.VideoCapability(); + dev->iNextAVTransportUri = aDevice.NextAVTransportUri(); + dev->iMaxVolume = aDevice.MaxVolume(); + dev->iDlnaCompatible = aDevice.DlnaCompatible(); + dev->iSeekCapability = aDevice.SeekCapability(); + + dev->SetSinkProtocolInfoL( aDevice.SinkProtocolInfo() ); + dev->SetSourceProtocolInfoL( aDevice.SourceProtocolInfo() ); + dev->iSubscriptionCount = aDevice.SubscriptionCount(); + dev->iLocal = aDevice.Local(); + dev->iAudioUpload = aDevice.AudioUpload(); + dev->iImageUpload = aDevice.ImageUpload(); + dev->iVideoUpload = aDevice.VideoUpload(); + dev->iCreateChildContainer = aDevice.CreateChildContainer(); + dev->iDestroyObject = aDevice.DestroyObject(); + dev->iPInfoReceived = aDevice.PInfoReceived(); + dev->iDLNADeviceType = aDevice.DLNADeviceType(); + dev->iPrepareForConnection = aDevice.PrepareForConnection(); + + dev->ConstructL(); + CleanupStack::Pop(); + return dev; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::NewL +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +CUpnpAVDeviceExtended* CUpnpAVDeviceExtended::NewL() + { + CUpnpAVDeviceExtended* dev = new(ELeave) CUpnpAVDeviceExtended(); + CleanupStack::PushL( dev ); + dev->ConstructL(); + CleanupStack::Pop(); + return dev; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::~CUpnpAVDeviceExtended +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +CUpnpAVDeviceExtended::~CUpnpAVDeviceExtended() + { + delete iIconUrl; + iSinkProtocolInfo.ResetAndDestroy(); + iSourceProtocolInfo.ResetAndDestroy(); + } + + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::CUpnpAVDeviceExtended +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +CUpnpAVDeviceExtended::CUpnpAVDeviceExtended() : + CUpnpAVDevice() + { + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::IncreaseSubscriptionCount +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +TInt CUpnpAVDeviceExtended::IncreaseSubscriptionCount() + { + return ++iSubscriptionCount; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::DecreaseSubscriptionCount +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +TInt CUpnpAVDeviceExtended::DecreaseSubscriptionCount() + { + iSubscriptionCount--; + if( iSubscriptionCount < 0 ) + { + iSubscriptionCount = 0; + } + return iSubscriptionCount; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::SubscriptionCount +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +TInt CUpnpAVDeviceExtended::SubscriptionCount() const + { + return iSubscriptionCount; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::ConstructL +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +void CUpnpAVDeviceExtended::ConstructL() + { + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::SetSinkProtocolInfoL +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +void CUpnpAVDeviceExtended::SetSinkProtocolInfoL( + const TDesC8& aProtocolInfo ) + { + __LOG( "CUpnpAVDeviceExtended::SetSinkProtocolInfoL" ); + HBufC8* buffer = RemoveIllegalCharactersL( aProtocolInfo ); + if( buffer ) + { + CleanupStack::PushL( buffer ); + TLex8 input( *buffer ); + + while( !input.Eos() ) + { + ParseToDelimeter( input, TChar( KProtocolInfoDelimeter ) ); + CUpnpDlnaProtocolInfo* tmpInfo = NULL; + TRAPD( err, tmpInfo = CUpnpDlnaProtocolInfo::NewL( + input.MarkedToken() ) ); + + if( err == KErrNone && tmpInfo ) + { + // Transfer ownership of tmpInfo + iSinkProtocolInfo.Append( tmpInfo ); + } + else + { + __LOG1( "CUpnpDlnaProtocolInfo::NewL failed: %d", err ); + } + + if( !input.Eos() ) + { + input.SkipAndMark( 1 ); // Skip the delimeter + } + } + CleanupStack::PopAndDestroy( buffer ); + } + __LOG( "CUpnpAVDeviceExtended::SetSinkProtocolInfoL end" ); + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::SinkProtocolInfo +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +const RPointerArray& + CUpnpAVDeviceExtended::SinkProtocolInfo() const + { + return iSinkProtocolInfo; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::SetSourceProtocolInfoL +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +void CUpnpAVDeviceExtended::SetSourceProtocolInfoL( + const TDesC8& aProtocolInfo ) + { + __LOG( "CUpnpAVDeviceExtended::SetSourceProtocolInfoL" ); + HBufC8* buffer = RemoveIllegalCharactersL( aProtocolInfo ); + if( buffer ) + { + CleanupStack::PushL( buffer ); + TLex8 input( *buffer ); + + while( !input.Eos() ) + { + ParseToDelimeter( input, TChar( KProtocolInfoDelimeter ) ); + CUpnpDlnaProtocolInfo* tmpInfo = NULL; + TRAPD( err, tmpInfo = CUpnpDlnaProtocolInfo::NewL( + input.MarkedToken() ) ); + + if( err == KErrNone && tmpInfo ) + { + // Transfer ownership of tmpInfo + iSourceProtocolInfo.Append( tmpInfo ); + } + else + { + __LOG1( "CUpnpDlnaProtocolInfo::NewL failed: %d", err ); + } + + if( !input.Eos() ) + { + input.SkipAndMark( 1 ); // Skip the delimeter + } + } + CleanupStack::PopAndDestroy( buffer ); + } + __LOG( "CUpnpAVDeviceExtended::SetSourceProtocolInfoL end" ); + } +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::SourceProtocolInfo +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +const RPointerArray& + CUpnpAVDeviceExtended::SourceProtocolInfo() const + { + return iSourceProtocolInfo; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::SetLocal +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +void CUpnpAVDeviceExtended::SetLocal( TBool aLocal ) + { + iLocal = aLocal; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::Local +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +TBool CUpnpAVDeviceExtended::Local() const + { + return iLocal; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::MatchSinkProtocolInfo +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +TBool CUpnpAVDeviceExtended::MatchSinkProtocolInfo( + const TDesC8& aInfo ) const + { + __LOG( "CUpnpAVDeviceExtended::MatchSinkProtocolInfo" ); + + TBool match = EFalse; + + if( DlnaCompatible() && DLNADeviceType() == CUpnpAVDeviceExtended::EDMR ) + { + // The device is DLNA compatible + + // Try try find PN parameter to determine if it's dlna content + if( aInfo.Find( KDlnaPn ) != KErrNotFound ) + { + __LOG( "MatchSinkProtocolInfo - DLNA content and the renderer \ +is DLNA compatible, start matching..." ); + + match = MatchSinkProfileId( aInfo ); + if( !match ) + { + // if profile id was not found try matching mime + match = MatchSinkMime( aInfo ); + } + } + else + { + __LOG( "MatchSinkProtocolInfo - Non DLNA content and the \ +renderer is DLNA compatible, start matching..." ); + match = MatchSinkMime( aInfo ); + } + } + else + { + __LOG( "MatchSinkProtocolInfo - Renderer is not DLNA compatible, \ +start matching..." ); + match = MatchSinkMime( aInfo ); + } + + return match; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::MatchSourceProtocolInfo +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +TBool CUpnpAVDeviceExtended::ValidateTransfer( + const TDesC8& aInfo ) const + { + __LOG( "CUpnpAVDeviceExtended::MatchSourceProtocolInfo" ); + + // Try try find PN parameter to determine if it's dlna content + TBool match = EFalse; + if( aInfo.Find( KDlnaPn ) != KErrNotFound ) + { + match = MatchSourceProfileId( aInfo ); + } + + return match; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::MatchSinkProfileId +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +TBool CUpnpAVDeviceExtended::MatchSinkProfileId( + const TDesC8& aInfo ) const + { + __LOG( "CUpnpAVDeviceExtended::MatchSinkProfileId" ); + + TBool match = EFalse; + CUpnpDlnaProtocolInfo* tmpInfo = NULL; + TRAPD( err, tmpInfo = CUpnpDlnaProtocolInfo::NewL( aInfo ) ); + if ( err == KErrNone ) + { + // Match the first parameter and PN parameter + TInt count = iSinkProtocolInfo.Count(); + for( TInt i = 0; i < count; i++ ) + { + if( iSinkProtocolInfo[ i ]->PnParameter() == + tmpInfo->PnParameter() ) + { + // PN parameter matches, try matching the first + // parameter + if( iSinkProtocolInfo[ i ]->FirstField() == + tmpInfo->FirstField() || + iSinkProtocolInfo[ i ]->FirstField() == + KAsterisk ) + { + __LOG( "MatchSinkProfileId - a match" ); + + // We have a match! + i = count; + match = ETrue; + } + } + } + delete tmpInfo; + } + return match; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::MatchSourceProfileId +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +TBool CUpnpAVDeviceExtended::MatchSourceProfileId( + const TDesC8& aInfo ) const + { + __LOG( "CUpnpAVDeviceExtended::MatchSourceProfileId" ); + + TBool match = EFalse; + CUpnpDlnaProtocolInfo* tmpInfo = NULL; + TRAPD( err, tmpInfo = CUpnpDlnaProtocolInfo::NewL( aInfo ) ); + if ( err == KErrNone ) + { + // Match the first parameter and PN parameter + TInt count = iSourceProtocolInfo.Count(); + for( TInt i = 0; i < count; i++ ) + { + if( iSourceProtocolInfo[ i ]->PnParameter() == + tmpInfo->PnParameter() ) + { + // PN parameter matches, try matching the first + // parameter + if( iSourceProtocolInfo[ i ]->FirstField() == + tmpInfo->FirstField() || + iSourceProtocolInfo[ i ]->FirstField() == + KAsterisk ) + { + __LOG( "MatchSourceProfileId - a match" ); + + // We have a match! + i = count; + match = ETrue; + } + } + } + delete tmpInfo; + } + return match; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::MatchSinkMime +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +TBool CUpnpAVDeviceExtended::MatchSinkMime( const TDesC8& aInfo ) const + { + __LOG( "CUpnpAVDeviceExtended::MatchSinkMime" ); + + TBool match = EFalse; + CUpnpDlnaProtocolInfo* tmpInfo = NULL; + TRAPD( err, tmpInfo = CUpnpDlnaProtocolInfo::NewL( aInfo ) ); + if ( err == KErrNone ) + { + // Match the first parameter and mime-type + TInt count = iSinkProtocolInfo.Count(); + for( TInt i = 0; i < count; i++ ) + { + if( iSinkProtocolInfo[ i ]->ThirdField() == + tmpInfo->ThirdField() ) + { + // Mime-parameter matches, try matching the first + // parameter + if( iSinkProtocolInfo[ i ]->FirstField() == + tmpInfo->FirstField() ) + { + __LOG( "MatchSinkMime - a match" ); + + // We have a match! + i = count; + match = ETrue; + } + } + } + delete tmpInfo; + } + return match; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::FindFirstMatchingInSinkL +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +const TDesC8& CUpnpAVDeviceExtended::FindFirstMatchingInSinkL( + const CUpnpItem& aItem ) const + { + __LOG( "CUpnpAVDeviceExtended::FindFirstMatchingInSinkL" ); + + RUPnPElementsArray array; + CleanupClosePushL( array ); + + UPnPItemUtility::GetResElements( aItem, array ); + TBool match = EFalse; + TInt i; + + TInt count = array.Count(); + for( i = 0; i < count; i ++ ) + { + const CUpnpAttribute& protocolInfo = + UPnPItemUtility::FindAttributeByNameL( + *array[ i ], KProtocolInfo ); + + if( MatchType( aItem.ObjectClass(), protocolInfo.Value() ) ) + { + if( MatchSinkProtocolInfo( protocolInfo.Value() ) ) + { + // We have a match! + __LOG( "FindFirstMatchingInSinkL - a match" ); + + match = ETrue; + break; + } + else + { + __LOG( "FindFirstMatchingInSinkL - not a match" ); + } + } + else + { + // Res-elements mime-type does not match to object-class + // Ignore + __LOG( "FindFirstMatchingInSinkL - Res doesn't match \ +to objectclass" ); + } + } + + if( !match ) + { + __LOG( "FindFirstMatchingInSinkL - No match" ); + + User::Leave( KErrNotSupported ); + } + + const TDesC8& uri = array[ i ]->Value(); + + CleanupStack::PopAndDestroy( &array ); + + return uri; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::MatchType +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +TBool CUpnpAVDeviceExtended::MatchType( const TDesC8& aObjectClass, + const TDesC8& aProtocolInfo ) const + { + __LOG( "CUpnpAVDeviceExtended::MatchType" ); + + TBool retVal = EFalse; + if( aObjectClass.Find( KClassAudio ) == 0 ) + { + if( aProtocolInfo.Find( KAudioSupport ) >= 0 ) + { + retVal = ETrue; + } + } + else if( aObjectClass.Find( KClassImage ) == 0 ) + { + if( aProtocolInfo.Find( KImageSupport ) >= 0 ) + { + retVal = ETrue; + } + } + else if( aObjectClass.Find( KClassVideo ) == 0 ) + { + if( aProtocolInfo.Find( KVideoSupport ) >= 0 ) + { + retVal = ETrue; + } + } + else + { + __PANICD( __FILE__, __LINE__ ); + } + return retVal; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::SetCapabilitiesBySupportedMimeTypesL +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +void CUpnpAVDeviceExtended::SetCapabilitiesBySupportedMimeTypesL( + const TDesC8& aListOfMimeTypes ) + { + __LOG( "CUpnpAVDeviceExtended::SetCapabilitiesBySupportedMimeTypesL" ); + + if( aListOfMimeTypes != KNullDesC8 ) + { + // Update the audio media capability + if( UPnPCommonUtils::IsAudioSupported( aListOfMimeTypes ) ) + { + iAudioMediaCapability = ETrue; + } + else + { + iAudioMediaCapability = EFalse; + } + + // Update the audio media capability + if( UPnPCommonUtils::IsImageSupported( aListOfMimeTypes ) ) + { + iImageMediaCapability = ETrue; + } + else + { + iImageMediaCapability = EFalse; + } + + // Update the video media capability + if( UPnPCommonUtils::IsVideoSupported( aListOfMimeTypes ) ) + { + iVideoMediaCapability = ETrue; + } + else + { + iVideoMediaCapability = EFalse; + } + } + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::SetSourceProtocolInfoL +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +void CUpnpAVDeviceExtended::SetSourceProtocolInfoL( + const RPointerArray& aProtocolInfo ) + { + __LOG( "CUpnpAVDeviceExtended::SetSourceProtocolInfoL" ); + + for( TInt i = 0; i < aProtocolInfo.Count(); i++ ) + { + CUpnpDlnaProtocolInfo* tmpInfo = CUpnpDlnaProtocolInfo::NewL( + aProtocolInfo[ i ]->ProtocolInfoL() ); + iSourceProtocolInfo.Append( tmpInfo ); // Ownership is transferred + } + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::SetSinkProtocolInfoL +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +void CUpnpAVDeviceExtended::SetSinkProtocolInfoL( + const RPointerArray& aProtocolInfo ) + { + __LOG( "CUpnpAVDeviceExtended::SetSinkProtocolInfoL" ); + + for( TInt i = 0; i < aProtocolInfo.Count(); i++ ) + { + CUpnpDlnaProtocolInfo* tmpInfo = CUpnpDlnaProtocolInfo::NewL( + aProtocolInfo[ i ]->ProtocolInfoL() ); + iSinkProtocolInfo.Append( tmpInfo ); // Ownership is transferred + } + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::ParseToDelimeter +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +void CUpnpAVDeviceExtended::ParseToDelimeter( TLex8& aLex, TChar aDelimeter ) + { + aLex.Mark(); + + TChar chr = 0; + TChar edchr = 0; + + while( !aLex.Eos() ) + { + edchr = chr; + chr = aLex.Peek(); + if( chr == aDelimeter && edchr != TChar( KSlash ) ) + { + break; + } + aLex.Inc(); + } + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::RemoveIllegalCharactersL +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- + HBufC8* CUpnpAVDeviceExtended::RemoveIllegalCharactersL( + const TDesC8& aPtr ) const + { + HBufC8* ptrResult = NULL; + TInt i = KErrNotFound; + if ( aPtr.Length() != 0 ) + { + ptrResult = aPtr.AllocL(); + CleanupStack::PushL( ptrResult ); + TPtr8 ptr = ptrResult->Des(); + while( ++i < ptr.Length() ) + { + if( IsIllegalCharacter( ptr[i] ) ) + { + ptr.Delete( i, 1 ); + i--; + } + + } + CleanupStack::Pop( ptrResult ); + } + return ptrResult; + + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::IsIllegalCharacter +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +TBool CUpnpAVDeviceExtended::IsIllegalCharacter( TChar aCharacter ) const + { + + TBool retVal = EFalse; + if ( ( ( aCharacter >= TChar( KUnicodeC0RangeStart ) + && aCharacter <= TChar( KUnicodeC0RangeEnd ) ) + || ( aCharacter >= TChar( KUnicodeC1RangeStart ) + && aCharacter <= TChar( KUnicodeC1RangeEnd ) ) ) ) + { + retVal = ETrue; + } + return retVal; + + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::SetAudioUpload +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +void CUpnpAVDeviceExtended::SetAudioUpload( TBool aAudioUpload ) + { + iAudioUpload = aAudioUpload; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::AudioUpload +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +TBool CUpnpAVDeviceExtended::AudioUpload() const + { + return iAudioUpload; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::SetImageUpload +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +void CUpnpAVDeviceExtended::SetImageUpload( TBool aImageUpload ) + { + iImageUpload = aImageUpload; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::ImageUpload +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +TBool CUpnpAVDeviceExtended::ImageUpload() const + { + return iImageUpload; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::SetVideoUpload +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +void CUpnpAVDeviceExtended::SetVideoUpload( TBool aVideoUpload ) + { + iVideoUpload = aVideoUpload; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::VideoUpload +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +TBool CUpnpAVDeviceExtended::VideoUpload() const + { + return iVideoUpload; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::SetCreateChildContainer +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +void CUpnpAVDeviceExtended::SetCreateChildContainer( + TBool aCreateChildContainer ) + { + iCreateChildContainer = aCreateChildContainer; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::CreateChildContainer +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +TBool CUpnpAVDeviceExtended::CreateChildContainer() const + { + return iCreateChildContainer; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::SetDestroyObject +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +void CUpnpAVDeviceExtended::SetDestroyObject( TBool aDestroyObject ) + { + iDestroyObject = aDestroyObject; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::DestroyObject +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +TBool CUpnpAVDeviceExtended::DestroyObject() const + { + return iDestroyObject; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::SetPInfoReceived +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +void CUpnpAVDeviceExtended::SetPInfoReceived( TBool aPInfoReceived ) + { + iPInfoReceived = aPInfoReceived; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::PInfoReceived +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +TBool CUpnpAVDeviceExtended::PInfoReceived() const + { + return iPInfoReceived; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::PrepareForConnection +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +TBool CUpnpAVDeviceExtended::PrepareForConnection() const + { + return iPrepareForConnection; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::SetPrepareForConnection +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +void CUpnpAVDeviceExtended::SetPrepareForConnection( + TBool aPrepareForConnection ) + { + iPrepareForConnection = aPrepareForConnection; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::SetDLNADeviceType +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +void CUpnpAVDeviceExtended::SetDLNADeviceType( TDLNADeviceType aDeviceType ) + { + iDLNADeviceType = aDeviceType; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::DLNADeviceType +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +CUpnpAVDeviceExtended::TDLNADeviceType + CUpnpAVDeviceExtended::DLNADeviceType() const + { + return iDLNADeviceType; + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::SetIconUrlL +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +void CUpnpAVDeviceExtended::SetIconUrlL( const TInetAddr& aAddress, + const TDesC8& aUrlBase, const TDesC8& aIconUrl ) + { + __LOG8_1( "CUpnpAVDeviceExtended::SetIconUrlL - Base: %S", &aUrlBase ); + __LOG8_1( "CUpnpAVDeviceExtended::SetIconUrlL - Icon: %S", &aIconUrl ); + TBuf< KUrlIpBufLen > ip; + aAddress.Output( ip ); + HBufC8* iconUrl = HBufC8::NewL( KUrlHttp().Length() + ip.Length() + 1 + // 1 for colon + KUrlPortLen + 1 + // 1 for slash + aUrlBase.Length() + 1 + // 1 for slash + aIconUrl.Length() ); + TPtr8 ptr( iconUrl->Des() ); + if ( aUrlBase.Find( KUrlHttp ) == KErrNotFound ) + { + ptr.Copy( KUrlHttp ); + ptr.Append( ip ); + ptr.Append( KUrlColon ); + ptr.AppendNumUC( aAddress.Port() ); + } + EnsureFinalSlash( ptr ); + + TPtrC8 urlBase( RemoveInitial( aUrlBase, KUrlSlash ) ); // Url base without initial slash + ptr.Append( urlBase ); + EnsureFinalSlash( ptr ); + + TPtrC8 icon( RemoveInitial( aIconUrl, KUrlSlash ) ); // Icon url without initial slash + ptr.Append( RemoveInitial( icon, urlBase ) ); // Remove base from icon url if it already contains base + + delete iIconUrl; + iIconUrl = iconUrl; + + __LOG8_1( "CUpnpAVDeviceExtended::SetIconUrlL - Device: %S", &( FriendlyName() ) ); + __LOG8_1( "CUpnpAVDeviceExtended::SetIconUrlL - Url: %S", iIconUrl ); + } + +// -------------------------------------------------------------------------- +// CUpnpAVDeviceExtended::IconUrl +// See upnpavdeviceextended.h +// -------------------------------------------------------------------------- +TPtrC8 CUpnpAVDeviceExtended::IconUrl() const + { + return ( iIconUrl ? *iIconUrl : KNullDesC8() ); + } + +// end of file