diff -r 000000000000 -r 96612d01cf9f filedetails/filedetailsdialog/src/MediaPlayerDrmHelper.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/filedetails/filedetailsdialog/src/MediaPlayerDrmHelper.cpp Mon Jan 18 20:21:12 2010 +0200 @@ -0,0 +1,410 @@ +/* +* 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 the License "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: DRM helper for Media files.* +*/ + + + +// INCLUDE FILES +#include +#include +#include +#include +#include +#include +#include + +#include "MediaPlayerDrmHelper.h" +#include + +#include +#include +#include + +#include "mpxvideo_debug.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CMediaPlayerDrmHelper::CMediaPlayerDrmHelper(aDrmHelper,aUIController) +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CMediaPlayerDrmHelper::CMediaPlayerDrmHelper( + CDRMHelper* aDrmHelper, + CMPVideoPlayerUIController* /*aUIController*/ ) + : iDrmHelper(aDrmHelper) + , iEnv(CCoeEnv::Static()) +{ + MPX_ENTER_EXIT(_L("CMediaPlayerDrmHelper::CMediaPlayerDrmHelper()")); +} + +// ----------------------------------------------------------------------------- +// CMediaPlayerDrmHelper::CMediaPlayerDrmHelper(aDrmHelper) +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +// +CMediaPlayerDrmHelper::CMediaPlayerDrmHelper( CDRMHelper* aDrmHelper ) + : iDrmHelper(aDrmHelper) + , iEnv( CCoeEnv::Static() ) +{ + MPX_ENTER_EXIT(_L("CMediaPlayerDrmHelper::CMediaPlayerDrmHelper()")); +} + +// ----------------------------------------------------------------------------- +// CMediaPlayerDrmHelper::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +// +void CMediaPlayerDrmHelper::ConstructL() +{ + MPX_ENTER_EXIT(_L("CMediaPlayerDrmHelper::ConstructL()")); + iDrmUiHandling = DRM::CDrmUiHandling::NewL(iEnv); + iDrmUtility = &iDrmUiHandling->GetUtility(); +} + +// ----------------------------------------------------------------------------- +// CMediaPlayerDrmHelper::NewL(aDrmHelper,aUIController) +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CMediaPlayerDrmHelper* +CMediaPlayerDrmHelper::NewL( CDRMHelper* aDrmHelper, + CMPVideoPlayerUIController* aUIController ) +{ + MPX_ENTER_EXIT(_L("CMediaPlayerDrmHelper::NewL()")); + + CMediaPlayerDrmHelper* self = + new (ELeave) CMediaPlayerDrmHelper(aDrmHelper,aUIController); + + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + + return self; +} + +// ----------------------------------------------------------------------------- +// CMediaPlayerDrmHelper::NewL(aDrmHelper,aUIController) +// Two-phased constructor. +// ----------------------------------------------------------------------------- +// +CMediaPlayerDrmHelper* CMediaPlayerDrmHelper::NewL( CDRMHelper* aDrmHelper ) +{ + MPX_ENTER_EXIT(_L("CMediaPlayerDrmHelper::NewL()")); + + CMediaPlayerDrmHelper* self = + new (ELeave) CMediaPlayerDrmHelper(aDrmHelper); + + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + + return self; +} + +// ----------------------------------------------------------------------------- +// CMediaPlayerDrmHelper::~CMediaPlayerDrmHelper +// Destructor +// ----------------------------------------------------------------------------- +// +CMediaPlayerDrmHelper::~CMediaPlayerDrmHelper() +{ + MPX_ENTER_EXIT(_L("CMediaPlayerDrmHelper::~CMediaPlayerDrmHelper()")); + + delete iInfoUrl; + delete iFileName; + delete iPreviewUri; + delete iRightsConstraints; + delete iDrmUiHandling; +} + +// ----------------------------------------------------------------------------- +// CMediaPlayerDrmHelper::LoadDrmUsageRightsInfoL +// ----------------------------------------------------------------------------- +// +void +CMediaPlayerDrmHelper::LoadDrmUsageRightsInfoL( const TDesC& aFileName ) +{ + MPX_ENTER_EXIT(_L("CMediaPlayerDrmHelper::LoadDrmUsageRightsInfoL()")); + + + if ( BaflUtils::FileExists(iEnv->FsSession(), aFileName) ) + { + iExpired = EFalse; + delete iInfoUrl; + iInfoUrl = NULL; + delete iPreviewUri; + iPreviewUri = NULL; + delete iRightsConstraints; + iRightsConstraints = NULL; + delete iFileName; + iFileName = NULL; + + iFileName = aFileName.AllocL(); + +#ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API + RFile64 fileHandle; +#else + RFile fileHandle; +#endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API + + TUint fileMode = EFileShareReadersOrWriters | + EFileStream | + EFileRead; + + CreateFileHandleLC( fileHandle, *iFileName, fileMode ); + LoadDrmUsageRightsInfoL( fileHandle ); + CleanupStack::PopAndDestroy(); // fileHandle + } + else + { + User::Leave(KErrNotFound); + } +} + +// ----------------------------------------------------------------------------- +// CMediaPlayerDrmHelper::GetDrmUsageRightsStatus +// ----------------------------------------------------------------------------- +// +void +CMediaPlayerDrmHelper::GetDrmUsageRightsStatus(TMediaPlayerRightsStatus& aStatus) +{ + MPX_ENTER_EXIT(_L("CMediaPlayerDrmHelper::GetDrmUsageRightsStatus()")); + + if ( ! iProtected ) + { + aStatus = EMediaPlayerFull; + } + // This check ensures that the non-OMA DRM is assigned the correct status. + // If content is not OMA DRM then currently the only other choice is WM DRM. + else if ( iProtected && ! iOMAProtected ) + { + if ( iExpired ) + { + aStatus = KMediaPlayerWmdrmExpired; + } + else + { + aStatus = KMediaPlayerWmdrmValid; + } + } + else if ( iExpired ) + { + aStatus = EMediaPlayerExpired; + } + else if ( iRightsConstraints ) + { + if ( iRightsConstraints->IsPreview() ) + { + aStatus = EMediaPlayerPreview; + } + else if ( iRightsConstraints->FullRights() ) + { + aStatus = EMediaPlayerFull; + } + else + { + TTime time; + TTime startTime; + + time.HomeTime(); + TInt error = GetDrmStartTime(startTime); + + // Check that usage time has already started + if (!error && time < startTime) + { + aStatus = EMediaPlayerExpired; + } + else + { + aStatus = EMediaPlayerRestricted; + } + } + } + else + { + aStatus = EMediaPlayerMissing; + } + + MPX_DEBUG(_L( + "CMediaPlayerDrmHelper::GetDrmUsageRightsStatus() ret %d"), + aStatus); +} + +// ----------------------------------------------------------------------------- +// CMediaPlayerDrmHelper::GetDrmStartTime +// ----------------------------------------------------------------------------- +// +TInt CMediaPlayerDrmHelper::GetDrmStartTime(TTime& aStartTime) +{ + MPX_ENTER_EXIT(_L("CMediaPlayerDrmHelper::GetDrmStartTime()")); + + TInt error = KErrNone; + + if (!iProtected || !iOMAProtected) + { + error = KErrNotFound; + } + else if (iRightsConstraints) + { + TRAP(error, iRightsConstraints->GetStartTimeL(aStartTime)); + } + else + { + error = KErrNotReady; + } + + return error; +} + +// ----------------------------------------------------------------------------- +// CMediaPlayerDrmHelper::DrmHelper +// ----------------------------------------------------------------------------- +// +CDRMHelper* CMediaPlayerDrmHelper::DrmHelper() +{ + MPX_ENTER_EXIT(_L("CMediaPlayerDrmHelper::DrmHelper()")); + return iDrmHelper; +} + +// ----------------------------------------------------------------------------- +// CMediaPlayerDrmHelper::LoadDrmUsageRightsInfoL +// ----------------------------------------------------------------------------- +// +void CMediaPlayerDrmHelper::LoadDrmUsageRightsInfoL( +#ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API + RFile64& aFile ) +#else + RFile& aFile ) +#endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API +{ + MPX_ENTER_EXIT(_L("CMediaPlayerDrmHelper::LoadDrmUsageRightsInfoL()")); + + iExpired = EFalse; + delete iInfoUrl; + iInfoUrl = NULL; + delete iPreviewUri; + iPreviewUri = NULL; + delete iRightsConstraints; + iRightsConstraints = NULL; + delete iFileName; + iFileName = NULL; + + // + // Get the agent information and protection status + // + TPtrC agentId; + DRM::TDrmProtectionStatus protectionStatus; + iDrmUtility->GetDrmInfoL( aFile, agentId, protectionStatus ); + iProtected = ( protectionStatus == DRM::EUProtected ); + iOMAProtected = ( agentId.Match(KOmaDrm2AgentName) != KErrNotFound ); + + // Check to make sure that DRM helper is accessed only for OMA DRM + if ( iProtected && iOMAProtected ) + { + CDRMHelperRightsConstraints* ignore1 = NULL; + CDRMHelperRightsConstraints* ignore2 = NULL; + CDRMHelperRightsConstraints* ignore3 = NULL; + + // No replacement for this currently available via DRM Utility + TRAPD( error, iDrmHelper->GetRightsDetailsL( aFile, + ContentAccess::EPlay, + iExpired, + iDrmSendingAllowed, + iRightsConstraints, + ignore1, + ignore2, + ignore3 ) ); + + // Delete ignored constraints + delete ignore1; + ignore1 = NULL; + delete ignore2; + ignore2 = NULL; + delete ignore3; + ignore3 = NULL; + + if ( error == KErrCANoPermission ) + { + iExpired = ETrue; + } + else if (error != KErrCANoRights) + { + User::LeaveIfError( error ); + } + } + // get the attributes for protected WMDRM content + else if ( iProtected && ! iOMAProtected ) + { + CContent* content = CContent::NewLC(aFile); + + TInt value; + TInt err; + + err = content->GetAttribute( ECanPlay, value ); + + if ( err == KErrNone ) + { + iExpired = ( ! value ); + MPX_DEBUG(_L(" iExpired = %d"), iExpired); + } + else + { + MPX_DEBUG(_L(" ECanPlay failed")); + } + + err = content->GetAttribute( EIsForwardable, value ); + + if ( err == KErrNone ) + { + iDrmSendingAllowed = value; + MPX_DEBUG(_L(" iDrmSendingAllowed = %d"), iDrmSendingAllowed); + } + else + { + MPX_DEBUG(_L(" EIsForwardable failed")); + } + + CleanupStack::PopAndDestroy( content ); + } + else + { + iExpired = EFalse; + iDrmSendingAllowed = ETrue; + } +} + +// ----------------------------------------------------------------------------- +// CMediaPlayerDrmHelper::CreateFileHandleLC +// ----------------------------------------------------------------------------- +// +void CMediaPlayerDrmHelper::CreateFileHandleLC( +#ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API + RFile64& aHandle, +#else + RFile& aHandle, +#endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API + const TDesC& aName, + TUint aFileMode ) +{ + // Get the file server session + RFs fs = CEikonEnv::Static()->FsSession(); + User::LeaveIfError(aHandle.Open(fs, aName, aFileMode)); + CleanupClosePushL(aHandle); +} + +// End of File