engine/src/MetaDataReader.cpp
changeset 2 29cda98b007e
child 35 66c5303f3610
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/engine/src/MetaDataReader.cpp	Thu Feb 25 14:29:19 2010 +0000
@@ -0,0 +1,160 @@
+/*
+* Copyright (c) 2007-2010 Sebastian Brannstrom, Lars Persson, EmbedDev AB
+*
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:
+* EmbedDev AB - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+#include "MetaDataReader.h"
+#include <utf.h>
+#include <charconv.h>
+#include <eikenv.h>
+#include <mmf\common\mmfMeta.h>
+#include "debug.h"
+
+const TInt KMaxParseBuffer = 1024;
+
+CMetaDataReader::CMetaDataReader(MMetaDataReaderObserver& aObserver, RFs& aFs) : iObserver(aObserver), iFs(aFs)
+{
+	iShow = NULL;
+}
+
+CMetaDataReader::~CMetaDataReader()
+{
+	if( iPlayer )
+		{
+		iPlayer->Close();
+		delete iPlayer;
+		}
+	
+	delete iParseNextShowCallBack;
+	iShowsToParse.Close();
+	delete iCharConverter;
+}
+
+void CMetaDataReader::ConstructL()
+{
+	DP("MetaDataReader::ConstructL");
+	iPlayer = CMdaAudioPlayerUtility::NewL(*this);
+
+	TCallBack callback(ParseNextShowCallbackL, this);
+	iParseNextShowCallBack = new (ELeave)CAsyncCallBack(callback, CActive::EPriorityStandard);
+	iCharConverter = CCnvCharacterSetConverter::NewL();
+	iCharConverter->PrepareToConvertToOrFromL(KCharacterSetIdentifierIso88591, iFs); 
+	iLastConverterCharset = KCharacterSetIdentifierIso88591;
+}
+
+void CMetaDataReader::SubmitShowL(CShowInfo *aShowInfo)
+{
+	DP("SubmitShow");
+	iShowsToParse.Append(aShowInfo);
+	
+	if (iShow == NULL) {
+		ParseNextShowL();
+	}
+}
+
+TInt CMetaDataReader::ParseNextShowCallbackL(TAny* aMetaDataReader)
+{
+	static_cast<CMetaDataReader*>(aMetaDataReader)->ParseNextShowL();
+	return KErrNone;
+}
+
+void CMetaDataReader::ParseNextShowL()
+	{
+	DP("ParseNextShow");
+	iPlayer->Close();
+	if (iShowsToParse.Count() == 0) {
+		DP("No more shows, stopping");
+		iObserver.ReadMetaDataCompleteL();
+		return;
+	}
+	
+	iShow = iShowsToParse[0];
+	iShowsToParse.Remove(0);	
+
+	iPlayer->OpenFileL(iShow->FileName());
+}
+
+void CMetaDataReader::MapcPlayComplete(TInt /*aError*/)
+{
+	
+}
+
+void CMetaDataReader::MapcInitComplete(TInt aError, const TTimeIntervalMicroSeconds &aDuration)
+{
+	DP1("MapcInitComplete, file=%S", &(iShow->FileName()));
+
+
+	if(aError == KErrNone)
+	{
+		HBufC* buf = HBufC::New(KMaxParseBuffer);
+		TInt numEntries = 0;
+		if (buf != NULL && iPlayer->GetNumberOfMetaDataEntries(numEntries) == KErrNone) {
+			DP1("%d meta data entries", numEntries);
+			iShow->SetPlayTime((aDuration.Int64()/1000000));
+			
+			for (int i=0;i<numEntries;i++) {
+				CMMFMetaDataEntry * entry = NULL;
+				TRAPD(error, entry = iPlayer->GetMetaDataEntryL(i));
+				
+				if (error != KErrNone) {
+					continue;
+				}
+											
+				if (entry->Name() == KMMFMetaEntrySongTitle) {
+					buf->Des().Copy(entry->Value());
+					TRAP_IGNORE(iShow->SetTitleL(*buf));
+					DP1("title: %S", &(iShow->Title()));
+				} else if (entry->Name() == _L("artist")) {
+					if (iShow->Description().Length() > 0) {
+						buf->Des().Copy(iShow->Description());
+					}
+					buf->Des().Append(_L("\n"));
+					buf->Des().Append(entry->Value());
+					
+					TRAP_IGNORE(iShow->SetDescriptionL(*buf));
+				} else if (entry->Name() == KMMFMetaEntryAlbum) {
+					if (iShow->Description().Length() > 0) {
+					buf->Des().Copy(iShow->Description());
+					}
+					buf->Des().Append(_L("\n"));
+					buf->Des().Append(entry->Value());
+					
+					TRAP_IGNORE(iShow->SetDescriptionL(*buf));
+				}	
+				else if (entry->Name() == KMMFMetaEntryAlbumTrack) {
+					TLex lexer(entry->Value());
+					TUint value = 0;
+					if(lexer.Val(value) == KErrNone) {
+						iShow->SetTrackNo(value);
+					}
+				}
+				
+			}
+		}
+		delete buf;
+		buf = NULL;
+	}
+
+	iObserver.ReadMetaData(*iShow);
+	iPlayer->Stop();
+	iShow = NULL;
+	TRAP_IGNORE(ParseNextShowL());
+}
+
+void CMetaDataReader::SetIgnoreTrackNo(TBool aIgnoreTrackNo)
+	{
+	iIgnoreTrackNo = aIgnoreTrackNo;
+	}