filemanager/View/src/CFileManagerFullOmaDrmInfo.cpp
branchRCL_3
changeset 21 65326cf895ed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/filemanager/View/src/CFileManagerFullOmaDrmInfo.cpp	Wed Sep 01 12:31:07 2010 +0100
@@ -0,0 +1,997 @@
+/*
+* Copyright (c) 2005-2006 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:  Gets the item DRM information
+*
+*/
+
+
+// INCLUDE FILES
+#include <coemain.h>
+#include <StringLoader.h>
+#include <DRMHelper.h>
+#include <DRMRights.h>
+#include <AknUtils.h>
+#include <filemanagerview.rsg>
+#include <FileManagerDebug.h>
+#include <drmuihandling.h>
+#include "CFileManagerFullOmaDrmInfo.h"
+
+// CONSTANTS
+_LIT( KSeparator, "\t" );
+#ifndef RD_DRM_COMMON_INTERFACE_FOR_OMA_AND_WMDRM
+_LIT( KDateFormat1, "%1" );
+_LIT( KDateFormat2, "%2" );
+_LIT( KDateFormat3, "%3" );
+_LIT( KTimeFormatBefore, " %-B %J:%T" );
+_LIT( KTimeFormatAfter, " %J:%T %+B" );
+_LIT( KEmptyChar, " " );
+const TInt KDateStringLen = 20;
+
+const TUint KSecondSeparator = 1;
+const TUint KThirdSeparator = 2;
+
+
+const TInt KPlayRights = 0;
+const TInt KDisplayRights = 1;
+const TInt KExecuteRights = 2;
+const TInt KPrintRights = 3;
+#endif // RD_DRM_COMMON_INTERFACE_FOR_OMA_AND_WMDRM
+
+
+// ============================ LOCAL FUNCTIONS ================================
+
+// -----------------------------------------------------------------------------
+// AppendLabelAndDataToArrayL
+// -----------------------------------------------------------------------------
+static void AppendLabelAndDataToArrayL( CDesCArray& aArray,
+                                 const TDesC& aLabel,
+                                 const TDesC& aData )
+    {
+    HBufC* dataStr = HBufC::NewLC( aLabel.Length() +
+                                   KSeparator().Length() +
+                                   aData.Length() );
+
+    TPtr dataPtr( dataStr->Des() );
+    dataPtr.Append( aLabel );
+    dataPtr.Append( KSeparator );
+    dataPtr.Append( aData );
+
+    AknTextUtils::LanguageSpecificNumberConversion( dataPtr );
+
+    aArray.AppendL( dataPtr );
+
+    CleanupStack::PopAndDestroy( dataStr );
+    }
+    
+#ifndef RD_DRM_COMMON_INTERFACE_FOR_OMA_AND_WMDRM
+// -----------------------------------------------------------------------------
+// ResetAndDestroy
+// -----------------------------------------------------------------------------
+static void ResetAndDestroy( TAny* aPtr )
+    {
+    RPointerArray< CDRMHelperRightsConstraints >* array =
+        static_cast< RPointerArray<CDRMHelperRightsConstraints>* >( aPtr );
+    array->ResetAndDestroy();
+    array->Close();
+    }
+
+// -----------------------------------------------------------------------------
+// IsFutureRights
+// -----------------------------------------------------------------------------
+static TBool IsFutureRights(
+        RPointerArray<CDRMRightsConstraints>& aRightsArray )
+    {
+    TBool ret( EFalse );
+    const TInt count( aRightsArray.Count() );
+    for( TInt i = 0 ; i < count ; ++i )
+        {
+        CDRMRightsConstraints* rights = aRightsArray[i];
+        TUint32 expiration( 0 );
+        TUint32 constType( 0 );
+        TInt topPriorityValue( CDRMRights::EInvalidRights );
+        if( rights )
+            {
+            TInt currentPriorityValue( rights->GetConstraintInfo( expiration, constType ) );
+            if( currentPriorityValue > topPriorityValue )
+                {
+                // priority is higher than previous rigths
+                topPriorityValue = currentPriorityValue;
+                if( CDRMRights::EFutureRights == expiration )
+                    {
+                    ret = ETrue;
+                    }
+                else
+                    {
+                    // no future rights
+                    ret = EFalse;
+                    }
+                }
+            }
+        }
+    return ret;
+    }
+
+// -----------------------------------------------------------------------------
+// DateTimeStringLC
+// -----------------------------------------------------------------------------
+static HBufC* DateTimeStringLC( const TTime& aTime )
+    {
+    TBuf<KDateStringLen> dateStr;
+    TBuf<KDateStringLen> timeStr;
+    TBuf<KDateStringLen> dateStrFormat;
+
+    // Localized date separator form
+    TLocale local;
+    dateStrFormat.Append( KDateFormat1 );
+    dateStrFormat.Append( local.DateSeparator( KSecondSeparator ) );
+    dateStrFormat.Append( KDateFormat2 );
+    dateStrFormat.Append( local.DateSeparator( KThirdSeparator ) );
+    dateStrFormat.Append( KDateFormat3 );
+    aTime.FormatL( dateStr, dateStrFormat );
+
+    if ( local.AmPmSymbolPosition() == ELocaleBefore )
+        {
+        aTime.FormatL( timeStr, KTimeFormatBefore );
+        }
+    else
+        {
+        aTime.FormatL( timeStr, KTimeFormatAfter );
+        }
+
+    HBufC* buf = HBufC::NewLC( dateStr.Length() +
+                               KEmptyChar().Length() +
+                               timeStr.Length() );
+    TPtr ptrBuffer( buf->Des() );
+    ptrBuffer.Append( dateStr );
+    ptrBuffer.Append( KEmptyChar );
+    ptrBuffer.Append( timeStr );
+
+    return buf;
+    }
+
+// -----------------------------------------------------------------------------
+// DateTimeL
+// -----------------------------------------------------------------------------
+static void DateTimeL( CDesCArray& aArray,
+                const TTime& aTime,
+                TInt aResourceId,
+                const TDesC& aType )
+    {
+    HBufC* label = StringLoader::LoadLC( aResourceId, aType );
+    HBufC* dateTime = DateTimeStringLC( aTime );
+
+    AppendLabelAndDataToArrayL( aArray, *label, *dateTime );
+
+    CleanupStack::PopAndDestroy( dateTime );
+    CleanupStack::PopAndDestroy( label );
+    }
+
+// -----------------------------------------------------------------------------
+// FillCounterInfoL
+// -----------------------------------------------------------------------------
+static void FillCounterInfoL( CDesCArray& aArray,
+                       CDRMHelperRightsConstraints& aRights,
+                       const TDesC& aType )
+    {
+    TUint32 count( 0 );
+    TUint32 timedCount( 0 );
+    TUint32 ignore1( 0 );
+    TUint32 ignore2( 0 );
+    TTimeIntervalSeconds ignore3( 0 );
+    TInt err( KErrNone );
+
+    TRAPD( errCount, aRights.GetCountersL( count, ignore1 ) );
+    TRAPD( errTimedCount, aRights.GetTimedCountL( timedCount, ignore2,
+        ignore3 ) );
+
+    if ( errCount == KErrNone && errTimedCount == KErrNone )
+        {
+        // Both counts present, use minimum
+        count = Min( count, timedCount );
+        err = KErrNone;
+        }
+    else if ( errCount == KErrNone )
+        {
+        // Use count
+        err = KErrNone;
+        }
+    else if ( errTimedCount == KErrNone )
+        {
+        // Use timed count
+        count = timedCount;
+        err = KErrNone;
+        }
+    else
+        {
+        // Neither regular nor timed count constraint
+        // present, return error
+        err = KErrNotFound;
+        }
+
+    if ( err == KErrNone )
+        {
+        // "Times left (%U)"
+        HBufC* label =
+                StringLoader::LoadLC( R_QTN_DRM_MGR_DET_UTL_X, aType );
+
+        HBufC* data = NULL;
+
+        if ( count == 1 )
+            {
+            // "1 count"
+            data = StringLoader::LoadLC( R_QTN_DRM_MGR_DET_1_COUNT );
+            }
+        else
+            {
+            // "%N counts"
+            data = StringLoader::LoadLC( R_QTN_DRM_MGR_DET_N_COUNTS, count );
+            }
+
+        AppendLabelAndDataToArrayL( aArray, *label, *data );
+
+        CleanupStack::PopAndDestroy( data );
+        CleanupStack::PopAndDestroy( label );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// SplitTime
+// -----------------------------------------------------------------------------
+//
+static void SplitTime( const TTimeIntervalSeconds& aInterval,
+        TInt& aIntYrs, TInt& aIntMon, TInt& aIntDay,
+        TInt& aIntHrs, TInt& aIntMin, TInt& aIntSec )
+    {
+    const TInt KSecsInMin( 60 );
+    const TInt KSecsInHour( KSecsInMin * 60 );
+    const TInt KSecsInDay( KSecsInHour * 24 );
+
+    // includes leap year day
+    const TInt KLastMonthIndex = 11;
+    const TInt KMaxDaysInMonths[] = {
+            31,  62,  92, 123, 153, 184,
+            215, 245, 276, 306, 337, 366 };
+
+    // calculate full days
+    TInt temp( aInterval.Int() / KSecsInDay );
+
+    // calculate full years, calculate without leap year for user to get the 
+    // longest time possible
+    aIntYrs = temp / ( KMaxDaysInMonths[KLastMonthIndex] - 1 );
+
+    // calc remainder days
+    temp = temp % ( KMaxDaysInMonths[KLastMonthIndex] - 1 );
+
+    aIntMon = 0;
+
+    TInt i( 0 );
+    if ( temp >= KMaxDaysInMonths[0] )
+        {
+        for ( i = 0; i < KLastMonthIndex; i++ )
+            {
+            // found correct amount of months
+            if ( temp >= KMaxDaysInMonths[i] && temp < KMaxDaysInMonths[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 >= KMaxDaysInMonths[i] )
+        {
+        aIntDay = temp - KMaxDaysInMonths[i];
+        }
+    else
+        {
+        aIntDay = temp;
+        }
+
+    // calculate remainder secs
+    temp = aInterval.Int() % KSecsInDay;
+
+    aIntHrs = temp / KSecsInHour;
+
+    // calculate remainder secs
+    temp = temp % KSecsInHour;
+
+    aIntMin = temp / KSecsInMin;
+
+    // calculate remainder secs
+    aIntSec = temp % KSecsInMin;
+    }
+
+// -----------------------------------------------------------------------------
+// AddSinglePartOfTimeL
+// -----------------------------------------------------------------------------
+//
+static void AddSinglePartOfTimeL( TInt aNumOfElements,
+        TInt aResourceIdSingle,
+        TInt aResourceIdOneFinal, 
+        TInt aResourceIdTwoFour,
+        TInt aResourceIdFiveZero, 
+        CDesCArrayFlat* aStrings )
+    {
+    const TInt KDigitFive = 5;
+    const TInt KDigitNine = 9;
+    const TInt KDigitTen = 10;
+    const TInt KDigitEleven = 11;
+    const TInt KDigitFourTeen = 14;
+    const TInt KDigitHundred = 100;
+    HBufC* stringHolder = NULL;
+    TInt finalOneDigit( aNumOfElements % KDigitTen );
+    TInt finalTwoDigits( aNumOfElements % KDigitHundred );
+
+    if ( aNumOfElements == 1 )
+        {
+        stringHolder = StringLoader::LoadLC( aResourceIdSingle );
+        }
+    else if ( finalOneDigit == 1 && finalTwoDigits != KDigitEleven )
+        {
+        stringHolder = StringLoader::LoadLC( aResourceIdOneFinal, 
+            aNumOfElements );
+        }
+    else if ( finalOneDigit == 0 || 
+             ( finalOneDigit >= KDigitFive && finalOneDigit <= KDigitNine ) ||
+             ( finalTwoDigits >= KDigitEleven && finalTwoDigits <= KDigitFourTeen ) )
+        {
+        stringHolder = StringLoader::LoadLC( aResourceIdFiveZero,
+            aNumOfElements );
+        }
+    else
+        {
+        stringHolder = StringLoader::LoadLC( aResourceIdTwoFour,
+            aNumOfElements );
+        }
+
+    if ( aStrings )
+        {
+        aStrings->AppendL( *stringHolder );
+        }
+
+    CleanupStack::PopAndDestroy ( stringHolder );
+    }
+
+// -----------------------------------------------------------------------------
+// AddPartsOfTimeLC
+// -----------------------------------------------------------------------------
+//
+static HBufC* AddPartsOfTimeLC( TInt aIntYrs, TInt aIntMon, TInt aIntDay, 
+                         TInt aIntHrs, TInt aIntMin, TInt aIntSec )
+    {
+    // Only the two most meaningful data will be showed
+    TInt numOfData( 0 );
+    const TInt KMaxDataItems = 2;
+
+    CDesCArrayFlat* strings = new ( ELeave ) CDesCArrayFlat( KMaxDataItems );
+    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 < KMaxDataItems )
+        {
+        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 < KMaxDataItems )
+        {
+        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 < KMaxDataItems )
+        {
+        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 < KMaxDataItems ) || 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 = NULL;
+    if ( numOfData == 1 )
+        {
+        stringHolder = StringLoader::LoadL( R_QTN_DRM_MGR_DET_INTER,
+            strings->MdcaPoint(0) );
+        }
+    else
+        {
+        stringHolder = StringLoader::LoadL( R_QTN_DRM_MGR_DET_INTER_TWO,
+            *strings );
+        }
+
+    CleanupStack::PopAndDestroy( strings );
+    
+    CleanupStack::PushL( stringHolder );
+
+    return stringHolder;
+    }
+
+// -----------------------------------------------------------------------------
+// FillUsageTimeLeftInfoL
+// -----------------------------------------------------------------------------
+static void FillUsageTimeLeftInfoL( CDesCArray& aArray,
+                             const TTimeIntervalSeconds& aInterval,
+                             const TDesC& aType,
+                             TBool aIsAccumulatedTime )
+    {
+    TInt years( 0 );
+    TInt months( 0 );
+    TInt days( 0 );
+    TInt hours( 0 );
+    TInt minutes( 0 );
+    TInt seconds( 0 );
+    HBufC* label = NULL;
+    HBufC* data = NULL;
+
+    if ( aIsAccumulatedTime )
+        {
+        // "Usage time left"
+        label = StringLoader::LoadLC( R_QTN_DRM_MGR_DET_ACCUM_TIME_LEFT  );
+        }
+    else
+        {
+        // "Time left (%U)"
+        label = StringLoader::LoadLC( R_QTN_DRM_MGR_DET_UDL_X, aType );
+        }
+
+    SplitTime( aInterval, years, months, days, hours, minutes, seconds );
+    data = AddPartsOfTimeLC( years, months, days, hours, minutes, seconds );
+
+    AppendLabelAndDataToArrayL( aArray, *label, *data );
+
+    CleanupStack::PopAndDestroy( data );
+    CleanupStack::PopAndDestroy( label );
+    }
+
+// -----------------------------------------------------------------------------
+// FillIntervalInfoL
+// -----------------------------------------------------------------------------
+static void FillIntervalInfoL( CDesCArray& aArray,
+                        CDRMHelperRightsConstraints& aRights,
+                        const TDesC& aType )
+    {
+    TTimeIntervalSeconds intervalSeconds( 0 );
+
+    TRAPD( err, aRights.GetIntervalL( intervalSeconds ) );
+
+    if ( err != KErrNotFound && err != KErrNone )
+        {
+        User::Leave( err );
+        }
+
+    if ( err == KErrNone )
+        {
+        TTime intervalStartTime( 0 );
+
+        TRAP( err, aRights.GetIntervalStartL( intervalStartTime ) );
+
+        if ( ( err != KErrNotFound ) && ( err != KErrNone ) )
+            {
+            User::Leave( err );
+            }
+
+        if ( err == KErrNotFound )
+            {
+            // "Times status (%U)"
+            HBufC* label =
+                StringLoader::LoadLC( R_QTN_DRM_MGR_DET_UTS_X, aType );
+
+            // "Not activated"
+            HBufC* data = StringLoader::LoadLC( R_QTN_DRM_MGR_DET_NOT_ACT );
+
+            AppendLabelAndDataToArrayL( aArray, *label, *data );
+
+            CleanupStack::PopAndDestroy( data );
+            CleanupStack::PopAndDestroy( label );
+
+            // "Time left (%U)"
+            FillUsageTimeLeftInfoL( aArray, intervalSeconds, aType, EFalse );
+            }
+        else
+            {
+            TTime endTime( intervalStartTime );
+            endTime += intervalSeconds;
+
+            // "Valid from (%U)"
+            DateTimeL( aArray, intervalStartTime,
+                                        R_QTN_DRM_MGR_DET_RVF_X, aType );
+
+            // "Valid until (%U)"
+            DateTimeL( aArray, endTime, R_QTN_DRM_MGR_DET_RVT_X, aType );
+            }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// FillTimeInfoL
+// -----------------------------------------------------------------------------
+static void FillTimeInfoL( CDesCArray& aArray,
+                    CDRMHelperRightsConstraints& aRights,
+                    const TDesC& aType )
+    {
+    TTime startTime;
+    TRAPD( err, aRights.GetStartTimeL( startTime ) );
+    if ( err != KErrNotFound && err != KErrNone )
+        {
+        User::Leave( err );
+        }
+    if ( err == KErrNone )
+        {
+        // "Valid from (%U)"
+        DateTimeL( aArray, startTime, R_QTN_DRM_MGR_DET_RVF_X, aType );
+        }
+
+    TTime endTime;
+    TRAP( err, aRights.GetEndTimeL( endTime ) );
+    if ( err != KErrNotFound && err != KErrNone )
+        {
+        User::Leave( err );
+        }
+    if ( err == KErrNone )
+        {
+        // "Valid until (%U)"
+        DateTimeL( aArray, endTime, R_QTN_DRM_MGR_DET_RVT_X, aType );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// FillAccumulatedTimeInfoL
+// -----------------------------------------------------------------------------
+static void FillAccumulatedTimeInfoL( CDesCArray& aArray,
+                               CDRMHelperRightsConstraints& aRights,
+                               const TDesC& aType )
+    {
+    TTimeIntervalSeconds accumSeconds( 0 );
+    TRAPD( err, aRights.GetAccumulatedTimeL( accumSeconds ));
+    if ( err != KErrNotFound && err != KErrNone )
+        {
+        User::Leave( err );
+        }
+    if ( err == KErrNone )
+        {
+        // "Usage time left"
+        FillUsageTimeLeftInfoL( aArray, accumSeconds, aType, ETrue );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// FillDrmInfoL
+// -----------------------------------------------------------------------------
+static void FillDrmInfoL( CDesCArray& aArray,
+                   CDRMHelperRightsConstraints* aRights,
+                   TInt aResourceId )
+    {
+    // Check if no rights at all
+    if ( !aRights )
+        {
+        return;
+        }
+
+    // Rights type is either "Play", "Display", "Execute" or "Print"
+    HBufC* type = StringLoader::LoadLC( aResourceId );
+
+    // Check if full rights
+    if ( aRights->FullRights() )
+        {
+        // "Rights (%U)"
+        HBufC* label =
+                StringLoader::LoadLC( R_QTN_DRM_MGR_DET_FULL_X, *type );
+
+        // "Unlimited"
+        HBufC* data = StringLoader::LoadLC( R_QTN_DRM_MGR_DET_UNLIMITED );
+
+        AppendLabelAndDataToArrayL( aArray, *label, *data );
+
+        CleanupStack::PopAndDestroy( data );
+        CleanupStack::PopAndDestroy( label );
+        CleanupStack::PopAndDestroy( type );
+        return;                           // full rights -> return
+        }
+
+    // Get detailed counter constraint information
+    FillCounterInfoL( aArray, *aRights, *type );
+
+    // Get detailed interval constraint information (start time + duration)
+    FillIntervalInfoL( aArray, *aRights, *type );
+
+    // Get detailed time constraint information (start time + end time)
+    FillTimeInfoL( aArray, *aRights, *type );
+
+    // Get detailed accumulated time constraint information (duration)
+    FillAccumulatedTimeInfoL( aArray, *aRights, *type );
+
+    CleanupStack::PopAndDestroy( type );
+    }
+
+#endif // RD_DRM_COMMON_INTERFACE_FOR_OMA_AND_WMDRM
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CFileManagerFullOmaDrmInfo
+// C++ default constructor.
+// -----------------------------------------------------------------------------
+//
+CFileManagerFullOmaDrmInfo::CFileManagerFullOmaDrmInfo()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CFileManagerFullOmaDrmInfo::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CFileManagerFullOmaDrmInfo* CFileManagerFullOmaDrmInfo::NewL( CDesCArray& aArray, 
+                                                         const TDesC& aFullPath,
+                                                         CCoeEnv& aCoeEnv )
+    {
+    CFileManagerFullOmaDrmInfo* self = NewLC( aArray, aFullPath, aCoeEnv );
+    CleanupStack::Pop( self );
+
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CFileManagerFullOmaDrmInfo::NewLC
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CFileManagerFullOmaDrmInfo* CFileManagerFullOmaDrmInfo::NewLC( CDesCArray& aArray, 
+                                                          const TDesC& aFullPath,
+                                                          CCoeEnv& aCoeEnv )
+    {
+    CFileManagerFullOmaDrmInfo* self = new( ELeave ) CFileManagerFullOmaDrmInfo();
+ 
+    CleanupStack::PushL( self );
+    self->ConstructL( aArray, aFullPath, aCoeEnv );
+
+    return self;
+    }
+    
+// -----------------------------------------------------------------------------
+// CFileManagerFullOmaDrmInfo::~CFileManagerFullOmaDrmInfo
+// Destructor
+// -----------------------------------------------------------------------------
+// 
+CFileManagerFullOmaDrmInfo::~CFileManagerFullOmaDrmInfo()
+    {
+    }
+
+#ifndef RD_DRM_COMMON_INTERFACE_FOR_OMA_AND_WMDRM
+
+// -----------------------------------------------------------------------------
+// CImageInfoPopupList::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CFileManagerFullOmaDrmInfo::ConstructL( CDesCArray& aItemArray,
+                                          const TDesC& aFileName,
+                                          CCoeEnv& aCoeEnv )
+    {
+    TBool expired ( EFalse );
+    TBool sendingAllowed( EFalse );
+    RPointerArray<CDRMHelperRightsConstraints> tempArr;
+    TCleanupItem cleanupItem( ResetAndDestroy, &tempArr );
+    CleanupStack::PushL( cleanupItem );
+    tempArr.AppendL( NULL ); // Play
+    tempArr.AppendL( NULL ); // Display
+    tempArr.AppendL( NULL ); // Execute
+    tempArr.AppendL( NULL ); // Print
+
+    CDRMHelper* drmHelper = CDRMHelper::NewLC( aCoeEnv );
+
+    TRAPD( err, drmHelper->GetRightsDetailsL(
+                    aFileName,
+                    0, // Details for everything
+                    expired,
+                    sendingAllowed,
+                    tempArr[KPlayRights],
+                    tempArr[KDisplayRights],
+                    tempArr[KExecuteRights],
+                    tempArr[KPrintRights] ) );
+    TBool future( EFalse );
+    if( expired || err == CDRMRights::ENoRights )
+        {
+        // Check future rights
+        RPointerArray<CDRMRightsConstraints> fArr;
+        TCleanupItem cleanupItem( ResetAndDestroy, &fArr );
+        CleanupStack::PushL( cleanupItem );
+        fArr.AppendL( NULL ); // Play
+        fArr.AppendL( NULL ); // Display
+        fArr.AppendL( NULL ); // Execute
+        fArr.AppendL( NULL ); // Print
+
+        TBool tmp( EFalse );
+        TBool tmp2( EFalse );
+        TRAP( err, drmHelper->GetRightsDetailsL( aFileName,
+                                 0,
+                                 tmp,
+                                 tmp2,
+                                 fArr[KPlayRights],
+                                 fArr[KDisplayRights],
+                                 fArr[KExecuteRights],
+                                 fArr[KPrintRights] ) );
+
+        if( err == KErrNone || err == CDRMRights::ENoRights )
+            {
+            future = IsFutureRights( fArr );
+            }
+        CleanupStack::PopAndDestroy( &fArr );
+
+        ERROR_LOG2( "CFileManagerFullOmaDrmInfo::ConstructL-err:%d,future:%d",
+            err, future )
+        }
+    CleanupStack::PopAndDestroy( drmHelper );
+
+    ERROR_LOG3( "CFileManagerFullOmaDrmInfo::ConstructL-err:%d,expired:%d,sendingAllowed:%d",
+        err, expired, sendingAllowed )
+
+    // Check if the rights are valid or expired
+    // Should probably be able to append this information also when the
+    // rights have expired.
+    // "Status"
+    HBufC* label = StringLoader::LoadLC( R_QTN_DRM_MGR_DET_STAT );
+    HBufC* data = NULL;
+    // "Valid" or "Expired" or "Not valid yet"
+    TInt resId( R_QTN_DRM_MGR_DET_VALID );
+    if( future )
+        {
+        resId = R_QTN_DRM_MGR_DET_NOT_VALID_YET;
+        }
+    else if ( expired || err == CDRMRights::ENoRights )
+        {
+        resId = R_QTN_DRM_MGR_DET_EXP;
+        }
+    data = StringLoader::LoadLC( resId );
+    AppendLabelAndDataToArrayL( aItemArray, *label, *data );
+    CleanupStack::PopAndDestroy( data );
+    CleanupStack::PopAndDestroy( label );
+
+    // "Play"
+    FillDrmInfoL( aItemArray, tempArr[KPlayRights], R_QTN_DRM_MGR_DET2_PLAY );
+
+    // "Display"
+    FillDrmInfoL( aItemArray, tempArr[KDisplayRights], R_QTN_DRM_MGR_DET2_DISPLAY );
+
+    // "Execute"
+    FillDrmInfoL( aItemArray, tempArr[KExecuteRights], R_QTN_DRM_MGR_DET2_EXECUTE );
+
+    // "Print"
+    FillDrmInfoL( aItemArray, tempArr[KPrintRights], R_QTN_DRM_MGR_DET2_PRINT );
+
+    CleanupStack::PopAndDestroy( &tempArr );
+
+    // Check whether sending is allowed or not
+
+    // "Sending"
+    label = StringLoader::LoadLC( R_QTN_DRM_MGR_DET_CS );
+    data = NULL;
+    // "Allowed" or "Forbidden"
+    resId = ( sendingAllowed ? R_QTN_DRM_MGR_DET_ALLOWED
+                             : R_QTN_DRM_MGR_DET_FORBID );
+    data = StringLoader::LoadLC( resId );
+    AppendLabelAndDataToArrayL( aItemArray, *label, *data );
+    CleanupStack::PopAndDestroy( data );
+    CleanupStack::PopAndDestroy( label );
+    }
+
+#else // RD_DRM_COMMON_INTERFACE_FOR_OMA_AND_WMDRM
+
+// -----------------------------------------------------------------------------
+// CImageInfoPopupList::ConstructL
+// -----------------------------------------------------------------------------
+//
+void CFileManagerFullOmaDrmInfo::ConstructL( CDesCArray& aItemArray,
+                                          const TDesC& /*aFileName*/,
+                                          CCoeEnv& /*aCoeEnv*/ )
+    {
+    /*
+    TBool expired ( EFalse );
+    TBool sendingAllowed( EFalse );
+    RPointerArray<CDRMHelperRightsConstraints> tempArr;
+    TCleanupItem cleanupItem( ResetAndDestroy, &tempArr );
+    CleanupStack::PushL( cleanupItem );
+    tempArr.AppendL( NULL ); // Play
+    tempArr.AppendL( NULL ); // Display
+    tempArr.AppendL( NULL ); // Execute
+    tempArr.AppendL( NULL ); // Print
+
+    CDRMHelper* drmHelper = CDRMHelper::NewLC( aCoeEnv );
+
+    TRAPD( err, drmHelper->GetRightsDetailsL(
+                    aFileName,
+                    0, // Details for everything
+                    expired,
+                    sendingAllowed,
+                    tempArr[KPlayRights],
+                    tempArr[KDisplayRights],
+                    tempArr[KExecuteRights],
+                    tempArr[KPrintRights] ) );
+    TBool future( EFalse );
+    if( expired || err == CDRMRights::ENoRights )
+        {
+        // Check future rights
+        RPointerArray<CDRMRightsConstraints> fArr;
+        TCleanupItem cleanupItem( ResetAndDestroy, &fArr );
+        CleanupStack::PushL( cleanupItem );
+        fArr.AppendL( NULL ); // Play
+        fArr.AppendL( NULL ); // Display
+        fArr.AppendL( NULL ); // Execute
+        fArr.AppendL( NULL ); // Print
+
+        TBool tmp( EFalse );
+        TBool tmp2( EFalse );
+        TRAP( err, drmHelper->GetRightsDetailsL( aFileName,
+                                 0,
+                                 tmp,
+                                 tmp2,
+                                 fArr[KPlayRights],
+                                 fArr[KDisplayRights],
+                                 fArr[KExecuteRights],
+                                 fArr[KPrintRights] ) );
+
+        if( err == KErrNone || err == CDRMRights::ENoRights )
+            {
+            future = IsFutureRights( fArr );
+            }
+        CleanupStack::PopAndDestroy( &fArr );
+
+        ERROR_LOG2( "CFileManagerFullOmaDrmInfo::ConstructL-err:%d,future:%d",
+            err, future )
+        }
+    CleanupStack::PopAndDestroy( drmHelper );
+
+    ERROR_LOG3( "CFileManagerFullOmaDrmInfo::ConstructL-err:%d,expired:%d,sendingAllowed:%d",
+        err, expired, sendingAllowed )
+
+    if ( tempArr[KPlayRights] ||
+        tempArr[KDisplayRights] ||
+        tempArr[KExecuteRights] ||
+        tempArr[KPrintRights] )
+        {
+    */
+        // Add link to display rights details
+    _LIT( KLinkTagStart, "<AknMessageQuery Link>" );
+    _LIT( KLinkTagEnd, "</AknMessageQuery Link>" );
+
+    HBufC* linkTitle = StringLoader::LoadLC( R_QTN_FMGR_DRM_DET_LINK );
+    HBufC* linkText = StringLoader::LoadLC( R_QTN_FMGR_DRM_DET_LINK_VIEW );
+    HBufC* dataStr = HBufC::NewLC( KLinkTagStart().Length() +
+                                   linkText->Length() +
+                                   KLinkTagEnd().Length() );
+    TPtr dataPtr( dataStr->Des() );
+    dataPtr.Append( KLinkTagStart );
+    dataPtr.Append( *linkText );
+    dataPtr.Append( KLinkTagEnd );
+    AppendLabelAndDataToArrayL( aItemArray, *linkTitle, *dataStr );
+    CleanupStack::PopAndDestroy( dataStr );
+    CleanupStack::PopAndDestroy( linkText );
+    CleanupStack::PopAndDestroy( linkTitle );
+    /*
+        }
+    else
+        {
+        // Add forward-lock details
+        // "Status"
+        HBufC* label = StringLoader::LoadLC( R_QTN_DRM_MGR_DET_STAT );
+        HBufC* data = NULL;
+        // "Valid" or "Expired" or "Not valid yet"
+        TInt resId( R_QTN_DRM_MGR_DET_VALID );
+        if( future )
+            {
+            resId = R_QTN_DRM_MGR_DET_NOT_VALID_YET;
+            }
+        else if ( expired || err == CDRMRights::ENoRights )
+            {
+            resId = R_QTN_DRM_MGR_DET_EXP;
+            }
+        data = StringLoader::LoadLC( resId );
+        AppendLabelAndDataToArrayL( aItemArray, *label, *data );
+        CleanupStack::PopAndDestroy( data );
+        CleanupStack::PopAndDestroy( label );
+
+        // "Sending"
+        label = StringLoader::LoadLC( R_QTN_DRM_MGR_DET_CS );
+        data = NULL;
+        // "Allowed" or "Forbidden"
+        resId = ( sendingAllowed ? R_QTN_DRM_MGR_DET_ALLOWED
+                                 : R_QTN_DRM_MGR_DET_FORBID );
+        data = StringLoader::LoadLC( resId );
+        AppendLabelAndDataToArrayL( aItemArray, *label, *data );
+        CleanupStack::PopAndDestroy( data );
+        CleanupStack::PopAndDestroy( label );
+        }
+
+    CleanupStack::PopAndDestroy( &tempArr );
+    */
+    }
+
+// -----------------------------------------------------------------------------
+// CImageInfoPopupList::ViewDetailsL
+// -----------------------------------------------------------------------------
+//
+void CFileManagerFullOmaDrmInfo::ViewDetailsL(
+        const TDesC& aFileName,
+        DRM::CDrmUiHandling* aUiHandling )
+    {
+    RFs fs;
+    User::LeaveIfError( fs.Connect() );
+    CleanupClosePushL( fs );
+    
+    RFile64 drmFile;
+    User::LeaveIfError( drmFile.Open( 
+            fs, aFileName, EFileRead | EFileShareReadersOrWriters ) );
+    
+    CleanupClosePushL( drmFile );
+    
+    TRAPD( err, aUiHandling->ShowDetailsViewL( drmFile ) );
+    
+    CleanupStack::PopAndDestroy( &drmFile );
+    CleanupStack::PopAndDestroy( &fs );
+    
+    }
+
+#endif // RD_DRM_COMMON_INTERFACE_FOR_OMA_AND_WMDRM
+
+// End of file