diff -r 83e6409f1e6e -r 4cd5f847237f profilesapplication/Profiles/ProfileApp/SettingsViewSrc/CProfileToneHandlerDrmFull.cpp --- a/profilesapplication/Profiles/ProfileApp/SettingsViewSrc/CProfileToneHandlerDrmFull.cpp Tue Feb 02 00:10:48 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,497 +0,0 @@ -/* -* Copyright (c) 2002-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: A helper interface to be used by S60 applications for -* setting ringing and alert tones for different profiles. -* Registers DRM protected tones as automated content -* and removes old content from automated content list. -* Shows a content activation query if necessary. -* -*/ - - - -// INCLUDE FILES -#include "cprofiletonehandler.h" - -#include -#include -#include - -#ifdef RD_DRM_COMMON_INTERFACE_FOR_OMA_AND_WMDRM -#include -#include -#endif - -#include - - -// ============================ LOCAL FUNCTIONS ================================ - -CDRMHelper::TDRMHelperAutomatedType ToneSettingToAutomatedType( - TProfileTones aToneSetting ) - { - switch( aToneSetting ) - { - case EProfileRingingToneSetting: - { - return CDRMHelper::EAutomatedTypeRingingTone; - } - case EProfileMessageAlertToneSetting: - { - return CDRMHelper::EAutomatedTypeMessageAlert; - } - case EProfileEmailAlertToneSetting: - { - return CDRMHelper::EAutomatedTypeEmailAlert; - } - case EProfileInstantMessageAlertToneSetting: - { - return CDRMHelper::EAutomatedTypeIMAlert; - } - default: - { - return CDRMHelper::EAutomatedTypeOther; - } - } - } - -// ============================ MEMBER FUNCTIONS =============================== - -// ----------------------------------------------------------------------------- -// CProfileToneHandler::DrmConstructL -// 2nd phase construct for DRM objects -// ----------------------------------------------------------------------------- -// -void CProfileToneHandler::DrmConstructL() - { - iDrmCommon = DRMCommon::NewL(); - iDrmHelper = CDRMHelper::NewL(); - } - -// ----------------------------------------------------------------------------- -// CProfileToneHandler::ReleaseDrm -// Destructor for DRM objects -// ----------------------------------------------------------------------------- -// -void CProfileToneHandler::ReleaseDrm() - { - delete iDrmHelper; - iDrmHelper = NULL; - delete iDrmCommon; - iDrmCommon = NULL; - } - -// ----------------------------------------------------------------------------- -// CProfileToneHandler::CheckProtectedFileL -// ----------------------------------------------------------------------------- -// -TInt CProfileToneHandler::CheckProtectedFileL( const TDesC& aFileName ) - { - DRMCommon::TContentProtection protection; - HBufC8* mimeType = NULL; // ignored - HBufC8* contentUri = NULL; - TUint dataLength; // ignored - TInt err = iDrmCommon->GetFileInfo( aFileName, protection, mimeType, - contentUri, dataLength ); - delete mimeType; - if( err ) - { - delete contentUri; - User::Leave( err ); - } - CleanupStack::PushL( contentUri ); - - TInt result( KErrGeneral ); - CDRMRights* rights = NULL; - err = iDrmCommon->GetActiveRights( *contentUri, DRMCommon::EPlay, rights ); - - CleanupStack::PopAndDestroy( contentUri ); - - if( rights == NULL ) - { - if( err == DRMCommon::ENoRights ) - { - // Handle "No rights" situation here - iDrmHelper->HandleErrorL( DRMCommon::ENoRights, aFileName ); - return result; - } - else - { - User::Leave( KErrGeneral ); - } - } - - CleanupStack::PushL( rights ); - - switch ( err ) - { - case CDRMRights::EFullRights: // Fall through - case CDRMRights::ERestrictedRights: - { - CDRMRights::TRestriction restriction; // ignore - CDRMRights::TExpiration expiration; - TUint32 constType; - - rights->GetRightsInfo( DRMCommon::EPlay, restriction, // ignore return - expiration, constType ); // value - - // This is CFM protected file, ringingtone is set to "no" - if ( ( rights->GetPermission().iInfoBits & ENoRingingTone ) - // This is normal DRM protected count-based tone - || ( constType & CDRMRights::ECountBased ) ) - { - ShowErrorNoteL( R_PROFILE_TEXT_DRM_PREV_RIGHTS_SET ); - } - else - { - switch ( expiration ) - { - case CDRMRights::EValidRights: - { - result = KErrNone; - break; - } - - case CDRMRights::EFutureRights: - { - iDrmHelper->HandleErrorL( DRMCommon::ENoRights, aFileName ); - break; - } - - case CDRMRights::EExpiredRights: - { - iDrmHelper->HandleErrorL( DRMCommon::ERightsExpired, aFileName ); - break; - } - - default: - { - break; - } - } - - } - - - break; - } - - case CDRMRights::EPreviewRights: - { - ShowErrorNoteL( R_PROFILE_TEXT_DRM_PREV_RIGHTS_SET ); - break; - } - - case DRMCommon::ENoRights: - { - iDrmHelper->HandleErrorL( DRMCommon::ENoRights, aFileName ); - break; - } - - default: - { - break; - } - - } - - CleanupStack::PopAndDestroy( rights ); - - return result; - } - -// ----------------------------------------------------------------------------- -// CProfileToneHandler::CanSetAutomated -// ----------------------------------------------------------------------------- -// -TBool CProfileToneHandler::CanSetAutomated( const TDesC& aFileName ) - { - TBool canSetAutomated( EFalse ); - return - iDrmHelper->CanSetAutomated( aFileName, canSetAutomated ) == KErrNone && - canSetAutomated; - } - -// ----------------------------------------------------------------------------- -// CProfileToneHandler::AskAutomated -// ----------------------------------------------------------------------------- -// -TInt CProfileToneHandler::AskAutomated( const TDesC& aFileName ) - { - return iDrmHelper->ShowAutomatedNote( aFileName ); - } - -// ----------------------------------------------------------------------------- -// CProfileToneHandler::SetAutomated -// ----------------------------------------------------------------------------- -// -TInt CProfileToneHandler::SetAutomated( TProfileTones aToneSetting, - const TDesC& aFileName ) - { - TInt err = KErrNone; - - TRAP_IGNORE( err = SetAutomatedL( aToneSetting, aFileName ) ); - - return err; - } - -// ----------------------------------------------------------------------------- -// CProfileToneHandler::SetAutomatedL -// ----------------------------------------------------------------------------- -// -TInt CProfileToneHandler::SetAutomatedL( TProfileTones aToneSetting, - const TDesC& aFileName ) - { - iDrmHelper->SetAutomatedType( ToneSettingToAutomatedType( aToneSetting ) ); - TInt err( iDrmHelper->SetAutomatedSilent( aFileName, EFalse ) ); - if( err == KErrNone ) - { - using namespace ContentAccess; - TVirtualPathPtr path( aFileName, KDefaultContentObject ); - CData* data = CData::NewLC( path, EContentShareReadWrite ); - err = data->ExecuteIntent( EPlay ); - CleanupStack::PopAndDestroy( data ); - // According to Risto Vilkman from DRM, KErrAccessDenied - // can be ignored at this point, since if - // CanSetAutomated says the tone is OK, it's OK. - if( err == KErrAccessDenied ) - { - err = KErrNone; - } - } - return err; - } - -// ----------------------------------------------------------------------------- -// CProfileToneHandler::RemoveAutomated -// ----------------------------------------------------------------------------- -// -void CProfileToneHandler::RemoveAutomated( const TDesC& aFileName ) - { - iDrmHelper->RemoveAutomatedPassive( aFileName ); // ignore return value - } - -// ----------------------------------------------------------------------------- -// CProfileToneHandler::IsProtected -// ----------------------------------------------------------------------------- -// -TBool CProfileToneHandler::IsProtected( const TDesC& aFileName ) const - { - TBool result = EFalse; - TRAP_IGNORE( result = IsProtectedL( aFileName ) ); - return result; - } - -// ----------------------------------------------------------------------------- -// CProfileToneHandler::IsProtectedL -// ----------------------------------------------------------------------------- -// -TBool CProfileToneHandler::IsProtectedL( const TDesC& aFileName ) const - { - TInt isProtected( EFalse ); - ContentAccess::TVirtualPathPtr path( aFileName, - ContentAccess::KDefaultContentObject ); - CData* data = CData::NewLC( path, EContentShareReadWrite ); - TInt result = data->GetAttribute( EIsProtected, isProtected ); - CleanupStack::PopAndDestroy(); // data - - return( ( result == DRMCommon::EOk ) && isProtected ); - } - - -// ----------------------------------------------------------------------------- -// -// Functions related to WMDRM protection check -// -// ----------------------------------------------------------------------------- - -#ifndef RD_DRM_COMMON_INTERFACE_FOR_OMA_AND_WMDRM - -// Some magic constants -static const TInt KMinContentLength( 16 ); -//_LIT8( KContentProtectionType, "DRM" ); -_LIT8( KASFHeaderObject, "75B22630668E11CFA6D900AA0062CE6C" ); -_LIT8( KWrmHeader, "W\0R\0M\0H\0E\0A\0D\0E\0R\0" ); - -// ----------------------------------------------------------------------------- -// FormatGUID -// ----------------------------------------------------------------------------- -// -LOCAL_C void FormatGUID( TDes8 &aGUID ) - { - TBuf8<16> copyGUID( aGUID ); - TInt i; - for( i = 0; i < 4; i++ ) - { - copyGUID[i] = aGUID[3-i]; - } - for( i = 4; i < 6; i++ ) - { - copyGUID[i] = aGUID[9 - i]; - } - for( i = 6; i < 8; i++ ) - { - copyGUID[i] = aGUID[13 - i]; - } - for( i = 8; i < 16 ; i++ ) - { - copyGUID[i] = aGUID[i]; - } - aGUID.Delete( 0, 32 ); - for( i = 0; i <16; i++ ) - { - aGUID.AppendNumFixedWidthUC( copyGUID[i], EHex, 2 ); - } - } - -// ----------------------------------------------------------------------------- -// ConvertToInt64 -// ----------------------------------------------------------------------------- -// -LOCAL_C TInt64 ConvertToInt64( TDesC8& aDes ) - { - TInt64 num = 0; - TInt i; - for( i = 7 ; i >= 0; i-- ) - { - num <<= 8; - num |= aDes[i]; - } - return num; - } - - -// ----------------------------------------------------------------------------- -// IsProtectedWmDrmL -// returns ETrue, if file is protected WMDRM file -// EFalse if file is not protected WMDRM file -// Leaves with KErrUnderflow if file has too little data to decide -// whether WmDrm or not -// may also leave with other system wide error code -// ----------------------------------------------------------------------------- -// -LOCAL_C TBool IsProtectedWmDrmL( RFile& aFileHandle ) - { - TInt r( KErrNone ); - HBufC8* buffer( NULL ); - TInt pos( 0 ); - RFile file; - TBuf8< 32 > header; - - TInt64 headerSize( 0 ); - TBool isProtectedWmDrm( EFalse ); - TPtr8 headerPtr( NULL, 0 ); - - // Leave if given handle is invalid - if( !aFileHandle.SubSessionHandle() ) - { - User::Leave( KErrBadHandle ); - } - - User::LeaveIfError( file.Duplicate( aFileHandle ) ); - CleanupClosePushL( file ); - - User::LeaveIfError( file.Seek( ESeekStart, pos ) ); - - // Check if the file is an ASF file - // Check on runtime wether WM DRM is supporeted or not - - User::LeaveIfError( file.Read( 0, header, KMinContentLength ) ); - if( header.Length() < KMinContentLength ) - { - User::Leave( KErrUnderflow ); - } - - FormatGUID( header ); - - if( header == KASFHeaderObject ) - { - // It's ASF, check still whether it's WM DRM protected or not - file.Read( header,8 ); - headerSize = ConvertToInt64( header ); - if( headerSize <= 30 ) - { - User::Leave( KErrUnderflow ); - } - if ( headerSize > ( ( KMaxTInt32 / 2 ) - 1 ) ) - { - User::Leave( KErrOverflow ); - } - buffer = HBufC8::NewLC( headerSize ); - - headerPtr.Set( buffer->Des() ); - User::LeaveIfError( file.Read( headerPtr, headerSize - 24 ) ); - - r = headerPtr.Find( KWrmHeader ); - if ( KErrNotFound != r ) - { - isProtectedWmDrm = ETrue; - } - CleanupStack::PopAndDestroy( buffer ); // buffer - } - CleanupStack::PopAndDestroy(); // file - - return isProtectedWmDrm; - } - -#endif // RD_DRM_COMMON_INTERFACE_FOR_OMA_AND_WMDRM - -// ----------------------------------------------------------------------------- -// -// CProfileToneHandler::IsFileWMDRMProtectedL -// -// ----------------------------------------------------------------------------- -// -TBool CProfileToneHandler::IsFileWMDRMProtectedL( const TDesC& aFileName ) - { - TBool res = EFalse; - RFile hFile; - - TInt err = hFile.Open( iFs, aFileName, - EFileRead | EFileStream | EFileShareReadersOnly ); - if( err == KErrInUse ) - { - err = hFile.Open( iFs, aFileName, - EFileRead | EFileStream | EFileShareAny ); - } - if( err != KErrNone ) - { - User::Leave( err ); - } - CleanupClosePushL( hFile ); - -#ifdef RD_DRM_COMMON_INTERFACE_FOR_OMA_AND_WMDRM - TPtrC agent( KNullDesC ); - DRM::CDrmUtility* drmUtil( DRM::CDrmUtility::NewLC() ); - drmUtil->GetAgentL( hFile, agent ); - if( agent.Compare( DRM::KDrmWMAgentName ) == 0 ) - { - res = ETrue; - } - CleanupStack::PopAndDestroy( drmUtil ); -#else - res = IsProtectedWmDrmL( hFile ); -#endif - - CleanupStack::PopAndDestroy( &hFile ); - return res; - } - -// ----------------------------------------------------------------------------- -// -// End of Functions related to WMDRM protection check -// -// ----------------------------------------------------------------------------- - -// End of File