diff -r 000000000000 -r 72b543305e3a mobilemessaging/smilui/mediasrc/SmilPlayerMediaFactory.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mobilemessaging/smilui/mediasrc/SmilPlayerMediaFactory.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,594 @@ +/* +* Copyright (c) 2002-2006 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: +* Factory class that creates SMIL Player media renderers +* accoring to the MIME type of the media file. +* +*/ + + +#include "SmilPlayerMediaFactory.h" + +// DRM +#include +#include + +#include // Central Repository +#include // for Central Repository keys + +#include + +#include + +#include "SmilAudioRenderer.h" +#include "SmilImageRenderer.h" +#include "SmilDefaultRenderer.h" +#include "SmilTextRenderer.h" +#include "SmilVideoRenderer.h" + +#include "SmilSVGRenderer.h" +#ifdef FACTORY_DEBUG + #include "SmilMediaLogging.h" +#endif + +const TInt KRendererArrayGranularity = 10; +_LIT( KSmilPlayerSpace, " " ); + +// --------------------------------------------------------- +// CSmilPlayerMediaFactory::CSmilPlayerMediaFactory +// C++ constructor. Initializes class member variables. +// --------------------------------------------------------- +// +CSmilPlayerMediaFactory::CSmilPlayerMediaFactory( CCoeEnv& aCoeEnv, + CGraphicsContext* aGc, + MMediaFactoryFileInfo* aFileInfo ) : + iCoeEnv( aCoeEnv ), + iGc( aGc ), + iFileInfo( aFileInfo ) + { + } + +// --------------------------------------------------------- +// CSmilPlayerMediaFactory::ConstructL +// --------------------------------------------------------- +// +void CSmilPlayerMediaFactory::ConstructL() + { + iRendererArray = new( ELeave ) CRendererArray( KRendererArrayGranularity ); + + iDrmCommon = DRMCommon::NewL(); + iDrmHelper = CDRMHelper::NewL(); + + iMediaResolver = CMsgMediaResolver::NewL(); + + CRepository* repository = CRepository::NewLC( KCRUidMusicPlayerFeatures ); + + TInt value( 0 ); + User::LeaveIfError( repository->Get( KRequireDRMInPlayback, value ) ); + + if ( value ) + { + iProhibitNonDrmMusic = ETrue; + + TBuf<1> tmp; // Magic: 1 char to get length of actual value + TInt realLen = 0; + TInt err = repository->Get( KPlaybackRestrictedMimeTypes, + tmp, + realLen ); + + if ( err == KErrOverflow ) + { + // Prepare list of blocked MIME types + iProhibitMimeTypeBuffer = HBufC::NewL( realLen + KSmilPlayerSpace().Length() ); + TPtr bufferPtr = iProhibitMimeTypeBuffer->Des(); + + User::LeaveIfError( repository->Get( KPlaybackRestrictedMimeTypes, bufferPtr ) ); + bufferPtr.Append( KSmilPlayerSpace ); + } + else + { + User::LeaveIfError( err ); + } + } + + CleanupStack::PopAndDestroy( repository ); + } + +// ---------------------------------------------------------------------------- +// CSmilPlayerMediaFactory::NewL +// ---------------------------------------------------------------------------- +EXPORT_C CSmilPlayerMediaFactory* CSmilPlayerMediaFactory::NewL( CCoeEnv& aCoeEnv, + CGraphicsContext* aGc, + MMediaFactoryFileInfo* aFileInfo ) + { + CSmilPlayerMediaFactory* self = new( ELeave ) CSmilPlayerMediaFactory( aCoeEnv, + aGc, + aFileInfo ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// --------------------------------------------------------- +// CSmilPlayerMediaFactory::~CSmilPlayerMediaFactory +// Destructor +// --------------------------------------------------------- +// +CSmilPlayerMediaFactory::~CSmilPlayerMediaFactory() + { + delete iRendererArray; + delete iDrmCommon; + delete iDrmHelper; + delete iProhibitMimeTypeBuffer; + delete iMediaResolver; + + iFileInfo = NULL; // For LINT + iGc = NULL; // For LINT + } + +// --------------------------------------------------------- +// CSmilPlayerMediaFactory::SetBaseUrlL +// Sets Base URL that is not currently used. +// --------------------------------------------------------- +// +void CSmilPlayerMediaFactory::SetBaseUrlL(const TDesC& aBaseUrl) + { +#ifdef FACTORY_DEBUG + SMILUILOGGER_WRITEF( _L("CSmilPlayerMediaFactory ::SetBaseUrl(%S,...)"), &aBaseUrl ); +#endif + + iBaseUrl.SetTextL(aBaseUrl); + } + +// --------------------------------------------------------- +// CSmilPlayerMediaFactory::RequestMediaL +// Requests media from given URL. Not supported currently. +// --------------------------------------------------------- +// +void CSmilPlayerMediaFactory::RequestMediaL( const TDesC& /*aUrl*/, + MSmilMedia* /*aMedia*/ ) + { + } + +// --------------------------------------------------------- +// CSmilPlayerMediaFactory::PrefetchMediaL +// Called to prefetch media from given URL. Not supported currently. +// --------------------------------------------------------- +// +void CSmilPlayerMediaFactory::PrefetchMediaL( const TDesC& /*aUrl*/ ) + { + + } + +// --------------------------------------------------------- +// CSmilPlayerMediaFactory::CreateRendererL +// Creates given type media renderer. Retrieves media file handle +// and MIME type for the given media URL from client. Initializes +// media factory if not initialized already. Checks the given +// MIME type against supported MIME types and if flag to prohibit +// all non-DRM audio files is specified then checks if audio is +// DRM protected. After this retrieves character set for text type +// media renderers and tried to instantiate media renderer. If +// there was error on instantiation then calls ResolveError to +// handle error. +// --------------------------------------------------------- +// +MSmilMediaFactory::TMediaFactoryError CSmilPlayerMediaFactory::CreateRendererL( const TDesC& aUrl, + MSmilMedia* aMedia, + MSmilMediaRenderer*& aRender ) + { +#ifdef FACTORY_DEBUG + SMILUILOGGER_WRITEF( _L("CSmilPlayerMediaFactory::CreateRenderer(%S,...)"), &aUrl ); +#endif + + if ( !aMedia ) + { + User::Leave( KErrArgument ); + } + + TMediaFactoryError returnValue = ENoRenderer; + TInt err( KErrNone ); + + RFile file; + TRAP( err, iFileInfo->GetFileHandleL( aUrl, file ) ); + + if ( err != KErrNone || + file.SubSessionHandle() == KNullHandle ) + { + file.Close(); + + // File not found. Don't create a renderer. + return returnValue; + } + + CleanupClosePushL( file ); + + TPtrC8 mimeType = iFileInfo->GetMimeTypeL( aUrl ); + +#ifdef FACTORY_DEBUG + TBuf16<100> buffer; + buffer.SetLength( mimeType.Length() ); + buffer.Copy( mimeType ); + SMILUILOGGER_WRITEF( _L("Mimetype = %S"), &buffer ); +#endif + + TMsgMediaType mimeEnum = iMediaResolver->MediaType( mimeType ); + +#ifdef FACTORY_DEBUG + SMILUILOGGER_WRITEF( _L("mimeEnum = %d"), mimeEnum ); +#endif + + User::LeaveIfError( mimeEnum ); // if not found -1 == KErrNotFound + + //if audio and variatedfeature and ( !DrmProtected ) + if( iProhibitNonDrmMusic && + mimeEnum == EMsgMediaAudio ) + { + if ( !PlaybackAllowedL( mimeType, file ) ) + { + CleanupStack::PopAndDestroy( &file ); + return returnValue; + } + } + + TUint charset( 0 ); + if ( mimeEnum == EMsgMediaText ) + { + charset = iFileInfo->GetCharacterSetL( aUrl ); + } + + TRAP( err, aRender =InstantiateRendererL( mimeEnum, + file, + aMedia, + charset ) ); + +#ifdef FACTORY_DEBUG + SMILUILOGGER_WRITEF( _L("InstantiateRendererL = %d"), err ); +#endif + + if ( err != KErrNone ) + { + TRAPD( err2, ResolveErrorL( mimeEnum, file, err, aMedia, aRender ) ); + if ( err2 != KErrNone ) + { + returnValue = ENoRenderer; + } + else + { + returnValue = EOk; + } + } + else + { + returnValue = EOk; + } + + CleanupStack::PopAndDestroy( &file ); + return returnValue; + } + +// --------------------------------------------------------- +// CSmilPlayerMediaFactory::PrefetchStatus +// Returns current prefetch status. Not supported currently. +// --------------------------------------------------------- +// +MSmilMediaFactory::TPrefetchStatus CSmilPlayerMediaFactory::PrefetchStatus( + const TDesC& /*aUrl*/, + TInt& /*aDown*/, + TInt& /*aSize*/ ) + { + return EPrefetchNone; + } + +// --------------------------------------------------------- +// CSmilPlayerMediaFactory::PresentationEnd +// Notifies about presentation end. +// --------------------------------------------------------- +// +void CSmilPlayerMediaFactory::PresentationEnd() + { +#ifdef FACTORY_DEBUG + SMILUILOGGER_WRITEF( _L("CSmilPlayerMediaFactory::PresentationEnd()") ); +#endif + } + +// --------------------------------------------------------- +// CSmilPlayerMediaFactory::RendererDeleted +// Notifies about specific renderer deletion. +// --------------------------------------------------------- +// +void CSmilPlayerMediaFactory::RendererDeleted( MSmilMediaRenderer* /*aRenderer*/ ) + { +#ifdef FACTORY_DEBUG + SMILUILOGGER_WRITEF( _L("CSmilPlayerMediaFactory::RendererDeleted()") ); +#endif + } + +// --------------------------------------------------------- +// CSmilPlayerMediaFactory::PresentationReady() +// Notifies that presentation is ready. +// --------------------------------------------------------- +// +void CSmilPlayerMediaFactory::PresentationReady() + { +#ifdef FACTORY_DEBUG + SMILUILOGGER_WRITEF( _L("CSmilPlayerMediaFactory::PresentationReady()") ); +#endif + } + +// --------------------------------------------------------- +// CSmilPlayerMediaFactory::QueryContentType +// Checks if specific MIME type is supported. +// --------------------------------------------------------- +// +TBool CSmilPlayerMediaFactory::QueryContentType( const TDesC& aMimeType ) const + { +#ifdef FACTORY_DEBUG + SMILUILOGGER_WRITEF( _L("CSmilPlayerMediaFactory::QueryContentType(%S,...)"), &aMimeType ); +#endif + + TBool result( EFalse ); + + HBufC8* mimeType8 = NULL; + TRAPD( error, mimeType8 = HBufC8::NewL( aMimeType.Length() ) ); + + if ( error == KErrNone ) + { + TPtr8 mimeTypePtr8 = mimeType8->Des(); + + mimeTypePtr8.Copy( aMimeType ); + + if ( iMediaResolver->MediaType( *mimeType8 ) != EMsgMediaUnknown ) + { + result = ETrue; + } + + delete mimeType8; + } + + return result; + } + +// --------------------------------------------------------- +// CSmilPlayerMediaFactory::GetRenderers() +// Returns an array containing all created renderers. +// --------------------------------------------------------- +EXPORT_C CRendererArray* CSmilPlayerMediaFactory::GetRenderers() + { + return iRendererArray; + } + +// --------------------------------------------------------- +// CSmilPlayerMediaFactory::InstantiateRendererL +// Tries to instantiate specified type media renderer. +// --------------------------------------------------------- +MSmilMediaRenderer* CSmilPlayerMediaFactory::InstantiateRendererL( TMsgMediaType aMediaType, + RFile& aFileHandle, + MSmilMedia* aMedia, + TUint aCharSet ) + { +#ifdef FACTORY_DEBUG + SMILUILOGGER_ENTERFN( "[SMILUI] Factory: InstantiateRendererL" ) +#endif + + CSmilMediaRendererBase* renderer = NULL; + + switch ( aMediaType ) + { + // audio types + case EMsgMediaAudio: + { +#ifdef FACTORY_DEBUG + SMILUILOGGER_WRITEF( _L("[SMILUI] Factory: creating audio renderer") ); +#endif + renderer = CSmilAudioRenderer::NewL( aFileHandle, + aMedia, + *iDrmCommon, + *iDrmHelper ); + break; + } + //image types + case EMsgMediaImage: + { +#ifdef FACTORY_DEBUG + SMILUILOGGER_WRITEF( _L("[SMILUI] Factory: creating image renderer") ); +#endif + + renderer = CSmilImageRenderer::NewL( aFileHandle, + aMedia, + *iDrmCommon, + *iDrmHelper ); + break; + } + //text types + case EMsgMediaText: + case EMsgMediaXhtml: + { +#ifdef FACTORY_DEBUG + SMILUILOGGER_WRITEF( _L("[SMILUI] Factory: creating text renderer") ); +#endif + + renderer = CSmilTextRenderer::NewL( aFileHandle, + aMedia, + *iDrmCommon, + *iDrmHelper, + aCharSet, + *iGc, + aMediaType + ); + break; + } + //video types + case EMsgMediaVideo: + { +#ifdef FACTORY_DEBUG + SMILUILOGGER_WRITEF( _L("[SMILUI] Factory: creating video renderer") ); +#endif + + renderer = CSmilVideoRenderer::NewL( aFileHandle, + aMedia, + *iDrmCommon, + *iDrmHelper ); + break; + } + // SVG types + case EMsgMediaSvg: + { +#ifdef FACTORY_DEBUG + SMILUILOGGER_WRITEF( _L("[SMILUI] Factory: creating svg renderer") ); +#endif + + renderer = CSmilSVGRenderer::NewL( aFileHandle, + aMedia, + iFileInfo, + *iDrmCommon, + *iDrmHelper ); + break; + } + case EMsgMediaUnknown: + default: + { +#ifdef FACTORY_DEBUG + SMILUILOGGER_WRITEF( _L("[SMILUI] Factory: creating default renderer") ); +#endif + + renderer = CSmilDefaultRenderer::NewL( aFileHandle, + aMedia, + *iDrmCommon, + *iDrmHelper, + EMsgMediaUnknown, + EFalse ); + break; + } + } + + CleanupStack::PushL( renderer ); + iRendererArray->AppendL( renderer ); + CleanupStack::Pop( renderer ); + +#ifdef FACTORY_DEBUG + SMILUILOGGER_LEAVEFN( "[SMILUI] Factory: InstantiateRendererL" ) +#endif + + return renderer; + } + +// --------------------------------------------------------- +// CSmilPlayerMediaFactory::ResolveErrorL +// Handles error on media renderer creation. +// --------------------------------------------------------- +// +void CSmilPlayerMediaFactory::ResolveErrorL( TMsgMediaType aMediaType, + RFile& aFileHandle, + TInt aErrorCode, + MSmilMedia* aMedia, + MSmilMediaRenderer*& aRenderer ) const + { +#ifdef FACTORY_DEBUG + SMILUILOGGER_WRITEF( _L("CSmilPlayerMediaFactory::ResolveErrorL(...,%d)"), aErrorCode ); +#endif + + switch ( aMediaType ) + { + case EMsgMediaAudio: + case EMsgMediaImage: + case EMsgMediaText: + case EMsgMediaVideo: + case EMsgMediaSvg: + case EMsgMediaXhtml: + { + switch( aErrorCode ) + { + case DRMCommon::EGeneralError: + case DRMCommon::EUnknownMIME: + case DRMCommon::EVersionNotSupported: + case DRMCommon::ESessionError: + case DRMCommon::ENoRights: + case DRMCommon::ERightsDBCorrupted: + case DRMCommon::EUnsupported: + case DRMCommon::ERightsExpired: + case DRMCommon::EInvalidRights: + case DRMCommon::EPaddingFailed: + case DRMCommon::EFileError: + { + aRenderer = CSmilDefaultRenderer::NewL( aFileHandle, + aMedia, + *iDrmCommon, + *iDrmHelper, + aMediaType, + ETrue ); + break; + } + default: + { + aRenderer = CSmilDefaultRenderer::NewL( aFileHandle, + aMedia, + *iDrmCommon, + *iDrmHelper, + aMediaType ); + break; + } + } + break; + } + default: + { + break; + } + } + } + +// --------------------------------------------------------- +// CSmilPlayerMediaFactory::PlaybackAllowedL +// Determines whether file playing is allowed. +// --------------------------------------------------------- +// +TBool CSmilPlayerMediaFactory::PlaybackAllowedL( const TDesC8& aMimeType, RFile& aFileHandle ) const + { + TBool result( EFalse ); + + // Prepare buffer for aMimeType + HBufC* mimeBuffer = HBufC::NewLC( aMimeType.Length() + KSmilPlayerSpace().Length() ); + TPtr mimeBufferPtr = mimeBuffer->Des(); + mimeBufferPtr.Copy( aMimeType ); + + // FindF() would find "audio/3gpp" in "audio/3gpp2" without + // the added space. + mimeBufferPtr.Append( KSmilPlayerSpace ); + + // If result is not KErrNotFound, this MIME-type is indeed on blocked list. + if ( iProhibitMimeTypeBuffer->FindF( mimeBufferPtr ) >= 0 ) + { + TBool value( EFalse ); + iDrmCommon->IsProtectedFile( aFileHandle, value); + + if( value ) + { + result = ETrue; + } + } + else + { + result = ETrue; + } + + CleanupStack::PopAndDestroy( mimeBuffer ); + + return result; + } + + +// End of file