commondrm/drmrightsmanagerui/src/DRMRightsMgrDetailsContainer.cpp
changeset 0 95b198f216e5
child 17 e16d72588c28
child 23 493788a4a8a4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/commondrm/drmrightsmanagerui/src/DRMRightsMgrDetailsContainer.cpp	Thu Dec 17 08:52:27 2009 +0200
@@ -0,0 +1,1133 @@
+/*
+* Copyright (c) 2003-2009 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 CDRMRightsMgrDetailsContainer class
+*
+*/
+
+
+// INCLUDE FILES
+#include <stringloader.h>
+#include <aknlists.h>
+#include <cdirectorylocalizer.h>
+#include <drmrights.h>
+
+#include <drmrightsmanager.rsg>
+
+#include "drmrightsmgrdetailscontainer.h"
+#include "drmcommonutilities.h"
+#include "drmutilityinternaltypes.h"
+
+// CONSTANTS
+LOCAL_C const TInt KMsgLineLength = 100;
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+// -----------------------------------------------------------------------------
+// CDRMRightsMgrDetailsContainer::CDRMRightsMgrDetailsContainer
+// -----------------------------------------------------------------------------
+//
+CDRMRightsMgrDetailsContainer::CDRMRightsMgrDetailsContainer(
+                                                        TDetails& aDetails,
+                                                        TBool aStartEmbedded )
+: iDetails( aDetails ),
+  iStartEmbedded( aStartEmbedded ),
+  iListBox( NULL )
+    {
+    }
+
+
+// ---------------------------------------------------------
+// CDRMRightsMgrDetailsContainer::ConstructL
+// ---------------------------------------------------------
+//
+void CDRMRightsMgrDetailsContainer::ConstructL( const TRect& aRect )
+    {
+    iListBox = new( ELeave )CAknDoubleStyleListBox;     // Creates new object
+
+    CreateWindowL(); //makes the control a window-owning control
+
+    ConstructListBoxL();
+
+    if ( iListBox )
+        {
+        // set iListBox to be contained in this container
+        iListBox->SetContainerWindowL( *this );
+        SetScrollBarL();
+        }
+
+    SetRect( aRect );
+    ActivateL();
+
+    SetIconsL();
+    }
+
+// ---------------------------------------------------------
+// CDRMRightsMgrDetailsContainer::~CDRMRightsMgrDetailsContainer
+// ---------------------------------------------------------
+//
+CDRMRightsMgrDetailsContainer::~CDRMRightsMgrDetailsContainer()
+    {
+    delete iListBox;
+    }
+
+// ---------------------------------------------------------
+// CDRMRightsMgrDetailsContainer::SizeChanged
+// ---------------------------------------------------------
+//
+void CDRMRightsMgrDetailsContainer::SizeChanged()
+   {
+    if ( iListBox )
+        {
+        iListBox->SetRect( Rect() ); // Sets rectangle of listbox.
+        }
+    }
+
+// ---------------------------------------------------------
+// CDRMRightsMgrDetailsContainer::CountComponentControls
+// ---------------------------------------------------------
+//
+TInt CDRMRightsMgrDetailsContainer::CountComponentControls() const
+    {
+    TInt count( 0 );
+
+    if ( iListBox )
+        {
+        count++;
+        }
+
+    return count; // Returns number of controls inside this container.
+    }
+
+// ---------------------------------------------------------
+// CDRMRightsMgrDetailsContainer::ComponentControl
+// ---------------------------------------------------------
+//
+CCoeControl* CDRMRightsMgrDetailsContainer::ComponentControl( TInt aIndex ) const
+    {
+    switch ( aIndex )
+        {
+        case 0:
+            return iListBox;    // Returns the pointer to listbox object.
+        default:
+            return NULL;        // Exception : Returns NULL.
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CDRMRightsMgrDetailsContainer::HandleResourceChange
+// ---------------------------------------------------------------------------
+//
+void CDRMRightsMgrDetailsContainer::HandleResourceChange( TInt aType )
+    {
+    CCoeControl::HandleResourceChange( aType );
+    }
+
+// ---------------------------------------------------------
+// CDRMRightsMgrDetailsContainer::SetScrollBarL
+// ---------------------------------------------------------
+//
+void CDRMRightsMgrDetailsContainer::SetScrollBarL()
+    {
+    // Update scrollbar in order to draw correct scroll bar.
+    TInt pos( iListBox->View()->CurrentItemIndex() );
+    if ( iListBox->ScrollBarFrame() )
+        {
+        iListBox->ScrollBarFrame()->MoveVertThumbTo( pos );
+        }
+
+    iListBox->CreateScrollBarFrameL( ETrue );
+    iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(
+                                                CEikScrollBarFrame::EOff,
+                                                CEikScrollBarFrame::EAuto );
+    }
+
+
+// ---------------------------------------------------------
+// CDRMRightsMgrDetailsContainer::OfferKeyEventL
+// ---------------------------------------------------------
+//
+TKeyResponse CDRMRightsMgrDetailsContainer::OfferKeyEventL( const TKeyEvent& aKeyEvent,
+                                                TEventCode aType )
+    {
+    if ( aType != EEventKey ) // Is not key event?
+        {
+        return EKeyWasNotConsumed;
+        }
+    else if ( aKeyEvent.iCode == EKeyLeftArrow ||
+              aKeyEvent.iCode == EKeyRightArrow )
+        {
+        return EKeyWasConsumed;
+        }
+    else
+        {
+        return iListBox ? iListBox->OfferKeyEventL( aKeyEvent, aType ) :
+                          EKeyWasNotConsumed;
+        }
+    }
+
+// ---------------------------------------------------------
+// CDRMRightsMgrDetailsContainer::Draw
+// ---------------------------------------------------------
+//
+void CDRMRightsMgrDetailsContainer::Draw( const TRect& /*aRect*/ ) const
+    {
+    }
+
+// ---------------------------------------------------------
+// CDRMRightsMgrDetailsContainer::HandleControlEventL
+// ---------------------------------------------------------
+//
+void CDRMRightsMgrDetailsContainer::HandleControlEventL( CCoeControl* /*aControl*/,
+                                             TCoeEvent /*aEventType*/ )
+    {
+    }
+
+// ---------------------------------------------------------
+// CDRMRightsMgrDetailsContainer::SetIconsL
+// ---------------------------------------------------------
+//
+void CDRMRightsMgrDetailsContainer::SetIconsL()
+    {
+    }
+
+// ---------------------------------------------------------
+// CDRMRightsMgrDetailsContainer::FocusChanged
+// ---------------------------------------------------------
+//
+void CDRMRightsMgrDetailsContainer::FocusChanged(TDrawNow /*aDrawNow*/)
+   {
+    if ( iListBox )
+        {
+        iListBox->SetFocus( IsFocused() );
+        }
+    }
+
+// ---------------------------------------------------------
+// CDRMRightsMgrDetailsContainer::ConstructListBoxL
+// ---------------------------------------------------------
+//
+void CDRMRightsMgrDetailsContainer::ConstructListBoxL()
+    {
+    iListBox->ConstructL( this, EAknListBoxViewerFlags /* | 
+        EAknListBoxItemSpecificMenuDisabled */ );
+
+    if ( iStartEmbedded )
+        {
+        iListBox->View()->SetListEmptyTextL( KNullDesC );
+        }
+    else
+        {
+        UpdateListBoxContentL( iDetails );        // Updates content
+        }
+    }
+
+// ---------------------------------------------------------
+// CDRMRightsMgrDetailsContainer::UpdateListBoxContentL
+// ---------------------------------------------------------
+//
+void CDRMRightsMgrDetailsContainer::UpdateListBoxContentL( TDetails& aDetails )
+    {
+    CDesCArray* items = ( CDesCArray* )( iListBox->Model()->ItemTextArray() );
+    items->Reset();
+
+    TInt rightsCount = aDetails.iRights->Count();
+
+    if ( rightsCount )
+        {
+        // Add only the details of the currently active RO, although the file
+        // could be related to multiple ROs.
+        AddRightsDetailsL( aDetails.iActiveROindex, aDetails, items );
+        }
+    else
+        {
+        // WMDRM agent returned an empty array of rights. Add the status line
+        // of rights.
+        if ( aDetails.iDrmScheme == EDrmSchemeWmDrm )
+            {
+            AddStatusLineL( aDetails.iRights->At( 0 ).iStatus, items );
+            }
+        }
+
+    // Content sending
+    if ( aDetails.iDrmScheme != EDrmSchemeUnknownDrm )
+        {
+        AddContentSendingLineL( aDetails.iContentCanBeSent, items );
+        }
+
+    // Individual constraint
+    if ( aDetails.iIndividualConstraint )
+        {
+        AddContentUseLineL( aDetails.iUsageAllowed, items );
+        }
+
+    iListBox->HandleItemAdditionL();
+    }
+
+
+// ---------------------------------------------------------
+// CDRMRightsMgrDetailsContainer::HandleListBoxEventL
+// ---------------------------------------------------------
+//
+void CDRMRightsMgrDetailsContainer::HandleListBoxEventL(
+                    CEikListBox* /*aListBox*/, TListBoxEvent /*aEventType*/ )
+    {
+    }
+
+
+// ---------------------------------------------------------
+// CDRMRightsMgrDetailsContainer::AddRightsDetailsL
+// ---------------------------------------------------------
+//
+void CDRMRightsMgrDetailsContainer::AddRightsDetailsL( TInt aNumberOfKey,
+                                                       TDetails& aDetails,
+                                                       CDesCArray* aItems )
+    {
+
+    if ( aNumberOfKey < aDetails.iRights->Count() && aNumberOfKey >= 0 )
+        {
+        // Status of Rights
+        AddStatusLineL( aDetails.iRights->At( aNumberOfKey ).iStatus,
+            aItems );
+
+        // Play Rights
+        AddRightsLineL( aDetails.iRights->At( aNumberOfKey ).iPlayConstraint,
+            aItems,
+            aDetails.iDrmScheme,
+            ContentAccess::EPlay );
+
+        // Display Rights
+        AddRightsLineL( aDetails.iRights->At( aNumberOfKey ).iDisplayConstraint,
+            aItems,
+            aDetails.iDrmScheme,
+            ContentAccess::EView );
+
+        // Print Rights
+        AddRightsLineL( aDetails.iRights->At( aNumberOfKey ).iPrintConstraint,
+            aItems,
+            aDetails.iDrmScheme,
+            ContentAccess::EPrint );
+
+        // Execute Rights
+        AddRightsLineL( aDetails.iRights->At( aNumberOfKey ).iExecuteConstraint,
+            aItems,
+            aDetails.iDrmScheme,
+            ContentAccess::EExecute );
+
+        }
+    }
+
+// ---------------------------------------------------------
+// CDRMRightsMgrDetailsContainer::AddStatusLineL
+// ---------------------------------------------------------
+//
+void CDRMRightsMgrDetailsContainer::AddStatusLineL( TDRMUIRightsStatus aStatus,
+                                                    CDesCArray* aItems )
+    {
+    TBuf<KMsgLineLength> msgLine;
+    HBufC* stringHolder;
+
+
+    stringHolder = StringLoader::LoadL( R_QTN_DRM_DETAILS_STATUS,
+                                            iEikonEnv );
+
+    msgLine.Zero();
+    msgLine.Append( '\t' );
+    msgLine.Append( *stringHolder );
+
+    delete stringHolder;
+    stringHolder = NULL;
+
+    msgLine.Append( '\t' );
+
+    TInt resourceId;
+    switch( aStatus )
+        {
+        case EDRMUIStatusInvalid:
+            resourceId = R_QTN_DRM_DETAILS_NO_LICENCE_AVAILABLE;
+            break;
+
+        case EDRMUIStatusValid:
+            resourceId = R_QTN_DRM_DETAILS_VALID;
+            break;
+
+        case EDRMUIStatusFuture:
+            resourceId = R_QTN_DRM_DETAILS_NOT_VALID_YET;
+            break;
+
+        case EDRMUIStatusExpired:
+            resourceId = R_QTN_DRM_DETAILS_NO_LICENCE_AVAILABLE;
+            break;
+
+        default:
+            resourceId = 0;
+            break;
+        }
+
+    if ( resourceId )
+        {
+        stringHolder = StringLoader::LoadL( resourceId, iEikonEnv );
+        msgLine.Append( *stringHolder );
+
+        delete stringHolder;
+        stringHolder = NULL;
+        }
+
+    if ( aItems )
+        {
+        aItems->AppendL( msgLine );
+        }
+    }
+
+// ---------------------------------------------------------
+// CDRMRightsMgrDetailsContainer::AddContentSendingLineL
+// ---------------------------------------------------------
+//
+void CDRMRightsMgrDetailsContainer::AddContentSendingLineL(
+                                                    TBool aContentCanBeSent,
+                                                    CDesCArray* aItems )
+    {
+    TBuf<KMsgLineLength> msgLine;
+
+    msgLine.Zero();
+    msgLine.Append( '\t' );
+    HBufC* stringHolder = StringLoader::LoadL( R_QTN_DRM_DETAILS_SENDING,
+                                               iEikonEnv );
+    msgLine.Append( *stringHolder );
+
+    delete stringHolder;
+    stringHolder = NULL;
+
+    msgLine.Append( '\t' );
+    stringHolder = StringLoader::LoadL( aContentCanBeSent ?
+                                        R_QTN_DRM_MGR_DET_ALLOWED :
+                                        R_QTN_DRM_MGR_DET_FORBID, iEikonEnv );
+    msgLine.Append( *stringHolder );
+
+    delete stringHolder;
+    stringHolder = NULL;
+
+    if ( aItems )
+        {
+        aItems->AppendL( msgLine );
+        }
+    }
+
+// ---------------------------------------------------------
+// CDRMRightsMgrDetailsContainer::AddContentUseLineL
+// ---------------------------------------------------------
+//
+void CDRMRightsMgrDetailsContainer::AddContentUseLineL( TBool aUsageAllowed,
+                                                        CDesCArray* aItems )
+    {
+    TBuf<KMsgLineLength> msgLine;
+
+    msgLine.Zero();
+    msgLine.Append( '\t' );
+    HBufC* stringHolder = StringLoader::LoadL( R_QTN_DRM_DET_CONTENT_USE,
+                                               iEikonEnv );
+    msgLine.Append( *stringHolder );
+
+    delete stringHolder;
+    stringHolder = NULL;
+
+    msgLine.Append( '\t' );
+    stringHolder = StringLoader::LoadL( aUsageAllowed ?
+                                        R_QTN_DRM_DET_SIM_ALLOWED :
+                                        R_QTN_DRM_DET_SIM_NOT_ALLOWED, iEikonEnv );
+    msgLine.Append( *stringHolder );
+
+    delete stringHolder;
+    stringHolder = NULL;
+
+    if ( aItems )
+        {
+        aItems->AppendL( msgLine );
+        }
+    }
+
+// ---------------------------------------------------------
+// CDRMRightsMgrDetailsContainer::AddRightsLineL
+// ---------------------------------------------------------
+//
+void CDRMRightsMgrDetailsContainer::AddRightsLineL(
+                                            CDRMRightsConstraints* aConstraint,
+                                            CDesCArray* aItems,
+                                            const TInt aDrmScheme,
+                                            const TUint32& aIntent )
+    {
+    if ( !aConstraint )
+        {
+        return;
+        }
+    else if ( aConstraint->FullRights() )
+        {
+        // Full Rights
+        AddUsageRightsL( aItems, aIntent );
+        }
+    else
+        {
+        TUint32 counter( 0 );
+        TUint32 originalCounter( 0 );
+        TTime startDateTime( 0 );
+        TTime endDateTime( 0 );
+        TTimeIntervalSeconds interval( 0 );
+
+        if ( aConstraint->GetCounters( counter, originalCounter ) == KErrNone )
+            {
+            // RO has a count constraint
+            AddUsageTimesLeftL( counter, aItems, aIntent );
+            }
+
+        if ( aDrmScheme == EDrmSchemeOmaDrm )
+            {
+            // For OMA DRM only
+            CDRMConstraint& drmConstraint = aConstraint->GetConstraint();
+            if ( drmConstraint.iActiveConstraints & EConstraintTimedCounter )
+                {
+                // RO has Timed Counter constraint
+                AddUsageTimesLeftL( drmConstraint.iTimedCounter, aItems,
+                                    aIntent );
+                }
+            }
+
+        if ( aConstraint->GetInterval( interval ) == KErrNone )
+            {
+
+            // RO has an interval constraint
+            // WM DRM duration rights are mapped to the interval constraint
+            // (which is not activated).
+            TTime intervalStart( 0 );
+
+            // If the file has an interval constraint which is activated,
+            // do not add information about the interval to the details view.
+            if ( aConstraint->GetIntervalStart( intervalStart ) != KErrNone )
+                {
+                // File has an interval constraint which is not activated.
+                AddUsageTimeLeftL( interval, aItems, EFalse, aIntent );
+                }
+            }
+
+        if ( aConstraint->GetStartTime( startDateTime ) == KErrNone )
+            {
+            // RO has a start time constraint
+            AddRightsValidFromL( startDateTime, aItems, aIntent );
+            }
+
+        if ( aConstraint->GetEndTime( endDateTime ) == KErrNone )
+            {
+            // RO has an expiring time constraint
+            AddRightsValidUntilL( endDateTime, aItems, aIntent );
+            }
+
+        if ( aDrmScheme == EDrmSchemeOmaDrm )
+            {
+            // For OMA DRM only
+            CDRMConstraint& drmConstraint = aConstraint->GetConstraint();
+
+            if ( drmConstraint.iActiveConstraints & EConstraintAccumulated )
+                {
+                TTimeIntervalSeconds accInterval(
+                    drmConstraint.iAccumulatedTime );
+
+                // RO has Accumulated Time constraint
+                AddUsageTimeLeftL( accInterval, aItems, ETrue, aIntent );
+                }
+            }
+
+        }
+
+    }
+
+// ---------------------------------------------------------
+// CDRMRightsMgrDetailsContainer::AddUsageRightsL
+// ---------------------------------------------------------
+//
+void CDRMRightsMgrDetailsContainer::AddUsageRightsL( CDesCArray* aItems,
+                                                     const TUint32& aIntent)
+    {
+    TBuf<KMaxFileName*2> msgLine;
+    msgLine.Zero();
+    msgLine.Append( '\t' );
+
+    // Usage Rights
+    // Check the intent and process the corresponding string.
+    TInt resourceId( 0 );
+    TInt resourceIdUnlimited( 0 );
+    switch ( aIntent )
+        {
+        case ContentAccess::EPlay:
+            resourceId = R_QTN_DRM_DETAILS_PLAYS_LEFT;
+            resourceIdUnlimited = R_QTN_DRM_MGR_DET_PL_UNLIMITED;
+            break;
+
+        case ContentAccess::EView:
+            resourceId = R_QTN_DRM_DETAILS_VIEWS_LEFT;
+            resourceIdUnlimited = R_QTN_DRM_MGR_DET_VI_UNLIMITED;
+            break;
+
+        case ContentAccess::EPrint:
+            resourceId = R_QTN_DRM_DETAILS_PRINTS_LEFT;
+            resourceIdUnlimited = R_QTN_DRM_MGR_DET_PR_UNLIMITED;
+            break;
+
+        case ContentAccess::EExecute:
+            resourceId = R_QTN_DRM_DETAILS_EXEC_TIMES;
+            resourceIdUnlimited = R_QTN_DRM_MGR_DET_EX_UNLIMITED;
+            break;
+
+        default:
+            User::Leave( KErrArgument );
+            break;
+        }
+
+    HBufC* stringHolder = StringLoader::LoadL( resourceId, iEikonEnv );
+    msgLine.Append( *stringHolder );
+
+    delete stringHolder;
+    stringHolder = NULL;
+
+    msgLine.Append( '\t' );
+
+    // Unlimited
+    stringHolder = StringLoader::LoadL( resourceIdUnlimited, iEikonEnv );
+    msgLine.Append( *stringHolder );
+
+    delete stringHolder;
+    stringHolder = NULL;
+
+    if ( aItems )
+        {
+        aItems->AppendL( msgLine );
+        }
+    }
+
+
+// ---------------------------------------------------------
+// CDRMRightsMgrDetailsContainer::AddUsageTimesLeftL
+// ---------------------------------------------------------
+//
+void CDRMRightsMgrDetailsContainer::AddUsageTimesLeftL( TUint32 aCounter,
+                                                CDesCArray* aItems,
+                                                const TUint32& aIntent )
+    {
+    TBuf<KMaxFileName*2> msgLine;
+    msgLine.Zero();
+    msgLine.Append( '\t' );
+
+    // Usage times left
+    // Check the intent and process the corresponding string.
+    TInt resourceId( 0 );
+    switch ( aIntent )
+        {
+        case ContentAccess::EPlay:
+            resourceId = R_QTN_DRM_DETAILS_PLAYS_LEFT;
+            break;
+
+        case ContentAccess::EView:
+            resourceId = R_QTN_DRM_DETAILS_VIEWS_LEFT;
+            break;
+
+        case ContentAccess::EPrint:
+            resourceId = R_QTN_DRM_DETAILS_PRINTS_LEFT;
+            break;
+
+        case ContentAccess::EExecute:
+            resourceId = R_QTN_DRM_DETAILS_EXEC_TIMES;
+            break;
+
+        default:
+            User::Leave( KErrArgument );
+            break;
+        }
+
+    HBufC* stringHolder = StringLoader::LoadL( resourceId, iEikonEnv );
+
+    msgLine.Append( *stringHolder );
+
+    delete stringHolder;
+    stringHolder = NULL;
+
+    msgLine.Append( '\t' );
+
+    if ( aCounter == 1 )
+        {
+        stringHolder = StringLoader::LoadL( R_QTN_DRM_DETAILS_1_TIME,
+                                            iEikonEnv );
+        }
+    else
+        {
+        stringHolder = StringLoader::LoadL( R_QTN_DRM_DETAILS_N_TIMES,
+                                            aCounter, iEikonEnv );
+        }
+
+    msgLine.Append( *stringHolder );
+
+    delete stringHolder;
+    stringHolder = NULL;
+
+    if ( aItems )
+        {
+        AknTextUtils::DisplayTextLanguageSpecificNumberConversion( msgLine );
+        aItems->AppendL( msgLine );
+        }
+    }
+
+// ---------------------------------------------------------
+// CDRMRightsMgrDetailsContainer::AddUsageTimeLeftL
+// ---------------------------------------------------------
+//
+void CDRMRightsMgrDetailsContainer::AddUsageTimeLeftL(
+                                        const TTimeIntervalSeconds& aInterval,
+                                        CDesCArray* aItems,
+                                        const TBool aIsAccumulatedTime,
+                                        const TUint32& aIntent )
+    {
+    TBuf<KMaxFileName*2> msgLine;
+    msgLine.Zero();
+    msgLine.Append( '\t' );
+
+    HBufC* stringHolder;
+
+    if ( aIsAccumulatedTime )
+        {
+        // Accumulated time constraint
+        stringHolder = StringLoader::LoadL( R_QTN_DRM_DETAILS_PLAYING_TIME_LEFT,
+                                            iEikonEnv );
+        }
+    else
+        {
+        // Interval constraint which has not been activated
+        TInt resourceId( 0 );
+        switch ( aIntent )
+            {
+            case ContentAccess::EPlay:
+                resourceId = R_QTN_DRM_DETAILS_VALIDITY_PERIOD;
+                break;
+
+            case ContentAccess::EView:
+                resourceId = R_QTN_DRM_DETAILS_VIEWING_RIGHTS;
+                break;
+
+            case ContentAccess::EPrint:
+                resourceId = R_QTN_DRM_DETAILS_PRINTING_RIGHTS;
+                break;
+
+            case ContentAccess::EExecute:
+                resourceId = R_QTN_DRM_DETAILS_VALIDITY_PERIOD;
+                break;
+
+            default:
+                User::Leave( KErrArgument );
+                break;
+            }
+
+        stringHolder = StringLoader::LoadL( resourceId, iEikonEnv );
+        }
+
+    msgLine.Append( *stringHolder );
+
+    delete stringHolder;
+    stringHolder = NULL;
+
+    msgLine.Append( '\t' );
+
+    TInt intYrs, intMon, intDay, intHrs, intMin, intSec;
+    SplitTime( aInterval, intYrs, intMon, intDay, intHrs, intMin, intSec );
+
+    stringHolder = AddPartsOfTimeL( intYrs, intMon, intDay,
+                                    intHrs, intMin, intSec );
+
+    msgLine.Append( *stringHolder );
+
+    delete stringHolder;
+    stringHolder = NULL;
+
+    if ( aItems )
+        {
+        AknTextUtils::DisplayTextLanguageSpecificNumberConversion( msgLine );
+        aItems->AppendL( msgLine );
+        }
+    }
+
+
+// ---------------------------------------------------------
+// CDRMRightsMgrDetailsContainer::SplitTime
+// ---------------------------------------------------------
+//
+void CDRMRightsMgrDetailsContainer::SplitTime(
+                                const TTimeIntervalSeconds& aInterval,
+                                TInt& aIntYrs, TInt& aIntMon, TInt& aIntDay,
+                                TInt& aIntHrs, TInt& aIntMin, TInt& aIntSec )
+    {
+    TInt temp;
+    TInt i;
+
+    const TInt daysInYear = 365;
+    const TInt secsInMin = 60;
+    const TInt secsInHour = secsInMin*60;
+    const TInt secsInDay = secsInHour*24;
+
+    const TInt maxDaysInMonths[12] = {  30,  60,  90, 120, 150, 180,
+                                       210, 240, 270, 300, 330, 360 };
+
+    // calculate full days
+    temp = aInterval.Int() / secsInDay;
+
+    // calculate full years
+    aIntYrs = temp / daysInYear;
+
+    // calc remainder days
+    temp = temp % daysInYear;
+
+    aIntMon = 0;
+
+    i = 0;
+    if ( temp >= maxDaysInMonths[0] )
+        {
+        for ( i = 0; i < 11; i++ )
+            {
+            // found correct amount of months
+            if ( temp >= maxDaysInMonths[i] && temp < maxDaysInMonths[i+1] )
+                {
+                // i now contains amount of full months (+1 because of table index)
+                aIntMon = i+1;
+                break;
+                }
+            }
+        }
+
+    // calc remainder days = allSecs - secsInFullYears - secsInFullMonts
+    if( temp >= maxDaysInMonths[i] )
+        {
+        aIntDay = temp - maxDaysInMonths[i];
+        }
+    else
+        {
+        aIntDay = temp;
+        }
+
+    // calculate remainder secs
+    temp = aInterval.Int() % secsInDay;
+
+    aIntHrs = temp / secsInHour;
+
+    // calculate remainder secs
+    temp = temp % secsInHour;
+
+    aIntMin = temp / secsInMin;
+
+    // calculate remainder secs
+    aIntSec = temp % secsInMin;
+    }
+
+
+// ---------------------------------------------------------
+// CDRMRightsMgrDetailsContainer::AddPartsOfTimeL
+// ---------------------------------------------------------
+//
+HBufC* CDRMRightsMgrDetailsContainer::AddPartsOfTimeL(
+                                    TInt aIntYrs, TInt aIntMon, TInt aIntDay,
+                                    TInt aIntHrs, TInt aIntMin, TInt aIntSec )
+    {
+    // Only the two most meaningful data will be showed
+    TInt numOfData = 0;
+
+    CDesCArrayFlat* strings = new ( ELeave ) CDesCArrayFlat( 2 );
+    CleanupStack::PushL( strings );
+
+    if ( aIntYrs > 0 )
+        {
+        AddSinglePartOfTimeL( aIntYrs,
+                              R_QTN_DRM_NBR_OF_YEARS_ONE,
+                              R_QTN_DRM_NBR_OF_YEARS_ONE_FINAL,
+                              R_QTN_DRM_NBR_OF_YEARS_TWO_FOUR,
+                              R_QTN_DRM_NBR_OF_YEARS_FIVE_ZERO,
+                              strings );
+        numOfData++;
+        }
+
+    if ( aIntMon > 0 )
+        {
+        //  Second type not provided because 11 is the maximum
+        AddSinglePartOfTimeL( aIntMon,
+                              R_QTN_DRM_NBR_OF_MONTHS_ONE,
+                              0,
+                              R_QTN_DRM_NBR_OF_MONTHS_TWO_FOUR,
+                              R_QTN_DRM_NBR_OF_MONTHS_FIVE_ZERO,
+                              strings );
+        numOfData++;
+        }
+
+    // Only if years or months were missing
+    if ( aIntDay > 0 && numOfData < 2 )
+        {
+        AddSinglePartOfTimeL( aIntDay,
+                              R_QTN_DRM_NBR_OF_DAYS_ONE,
+                              R_QTN_DRM_NBR_OF_DAYS_ONE_FINAL,
+                              R_QTN_DRM_NBR_OF_DAYS_TWO_FOUR,
+                              R_QTN_DRM_NBR_OF_DAYS_FIVE_ZERO,
+                              strings );
+        numOfData++;
+        }
+
+    if ( aIntHrs > 0 && numOfData < 2 )
+        {
+        AddSinglePartOfTimeL( aIntHrs,
+                              R_QTN_DRM_NBR_OF_HOURS_ONE,
+                              R_QTN_DRM_NBR_OF_HOURS_ONE_FINAL,
+                              R_QTN_DRM_NBR_OF_HOURS_TWO_FOUR,
+                              R_QTN_DRM_NBR_OF_HOURS_FIVE_ZERO,
+                              strings );
+        numOfData++;
+        }
+
+    if ( aIntMin > 0 && numOfData < 2 )
+        {
+        AddSinglePartOfTimeL( aIntMin,
+                              R_QTN_DRM_NBR_OF_MINS_ONE,
+                              R_QTN_DRM_NBR_OF_MINS_ONE_FINAL,
+                              R_QTN_DRM_NBR_OF_MINS_TWO_FOUR,
+                              R_QTN_DRM_NBR_OF_MINS_FIVE_ZERO,
+                              strings );
+        numOfData++;
+        }
+
+    // If interval is 0, then it shows "0 seconds" anyway
+    if ( ( aIntSec > 0 && numOfData < 2 ) || numOfData == 0 )
+        {
+        AddSinglePartOfTimeL( aIntSec,
+                              R_QTN_DRM_NBR_OF_SECS_ONE,
+                              R_QTN_DRM_NBR_OF_SECS_ONE_FINAL,
+                              R_QTN_DRM_NBR_OF_SECS_TWO_FOUR,
+                              R_QTN_DRM_NBR_OF_SECS_FIVE_ZERO,
+                              strings );
+        numOfData++;
+        }
+
+    HBufC* stringHolder;
+    if ( numOfData == 1 )
+        {
+        stringHolder = StringLoader::LoadL( R_QTN_DRM_MGR_DET_INTER,
+                                            strings->MdcaPoint(0), iEikonEnv );
+        }
+    else
+        {
+        stringHolder = StringLoader::LoadL( R_QTN_DRM_MGR_DET_INTER_TWO,
+                                            *strings, iEikonEnv );
+        }
+
+    CleanupStack::PopAndDestroy( strings );
+
+    return stringHolder;
+    }
+
+
+// ---------------------------------------------------------
+// CDRMRightsMgrDetailsContainer::AddSinglePartOfTimeL
+// ---------------------------------------------------------
+//
+void CDRMRightsMgrDetailsContainer::AddSinglePartOfTimeL( TInt aNumOfElements,
+                                                    TInt aResourceIdSingle,
+                                                    TInt aResourceIdOneFinal,
+                                                    TInt aResourceIdTwoFour,
+                                                    TInt aResourceIdFiveZero,
+                                                    CDesCArrayFlat* aStrings )
+    {
+    HBufC* stringHolder;
+    TInt finalOneDigit = aNumOfElements % 10;
+    TInt finalTwoDigits = aNumOfElements % 100;
+
+    if ( aNumOfElements == 1 )
+        {
+        stringHolder = StringLoader::LoadLC( aResourceIdSingle, iEikonEnv );
+        }
+    else if ( finalOneDigit == 1 && finalTwoDigits != 11 )
+        {
+        stringHolder = StringLoader::LoadLC( aResourceIdOneFinal,
+                                             aNumOfElements,
+                                             iEikonEnv );
+        }
+    else if ( finalOneDigit == 0 ||
+              ( finalOneDigit >= 5 && finalOneDigit <= 9 ) ||
+              ( finalTwoDigits >= 11 && finalTwoDigits <= 14 ) )
+        {
+        stringHolder = StringLoader::LoadLC( aResourceIdFiveZero,
+                                             aNumOfElements,
+                                             iEikonEnv );
+        }
+    else
+        {
+        stringHolder = StringLoader::LoadLC( aResourceIdTwoFour,
+                                             aNumOfElements,
+                                             iEikonEnv );
+        }
+
+    if ( aStrings )
+        {
+        aStrings->AppendL( *stringHolder );
+        }
+
+    CleanupStack::PopAndDestroy ( stringHolder );
+    }
+
+
+// ---------------------------------------------------------
+// CDRMRightsMgrDetailsContainer::AddRightsValidFromL
+// ---------------------------------------------------------
+//
+void CDRMRightsMgrDetailsContainer::AddRightsValidFromL(
+                                                const TTime& aStartDateTime,
+                                                CDesCArray* aItems,
+                                                const TUint32& aIntent )
+    {
+    TBuf<KMaxFileName*2> msgLine;
+    msgLine.Zero();
+    msgLine.Append( '\t' );
+
+    TInt resourceId( 0 );
+    switch ( aIntent )
+        {
+        case ContentAccess::EPlay:
+            resourceId = R_QTN_DRM_DETAILS_VALID_FROM;
+            break;
+
+        case ContentAccess::EView:
+            resourceId = R_QTN_DRM_DETAILS_VIEW_RIGHTS_FROM;
+            break;
+
+        case ContentAccess::EPrint:
+            resourceId = R_QTN_DRM_DETAILS_PRINT_RIGHTS_FROM;
+            break;
+
+        case ContentAccess::EExecute:
+            resourceId = R_QTN_DRM_DETAILS_VALID_FROM;
+            break;
+
+        default:
+            User::Leave( KErrArgument );
+            break;
+        }
+
+    HBufC* stringHolder = StringLoader::LoadL( resourceId, iEikonEnv );
+    msgLine.Append( *stringHolder );
+
+    delete stringHolder;
+    stringHolder = NULL;
+
+    msgLine.Append( '\t' );
+
+    if ( aStartDateTime != Time::NullTTime() )
+        {
+        TBuf<32> stringDate;
+        TBuf<32> stringTime;
+
+        HBufC* stringFormatDate = StringLoader::LoadLC(
+                                                    R_QTN_DATE_USUAL_WITH_ZERO,
+                                                    iEikonEnv );
+        HBufC* stringFormatTime = StringLoader::LoadLC( R_QTN_TIME_USUAL,
+                                                       iEikonEnv );
+
+        aStartDateTime.FormatL( stringDate, *stringFormatDate );
+        aStartDateTime.FormatL( stringTime, *stringFormatTime );
+        CleanupStack::PopAndDestroy( stringFormatTime );
+        CleanupStack::PopAndDestroy( stringFormatDate );
+
+        msgLine.Append( stringDate );
+        msgLine.Append( ' ' );
+        msgLine.Append( stringTime );
+        }
+
+    if ( aItems )
+        {
+        AknTextUtils::DisplayTextLanguageSpecificNumberConversion( msgLine );
+        aItems->AppendL( msgLine );
+        }
+    }
+
+
+// ---------------------------------------------------------
+// CDRMRightsMgrDetailsContainer::AddRightsValidUntilL
+// ---------------------------------------------------------
+//
+void CDRMRightsMgrDetailsContainer::AddRightsValidUntilL(
+                                                const TTime& aEndDateTime,
+                                                CDesCArray* aItems,
+                                                const TUint32& aIntent )
+    {
+    TBuf<KMaxFileName*2> msgLine;
+    msgLine.Zero();
+    msgLine.Append( '\t' );
+
+    TInt resourceId( 0 );
+    switch ( aIntent )
+        {
+        case ContentAccess::EPlay:
+            resourceId = R_QTN_DRM_DETAILS_VALID_UNTIL;
+            break;
+
+        case ContentAccess::EView:
+            resourceId = R_QTN_DRM_DETAILS_VIEW_RIGHTS_UNTIL;
+            break;
+
+        case ContentAccess::EPrint:
+            resourceId = R_QTN_DRM_DETAILS_PRINT_RIGHTS_UNTIL;
+            break;
+
+        case ContentAccess::EExecute:
+            resourceId = R_QTN_DRM_DETAILS_VALID_UNTIL;
+            break;
+
+        default:
+            User::Leave( KErrArgument );
+            break;
+        }
+
+    HBufC* stringHolder = StringLoader::LoadL( resourceId, iEikonEnv );
+    msgLine.Append( *stringHolder );
+
+    delete stringHolder;
+    stringHolder = NULL;
+
+    msgLine.Append( '\t' );
+
+    if ( aEndDateTime != Time::NullTTime() )
+        {
+        TBuf<32> stringDate;
+        TBuf<32> stringTime;
+
+        HBufC* stringFormatDate = StringLoader::LoadLC(
+                                                    R_QTN_DATE_USUAL_WITH_ZERO,
+                                                    iEikonEnv );
+        HBufC* stringFormatTime = StringLoader::LoadLC( R_QTN_TIME_USUAL,
+                                                        iEikonEnv );
+
+        aEndDateTime.FormatL( stringDate, *stringFormatDate );
+        aEndDateTime.FormatL( stringTime, *stringFormatTime );
+        CleanupStack::PopAndDestroy( stringFormatTime );
+        CleanupStack::PopAndDestroy( stringFormatDate );
+
+        msgLine.Append( stringDate );
+        msgLine.Append( ' ' );
+        msgLine.Append( stringTime );
+        }
+
+    if ( aItems )
+        {
+        AknTextUtils::DisplayTextLanguageSpecificNumberConversion( msgLine );
+        aItems->AppendL( msgLine );
+        }
+    }
+
+// End of File