upnpmediaserver/avobjects/src/upnpobject.cpp
changeset 0 7f85d04be362
--- /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 <res> 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