diff -r 8bda91a87a00 -r 8ee96d21d9bf profilesservices/MediaFileList/Src/mediafileprotection.cpp --- a/profilesservices/MediaFileList/Src/mediafileprotection.cpp Thu Aug 19 10:12:30 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,625 +0,0 @@ -/* -* Copyright (c) 2007 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: Class used to check the protection of the -* media files. -* -*/ - - - - -// INCLUDE FILES - -#include "mediafileprotection.h" -#include "mediafilelist.h" -#include "mediafilelistdebug.h" -#include - -#include -#include -#include -#include -#include - - - -/****************************************************************************** - * class CMFProtectionHandler - ******************************************************************************/ - -// ----------------------------------------------------------------------------- -// CMFProtectionHandler::NewL -// -// ----------------------------------------------------------------------------- -CMFProtectionHandler* CMFProtectionHandler::NewL() - { - CMFProtectionHandler* self = new (ELeave) CMFProtectionHandler(); - CleanupStack::PushL(self); - self->ConstructL(); - CleanupStack::Pop(self); - - return self; - } - - -// ----------------------------------------------------------------------------- -// CMFProtectionHandler::CMFProtectionHandler -// -// ----------------------------------------------------------------------------- -// -CMFProtectionHandler::CMFProtectionHandler() - { - iMaxFileSize = KErrNotFound; - } - - -// ----------------------------------------------------------------------------- -// CMFProtectionHandler::CMFProtectionHandler -// -// ----------------------------------------------------------------------------- -// -void CMFProtectionHandler::ConstructL() - { - iDriveUtil = CDriveUtil::NewL(); - iVariation = CMediaFileDialogVariation::NewL(); - - iDRMHelper = CDRMHelper::NewL( *CCoeEnv::Static() ); - - iDRMCommon = DRMCommon::NewL(); - User::LeaveIfError( iDRMCommon->Connect() ); - - iExcludedMimeTypes = CMimeTypeList::NewL(); - - User::LeaveIfError( iApaLsSession.Connect() ); - User::LeaveIfError( iFsSession.Connect() ); - } - - -// ---------------------------------------------------------------------------- -// Destructor -// -// ---------------------------------------------------------------------------- -// -CMFProtectionHandler::~CMFProtectionHandler() - { - delete iDriveUtil; - delete iVariation; - - delete iDRMHelper; - - if ( iDRMCommon ) - { - iDRMCommon->Disconnect(); // ignore possible error - delete iDRMCommon; - } - - delete iExcludedMimeTypes; - iApaLsSession.Close(); - iFsSession.Close(); - } - - -// ----------------------------------------------------------------------------- -// CMFProtectionHandler::SetAttr -// -// ----------------------------------------------------------------------------- -void CMFProtectionHandler::SetAttrL( TInt aAttr, TInt aValue ) - { - switch ( aAttr ) - { - case CMediaFileList::EAttrFileSize: - { - iMaxFileSize = aValue; - break; - } - case CMediaFileList::EAttrAutomatedType: - { - iAutomatedType = (CDRMHelper::TDRMHelperAutomatedType) aValue; - break; - } - - default: - { - break; - } - } - } - - -// ----------------------------------------------------------------------------- -// CMFProtectionHandler::SetAttrL -// -// ----------------------------------------------------------------------------- -void CMFProtectionHandler::SetAttrL( TInt aAttr, const TDesC& aValue ) - { - if ( aAttr == CMediaFileList::EAttrExcludeMimeType ) - { - if ( aValue.Length() > KMaxFileName || aValue.Length() == 0 ) - { - User::Leave( KErrArgument ); - } - - iExcludedMimeTypes->AddMimeTypeL( aValue ); - } - } - - -// ----------------------------------------------------------------------------- -// CMFProtectionHandler::IsVideoValid -// -// ----------------------------------------------------------------------------- -// -TBool CMFProtectionHandler::IsVideoValid( const TDesC& aFileName, - TIntention aIntention ) - { - TInt err = KErrNone; - TBool ret = EFalse; - - TRAP( err, ret = IsVideoValidL (aFileName, aIntention ) ) - - if ( err != KErrNone ) - { - return EFalse; // in case of error file is not valid - } - - return ret; - } - - -// ----------------------------------------------------------------------------- -// CMFProtectionHandler::IsVideoValidL -// -// ----------------------------------------------------------------------------- -// -TBool CMFProtectionHandler::IsVideoValidL( const TDesC& aFileName, - TIntention /*aIntention*/ ) - { - TBuf dataType( DataTypeL( aFileName ).Des() ); - - if ( iExcludedMimeTypes->FindMimeTypeL( dataType ) ) - { - return EFalse; - } - - CContent* content = CContent::NewLC( aFileName, - EContentShareReadWrite ); - TInt deliveryMethod = 0; - content->GetAttribute( EDeliveryMethod, deliveryMethod ); - - CleanupStack::PopAndDestroy( content ); - - if( deliveryMethod == EOmaDrm2 ) - { - // if video it is OMA DRM 2 protected, it cannot be previewed - return EFalse; - } - return ETrue; - } - - -// ----------------------------------------------------------------------------- -// CMFProtectionHandler::IsFileValid -// -// Checks protection state of media file. If this function returns EFalse, -// media file cannot be used for playing/selection. -// -// ----------------------------------------------------------------------------- -// -TBool CMFProtectionHandler::IsFileValid( const TDesC& aFileName, - TIntention aIntention ) - { - TInt err = KErrNone; - TBool ret = EFalse; - - TRAP( err, ret = IsFileValidL (aFileName, aIntention ) ) - - if ( err != KErrNone ) - { - return EFalse; // in case of error file is not valid - } - - return ret; - } - - -// ----------------------------------------------------------------------------- -// CMFProtectionHandler::IsFlieDRMExpired -// -// Check if the DRM protect file is expired or have no rights. -// ----------------------------------------------------------------------------- -// -TBool CMFProtectionHandler::IsFlieDRMExpired( const TDesC& aFileName ) - { - // Check whether the file can be set as automated content or not - TBool canSetAutomated = EFalse; - TInt canSetAutomatedErr = iDRMHelper->CanSetAutomated( aFileName, canSetAutomated ); - - // Check if rights expried or no rights to use - if ( canSetAutomatedErr == DRMCommon::ERightsExpired || - canSetAutomatedErr == DRMCommon::ENoRights ) - { - return ETrue; - } - return EFalse; - } - - -// ----------------------------------------------------------------------------- -// CMFProtectionHandler::IsFileValidL -// -// Function is copy from CFLDDRMImplementation.cpp. -// ----------------------------------------------------------------------------- -// -TBool CMFProtectionHandler::IsFileValidL( const TDesC& aFileName, - TIntention aIntention ) - { - TInt err = KErrNone; - TBuf dataType( DataTypeL( aFileName ).Des() ); - - if ( aFileName.Length() == 0 ) - { - return ETrue; // empty filename is valid?? - } - - if ( iExcludedMimeTypes->FindMimeTypeL( dataType ) ) - { - ShowErrorNoteL( R_QTN_INFO_FILE_FORMAT_ERROR ); - return EFalse; - } - - if ( aIntention == CMFProtectionHandler::ESelect && - !CheckFileSize( aFileName, dataType ) ) - { - HBufC* hBuf = StringLoader::LoadLC( R_QTN_INFO_FILE_SIZE_ERROR, iMaxFileSize ); - TMFDialogUtil::ShowInformationNoteL( *hBuf ); - CleanupStack::PopAndDestroy( hBuf ); - return EFalse; - } - - if ( iDriveUtil->IsRom( aFileName ) ) - { - return ETrue; // files in ROM are always valid - } - - // check if file is WMDRM protected - TBool prot = EFalse; - TRAP( err, prot = IsFileWMDRMProtectedL( aFileName ) ); - if ( err != KErrNone ) - { - ShowErrorNoteL( R_QTN_INFO_FILE_FORMAT_ERROR ); - return EFalse; - } - if ( prot ) - { - if ( aIntention == EPlay ) - { - ShowErrorNoteL( R_QTN_INFO_DRM_PREV_RIGHTS_USE ); - } - else - { - ShowErrorNoteL( R_QTN_INFO_DRM_PROTECTED ); - } - return EFalse; - } - - ContentAccess::TVirtualPathPtr path( aFileName, - ContentAccess::KDefaultContentObject ); - CData* data = CData::NewLC( path, EContentShareReadWrite ); - TInt isProtected; - err = data->GetAttribute( EIsProtected, isProtected ); - CleanupStack::PopAndDestroy( data ); - - if ( err != DRMCommon::EOk ) - { - // DRM Helper class knows at least rights db corrupted error message. - // Leaves on system-wide error code. - iDRMHelper->HandleErrorL( err, aFileName ); - return EFalse; - } - - // Obtain information whether the file can be set as automated content - TBool canSetAutomated = EFalse; - TInt canSetAutomatedErr = - iDRMHelper->CanSetAutomated( aFileName, canSetAutomated ); - - if ( !isProtected && canSetAutomated ) - { - // The file in question is not DRM protected. - // Return ETrue if file is also Ok unprotected, otherwise EFalse. - TBool ret = IsFileValidUnprotectedL( aFileName, aIntention ); - return ret; - } - - // Operator requirement: Check restrictions if file is mp4 audio - if ( iVariation->IsBlockedProtectedType( dataType ) ) - { - ShowErrorNoteL( R_QTN_INFO_DRM_PROTECTED ); - return EFalse; - } - - if ( canSetAutomatedErr == DRMCommon::ERightsExpired || - canSetAutomatedErr == DRMCommon::ENoRights ) - { - // Rights are expired, future rights or missing - iDRMHelper->HandleErrorL( canSetAutomatedErr, aFileName ); - return EFalse; - } - - // Operator requirement: Check DRM v2 tones - if ( !canSetAutomated ) - { - // This is DRM v2 file OR count based v1 tone - if ( aIntention == EPlay ) - { - ShowErrorNoteL( R_QTN_INFO_DRM_PREV_RIGHTS_USE ); - } - else - { - ShowErrorNoteL( R_QTN_INFO_DRM_PROTECTED ); - } - return EFalse; - } - - TInt32 infoBits( 0x00000000 ); - - // Find out rights information - if ( !GetFileInfoL( aFileName, infoBits ) ) - { - // Corrupted file or "No rights" situation - return EFalse; - } - - // Operator requirement: Check CFM protection - if ( infoBits & ENoRingingTone ) - { - // This is CFM protected file, ringingtone is set to "no" - if ( aIntention == EPlay ) - { - ShowErrorNoteL( R_QTN_INFO_DRM_PREV_RIGHTS_USE ); - } - else - { - ShowErrorNoteL( R_QTN_INFO_DRM_PREV_RIGHTS_SET ); - } - return EFalse; - } - - if ( aIntention == ESelect ) - { - // Rights are good to go, and intention is selection - // call SetAutomatedPassive to show 'activation query' - iDRMHelper->SetAutomatedType( iAutomatedType ); - err = iDRMHelper->SetAutomatedPassive( aFileName ); - if ( err != KErrCancel ) - { - // User accepted dialog - User::LeaveIfError( err ); - // New way, does not require DRM capability - data = CData::NewLC( path, EContentShareReadWrite ); - err = data->ExecuteIntent( ContentAccess::EPlay ); - // Wrongly requires DRM after all. According to Risto Vilkman - // from DRM, KErrAccessDenied can be ignored, since if - // CanSetAutomated says the tone is OK, it's OK. - if ( err != KErrNone && err != KErrAccessDenied ) - { - User::Leave( err ); - } - CleanupStack::PopAndDestroy( data ); - } - else - { - // User canceled dialog - return EFalse; - } - } - - return ETrue; - } - - -// ----------------------------------------------------------------------------- -// CMFProtectionHandler::GetFileInfo -// -// Function is copy from CFLDDRMImplementation.cpp. -// ----------------------------------------------------------------------------- -// -TBool CMFProtectionHandler::GetFileInfoL( const TDesC& aFileName, - TInt32& aInfoBits ) - { - DRMCommon::TContentProtection contentProtection; // ignored - HBufC8* mimeType = NULL; // ignored - TUint dataLength = 0; // ignored - HBufC8* contentURI = NULL; - - // Obtain content URI - TInt error = iDRMCommon->GetFileInfo( - aFileName, contentProtection, mimeType, contentURI, dataLength ); - delete mimeType; - - if ( error != DRMCommon::EOk ) - { - delete contentURI; - // Handle possible corrupt file situation - iDRMHelper->HandleErrorL( error, aFileName ); - return EFalse; - } - - // Obtain rights object - CDRMRights* rights = NULL; - error = iDRMCommon->GetActiveRights( *contentURI, DRMCommon::EPlay, rights ); - delete contentURI; - - if ( error == DRMCommon::ENoRights ) - { - delete rights; - // There is no rights for given file - // Should never arrive here, ENoRights is handled - // already in IsFileValidL() - iDRMHelper->HandleErrorL( error, aFileName ); - return EFalse; - } - - // Obtain infobits ( needed only for CFM case ) - aInfoBits = rights->GetPermission().iInfoBits; - delete rights; - return ETrue; - } - - -// ----------------------------------------------------------------------------- -// CMFProtectionHandler::IsFileWMDRMProtectedL -// -// Function is copy from CFLDDRMImplementation.cpp. -// ----------------------------------------------------------------------------- -// -TBool CMFProtectionHandler::IsFileWMDRMProtectedL( const TDesC& aFileName ) - { - TBool res = EFalse; - RFile hFile; - - TInt err = hFile.Open( iFsSession, aFileName, - EFileRead | EFileStream | EFileShareReadersOnly ); - if ( err == KErrInUse ) - { - err = hFile.Open( iFsSession, aFileName, - EFileRead | EFileStream | EFileShareAny ); - } - if ( err != KErrNone ) - { - User::Leave( err ); - } - CleanupClosePushL( hFile ); - - TPtrC agent( KNullDesC ); - DRM::CDrmUtility* drmUtil = DRM::CDrmUtility::NewLC(); - drmUtil->GetAgentL( hFile, agent ); - if ( agent.Compare( DRM::KDrmWMAgentName ) == 0 ) - { - res = ETrue; - } - CleanupStack::PopAndDestroy( drmUtil ); - - CleanupStack::PopAndDestroy( &hFile ); - return res; - } - - -// ----------------------------------------------------------------------------- -// CMFProtectionHandler::DataTypeL -// -// Function is copy from CFLDDRMImplementationCommon.cpp. -// ----------------------------------------------------------------------------- -// -TDataType CMFProtectionHandler::DataTypeL( const TDesC& aFileName ) - { - TUid dummyUid = { 0 }; - TDataType dataType( dummyUid ); - User::LeaveIfError( - iApaLsSession.AppForDocument( aFileName, dummyUid, dataType ) ); - - return dataType; - } - - -// ----------------------------------------------------------------------------- -// CMFProtectionHandler::IsFileValidUnprotectedL -// -// Function is copy from CFLDDRMImplementationCommon.cpp. -// ----------------------------------------------------------------------------- -// -TBool CMFProtectionHandler::IsFileValidUnprotectedL( const TDesC& aFileName, - TIntention aIntention ) - { - TDataType dataType = DataTypeL( aFileName ); - TBuf mimeType; - - mimeType = dataType.Des(); - - if ( iVariation->IsBlockedType( mimeType ) ) - { - if ( aIntention == ESelect ) - { - ShowErrorNoteL( R_QTN_INFO_TEXT_NOT_ALLOWED ); - } - return EFalse; - } - - // Operator requirement. Check if DRM is required with tones. - if ( aIntention == EPlay ) - { - if ( iVariation->IsBlockedDemoPlayType( mimeType ) ) - { - return EFalse; - } - } - else - { - if ( iVariation->IsBlockedUnprotectedType( mimeType ) ) - { - ShowErrorNoteL( R_QTN_INFO_NO_DRM ); - return EFalse; - } - } - - return ETrue; - } - - -// ----------------------------------------------------------------------------- -// CMFProtectionHandler::CheckFileSize -// -// ----------------------------------------------------------------------------- -// -TBool CMFProtectionHandler::CheckFileSize( const TDesC& aFile, const TDesC& aMimeType ) - { - _LIT( KVideo, "video" ); - const TInt KKiloByte = 1024; - const TInt KSmallSize = 10; - - if ( iMaxFileSize < KSmallSize ) - { - return ETrue; // too small size limit - } - if ( aMimeType.Find( KVideo ) != KErrNotFound ) - { - return ETrue; // only audio files are checked - } - - TEntry entry; - TInt err = iFsSession.Entry( aFile, entry ); - if ( err == KErrNone && iMaxFileSize != KErrNotFound ) - { - TInt size = iMaxFileSize * KKiloByte; // KBytes -> Bytes - if ( entry.iSize > size ) - { - return EFalse; - } - } - - return ETrue; - } - - -// ----------------------------------------------------------------------------- -// CMFProtectionHandler::ShowErrorNoteL -// -// ----------------------------------------------------------------------------- -// -void CMFProtectionHandler::ShowErrorNoteL( TInt aResourceId ) - { - TMFDialogUtil::ShowInformationNoteL( aResourceId ); - } - - -// End of File