--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/upnpsharing/upnpsharingalgorithm/src/upnpcdsliteobjectarray.cpp Wed Nov 03 11:45:09 2010 +0200
@@ -0,0 +1,494 @@
+/*
+* Copyright (c) 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: Implementation of CUpnpCdsLiteObjectArray
+*
+*/
+
+// INCLUDE FILES, SYSTEM
+#include <f32file.h> // TParse
+#include <e32def.h> // const_cast
+#include <escapeutils.h> // ConvertFromUnicodeToUtf8L
+#include <upnpobject.h>
+#include <upnpcontainer.h>
+#include <upnpitem.h>
+#include <upnpelement.h>
+#include "upnpconstantdefs.h"
+
+// INCLUDE FILES, USER
+#include "upnpcdsliteobject.h"
+#include "upnpcdsliteobjectarray.h"
+#include "upnpsharingalgorithmconstants.h"
+#include "upnplog.h"
+
+// CONSTANTS
+_LIT8( KSpace, " ");
+
+// --------------------------------------------------------------------------
+// CUpnpCdsLiteObjectArray::NewL
+// --------------------------------------------------------------------------
+//
+EXPORT_C CUpnpCdsLiteObjectArray* CUpnpCdsLiteObjectArray::NewL()
+ {
+ __LOG( "[CUpnpSharingAlgorithm]\t CUpnpCdsLiteObjectArray::NewL" );
+
+ CUpnpCdsLiteObjectArray* self = new ( ELeave ) CUpnpCdsLiteObjectArray();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+ return self;
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpCdsLiteObjectArray::~CUpnpCdsLiteObjectArray
+// --------------------------------------------------------------------------
+//
+EXPORT_C CUpnpCdsLiteObjectArray::~CUpnpCdsLiteObjectArray()
+ {
+ __LOG( "[CUpnpSharingAlgorithm]\t CUpnpCdsLiteObjectArray::\
+~CUpnpCdsLiteObjectArray" );
+
+ // Empty and close the array
+ iArray.ResetAndDestroy();
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpCdsLiteObjectArray::AppendL
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CUpnpCdsLiteObjectArray::AppendL( CUpnpCdsLiteObject *aObject )
+ {
+ // Validate the parameter
+ if( !aObject ||
+ aObject->Name() == KNullDesC8 ||
+ aObject->ObjectId() == KNullDesC8 ||
+ aObject->ParentId() == KNullDesC8 ||
+ aObject->ObjectClass() == KNullDesC8 ||
+ ( aObject->Type() != CUpnpCdsLiteObject::EContainer &&
+ aObject->Type() != CUpnpCdsLiteObject::EItem &&
+ aObject->Type() != CUpnpCdsLiteObject::EItemReference ) ||
+ ( aObject->Type() == CUpnpCdsLiteObject::EItemReference &&
+ aObject->OriginalItemIdL() == KNullDesC8 ) )
+ {
+ User::Leave( KErrArgument );
+ }
+
+ // Append the item into the array. Leave if there is a problem.
+ TInt appendError = iArray.Append( aObject );
+ if( appendError != KErrNone )
+ {
+ User::Leave( appendError );
+ }
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpCdsLiteObjectArray::FindByName
+// --------------------------------------------------------------------------
+//
+EXPORT_C TInt CUpnpCdsLiteObjectArray::FindByName( TDesC8& aName )
+ {
+ __LOG( "[CUpnpSharingAlgorithm]\t CUpnpCdsLiteObjectArray::FindByName" );
+ TInt returnvalue = KErrNotFound;
+
+ // Continue only if the given parameter is valid
+ if( aName != KNullDesC8 )
+ {
+ // Go through the array
+ for( TInt index=0; index<iArray.Count(); index++ )
+ {
+ // if a match is found, exit the loop
+ if( aName.Match( iArray[index]->Name() ) >= 0 )
+ {
+ returnvalue = index;
+ index = iArray.Count() + 1;
+ }
+ }
+ }
+ return returnvalue;
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpCdsLiteObjectArray::FindByNameAndParentId
+// --------------------------------------------------------------------------
+//
+EXPORT_C TInt CUpnpCdsLiteObjectArray::FindByNameAndParentId(
+ const TDesC8& aName,
+ const TDesC8& aParentId )
+ {
+ __LOG( "[CUpnpSharingAlgorithm]\t CUpnpCdsLiteObjectArray::\
+FindByNameAndParentId" );
+
+ TInt returnvalue = KErrNotFound;
+
+ // Continue only if the given parameter is valid
+ if( aName != KNullDesC8 && aParentId != KNullDesC8 )
+ {
+ // Go through the array
+ for( TInt index=0; index<iArray.Count(); index++ )
+ {
+ // if a match is found, exit the loop
+ if( aName.Match( iArray[index]->Name() ) >= 0 &&
+ aParentId.Match( iArray[index]->ParentId() ) >= 0 )
+ {
+ returnvalue = index;
+ index = iArray.Count() + 1;
+ }
+ }
+ }
+ return returnvalue;
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpCdsLiteObjectArray::FindByMediaClassAndParentId
+// --------------------------------------------------------------------------
+//
+EXPORT_C TInt CUpnpCdsLiteObjectArray::FindByMediaClassAndParentId(
+ const TDesC8& aMediaClass,
+ const TDesC8& aParentId )
+ {
+ __LOG( "[CUpnpSharingAlgorithm]\t CUpnpCdsLiteObjectArray::\
+FindByMediaClassAndParentId" );
+
+ TInt returnvalue = KErrNotFound;
+
+ // Continue only if the given parameter is valid
+ if( aMediaClass != KNullDesC8 &&
+ aParentId != KNullDesC8 )
+ {
+ // Go through the array
+ for( TInt index=0; index<iArray.Count(); index++ )
+ {
+ // if a match is found, exit the loop
+ if( aMediaClass.Match( iArray[index]->ObjectClass() ) >= 0 &&
+ aParentId.Match( iArray[index]->ParentId() ) >= 0 )
+ {
+ returnvalue = index;
+ index = iArray.Count() + 1;
+ }
+ }
+ }
+ return returnvalue;
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpCdsLiteObjectArray::FindByObjectId
+// --------------------------------------------------------------------------
+//
+EXPORT_C TInt CUpnpCdsLiteObjectArray::FindByObjectId(
+ const TDesC8& aObjectId )
+ {
+ __LOG( "[CUpnpSharingAlgorithm]\t CUpnpCdsLiteObjectArray::\
+FindByObjectId" );
+
+ TInt returnvalue = KErrNotFound;
+
+ // Continue only if the given parameter is valid
+ if( aObjectId != KNullDesC8 )
+ {
+ // Go through the array
+ for( TInt index=0; index<iArray.Count(); index++ )
+ {
+ // if a match is found, exit the loop
+ if( aObjectId.Match( iArray[index]->ObjectId() ) >= 0 )
+ {
+ returnvalue = index;
+ index = iArray.Count() + 1;
+ }
+ }
+ }
+ return returnvalue;
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpCdsLiteObjectArray::FindRefItemIdByOriginalIdL
+// --------------------------------------------------------------------------
+//
+EXPORT_C TInt CUpnpCdsLiteObjectArray::FindRefItemIdByOriginalIdL(
+ const TDesC8& aOriginalId )
+ {
+ __LOG( "[CUpnpSharingAlgorithm]\t CUpnpCdsLiteObjectArray::\
+FindRefItemIdByOriginalIdL" );
+
+ TInt returnvalue = KErrNotFound;
+
+ // Continue only if the given parameter is valid
+ if( aOriginalId != KNullDesC8 )
+ {
+ // Go through the array
+ for( TInt index=0; index<iArray.Count(); index++ )
+ {
+ // if a match is found, exit the loop
+ if( iArray[index]->Type() ==
+ CUpnpCdsLiteObject::EItemReference &&
+ aOriginalId.Match( iArray[index]->OriginalItemIdL() ) >= 0 )
+ {
+ returnvalue = index;
+ index = iArray.Count() + 1;
+ }
+ }
+ }
+ return returnvalue;
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpCdsLiteObjectArray::ChildCount
+// --------------------------------------------------------------------------
+//
+EXPORT_C TInt CUpnpCdsLiteObjectArray::ChildCount( const TDesC8& aObjectId )
+ {
+ __LOG( "[CUpnpSharingAlgorithm]\t CUpnpCdsLiteObjectArray::ChildCount" );
+
+ TInt returnvalue ( 0 );
+
+ // Continue only if the given parameter is valid
+ if( aObjectId != KNullDesC8 )
+ {
+ // Go through the array
+ for( TInt index=0; index<iArray.Count(); index++ )
+ {
+ // if a match is found, increase child count
+ if( aObjectId.Match( iArray[index]->ParentId() ) >= 0 )
+ {
+ returnvalue++;
+ }
+ }
+ }
+ return returnvalue;
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpCdsLiteObjectArray::Count
+// --------------------------------------------------------------------------
+//
+EXPORT_C TInt CUpnpCdsLiteObjectArray::Count( )
+ {
+ return iArray.Count();
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpCdsLiteObjectArray::ObjectAtL
+// --------------------------------------------------------------------------
+//
+EXPORT_C CUpnpCdsLiteObject& CUpnpCdsLiteObjectArray::ObjectAtL(
+ TUint aIndex )
+ {
+ __LOG( "[CUpnpSharingAlgorithm]\t CUpnpCdsLiteObjectArray::ObjectAtL" );
+
+ // Validate the parameter
+ if( aIndex > iArray.Count() )
+ {
+ User::Leave( KErrArgument );
+ }
+
+ // Return a reference to the object
+ CUpnpCdsLiteObject* object = iArray[aIndex];
+ return *object;
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpCdsLiteObjectArray::RemoveObjectAtL
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CUpnpCdsLiteObjectArray::RemoveObjectAtL( TUint aIndex )
+ {
+ __LOG( "[CUpnpSharingAlgorithm]\t CUpnpCdsLiteObjectArray::\
+RemoveObjectAtL" );
+
+ // Validate the parameter
+ if( aIndex > iArray.Count() )
+ {
+ User::Leave( KErrArgument );
+ }
+
+ // Get the pointer from the array
+ CUpnpCdsLiteObject* object = iArray[aIndex];
+
+ // Remove the object and compress the array
+ iArray.Remove( aIndex );
+ iArray.Compress();
+
+ // Delete the object
+ delete object;
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpCdsLiteObjectArray::AppendL
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CUpnpCdsLiteObjectArray::AppendL( const CUpnpObject *aObject )
+ {
+ // First, create a new CreateUpnpCdsLiteObject
+ CUpnpCdsLiteObject* object = CreateUpnpCdsLiteObjectL( aObject );
+ CleanupStack::PushL( object );
+
+ // Append the item to the array
+ AppendL( object );
+ CleanupStack::Pop( object ); // ownership transfered
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpCdsLiteObjectArray::RemoveL
+// --------------------------------------------------------------------------
+//
+EXPORT_C void CUpnpCdsLiteObjectArray::RemoveL( const CUpnpObject *aObject )
+ {
+ __LOG( "[CUpnpSharingAlgorithm]\t CUpnpCdsLiteObjectArray::RemoveL" );
+
+ // First, create a new CreateUpnpCdsLiteObject
+ CUpnpCdsLiteObject* object = CreateUpnpCdsLiteObjectL( aObject );
+ CleanupStack::PushL( object );
+
+ // Search the array and remove the object if found
+ TInt index = FindByObjectId( object->ObjectId() );
+ if( index >= 0 )
+ {
+ RemoveObjectAtL( index );
+ }
+
+ // Clean up
+ CleanupStack::PopAndDestroy( object );
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpCdsLiteObjectArray::CreateUpnpCdsLiteObjectL
+// --------------------------------------------------------------------------
+//
+CUpnpCdsLiteObject* CUpnpCdsLiteObjectArray::CreateUpnpCdsLiteObjectL(
+ const CUpnpObject *aObject )
+ {
+ // Check the param
+ if( !aObject )
+ {
+ User::Leave( KErrArgument );
+ }
+
+ CUpnpCdsLiteObject* object = NULL;
+
+ // Object is a container
+ if( aObject->ObjectClass().Find( KContainerClass() ) >= 0 )
+ {
+ // Cast to container object
+ CUpnpContainer* container = (CUpnpContainer*)aObject;
+
+ // Create the object accordingly
+ object = CUpnpCdsLiteObject::NewL( container->Title(),
+ CUpnpCdsLiteObject::EContainer,
+ container->Id(),
+ container->ParentId(),
+ container->ObjectClass() );
+ CleanupStack::PushL( object );
+ }
+
+ // Object is an item / reference item
+ else if( aObject->ObjectClass().Find( KItemClass() ) >= 0 )
+ {
+ // Cast to container object
+ CUpnpItem* item = (CUpnpItem*)aObject;
+
+ HBufC8* fileName = NULL;
+ // Resolve the type
+ CUpnpCdsLiteObject::TCdsLiteObjectType type =
+ CUpnpCdsLiteObject::EUnknown;
+ if( item->RefId() == KNullDesC8 )
+ {
+ type = CUpnpCdsLiteObject::EItem;
+ fileName = ResolveFileNameL( aObject );
+ CleanupStack::PushL( fileName );
+ }
+ else
+ {
+ type = CUpnpCdsLiteObject::EItemReference;
+ // Set space for reference filename.
+ // Item validation requires that CDS lite object's name field must
+ // be different that KNullDesC8.
+ // Mediaserver doesn't store this field for reference item and it
+ // is KNullDesC8 when structrure is read from server.
+ fileName = KSpace().AllocLC();
+ }
+
+ // Create the object accordingly
+ object = CUpnpCdsLiteObject::NewL( *fileName,
+ type,
+ item->Id(),
+ item->ParentId(),
+ item->ObjectClass() );
+
+ if ( fileName )
+ {
+ CleanupStack::PopAndDestroy( fileName );
+ }
+
+ CleanupStack::PushL( object );
+
+ // Set the reference ID, if necessary
+ if( type == CUpnpCdsLiteObject::EItemReference )
+ {
+ object->SetOriginalItemIdL( item->RefId() );
+ }
+ }
+
+ // Object is neither a container nor an item, leave
+ else
+ {
+ User::Leave( KErrArgument );
+ }
+
+ CleanupStack::Pop( object );
+
+ return object;
+ }
+
+// --------------------------------------------------------------------------
+// CUpnpCdsLiteObjectArray::ResolveFileNameL
+// --------------------------------------------------------------------------
+//
+HBufC8* CUpnpCdsLiteObjectArray::ResolveFileNameL(
+ const CUpnpObject *aObject )
+ {
+ __LOG( "[CUpnpSharingAlgorithm]\t CUpnpCdsLiteObjectArray::\
+ResolveFileNameL" );
+
+ // Check parameter
+ if( !aObject )
+ {
+ User::Leave( KErrArgument );
+ }
+
+ HBufC8* returnValue = NULL;
+
+ // Get all the elements
+ const RUPnPElementsArray& elements =
+ ( const_cast<CUpnpObject*>(aObject) )->GetElements();
+
+ // Find the "res" element
+ for( TInt index=0; index<elements.Count(); index++ )
+ {
+ if( elements[index]->Name() == KElementRes )
+ {
+ // Parse the filename
+ TParse fp;
+ fp.Set( elements[index]->FilePath(), 0, 0 );
+
+ // Full filename (path and drive letter included)
+ returnValue =
+ EscapeUtils::ConvertFromUnicodeToUtf8L( fp.FullName() );
+
+ // Exit the loop
+ index = elements.Count() + 1;
+ }
+ }
+
+ return returnValue;
+ }
+
+// End of file