--- /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 <e32base.h>
+#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<UpnpSSDP::KIPAddBuffLen> 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<CUpnpDeviceLibraryElement*>(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