--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/upnpmediaserver/avobjects/src/upnpobjectlist.cpp Thu Dec 17 08:52:00 2009 +0200
@@ -0,0 +1,321 @@
+/** @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: UPnP container class implementation
+*
+*/
+
+
+// INCLUDE FILES
+#include <e32base.h>
+#include "upnpobject.h"
+#include "upnpobjectlist.h"
+#include "upnpitem.h"
+#include "upnpcontainer.h"
+
+
+
+
+
+
+
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CUpnpObjectList::CUpnpObjectList
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CUpnpObjectList::CUpnpObjectList()
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CUpnpObjectList::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CUpnpObjectList::ConstructL( )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CUpnpObjectList::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpObjectList* CUpnpObjectList::NewL()
+ {
+ CUpnpObjectList* self = NewLC();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+// -----------------------------------------------------------------------------
+// CUpnpObjectList::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpObjectList* CUpnpObjectList::NewLC()
+ {
+ CUpnpObjectList* self = new( ELeave ) CUpnpObjectList;
+ CleanupStack::PushL( self );
+ self->ConstructL( );
+ return self;
+ }
+
+// Destructor
+CUpnpObjectList::~CUpnpObjectList()
+ {
+ iObjects.ResetAndDestroy();
+ }
+
+// -----------------------------------------------------------------------------
+// CUpnpObjectList::AppendObjectL
+// Appends object to internal array.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CUpnpObjectList::AppendObjectL( CUpnpObject& aNewObject )
+ {
+ iObjects.AppendL( &aNewObject );
+ }
+
+// -----------------------------------------------------------------------------
+// CUpnpObjectList::RemoveAndDestroy
+// Removes and destroys object from internal array according to ID.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CUpnpObjectList::RemoveAndDestroy( const TDesC8& aId )
+ {
+ TInt idx = FindObjectIndex(aId);
+ if(idx != KErrNotFound)
+ {
+ delete iObjects[idx];
+ iObjects.Remove(idx);
+ }
+ }
+// -----------------------------------------------------------------------------
+// CUpnpObjectList::Remove
+// Detaches object from internal array according to ID and resturns its address.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpObject* CUpnpObjectList::Remove( const TDesC8& aId )
+ {
+ CUpnpObject* ret = NULL;
+ TInt idx = FindObjectIndex(aId);
+ if(idx != KErrNotFound)
+ {
+ ret = iObjects[idx];
+ iObjects.Remove(idx);
+ }
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CUpnpObjectList::FindObject
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpObject* CUpnpObjectList::FindObject( const TDesC8& aId )
+ {
+ CUpnpObject* ret = NULL;
+ TInt idx = FindObjectIndex(aId);
+ if(idx != KErrNotFound)
+ {
+ ret = iObjects[idx];
+ }
+ return ret;
+ }
+
+// -----------------------------------------------------------------------------
+// CUpnpObjectList::ObjectCount
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TInt CUpnpObjectList::FindObjectIndex(const TDesC8& aObjId) const
+ {
+ TInt ret = KErrNotFound;
+
+ // try to find the object with given id
+ for(TInt i = 0; i < iObjects.Count(); i++)
+ {
+ if(iObjects[i]->Id() == aObjId)
+ {
+ ret = i;
+ // stop searching
+ break;
+ }
+ }
+
+ return ret;
+ }
+// -----------------------------------------------------------------------------
+// CUpnpObjectList::ObjectCount
+// Counts objects
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C TInt CUpnpObjectList::ObjectCount( ) const
+ {
+ return iObjects.Count();
+ }
+
+// -----------------------------------------------------------------------------
+// CUpnpObjectList::GetObjectL
+// Returns object from object array according to index
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CUpnpObject* CUpnpObjectList::operator[]( TInt aIndex ) const
+ {
+ return iObjects[aIndex];
+ }
+
+// -----------------------------------------------------------------------------
+// CUpnpObjectList::ExternalizeL
+// Writes the content to stream.
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CUpnpObjectList::ExternalizeL( RWriteStream& aStream ) const
+ {
+ // Let's write the count of items to stream first
+ aStream.WriteInt16L( iObjects.Count() );
+ for ( TInt i = 0; i < iObjects.Count(); i++ )
+ {
+ // Need to put the type of the object to stream
+ TPckg<TUPnPObjectType> type( iObjects[i]->ObjectType() );
+ aStream << type;
+ // Then the object itself
+ iObjects[i]->ExternalizeL( aStream );
+ }
+ }
+// -----------------------------------------------------------------------------
+// CUpnpObjectList::InternalizeL
+// Fills container information from stream
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CUpnpObjectList::InternalizeL( RReadStream& aStream )
+ {
+ // internalize the objects
+ iObjects.ResetAndDestroy();
+
+ // First the count of individual objects
+ TInt itemCount = aStream.ReadInt16L();
+
+ TUPnPObjectType type = EUPnPItem;
+ TPckg<TUPnPObjectType> typePkg( type );
+
+ // Then internalize them from the stream one by one
+ for (TInt index = 0; index < itemCount; index++ )
+ {
+ aStream >> typePkg;
+
+ switch ( type )
+ {
+ case EUPnPItem:
+ {
+ CUpnpItem* newItem = CUpnpItem::NewL();
+ CleanupStack::PushL( newItem );
+ newItem->InternalizeL( aStream );
+ AppendObjectL( *newItem );
+ CleanupStack::Pop();
+ break;
+ }
+ case EUPnPContainer:
+ {
+ CUpnpContainer* newObj = CUpnpContainer::NewL();
+ CleanupStack::PushL( newObj );
+ newObj->InternalizeL( aStream );
+ AppendObjectL( *newObj );
+ CleanupStack::Pop();
+ break;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ }
+ }
+// -----------------------------------------------------------------------------
+// CUpnpObjectList::ToDes8L
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C HBufC8* CUpnpObjectList::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;
+}
+// -----------------------------------------------------------------------------
+// CUpnpObjectList::ToDes8L
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+EXPORT_C HBufC8* CUpnpObjectList::IdsToDes8L() const
+{
+ // serialize object
+ CBufFlat* buf = CBufFlat::NewL(KDefBufferGranularity);
+ CleanupStack::PushL(buf);
+ RBufWriteStream stream(*buf);
+ CleanupClosePushL(stream);
+
+ // number of elements
+ TInt n = ObjectCount();
+ stream.WriteInt32L(n);
+
+ // write each element
+ for(TInt i = 0; i < n; i++)
+ {
+ stream << ( iObjects[i]->Id() );
+ }
+
+ // 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;
+}
+
+// End of File