filemanager/View/src/CFileManagerFullOmaDrmInfo.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:31:07 +0100
branchRCL_3
changeset 21 65326cf895ed
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* 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