diff -r 000000000000 -r 7f85d04be362 upnpframework/upnputilities/src/upnpmetadatafetcher.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/upnpframework/upnputilities/src/upnpmetadatafetcher.cpp Thu Dec 17 08:52:00 2009 +0200 @@ -0,0 +1,318 @@ +/* +* 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