diff -r e52958d06c29 -r 20b99a6d6175 svgtviewer/SvgtViewerPlugin/SvgtFileViewDetailsSrc/svgtfileviewdetails.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/svgtviewer/SvgtViewerPlugin/SvgtFileViewDetailsSrc/svgtfileviewdetails.cpp Wed Sep 01 12:29:59 2010 +0100 @@ -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 +#include +#include +#include +#include // KMaxDataTypeLength +#include +#include +#include +#include +#include +#include + +#include + +_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 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( 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 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 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 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 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 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