diff -r 000000000000 -r f5a58ecadc66 upnp/upnpstack/upnputils/src/upnpdevicelibraryelement.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/upnp/upnpstack/upnputils/src/upnpdevicelibraryelement.cpp Tue Feb 02 01:12:20 2010 +0200 @@ -0,0 +1,672 @@ +/** @file +* Copyright (c) 2005-2008 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: CUpnpDeviceLibraryElement +* +*/ + + +// INCLUDE FILES +#include +#include "upnpdevicelibraryelement.h" +#include "upnpssdpmessage.h" +#include "upnpcons.h" +#include "upnpstring.h" + +using namespace UpnpSSDP; + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::CUpnpDeviceLibraryElement +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CUpnpDeviceLibraryElement::CUpnpDeviceLibraryElement(MUpnpTimeoutElementParent& aParent) + : CUpnpTimeoutElement(aParent) + { + iLocal = EFalse; + iFilter = ETrue; + iAdvertised = EFalse; + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CUpnpDeviceLibraryElement::ConstructL() + { + BaseConstructL(); + iUUID = HBufC8::NewL(0); + iDescriptionURL = HBufC8::NewL(0); + iDomain = HBufC8::NewL(0); + iDeviceType = HBufC8::NewL(0); + + iServiceList = new (ELeave) CDesC8ArrayFlat(4); + + iAlive = ETrue; + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CUpnpDeviceLibraryElement* CUpnpDeviceLibraryElement::NewL( + MUpnpTimeoutElementParent& aParent ) + { + CUpnpDeviceLibraryElement* self = new (ELeave) CUpnpDeviceLibraryElement(aParent); + + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(); + + return self; + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::~CUpnpDeviceLibraryElement +// Destructor. +// ----------------------------------------------------------------------------- +// +EXPORT_C CUpnpDeviceLibraryElement::~CUpnpDeviceLibraryElement() + { + Cancel(); + + delete iUUID; + iUUID = NULL; + delete iDescriptionURL; + iDescriptionURL = NULL; + delete iDomain; + iDomain = NULL; + delete iDeviceType; + iDeviceType = NULL; + + if( iServiceList ) + { + iServiceList->Reset(); + delete iServiceList; + } + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::IsRootDevice +// Return iRootDevice. +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool CUpnpDeviceLibraryElement::IsRootDevice() const + { + return iRootDevice; + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::UUID +// Return iUUID. +// ----------------------------------------------------------------------------- +// +EXPORT_C TDesC8& CUpnpDeviceLibraryElement::UUID() + { + return *iUUID; + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::DescriptionURL +// Return iDescriptionURL. +// ----------------------------------------------------------------------------- +// +EXPORT_C TDesC8& CUpnpDeviceLibraryElement::DescriptionUrl() + { + return *iDescriptionURL; + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::Domain +// Return iDomain. +// ----------------------------------------------------------------------------- +// +EXPORT_C TDesC8& CUpnpDeviceLibraryElement::Domain() + { + return *iDomain; + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::DeviceType +// Return iDeviceType. +// ----------------------------------------------------------------------------- +// +EXPORT_C TDesC8& CUpnpDeviceLibraryElement::DeviceType() + { + return *iDeviceType; + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::ServiceList +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C CDesC8Array& CUpnpDeviceLibraryElement::ServiceList() + { + return *iServiceList; + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::AddInfoFromNotificationTypeHeaderL +// +// Supported NT (Notification Type) messages: +// "uuid:" (length: 5 ) +// "upnp:rootdevice" (length: 15) +// "urn:schemas-upnp-org:device:" (length: 28) +// "urn:schemas-upnp-org:service:" (length: 29) +// ----------------------------------------------------------------------------- +// +TBool CUpnpDeviceLibraryElement::AddInfoFromNotificationTypeHeaderL( + CUpnpSsdpMessage* aMessage ) + { + TPtrC8 nt = aMessage->St( ); + + if ( nt.Length( ) == 0 ) + { + nt.Set( aMessage->Nt( ) ); + } + + if ( HasPrefix( nt, KUPnPUuid ) ) + { + // an uuid advertisement + return ETrue; + } + + if ( iDeviceType->Length( ) == 0 ) + { + if ( nt == KUPnPRootDevice ) + { + // a root device advertisement + SetDeviceTypeL( nt ); + return ETrue; + } + + if ( HasPrefix( nt, KUPnPDeviceSchema ) ) + { + // a device advertisement + SetDeviceTypeL( nt ); + return ETrue; + } + } + + if ( HasPrefix( nt, KUPnPServiceSchema ) ) + { + // a service advertisement + AddServiceTypeL( nt ); + return ETrue; + } + + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::AddInfoL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool CUpnpDeviceLibraryElement::AddInfoL( CUpnpSsdpMessage* aMessage, + TInt& aUpdateId ) + { + if ( !aMessage ) + { + return EFalse; + } + + if ( iDescriptionURL->Length() == 0 ) + { + SetDescriptionUrlL( aMessage->Location() ); + } + + TBool updateInc = AddInfoFromNotificationTypeHeaderL( aMessage ); + + //If iUUID message has not been defined, Set it as Message's UUID + if ( iUUID->Length() == 0 ) + { + SetUuidL( aMessage->Uuid() ); + } + else + { + // Set update only when device didn't notify before, always + // when device notify - uuid will be set + updateInc = EFalse; + } + + if ( updateInc ) + { + aUpdateId++; + SetUpdateId(aUpdateId); + } + + return updateInc; + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::AddInfoL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CUpnpDeviceLibraryElement::AddInfoL(const TUpnpAddLocalDevice* anIndex, + const TDesC8& aBuffer, + const TInetAddr& aAddr) + { + if ( !anIndex ) + { + return; + } + + TInt index = 0; + + TPtrC8 uuid = aBuffer.Left(anIndex->iUuidLength); + index += anIndex->iUuidLength; + + TPtrC8 deviceType = aBuffer.Mid(index, anIndex->iDeviceTypeLength); + index += anIndex->iDeviceTypeLength; + + TPtrC8 descriptionUrl = aBuffer.Mid(index, anIndex->iDescriptionUrlLength); + index += anIndex->iDescriptionUrlLength; + + TPtrC8 domain = aBuffer.Mid(index, anIndex->iDomainLength); + index += anIndex->iDomainLength; + + TPtrC8 port = aBuffer.Mid(index, anIndex->iPortNumberLength); + index += anIndex->iPortNumberLength; + + TPtrC8 root = aBuffer.Mid(index, anIndex->iRootDeviceLength); + index += anIndex->iRootDeviceLength; + + if (uuid.Length()> 0) + { + SetUuidL(uuid); + } + + if (deviceType.Length()> 0) + { + SetDeviceTypeL(deviceType); + } + + if (root.Length()> 0) + { + SetRootDevice( ETrue ); + } + else + { + SetRootDevice( EFalse ); + } + + if (descriptionUrl.Length()> 0) + { + if (aAddr.IsUnspecified()) + { + SetDescriptionUrlL(descriptionUrl); + } + else + { + SetDescriptionUrlL(descriptionUrl, aAddr, port); + } + } + + if (domain.Length()> 0) + { + SetDomainL(domain); + } + + for (TInt i=0; i < KMaxServiceCount; i++) + { + TPtrC8 serviceType = aBuffer.Mid(index, anIndex->iServiceLength[i]); + index += anIndex->iServiceLength[i]; + + AddServiceTypeL(serviceType); + } + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::AddInfoL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CUpnpDeviceLibraryElement::AddInfoL(const TUpnpAddLocalDevice* anIndex, + const TDesC8& aBuffer) + { + AddInfoL(anIndex, aBuffer, TInetAddr()); + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::SetUuidL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpDeviceLibraryElement::SetUuidL( const TDesC8& aUUID ) + { + if ( aUUID.Length()> KUdnMaxLength ) + { + User::Leave( KErrOverflow ); + } + + delete iUUID; + iUUID = NULL; + + iUUID = aUUID.AllocL( ); + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::SetDescriptionUrlL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpDeviceLibraryElement::SetDescriptionUrlL( + const TDesC8& aDescriptionURL ) + { + if ( aDescriptionURL.Length( ) > KUrlMaxLength ) + { + User::Leave( KErrOverflow ); + } + + delete iDescriptionURL; + iDescriptionURL = NULL; + + iDescriptionURL = aDescriptionURL.AllocL( ); + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::SetDescriptionUrlL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpDeviceLibraryElement::SetDescriptionUrlL( + const TDesC8& aDescriptionURL, const TInetAddr& aAddr, const TDesC8& aPort ) + { + TBuf addrBuf; + aAddr.Output( addrBuf ); + + HBufC8* addrBuf8 = UpnpString::FromUnicodeL( addrBuf ); + CleanupStack::PushL( addrBuf8 ); + + HBufC8* url = HBufC8::NewLC( (UpnpHTTP::KHTTPUrl().Length( )) + + aDescriptionURL.Length( ) + addrBuf8->Length( ) + + aPort.Length( )+ 2 );//+2 reserved for colon and slashes in url + + url->Des().Append( UpnpHTTP::KHTTPUrl( ) ); + url->Des().Append( *addrBuf8 ); + if ( aPort.Length( ) > 0 ) + { + url->Des().Append( UpnpString::KColon( ) ); + url->Des().Append( aPort ); + } + // After Ip address there should be slash and device Url so device url + // must start with slash + ASSERT( aDescriptionURL.Find( UpnpString::KSlash) == 0 ); + + url->Des().Append( aDescriptionURL ); + + SetDescriptionUrlL( *url ); + + CleanupStack::PopAndDestroy( url ); + CleanupStack::PopAndDestroy( addrBuf8 ); + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::SetDomainL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpDeviceLibraryElement::SetDomainL(const TDesC8& aDomain) + { + if ( aDomain.Length( ) > KDeviceTypeBufferLength ) + { + User::Leave( KErrOverflow ); + } + + delete iDomain; + iDomain = NULL; + + iDomain = aDomain.AllocL(); + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::SetDeviceTypeL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpDeviceLibraryElement::SetDeviceTypeL(const TDesC8& aDeviceType) + { + if ( aDeviceType.Length( ) > KDeviceTypeBufferLength ) + { + User::Leave( KErrOverflow ); + } + + delete iDeviceType; + iDeviceType = NULL; + + iDeviceType = aDeviceType.AllocL(); + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::AddServiceTypeL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpDeviceLibraryElement::AddServiceTypeL( const TDesC8& aServiceType ) + { + if ( aServiceType.Length() > 0 ) + { + if ( aServiceType.Length() > KServiceTypeBufferLength ) + { + User::Leave( KErrOverflow ); + } + // check if this service type is already mentioned + // in the service type list + TInt foundIdx; + + if ( iServiceList->Find( aServiceType, foundIdx ) == 0 ) + { + return; + } + + // else, append the new service type to the list + iServiceList->AppendL( aServiceType ); + } + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::AsTDeviceL +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C TUpnpDevice* CUpnpDeviceLibraryElement::AsTDeviceL() const + { + TUpnpDevice* dev = new (ELeave) TUpnpDevice; + dev->Set(const_cast(this)); + return dev; + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::UpdateId +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C TInt CUpnpDeviceLibraryElement::UpdateId() const + { + return iUpdateId; + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::SetUpdateId +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CUpnpDeviceLibraryElement::SetUpdateId(TInt aUpdateId) + { + iUpdateId = aUpdateId; + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::SetAlive +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CUpnpDeviceLibraryElement::SetAlive(TBool aAlive) + { + iAlive = aAlive; + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::Alive +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool CUpnpDeviceLibraryElement::Alive() const + { + return iAlive; + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::SetLocal +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpDeviceLibraryElement::SetLocal(TBool aLocal) + { + iLocal = aLocal; + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::Local +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool CUpnpDeviceLibraryElement::Local() const + { + return iLocal; + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::SetFilter +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpDeviceLibraryElement::SetFilter(TBool aFilter) + { + iFilter = aFilter; + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::Filter +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CUpnpDeviceLibraryElement::Filter() const + { + return iFilter; + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::Expired +// +// ----------------------------------------------------------------------------- +// +TBool CUpnpDeviceLibraryElement::Expired() const + { + return iExpired; + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::SetExpired +// +// ----------------------------------------------------------------------------- +// +void CUpnpDeviceLibraryElement::SetExpired( TBool aExpired ) + { + iExpired = aExpired; + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::SetRootDevice +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpDeviceLibraryElement::SetRootDevice(TBool aRootDevice) + { + iRootDevice = aRootDevice; + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::Advertised +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CUpnpDeviceLibraryElement::Advertised() + { + return iAdvertised; + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::Advertising +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpDeviceLibraryElement::Advertising() + { + iAdvertised = ETrue; + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::AdvertisingFinished +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpDeviceLibraryElement::AdvertisingFinished() + { + iAdvertised = EFalse; + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceLibraryElement::HasPrefix +// +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +TBool CUpnpDeviceLibraryElement::HasPrefix( const TDesC8& aDescriptor, + const TDesC8& aPrefix ) + { + return (aDescriptor.Left( aPrefix.Length( ) ) == aPrefix ); + } + +// End of File