diff -r 000000000000 -r 71ca22bcf22a mmserv/metadatautility/Src/MetaDataParserDcf2.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmserv/metadatautility/Src/MetaDataParserDcf2.cpp Tue Feb 02 01:08:46 2010 +0200 @@ -0,0 +1,339 @@ +/* +* Copyright (c) 2004 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: This class implements an 3gp metadata parser as specified in +* www.3gpp.org (specification 3GPP TS 26.244 V6.0.0). +* +*/ + + + +// INCLUDE FILES +#include +#include "MetaDataParserDcf2.h" +#include "MetaDataParserFactory.h" +#ifdef _DEBUG +#include +#endif + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CMetaDataParserDcf2::CMetaDataParserDcf2 +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CMetaDataParserDcf2::CMetaDataParserDcf2() + { + } + +// ----------------------------------------------------------------------------- +// CMetaDataParserDcf2::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CMetaDataParserDcf2::ConstructL() + { + } + +// ----------------------------------------------------------------------------- +// CMetaDataParserDcf2::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CMetaDataParserDcf2* CMetaDataParserDcf2::NewL() + { +#ifdef _DEBUG + RDebug::Print(_L("CMetaDataParserDcf2::NewL")); +#endif + CMetaDataParserDcf2* self = new( ELeave ) CMetaDataParserDcf2; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// Destructor +CMetaDataParserDcf2::~CMetaDataParserDcf2() + { + } + +// ----------------------------------------------------------------------------- +// CMetaDataParserDcf2::ParseL +// ----------------------------------------------------------------------------- +// +void CMetaDataParserDcf2::ParseL( + const RArray& aWantedFields, + CMetaDataFieldContainer& aContainer ) + { +#ifdef _DEBUG + RDebug::Print(_L("CMetaDataParserDcf2::ParseL")); +#endif + iContainer = &aContainer; + + if ( aWantedFields.Count() == 0 ) + { + ReadMetaDataEntryL(ContentAccess::ETitle, EMetaDataSongTitle); + ReadMetaDataEntryL(ContentAccess::EDescription, EMetaDataComment); + ReadMetaDataEntryL(ContentAccess::EAuthor, EMetaDataComposer); + ReadMetaDataEntryL(ContentAccess::EContentURI, EMetaDataUrl); + ReadMetaDataEntryL(EPerformer, EMetaDataArtist); + ReadMetaDataEntryL(EAlbumTitle, EMetaDataAlbum); + ReadMetaDataEntryL(EAlbumTrack, EMetaDataAlbumTrack); + ReadMetaDataEntryL(EContentVendor, EMetaDataVendor); + ReadMetaDataEntryL(ECopyright, EMetaDataCopyright); + ReadMetaDataEntryL(EGenre, EMetaDataGenre); + ReadMetaDataEntryL(ERatingInfo, EMetaDataRating); + ReadMetaDataEntryL(ERecordingYear, EMetaDataYear); + ReadMetaDataEntryL(ECoverUri, EMetaDataJpeg); + } + else + { + // Look for it in the wanted field array + TInt count( aWantedFields.Count() ); + for ( TInt i = 0; i < count; i++ ) + { + switch ( aWantedFields[ i ] ) + { + case EMetaDataSongTitle: + ReadMetaDataEntryL(ContentAccess::ETitle, EMetaDataSongTitle); + break; + case EMetaDataComment: + ReadMetaDataEntryL(ContentAccess::EDescription, EMetaDataComment); + break; + case EMetaDataComposer: + ReadMetaDataEntryL(ContentAccess::EAuthor, EMetaDataComposer); + break; + case EMetaDataUrl: + ReadMetaDataEntryL(ContentAccess::EContentURI, EMetaDataUrl); + break; + case EMetaDataArtist: + ReadMetaDataEntryL(EPerformer, EMetaDataArtist); + break; + case EMetaDataAlbum: + ReadMetaDataEntryL(EAlbumTitle, EMetaDataAlbum); + break; + case EMetaDataAlbumTrack: + ReadMetaDataEntryL(EAlbumTrack, EMetaDataAlbumTrack); + break; + case EMetaDataVendor: + ReadMetaDataEntryL(EContentVendor, EMetaDataVendor); + break; + case EMetaDataCopyright: + ReadMetaDataEntryL(ECopyright, EMetaDataCopyright); + break; + case EMetaDataGenre: + ReadMetaDataEntryL(EGenre, EMetaDataGenre); + break; + case EMetaDataRating: + ReadMetaDataEntryL(ERatingInfo, EMetaDataRating); + break; + case EMetaDataYear: + ReadMetaDataEntryL(ERecordingYear, EMetaDataYear); + break; + case EMetaDataJpeg: + ReadMetaDataEntryL(ECoverUri, EMetaDataJpeg); + break; + default: + break; + } + } + } + + // check if need to parse from payload + if(aWantedFields.Count() == 0) + { + if ( !((CMetaDataSourceFile*)iSource)->KeyExist() ) + { + return; // no rights + } + // rights present, parse payload for more fields + CMetaDataParser* parser = NULL; + TInt start = 0; + ((CMetaDataSourceFile*)iSource)->Seek(ESeekStart, start); + parser = CMetaDataParserFactory::CreateID3ParserL(*iSource); + if (parser == NULL) + { + TRAPD(err, parser = CMetaDataParserFactory::CreateMP4ParserFileL(*iSource)); + if(err || !parser ) + { + return; // no valid parsers found + } + } + CleanupStack::PushL(parser); + CMetaDataFieldContainer *newContainer = CMetaDataFieldContainer::NewL(); + CleanupStack::PushL(newContainer); + RArray zeroWantedFields; + CleanupClosePushL(zeroWantedFields); + parser->ParseL(zeroWantedFields, *newContainer); + CleanupStack::PopAndDestroy(); // zeroWantedFields + if(newContainer->Count() == 0) + { + CleanupStack::PopAndDestroy(2); // newContainer, parser + return; + } + for(TInt i = 0; i < newContainer->Count(); i++) + { + // copy extra items from new container to container + TMetaDataFieldId newFieldId = EUnknownMetaDataField; + TPtrC data = newContainer->At(i, newFieldId); + TBool found = EFalse; + for(TInt j = 0; j < iContainer->Count(); j++) + { + TMetaDataFieldId fieldId = EUnknownMetaDataField; + iContainer->At(j, fieldId); + if(newFieldId == fieldId) + { + // exists + found = ETrue; + break; + } + } + if(!found) + { + if(newFieldId == EMetaDataJpeg) + { + TPtrC8 data8 = newContainer->Field8(newFieldId); + iContainer->AppendL(newFieldId, data8); + } + else + { + iContainer->AppendL(newFieldId, data); + } + + } + } + CleanupStack::PopAndDestroy(2); // newContainer, parser + return; + } + + if(aWantedFields.Count() <= aContainer.Count()) + { + return; + } + else // parse payload + { + if ( !((CMetaDataSourceFile*)iSource)->KeyExist() ) + { + return; // no rights + } + // rights present, parse payload for more fields + CMetaDataParser* parser = NULL; + TInt start = 0; + ((CMetaDataSourceFile*)iSource)->Seek(ESeekStart, start); + parser = CMetaDataParserFactory::CreateID3ParserL(*iSource); + if (parser == NULL) + { + TRAPD(err, parser = CMetaDataParserFactory::CreateMP4ParserFileL(*iSource)); + if(err || !parser ) + { + return; // no valid parsers found + } + } + CleanupStack::PushL(parser); + // create new wanted fields + RArray newWantedFields; + CleanupClosePushL(newWantedFields); + for(TInt i = 0; i < aWantedFields.Count(); i++) + { + TMetaDataFieldId wantedFieldId = aWantedFields[i]; + TBool found = EFalse; + for(TInt j = 0; j < iContainer->Count(); j++) + { + TMetaDataFieldId parsedFieldId = EUnknownMetaDataField; + iContainer->At(j, parsedFieldId); + if(wantedFieldId == parsedFieldId) + { + // found wanted field id + found = ETrue; + break; + } + } + if(!found) + { + newWantedFields.AppendL(wantedFieldId); + } + } + if(newWantedFields.Count() != 0) + { + parser->ParseL(newWantedFields, *iContainer); + } + CleanupStack::PopAndDestroy(2); // newWantedFields, parser + } + } + +// ----------------------------------------------------------------------------- +// CMetaDataParserDcf2::InitializeFileL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CMetaDataParserDcf2::InitializeFileL(CMetaDataSource* aSource) + { +#ifdef _DEBUG + RDebug::Print(_L("CMetaDataParserDcf2::InitializeFileL")); +#endif + iSource = aSource; + ValidateL(); +#ifdef _DEBUG + RDebug::Print(_L("CMetaDataParserDcf2::InitializeFileL - Done")); +#endif + } + +// ----------------------------------------------------------------------------- +// CMetaDataParserDcf2::ValidateL +// ----------------------------------------------------------------------------- +// +TBool CMetaDataParserDcf2::ValidateL() + { + iExists = ETrue; + return ETrue; + } + +void CMetaDataParserDcf2::ReadMetaDataEntryL(TInt aEntryName, + TMetaDataFieldId aFieldId) + { + if(aEntryName == ECoverUri) + { + HBufC8* pic = NULL; + TInt err = KErrNone; + err = ((CMetaDataSourceFile*)iSource)->GetAttributeL(aEntryName, &pic); + if(err != KErrNone) + { + delete pic; + return; + } + if(pic->Length() > 0) + { + iContainer->AppendL( aFieldId, *pic ); + } + delete pic; + return; + } + // else + TInt err = KErrNone; + TBuf <256> headerValue; + err = ((CMetaDataSourceFile*)iSource)->GetStringAttribute(aEntryName, headerValue); + + if(err != KErrNone) + { + return; + } + TPtrC info = StripTrailingZeroes(headerValue); + if(info.Length() > 0) + { + iContainer->AppendL( aFieldId, info ); + } +} + +// End of File