mmserv/metadatautility/Src/MetaDataParserDcf2.cpp
changeset 0 71ca22bcf22a
--- /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 <Oma2Agent.h>
+#include	"MetaDataParserDcf2.h"
+#include	"MetaDataParserFactory.h"
+#ifdef _DEBUG
+#include	<e32svr.h>
+#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<TMetaDataFieldId>& 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<TMetaDataFieldId> 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<TMetaDataFieldId> 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