diff -r 000000000000 -r 71ca22bcf22a mmserv/metadatautility/Src/MetaDataUtilityBody.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mmserv/metadatautility/Src/MetaDataUtilityBody.cpp Tue Feb 02 01:08:46 2010 +0200 @@ -0,0 +1,746 @@ +/* +* 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 provides implementation body for the API specified +* by CMetaDataUtility. +* +*/ + + + +// INCLUDE FILES +#include +#include +#include "MetaDataUtilityBody.h" +#include "MetaDataParserFactory.h" +#include "MetaDataParser.h" +#include "MetaDataSourceFile.h" +#include "MetaDataSourceDescriptor.h" +#include "MetaDataBufferAgg.h" +#ifdef _DEBUG +#include +#endif + + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CMetaDataUtilityBody::CMetaDataUtilityBody +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CMetaDataUtilityBody::CMetaDataUtilityBody() + : iContainer(NULL), + iParser(NULL), + iSource(NULL), + iID3Version(ENonID3), + iChunkMode(EFalse), + iBufferAgg(NULL) + { + } + +// ----------------------------------------------------------------------------- +// CMetaDataUtilityBody::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CMetaDataUtilityBody::ConstructL() + { + iContainer = CMetaDataFieldContainer::NewL(); +#ifdef _DEBUG + RDebug::Print(_L("CMetaDataUtilityBody::ConstructL - Done!")); +#endif + } + +// ----------------------------------------------------------------------------- +// CMetaDataUtilityBody::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CMetaDataUtilityBody* CMetaDataUtilityBody::NewL() + { +#ifdef _DEBUG + RDebug::Print(_L("CMetaDataUtilityBody::NewL")); +#endif + CMetaDataUtilityBody* self = new( ELeave ) CMetaDataUtilityBody; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// Destructor +CMetaDataUtilityBody::~CMetaDataUtilityBody() + { + delete iSource; + delete iParser; + delete iContainer; + + CloseChunkData(); + } + +// ----------------------------------------------------------------------------- +// CMetaDataUtilityBody::OpenFileL +// ----------------------------------------------------------------------------- +// +void CMetaDataUtilityBody::OpenFileL( + const TDesC& aFileName, + const RArray& aWantedFields ) + { +#ifdef _DEBUG + RDebug::Print(_L("CMetaDataUtilityBody::OpenFileL (TDesc)")); +#endif + if ( iParser ) + { + User::Leave(KErrAlreadyExists); + } + iParser = FindParserFileL(aFileName); + if ( iParser ) + { + iParser->ParseL(aWantedFields, *iContainer); + } + } + +// ----------------------------------------------------------------------------- +// CMetaDataUtilityBody::OpenFileL +// ----------------------------------------------------------------------------- +// +void CMetaDataUtilityBody::OpenFileL( + RFile& aFile, + const RArray& aWantedFields ) + { +#ifdef _DEBUG + RDebug::Print(_L("CMetaDataUtilityBody::OpenFileL(RFile)")); +#endif + if ( iParser ) + { + User::Leave(KErrAlreadyExists); + } + iParser = FindParserFileL(aFile); + if ( iParser ) + { + iParser->ParseL(aWantedFields, *iContainer); + } + } + +// ----------------------------------------------------------------------------- +// CMetaDataUtilityBody::OpenDesL +// ----------------------------------------------------------------------------- +// +void CMetaDataUtilityBody::OpenDesL( + const TDesC8& aDes, + const RArray& aWantedFields ) + { +#ifdef _DEBUG + RDebug::Print(_L("CMetaDataUtilityBody::OpenDesL")); +#endif + if ( iParser ) + { + User::Leave(KErrAlreadyExists); + } + iParser = FindParserDesL(aDes); + if ( iParser ) + { + iParser->ParseL(aWantedFields, *iContainer); + } + } + +// ----------------------------------------------------------------------------- +// CMetaDataUtilityBody::MetaDataCount +// ----------------------------------------------------------------------------- +// +TInt CMetaDataUtilityBody::MetaDataCount() const + { + return iContainer->Count(); + } + +// ----------------------------------------------------------------------------- +// CMetaDataUtilityBody::MetaDataFieldsL +// ----------------------------------------------------------------------------- +// +const CMetaDataFieldContainer& CMetaDataUtilityBody::MetaDataFieldsL() + { + return *iContainer; + } + +// ----------------------------------------------------------------------------- +// CMetaDataUtilityBody::DoParseChunkDataL +// +// This is a callback from the "Buffer Aggregator" to start parsing after all +// meta-data has been aggregated. +// ----------------------------------------------------------------------------- +// +void CMetaDataUtilityBody::DoParseChunkDataL(TDesC8& aChunk, TDesC8& aMimeType) + { + RArray wantedFields; + CleanupClosePushL( wantedFields ); + OpenDesL( aChunk, wantedFields, aMimeType ); + CleanupStack::PopAndDestroy(); + } + +// ----------------------------------------------------------------------------- +// CMetaDataUtilityBody::InitChunkData +// ----------------------------------------------------------------------------- +// +TInt CMetaDataUtilityBody::InitChunkData( + TDesC8& aMimeType, + MMDUChunkDataObserver& aObserver ) + { + + if ( &aObserver == NULL ) + { + return KErrArgument; + } + + if ( aMimeType.Compare(KMp3MimeType) ) + { + if ( aMimeType.Compare(KMpegMimeType) ) + { + return KErrArgument; + } + } + + TRAPD( err, iBufferAgg = CMetaDataBufferAgg::NewL( this, aMimeType, aObserver ) ); + if ( err ) + { + return err; + } + + iChunkMode = ETrue; + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CMetaDataUtilityBody::ProcessChunkData +// ----------------------------------------------------------------------------- +// +TInt CMetaDataUtilityBody::ProcessChunkData( + TDesC8& aChunk, + TBool aFinalChunk ) + { + + TInt error = iBufferAgg->RequestProcessChunkData( aChunk, aFinalChunk ); + iBufferAgg->ReadyToGo(); + + return error; + } + +// ----------------------------------------------------------------------------- +// CMetaDataUtilityBody::ParseChunkData +// ----------------------------------------------------------------------------- +// +TInt CMetaDataUtilityBody::ParseChunkData() + { + + TInt error = iBufferAgg->RequestParseChunkData(); + iBufferAgg->ReadyToGo(); + + return error; + } + +// ----------------------------------------------------------------------------- +// CMetaDataUtilityBody::IsChunkDataMode +// ----------------------------------------------------------------------------- +// +TBool CMetaDataUtilityBody::IsChunkDataMode() + { + return iChunkMode; + } + +// ----------------------------------------------------------------------------- +// CMetaDataUtility::CloseChunkData +// ----------------------------------------------------------------------------- +// +void CMetaDataUtilityBody::CloseChunkData() + { + iChunkMode = EFalse; + + if ( iBufferAgg ) + { + delete iBufferAgg; + iBufferAgg = NULL; + } + } + + +// ----------------------------------------------------------------------------- +// CMetaDataUtilityBody::FindParserFileL +// ----------------------------------------------------------------------------- +// +CMetaDataParser* CMetaDataUtilityBody::FindParserFileL( + RFile& aFile ) + { +#ifdef _DEBUG + RDebug::Print(_L("CMetaDataUtilityBody::FindParserFileL")); +#endif + iSource = CMetaDataSourceFile::NewL(aFile); + if (iSource) // MetaDataParserRA needs this information + { + ((CMetaDataSourceFile*)iSource)->SetFileHandler(aFile); + ((CMetaDataSourceFile*)iSource)->SetIsFileHandler(ETrue); + } + return DoFindParserFileL(); + } + +// ----------------------------------------------------------------------------- +// CMetaDataUtilityBody::FindParserFileL +// ----------------------------------------------------------------------------- +// +CMetaDataParser* CMetaDataUtilityBody::FindParserFileL( + const TDesC& aFileName ) + { +#ifdef _DEBUG + RDebug::Print(_L("CMetaDataUtilityBody::FindParserFileL")); +#endif + iSource = CMetaDataSourceFile::NewL(aFileName); + return DoFindParserFileL(); + } + +// ----------------------------------------------------------------------------- +// CMetaDataUtilityBody::DoFindParserFileL +// ----------------------------------------------------------------------------- +// +CMetaDataParser* CMetaDataUtilityBody::DoFindParserFileL() + { +#ifdef _DEBUG + RDebug::Print(_L("CMetaDataUtilityBody::DoFindParserFileL")); +#endif + TBool fileProtected = ((CMetaDataSourceFile*)iSource)->FileProtected(); + TBool keyExist = ETrue; + if(fileProtected) + { + keyExist = ((CMetaDataSourceFile*)iSource)->KeyExist(); + } + TInt drmType = ((CMetaDataSourceFile*)iSource)->DrmType(); + + CMetaDataParser* parser = NULL; + // DRMv1 file with no rights, read from DCF header. + if ( (drmType == ContentAccess::EOma1Dcf && !keyExist) || + (drmType == ContentAccess::EOma1DcfBased) ) + { + parser = CMetaDataParserFactory::CreateDcf1FileParserL(*iSource); + if(parser) + { + return parser; + } + else + { + return NULL; + } + } + + if ( drmType == ContentAccess::EOma2Dcf ) + { + parser = CMetaDataParserFactory::CreateDcf2FileParserL(*iSource); + if(parser) + { + return parser; + } + else + { + return NULL; + } + } + + TInt start = 0; + ((CMetaDataSourceFile*)iSource)->Seek(ESeekStart, start); + parser = CMetaDataParserFactory::CreateID3ParserL(*iSource); + if(parser) + { + iID3Version = (TInt)(parser->ID3Version()); + } + + if (parser == NULL) + { + TRAPD(err, parser = CMetaDataParserFactory::CreateMP4ParserFileL(*iSource)); + if(!err && parser ) + { + return parser; + } + } + + if (parser == NULL) + { + TInt start = 0; + ((CMetaDataSourceFile*)iSource)->Seek(ESeekStart, start); + TRAPD(err, parser = CMetaDataParserFactory::CreateWMAParserFileL(*iSource)); + if(!err && parser ) + { + return parser; + } + } + +#ifndef __METADATA_UTILITY_DISABLE_RA_SUPPORT // NOT define + if (parser == NULL) + { + TInt start = 0; + ((CMetaDataSourceFile*)iSource)->Seek(ESeekStart, start); + parser = CMetaDataParserFactory::CreateRAParserL(*iSource); + } +#endif + + return parser; + } + +// ----------------------------------------------------------------------------- +// CMetaDataUtilityBody::FindParserDesL +// ----------------------------------------------------------------------------- +// +CMetaDataParser* CMetaDataUtilityBody::FindParserDesL( + const TDesC8& aDes ) + { +#ifdef _DEBUG + RDebug::Print(_L("CMetaDataUtilityBody::FindParserDesL")); +#endif + CMetaDataParser* parser = NULL; + TRAPD(err, parser = CMetaDataParserFactory::CreateMP4ParserDesL(aDes)); + if ( !err && parser ) + { + return parser; + } + iSource = CMetaDataSourceDescriptor::NewL(aDes); + parser = CMetaDataParserFactory::CreateID3ParserL(*iSource); + if ( !err && parser ) + { + return parser; + } +#ifndef __METADATA_UTILITY_DISABLE_RA_SUPPORT // NOT define + parser = CMetaDataParserFactory::CreateRAParserL(*iSource); +#endif + return parser; + } + +// ----------------------------------------------------------------------------- +// CMetaDataUtilityBody::ResetL +// ----------------------------------------------------------------------------- +// +void CMetaDataUtilityBody::ResetL() + { +#ifdef _DEBUG + RDebug::Print(_L("CMetaDataUtilityBody::ResetL")); +#endif + delete iSource; + iSource = NULL; + delete iParser; + iParser = NULL; + delete iContainer; + iContainer = NULL; + iContainer = CMetaDataFieldContainer::NewL(); + } + + +// ----------------------------------------------------------------------------- +// CMetaDataUtilityBody::ID3Version +// ----------------------------------------------------------------------------- +// +TID3Version CMetaDataUtilityBody::ID3Version() +{ + return (TID3Version)iID3Version; +} + +// ----------------------------------------------------------------------------- +// CMetaDataUtilityBody::OpenFileL with MIME Type info +// ----------------------------------------------------------------------------- +// +void CMetaDataUtilityBody::OpenFileL( + const TDesC& aFileName, + const RArray& aWantedFields, + const TDesC8& aMimeType ) + { + #ifdef _DEBUG + RDebug::Print(_L("CMetaDataUtilityBody::OpenFileL with MimeType")); + #endif + + if ( iParser ) + { + User::Leave(KErrAlreadyExists); + } + + // iParser = FindParserFileL(aFileName); + + if(KErrNone == IsSupportedMimeType(aMimeType)) + { + iParser = FindParserFileL(aFileName, aMimeType); + } + else + { + User::Leave(KErrNotSupported); + } + + if ( iParser ) + { + iParser->ParseL(aWantedFields, *iContainer); + } + } +// ----------------------------------------------------------------------------- +// CMetaDataUtilityBody::OpenFileL with MIME Type info +// ----------------------------------------------------------------------------- +// +void CMetaDataUtilityBody::OpenFileL( + RFile& aFile, + const RArray& aWantedFields, + const TDesC8& aMimeType ) + { + #ifdef _DEBUG + RDebug::Print(_L("CMetaDataUtilityBody::OpenFileL with MimeType")); + #endif + if ( iParser ) + { + User::Leave(KErrAlreadyExists); + } + + //iParser = FindParserFileL(aFile); + + if(KErrNone == IsSupportedMimeType(aMimeType)) + { + iParser = FindParserFileL(aFile, aMimeType); + } + else + { + User::Leave(KErrNotSupported); + } + + //iParser = FindParserFileL(aFile); + if ( iParser ) + { + iParser->ParseL(aWantedFields, *iContainer); + } + } + +// ----------------------------------------------------------------------------- +// CMetaDataUtilityBody::DoFindParserFileL with MIME Type info +// ----------------------------------------------------------------------------- +// +CMetaDataParser* CMetaDataUtilityBody::DoFindParserFileL(const TDesC8& aMimeType) + { + #ifdef _DEBUG + RDebug::Print(_L("CMetaDataUtilityBody::DoFindParserFileL with MimeType")); + #endif + + TBool fileProtected = ((CMetaDataSourceFile*)iSource)->FileProtected(); + TInt drmType = ((CMetaDataSourceFile*)iSource)->DrmType(); + TBool keyExist = ETrue; + if(fileProtected) + { + keyExist = ((CMetaDataSourceFile*)iSource)->KeyExist(); + } + CMetaDataParser* parser = NULL; + // DRMv1 file with no rights, read from DCF header. + if ( (drmType == ContentAccess::EOma1Dcf && !keyExist) || + (drmType == ContentAccess::EOma1DcfBased) ) + { + parser = CMetaDataParserFactory::CreateDcf1FileParserL(*iSource); + if(parser) + { + return parser; + } + else + { + return NULL; + } + } + + if ( drmType == ContentAccess::EOma2Dcf ) + { + parser = CMetaDataParserFactory::CreateDcf2FileParserL(*iSource); + if(parser) + { + return parser; + } + else + { + return NULL; + } + } + + TInt start = 0; + ((CMetaDataSourceFile*)iSource)->Seek(ESeekStart, start); + + if(aMimeType.Compare(KMp3MimeType) == 0 + || aMimeType.Compare(KMpegMimeType) == 0 + || aMimeType.Compare(KAacMimeType) == 0 ) + { + TRAPD(err, parser = CMetaDataParserFactory::CreateID3ParserL(*iSource)); + if(!err && parser) + { + iID3Version = (TInt)(parser->ID3Version()); + return parser; + } + } + else if (aMimeType.Compare(KMp4AudioMimeType) == 0 + || aMimeType.Compare(K3gpAudioMimeType) == 0 + || aMimeType.Compare(K3g2AudioMimeType) == 0 ) + { + TInt start = 0; + ((CMetaDataSourceFile*)iSource)->Seek(ESeekStart, start); + TRAPD(err, parser = CMetaDataParserFactory::CreateMP4ParserFileL(*iSource)); + if(!err && parser ) + { + return parser; + } + } + else if (aMimeType.Compare(KWmaMimeType) == 0) + { + TInt start = 0; + ((CMetaDataSourceFile*)iSource)->Seek(ESeekStart, start); + TRAPD(err, parser = CMetaDataParserFactory::CreateWMAParserFileL(*iSource)); + if(!err && parser) + { + return parser; + } + } +#ifndef __METADATA_UTILITY_DISABLE_RA_SUPPORT // NOT define + else if (aMimeType.Compare(KRApnMimeType) == 0 + || aMimeType.Compare(KRArnMimeType) == 0 + || aMimeType.Compare(KRAxMimeType) == 0 ) + { + TInt start = 0; + ((CMetaDataSourceFile*)iSource)->Seek(ESeekStart, start); + TRAPD(err, parser = CMetaDataParserFactory::CreateRAParserL(*iSource)); + if(!err && parser) + { + return parser; + } + } +#endif + return parser; + } +// ----------------------------------------------------------------------------- +// CMetaDataUtilityBody::FindParserFileL with MIME Type info +// ----------------------------------------------------------------------------- +// +CMetaDataParser* CMetaDataUtilityBody::FindParserFileL( + RFile& aFile, const TDesC8& aMimeType ) + { + #ifdef _DEBUG + RDebug::Print(_L("CMetaDataUtilityBody::FindParserFileL with MimeType")); + #endif + iSource = CMetaDataSourceFile::NewL(aFile); + return DoFindParserFileL(aMimeType); + } + +// ----------------------------------------------------------------------------- +// CMetaDataUtilityBody::FindParserFileL with MIME Type info +// ----------------------------------------------------------------------------- +// +CMetaDataParser* CMetaDataUtilityBody::FindParserFileL( + const TDesC& aFileName, const TDesC8& aMimeType ) + { + #ifdef _DEBUG + RDebug::Print(_L("CMetaDataUtilityBody::FindParserFileL with MimeType")); + #endif + + iSource = CMetaDataSourceFile::NewL(aFileName); + return DoFindParserFileL(aMimeType); + } + +// ----------------------------------------------------------------------------- +// CMetaDataUtilityBody::FindParserDesL with MIME Type info +// ----------------------------------------------------------------------------- +// +CMetaDataParser* CMetaDataUtilityBody::FindParserDesL( + const TDesC8& aDes,const TDesC8& aMimeType ) + { +#ifdef _DEBUG + RDebug::Print(_L("CMetaDataUtilityBody::FindParserDesL with MimeType")); +#endif + CMetaDataParser* parser = NULL; + if (aMimeType.Compare(KMp4AudioMimeType) == 0 + || aMimeType.Compare(K3gpAudioMimeType) == 0 + || aMimeType.Compare(K3g2AudioMimeType) == 0 ) + { + TRAPD(err, parser = CMetaDataParserFactory::CreateMP4ParserDesL(aDes)); + if ( !err && parser ) + { + return parser; + } + } + else if(aMimeType.Compare(KMp3MimeType) == 0 + || aMimeType.Compare(KMpegMimeType) == 0 + || aMimeType.Compare(KAacMimeType) == 0 ) + { + iSource = CMetaDataSourceDescriptor::NewL(aDes); + parser = CMetaDataParserFactory::CreateID3ParserL(*iSource); + } + return parser; + } + +// ----------------------------------------------------------------------------- +// CMetaDataUtilityBody::OpenDesL with Mimetype info +// ----------------------------------------------------------------------------- +// +void CMetaDataUtilityBody::OpenDesL( + const TDesC8& aDes, + const RArray& aWantedFields, + const TDesC8& aMimeType ) + { +#ifdef _DEBUG + RDebug::Print(_L("CMetaDataUtilityBody::OpenDesL with MimeType")); +#endif + if ( iParser ) + { + User::Leave(KErrAlreadyExists); + } + if(KErrNone == IsSupportedMimeType(aMimeType)) + { + iParser = FindParserDesL(aDes, aMimeType); + } + else + { + User::Leave(KErrNotSupported); + } + if ( iParser ) + { + iParser->ParseL(aWantedFields, *iContainer); + } + } + +// ----------------------------------------------------------------------------- +// TInt CMetaDataUtilityBody::IsSupportedMimeType +// ----------------------------------------------------------------------------- +// +TInt CMetaDataUtilityBody::IsSupportedMimeType( const TDesC8& aMimeType) +{ +#ifndef __METADATA_UTILITY_DISABLE_RA_SUPPORT // NOT define + if (aMimeType.Compare(KMp4AudioMimeType) == 0 + || aMimeType.Compare(K3gpAudioMimeType) == 0 + || aMimeType.Compare(K3g2AudioMimeType) == 0 + || aMimeType.Compare(KMpegMimeType) == 0 + || aMimeType.Compare(KMp3MimeType) == 0 + || aMimeType.Compare(KAacMimeType) == 0 + || aMimeType.Compare(KWmaMimeType) == 0 + || aMimeType.Compare(KRApnMimeType) == 0 + || aMimeType.Compare(KRArnMimeType) == 0 + || aMimeType.Compare(KRAxMimeType) == 0 + ) +#else + if (aMimeType.Compare(KMp4AudioMimeType) == 0 + || aMimeType.Compare(K3gpAudioMimeType) == 0 + || aMimeType.Compare(K3g2AudioMimeType) == 0 + || aMimeType.Compare(KMpegMimeType) == 0 + || aMimeType.Compare(KMp3MimeType) == 0 + || aMimeType.Compare(KAacMimeType) == 0 + || aMimeType.Compare(KWmaMimeType) == 0 + ) +#endif + { + return KErrNone; + } + else + { + return KErrNotSupported; + } +} +// End of File