svgtviewer/SvgtViewerPlugin/SvgtFileViewDetailsSrc/svgtfileviewdetails.cpp
branchRCL_3
changeset 20 5fd161fa28b6
parent 0 632761c941a7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/svgtviewer/SvgtViewerPlugin/SvgtFileViewDetailsSrc/svgtfileviewdetails.cpp	Thu Sep 09 11:17:40 2010 +0300
@@ -0,0 +1,904 @@
+/*
+* Copyright (c) 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:  Implementation of the CSvgtFileViewDetailsDialog.
+*
+*/
+
+    
+
+// INCLUDE FILES
+#include "svgtfileviewdetails.h"
+
+#include <aknlists.h>
+#include <bautils.h>
+#include <StringLoader.h>
+#include <e32base.h>
+#include <apmstd.h> // KMaxDataTypeLength
+#include <DRMHelper.h> 
+#include <caf/content.h>
+#include <caf/attribute.h>
+#include <data_caging_path_literals.hrh>
+#include <tz.h>
+#include <tzconverter.h>
+
+#include <svgtfileviewdetails.rsg>
+
+_LIT(KResourceFileName,"svgtfileviewdetails.rsc");
+
+const TInt KSizeStringLengthSix = 6;
+const TInt KSizeStringLengthFive = 5;
+const TInt KSizeStringLengthFour = 4;
+const TInt KSizeStringLengthThree = 3;
+
+const TInt KValBufferLength = 512;
+const TInt KTimeCount = 2;
+const TInt KArrayGranularity = 2; 
+const TInt KDecimalCount = 2;
+
+const TInt KOneDigit1 = 1;
+const TInt KOneDigit5 = 5;
+const TInt KOneDigit9 = 9;
+const TInt KTwoDigit11 = 11;
+const TInt KTwoDigit14 = 14;
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CSvgtFileDetails::CSvgtFileDetails
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CSvgtFileDetails::CSvgtFileDetails() 
+    :   iUrl(NULL), iFormat(NULL), 
+        iDRMExpireConstraint( ESVGTNone )   //Initialize with no constraints
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CSvgtFileDetails::~CSvgtFileDetails   
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CSvgtFileDetails::~CSvgtFileDetails()
+    {
+    delete iUrl;    
+    delete iFormat; 
+    }
+
+
+// CONSTANTS
+
+
+_LIT(KDataTypeSvgt,"svg"); 
+
+const TInt KFileSizeOneKilobyte = 1024;
+const TInt KThousandNotKilobyte = 1000;
+const TInt KMaxTimeLength = 36;
+
+// For meta data 
+_LIT( KSpace, " ");
+
+// Language specific time format
+const TInt KOneDigit = 10;
+const TInt KTwoDigits = 100;
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CSvgtFileViewDetailsDialog::CSvgtFileViewDetailsDialog
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CSvgtFileViewDetailsDialog::CSvgtFileViewDetailsDialog() 
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CSvgtFileViewDetailsDialog::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CSvgtFileViewDetailsDialog::ConstructL()
+    {
+    iListBox = new (ELeave) CAknDoublePopupMenuStyleListBox();
+    }
+
+// -----------------------------------------------------------------------------
+// CSvgtFileViewDetailsDialog::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CSvgtFileViewDetailsDialog* CSvgtFileViewDetailsDialog::NewL()
+    {
+    CSvgtFileViewDetailsDialog* self = new( ELeave ) CSvgtFileViewDetailsDialog;
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+// -----------------------------------------------------------------------------
+// CSvgtFileViewDetailsDialog::~CSvgtFileViewDetailsDialog   
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CSvgtFileViewDetailsDialog::~CSvgtFileViewDetailsDialog()
+    {
+    delete iListBox;
+    iEnv->DeleteResourceFile( iResOffset );  //removing the resource file for enviornment
+    }
+
+// -----------------------------------------------------------------------------
+// CSvgtFileViewDetailsDialog::ExecuteLD
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CSvgtFileViewDetailsDialog::ExecuteLD( RFile& aFileHandle )     
+    {
+    CleanupStack::PushL( this );
+    CSvgtFileDetails* fileDetails = new (ELeave) CSvgtFileDetails();
+    CleanupStack::PushL( fileDetails );
+
+    AddResourceFileToEnvL();
+
+   // Creates a handle to content handled via CAF
+    CContent *content = CContent::NewLC( aFileHandle ); 
+    content->GetAttribute( EIsProtected, fileDetails->iDrmProtected );
+    CleanupStack::PopAndDestroy( content );
+  
+    if ( fileDetails->iDrmProtected )
+        {
+        // drm data
+        FetchDrmDataL( aFileHandle, fileDetails );        
+        }
+    
+    // recognize file and get format
+    TBuf<KMaxDataTypeLength> format(KDataTypeSvgt);
+    fileDetails->iFormat = format.AllocL();
+    
+    // creation time
+    aFileHandle.Modified(fileDetails->iTime);
+   
+    // Convert from UTC to local time
+    RTz lTz;
+    // Connect to TimeZone Server
+    User::LeaveIfError( lTz.Connect() );
+    CleanupClosePushL( lTz );
+    
+    // Create Util Class
+    CTzConverter* lTzConverterPtr = CTzConverter::NewL( lTz );
+    
+    CleanupStack::PushL( lTzConverterPtr );
+    // Perform conversion to local time
+    User::LeaveIfError( lTzConverterPtr->ConvertToLocalTime( fileDetails->iTime ) );
+
+    CleanupStack::PopAndDestroy( 2 ); // lTzConverterPtr, lTz
+
+    // file size
+    aFileHandle.Size(fileDetails->iSize);
+    
+    // Show File Details Dialog
+    DoLaunchDialogL( fileDetails );
+
+    CleanupStack::PopAndDestroy( fileDetails ); 
+    CleanupStack::PopAndDestroy( this ); 
+    
+    }
+
+// -----------------------------------------------------------------------------
+// CSvgtFileViewDetailsDialog::DoLaunchDialog
+// -----------------------------------------------------------------------------
+//
+void CSvgtFileViewDetailsDialog::DoLaunchDialogL(const CSvgtFileDetails* aFileDetails )
+    {
+    CAknPopupList* popupList = CAknPopupList::NewL(iListBox,
+            R_AVKON_SOFTKEYS_OK_EMPTY__OK, 
+            AknPopupLayouts::EMenuDoubleWindow);
+    CleanupStack::PushL(popupList);
+    
+    iListBox->ConstructL(popupList, EAknListBoxViewerFlags);
+    iListBox->CreateScrollBarFrameL(ETrue);   
+    iListBox->ScrollBarFrame()->SetScrollBarVisibilityL(
+                    CEikScrollBarFrame::EOff, CEikScrollBarFrame::EAuto);
+    
+    SetTitleL(popupList);
+    FillListBoxL(aFileDetails);
+
+    CleanupStack::Pop( popupList );
+    popupList->ExecuteLD();
+    }
+
+// -----------------------------------------------------------------------------
+// CSvgtFileViewDetailsDialog::SetTitleL
+// -----------------------------------------------------------------------------
+//
+void CSvgtFileViewDetailsDialog::SetTitleL(CAknPopupList* aPopupList) const
+    {
+    HBufC* title = StringLoader::LoadLC(R_FILE_DETAILS);
+    if( aPopupList )
+       {
+       aPopupList->SetTitleL(*title);   
+       }    
+    CleanupStack::PopAndDestroy( title ); 
+    }
+
+// -----------------------------------------------------------------------------
+// CSvgtFileViewDetailsDialog::FillListBoxL
+// -----------------------------------------------------------------------------
+//
+void CSvgtFileViewDetailsDialog::FillListBoxL(const CSvgtFileDetails* aFileDetails)
+    {
+    CDesCArray* itemArray = 
+            static_cast<CDesCArray*>( iListBox->Model()->ItemTextArray() );
+    
+    if( aFileDetails )
+        {
+        if ( aFileDetails->iDrmProtected )
+            {
+            MakeDrmItemsL(itemArray,aFileDetails);
+            }    
+           
+        MakeUrlItemL(itemArray,aFileDetails);
+        MakeFormatItemL(itemArray,aFileDetails);
+        MakeDateItemL(itemArray,aFileDetails);
+        MakeTimeItemL(itemArray,aFileDetails);
+        MakeSizeItemL(itemArray,aFileDetails);
+        }
+        
+    iListBox->HandleItemAdditionL();
+    iListBox->SetCurrentItemIndex(0);
+    }
+
+// -----------------------------------------------------------------------------
+// CSvgtFileViewDetailsDialog::AddItemToListBoxL
+// -----------------------------------------------------------------------------
+//
+void CSvgtFileViewDetailsDialog::AddItemToListBoxL(const TDesC& aHeading,
+                                             const TDesC& aValue, 
+                                             CDesCArray* aItemArray) const
+    {
+    CDesCArrayFlat* items = new (ELeave) CDesCArrayFlat( KArrayGranularity );
+    CleanupStack::PushL(items);
+    items->AppendL(aHeading); //First string (heading)
+    items->AppendL(aValue);   //Second string (value)
+    HBufC* headingAndValue = 
+            StringLoader::LoadLC( R_FILE_DETAILS_ROW_FORMAT, *items );
+    if( aItemArray )        
+        {
+        aItemArray->AppendL(*headingAndValue);  
+        }    
+
+        CleanupStack::PopAndDestroy( headingAndValue ); // headingAndValue 
+        CleanupStack::PopAndDestroy( items ); // items 
+    }
+
+
+// -----------------------------------------------------------------------------
+// CSvgtFileViewDetailsDialog::MakeUrlItemL
+// -----------------------------------------------------------------------------
+//
+void CSvgtFileViewDetailsDialog::MakeUrlItemL(CDesCArray* aItemArray,
+                                  const CSvgtFileDetails* aFileDetails) const
+    {
+    
+    if ( aFileDetails && aFileDetails->iUrl )
+        {
+        HBufC* heading = StringLoader::LoadLC(R_FILE_URL_HEADING);
+        AddItemToListBoxL(*heading,*aFileDetails->iUrl,aItemArray);
+        CleanupStack::PopAndDestroy( heading ); 
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CSvgtFileViewDetailsDialog::MakeFormatItemL
+// -----------------------------------------------------------------------------
+//
+void CSvgtFileViewDetailsDialog::MakeFormatItemL(CDesCArray* aItemArray,
+                                     const CSvgtFileDetails* aFileDetails) const
+    {
+    if ( aFileDetails && aFileDetails->iFormat )
+        {
+        HBufC* heading = StringLoader::LoadLC(R_FILE_FORMAT_HEADING);
+        AddItemToListBoxL(*heading,*aFileDetails->iFormat,aItemArray);
+        CleanupStack::PopAndDestroy( heading );
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CSvgtFileViewDetailsDialog::MakeSizeItemL
+// -----------------------------------------------------------------------------
+//
+void CSvgtFileViewDetailsDialog::MakeSizeItemL(CDesCArray* aItemArray,
+                                   const  CSvgtFileDetails* aFileDetails) const
+    {
+
+    if ( aFileDetails && aFileDetails->iSize )
+        {   
+        TRealFormat format = TRealFormat(KMaxFileName, KDecimalCount);
+        TBuf<KMaxFileName> sizeString;
+        HBufC* value = NULL;
+        HBufC* heading = StringLoader::LoadLC(R_FILE_SIZE_HEADING);
+        TReal size = aFileDetails->iSize;
+        
+        // Show bytes with 3 digits. If more digits needed, 
+        // show size in kilobytes.
+        if ( size < KThousandNotKilobyte )
+            {
+            sizeString.Num(size,format);
+            switch (sizeString.Length())
+                {
+                case KSizeStringLengthSix:
+                    sizeString = sizeString.Left( KSizeStringLengthThree );
+                    break;
+                case KSizeStringLengthFive:
+                    sizeString = sizeString.Left( KSizeStringLengthFour );
+                    break;
+                default:
+                    break;
+                }
+            value = StringLoader::LoadLC(R_FILE_SIZE_B,sizeString);
+            }
+        else
+            {
+            size = size/KFileSizeOneKilobyte;
+            sizeString.Num(size,format);
+            switch (sizeString.Length())
+                {
+                case KSizeStringLengthSix:
+                    sizeString = sizeString.Left( KSizeStringLengthThree );
+                    break;
+                case KSizeStringLengthFive:
+                    sizeString = sizeString.Left( KSizeStringLengthFour );
+                    break;
+                default:
+                    break;
+                }
+            value = StringLoader::LoadLC(R_FILE_SIZE_KB,sizeString);
+            }
+        TPtr textPtr = value->Des();
+        LanguageSpecificNumberConversion( textPtr );
+        AddItemToListBoxL(*heading,*value,aItemArray);
+        CleanupStack::PopAndDestroy( value ); 
+        CleanupStack::PopAndDestroy( heading ); // heading & value
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CSvgtFileViewDetailsDialog::MakeDateItemL
+// -----------------------------------------------------------------------------
+//
+void CSvgtFileViewDetailsDialog::MakeDateItemL(CDesCArray* aItemArray,
+                                    const CSvgtFileDetails* aFileDetails) const
+    {
+
+    if ( ( aFileDetails ) && ( aFileDetails->iTime > TTime(0) ))
+        {
+        HBufC* heading = StringLoader::LoadLC(R_FILE_DATE_HEADING);
+        HBufC* dateFormatString = 
+                StringLoader::LoadLC( R_QTN_DATE_USUAL_WITH_ZERO );
+        TBuf<KMaxTimeLength> date;
+        aFileDetails->iTime.FormatL(date,*dateFormatString);
+        LanguageSpecificNumberConversion( date );
+        AddItemToListBoxL(*heading,date,aItemArray);
+        CleanupStack::PopAndDestroy( dateFormatString ); 
+        CleanupStack::PopAndDestroy( heading ); // heading & dateFormatString
+        }
+
+    }
+
+// -----------------------------------------------------------------------------
+// CSvgtFileViewDetailsDialog::MakeTimeItemL
+// -----------------------------------------------------------------------------
+//
+void CSvgtFileViewDetailsDialog::MakeTimeItemL(CDesCArray* aItemArray,
+                                  const CSvgtFileDetails* aFileDetails) const
+    {
+    if ( ( aFileDetails ) && ( aFileDetails->iTime > TTime(0)))
+        {
+        HBufC* heading = StringLoader::LoadLC( R_FILE_TIME_HEADING );
+        HBufC* timeFormatString = 
+                StringLoader::LoadLC( R_QTN_TIME_USUAL_WITH_ZERO );
+        TBuf<KMaxTimeLength> time;
+        aFileDetails->iTime.FormatL(time,*timeFormatString);
+        LanguageSpecificNumberConversion( time );
+        AddItemToListBoxL(*heading,time,aItemArray);
+        CleanupStack::PopAndDestroy( timeFormatString ); 
+        CleanupStack::PopAndDestroy( heading ); // heading & timeFormatString
+        }
+    }
+
+
+// -----------------------------------------------------------------------------
+// CSvgtFileViewDetailsDialog::MakeDrmItemsL
+// -----------------------------------------------------------------------------
+//
+void CSvgtFileViewDetailsDialog::MakeDrmItemsL(CDesCArray* aItemArray,
+                                       const CSvgtFileDetails* aFileDetails) const
+    {
+
+    HBufC* rights = StringLoader::LoadLC(R_FILE_DRM_DISPLAY);
+    HBufC* heading = NULL;
+    HBufC* value = NULL;
+    
+    if ( aFileDetails )
+        {
+        switch (aFileDetails->iDRMRightsStatus)
+            {
+            case ESVGTFull:
+                // status
+                heading = StringLoader::LoadLC(R_FILE_DRM_STAT);
+                value = StringLoader::LoadLC(R_FILE_DRM_VALID);
+                AddItemToListBoxL(*heading,*value,aItemArray);
+                CleanupStack::PopAndDestroy( value ); 
+                CleanupStack::PopAndDestroy( heading ); // heading && value
+                // full rights
+                heading = StringLoader::LoadLC(R_FILE_DRM_FULL,*rights);
+                value = StringLoader::LoadLC(R_FILE_DRM_UNLIMITED);
+                AddItemToListBoxL(*heading,*value,aItemArray);
+                CleanupStack::PopAndDestroy( value ); 
+                CleanupStack::PopAndDestroy( heading ); // heading && value
+                break;
+            case ESVGTRestricted:
+            case ESVGTPreview:
+                // status
+                heading = StringLoader::LoadLC(R_FILE_DRM_STAT);
+                value = StringLoader::LoadLC(R_FILE_DRM_VALID);
+                AddItemToListBoxL(*heading,*value,aItemArray);
+                CleanupStack::PopAndDestroy( value ); 
+                CleanupStack::PopAndDestroy( heading ); // heading && value
+                // make rest of the drm items
+                MakeRestrictedDrmItemsL(rights,aItemArray,aFileDetails);          
+                break;
+            case ESVGTMissing:
+                // status
+                heading = StringLoader::LoadLC(R_FILE_DRM_STAT);
+                value = StringLoader::LoadLC(R_FILE_DRM_EXP);
+                AddItemToListBoxL(*heading,*value,aItemArray);
+                CleanupStack::PopAndDestroy( value ); 
+                CleanupStack::PopAndDestroy( heading ); // heading && value
+                break;
+            case ESVGTExpired:
+                // status
+                heading = StringLoader::LoadLC(R_FILE_DRM_STAT);
+                value = StringLoader::LoadLC(R_FILE_DRM_EXP);
+                AddItemToListBoxL(*heading,*value,aItemArray);
+                CleanupStack::PopAndDestroy( value ); 
+                CleanupStack::PopAndDestroy( heading ); // heading && value
+                // make rest of the drm items
+                MakeRestrictedDrmItemsL(rights,aItemArray,aFileDetails);          
+                break;
+            default:
+                break;
+            }
+        }
+    
+    heading = NULL;
+    value = NULL;
+    
+    // sending
+    heading = StringLoader::LoadLC(R_FILE_DRM_CS);
+    if ( aFileDetails && aFileDetails->iDRMForwardLocked )
+        {
+        value = StringLoader::LoadLC(R_FILE_DRM_FORBID);
+        }
+    else
+        {
+        value = StringLoader::LoadLC(R_FILE_DRM_ALLOWED);
+        }
+    AddItemToListBoxL(*heading,*value,aItemArray); 
+    CleanupStack::PopAndDestroy( value ); 
+    CleanupStack::PopAndDestroy( heading ); 
+    CleanupStack::PopAndDestroy( rights ); // heading, value, rights
+    }
+
+// -----------------------------------------------------------------------------
+// CSvgtFileViewDetailsDialog::MakeDrmItemsL
+// -----------------------------------------------------------------------------
+//
+void CSvgtFileViewDetailsDialog::MakeRestrictedDrmItemsL(
+        const HBufC* aRights, CDesCArray* aItemArray, 
+        const CSvgtFileDetails* aFileDetails ) const
+    {
+
+    HBufC* heading = NULL;
+    HBufC* value = NULL;
+    
+    if ( !aRights || !aItemArray )
+        {
+        return;
+        }
+        
+    // count
+    if ( ( aFileDetails ) && ( aFileDetails->iDRMExpireConstraint == ESVGTCount 
+    || aFileDetails->iDRMExpireConstraint == ESVGTCountAndTime ))
+        {
+        heading = StringLoader::LoadLC(R_FILE_DRM_UTL,*aRights);
+        
+        TInt counts = aFileDetails->iDRMCountsLeft;
+        
+        if (counts == 1)
+            {
+            value = StringLoader::LoadLC(R_FILE_DRM_1_COUNT);
+            }
+        else
+            {
+            value = StringLoader::LoadLC(R_FILE_DRM_N_COUNTS,counts);
+            }
+        TPtr textPtr = value->Des();
+        LanguageSpecificNumberConversion( textPtr );
+        AddItemToListBoxL(*heading,*value,aItemArray);
+        CleanupStack::PopAndDestroy( value ); 
+        CleanupStack::PopAndDestroy( heading ); // heading && value
+        }
+
+    if ( ( aFileDetails ) && ( aFileDetails->iDRMExpireConstraint == ESVGTTime ||
+        aFileDetails->iDRMExpireConstraint == ESVGTCountAndTime ||
+        ( aFileDetails->iDRMFileHasInterval && 
+        aFileDetails->iDRMIntervalActive )))
+        {
+        HBufC* dateFormatString = StringLoader::LoadLC( 
+                R_QTN_DATE_USUAL_WITH_ZERO );
+        HBufC* timeFormatString = StringLoader::LoadLC( R_QTN_TIME_USUAL );
+        
+        TTime from = aFileDetails->iDRMValidFrom;
+        TTime until = aFileDetails->iDRMValidUntil;
+
+        // from
+        heading = StringLoader::LoadLC(R_FILE_DRM_VALID_FROM,*aRights);
+        HBufC* datePointer = HBufC::NewLC( KMaxLongDateFormatSpec );
+        TPtr date = datePointer->Des();
+        from.FormatL( date, *dateFormatString );
+        TBuf<KMaxTimeLength> time;
+        from.FormatL( time, *timeFormatString );
+        date.Append( KSpace );
+        date.Append( time );
+        LanguageSpecificNumberConversion( date );
+        AddItemToListBoxL( *heading, date, aItemArray );
+        CleanupStack::PopAndDestroy( datePointer ); 
+        CleanupStack::PopAndDestroy( heading ); // datePointer, heading 
+
+        // until
+        heading = StringLoader::LoadLC(R_FILE_DRM_VALID_TO,*aRights);
+        HBufC* dateToPntr = HBufC::NewLC( KMaxLongDateFormatSpec );
+        TPtr dateTo = dateToPntr->Des();
+        until.FormatL( dateTo, *dateFormatString );
+        TBuf<KMaxTimeLength> timeTo;
+        until.FormatL( timeTo, *timeFormatString );
+        dateTo.Append( KSpace );
+        dateTo.Append( timeTo );
+        LanguageSpecificNumberConversion( dateTo );
+        AddItemToListBoxL( *heading, dateTo, aItemArray );
+
+        // destroying dateFormatString, timeFormatString, heading, dateToPntr 
+        CleanupStack::PopAndDestroy( dateToPntr ); 
+        CleanupStack::PopAndDestroy( heading ); 
+        CleanupStack::PopAndDestroy( timeFormatString ); 
+        CleanupStack::PopAndDestroy( dateFormatString ); 
+        }
+    // interval
+    else 
+        {
+        if ( ( aFileDetails ) && ( aFileDetails->iDRMFileHasInterval && 
+             !aFileDetails->iDRMIntervalActive ))
+            {
+            // times not activated
+            heading = StringLoader::LoadLC(R_FILE_DRM_UTS,*aRights);
+            value  = StringLoader::LoadLC(R_FILE_DRM_NOT_ACT);
+            AddItemToListBoxL(*heading,*value,aItemArray);
+            CleanupStack::PopAndDestroy( value ); // heading && value
+            CleanupStack::PopAndDestroy( heading );
+
+            // query what the current time is
+            TTime currentTime;
+            currentTime.HomeTime();
+            // calculate rights end time
+            TTime endTime = currentTime + aFileDetails->iDRMInterval;
+
+            HBufC* lVal = HBufC::NewLC( KValBufferLength );
+            TPtr valPtr(lVal->Des());
+            
+            TInt count = 0;
+
+            // years
+            TTimeIntervalYears years = endTime.YearsFrom(currentTime);
+            if (years.Int())
+                {
+                AddSinglePartOfTimeL( years.Int(), 
+                                  R_FILE_DRM_NBR_OF_YEARS_ONE,
+                                  R_FILE_DRM_NBR_OF_YEARS_ONE_FINAL,
+                                  R_FILE_DRM_NBR_OF_YEARS_TWO_FOUR,
+                                  R_FILE_DRM_NBR_OF_YEARS_FIVE_ZERO,
+                                  value );
+                count++;
+                valPtr.Append(*value);
+                endTime -= years; 
+                CleanupStack::PopAndDestroy( value ); 
+                }
+            
+            // months
+            TTimeIntervalMonths months = endTime.MonthsFrom(currentTime);
+            if (months.Int())
+                {
+                AddSinglePartOfTimeL( months.Int(), 
+                                  R_FILE_DRM_NBR_OF_MONTHS_ONE,
+                                  0,                                  
+                                  R_FILE_DRM_NBR_OF_MONTHS_TWO_FOUR, 
+                                  R_FILE_DRM_NBR_OF_MONTHS_FIVE_ZERO, 
+                                  value );
+                 if (count)
+                    {
+                    valPtr.Append( KSpace );
+                    }
+
+                count++;
+                valPtr.Append(*value);
+                endTime -= months;
+                CleanupStack::PopAndDestroy( value );
+                }
+       
+            // days
+            TTimeIntervalDays days = endTime.DaysFrom(currentTime);
+            if (days.Int() && count < KTimeCount)
+                {
+                AddSinglePartOfTimeL( days.Int(), 
+                                  R_FILE_DRM_NBR_OF_DAYS_ONE,
+                                  R_FILE_DRM_NBR_OF_DAYS_ONE_FINAL,
+                                  R_FILE_DRM_NBR_OF_DAYS_TWO_FOUR, 
+                                  R_FILE_DRM_NBR_OF_DAYS_FIVE_ZERO, 
+                                  value );
+                if (count)
+                    {
+                    valPtr.Append( KSpace );
+                    }
+
+                valPtr.Append(*value);
+                endTime -= days; 
+                CleanupStack::PopAndDestroy( value ); 
+                count++;
+                }
+       
+            // hours
+            TTimeIntervalHours hours;
+            TInt ret = endTime.HoursFrom(currentTime,hours);
+            if (ret == KErrNone && count < KTimeCount && hours.Int())
+                {
+                AddSinglePartOfTimeL( hours.Int(), 
+                                  R_FILE_DRM_NBR_OF_HOURS_ONE, 
+                                  R_FILE_DRM_NBR_OF_HOURS_ONE_FINAL,
+                                  R_FILE_DRM_NBR_OF_HOURS_TWO_FOUR, 
+                                  R_FILE_DRM_NBR_OF_HOURS_FIVE_ZERO, 
+                                  value );
+                if (count)
+                    {
+                    valPtr.Append( KSpace );
+                    }
+
+                valPtr.Append(*value);
+                endTime -= hours; 
+                CleanupStack::PopAndDestroy( value ); 
+                count++;
+                }
+
+            // mins
+            TTimeIntervalMinutes minutes;
+            ret = endTime.MinutesFrom(currentTime,minutes);
+            if (ret == KErrNone && count < KTimeCount && minutes.Int())
+                {
+                AddSinglePartOfTimeL( minutes.Int(), 
+                                  R_FILE_DRM_NBR_OF_MINS_ONE,
+                                  R_FILE_DRM_NBR_OF_MINS_ONE_FINAL,
+                                  R_FILE_DRM_NBR_OF_MINS_TWO_FOUR, 
+                                  R_FILE_DRM_NBR_OF_MINS_FIVE_ZERO, 
+                                  value );
+                if (count)
+                    {
+                    valPtr.Append( KSpace );
+                    }
+
+                valPtr.Append(*value);
+                endTime -= minutes; 
+                CleanupStack::PopAndDestroy( value );
+                count++;
+                }
+            
+            // seconds
+            TTimeIntervalSeconds seconds;
+            ret = endTime.SecondsFrom(currentTime,seconds);
+            if (ret == KErrNone && count < KTimeCount && seconds.Int())
+                {
+                AddSinglePartOfTimeL( seconds.Int(), 
+                                  R_FILE_DRM_NBR_OF_SECS_ONE, 
+                                  R_FILE_DRM_NBR_OF_SECS_ONE_FINAL,
+                                  R_FILE_DRM_NBR_OF_SECS_TWO_FOUR, 
+                                  R_FILE_DRM_NBR_OF_SECS_FIVE_ZERO, 
+                                  value );
+
+                if (count)
+                    {
+                    valPtr.Append( KSpace );
+                    }
+
+                valPtr.Append(*value);
+                CleanupStack::PopAndDestroy( value ); 
+                count++;
+                }
+           
+            heading = StringLoader::LoadLC(R_FILE_DRM_UDL,*aRights);
+            LanguageSpecificNumberConversion(valPtr);
+            AddItemToListBoxL(*heading,valPtr,aItemArray);
+            CleanupStack::PopAndDestroy( lVal ); 
+            CleanupStack::PopAndDestroy( heading ); 
+            }
+            
+        }
+      
+    }
+
+// -----------------------------------------------------------------------------
+// CSvgtFileViewDetailsDialog::LanguageSpecificNumberConversion
+// -----------------------------------------------------------------------------
+//
+void CSvgtFileViewDetailsDialog::LanguageSpecificNumberConversion( TDes& aText ) const
+    {
+    if ( AknTextUtils::DigitModeQuery( AknTextUtils::EDigitModeShownToUser ) )
+        {
+        AknTextUtils::DisplayTextLanguageSpecificNumberConversion( aText );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CSvgtFileViewDetailsDialog::FetchDrmDataL
+// -----------------------------------------------------------------------------
+//
+void CSvgtFileViewDetailsDialog::FetchDrmDataL( RFile& aFileHandle, 
+                                          CSvgtFileDetails* aFileDetails ) const
+    {
+   
+    CSVGTDrmHelper* myHelper = CSVGTDrmHelper::NewLC();
+    
+    myHelper->LoadUsageRigthsInfoL(aFileHandle);
+
+    if ( aFileDetails )
+        {
+        myHelper->GetUsageRightsStatus(aFileDetails->iDRMRightsStatus);
+      
+        // sending
+        aFileDetails->iDRMForwardLocked = !myHelper->SendingAllowed();
+            
+        if (aFileDetails->iDRMRightsStatus == ESVGTRestricted ||
+            aFileDetails->iDRMRightsStatus == ESVGTPreview ||
+            aFileDetails->iDRMRightsStatus == ESVGTExpired)
+            {    
+            // counts
+            TInt retCount = myHelper->GetCount(aFileDetails->iDRMCountsLeft);
+
+            if (retCount == KErrNone)
+                {
+                aFileDetails->iDRMExpireConstraint = ESVGTCount;
+                }
+            
+            // time
+            TInt retTime = myHelper->GetStartTime(aFileDetails->iDRMValidFrom); 
+            retTime = myHelper->GetEndTime(aFileDetails->iDRMValidUntil); 
+
+            if (retTime == KErrNone && retCount == KErrNone)
+                {
+                aFileDetails->iDRMExpireConstraint = ESVGTCountAndTime;
+                }
+            else 
+                {
+                if (retTime == KErrNone)
+                    {
+                    aFileDetails->iDRMExpireConstraint = ESVGTTime;
+                    }
+                }
+      
+             // interval    
+            if (myHelper->GetInterval(aFileDetails->iDRMInterval) == KErrNone)
+                {
+                aFileDetails->iDRMFileHasInterval = ETrue;
+                TTime from;
+                if (myHelper->GetIntervalStart(from) == KErrNone)
+                    {
+                    aFileDetails->iDRMIntervalActive = ETrue;
+                    // active from
+                    aFileDetails->iDRMValidFrom = from;
+                    // calculate rights end time
+                    aFileDetails->iDRMValidUntil = 
+                        aFileDetails->iDRMValidFrom + aFileDetails->iDRMInterval;
+                    }
+                else
+                    {
+                    aFileDetails->iDRMIntervalActive = EFalse;
+                    }
+                }
+            else
+                {
+                aFileDetails->iDRMFileHasInterval = EFalse;
+                aFileDetails->iDRMIntervalActive = EFalse;
+                }
+            }        
+        }
+    
+    // cleanup
+    CleanupStack::PopAndDestroy( myHelper );
+    }
+
+// -----------------------------------------------------------------------------
+// CSvgtFileViewDetailsDialog::AddSinglePartOfTimeL
+// -----------------------------------------------------------------------------
+//
+void CSvgtFileViewDetailsDialog::AddSinglePartOfTimeL( TInt aNumOfElements,
+                                                 TInt aResourceIdSingle,
+                                                 TInt aResourceIdOneFinal, 
+                                                 TInt aResourceIdTwoFour,
+                                                 TInt aResourceIdFiveZero, 
+                                                 HBufC*& aStrings ) const
+    {
+    TInt finalOneDigit = aNumOfElements % KOneDigit;
+    TInt finalTwoDigits = aNumOfElements % KTwoDigits;
+
+    if ( aNumOfElements == 1 )
+        {
+        aStrings = StringLoader::LoadLC( aResourceIdSingle);
+        }
+    else if ( finalOneDigit == KOneDigit1 && finalTwoDigits != KTwoDigit11 )
+        {
+        // Used for period of years ending with 1 from 21 (21, 31, 41, etc.)
+        aStrings = StringLoader::LoadLC( aResourceIdOneFinal, aNumOfElements );
+        }
+    else if ( finalOneDigit == 0 || 
+            ( finalOneDigit >= KOneDigit5 && finalOneDigit <= KOneDigit9 ) ||
+            ( finalTwoDigits >= KTwoDigit11 && finalTwoDigits <= KTwoDigit14 ) )
+        {
+        // Used for period of minutes ending from 5 to 0 plus range between 11 
+        // and 14 (5-20, 25-30, 35-40, 45-50, 53-59)
+        aStrings = StringLoader::LoadLC( aResourceIdFiveZero, aNumOfElements );
+        }
+    else
+        {
+        // Used for period of minutes ending from 2 to 4, excluded 12-14 (2-4,
+        // 22-24, 32-34, 42-44, 52-54)        
+        aStrings = StringLoader::LoadLC( aResourceIdTwoFour, aNumOfElements );
+        }     
+    }
+
+void CSvgtFileViewDetailsDialog::AddResourceFileToEnvL() 
+    {
+    TFileName resFileName;
+    Dll::FileName( resFileName ); // get dll path
+    TDriveName drive( TParsePtrC( resFileName ).Drive( ) ); // solve drive
+    resFileName.Zero();
+    resFileName.Append( drive );
+    resFileName.Append( KDC_RESOURCE_FILES_DIR );
+    resFileName.Append( KResourceFileName );
+
+    iEnv = CEikonEnv::Static();
+    BaflUtils::NearestLanguageFile(iEnv->FsSession(), resFileName); //for localization
+    iEnv->AddResourceFileL(resFileName);
+    RResourceFile resFile;
+    CleanupClosePushL(resFile);
+    resFile.OpenL(iEnv->FsSession(), resFileName);
+    resFile.ConfirmSignatureL();
+    iResOffset = resFile.Offset();
+    CleanupStack::PopAndDestroy(&resFile); //resFile
+    }
+
+    
+//  End of File