diff -r 000000000000 -r 71ca22bcf22a mmserv/metadatautility/Src/MetaDataParser3GPExt.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmserv/metadatautility/Src/MetaDataParser3GPExt.cpp Tue Feb 02 01:08:46 2010 +0200 @@ -0,0 +1,359 @@ +/* +* 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 3GPExt metadata parser +* +*/ + + + +// INCLUDE FILES +#include "MetaDataParser3GPExt.h" +#include "3GPExtParser.h" +#ifdef _DEBUG +#include +#endif + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CMetaDataParser3GPExt::CMetaDataParser3GPExt +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CMetaDataParser3GPExt::CMetaDataParser3GPExt() + { + } + +// ----------------------------------------------------------------------------- +// CMetaDataParser3GPExt::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CMetaDataParser3GPExt::ConstructL() + { + i3GPExtParser = C3GPExtParser::NewL(iMP4Handle); + } + +// ----------------------------------------------------------------------------- +// CMetaDataParser3GPExt::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CMetaDataParser3GPExt* CMetaDataParser3GPExt::NewL() + { +#ifdef _DEBUG + RDebug::Print(_L("CMetaDataParser3GPExt::NewL")); +#endif + CMetaDataParser3GPExt* self = new( ELeave ) CMetaDataParser3GPExt; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// Destructor +CMetaDataParser3GPExt::~CMetaDataParser3GPExt() + { + delete i3GPExtParser; + } + +// ----------------------------------------------------------------------------- +// CMetaDataParser3GPExt::ConvertAndAppendL +// ----------------------------------------------------------------------------- +void CMetaDataParser3GPExt::ConvertAndAppendL( + HBufC8** aBuf8, TMetaDataFieldId aFieldId) + { + CleanupStack::PushL(*aBuf8); + if ((*aBuf8) && (*aBuf8)->Length() > 0) + { + TInt length = (*aBuf8)->Length(); + HBufC* data16 = HBufC::NewLC(length); + TPtr16 titleUnicode(data16->Des()); + TPtrC8 title((*aBuf8)->Des()); + if ( ConvertToUnicodeL(title, titleUnicode) == KErrNone ) + { + iContainer->AppendL(aFieldId, data16->Des()); + } + CleanupStack::PopAndDestroy(data16); // data16 + } + CleanupStack::PopAndDestroy(*aBuf8); // *aBuf8 + (*aBuf8) = NULL; + } + + +// ----------------------------------------------------------------------------- +// CMetaDataParser3GPExt::ParseL +// ----------------------------------------------------------------------------- +void CMetaDataParser3GPExt::ParseL( + const RArray& aWantedFields, + CMetaDataFieldContainer& aContainer) + { + +#ifdef _DEBUG + RDebug::Print(_L("CMetaDataParser3GPExt::ParseL")); +#endif + iContainer = &aContainer; + TInt err = KErrNone; // ignore err as some entry may be extracted without exception + HBufC* buf = NULL; + HBufC8* buf8 = NULL; + + if ( aWantedFields.Count() == 0 ) + { + TRAP(err, i3GPExtParser->GetilstBoxesL(K3GPExtMetaTitleFormat, EMetaDataSongTitle, &buf8)); + if (KErrNone == err) + { + ConvertAndAppendL(&buf8, EMetaDataSongTitle); + } + + TRAP(err, i3GPExtParser->GetilstBoxesL(K3GPExtMetaArtistFormat, EMetaDataArtist, &buf8)); + if (KErrNone == err) + { + ConvertAndAppendL(&buf8, EMetaDataArtist); + } + + TRAP(err, i3GPExtParser->GetilstBoxesL(K3GPExtMetaComposerFormat, EMetaDataComposer, &buf8)); + if (KErrNone == err) + { + ConvertAndAppendL(&buf8, EMetaDataComposer); + } + + TRAP(err, i3GPExtParser->GetilstBoxesL(K3GPExtMetaAlbumFormat, EMetaDataAlbum, &buf8)); + if (KErrNone == err) + { + ConvertAndAppendL(&buf8, EMetaDataAlbum); + } + + TRAP(err, i3GPExtParser->GetilstBoxesL(K3GPExtMetaCommentFormat, EMetaDataComment, &buf8)); + if (KErrNone == err) + { + ConvertAndAppendL(&buf8, EMetaDataComment); + } + + TRAP(err, i3GPExtParser->GetilstBoxesL(K3GPExtMetaGenre, EMetaDataGenre, &buf)); + if (KErrNone == err) + { + AppendL(&buf, EMetaDataGenre); + } + + TRAP(err, i3GPExtParser->GetilstBoxesL(K3GPExtMetaYearFormat, EMetaDataYear, &buf)); + if (KErrNone == err) + { + AppendL(&buf, EMetaDataYear); + } + + TRAP(err, i3GPExtParser->GetilstBoxesL(K3GPExtMetaCustomGenreFormat, EMetaDataRating, &buf8)); + if (KErrNone == err) + { + ConvertAndAppendL(&buf8, EMetaDataGenre); + } + + TRAP(err, i3GPExtParser->GetilstBoxesL(K3GPExtMetaTrack, EMetaDataAlbumTrack, &buf)); + if (KErrNone == err) + { + AppendL(&buf, EMetaDataAlbumTrack); + } + + TRAP(err, GetDurationL(EMetaDataDuration)); + + TRAP(err, i3GPExtParser->GetilstBoxesL(K3GPExtMetaJpeg, EMetaDataJpeg, &buf8)); + if (KErrNone == err) + { + AppendL(&buf8, EMetaDataJpeg); + } + } + + else + { + // Look in the wanted field array + TInt count( aWantedFields.Count() ); + for ( TInt i = 0; i < count; i++ ) + { + switch ( aWantedFields[ i ] ) + { + case EMetaDataSongTitle: + TRAP(err, i3GPExtParser->GetilstBoxesL(K3GPExtMetaTitleFormat, EMetaDataSongTitle, &buf8)); + if (KErrNone == err) + { + ConvertAndAppendL(&buf8, EMetaDataSongTitle); + } + break; + + case EMetaDataComment: + TRAP(err, i3GPExtParser->GetilstBoxesL(K3GPExtMetaCommentFormat, EMetaDataComment, &buf8)); + if (KErrNone == err) + { + ConvertAndAppendL(&buf8, EMetaDataComment); + } + break; + + case EMetaDataAlbumTrack: + TRAP(err, i3GPExtParser->GetilstBoxesL(K3GPExtMetaTrack, EMetaDataAlbumTrack, &buf)); + if (KErrNone == err) + { + AppendL(&buf, EMetaDataAlbumTrack); + } + break; + + case EMetaDataArtist: + TRAP(err, i3GPExtParser->GetilstBoxesL(K3GPExtMetaArtistFormat, EMetaDataArtist, &buf8)); + if (KErrNone == err) + { + ConvertAndAppendL(&buf8, EMetaDataArtist); + } + break; + + case EMetaDataComposer: + TRAP(err, i3GPExtParser->GetilstBoxesL(K3GPExtMetaComposerFormat, EMetaDataComposer, &buf8)); + if (KErrNone == err) + { + ConvertAndAppendL(&buf8, EMetaDataComposer); + } + break; + + case EMetaDataAlbum: + TRAP(err, i3GPExtParser->GetilstBoxesL(K3GPExtMetaAlbumFormat, EMetaDataAlbum, &buf8)); + if (KErrNone == err) + { + ConvertAndAppendL(&buf8, EMetaDataAlbum); + } + break; + + case EMetaDataGenre: + TRAP(err, i3GPExtParser->GetilstBoxesL(K3GPExtMetaGenre, EMetaDataGenre, &buf)); + if (KErrNone == err) + { + AppendL(&buf, EMetaDataGenre); + } + break; + + case EMetaDataDuration: + TRAP(err, GetDurationL(EMetaDataDuration)); + break; + + case EMetaDataYear: + TRAP(err, i3GPExtParser->GetilstBoxesL(K3GPExtMetaYearFormat, EMetaDataYear, &buf)); + if (KErrNone == err) + { + AppendL(&buf, EMetaDataYear); + } + break; + + case EMetaDataRating: + TRAP(err, i3GPExtParser->GetilstBoxesL(K3GPExtMetaCustomGenreFormat, EMetaDataRating, &buf8)); + if (KErrNone == err) + { + ConvertAndAppendL(&buf8, EMetaDataGenre); + } + break; + + case EMetaDataJpeg: + TRAP(err, i3GPExtParser->GetilstBoxesL(K3GPExtMetaJpeg, EMetaDataJpeg, &buf8)); + if (KErrNone == err) + { + AppendL(&buf8, EMetaDataJpeg); + } + break; + + default: + break; + } + } + } + + } + +// ----------------------------------------------------------------------------- +// CMetaDataParser3GPExt::ValidateL +// ----------------------------------------------------------------------------- +// +TBool CMetaDataParser3GPExt::ValidateL() + { +#ifdef _DEBUG + RDebug::Print(_L("CMetaDataParser3GPExt::ValidateL")); +#endif + mp4_u32 audioLength, audioType, timeScale, averateBitRate; + mp4_u8 framesPerSample; + + MP4Err err; + err = MP4ParseRequestAudioDescription(iMP4Handle, &audioLength, &audioType, + &framesPerSample, &timeScale, &averateBitRate); + if ( err == MP4_OK && i3GPExtParser->Is3GPExtMetadataL()) + { + iExists = ETrue; + return ETrue; + } + + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CMetaDataParser3GPExt::AppendL +// ----------------------------------------------------------------------------- +// +void CMetaDataParser3GPExt::AppendL(HBufC** aBuf, TMetaDataFieldId aFieldId) + { + CleanupStack::PushL(*aBuf); + if((*aBuf) && (*aBuf)->Length() > 0) + { + iContainer->AppendL(aFieldId, (*aBuf)->Des()); // copy to container + } + CleanupStack::PopAndDestroy(); // *aBuf + (*aBuf) = NULL; + } + +// ----------------------------------------------------------------------------- +// CMetaDataParser3GPExt::AppendL +// ----------------------------------------------------------------------------- +// +void CMetaDataParser3GPExt::AppendL(HBufC8** aBuf, TMetaDataFieldId aFieldId) + { + CleanupStack::PushL(*aBuf); + if((*aBuf) && (*aBuf)->Length() > 0) + { + iContainer->AppendL(aFieldId, (*aBuf)->Des()); // copy to container + } + CleanupStack::PopAndDestroy(); // *aBuf + (*aBuf) = NULL; + } + + +// ----------------------------------------------------------------------------- +// CMetaDataParser3GPExt::ConvertToUnicodeL +// ----------------------------------------------------------------------------- +// +TInt CMetaDataParser3GPExt::ConvertToUnicodeL(const TDesC8& aDesc, TDes16& aUnicode ) + { + TPtrC8 unicodeData; + TUint characterSetId = 0; + CCnvCharacterSetConverter* charSetConv = CCnvCharacterSetConverter::NewLC(); + TInt state = CCnvCharacterSetConverter::KStateDefault; + + // M4A file format has UTF-8 BigEndian characters. + characterSetId = KCharacterSetIdentifierUtf8; + unicodeData.Set( aDesc ); + + charSetConv->PrepareToConvertToOrFromL(characterSetId, *iCharacterSet, iFs); + TInt err = charSetConv->ConvertToUnicode(aUnicode, unicodeData, state); + +#ifdef _DEBUG + RDebug::Print(_L("CMetaDataParserID3v24::ConvertToUnicode :-> Tag Size[%d] Unicode Tag Size[%d]Bytes Unconverted[%d]"), + unicodeData.Length(), aUnicode.Length(), err); +#endif + + CleanupStack::PopAndDestroy(); // charSetConv + return err; + } + +// End of File