diff -r 000000000000 -r f5a58ecadc66 upnp/upnpstack/serviceframework/src/upnpdevicedescriptionstore.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/upnp/upnpstack/serviceframework/src/upnpdevicedescriptionstore.cpp Tue Feb 02 01:12:20 2010 +0200 @@ -0,0 +1,504 @@ +/** @file +* Copyright (c) 2006-2009 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: UPnP Device Description Store +* +*/ + + +#include + +#include +#include +#include "upnpfileutils.h" +#include "upnpicon.h" +#include "upnpdevice.h" +#include "upnpcontenthandlerscontroller.h" + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// CUpnpDeviceDescriptionStore::NewL() +// Two phased constructor +// --------------------------------------------------------------------------- +// +EXPORT_C CUpnpDeviceDescriptionStore *CUpnpDeviceDescriptionStore::NewL( + const TDesC& aFilename ) + { + CUpnpDeviceDescriptionStore* self = CUpnpDeviceDescriptionStore::NewLC( aFilename ); + CleanupStack::Pop(); + return self; + } + +// --------------------------------------------------------------------------- +// CUpnpDeviceDescriptionStore::NewLC() +// Two phased constructor, leaves the object onto the CleanupStack +// --------------------------------------------------------------------------- +// +EXPORT_C CUpnpDeviceDescriptionStore* CUpnpDeviceDescriptionStore::NewLC( + const TDesC& aFilename ) + { + CUpnpDeviceDescriptionStore* self = new (ELeave) CUpnpDeviceDescriptionStore(); + CleanupStack::PushL( self ); + self->ConstructL( aFilename ); + return self; + } + +// --------------------------------------------------------------------------- +// CUpnpDeviceDescriptionStore::~CUpnpDeviceDescriptionStore() +// Destructor of CUpnpDeviceDescriptionStore class +// --------------------------------------------------------------------------- +// +CUpnpDeviceDescriptionStore::~CUpnpDeviceDescriptionStore() + { + iFileName.Close(); + iDescription.Close(); + iParser.Close(); + iDOMImpl.Close(); + } + +// --------------------------------------------------------------------------- +// CUpnpDeviceDescriptionStore::DescriptionFile() +// --------------------------------------------------------------------------- +// +EXPORT_C const TDesC& CUpnpDeviceDescriptionStore::DescriptionFile() + { + return iFileName; + } + +// --------------------------------------------------------------------------- +// CUpnpDeviceDescriptionStore::SetPropertyL() +// Sets some property value in an emmbedded device. +// --------------------------------------------------------------------------- +// +EXPORT_C void CUpnpDeviceDescriptionStore::SetPropertyL( const TDesC8& aName, + const TDesC8& aValue, const TDesC8& aUuid ) + { + TXmlEngElement root = iDescription.DocumentElement(); + TXmlEngElement local; + TXmlEngElement property; + RArray elementList; + + TRAPD( error, UpnpDomInterface::GetElementListL( root, elementList, KUdn ) ); + + for ( TInt i( 0); i < elementList.Count() ; i++ ) + { + if ( !elementList[ i ].Value().Compare( aUuid ) ) + { + elementList.Close(); + + TRAP( error, UpnpDomInterface::GetElementListL( root, + elementList, aName ) ); + + if ( elementList.Count() && i < elementList.Count() ) + { + property = elementList[ i ]; + elementList.Close(); + if ( !error ) + { + property.SetValueL( aValue ); + return; + } + } + else + { + User::Leave( KErrNotFound ); + } + } + } + + elementList.Close(); + User::Leave( KErrNotFound ); + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceDescriptionStore::RemoveTagL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CUpnpDeviceDescriptionStore::RemoveTagL( const TDesC8& aTagName ) + { + TXmlEngElement root = iDescription.DocumentElement(); + TXmlEngElement element; + TBool elementFound = EFalse; + + elementFound = UpnpDomInterface::GetElementL( root, element, aTagName ); + if ( elementFound ) + { + UpnpDomInterface::DeleteElement( element ); + } + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceDescriptionStore::AddTagL +// ----------------------------------------------------------------------------- +// +EXPORT_C TXmlEngElement CUpnpDeviceDescriptionStore::AddTagL( const TDesC8& aTagName ) + { + TXmlEngElement root = iDescription.DocumentElement(); + TXmlEngElement level1; + TXmlEngElement level2; + TBool elementFound = EFalse; + + elementFound = UpnpDomInterface::GetElementL( root, level1, KDevice ); + if ( elementFound ) + { + elementFound = UpnpDomInterface::GetElementL( level1, level2, + aTagName ); + if ( !elementFound ) + { + level2 = level1.AddNewElementL( aTagName ); + } + } + return level2; + } + +// --------------------------------------------------------------------------- +// CUpnpDeviceDescriptionStore::AddIconL() +// --------------------------------------------------------------------------- +// +EXPORT_C void CUpnpDeviceDescriptionStore::AddIconL( const CUpnpIcon& aIcon ) + { + TXmlEngElement root = iDescription.DocumentElement(); + TXmlEngElement propertyref; + TXmlEngElement property; + TXmlEngElement propertyiconlist; + TXmlEngElement url; + RArray IconList; + + TRAPD( error, UpnpDomInterface::GetElementL( root, property, KDevice ) ); + if ( !error && property.NotNull() ) + { + TRAPD( error, UpnpDomInterface::GetElementL( property, + propertyiconlist, KIconList ) ); + if ( !error && propertyiconlist.NotNull() ) + { + TRAPD( error, UpnpDomInterface::GetElementListL( + propertyiconlist, IconList, KIcon ) ); + if ( !error && IconList.Count() != 0 ) + { + AddIconElementL( propertyiconlist, aIcon.MimeType(), + aIcon.WidthTPtrC8(), aIcon.HeightTPtrC8(), + aIcon.DepthTPtrC8(), aIcon.Url() ); + } + User::LeaveIfError( error ); + } + else + { + propertyref = property.AddNewElementL( KIconList ); + AddIconElementL( propertyref, aIcon.MimeType(), + aIcon.WidthTPtrC8(), aIcon.HeightTPtrC8(), + aIcon.DepthTPtrC8(), aIcon.Url() ); + } + User::LeaveIfError( error ); + } + User::LeaveIfError( error ); + + IconList.Close(); + } + +// --------------------------------------------------------------------------- +// CUpnpDeviceDescriptionStore::UpdateIconL() +// --------------------------------------------------------------------------- +// +EXPORT_C void CUpnpDeviceDescriptionStore::UpdateIconL( const CUpnpIcon& aIcon ) + { + TXmlEngElement propertyiconlist = GetIconlistElementL(); + TXmlEngElement url; + RArray IconList; + + TRAPD( error, UpnpDomInterface::GetElementListL( propertyiconlist, + IconList, KIcon ) ); + if ( !error && IconList.Count() != 0 ) + { + for ( TInt i=0; i IconList; + + TRAPD( error, UpnpDomInterface::GetElementListL( propertyiconlist, + IconList, KIcon ) ); + if ( !error && IconList.Count()!=0 ) + { + for ( TInt i=0; i elementList; + TPtrC8 urn = KNullDesC8(); + + TRAPD( error, UpnpDomInterface::GetElementListL( root, elementList, KUdn ) ); + + for ( TInt i( 0); i < elementList.Count() ; i++ ) + { + if ( !elementList[ i ].Value().Compare( aUuid ) ) + { + elementList.Close(); + + TRAP( error, UpnpDomInterface::GetElementListL( root, + elementList, aName ) ); + + if ( elementList.Count() ) + { + property = elementList[ i ]; + + if ( !error && property.Value().Length() ) + { + urn.Set( property.Value() ); + break; + } + } + } + } + elementList.Close(); + return urn; + } + +// --------------------------------------------------------------------------- +// CUpnpDeviceDescriptionStore::SetPropertyL() +// Sets some property value in a root device. +// --------------------------------------------------------------------------- +// +EXPORT_C void CUpnpDeviceDescriptionStore::SetPropertyL( const TDesC8& aName, + const TDesC8& aValue ) + { + TXmlEngElement root = iDescription.DocumentElement(); + TXmlEngElement level1; + + UpnpDomInterface::GetElementL( root, level1, aName ); + + if ( level1.NotNull() ) + { + level1.SetValueL( aValue ); + } + + else if ( !level1.NotNull() ) + { + level1 = AddTagL( aName ); + + if ( level1.NotNull() ) + { + level1.SetValueL( aValue ); + } + } + } + +// --------------------------------------------------------------------------- +// CUpnpDeviceDescriptionStore::Property() +// Gets some property value from a root device. +// --------------------------------------------------------------------------- +// +EXPORT_C TPtrC8 CUpnpDeviceDescriptionStore::Property( const TDesC8& aName ) + { + TXmlEngElement root = iDescription.DocumentElement(); + TXmlEngElement property; + TPtrC8 urn = KNullDesC8(); + + TRAPD( error, UpnpDomInterface::GetElementL( root, property, aName ) ); + + if ( !error && property.NotNull() && property.Value().Length() ) + { + urn.Set( property.Value() ); + } + + return urn; + } + +// --------------------------------------------------------------------------- +// CUpnpDeviceDescriptionStore::SaveL() +// Saves device description file path +// --------------------------------------------------------------------------- +// +EXPORT_C void CUpnpDeviceDescriptionStore::SaveL() + { + if ( UpnpFileUtil::CheckDiskSpaceShortL( EDriveC, KMinSpaceToWriteDescription ) ) + { + User::Leave( KErrDiskFull ); + } + iDescription.SaveL( iFileName ); + } + +// ----------------------------------------------------------------------------- +// CUpnpDeviceDescriptionStore::IconListL +// ----------------------------------------------------------------------------- +// +EXPORT_C RPointerArray< CUpnpIcon > CUpnpDeviceDescriptionStore::IconListL() + { + RPointerArray< CUpnpIcon > iconList; + + HBufC8* descr = UpnpFileUtil::ReadFileL( iFileName ); + CleanupStack::PushL( descr ); + + CUpnpContentHandlersController* controller = CUpnpContentHandlersController::NewLC(); + CUpnpDevice* device = controller->ParseDeviceL( *descr ); + CleanupStack::PopAndDestroy( controller ); + CleanupStack::PushL( device ); + + for ( TInt i = 0; i < device->Icons().Count(); i++ ) + { + iconList.AppendL( device->Icons()[ i ] ); + } + device->Icons().Reset(); + + CleanupStack::PopAndDestroy( device ); + CleanupStack::PopAndDestroy( descr ); + + return iconList; + } + +// --------------------------------------------------------------------------- +// CUpnpDeviceDescriptionStore::CUpnpDeviceDescriptionStore() +// Default C++ constructor +// --------------------------------------------------------------------------- +// +CUpnpDeviceDescriptionStore::CUpnpDeviceDescriptionStore() + { + } + +// --------------------------------------------------------------------------- +// CUpnpDeviceDescriptionStore::ConstructL() +// 2nd phase constructor +// --------------------------------------------------------------------------- +// +void CUpnpDeviceDescriptionStore::ConstructL( const TDesC& aFileName ) + { + iFileName.CreateL( aFileName ); + + HBufC8* descr = UpnpFileUtil::ReadFileL( aFileName ); + CleanupStack::PushL( descr ); + + iDOMImpl.OpenL(); + User::LeaveIfError( iParser.Open( iDOMImpl ) ); + iDescription = iParser.ParseL( *descr ); + CleanupStack::PopAndDestroy( descr ); + } + +// --------------------------------------------------------------------------- +// CUpnpDeviceDescriptionStore::AddIconElementL() +// Adds icon element +// --------------------------------------------------------------------------- +// +void CUpnpDeviceDescriptionStore::AddIconElementL( + TXmlEngElement& aPropertyIcon, const TDesC8& aMimeType, + const TDesC8& aWidth, const TDesC8& aHeight, const TDesC8& aDepth, + const TDesC8& aUrl ) + { + TXmlEngElement propertyIcon = aPropertyIcon.AddNewElementL( KIcon ); + TXmlEngElement propertyref = propertyIcon.AddNewElementL( KMimeType ); + propertyref.SetTextL( aMimeType ); + propertyref = propertyIcon.AddNewElementL( KWidth ); + propertyref.SetTextL( aWidth ); + propertyref = propertyIcon.AddNewElementL( KHeight ); + propertyref.SetTextL( aHeight ); + propertyref = propertyIcon.AddNewElementL( KDepth ); + propertyref.SetTextL( aDepth ); + propertyref = propertyIcon.AddNewElementL( KUrl ); + propertyref.SetTextL( aUrl ); + } + +// End of File