engine/src/MetaDataReader.cpp
author Sebastian Brannstrom <sebastianb@symbian.org>
Sun, 31 Oct 2010 14:15:37 +0000
branchRCL_3
changeset 321 7a0fb290f9c6
parent 35 66c5303f3610
child 228 c553fa9dcbe5
permissions -rw-r--r--
Re-enabled max items parsed, because disabling this causes shows to turn up as new multiple times. This again breaks feeds that add new shows at the bottom, so we need to solve this properly.

/*
* 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;
	}

	TRAP_IGNORE(iObserver.ReadMetaDataL(*iShow));
	iPlayer->Stop();
	iShow = NULL;
	TRAP_IGNORE(ParseNextShowL());
}

void CMetaDataReader::SetIgnoreTrackNo(TBool aIgnoreTrackNo)
	{
	iIgnoreTrackNo = aIgnoreTrackNo;
	}