filedetails/filedetailsdialog/src/MediaPlayerDrmHelper.cpp
changeset 0 96612d01cf9f
--- /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    <DRMHelper.h>
+#include    <bamdesca.h>
+#include    <bautils.h>
+#include    <coemain.h>
+#include    <StringLoader.h>
+#include    <aknnotewrappers.h>
+#include    <data_caging_path_literals.hrh>
+
+#include    "MediaPlayerDrmHelper.h"
+#include    <MPFileDetails.h>
+
+#include    <drmuihandling.h>
+#include    <drmautomatedusage.h>
+#include    <Oma2Agent.h>
+
+#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