omadrm/drmengine/ro/src/DrmRights.cpp
changeset 0 95b198f216e5
child 12 8a03a285ab14
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/omadrm/drmengine/ro/src/DrmRights.cpp	Thu Dec 17 08:52:27 2009 +0200
@@ -0,0 +1,1519 @@
+/*
+* Copyright (c) 2002 - 2008 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:  Implementation of common DRM operations
+*
+*/
+
+
+// INCLUDE FILES
+
+#include "DrmAsset.h"
+#include "DrmRights.h"
+#include "DrmPermission.h"
+#include "DrmConstraint.h"
+
+// EXTERNAL DATA STRUCTURES
+
+// EXTERNAL FUNCTION PROTOTYPES
+
+// CONSTANTS
+
+// MACROS
+
+// LOCAL CONSTANTS AND MACROS
+
+_LIT(KNullDate,"00000000:000000.000000");
+
+// MODULE DATA STRUCTURES
+
+// LOCAL FUNCTION PROTOTYPES
+
+// FORWARD DECLARATIONS
+
+// ============================= LOCAL FUNCTIONS ===============================
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CDRMRightsConstraints::CDRMRightsConstraints
+// Default constructor
+// -----------------------------------------------------------------------------
+EXPORT_C CDRMRightsConstraints::CDRMRightsConstraints(void)
+    {
+    iConstraint = NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRightsConstraints::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+EXPORT_C void CDRMRightsConstraints::ConstructL(void)
+    {
+    iConstraint = CDRMConstraint::NewL();
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRightsConstraints::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+EXPORT_C CDRMRightsConstraints* CDRMRightsConstraints::NewL(void)
+    {
+    CDRMRightsConstraints* self = new (ELeave) CDRMRightsConstraints;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// Destructor
+EXPORT_C CDRMRightsConstraints::~CDRMRightsConstraints(void)
+    {
+    if (iConstraint) delete iConstraint;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRightsConstraints::FullRights
+// The FullRights function checks if the object contains any restrictions
+// or if usage is unconstrained.
+// -----------------------------------------------------------------------------
+EXPORT_C TBool CDRMRightsConstraints::FullRights(void)
+    {
+    return iConstraint->iActiveConstraints == EConstraintNone ? ETrue : EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRightsConstraints::IsPreview
+// The function checks if the object represents a preview constraint.
+// -----------------------------------------------------------------------------
+EXPORT_C TBool CDRMRightsConstraints::IsPreview(void)
+    {
+    if ((iConstraint->iActiveConstraints & EConstraintCounter) &&
+        iConstraint->iOriginalCounter == 1)
+        {
+        return ETrue;
+        }
+    else
+        {
+        return EFalse;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRightsConstraints::GetConstraintInfo
+// This function checks the expiration and the constraints of the object and
+// returns the prioryty value.
+// -----------------------------------------------------------------------------
+EXPORT_C void CDRMRightsConstraints::SetConstraint(CDRMConstraint& aConstraint)
+    {
+    TInt error = KErrNone;
+    if( !iConstraint )
+        {
+        TRAP( error, iConstraint = CDRMConstraint::NewL());
+        if( error )
+            {
+            return;
+            }
+        }
+    TRAP( error, iConstraint->DuplicateL( aConstraint ) );
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRightsConstraints::GetConstraintInfo
+// This function checks the expiration and the constraints of the object and
+// returns the prioryty value.
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CDRMRightsConstraints::GetConstraintInfo(
+    TUint32& aExpiration,
+    TUint32& aConstType)
+    {
+    TTime currentTime;
+    TTime time;
+    TTimeIntervalSeconds interval;
+    TTimeIntervalSeconds diff;
+    TInt result = KErrNone;
+    currentTime.HomeTime();
+    TUint32 counter = 0;
+    TUint32 originalCounter = 0;
+    TInt priorValue = 0;
+    aConstType = NULL;
+
+    aExpiration = CDRMRights::EValidRights;
+
+    if ( FullRights() )
+        {
+        aConstType = CDRMRights::ENoConstraints;
+        return ENoConstraints * aExpiration;
+        }
+
+    result = GetEndTime(time);
+    if (result == KErrNone)
+        {
+        aConstType |= CDRMRights::ETimeBased;
+        if ( time < currentTime )
+            {
+            aExpiration = CDRMRights::EExpiredRights;
+            }
+        }
+
+    result = GetStartTime(time);
+    if (result == KErrNone && aExpiration != CDRMRights::EExpiredRights)
+        {
+        aConstType |= CDRMRights::ETimeBased;
+        if ( time > currentTime )
+            {
+            aExpiration = CDRMRights::EFutureRights;
+            }
+        }
+
+    result = GetInterval(interval);
+    if(result == KErrNone && aExpiration != CDRMRights::EExpiredRights)
+        {
+        result = GetIntervalStart(time);
+        if(result == KErrNone)
+            {
+            aConstType |= CDRMRights::ETimeBased;
+            currentTime.SecondsFrom(time, diff);
+            if (diff.Int() < 0)
+                {
+                aExpiration = CDRMRights::EFutureRights;
+                }
+            else if ( interval < diff )
+                {
+                aExpiration = CDRMRights::EExpiredRights;
+                }
+            }
+        else
+            {
+            aConstType |= CDRMRights::EInActiveInterval;
+            }
+        }
+    result = GetCounters( counter , originalCounter );
+    if (result == KErrNone)
+        {
+        aConstType |= CDRMRights::ECountBased;
+        if ( counter == 0 )
+            {
+            aExpiration = CDRMRights::EExpiredRights;
+            }
+        }
+    result = GetTimedCounters( counter , originalCounter );
+    if (result == KErrNone)
+        {
+        aConstType |= CDRMRights::ECountBased;
+        if ( counter == 0 )
+            {
+            aExpiration = CDRMRights::EExpiredRights;
+            }
+        }
+    result = GetAccumulated(interval);
+    if(result == KErrNone && aExpiration != CDRMRights::EExpiredRights)
+        {
+        aConstType |= CDRMRights::ETimeBased | CDRMRights::ETimeIsAccumulatedTime;
+        if (interval.Int() == 0)
+            {
+            aExpiration = CDRMRights::EExpiredRights;
+            }
+        }
+    if (!aConstType)
+        {
+        return CDRMRights::EInvalidRights;
+        }
+
+    if ( (aConstType & CDRMRights::ECountBased) &&
+        !(aConstType & CDRMRights::EInActiveInterval) &&
+        !(aConstType & CDRMRights::ETimeBased) )
+        {
+        priorValue = ECount * aExpiration;
+        }
+    else if ( (aConstType & CDRMRights::ECountBased) &&
+        (aConstType & CDRMRights::EInActiveInterval) &&
+        !(aConstType & CDRMRights::ETimeBased) )
+        {
+        priorValue = EIntervalCount * aExpiration;
+        }
+    else if ( (aConstType & CDRMRights::ECountBased) &&
+        (aConstType & CDRMRights::EInActiveInterval) &&
+        (aConstType & CDRMRights::ETimeBased) )
+        {
+        priorValue = ETimeIntervalCount * aExpiration;
+        }
+    else if ( (aConstType & CDRMRights::ECountBased) &&
+        !(aConstType & CDRMRights::EInActiveInterval) &&
+        (aConstType & CDRMRights::ETimeBased) )
+        {
+        priorValue = ETimeCount * aExpiration;
+        }
+    else if ( !(aConstType & CDRMRights::ECountBased) &&
+        (aConstType & CDRMRights::EInActiveInterval) &&
+        !(aConstType & CDRMRights::ETimeBased) )
+        {
+        priorValue = EInterval * aExpiration;
+        }
+    else if ( !(aConstType & CDRMRights::ECountBased) &&
+        (aConstType & CDRMRights::EInActiveInterval) &&
+        (aConstType & CDRMRights::ETimeBased) )
+        {
+        priorValue = ETimeInterval * aExpiration;
+        }
+    else if ( !(aConstType & CDRMRights::ECountBased) &&
+        !(aConstType & CDRMRights::EInActiveInterval) &&
+        (aConstType & CDRMRights::ETimeBased) )
+        {
+        priorValue = ETime * aExpiration;
+        }
+
+    return priorValue;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRightsConstraints::GetExpirationDetails
+// The function returns the end time and amount of counts left of the object.
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CDRMRightsConstraints::GetExpirationDetails(
+    TTime& aEndTime,
+    TInt& aCountsLeft)
+    {
+    TTime endTime;
+    endTime.Set(KNullDate);
+    TTimeIntervalSeconds interval;
+    TTime intervalStart;
+    intervalStart.Set(KNullDate);
+    TTime intervalEnd;
+    intervalEnd.Set(KNullDate);
+
+    TUint32 counter = 0;
+    TUint32 originalCounter = 0;
+
+    TBool isEndTime = EFalse;
+    TBool isInterval = EFalse;
+    TBool isCount = EFalse;
+
+    if (GetCounters(counter, originalCounter) == KErrNone)
+        {
+        isCount = ETrue;
+        aCountsLeft = counter;
+        }
+    else
+        {
+        aCountsLeft = -1;
+        }
+    if (GetEndTime(endTime) == KErrNone)
+        {
+        isEndTime = ETrue;
+        }
+    if (GetIntervalStart(intervalStart) == KErrNone)
+        {
+        isInterval = ETrue;
+        GetInterval(interval);
+        intervalEnd = intervalStart + interval;
+        }
+    if (isInterval && isEndTime)
+        {
+        if (intervalEnd > endTime)
+            {
+            aEndTime = endTime;
+            }
+        else
+            {
+            aEndTime = intervalEnd;
+            }
+        }
+    else if (isInterval)
+        {
+        aEndTime = intervalEnd;
+        }
+    else if (isEndTime)
+        {
+        aEndTime = endTime;
+        }
+    else if (!isCount)
+        {
+        // The object contains either a full or an inactive interval rights
+        aEndTime.Set(KNullDate);
+        aCountsLeft = -1;
+        }
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRightsConstraints::GetCounters
+// This function returns the current value of the count restriction and
+// original value of the count restriction.
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CDRMRightsConstraints::GetCounters(
+    TUint32& aCounter,
+    TUint32& aOriginalCounter)
+    {
+    if (iConstraint->iActiveConstraints & EConstraintCounter)
+        {
+        aCounter = iConstraint->iCounter;
+        aOriginalCounter = iConstraint->iOriginalCounter;
+        return KErrNone;
+        }
+    else
+        {
+        return CDRMRights::ENoRights;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRightsConstraints::GetCounters
+// This function returns the current value of the count restriction and
+// original value of the count restriction.
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CDRMRightsConstraints::GetTimedCounters(
+    TUint32& aCounter,
+    TUint32& aOriginalCounter)
+    {
+    if (iConstraint->iActiveConstraints & EConstraintTimedCounter)
+        {
+        aCounter = iConstraint->iTimedCounter;
+        aOriginalCounter = iConstraint->iOriginalCounter;
+        return KErrNone;
+        }
+    else
+        {
+        return CDRMRights::ENoRights;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRightsConstraints::GetStartTime
+//
+// This function returns the time when the constraint becomes valid or has
+// become valid.
+//
+// Cases:
+// 1. If an active interval is present, that time is always the correct start
+//    time
+// 2. If start time is defined that is the start time
+// 3. No active interval or start time defined CDRMRights::ENoRights
+//
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CDRMRightsConstraints::GetStartTime(
+    TTime& aStartTime)
+    {
+    // Activated interval is always the same or later than
+    // the start time of the start-end
+
+    if (iConstraint->iActiveConstraints & EConstraintInterval &&
+        (iConstraint->iIntervalStart != Time::NullTTime() ) )
+        {
+        aStartTime = iConstraint->iIntervalStart;
+        }
+    else if (iConstraint->iActiveConstraints & EConstraintStartTime)
+        {
+        aStartTime = iConstraint->iStartTime;
+        }
+    else
+        {
+        return CDRMRights::ENoRights;
+        }
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRightsConstraints::GetEndTime
+//
+// This function returns the time when the constraint will become invalid
+//
+// Cases:
+// 1. If both end time and activated interval is present the one which is closer
+//    to the present time will be chosen
+// 2. If only end time is available, that is returned
+// 3. If only activated interval is available, that is returned
+// 4. Otherwise CDRMRights::ENoRights
+//
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CDRMRightsConstraints::GetEndTime(
+    TTime& aEndTime)
+    {
+    // If both end time and interval have been activated
+    // take the one which is closer
+
+    if ((iConstraint->iActiveConstraints & EConstraintEndTime) &&
+        (iConstraint->iActiveConstraints & EConstraintInterval) &&
+        (iConstraint->iIntervalStart != Time::NullTTime() ) )
+        {
+        if( iConstraint->iEndTime <= (iConstraint->iIntervalStart +
+                                      iConstraint->iInterval) )
+            {
+            aEndTime = iConstraint->iEndTime;
+            }
+        else
+            {
+            aEndTime = (iConstraint->iIntervalStart +
+                        iConstraint->iInterval);
+            }
+        }
+    else if (iConstraint->iActiveConstraints & EConstraintEndTime)
+        {
+        aEndTime = iConstraint->iEndTime;
+        }
+    else if (iConstraint->iActiveConstraints & EConstraintInterval &&
+             (iConstraint->iIntervalStart != Time::NullTTime() ) )
+        {
+        aEndTime = (iConstraint->iIntervalStart +
+                    iConstraint->iInterval);
+        }
+    else
+        {
+        return CDRMRights::ENoRights;
+        }
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRightsConstraints::GetInterval
+// This function returns the interval time constraint
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CDRMRightsConstraints::GetInterval(
+    TTimeIntervalSeconds& aInterval)
+    {
+    if (iConstraint->iActiveConstraints & EConstraintInterval)
+        {
+        aInterval = iConstraint->iInterval;
+        return KErrNone;
+        }
+    else
+        {
+        return CDRMRights::ENoRights;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRightsConstraints::GetIntervalStart
+// This function returns the start of the interval time constraint
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CDRMRightsConstraints::GetIntervalStart(
+    TTime& aIntervalStart)
+    {
+    if (iConstraint->iActiveConstraints & EConstraintInterval &&
+        iConstraint->iIntervalStart != Time::NullTTime())
+        {
+        aIntervalStart = iConstraint->iIntervalStart;
+        return KErrNone;
+        }
+    else
+        {
+        return CDRMRights::ENoRights;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRightsConstraints::GetAccumulated
+// This function returns the accumulated time constraint
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CDRMRightsConstraints::GetAccumulated(
+    TTimeIntervalSeconds& aAccumulated)
+    {
+    if (iConstraint->iActiveConstraints & EConstraintAccumulated)
+        {
+        aAccumulated = iConstraint->iAccumulatedTime;
+        return KErrNone;
+        }
+    else
+        {
+        return CDRMRights::ENoRights;
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRightsConstraints::GetCounters
+// This function returns the current value of the count restriction and
+// original value of the count restriction.
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CDRMRightsConstraints::SetCounters(
+    TUint32 aCounter,
+    TUint32 aOriginalCounter)
+    {
+    iConstraint->iCounter = aCounter;
+    iConstraint->iOriginalCounter = aOriginalCounter;
+    iConstraint->iActiveConstraints |= EConstraintCounter;
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRightsConstraints::SetStartTime
+// This function sets the start time constraint
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CDRMRightsConstraints::SetStartTime(
+    TTime aStartTime)
+    {
+    iConstraint->iStartTime = aStartTime;
+    iConstraint->iActiveConstraints |= EConstraintStartTime;
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRightsConstraints::SetEndTime
+// This function sets the end time constraint
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CDRMRightsConstraints::SetEndTime(
+    TTime aEndTime)
+    {
+    iConstraint->iEndTime = aEndTime;
+    iConstraint->iActiveConstraints |= EConstraintEndTime;
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRightsConstraints::SetInterval
+// This function sets the interval time constraint
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CDRMRightsConstraints::SetInterval(
+    TTimeIntervalSeconds aInterval)
+    {
+    iConstraint->iInterval = aInterval;
+    iConstraint->iActiveConstraints |= EConstraintInterval;
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRightsConstraints::SetIntervalStart
+// This function sets the start of the interval time constraint
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CDRMRightsConstraints::SetIntervalStart(
+    TTime aStartTime)
+    {
+    iConstraint->iIntervalStart = aStartTime;
+    iConstraint->iActiveConstraints |= EConstraintInterval;
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRightsConstraints::GetConstraint
+// -----------------------------------------------------------------------------
+EXPORT_C CDRMConstraint& CDRMRightsConstraints::GetConstraint(void)
+    {
+    return *iConstraint;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRightsConstraints::operator=
+// Assignment operator.
+// -----------------------------------------------------------------------------
+EXPORT_C CDRMRightsConstraints& CDRMRightsConstraints::operator=(
+    CDRMRightsConstraints& aConstraint)
+    {
+    if (iConstraint)
+        {
+        delete iConstraint;
+        iConstraint = NULL;
+        }
+    TRAP_IGNORE( iConstraint = CDRMConstraint::NewL() );
+    if (iConstraint)
+        {
+        TRAP_IGNORE( iConstraint->DuplicateL( aConstraint.GetConstraint() ) );
+        }
+
+    return *this;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRights::CDRMRights
+// Default constructor.
+// -----------------------------------------------------------------------------
+EXPORT_C CDRMRights::CDRMRights(void):
+    iAsset(NULL),
+    iPermission(NULL)
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRights::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+EXPORT_C void CDRMRights::ConstructL(void)
+    {
+    iPermission = CDRMPermission::NewL();
+    iAsset = CDRMAsset::NewL();
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRights::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+EXPORT_C CDRMRights* CDRMRights::NewL(void)
+    {
+    CDRMRights* self = new (ELeave) CDRMRights;
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+    }
+
+// Destructor
+EXPORT_C CDRMRights::~CDRMRights(void)
+    {
+    delete iAsset;
+    delete iPermission;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRights::GetContentURI
+// This function returns the content URI of the object
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CDRMRights::GetContentURI(HBufC8*& aContentURI)
+    {
+    TInt r;
+
+    r = KErrNone;
+    if (iAsset && iAsset->iUid)
+        {
+        aContentURI = HBufC8::NewMax(iAsset->iUid->Size());
+        if (aContentURI)
+            {
+            *aContentURI = *iAsset->iUid;
+            }
+        else r = KErrNoMemory;
+        }
+    else
+        {
+        aContentURI = NULL;
+        }
+
+    return r;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRights::GetLocalID
+// This function returns the local ID of the object
+// -----------------------------------------------------------------------------
+EXPORT_C TUint32 CDRMRights::GetLocalID(void)
+    {
+    return iPermission->iUniqueID;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRights::GetAddTime
+// This function returns the time when the rights object was added to the
+// rights database.
+// -----------------------------------------------------------------------------
+EXPORT_C void CDRMRights::GetAddTime(TTime& aTime)
+    {
+    aTime = iPermission->iOriginalInsertTime;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRights::GetRightsInfo
+// This function checks the expiration and the constraints of the object and
+// retunrs the best constraint priority value.
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CDRMRights::GetRightsInfo(
+    TUint32 aConstraintSpec,
+    TRestriction& aRestriction,
+    TExpiration& aExpiration,
+    TUint32& aConstType)
+    {
+    TInt r = 0;
+    TBool noRights = ETrue;
+
+    TUint32 playConst = NULL;
+    TUint32 displayConst = NULL;
+    TUint32 exeConst = NULL;
+    TUint32 printConst = NULL;
+
+    TUint32 playExpir = EExpiredRights;
+    TUint32 displayExpir = EExpiredRights;
+    TUint32 printExpir = EExpiredRights;
+    TUint32 exeExpir = EExpiredRights;
+
+    TInt playValue = NULL;
+    TInt displayValue = NULL;
+    TInt exeValue = NULL;
+    TInt printValue = NULL;
+    TInt compareValue = NULL;
+
+    CDRMRightsConstraints* constraint = NULL;
+
+    r = GetPlayRight(constraint);
+    if (r && r != ENoRights)
+        {
+        return KErrNoMemory;
+        }
+    if (r == KErrNone &&
+       (aConstraintSpec == CDRMRights::EPlay || aConstraintSpec == 0 ) )
+        {
+        noRights = EFalse;
+        if (constraint->FullRights())
+            {
+            delete constraint;
+            constraint = NULL;
+            aExpiration = EValidRights;
+            aConstType = ENoConstraints;
+            aRestriction = EFullRights;
+            return EFullRights;
+            }
+        else
+            {
+            playValue = constraint->GetConstraintInfo(playExpir, playConst);
+            if (playValue > compareValue)
+                {
+                compareValue = playValue;
+                if(constraint->IsPreview())
+                    {
+                    aRestriction = EPreviewRights;
+                    }
+                else
+                    {
+                    aRestriction = ERestrictedRights;
+                    }
+                }
+            }
+        }
+
+    delete constraint;
+    constraint = NULL;
+
+    r = GetDisplayRight(constraint);
+    if (r && r != ENoRights)
+        {
+        return KErrNoMemory;
+        }
+    if (r == KErrNone &&
+       (aConstraintSpec == CDRMRights::EDisplay || aConstraintSpec == 0 ) )
+        {
+        noRights = EFalse;
+        if (constraint->FullRights())
+            {
+            delete constraint;
+            constraint = NULL;
+            aExpiration = EValidRights;
+            aConstType = ENoConstraints;
+            aRestriction = EFullRights;
+            return EFullRights;
+            }
+        else
+            {
+            displayValue = constraint->GetConstraintInfo(displayExpir, displayConst);
+            if (displayValue > compareValue)
+                {
+                compareValue = displayValue;
+                if(constraint->IsPreview())
+                    {
+                    aRestriction = EPreviewRights;
+                    }
+                else
+                    {
+                    aRestriction = ERestrictedRights;
+                    }
+                }
+            }
+        }
+
+    delete constraint;
+    constraint = NULL;
+
+    r = GetExecuteRight(constraint);
+    if (r && r != ENoRights)
+        {
+        return KErrNoMemory;
+        }
+    if (r == KErrNone &&
+       (aConstraintSpec == CDRMRights::EExecute || aConstraintSpec == 0 ) )
+        {
+        noRights = EFalse;
+        if (constraint->FullRights())
+            {
+            delete constraint;
+            constraint = NULL;
+            aExpiration = EValidRights;
+            aConstType = ENoConstraints;
+            aRestriction = EFullRights;
+            return EFullRights;
+            }
+        else
+            {
+            exeValue = constraint->GetConstraintInfo(exeExpir, exeConst);
+            if (exeValue > compareValue)
+                {
+                compareValue = exeValue;
+                if(constraint->IsPreview())
+                    {
+                    aRestriction = EPreviewRights;
+                    }
+                else
+                    {
+                    aRestriction = ERestrictedRights;
+                    }
+                }
+            }
+        }
+
+    delete constraint;
+    constraint = NULL;
+
+    r = GetPrintRight(constraint);
+    if (r && r != ENoRights)
+        {
+        return KErrNoMemory;
+        }
+    if (r == KErrNone &&
+       (aConstraintSpec == CDRMRights::EPrint || aConstraintSpec == 0 ) )
+        {
+        noRights = EFalse;
+        if (constraint->FullRights())
+            {
+            delete constraint;
+            constraint = NULL;
+            aExpiration = EValidRights;
+            aConstType = ENoConstraints;
+            aRestriction = EFullRights;
+            return EFullRights;
+            }
+        else
+            {
+            printValue = constraint->GetConstraintInfo(printExpir, printConst);
+            if (printValue > compareValue)
+                {
+                compareValue = exeValue;
+                if(constraint->IsPreview())
+                    {
+                    aRestriction = EPreviewRights;
+                    }
+                else
+                    {
+                    aRestriction = ERestrictedRights;
+                    }
+                }
+            }
+        }
+
+    delete constraint;
+    constraint = NULL;
+
+    if (noRights)
+        {
+        delete constraint;
+        constraint = NULL;
+        aExpiration = EExpiredRights;
+        return ENoRights;
+        }
+
+    if (aRestriction != ERestrictedRights)
+        {
+        aRestriction = EPreviewRights;
+        }
+
+    if (playExpir == EExpiredRights &&
+        displayExpir == EExpiredRights &&
+        printExpir == EExpiredRights &&
+        exeExpir == EExpiredRights)
+        {
+        aExpiration = EExpiredRights;
+        }
+
+    if (playExpir == EFutureRights ||
+        displayExpir == EFutureRights ||
+        printExpir == EFutureRights ||
+        exeExpir == EFutureRights)
+        {
+        aExpiration = EFutureRights;
+        }
+
+    if (playExpir == EValidRights ||
+        displayExpir == EValidRights ||
+        printExpir == EValidRights ||
+        exeExpir == EValidRights)
+        {
+        aExpiration = EValidRights;
+        }
+
+    if (compareValue == playValue) aConstType = playConst;
+    if (compareValue == displayValue) aConstType = displayConst;
+    if (compareValue == exeValue) aConstType = exeConst;
+    if (compareValue == printValue) aConstType = printConst;
+
+    return compareValue;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRights::GetExpirationDetails
+// The function returns the end time and amount of counts left of the object.
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CDRMRights::GetExpirationDetails(
+    TUint32 aConstraintSpec,
+    TTime& aEndTime,
+    TInt& aCountsLeft)
+    {
+    TInt r = 0;
+    CDRMRightsConstraints* constraint = NULL;
+
+    TTime playEndTime;
+    playEndTime.Set(KNullDate);
+    TTime displayEndTime;
+    displayEndTime.Set(KNullDate);
+    TTime executeEndTime;
+    executeEndTime.Set(KNullDate);
+    TTime printEndTime;
+    printEndTime.Set(KNullDate);
+    TTime compareTime;
+    compareTime.Set(KNullDate);
+
+    TInt playCounter = 0;
+    TInt displayCounter = 0;
+    TInt executeCounter = 0;
+    TInt printCounter = 0;
+
+    TBool noRights = ETrue;
+
+    aEndTime.Set(KNullDate);
+    aCountsLeft  = 0;
+
+    r = GetPlayRight(constraint);
+    if (r == KErrNone &&
+       (aConstraintSpec == CDRMRights::EPlay || aConstraintSpec == 0 ) )
+        {
+        noRights = EFalse;
+        if (constraint->FullRights())
+            {
+            delete constraint;
+            constraint = NULL;
+            aEndTime.Set(KNullDate);
+            aCountsLeft = -1;
+            return KErrNone;
+            }
+        else
+            {
+            r = constraint->GetExpirationDetails(playEndTime, playCounter);
+            if(playEndTime == compareTime && playCounter == -1)
+                {
+                delete constraint;
+                constraint = NULL;
+                return KErrNone;
+                }
+            }
+        }
+
+    delete constraint;
+    constraint = NULL;
+
+    r = GetDisplayRight(constraint);
+    if (r == KErrNone &&
+       (aConstraintSpec == CDRMRights::EDisplay || aConstraintSpec == 0 ) )
+        {
+        noRights = EFalse;
+        if (constraint->FullRights())
+            {
+            delete constraint;
+            constraint = NULL;
+            aEndTime.Set(KNullDate);
+            aCountsLeft = -1;
+            return KErrNone;
+            }
+        else
+            {
+            r = constraint->GetExpirationDetails(displayEndTime, displayCounter);
+            if(displayEndTime == compareTime && displayCounter == -1)
+                {
+                delete constraint;
+                constraint = NULL;
+                return KErrNone;
+                }
+            }
+        }
+
+    delete constraint;
+    constraint = NULL;
+
+    r = GetExecuteRight(constraint);
+    if (r == KErrNone &&
+       (aConstraintSpec == CDRMRights::EExecute || aConstraintSpec == 0 ) )
+        {
+        noRights = EFalse;
+        if (constraint->FullRights())
+            {
+            delete constraint;
+            constraint = NULL;
+            aEndTime.Set(KNullDate);
+            aCountsLeft = -1;
+            return KErrNone;
+            }
+        else
+            {
+            r = constraint->GetExpirationDetails(executeEndTime, executeCounter);
+            if(executeEndTime == compareTime && executeCounter == -1)
+                {
+                delete constraint;
+                constraint = NULL;
+                return KErrNone;
+                }
+            }
+        }
+
+    delete constraint;
+    constraint = NULL;
+
+    r = GetPrintRight(constraint);
+    if (r == KErrNone &&
+       (aConstraintSpec == CDRMRights::EPrint || aConstraintSpec == 0 ) )
+        {
+        noRights = EFalse;
+        if (constraint->FullRights())
+            {
+            delete constraint;
+            constraint = NULL;
+            aEndTime.Set(KNullDate);
+            aCountsLeft = -1;
+            return KErrNone;
+            }
+        else
+            {
+            r = constraint->GetExpirationDetails(printEndTime, printCounter);
+            if(printEndTime == compareTime && printCounter == -1)
+                {
+                delete constraint;
+                constraint = NULL;
+                return KErrNone;
+                }
+            }
+        }
+
+    delete constraint;
+    constraint = NULL;
+
+    if (noRights)
+        {
+        aEndTime.Set(KNullDate);
+        aCountsLeft = -1;
+        return ENoRights;
+        }
+
+    compareTime.HomeTime();
+
+    if (playCounter > aCountsLeft)
+        {
+        aEndTime = playEndTime;
+        aCountsLeft = playCounter;
+        }
+    if (displayCounter > aCountsLeft)
+        {
+        aEndTime = displayEndTime;
+        aCountsLeft = displayCounter;
+        }
+    if (executeCounter > aCountsLeft)
+        {
+        aEndTime = executeEndTime;
+        aCountsLeft = executeCounter;
+        }
+    if (printCounter > aCountsLeft)
+        {
+        aEndTime = printEndTime;
+        aCountsLeft = printCounter;
+        }
+
+    if (aCountsLeft > 0 &&
+        playEndTime < compareTime && displayEndTime < compareTime &&
+        executeEndTime < compareTime && printEndTime < compareTime)
+        {
+        return KErrNone;
+        }
+
+    if (playEndTime > aEndTime)
+        {
+        aEndTime = playEndTime;
+        aCountsLeft  = playCounter;
+        }
+    if (displayEndTime > aEndTime)
+        {
+        aEndTime = displayEndTime;
+        aCountsLeft  = displayCounter;
+        }
+    if (executeEndTime > aEndTime)
+        {
+        aEndTime = executeEndTime;
+        aCountsLeft  = executeCounter;
+        }
+    if (printEndTime > aEndTime)
+        {
+        aEndTime = printEndTime;
+        aCountsLeft  = printCounter;
+        }
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRights::GetPlayRight
+// This function returns the constraints associated with the play right.
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CDRMRights::GetPlayRight(
+    CDRMRightsConstraints*& aConstraint)
+    {
+    TInt r = ENoRights;
+
+    aConstraint = NULL;
+    if (iPermission->iAvailableRights & ERightsPlay)
+        {
+        TRAP(r, aConstraint = CDRMRightsConstraints::NewL());
+        if (r == KErrNone)
+            {
+            aConstraint->SetConstraint(*iPermission->iPlay);
+            }
+        }
+    return r;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRights::GetDisplayRight
+// This function returns the constraints associated with the display right.
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CDRMRights::GetDisplayRight(
+    CDRMRightsConstraints*& aConstraint)
+    {
+    TInt r = ENoRights;
+
+    aConstraint = NULL;
+    if (iPermission->iAvailableRights & ERightsDisplay)
+        {
+        TRAP(r, aConstraint = CDRMRightsConstraints::NewL());
+        if (r == KErrNone)
+            {
+            aConstraint->SetConstraint(*iPermission->iDisplay);
+            }
+        }
+    return r;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRights::GetPrintRight
+// This function returns the constraints associated with the print right.
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CDRMRights::GetPrintRight(
+    CDRMRightsConstraints*& aConstraint)
+    {
+    TInt r = ENoRights;
+
+    aConstraint = NULL;
+    if (iPermission->iAvailableRights & ERightsPrint)
+        {
+        TRAP(r, aConstraint = CDRMRightsConstraints::NewL());
+        if (r == KErrNone)
+            {
+            aConstraint->SetConstraint(*iPermission->iPrint);
+            }
+        }
+    return r;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRights::GetExecuteRight
+// This function returns the constraints associated with the execute right.
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CDRMRights::GetExecuteRight(
+    CDRMRightsConstraints*& aConstraint)
+    {
+    TInt r = ENoRights;
+
+    aConstraint = NULL;
+    if (iPermission->iAvailableRights & ERightsExecute)
+        {
+        TRAP(r, aConstraint = CDRMRightsConstraints::NewL());
+        if (r == KErrNone)
+            {
+            aConstraint->SetConstraint(*iPermission->iExecute);
+            }
+        }
+    return r;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRights::SetContentURIAndLocalID
+// This function sets the content URI and local ID of the object
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CDRMRights::SetContentURIAndLocalID(
+    HBufC8* aContentURI,
+    TUint32 aLocalID)
+    {
+    TInt r = KErrNone;
+
+    if (!iAsset)
+        {
+        TRAP(r, iAsset = CDRMAsset::NewL());
+        }
+
+    if (iAsset)
+        {
+        if( iAsset->iUid )
+            {
+            delete iAsset->iUid;
+            }
+        iAsset->iUid = aContentURI;
+
+        if ( !iPermission )
+            {
+            TRAP(r, iPermission = CDRMPermission::NewL());
+            }
+
+        if ( iPermission )
+            {
+            iPermission->iUniqueID = aLocalID;
+            }
+        }
+
+    return r;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRights::SetContentURI
+// This function sets the content URI of the object
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CDRMRights::SetContentURI(
+    HBufC8* aContentURI)
+    {
+    if (iAsset)
+        {
+        delete iAsset->iUid;
+        iAsset->iUid = aContentURI;
+        }
+
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRights::SetLocalID
+// This function sets the content URI and local ID of the object
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CDRMRights::SetLocalID(
+    TUint32 aLocalID)
+    {
+    iPermission->iUniqueID = aLocalID;
+    return KErrNone;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRights::GetAddTime
+// This function sets the time when the rights object was added to the
+// rights database.
+// -----------------------------------------------------------------------------
+EXPORT_C void CDRMRights::SetAddTime(
+    TTime aTime)
+    {
+    iPermission->iOriginalInsertTime = aTime;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRights::SetPlayRight
+// This function sets the constraints associated with the play right.
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CDRMRights::SetPlayRight(
+    CDRMRightsConstraints* aConstraint)
+    {
+    TInt error = KErrNone;
+
+    if( !iPermission )
+        {
+        TRAP( error, iPermission = CDRMPermission::NewL());
+        if( error )
+            {
+            return error;
+            }
+        }
+    else if( !iPermission->iPlay )
+        {
+        TRAP( error, iPermission->iPlay = CDRMConstraint::NewL() );
+        if( error )
+            {
+            return error;
+            }
+        }
+
+    TRAP( error, iPermission->iPlay->DuplicateL( aConstraint->GetConstraint() ) );
+    return error;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRights::SetDisplayRight
+// This function sets the constraints associated with the display right.
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CDRMRights::SetDisplayRight(
+    CDRMRightsConstraints* aConstraint)
+    {
+    TInt error = KErrNone;
+
+    if( !iPermission )
+        {
+        TRAP( error, iPermission = CDRMPermission::NewL());
+        if( error )
+            {
+            return error;
+            }
+        }
+    else if( !iPermission->iDisplay )
+        {
+        TRAP( error, iPermission->iDisplay = CDRMConstraint::NewL() );
+        if( error )
+            {
+            return error;
+            }
+        }
+
+    TRAP( error, iPermission->iDisplay->DuplicateL( aConstraint->GetConstraint() ) );
+    return error;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRights::SetPrintRight
+// This function sets the constraints associated with the print right.
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CDRMRights::SetPrintRight(
+    CDRMRightsConstraints* aConstraint)
+    {
+    TInt error = KErrNone;
+
+    if( !iPermission )
+        {
+        TRAP( error, iPermission = CDRMPermission::NewL());
+        if( error )
+            {
+            return error;
+            }
+        }
+    else if( !iPermission->iPrint )
+        {
+        TRAP( error, iPermission->iPrint = CDRMConstraint::NewL() );
+        if( error )
+            {
+            return error;
+            }
+        }
+
+    TRAP( error, iPermission->iPrint->DuplicateL( aConstraint->GetConstraint() ) );
+    return error;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRights::SetExecuteRight
+// This function sets the constraints associated with the execute right.
+// -----------------------------------------------------------------------------
+EXPORT_C TInt CDRMRights::SetExecuteRight(
+    CDRMRightsConstraints* aConstraint)
+    {
+    TInt error = KErrNone;
+
+    if( !iPermission )
+        {
+        TRAP( error, iPermission = CDRMPermission::NewL());
+        if( error )
+            {
+            return error;
+            }
+        }
+    else if( !iPermission->iExecute )
+        {
+        TRAP( error, iPermission->iExecute = CDRMConstraint::NewL() );
+        if( error )
+            {
+            return error;
+            }
+        }
+
+    TRAP( error, iPermission->iExecute->DuplicateL( aConstraint->GetConstraint() ) );
+    return error;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRights::GetPermission
+// -----------------------------------------------------------------------------
+EXPORT_C CDRMPermission& CDRMRights::GetPermission(void)
+    {
+    return *iPermission;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRights::SetPermissionL
+// -----------------------------------------------------------------------------
+EXPORT_C void CDRMRights::SetPermissionL(CDRMPermission& aRO)
+    {
+    delete iPermission;
+    iPermission = NULL;
+    iPermission = CDRMPermission::NewL();
+    iPermission->DuplicateL(aRO);
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRights::GetAsset
+// -----------------------------------------------------------------------------
+EXPORT_C CDRMAsset& CDRMRights::GetAsset(void)
+    {
+    return *iAsset;
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRights::SetAssetL
+// -----------------------------------------------------------------------------
+EXPORT_C void CDRMRights::SetAssetL(CDRMAsset& aAsset)
+    {
+    delete iAsset;
+    iAsset = NULL;
+    iAsset = CDRMAsset::NewL();
+    iAsset->DuplicateL(aAsset);
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRights::operator=
+// Assignment operator.
+// -----------------------------------------------------------------------------
+EXPORT_C CDRMRights& CDRMRights::operator=(
+    CDRMRights& aRight)
+    {
+    TInt r = KErrNone;
+
+    if (this == &aRight)
+        {
+        return *this;
+        }
+
+    TRAP(r, SetAssetL(aRight.GetAsset()));
+    TRAP(r, SetPermissionL(aRight.GetPermission()));
+
+    return* this;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CDRMRights::ExternalizeL
+// -----------------------------------------------------------------------------
+EXPORT_C void CDRMRights::ExternalizeL(RWriteStream& aStream) const
+    {
+    iAsset->ExternalizeL(aStream);
+    iPermission->ExternalizeL(aStream);
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRights::InternalizeL
+// -----------------------------------------------------------------------------
+EXPORT_C void CDRMRights::InternalizeL(RReadStream& aStream)
+    {
+    delete iAsset;
+    iAsset = NULL;
+    delete iPermission;
+    iPermission=NULL;
+
+    iAsset = CDRMAsset::NewL();
+    iPermission = CDRMPermission::NewL();
+
+    iAsset->InternalizeL(aStream);
+    iPermission->InternalizeL(aStream);
+    }
+
+// -----------------------------------------------------------------------------
+// CDRMRights::Merge
+// -----------------------------------------------------------------------------
+EXPORT_C void CDRMRights::Merge(const CDRMRights& aRights)
+    {
+    iPermission->Merge(*aRights.iPermission);
+    }
+
+// End of file