diff -r 000000000000 -r 72b543305e3a mobilemessaging/msgmedia/src/MsgMediaResolver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mobilemessaging/msgmedia/src/MsgMediaResolver.cpp Thu Dec 17 08:44:11 2009 +0200 @@ -0,0 +1,348 @@ +/* +* Copyright (c) 2005 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: +* Recognizes MIME type for a file. +* Maps MIME types to media types. +* Creates media info object for a file. +* +*/ + + + + +// INCLUDE FILES +#include +#include // CBase +#include // TDataType +#include // RFs, RFile +#include // RApaLsSession +#include + +#include +#include +#include +#include + +#include +#include + +// Features +#include +#include +#include + +// Resources +#include + +#include "MsgMedia.hrh" +#include "MsgMediaResolver.h" +#include "MsgMediaTypeGroup.h" +#include "MsgMediaPanic.h" +#include "MsgMediaInfo.h" +#include "MsgImageInfo.h" +#include "MsgAudioInfo.h" +#include "MsgTextInfo.h" +#include "MsgVideoInfo.h" +#include "MsgMimeTypes.h" + +// LOCAL CONSTANTS AND MACROS +// Unrecognised media type is 'x-epoc/x-app0'. +// Media type 'x-epoc/x-appN', in which N>0 may also be possible. +// N stands for Uid of the app handling the content on the Symbian OS platform +_LIT8( KMmsSymbianInternalPattern, "x-epoc/x-app0"); + +_LIT( KMsgMediaResourceFileName, "MsgMimeToMediaMapping.rsc" ); + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// Factory +// ----------------------------------------------------------------------------- +// +EXPORT_C CMsgMediaResolver* CMsgMediaResolver::NewLC() + { + CMsgMediaResolver* self = new ( ELeave ) CMsgMediaResolver(); + CleanupStack::PushL( self ); + self->ConstructL(); + return self; + } + +// ----------------------------------------------------------------------------- +// Factory +// ----------------------------------------------------------------------------- +// +EXPORT_C CMsgMediaResolver* CMsgMediaResolver::NewL() + { + CMsgMediaResolver* self = NewLC(); + CleanupStack::Pop( self ); + return self; + } + +// ----------------------------------------------------------------------------- +// C++ constructor +// ----------------------------------------------------------------------------- +// +CMsgMediaResolver::CMsgMediaResolver() : + iRecognizeCharSet( ETrue ) // CharSet recognition is on by default. + { + } + +// ----------------------------------------------------------------------------- +// Destructor +// ----------------------------------------------------------------------------- +// +CMsgMediaResolver::~CMsgMediaResolver() + { + iFs.Close(); + iApaLsSession.Close(); + iMimeGroupArray.ResetAndDestroy(); + delete iFileProt; + delete iDRMHelper; + } + +// ----------------------------------------------------------------------------- +// 2nd phase constructor +// ----------------------------------------------------------------------------- +// +void CMsgMediaResolver::ConstructL() + { + // Create own shared file server session. + User::LeaveIfError( iFs.Connect() ); + User::LeaveIfError( iFs.ShareProtected() ); + User::LeaveIfError( iApaLsSession.Connect() ); + + iDRMHelper = CDRMHelper::NewL(); + iFileProt = CFileProtectionResolver::NewL( iFs ); + CreateMediaTypeGroupsL(); + } + +// ----------------------------------------------------------------------------- +// CMsgMediaResolver::CreateMediaTypeGroupsL +// ----------------------------------------------------------------------------- +// +void CMsgMediaResolver::CreateMediaTypeGroupsL() + { + TFileName fileName; + TFindFile finder( iFs ); + //Search Y->A then Z: + TInt err = finder.FindByDir( KMsgMediaResourceFileName, KDC_RESOURCE_FILES_DIR ); + if(err == KErrNone) + { + fileName = finder.File(); + RResourceFile resourceFile; + resourceFile.OpenL( iFs, fileName ); + CleanupClosePushL( resourceFile ); + resourceFile.ConfirmSignatureL( 0 ); + + HBufC8* dataBuffer = resourceFile.AllocReadLC( R_MSG_MEDIAGROUPS ); + + TResourceReader reader; + reader.SetBuffer( dataBuffer ); + + TInt numMediaGroups( reader.ReadInt16() ); + + for ( TInt i = 0; i < numMediaGroups; i++ ) + { + CMsgMediaTypeGroup* mimeTypeGroup = CMsgMediaTypeGroup::NewLC( reader ); + iMimeGroupArray.AppendL( mimeTypeGroup ); + CleanupStack::Pop( mimeTypeGroup ); + } + + CleanupStack::PopAndDestroy( 2, &resourceFile ); // resourceFile.Close, dataBuffer + } + } + +// ----------------------------------------------------------------------------- +// CMsgMediaResolver::FileHandleL +// ----------------------------------------------------------------------------- +// +EXPORT_C RFile CMsgMediaResolver::FileHandleL( const TDesC& aFileName ) + { + RFile file; + User::LeaveIfError( file.Open( iFs, aFileName, EFileRead | EFileShareReadersOnly ) ); + return file; + } + +// ----------------------------------------------------------------------------- +// CMsgMediaResolver::RecognizeL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CMsgMediaResolver::RecognizeL( RFile& aFile, + TDataType& aMimeType ) + { + TFileName* name = new ( ELeave ) TFileName; + CleanupStack::PushL( name ); + User::LeaveIfError( aFile.Name( *name ) ); + TParsePtrC parse( *name ); + if ( parse.Ext().CompareF( KMsgExtSmil1 ) == 0 || + parse.Ext().CompareF( KMsgExtSmil2 ) == 0 || + parse.Ext().CompareF( KMsgExtSmil3 ) == 0 ) + { + aMimeType = KMsgMimeSmil(); + } + else + { + TDataRecognitionResult dataType; + TInt err = iApaLsSession.RecognizeData( aFile, dataType ); + // Unrecognised content and no leaves in recogniser plugins + // return err = KErrNone & dataType = 'x-epoc/x-app0'. + // Unrecognised content and a leave in recogniser plugins + // return err = + if ( err + || dataType.iDataType.Des8().Length() == 0 + || !dataType.iDataType.Des8().CompareF( KMmsSymbianInternalPattern ) ) + { + // Not recognized + aMimeType = KMsgMimeUnknown(); + } + else + { + aMimeType = dataType.iDataType; + } + } + CleanupStack::PopAndDestroy( name ); + } + +// ----------------------------------------------------------------------------- +// CMsgMediaResolver::MediaType +// ----------------------------------------------------------------------------- +// +EXPORT_C TMsgMediaType CMsgMediaResolver::MediaType( const TDesC8& aMimeType ) const + { + TInt mimeGroupCount( iMimeGroupArray.Count() ); + for ( TInt i = 0; i < mimeGroupCount; i++ ) + { + CMsgMediaTypeGroup* group = iMimeGroupArray[ i ]; + if ( group->HasMimeType( aMimeType ) ) + { + return group->MediaType(); + } + } + return EMsgMediaUnknown; + } + +// ----------------------------------------------------------------------------- +// CMsgMediaResolver::MediaInfoL +// ----------------------------------------------------------------------------- +// +EXPORT_C CMsgMediaInfo* CMsgMediaResolver::CreateMediaInfoL( RFile& aFile ) + { + TDataType* mimeType = new ( ELeave ) TDataType; + CleanupStack::PushL( mimeType ); + RecognizeL( aFile, *mimeType ); + CMsgMediaInfo* info = DoCreateMediaInfoL( aFile, *mimeType ); + CleanupStack::PopAndDestroy( mimeType ); + return info; + } + +// ----------------------------------------------------------------------------- +// CMsgMediaResolver::MediaInfoL +// ----------------------------------------------------------------------------- +// +EXPORT_C CMsgMediaInfo* CMsgMediaResolver::CreateMediaInfoL( RFile& aFile, TDataType& aMimeType ) + { + return DoCreateMediaInfoL( aFile, aMimeType ); + } + +// ----------------------------------------------------------------------------- +// CMsgMediaResolver::ParseInfoDetailsL +// ----------------------------------------------------------------------------- +// +EXPORT_C void CMsgMediaResolver::ParseInfoDetailsL( CMsgMediaInfo* aInfo, RFile& aFile ) + { + aInfo->ParseInfoDetailsL( aFile, *iDRMHelper, *this ); + if ( iWait.IsStarted() ) + { + // Stop active wait. + iWait.AsyncStop(); + } + // Start active wait + iWait.Start(); + } + +// ----------------------------------------------------------------------------- +// CMsgMediaResolver::DoCreateMediaInfoL +// ----------------------------------------------------------------------------- +// +CMsgMediaInfo* CMsgMediaResolver::DoCreateMediaInfoL( RFile& aFile, + TDataType& aMimeType ) + { + CMsgMediaInfo* mediaInfo = NULL; + TMsgMediaType mediaType = MediaType( aMimeType.Des8() ); + switch ( mediaType ) + { + case EMsgMediaText: + { + mediaInfo = CMsgTextInfo::NewL( aFile, aMimeType, iFs ); + if ( !iRecognizeCharSet ) + { + // Suppress charset recognition. + static_cast< CMsgTextInfo* >( mediaInfo )->SetCharacterSet( 0 ); + } + break; + } + case EMsgMediaImage: + { + mediaInfo = CMsgImageInfo::NewL( aFile, aMimeType ); + break; + } + case EMsgMediaVideo: + { + mediaInfo = CMsgVideoInfo::NewL( aFile, aMimeType ); + break; + } + case EMsgMediaAudio: + { + mediaInfo = CMsgAudioInfo::NewL( aFile, aMimeType ); + break; + } + case EMsgMediaUnknown: + default: + { + mediaInfo = CMsgMediaInfo::NewL( aFile, aMimeType, mediaType ); + break; + } + } + + CleanupStack::PushL( mediaInfo ); + + TUid appUid( KNullUid ); + // Ignore possible error. + TInt err = iApaLsSession.AppForDataType( aMimeType, appUid ); + mediaInfo->SetHandlerApplicationUid( appUid ); + + HBufC8* drmUri = NULL; + TInt protection = iFileProt->ProtectionStatusL( aFile, aMimeType, drmUri ); + mediaInfo->SetProtection( protection ); + mediaInfo->SetDRMContentURI( drmUri ); // ownership transferred + + CleanupStack::Pop( mediaInfo ); + + return mediaInfo; + } + +// ----------------------------------------------------------------------------- +// CMsgMediaResolver::MediaInfoParsed +// ----------------------------------------------------------------------------- +// +void CMsgMediaResolver::MediaInfoParsed() + { + if ( iWait.IsStarted() ) + { + // Stop active wait. + iWait.AsyncStop(); + } + } + +// End of File