diff -r 6369bfd1b60d -r 08b5eae9f9ff upnpsharing/upnpsharingalgorithm/src/upnpcdsliteobjectarray.cpp --- /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 // TParse +#include // const_cast +#include // ConvertFromUnicodeToUtf8L +#include +#include +#include +#include +#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; indexName() ) >= 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; indexName() ) >= 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; indexObjectClass() ) >= 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; indexObjectId() ) >= 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; indexType() == + 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; indexParentId() ) >= 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(aObject) )->GetElements(); + + // Find the "res" element + for( TInt index=0; indexName() == 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