diff -r 3785f754ee62 -r 5360b7ddc251 upnpframework/upnputilities/src/upnpmetadatafetcher.cpp --- a/upnpframework/upnputilities/src/upnpmetadatafetcher.cpp Fri Sep 17 08:31:21 2010 +0300 +++ b/upnpframework/upnputilities/src/upnpmetadatafetcher.cpp Mon Nov 01 12:37:49 2010 +0200 @@ -1,318 +1,268 @@ -/* -* Copyright (c) 2006-2007 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 metadata fetching utilities. -* -*/ - - -// INCLUDE FILES -// System -#include -#include - -// upnp stack api -#include -#include -#include -#include -#include - -// upnpframework / avcontroller helper api -#include - -// utilities internal -#include "upnpmetadatautility.h" -#include "upnpcommonutils.h" -#include "upnpmetadatafetcher.h" -#include "upnpcdsreselementutility.h" - - -// CONSTANTS -_LIT8( KMimeAudio, "audio" ); -_LIT8( KMimeVideo, "video" ); -_LIT8( KMimeImage, "image" ); -_LIT8( KMimeApplication, "application" ); - -_LIT8( KItemCreator, "None" ); -_LIT8( KRealMediaVideo, "application/x-pn-realmedia" ); - -// -------------------------------------------------------------------------- -// UPnPMetadataFetcher::FetchMetadataL -// Resolves the metadata and fills in the CUpnpObject's metadata fields -// accordingly. -// -------------------------------------------------------------------------- -// -EXPORT_C void UPnPMetadataFetcher::FetchMetadataL( CUpnpObject& aObject, - const TDesC& aFilePath, - const TDesC8& aMimeType ) - { - CUPnPMetaDataUtility* utility = CUPnPMetaDataUtility::NewL(); - CleanupStack::PushL( utility ); - - // APa: Continue even if the loading of meta data fails - // (in S60 3.2 this leaves) - TRAP_IGNORE( utility->LoadMetaDataL( aFilePath ) ); - - // Get the title from metadata is available, if not, use the filename - HBufC8* tempBuf = NULL; - if( utility->Title().Length() > 0 ) - { - tempBuf = UpnpString::FromUnicodeL( utility->Title() ); - CleanupStack::PushL( tempBuf ); - aObject.SetTitleL( *tempBuf ); - CleanupStack::PopAndDestroy( tempBuf ); tempBuf = NULL; - } - else - { - // Remove the path and file extension from the filename - TInt lastDot = 0; - TInt lastSlash = 0; - TInt length = 0; - lastDot = aFilePath.LocateReverseF('.'); - if( KErrNotFound == lastDot ) //if file extension is not found - { - lastDot = aFilePath.Length(); - } - lastSlash = aFilePath.LocateReverseF('\\'); - length = lastDot - lastSlash; - HBufC* strippedFilename = NULL; - strippedFilename = aFilePath.Mid((lastSlash+1), (length-1)).AllocL(); - CleanupStack::PushL( strippedFilename ); - - // Convert to 8bit, and set the UpnpObject's title value - tempBuf = UpnpString::FromUnicodeL( *strippedFilename ); - CleanupStack::PushL( tempBuf ); - aObject.SetTitleL( *tempBuf ); - - // Clean up - CleanupStack::PopAndDestroy( tempBuf ); - tempBuf = NULL; - CleanupStack::PopAndDestroy( strippedFilename ); - strippedFilename = NULL; - } - - const RUPnPElementsArray& elms = aObject.GetElements(); - TInt count = elms.Count(); - TInt i; - TBool found; - - if( aMimeType.Find( KMimeAudio ) >= 0 ) - { - // Set object class - aObject.SetObjectClassL( KClassAudioMusicTrack ); - - // Artist - // Try to find the artist element and update it if found - tempBuf = UpnpString::FromUnicodeL( utility->Artist() ); - if( tempBuf ) - { - CleanupStack::PushL( tempBuf ); - found = EFalse; - for( i = 0; i < count; i++) - { - if( elms[ i ]->Name() == KElementArtist ) - { - elms[ i ]->SetValueL( *tempBuf ); - found = ETrue; - i = count; - } - } - if( !found ) - { - // Not found, create a new artist element and add it to the - // item - CUpnpElement* element = CUpnpElement::NewLC( KElementArtist ); - element->SetValueL( *tempBuf ); - aObject.AddElementL( element ); - CleanupStack::Pop( element ); - } - CleanupStack::PopAndDestroy( tempBuf ); tempBuf = NULL; - - } - - // Genre - // Try to find the genre element and update it if found - tempBuf = UpnpString::FromUnicodeL( utility->Genre() ); - if( tempBuf ) - { - CleanupStack::PushL( tempBuf ); - found = EFalse; - for( i = 0; i < count; i++) - { - if( elms[ i ]->Name() == KElementGenre ) - { - elms[ i ]->SetValueL( *tempBuf ); - found = ETrue; - i = count; - } - } - if( !found ) - { - // Not found, create a new genre element and add it to the - // item - CUpnpElement* element = CUpnpElement::NewLC( KElementGenre ); - element->SetValueL( *tempBuf ); - aObject.AddElementL( element ); - CleanupStack::Pop( element ); - } - CleanupStack::PopAndDestroy( tempBuf ); tempBuf = NULL; - } - - // Album - // Try to find the album element and update it if found - tempBuf = UpnpString::FromUnicodeL( utility->Album() ); - if( tempBuf ) - { - CleanupStack::PushL( tempBuf ); - found = EFalse; - for( i = 0; i < count; i++) - { - if( elms[ i ]->Name() == KElementAlbum ) - { - elms[ i ]->SetValueL( *tempBuf ); - found = ETrue; - i = count; - } - } - if( !found ) - { - // Not found, create a new album element and add it to the - // item - CUpnpElement* element = CUpnpElement::NewLC( KElementAlbum ); - element->SetValueL( *tempBuf ); - aObject.AddElementL( element ); - CleanupStack::Pop( element ); - } - CleanupStack::PopAndDestroy( tempBuf ); tempBuf = NULL; - } - } - else if( aMimeType.Find( KMimeVideo ) >= 0 ) - { - // Set Object class - aObject.SetObjectClassL( KClassVideo ); - } - else if( aMimeType.Find( KMimeImage ) >= 0 ) - { - // Set Object class - aObject.SetObjectClassL( KClassImage ); - } - else if( aMimeType.Find( KMimeApplication ) >= 0 ) - { - // some special cases here - // Fixes EAHN-7ETBH7 - if( aMimeType.Find( KRealMediaVideo ) >= 0 ) - { - aObject.SetObjectClassL( KClassVideo ); - } - } - else - { - // Do nothing - } - - // Date - // Try to find the date element and update it if found - tempBuf = UpnpString::FromUnicodeL( utility->Date() ); - if( tempBuf ) - { - CleanupStack::PushL( tempBuf ); - found = EFalse; - for( i = 0; i < count; i++) - { - if( elms[ i ]->Name() == KElementDate ) - { - elms[ i ]->SetValueL( *tempBuf ); - found = ETrue; - i = count; - } - } - if( !found ) - { - // Not found, create a new date element and add it to the item - CUpnpElement* element = CUpnpElement::NewLC( KElementDate ); - element->SetValueL( *tempBuf ); - aObject.AddElementL( element ); - CleanupStack::Pop( element ); - } - CleanupStack::PopAndDestroy( tempBuf ); tempBuf = NULL; - } - - CUpnpElement* element = CUpnpElement::NewLC( KElementCreator ); - element->SetValueL( KItemCreator ); - aObject.AddElementL( element ); - CleanupStack::Pop( element ); - // Clean up - CleanupStack::PopAndDestroy( utility ); - utility = NULL; - } - -// -------------------------------------------------------------------------- -// UPnPMetadataFetcher::FetchMetadataL -// Resolves the metadata and fills in the CUpnpObject's metadata fields -// accordingly. -// -------------------------------------------------------------------------- -// -EXPORT_C void UPnPMetadataFetcher::FetchMetadataL( CUpnpObject& aObject, - const TDesC& aFilePath ) - { - // Resolve the MIME type of the file - HBufC8* mimeType = NULL; - mimeType = UPnPCommonUtils::ResolveMimeTypeL( aFilePath ); - if( mimeType ) - { - CleanupStack::PushL( mimeType ); - // Fill in the metadata - FetchMetadataL( aObject, aFilePath, *mimeType ); - // Clean up - CleanupStack::PopAndDestroy( mimeType ); - mimeType = NULL; - } - } - -// -------------------------------------------------------------------------- -// UPnPMetadataFetcher::CreateItemFromFileLC -// Creates a new CUpnpItem from a local file. Resolves the metadata and fills -// in the new CUpnpItem's metadata fields accordingly. -// -------------------------------------------------------------------------- -// -EXPORT_C CUpnpItem* UPnPMetadataFetcher::CreateItemFromFileLC( - const TDesC& aFilePath ) - { - CUpnpItem* item = NULL; - item = CUpnpItem::NewL(); - CleanupStack::PushL( item ); - - // Add a res-element to the item - UpnpCdsResElementUtility::AddResElementL( *item, aFilePath ); - // Resolve the metadata - FetchMetadataL( *item, aFilePath ); - - return item; - } - -// -------------------------------------------------------------------------- -// UPnPMetadataFetcher::CreateItemFromFileL -// Creates a new CUpnpItem from a local file. Resolves the metadata and fills -// in the new CUpnpItem's metadata fields accordingly. -// -------------------------------------------------------------------------- -// -EXPORT_C CUpnpItem* UPnPMetadataFetcher::CreateItemFromFileL( - const TDesC& aFilePath ) - { - CUpnpItem* item = CreateItemFromFileLC( aFilePath ); - CleanupStack::Pop( item ); - return item; - } - -// End of File +/* +* Copyright (c) 2006-2007 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 metadata fetching utilities. +* +*/ + + +// INCLUDE FILES +// System +#include +#include + +// upnp stack api +#include +#include +#include +#include +#include + +// upnpframework / avcontroller helper api +#include "upnpconstantdefs.h" + +// utilities internal +#include "upnpmetadatautility.h" +#include "upnpcommonutils.h" +#include "upnpmetadatafetcher.h" +#include "upnpcdsreselementutility.h" + + +// CONSTANTS +_LIT8( KMimeAudio, "audio" ); +_LIT8( KMimeVideo, "video" ); +_LIT8( KMimeImage, "image" ); +_LIT8( KMimeApplication, "application" ); + +_LIT8( KItemCreator, "None" ); +_LIT8( KRealMediaVideo, "application/x-pn-realmedia" ); + +// -------------------------------------------------------------------------- +// UPnPMetadataFetcher::FetchMetadataL +// Resolves the metadata and fills in the CUpnpObject's metadata fields +// accordingly. +// -------------------------------------------------------------------------- +// +EXPORT_C void UPnPMetadataFetcher::FetchMetadataL( CUpnpObject& aObject, + const TDesC& aFilePath, + const TDesC8& aMimeType ) + { + CUPnPMetaDataUtility* utility = CUPnPMetaDataUtility::NewL(); + CleanupStack::PushL( utility ); + + // APa: Continue even if the loading of meta data fails + // (in S60 3.2 this leaves) + TRAP_IGNORE( utility->LoadMetaDataL( aFilePath ) ); + + // Get the title from metadata is available, if not, use the filename + HBufC8* tempBuf = NULL; + if( utility->Title().Length() > 0 ) + { + tempBuf = UpnpString::FromUnicodeL( utility->Title() ); + CleanupStack::PushL( tempBuf ); + aObject.SetTitleL( *tempBuf ); + CleanupStack::PopAndDestroy( tempBuf ); tempBuf = NULL; + } + else + { + // Remove the path and file extension from the filename + TInt lastDot = 0; + TInt lastSlash = 0; + TInt length = 0; + lastDot = aFilePath.LocateReverseF('.'); + if( KErrNotFound == lastDot ) //if file extension is not found + { + lastDot = aFilePath.Length(); + } + lastSlash = aFilePath.LocateReverseF('\\'); + length = lastDot - lastSlash; + HBufC* strippedFilename = NULL; + strippedFilename = aFilePath.Mid((lastSlash+1), (length-1)).AllocL(); + CleanupStack::PushL( strippedFilename ); + + // Convert to 8bit, and set the UpnpObject's title value + tempBuf = UpnpString::FromUnicodeL( *strippedFilename ); + CleanupStack::PushL( tempBuf ); + aObject.SetTitleL( *tempBuf ); + + // Clean up + CleanupStack::PopAndDestroy( tempBuf ); + tempBuf = NULL; + CleanupStack::PopAndDestroy( strippedFilename ); + strippedFilename = NULL; + } + + if( aMimeType.Find( KMimeAudio ) >= 0 ) + { + // Set object class + aObject.SetObjectClassL( KClassAudioMusicTrack ); + + AddElementToObjectL(aObject, + utility->Artist(), + KElementArtist() ); + + + // Genre + // Try to find the genre element and update it if found + + AddElementToObjectL(aObject, + utility->Genre(), + KElementGenre() ); + + + // Album + // Try to find the album element and update it if found + + AddElementToObjectL(aObject, + utility->Album(), + KElementAlbum() ); + + + } + else if( aMimeType.Find( KMimeVideo ) >= 0 ) + { + // Set Object class + aObject.SetObjectClassL( KClassVideo ); + } + else if( aMimeType.Find( KMimeImage ) >= 0 ) + { + // Set Object class + aObject.SetObjectClassL( KClassImage ); + } + else if( aMimeType.Find( KMimeApplication ) >= 0 ) + { + // some special cases here + // Fixes EAHN-7ETBH7 + if( aMimeType.Find( KRealMediaVideo ) >= 0 ) + { + aObject.SetObjectClassL( KClassVideo ); + } + } + else + { + // Do nothing + } + + // Date + // Try to find the date element and update it if found + + AddElementToObjectL(aObject, + utility->Date(), + KElementDate() ); + + + CUpnpElement* element = CUpnpElement::NewLC( KElementCreator ); + element->SetValueL( KItemCreator ); + aObject.AddElementL( element ); + CleanupStack::Pop( element ); + // Clean up + CleanupStack::PopAndDestroy( utility ); + utility = NULL; + } + +// -------------------------------------------------------------------------- +// UPnPMetadataFetcher::FetchMetadataL +// Resolves the metadata and fills in the CUpnpObject's metadata fields +// accordingly. +// -------------------------------------------------------------------------- +// +EXPORT_C void UPnPMetadataFetcher::FetchMetadataL( CUpnpObject& aObject, + const TDesC& aFilePath ) + { + // Resolve the MIME type of the file + HBufC8* mimeType = NULL; + mimeType = UPnPCommonUtils::ResolveMimeTypeL( aFilePath ); + if( mimeType ) + { + CleanupStack::PushL( mimeType ); + // Fill in the metadata + FetchMetadataL( aObject, aFilePath, *mimeType ); + // Clean up + CleanupStack::PopAndDestroy( mimeType ); + mimeType = NULL; + } + } + +// -------------------------------------------------------------------------- +// UPnPMetadataFetcher::CreateItemFromFileLC +// Creates a new CUpnpItem from a local file. Resolves the metadata and fills +// in the new CUpnpItem's metadata fields accordingly. +// -------------------------------------------------------------------------- +// +EXPORT_C CUpnpItem* UPnPMetadataFetcher::CreateItemFromFileLC( + const TDesC& aFilePath ) + { + CUpnpItem* item = NULL; + item = CUpnpItem::NewL(); + CleanupStack::PushL( item ); + + // Add a res-element to the item + UpnpCdsResElementUtility::AddResElementL( *item, aFilePath ); + // Resolve the metadata + FetchMetadataL( *item, aFilePath ); + + return item; + } + +// -------------------------------------------------------------------------- +// UPnPMetadataFetcher::CreateItemFromFileL +// Creates a new CUpnpItem from a local file. Resolves the metadata and fills +// in the new CUpnpItem's metadata fields accordingly. +// -------------------------------------------------------------------------- +// +EXPORT_C CUpnpItem* UPnPMetadataFetcher::CreateItemFromFileL( + const TDesC& aFilePath ) + { + CUpnpItem* item = CreateItemFromFileLC( aFilePath ); + CleanupStack::Pop( item ); + return item; + } + + +void UPnPMetadataFetcher::AddElementToObjectL(CUpnpObject& aObject, + const TDesC& aMetaDataUtilityName, + const TDesC8& aElementName ) + { + HBufC8* tempBuf = NULL; + const RUPnPElementsArray& elms = aObject.GetElements(); + TInt count = elms.Count(); + TInt i; + TBool found; + tempBuf = UpnpString::FromUnicodeL( aMetaDataUtilityName ); + if( tempBuf ) + { + CleanupStack::PushL( tempBuf ); + found = EFalse; + for( i = 0; i < count; i++) + { + if( elms[ i ]->Name() == aElementName ) + { + elms[ i ]->SetValueL( *tempBuf ); + found = ETrue; + i = count; + } + } + if( !found ) + { + // Not found, create a new element and add it to the item + CUpnpElement* element = CUpnpElement::NewLC( aElementName ); + element->SetValueL( *tempBuf ); + aObject.AddElementL( element ); + CleanupStack::Pop( element ); + } + CleanupStack::PopAndDestroy( tempBuf ); tempBuf = NULL; + } + + } + +// End of File