diff -r 000000000000 -r 7f85d04be362 upnpmediaserver/avobjects/src/upnpobject.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/upnpmediaserver/avobjects/src/upnpobject.cpp Thu Dec 17 08:52:00 2009 +0200 @@ -0,0 +1,435 @@ +/** @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: UPnPObject implementation +* +*/ + + +// INCLUDE FILES +#include "upnpobject.h" + + +_LIT8(KContainer,"container"); +_LIT8(KItem,"item"); +_LIT8(KRes,"res"); +_LIT8(KProtocolinfo,"protocolInfo"); + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CUpnpObject::CUpnpObject +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CUpnpObject::CUpnpObject() + { + iRestricted = ETrue; + } + +// Destructor +EXPORT_C CUpnpObject::~CUpnpObject() + { + delete iId; + delete iParentId; + delete iTitle; + delete iObjectClass; + iElements.ResetAndDestroy(); + iElements.Close(); + } + +// ----------------------------------------------------------------------------- +// CUpnpObject::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CUpnpObject::ConstructL( ) + { + iId = KNullDesC8().AllocL(); + iParentId = KNullDesC8().AllocL(); + iTitle = KNullDesC8().AllocL(); + iObjectClass = KNullDesC8().AllocL(); + } + +// ----------------------------------------------------------------------------- +// CUpnpObject::SetIdL +// Sets Object Id +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CUpnpObject::SetIdL( const TDesC8& aId ) + { + HBufC8* tmp = aId.AllocL(); + delete iId; + iId = tmp; + } + +// ----------------------------------------------------------------------------- +// CUpnpObject::Id +// Returns Id of the object. If null, returns KNullDesC8 +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C const TDesC8& CUpnpObject::Id() const + { + return *iId; + } + +// ----------------------------------------------------------------------------- +// CUpnpObject::SetParentIdL +// Sets Parent Id for the object. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CUpnpObject::SetParentIdL( const TDesC8& aParentId ) + { + HBufC8* tmp = aParentId.AllocL(); + delete iParentId; + iParentId = tmp; + } + +// ----------------------------------------------------------------------------- +// CUpnpObject::ParentId +// Returns Parent Id of the object. If null, returns KNullDesC8 +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C const TDesC8& CUpnpObject::ParentId() const + { + return *iParentId; + } + +// ----------------------------------------------------------------------------- +// CUpnpObject::AddElementL +// Returns name of the object. If null, returns KNullDesC8 +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CUpnpObject::AddElementL( CUpnpElement* aNewElement ) + { + if ( aNewElement ) + { + iElements.AppendL( aNewElement ); + } + } + +// ----------------------------------------------------------------------------- +// CUpnpObject::Name +// Returns name of the object. If null, returns KNullDesC8 +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CUpnpObject::RemoveElementL( const CUpnpElement* aNewElement ) + { + for ( TInt index(0); index < iElements.Count(); index++ ) + { + if ( iElements[index] == aNewElement ) + { + iElements.Remove( index ); + break; + } + } + } +// ----------------------------------------------------------------------------- +// CUpnpObject::GetElements +// Returns name of the object. If null, returns KNullDesC8 +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C const RUPnPElementsArray& CUpnpObject::GetElements() + { + return iElements; + } + +// ----------------------------------------------------------------------------- +// CUpnpObject::SetNameL +// Sets name for the object. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CUpnpObject::SetTitleL( const TDesC8& aTitle ) + { + HBufC8* tmp = aTitle.AllocL(); + delete iTitle; + iTitle = tmp; + } + +// ----------------------------------------------------------------------------- +// CUpnpObject::Name +// Returns name of the object. If null, returns KNullDesC8 +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C const TDesC8& CUpnpObject::Title() const + { + return *iTitle; + } +// ----------------------------------------------------------------------------- +// CUpnpObject::SetObjectClassL +// Sets class object for the object. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CUpnpObject::SetObjectClassL( const TDesC8& aObjectClass ) + { + ValidateClassL(aObjectClass); // leaves on error + HBufC8* tmp = aObjectClass.AllocL(); + delete iObjectClass; + iObjectClass = tmp; + } +// ----------------------------------------------------------------------------- +// CUpnpObject::ValidateClassL +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpObject::ValidateClassL(const TDesC8& aObjectClass) +{ + // verify the class + if( ObjectType() == EUPnPContainer ) + { // it must contains "container" string + if( aObjectClass.Find(KContainer) == KErrNotFound ) + { + User::Leave(KErrArgument); + } + } + else if(ObjectType() == EUPnPItem) + {// it must contains "item" string + if( aObjectClass.Find(KItem) == KErrNotFound ) + { + User::Leave(KErrArgument); + } + } + else + { // should never happen + User::Invariant(); + } +} +// ----------------------------------------------------------------------------- +// CUpnpObject::ObjectClass +// Returns objectclass of the object. If null, returns KNullDesC8 +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C const TDesC8& CUpnpObject::ObjectClass() const + { + return *iObjectClass; + } + +// ----------------------------------------------------------------------------- +// CUpnpObject::SetRestriction() +// Sets the restriction info. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CUpnpObject::SetRestricted( TBool aRestriction ) + { + iRestricted = aRestriction; + } + +// ----------------------------------------------------------------------------- +// CUpnpObject::Restriction() +// Gets the restriction info. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool CUpnpObject::Restricted() const + { + return iRestricted; + } + +// ----------------------------------------------------------------------------- +// CUpnpObject::SetWriteStatus() +// Sets the restriction info. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CUpnpObject::SetWriteStatus( TBool aWriteStatus ) + { + iWriteStatus = aWriteStatus; + } + +// ----------------------------------------------------------------------------- +// CUpnpObject::Restriction() +// Gets the restriction info. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool CUpnpObject::WriteStatus() const + { + return iWriteStatus; + } + +// ----------------------------------------------------------------------------- +// CUpnpObject::CopyL +// Copies the content from parameter CUpnpObject to this +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CUpnpObject::CopyL( const CUpnpObject& aObject ) + { + // Check that parameter type is also item + if ( aObject.ObjectType() != ObjectType() ) + { + User::Leave( KErrArgument ); + } + + CBufFlat* buffer = CBufFlat::NewL( sizeof( aObject ) ); + CleanupStack::PushL( buffer ); + + RBufWriteStream outStream; + outStream.Open( *buffer ); + CleanupClosePushL( outStream ); + + RBufReadStream inStream; + inStream.Open( *buffer ); + CleanupClosePushL( inStream ); + + aObject.ExternalizeL( outStream ); + InternalizeL( inStream ); + + CleanupStack::PopAndDestroy( 3 ); // inStream && outStream && buffer + } + +// ----------------------------------------------------------------------------- +// CUpnpObject::BaseExternalizeL +// Writes the content to stream. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpObject::BaseExternalizeL( RWriteStream& aStream ) const + { + + SafeExternalizeL(aStream, Id(), KMaxUpnpObjStringLen); + SafeExternalizeL(aStream, ParentId(), KMaxUpnpObjStringLen); + + aStream.WriteInt8L(Restricted()); + + SafeExternalizeL(aStream, Title(), KMaxUpnpObjStringLen); + SafeExternalizeL(aStream, ObjectClass(), KMaxUpnpObjStringLen); + + // Elements + aStream.WriteInt16L( iElements.Count() ); + for ( TInt index(0); index < iElements.Count(); index++ ) + { + iElements[index]->ExternalizeL( aStream ); + } + } +// ----------------------------------------------------------------------------- +// CUpnpObject::SafeExternalizeL +// Writes safely aNumber of characters from the content to the stream. +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpObject::SafeExternalizeL(RWriteStream& aStream, const TDesC8& aDesc, const TInt aNumber) const +{ + if( aDesc.Length() > aNumber ) + aStream << aDesc.Mid(0, aNumber); + else + aStream << aDesc; +} + +// ----------------------------------------------------------------------------- +// CUpnpObject::BaseInternalizeL +// Fills item information from stream +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CUpnpObject::BaseInternalizeL( RReadStream& aStream ) + { + delete iId; + iId = NULL; + iId = HBufC8::NewL( aStream, KMaxUpnpObjStringLen ); + + delete iParentId; + iParentId = NULL; + iParentId = HBufC8::NewL( aStream, KMaxUpnpObjStringLen ); + iRestricted = aStream.ReadInt8L(); + + // Name (title) + delete iTitle; + iTitle = NULL; + iTitle = HBufC8::NewL( aStream, KMaxUpnpObjStringLen ); + + // ObjectClass + delete iObjectClass; + iObjectClass = NULL; + iObjectClass = HBufC8::NewL( aStream, KMaxUpnpObjStringLen ); + + // Elements internalization + iElements.ResetAndDestroy(); + + // Elements count + TInt elementsCount = aStream.ReadInt16L(); + // Then internalize them from the stream one by one + for (TInt index = 0; index < elementsCount; index++ ) + { + CUpnpElement* newElement = CUpnpElement::NewLC(); + newElement->InternalizeL( aStream ); + iElements.AppendL( newElement ); + CleanupStack::Pop( newElement ); + } + + } +// ----------------------------------------------------------------------------- +// CUpnpObject::ToDes8L +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C HBufC8* CUpnpObject::ToDes8L() const +{ + // serialize object + CBufFlat* buf = CBufFlat::NewL(KDefBufferGranularity); + CleanupStack::PushL(buf); + RBufWriteStream stream(*buf); + CleanupClosePushL(stream); + + stream << *this; + + // create heap descriptor + HBufC8* hbuf = HBufC8::NewLC(buf->Size()); + TPtr8 ptr(hbuf->Des()); + buf->Read(0, ptr, buf->Size()); + + // clean up + CleanupStack::Pop(hbuf); + CleanupStack::PopAndDestroy(&stream); + CleanupStack::PopAndDestroy(buf); + + return hbuf; +} + +// ----------------------------------------------------------------------------- +// CUpnpObject::AddResourceL +// Attaches proper element (resource associated with an UPnP object) to protocolInfo +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CUpnpObject::AddResourceL( const TDesC16& aFilename,const TDesC8& aProtocolinfo ) + { + CUpnpElement* elRes = CUpnpElement::NewL(KRes); + CleanupStack::PushL( elRes ); + elRes->SetFilePathL(aFilename); + + CUpnpAttribute* atImportUri = + CUpnpAttribute::NewL(KProtocolinfo); + CleanupStack::PushL(atImportUri); + atImportUri->SetValueL(aProtocolinfo); + elRes->AddAttributeL(atImportUri); + CleanupStack::Pop(atImportUri); + + AddElementL( elRes ); + CleanupStack::Pop( elRes ); + } +// End of File