--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/filedetails/filedetailsdialog/src/MPFileDetailsDialog.cpp Mon Jan 18 20:21:12 2010 +0200
@@ -0,0 +1,1837 @@
+/*
+* Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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 CMPFileDetailsDialog.*
+*/
+
+
+// Version : %version: 16 %
+
+// INCLUDE FILES
+#include <aknlists.h>
+#include <bautils.h>
+#include <StringLoader.h>
+#include <e32base.h>
+#include <utf.h>
+#include <mmf/common/mmferrors.h>
+#include <DRMHelper.h>
+#include <aknclearer.h>
+#include <e32math.h> //for size rounding
+
+#include <MPFileDetails.rsg>
+#include "mpxvideo_debug.h"
+
+#include <AiwServiceHandler.h>
+#include <AiwCdmaCommands.hrh>
+#include <featmgr.h>
+#include <data_caging_path_literals.hrh> // KDC_RESOURCE_FILES_DIR
+#include <centralrepository.h>
+#include "MediaPlayerVariant.hrh"
+#include <MetaDataUtility.h>
+#include <MetaDataFieldContainer.h>
+#include <caf/content.h>
+#include <Oma2Agent.h>
+
+#include "MediaPlayerPrivateCRKeys.h"
+#include "MPFileDetailsDialog.h"
+#include "mppopuplist.h"
+#include <mediarecognizer.h>
+#include <streaminglinkmodel.h>
+#include "MPFileDetails.h"
+#include "MediaPlayerDrmHelper.h"
+
+//
+// Inline methods
+//
+#include "MPFileDetailsDialog.inl"
+
+//#include "MPAppConsts.h"
+
+#include <drmutility.h>
+
+#ifdef __WINDOWS_MEDIA
+#include <asxparser.h>
+#endif
+
+// CONSTANTS
+_LIT(KResourceFile,"z:MPFileDetails.rsc");
+
+const TInt KOneKilobyte = 1;
+const TInt KFileSizeOneKilobyte = 1024;
+const TInt KThousandNotKilobyte = 1000;
+const TInt KOneSecond(1000000);
+const TInt KOneHourInSeconds(3600);
+const TInt KMaxTimeLength = 36;
+const TInt KMaxFilePathLength = 2048;
+
+// For meta data
+_LIT( KMPTitle, "Title" );
+_LIT( KMPArtist, "Artist" );
+_LIT( KMPAuthor, "Author" );
+_LIT( KMPCopyright, "Copyright" );
+_LIT( KMPAbstract, "Abstract" );
+
+_LIT( KExt3gpp, "3gp" );
+_LIT( KExtMp4, "mp4" );
+_LIT( KExtM4a, "m4a" );
+
+_LIT(KDetaMime3gpp, "audio/3gpp");
+_LIT(KDetaMime3gpp2, "audio/3gpp2");
+_LIT(KDetaMimeMp4, "audio/mp4");
+
+_LIT(KFormat,"MimeType");
+_LIT(KMPX, "x");
+
+
+// ================= OTHER EXPORTED FUNCTIONS ==============
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::CMPFileDetailsDialog
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CMPFileDetailsDialog::CMPFileDetailsDialog()
+ : iResourceFileOffset(0)
+ , iResult( KErrNone )
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::CMPFileDetailsDialog()"));
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::ConstructL()
+{
+
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::ConstructL()"));
+
+ LoadResourcesL();
+ iListBox = new (ELeave) CAknDoublePopupMenuStyleListBox();
+ iGenres = CCoeEnv::Static()->ReadDesCArrayResourceL( R_MP_GENRE_STRINGS );
+
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::NewL
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CMPFileDetailsDialog* CMPFileDetailsDialog::NewL()
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog* CMPFileDetailsDialog::NewL()"));
+
+ CMPFileDetailsDialog* self = new( ELeave ) CMPFileDetailsDialog();
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop();
+ return self;
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::~CMPFileDetailsDialog
+// Destructor
+// -----------------------------------------------------------------------------
+//
+EXPORT_C CMPFileDetailsDialog::~CMPFileDetailsDialog()
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::~CMPFileDetailsDialog()"));
+ if( iPopupList )
+ {
+ iPopupList->CancelPopup();
+ }
+
+ delete iListBox;
+ delete iGenres;
+ UnLoadResources();
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::ExecuteLD
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMPFileDetailsDialog::ExecuteLD(const TDesC& aFileName)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::ExecuteLD()"));
+
+ CleanupStack::PushL( this );
+ CMPFileDetails* fileDetails = new (ELeave) CMPFileDetails();
+ CleanupStack::PushL( fileDetails );
+
+ //
+ // Obtain file path first so it can be used later
+ //
+ fileDetails->iFilePath = aFileName.AllocL();
+
+#ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
+ RFile64 fileHandle;
+#else
+ RFile fileHandle;
+#endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
+ TUint fileMode = EFileShareReadersOrWriters | EFileStream | EFileRead;
+ RFs fs = CEikonEnv::Static()->FsSession();
+
+ User::LeaveIfError(fileHandle.Open(fs, aFileName, fileMode));
+ CleanupClosePushL(fileHandle);
+
+ DRM::CDrmUtility* drmUtil = DRM::CDrmUtility::NewLC();
+
+ TRAP_IGNORE( fileDetails->iDrmProtected =
+ drmUtil->IsProtectedL(fileHandle) );
+
+ CleanupStack::PopAndDestroy(2); // fileHandle, drmUtil
+
+ if ( fileDetails->iDrmProtected )
+ {
+ //
+ // All DRM rights are handled & displayed by DRM component.
+ // MP only needs to display DCF header info (Title, Provider, Description).
+ //
+ FetchDCFHeaderDataL(aFileName, fileDetails);
+ }
+
+ // recognize file and get format
+ CMediaRecognizer* recognizer = CMediaRecognizer::NewL();
+ CleanupStack::PushL(recognizer);
+ CMediaRecognizer::TMediaType mediaType =
+ recognizer->IdentifyMediaTypeL( aFileName, ETrue );
+ // mime type not shown for playlists and ram files
+ if ( mediaType != CMediaRecognizer::ELocalRamFile &&
+ mediaType != CMediaRecognizer::ELocalAsxFile &&
+ mediaType != CMediaRecognizer::ELocalAudioPlaylist )
+ {
+ fileDetails->iFormat = recognizer->MimeTypeL( aFileName ).AllocL();
+ }
+ CleanupStack::PopAndDestroy(); // recognizer
+
+ // filename
+ TParse parse;
+ parse.Set(aFileName,NULL,NULL);
+ fileDetails->iFileName = parse.Name().AllocL();
+
+ switch (mediaType)
+ {
+ case CMediaRecognizer::ELocalVideoFile:
+ {
+#ifdef SYMBIAN_BUILD_GCE
+ CVideoPlayerUtility2* videoPlayer = CVideoPlayerUtility2::NewL(*this,
+ EMdaPriorityNormal,EMdaPriorityPreferenceNone );
+#else
+ CMPDummyController* dummy = CMPDummyController::NewLC();
+ TRect tmp;
+ CVideoPlayerUtility* videoPlayer = CVideoPlayerUtility::NewL(*this,
+ EMdaPriorityNormal,EMdaPriorityPreferenceNone,
+ dummy->GetClientWsSession(),dummy->GetScreenDevice(),
+ dummy->GetClientWindow(),tmp,tmp);
+#endif // SYMBIAN_BUILD_GCE
+ CleanupStack::PushL(videoPlayer);
+ // open
+ videoPlayer->OpenFileL(aFileName);
+ // wait open to complete
+ iWait.Start();
+
+ if (iResult && iResult != KErrMMPartialPlayback)
+ {
+#ifdef SYMBIAN_BUILD_GCE
+ CleanupStack::PopAndDestroy(1); // videoPlayer
+#else
+ CleanupStack::PopAndDestroy(2); // dummy and videoPlayer
+#endif //SYMBIAN_BUILD_GCE
+ break;
+ }
+ // prepare
+ videoPlayer->Prepare();
+ // wait prepare to complete
+ iWait.Start();
+
+ if (iResult && iResult != KErrMMPartialPlayback)
+ {
+#ifdef SYMBIAN_BUILD_GCE
+ CleanupStack::PopAndDestroy(1); // videoPlayer
+#else
+ CleanupStack::PopAndDestroy(2); // dummy and videoPlayer
+#endif //SYMBIAN_BUILD_GCE
+ break;
+ }
+ // get video file details
+ // duration
+ fileDetails->iDurationInSeconds =
+ videoPlayer->DurationL().Int64() / KOneSecond;
+ // resolution
+ TSize size;
+ videoPlayer->VideoFrameSizeL(size);
+ fileDetails->iResolutionHeight = size.iHeight;
+ fileDetails->iResolutionWidth = size.iWidth;
+ // bitrate
+ fileDetails->iBitrate = videoPlayer->VideoBitRateL() +
+ videoPlayer->AudioBitRateL();
+
+ // video track
+ fileDetails->iVideoTrack = videoPlayer->VideoBitRateL();
+
+ TPtrC8 videoFormat = videoPlayer->VideoFormatMimeType();
+
+ delete fileDetails->iFormat;
+ fileDetails->iFormat = NULL;
+
+ if ( videoFormat.Length())
+ {
+ HBufC* videoFormat16 = HBufC::NewLC(videoFormat.Length());
+ TPtr videoFormatDes16(videoFormat16->Des());
+ videoFormatDes16.Copy(videoFormat);
+
+ fileDetails->iFormat = videoFormatDes16.AllocL();
+ CleanupStack::PopAndDestroy(); //videoFormat16
+ }
+
+ // copyright & title & format
+ TInt metaCount = videoPlayer->NumberOfMetaDataEntriesL();
+ CMMFMetaDataEntry* metaData;
+ for (TInt i = 0; i < metaCount; i++)
+ {
+ metaData = videoPlayer->MetaDataEntryL(i);
+ if (!metaData->Name().CompareF(KMPCopyright))
+ {
+ fileDetails->iCopyright = metaData->Value().AllocL();
+ }
+ else if (!metaData->Name().CompareF(KMPArtist) || !metaData->Name().Compare(KMPAuthor))
+ {
+ fileDetails->iArtist = metaData->Value().Alloc();
+ }
+ else if (!metaData->Name().CompareF(KMPTitle))
+ {
+ fileDetails->iTitle = metaData->Value().AllocL();
+ }
+ else if (!metaData->Name().CompareF(KMPAbstract))
+ {
+ fileDetails->iDescription = metaData->Value().AllocL();
+ }
+ else if (!(metaData->Name().CompareF(KFormat) || fileDetails->iFormat))
+ {
+ fileDetails->iFormat = metaData->Value().AllocL();
+ }
+ delete metaData;
+ }
+#ifdef SYMBIAN_BUILD_GCE
+ CleanupStack::PopAndDestroy(1); // videoPlayer
+#else
+ CleanupStack::PopAndDestroy(2); // dummy and videoPlayer
+#endif //SYMBIAN_BUILD_GCE
+ }
+ break;
+ case CMediaRecognizer::ELocalRamFile:
+ {
+ // get first link
+ CStreamingLinkModel* linkModel = CStreamingLinkModel::NewL();
+ CleanupStack::PushL(linkModel);
+ User::LeaveIfError(linkModel->OpenLinkFileL( aFileName, EFalse ));
+ fileDetails->iUrl = HBufC::NewL(linkModel->MaxLinkLength());
+ TPtr filePtr = fileDetails->iUrl->Des();
+ TBool dummy;
+ linkModel->GetNextLinkL(filePtr,dummy);
+ CleanupStack::PopAndDestroy(); // linkModel
+ }
+ break;
+ case CMediaRecognizer::ELocalAsxFile:
+ {
+#ifdef __WINDOWS_MEDIA
+ CAsxParser* asxParser = NULL;
+ TRAPD(err, asxParser = CAsxParser::NewL( aFileName ));
+ CleanupStack::PushL( asxParser );
+
+ if ( !err && asxParser && asxParser->FileVersion() > 0 )
+ {
+ TUint asxUrlCount = 0;
+ TPtrC8 urlPtr;
+
+ asxParser->GetUrlCount(asxUrlCount);
+ if ( asxUrlCount )
+ {
+ // get first link
+ asxParser->GetUrl(1,urlPtr);
+ fileDetails->iUrl = HBufC::NewL(urlPtr.Length());
+ TPtr filePtr = fileDetails->iUrl->Des();
+ asxParser->PrintUrl(urlPtr,filePtr);
+ }
+ }
+ CleanupStack::PopAndDestroy(); // asxparser
+#endif
+ }
+ break;
+ case CMediaRecognizer::ELocalAudioFile:
+ {
+ FetchMetaDataL( aFileName, fileDetails );
+ }
+ break;
+ default:
+ break;
+ }
+
+
+ if (mediaType != CMediaRecognizer::ELocalRamFile &&
+ mediaType != CMediaRecognizer::ELocalAsxFile )
+ {
+ RFs fs = CEikonEnv::Static()->FsSession();
+#ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
+ RFile64 file;
+#else
+ RFile file;
+#endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
+ TInt error = file.Open(fs, aFileName, EFileRead | EFileShareReadersOnly);
+ if (error)
+ {
+ // Try different sharing method if the first one failed.
+ error = file.Open(fs, aFileName, EFileRead | EFileShareAny);
+ }
+
+ if (!error)
+ {
+ // Set item size, ignore error code
+ if (mediaType != CMediaRecognizer::ELocalAudioPlaylist)
+ {
+ file.Size(fileDetails->iSize);
+ }
+ // Set modification date & time, ignore error code
+ file.Modified(fileDetails->iTime);
+ file.Close();
+ }
+ }
+
+ // Show File Details in differend ExecuteLD
+ ExecuteLD( fileDetails );
+ CleanupStack::PopAndDestroy(); // fileDetails
+ CleanupStack::Pop(); // this
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::ExecuteLD
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMPFileDetailsDialog::ExecuteLD(CMPFileDetails* aFileDetails)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::ExecuteLD()"));
+
+ if ( aFileDetails->iDrmProtected && aFileDetails->iFilePath )
+ {
+ // drm data
+ FetchDrmDataL( *aFileDetails->iFilePath, aFileDetails );
+ }
+
+
+ if ( iPopupList )
+ {
+ iPopupList->CancelPopup();
+ iPopupList = NULL;
+ }
+
+ //
+ // use Media Player's own PopupList, not Avkon's PopupList
+ //
+#ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
+ TInt64 size(0);
+#else
+ TInt size(0);
+#endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
+ TInt error(0);
+ TInt handleExists(0);
+ if ( aFileDetails->iDetailsFileHandle.SubSessionHandle() )
+ {
+ error = aFileDetails->iDetailsFileHandle.Size( size );
+ }
+
+ handleExists =(!error && size )? ETrue:EFalse;
+
+ if( handleExists )
+ {
+ iPopupList = CMPPopupList::NewL( iListBox,
+ aFileDetails->iDetailsFileHandle,
+ aFileDetails->iDrmProtected,
+ aFileDetails->iReadingDCFOnly );
+ }
+ else
+ {
+ //
+ // file path is not available when this ExecuteLD(aFileDetails) method is
+ // launched by MP Video View for streaming link. Hence, this value is set
+ // to Null in such case.
+ //
+ HBufC* temp = HBufC::NewL(KMaxFilePathLength);
+ CleanupStack::PushL( temp );
+ TPtr filePathPtr = temp->Des();
+
+ if ( aFileDetails->iFilePath )
+ {
+ filePathPtr.Append( aFileDetails->iFilePath->Des() );
+ }
+ else
+ {
+ filePathPtr.Append( KNullDesC() );
+ }
+
+ //
+ // use Media Player's own PopupList, not Avkon's PopupList
+ //
+ iPopupList = CMPPopupList::NewL( iListBox,
+ filePathPtr,
+ aFileDetails->iDrmProtected,
+ aFileDetails->iReadingDCFOnly );
+
+ CleanupStack::PopAndDestroy( temp );
+ }
+
+ TRAPD( err,
+ {
+ iListBox->ConstructL(iPopupList, CEikListBox::EDisableHighlight );
+ iListBox->ItemDrawer()->ColumnData()->EnableMarqueeL( ETrue );
+
+ iListBox->CreateScrollBarFrameL(ETrue);
+ iListBox->ScrollBarFrame()->
+ SetScrollBarVisibilityL( CEikScrollBarFrame::EOff,
+ CEikScrollBarFrame::EAuto );
+
+ SetTitleL(iPopupList);
+ FillListBoxL(aFileDetails);
+
+ iPopupList->ExecuteLD();
+ iPopupList = NULL;
+ } );//TRAP
+
+ //explicitly cancel the Popup if it's not terminated properly
+ if ( err && iPopupList )
+ {
+ iPopupList->CancelPopup();
+ iPopupList = NULL;
+ }
+
+ delete this;
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::UnLoadResourceFile
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::UnLoadResources()
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::UnLoadResources()"));
+
+ if (iResourceFileOffset > 0)
+ {
+ CCoeEnv::Static()->DeleteResourceFile(iResourceFileOffset);
+ iResourceFileOffset = 0;
+ }
+}
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::LoadResourceFileL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::LoadResourcesL()
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::LoadResourcesL()"));
+
+ if (iResourceFileOffset == 0)
+ {
+ CCoeEnv* enviro = CCoeEnv::Static();
+ TFileName resourceFile;
+
+ //
+ // Get the path & file name with the drive not specified
+ //
+ _LIT(KMPTempFile,"MPFileDetails.rsc");
+ TParse parse;
+ parse.Set(KMPTempFile, &KDC_APP_RESOURCE_DIR, NULL);
+ TPtrC rscFile = parse.FullName();
+
+ //
+ // This is done to ensure upgraded file is used first.
+ // If no upgraded file is found, default file in Z: drive will be used.
+ //
+ TFindFile find( CCoeEnv::Static()->FsSession() );
+ TInt err = find.FindByDir( rscFile, KNullDesC );
+ MPX_DEBUG(_L("CMPFileDetailsDialog::LoadResourcesL() : err(%d)"),err );
+
+ if ( err )
+ {
+ parse.Set(KResourceFile, &KDC_APP_RESOURCE_DIR, NULL);
+ TPtrC defaultRscFile = parse.FullName();
+ resourceFile.Append( defaultRscFile );
+ MPX_DEBUG(_L("CMPFileDetailsDialog::LoadResourcesL() : defaultRsc(%S)"),&resourceFile );
+ }
+ else
+ {
+ resourceFile.Append( find.File() );
+ MPX_DEBUG(_L("CMPFileDetailsDialog::LoadResourcesL() : upgradeRsc(%S)"),&resourceFile );
+ }
+
+ BaflUtils::NearestLanguageFile( enviro->FsSession(), resourceFile );
+ iResourceFileOffset = enviro->AddResourceFileL( resourceFile );
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::SetTitleL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::SetTitleL(CAknPopupList* aPopupList)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::SetTitleL()"));
+
+ HBufC* title = StringLoader::LoadLC(R_MP_FILE_DETAILS);
+ aPopupList->SetTitleL(*title);
+ CleanupStack::PopAndDestroy(); //title
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::FillListBoxL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::FillListBoxL(CMPFileDetails* aFileDetails)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::FillListBoxL()"));
+
+ CDesCArray* itemArray =
+ static_cast<CDesCArray*>( iListBox->Model()->ItemTextArray() );
+
+ TBool drmProtected = aFileDetails->iDrmProtected;
+
+ // re-evaluate drm protection
+ // for playlists it may be inaccurate
+ if ( ! drmProtected )
+ {
+ if ( aFileDetails->iDetailsFileHandle.SubSessionHandle() )
+ {
+ CContent* content = CContent::NewL( aFileDetails->iDetailsFileHandle );
+ content->GetAttribute( EIsProtected, drmProtected );
+ delete content;
+ }
+ else if (aFileDetails->iFilePath != NULL)
+ {
+ CContent* content = CContent::NewL( aFileDetails->iFilePath->Des() );
+ content->GetAttribute( EIsProtected, drmProtected );
+ delete content;
+ }
+
+ //
+ // since 'aFileDetails->iDrmProtected' is EFalse earlier
+ // and now it becomes ETrue after the re-evaluation,
+ // the related softkeys need to be re-initalized here
+ //
+ if ( drmProtected )
+ {
+ iPopupList->ReConstructDrmSoftkeysL(drmProtected);
+ }
+ }
+
+ // if content is drm protected, fetch the drm data
+ if ( drmProtected && aFileDetails->iFilePath )
+ {
+ FetchDrmDataL( *aFileDetails->iFilePath, aFileDetails );
+ }
+
+ if ( drmProtected && ! aFileDetails->iReadingDCFOnly )
+ {
+ //
+ // All DRM rights & constraints are handled & displayed by DRM component.
+ // So, MP only needs to display the Heading here.
+ //
+
+ //
+ // According to UI Spec, DRM info is always the 1st entry of the Details dlg.
+ // The softkeys of the Details pop-up (CMPPopupList) are constructed based
+ // on this info. Hence, if the order entry of DRM is changed, softkeys in
+ // CMPPopupList need to be updated accordingly.
+ //
+ DisplayDrmHeadingInfoL( itemArray );
+ }
+
+ MakeTitleItemL(itemArray,aFileDetails);
+ MakeArtistItemL(itemArray,aFileDetails);
+ MakeOriginalArtistItemL(itemArray,aFileDetails);
+ MakeAlbumItemL(itemArray,aFileDetails);
+ MakeAlbumTrackItemL(itemArray,aFileDetails);
+ MakeGenreItemL(itemArray,aFileDetails);
+ MakeComposerItemL(itemArray,aFileDetails);
+ MakeProviderItemL(itemArray,aFileDetails);
+ MakeFormatItemL(itemArray,aFileDetails);
+ MakeResolutionItemL(itemArray,aFileDetails);
+ MakeDurationItemL(itemArray,aFileDetails);
+ MakeBitrateItemL(itemArray,aFileDetails);
+ MakeSamplerateItemL(itemArray,aFileDetails);
+ MakeSizeItemL(itemArray,aFileDetails);
+ MakeDateItemL(itemArray,aFileDetails);
+ MakeTimeItemL(itemArray,aFileDetails);
+
+ if ( FeatureManager::FeatureSupported( KFeatureIdLightSurf ) )
+ {
+ MakeUploadStatusL( itemArray, aFileDetails );
+ }
+
+ MakeYearItemL(itemArray,aFileDetails);
+ MakeDescriptionItemL(itemArray,aFileDetails);
+ MakeCommentItemL(itemArray,aFileDetails);
+ MakeUrlItemL(itemArray,aFileDetails);
+ MakeAudioFileWebPageItemL(itemArray,aFileDetails);
+ MakeCopyrightItemL(itemArray,aFileDetails);
+
+ iListBox->HandleItemAdditionL();
+ iListBox->SetCurrentItemIndex(0);
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::AddItemToListBoxL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::AddItemToListBoxL(const TDesC& aHeading,
+ const TDesC& aValue,
+ CDesCArray* aItemArray)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::AddItemToListBoxL()"));
+
+ CDesCArrayFlat* items = new (ELeave) CDesCArrayFlat(2);
+ CleanupStack::PushL(items);
+ items->AppendL(aHeading); //First string (heading)
+
+ //remove tabs from aValue
+ HBufC* aValueBuf = aValue.AllocLC();
+ TPtr aValuePtr = aValueBuf->Des();
+
+ // remove EndOfString character
+ if (aValuePtr.Length() > 0)
+ {
+ TChar c = aValuePtr[aValuePtr.Length()-1];
+ if (c.Eos())
+ {
+ aValuePtr.Delete(aValuePtr.Length()-1,aValuePtr.Length());
+ }
+ }
+
+ for( TInt i = 0; i < aValuePtr.Length(); i++ )
+ {
+ if( aValuePtr[i] == '\t' )
+ {
+ aValuePtr[i] = ' ';
+ }
+ }
+ items->AppendL(aValuePtr); //Second string (value)
+ CleanupStack::PopAndDestroy( aValueBuf ); //aValueBuf
+
+ HBufC* headingAndValue =
+ StringLoader::LoadLC( R_MP_FILE_DETAILS_ROW_FORMAT, *items );
+ aItemArray->AppendL(*headingAndValue);
+ CleanupStack::PopAndDestroy(2); // items & headingAndValue
+}
+
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::MakeTitleItemL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::MakeTitleItemL( CDesCArray* aItemArray,
+ CMPFileDetails* aFileDetails)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeTitleItemL()"));
+
+ if (aFileDetails->iTitle)
+ {
+ HBufC* heading = StringLoader::LoadLC(R_MP_FILE_TITLE_HEADING);
+ AddItemToListBoxL(*heading,*aFileDetails->iTitle,aItemArray);
+ CleanupStack::PopAndDestroy(); // heading
+ return;
+ }
+
+ if (aFileDetails->iFileName)
+ {
+ HBufC* heading = StringLoader::LoadLC(R_MP_FILE_NAME_HEADING);
+ AddItemToListBoxL(*heading,*aFileDetails->iFileName,aItemArray);
+ CleanupStack::PopAndDestroy(); // heading
+ }
+}
+
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::MakeUrlItemL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::MakeUrlItemL( CDesCArray* aItemArray,
+ CMPFileDetails* aFileDetails)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeUrlItemL()"));
+
+ if (aFileDetails->iUrl)
+ {
+ HBufC* heading = StringLoader::LoadLC(R_MP_FILE_URL_HEADING);
+ AddItemToListBoxL(*heading,*aFileDetails->iUrl,aItemArray);
+ CleanupStack::PopAndDestroy(); // heading
+ }
+}
+
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::MakeFormatItemL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::MakeFormatItemL(CDesCArray* aItemArray,
+ CMPFileDetails* aFileDetails)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeFormatItemL()"));
+
+ if (aFileDetails->iFormat)
+ {
+ HBufC* heading = StringLoader::LoadLC(R_MP_FILE_FORMAT_HEADING);
+ AddItemToListBoxL(*heading,*aFileDetails->iFormat,aItemArray);
+ CleanupStack::PopAndDestroy(); // heading
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::MakeResolutionItemL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::MakeResolutionItemL(CDesCArray* aItemArray,
+ CMPFileDetails* aFileDetails)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeResolutionItemL()"));
+
+ if (aFileDetails->iResolutionWidth && aFileDetails->iResolutionHeight)
+ {
+ HBufC* heading = StringLoader::LoadLC(R_MP_FILE_RESOLUTION_HEADING);
+ CArrayFix<TInt>* items = new (ELeave) CArrayFixFlat<TInt>(2);
+ CleanupStack::PushL(items);
+ items->AppendL(aFileDetails->iResolutionWidth);
+ items->AppendL(aFileDetails->iResolutionHeight);
+ HBufC* value = StringLoader::LoadLC(R_MP_FILE_RESOLUTION,*items);
+ TPtr text = value->Des();
+ TInt index = text.FindC(KMPX);
+ LanguageSpecificNumberConversion( text );
+ text.Replace(index,1,KMPX);
+ AddItemToListBoxL(*heading,*value,aItemArray);
+ CleanupStack::PopAndDestroy(3); // heading,items,value
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::MakeDurationItemL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::MakeDurationItemL(CDesCArray* aItemArray,
+ CMPFileDetails* aFileDetails)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeDurationItemL()"));
+
+ TInt64 duration = aFileDetails->iDurationInSeconds;
+ if (duration > 0)
+ {
+ HBufC* dateFormatString;
+ if (duration < KOneHourInSeconds)
+ {
+ // Read time format string from AVKON resource
+ dateFormatString = StringLoader::LoadLC(R_QTN_TIME_DURAT_MIN_SEC);
+ }
+ else
+ {
+ // Read time format string from AVKON resource
+ dateFormatString = StringLoader::LoadLC(R_QTN_TIME_DURAT_LONG);
+ }
+ TBuf<16> dur;
+ TTime durTime = TTime(duration*KOneSecond);
+ durTime.FormatL(dur, *dateFormatString);
+ LanguageSpecificNumberConversion( dur );
+ HBufC* heading = StringLoader::LoadLC(R_MP_FILE_DURATION_HEADING);
+ AddItemToListBoxL(*heading,dur,aItemArray);
+ CleanupStack::PopAndDestroy(2); // heading & dateFormatString
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::MakeBitrateItemL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::MakeBitrateItemL(CDesCArray* aItemArray,
+ CMPFileDetails* aFileDetails)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeBitrateItemL()"));
+
+ if (aFileDetails->iBitrate > 0)
+ {
+ HBufC* heading = StringLoader::LoadLC(R_MP_FILE_BITRATE_HEADING);
+ HBufC* value = StringLoader::LoadLC(
+ R_MP_FILE_BITRATE,aFileDetails->iBitrate / KThousandNotKilobyte );
+ TPtr text = value->Des();
+ LanguageSpecificNumberConversion( text );
+ AddItemToListBoxL(*heading,*value,aItemArray);
+ CleanupStack::PopAndDestroy(2); // heading & value
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::MakeSamplerateItemL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::MakeSamplerateItemL(CDesCArray* aItemArray,
+ CMPFileDetails* aFileDetails)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeSamplerateItemL()"));
+
+ if (aFileDetails->iSamplerate > 0)
+ {
+ HBufC* heading = StringLoader::LoadLC(R_MP_FILE_SAMPLERATE_HEADING);
+ HBufC* value = StringLoader::LoadLC(
+ R_MP_FILE_SAMPLERATE,aFileDetails->iSamplerate);
+ TPtr text = value->Des();
+ LanguageSpecificNumberConversion( text );
+ AddItemToListBoxL(*heading,*value,aItemArray);
+ CleanupStack::PopAndDestroy(2); // heading & value
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::MakeSizeItemL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::MakeSizeItemL(CDesCArray* aItemArray,
+ CMPFileDetails* aFileDetails)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeSizeItemL()"));
+
+ if (aFileDetails->iSize)
+ {
+ TRealFormat format = TRealFormat(KMaxFileName,2);
+ TBuf<KMaxFileName> sizeString;
+ HBufC* value;
+ HBufC* heading = StringLoader::LoadLC(R_MP_FILE_SIZE_HEADING);
+ TReal size = aFileDetails->iSize;
+ TReal truncsize;
+ size = size/KFileSizeOneKilobyte;
+ // Show kilobytes with 3 digits. If more digits needed,
+ // show size in megabytes. Only round up if showing kB
+ if ( size < KThousandNotKilobyte )
+ {
+ if (size > KOneKilobyte) // CR rounding only if size between 1kB and 1MB
+ { // rounding for Gallery/Messaging display equivalency
+ const TReal tempsize = size; // need const
+ TInt err = Math::Int(truncsize, tempsize);
+ if (err == KErrNone) // need to catch error after convert to Tint
+ {
+ if ((size > truncsize) && (size < truncsize + 1))
+ {
+ size = truncsize +1;
+ }
+ // else do nothing, size will be used
+ } // if conversion failed, keep it TReal
+ }
+ sizeString.Num(size,format);
+ switch (sizeString.Length())
+ {
+ case 6:
+ sizeString = sizeString.Left(3);
+ break;
+ case 5:
+ sizeString = sizeString.Left(4);
+ break;
+ default:
+ break;
+ }
+ value = StringLoader::LoadLC(R_MP_FILE_SIZE_KB,sizeString);
+ }
+ else
+ {
+ size = size/KFileSizeOneKilobyte;
+ sizeString.Num(size,format);
+ switch (sizeString.Length())
+ {
+ case 6:
+ sizeString = sizeString.Left(3);
+ break;
+ case 5:
+ sizeString = sizeString.Left(4);
+ break;
+ default:
+ break;
+ }
+ value = StringLoader::LoadLC(R_MP_FILE_SIZE_MB,sizeString);
+ }
+ TPtr text = value->Des();
+ LanguageSpecificNumberConversion( text );
+ AddItemToListBoxL(*heading,*value,aItemArray);
+ CleanupStack::PopAndDestroy(2); // heading & value
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::MakeDateItemL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::MakeDateItemL(CDesCArray* aItemArray,
+ CMPFileDetails* aFileDetails)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeDateItemL()"));
+
+ if (aFileDetails->iTime > TTime(0))
+ {
+ HBufC* heading = StringLoader::LoadLC(R_MP_FILE_DATE_HEADING);
+ HBufC* dateFormatString =
+ StringLoader::LoadLC( R_QTN_DATE_USUAL_WITH_ZERO );
+ TBuf<KMaxTimeLength> date;
+ TTime localDate = aFileDetails->iTime + User::UTCOffset();
+ localDate.FormatL(date,*dateFormatString);
+ LanguageSpecificNumberConversion( date );
+ AddItemToListBoxL(*heading,date,aItemArray);
+ CleanupStack::PopAndDestroy(2); // heading & dateFormatString
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::MakeTimeItemL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::MakeTimeItemL(CDesCArray* aItemArray,
+ CMPFileDetails* aFileDetails)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeTimeItemL()"));
+
+ if (aFileDetails->iTime > TTime(0))
+ {
+ HBufC* heading = StringLoader::LoadLC( R_MP_FILE_TIME_HEADING );
+ HBufC* timeFormatString =
+ StringLoader::LoadLC( R_QTN_TIME_USUAL_WITH_ZERO );
+ TBuf<32> time;
+ TTime localTime = aFileDetails->iTime + User::UTCOffset();
+ localTime.FormatL(time,*timeFormatString);
+ LanguageSpecificNumberConversion( time );
+ AddItemToListBoxL(*heading,time,aItemArray);
+ CleanupStack::PopAndDestroy(2); // heading & timeFormatString
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::MakeUploadStatusL
+// -----------------------------------------------------------------------------
+//
+
+void CMPFileDetailsDialog::MakeUploadStatusL(CDesCArray* aItemArray,
+ CMPFileDetails* aFileDetails)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeUploadStatusL()"));
+
+ if(aFileDetails->iVideoTrack)
+ {
+ HBufC* heading = StringLoader::LoadLC( R_QTN_MP_FILE_UPLOAD_STATUS );
+
+ CAiwServiceHandler* AIWServiceHandler = CAiwServiceHandler::NewLC();
+
+ // AIW generic input param list
+ CAiwGenericParamList& mpBaseInputParamsList =
+ AIWServiceHandler->InParamListL();
+ // Aiw generic output param list
+ CAiwGenericParamList& mpBaseOutputParamsList =
+ AIWServiceHandler->OutParamListL();
+
+ //assign the file name
+ TAiwVariant fileNameVariant( aFileDetails->iFileName );
+ TAiwGenericParam fileNameParam( EGenericParamFile, fileNameVariant );
+ mpBaseInputParamsList.AppendL( fileNameParam ); //file name
+
+ // Execute the AIW service command
+ AIWServiceHandler->ExecuteServiceCmdL( KAIWCmdAmsExtendedLightSurfData,
+ mpBaseInputParamsList,
+ mpBaseOutputParamsList );
+
+ HBufC* str;
+ str = StringLoader::LoadLC(R_QTN_MP_VIDEO_NOT_UPLOADED );
+ //if file is uploaded, then only provider will add the result
+ //to the output param list
+ if ( mpBaseOutputParamsList.Count() > 0)
+ {
+ TInt Index = 0;
+ //check for file type
+ const TAiwGenericParam* uploadParam =
+ mpBaseOutputParamsList.FindFirst( Index,
+ EGenericParamCharSet, EVariantTypeDesC );
+ if(uploadParam != NULL )
+ {
+ CleanupStack::PopAndDestroy();
+ str = StringLoader::LoadLC(R_QTN_MP_VIDEO_UPLOADED );
+ }
+ }
+
+ AddItemToListBoxL(*heading,*str,aItemArray);
+ CleanupStack::PopAndDestroy(3); // heading, str & AIWServiceHandler
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::MakeCopyrightItemL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::MakeCopyrightItemL(CDesCArray* aItemArray,
+ CMPFileDetails* aFileDetails)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeCopyrightItemL()"));
+
+ if (aFileDetails->iCopyright)
+ {
+ HBufC* heading = StringLoader::LoadLC(R_MP_FILE_COPYRIGHT_HEADING);
+ TPtr text = aFileDetails->iCopyright->Des();
+ LanguageSpecificNumberConversion( text );
+ AddItemToListBoxL(*heading,*aFileDetails->iCopyright,aItemArray);
+ CleanupStack::PopAndDestroy(); // heading
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::MakeOriginalArtistItemL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::MakeOriginalArtistItemL(CDesCArray* aItemArray,
+ CMPFileDetails* aFileDetails)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeOriginalArtistItemL()"));
+
+ if (aFileDetails->iOriginalArtist)
+ {
+ HBufC* heading = StringLoader::LoadLC(R_MP_FILE_ARTIST_ORIGINAL_HEADING);
+ TPtr text = aFileDetails->iOriginalArtist->Des();
+ LanguageSpecificNumberConversion( text );
+ AddItemToListBoxL(*heading,*aFileDetails->iOriginalArtist,aItemArray);
+ CleanupStack::PopAndDestroy(); // heading
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::MakeAlbumTrackItemL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::MakeAlbumTrackItemL(CDesCArray* aItemArray,
+ CMPFileDetails* aFileDetails)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeAlbumTrackItemL()"));
+
+ if (aFileDetails->iAlbumTrack)
+ {
+ HBufC* heading = StringLoader::LoadLC(R_MP_FILE_ALBUM_TRACK_HEADING);
+ TPtr text = aFileDetails->iAlbumTrack->Des();
+ LanguageSpecificNumberConversion( text );
+ AddItemToListBoxL(*heading,*aFileDetails->iAlbumTrack,aItemArray);
+ CleanupStack::PopAndDestroy(); // heading
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::MakeGenreItemL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::MakeGenreItemL(CDesCArray* aItemArray,
+ CMPFileDetails* aFileDetails)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeGenreItemL()"));
+ if (aFileDetails->iGenre)
+ {
+ HBufC* heading = StringLoader::LoadLC(R_MP_FILE_GENRE_HEADING);
+ TPtr text = aFileDetails->iGenre->Des();
+
+ LanguageSpecificNumberConversion( text );
+ AddItemToListBoxL(*heading,*aFileDetails->iGenre,aItemArray);
+
+ CleanupStack::PopAndDestroy(); // heading
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::MakeComposerItemL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::MakeComposerItemL(CDesCArray* aItemArray,
+ CMPFileDetails* aFileDetails)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeComposerItemL()"));
+
+ if (aFileDetails->iComposer)
+ {
+ HBufC* heading = StringLoader::LoadLC(R_MP_FILE_COMPOSER_HEADING);
+ TPtr text = aFileDetails->iComposer->Des();
+ LanguageSpecificNumberConversion( text );
+ AddItemToListBoxL(*heading,*aFileDetails->iComposer,aItemArray);
+ CleanupStack::PopAndDestroy(); // heading
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::MakeAudioFileWebPageItemL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::MakeAudioFileWebPageItemL(
+ CDesCArray* aItemArray,
+ CMPFileDetails* aFileDetails )
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeAudioFileWebPageItemL()"));
+
+ if (aFileDetails->iAudioFileWebPage)
+ {
+ HBufC* heading = StringLoader::LoadLC(R_MP_FILE_INFO_URL_HEADING);
+ TPtr text = aFileDetails->iAudioFileWebPage->Des();
+ LanguageSpecificNumberConversion( text );
+ AddItemToListBoxL(*heading,*aFileDetails->iAudioFileWebPage,aItemArray);
+ CleanupStack::PopAndDestroy(); // heading
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::MakeCommentItemL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::MakeCommentItemL(CDesCArray* aItemArray,
+ CMPFileDetails* aFileDetails)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeCommentItemL()"));
+
+ if (aFileDetails->iComment)
+ {
+ HBufC* heading = StringLoader::LoadLC(R_MP_FILE_COMMENT_HEADING);
+ TPtr text = aFileDetails->iComment->Des();
+ LanguageSpecificNumberConversion( text );
+ AddItemToListBoxL(*heading,*aFileDetails->iComment,aItemArray);
+ CleanupStack::PopAndDestroy(); // heading
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::MakeArtistItemL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::MakeArtistItemL(CDesCArray* aItemArray,
+ CMPFileDetails* aFileDetails)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeArtistItemL()"));
+
+ if (aFileDetails->iArtist)
+ {
+ HBufC* heading = StringLoader::LoadLC(R_MP_FILE_ARTIST_HEADING);
+ AddItemToListBoxL(*heading,*aFileDetails->iArtist,aItemArray);
+ CleanupStack::PopAndDestroy(); // heading
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::MakeAlbumItemL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::MakeAlbumItemL(CDesCArray* aItemArray,
+ CMPFileDetails* aFileDetails)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeAlbumItemL()"));
+
+ if (aFileDetails->iAlbum)
+ {
+ HBufC* heading = StringLoader::LoadLC(R_MP_FILE_ALBUM_HEADING);
+ AddItemToListBoxL(*heading,*aFileDetails->iAlbum,aItemArray);
+ CleanupStack::PopAndDestroy(); // heading
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::MakeYearItemL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::MakeYearItemL(CDesCArray* aItemArray,
+ CMPFileDetails* aFileDetails)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeYearItemL()"));
+
+ if (aFileDetails->iYear)
+ {
+ HBufC* heading = StringLoader::LoadLC(R_MP_FILE_YEAR_HEADING);
+ TPtr text = aFileDetails->iYear->Des();
+ LanguageSpecificNumberConversion( text );
+ AddItemToListBoxL(*heading,*aFileDetails->iYear,aItemArray);
+ CleanupStack::PopAndDestroy(); // heading
+ }
+}
+
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::DisplayDrmHeadingInfoL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::DisplayDrmHeadingInfoL(CDesCArray* aItemArray)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::DisplayDrmHeadingInfoL()"));
+
+ //
+ // All DRM rights & constraints are handled & displayed by DRM component.
+ // So, MP only needs to display the Heading here.
+ //
+
+ //
+ // License
+ // For details click 'View'
+ //
+ HBufC* heading = StringLoader::LoadLC(R_QTN_MP_DRM_LICENSE_HEADING);
+ HBufC* value = StringLoader::LoadLC(R_QTN_MP_DRM_DETAILS_VIEW);
+ AddItemToListBoxL(*heading,*value,aItemArray);
+ CleanupStack::PopAndDestroy(2); // heading && value
+}
+
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::LanguageSpecificNumberConversion
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::LanguageSpecificNumberConversion( TDes& aText ) const
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::LanguageSpecificNumberConversion()"));
+
+ if ( AknTextUtils::DigitModeQuery( AknTextUtils::EDigitModeShownToUser ) )
+ {
+ AknTextUtils::DisplayTextLanguageSpecificNumberConversion( aText );
+ }
+}
+
+// Dummy implementations for audio callback
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::MapcInitComplete
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::MapcInitComplete(
+ TInt aError,
+ const TTimeIntervalMicroSeconds& /*aDuration*/)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MapcInitComplete()"));
+
+ // Open completed, resume ExecuteLD(const TDesC& aFileName)
+ iResult = aError;
+ if ( iWait.IsStarted() )
+ {
+ iWait.AsyncStop();
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::MapcPlayComplete
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::MapcPlayComplete(TInt /*aError*/)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MapcPlayComplete()"));
+}
+
+
+// Dummy implementations for video callback
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::MvpuoOpenComplete
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::MvpuoOpenComplete(TInt aError)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MvpuoOpenComplete()"));
+
+ // Open completed, resume ExecuteLD(const TDesC& aFileName)
+ iResult = aError;
+ if ( iWait.IsStarted() )
+ {
+ iWait.AsyncStop();
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::MvpuoFrameReady
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::MvpuoFrameReady( CFbsBitmap& /*aFrame*/,
+ TInt /*aError*/ )
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MvpuoFrameReady()"));
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::MvpuoPlayComplete
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::MvpuoPlayComplete(TInt /*aError*/)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MvpuoPlayComplete()"));
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::MvpuoPrepareComplete
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::MvpuoPrepareComplete(TInt aError)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MvpuoPrepareComplete()"));
+
+ // Prepare completed, resume ExecuteLD(const TDesC& aFileName)
+ iResult = aError;
+ if ( iWait.IsStarted() )
+ {
+ iWait.AsyncStop();
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::MvpuoEvent
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::MvpuoEvent(const TMMFEvent& /*aEvent*/)
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MvpuoEvent()"));
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::FetchMetaDataL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::FetchMetaDataL( const TDesC& aFileName,
+ CMPFileDetails* aFileDetails )
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::FetchMetaDataL()"));
+
+ CMdaAudioPlayerUtility* audioPlayer = CMdaAudioPlayerUtility::NewL(*this);
+ CleanupStack::PushL( audioPlayer );
+ // Open audio player with the file.
+ audioPlayer->OpenFileL( aFileName );
+ // Wait open to complete. Active Scheduler is resumed, when the player is
+ // initialized. See CMPFileDetailsDialog::MapcInitComplete.
+ iWait.Start();
+
+ // iResult is updated according to error code in MapcInitComplete
+ if ( iResult )
+ {
+ // Get metadata
+ if( aFileDetails->iDrmProtected )
+ {
+ switch( aFileDetails->iDRMRightsStatus )
+ {
+ case EMediaPlayerFull:
+ case EMediaPlayerRestricted:
+ case KMediaPlayerWmdrmValid:
+ {
+ FetchAdditionalMetaDataL( aFileName, aFileDetails );
+ break;
+ }
+ case EMediaPlayerMissing:
+ case EMediaPlayerExpired:
+ case EMediaPlayerPreview:
+ case KMediaPlayerWmdrmExpired:
+ {
+ FetchDCFHeaderDataL( aFileName, aFileDetails );
+ break;
+ }
+ default:
+ {
+ // nothing to do
+ break;
+ }
+ }
+ }
+ else
+ {
+ FetchAdditionalMetaDataL( aFileName, aFileDetails );
+ }
+ CleanupStack::PopAndDestroy(); // audioPlayer
+ return;
+ }
+
+ // get audio file details
+ aFileDetails->iDurationInSeconds =
+ audioPlayer->Duration().Int64() / KOneSecond;
+
+ // Bitrate
+ TPckgBuf<TMMFAudioConfig> data;
+ const TMMFMessageDestinationPckg destinationPckg(
+ KUidInterfaceMMFAudioController );
+ TInt err = audioPlayer->CustomCommandSync( destinationPckg,
+ EMMFAudioControllerGetSourceBitRate,
+ KNullDesC8, KNullDesC8, data );
+ if ( !err )
+ {
+ aFileDetails->iBitrate = data().iSampleRate;
+ }
+
+ // Samplerate
+ err = audioPlayer->CustomCommandSync( destinationPckg,
+ EMMFAudioControllerGetSourceSampleRate,
+ KNullDesC8, KNullDesC8, data );
+ if ( !err )
+ {
+ aFileDetails->iSamplerate = data().iSampleRate;
+ }
+
+ CleanupStack::PopAndDestroy(); // audioPlayer
+
+ // get metadata
+ FetchAdditionalMetaDataL( aFileName, aFileDetails );
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::FetchDrmDataL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::FetchDrmDataL( const TDesC& aFileName,
+ CMPFileDetails* aFileDetails )
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::FetchDrmDataL()"));
+
+ //
+ // Only 'aFileDetails->iDRMRightsStatus' is still needed to display additional meta data.
+ // Those additional meta data are obtained in FetchAdditionalMetaDataL() method.
+ // All other DRM related info (expire constraints, counts, valid from/until, etc.)
+ // are obtained and displayed by DRM Details component.
+ //
+ CDRMHelper* drmHelper = CDRMHelper::NewLC(*CCoeEnv::Static());
+ CMediaPlayerDrmHelper* mediaDrmHelper = CMediaPlayerDrmHelper::NewL(drmHelper);
+ CleanupStack::PushL(mediaDrmHelper);
+
+#ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
+ TInt64 size(0);
+#else
+ TInt size(0);
+#endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
+ TInt err(0);
+
+ if ( aFileDetails->iDetailsFileHandle.SubSessionHandle() )
+ err = aFileDetails->iDetailsFileHandle.Size( size );
+
+ if (!err && size )
+ mediaDrmHelper->LoadDrmUsageRightsInfoL(aFileDetails->iDetailsFileHandle);
+ else
+ {
+ RFs fs = CEikonEnv::Static()->FsSession();
+ TInt error = aFileDetails->iDetailsFileHandle.Open(fs, aFileName, EFileRead | EFileShareReadersOnly);
+ if (error)
+ error = aFileDetails->iDetailsFileHandle.Open(fs, aFileName, EFileRead | EFileShareAny);
+
+ if (!error)
+ mediaDrmHelper->LoadDrmUsageRightsInfoL(aFileDetails->iDetailsFileHandle);
+ else
+ mediaDrmHelper->LoadDrmUsageRightsInfoL(aFileName);
+ }
+
+ mediaDrmHelper->GetDrmUsageRightsStatus(aFileDetails->iDRMRightsStatus);
+
+ // cleanup
+ CleanupStack::PopAndDestroy(2); // drmHelper, mediaDrmHelper
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::MakeProviderItemL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::MakeProviderItemL( CDesCArray* aItemArray,
+ CMPFileDetails* aFileDetails )
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeProviderItemL()"));
+
+ if (aFileDetails->iProvider)
+ {
+ HBufC* heading = StringLoader::LoadLC(R_MP_FILE_PROVIDER_HEADING);
+ AddItemToListBoxL(*heading,*aFileDetails->iProvider,aItemArray);
+ CleanupStack::PopAndDestroy(); // heading
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::MakeDescriptionItemL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::MakeDescriptionItemL( CDesCArray* aItemArray,
+ CMPFileDetails* aFileDetails )
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeDescriptionItemL()"));
+
+ if (aFileDetails->iDescription)
+ {
+ HBufC* heading = StringLoader::LoadLC(R_MP_FILE_DESCRIPTION_HEADING);
+ AddItemToListBoxL(*heading,*aFileDetails->iDescription,aItemArray);
+ CleanupStack::PopAndDestroy(); // heading
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::FetchAdditionalMetaDataL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::FetchAdditionalMetaDataL( const TDesC& aFileName,
+ CMPFileDetails* aFileDetails )
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::FetchAdditionalMetaDataL()"));
+
+ CMetaDataUtility *metaDataUtility = CMetaDataUtility::NewL();
+ CleanupStack::PushL( metaDataUtility );
+ TRAPD( err, metaDataUtility->OpenFileL( aFileName ) );
+ if( err == KErrNone ) // leaves if file in use
+ {
+ TInt count = metaDataUtility->MetaDataCount();
+ for(TInt i = 0; i < count; i++)
+ {
+ TMetaDataFieldId fieldId;
+ TPtrC field = metaDataUtility->MetaDataFieldsL().At( i, fieldId );
+ if( field != KNullDesC )
+ {
+ switch( fieldId )
+ {
+ case EMetaDataSongTitle:
+ {
+ SetFileDetailL( aFileDetails->iTitle, field );
+ break;
+ }
+ case EMetaDataArtist:
+ {
+ SetFileDetailL( aFileDetails->iArtist, field );
+ break;
+ }
+ case EMetaDataAlbum:
+ {
+ SetFileDetailL( aFileDetails->iAlbum, field );
+ break;
+ }
+ case EMetaDataYear:
+ {
+ SetFileDetailL( aFileDetails->iYear, field );
+ break;
+ }
+ case EMetaDataCopyright:
+ {
+ SetFileDetailL( aFileDetails->iCopyright, field );
+ break;
+ }
+ case EMetaDataOriginalArtist:
+ {
+ SetFileDetailL( aFileDetails->iOriginalArtist, field );
+ break;
+ }
+ case EMetaDataAlbumTrack:
+ {
+ SetFileDetailL( aFileDetails->iAlbumTrack, field );
+ break;
+ }
+ case EMetaDataGenre:
+ {
+ SetFileDetailL( aFileDetails->iGenre, field );
+ break;
+ }
+ case EMetaDataComposer:
+ {
+ SetFileDetailL( aFileDetails->iComposer, field );
+ break;
+ }
+ case EMetaDataUserUrl:
+ case EMetaDataUrl: // (L616) fallthrough
+ {
+ SetFileDetailL( aFileDetails->iAudioFileWebPage, field );
+ break;
+ }
+ case EMetaDataComment:
+ {
+ SetFileDetailL( aFileDetails->iComment, field );
+ break;
+ }
+ default:
+ {
+ // nothing to do
+ break;
+ }
+ }
+ }
+ }
+ }
+ CleanupStack::PopAndDestroy(); // metaDataUtility
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::FetchDCFHeaderDataL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::FetchDCFHeaderDataL( const TDesC& aFileName,
+ CMPFileDetails* aFileDetails )
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::FetchDCFHeaderDataL()"));
+
+ TBuf <256> headerValue;
+ TInt err( KErrNone );
+ CContent* content = CContent::NewLC( aFileName );
+
+ // Content-Name
+ err = content->GetStringAttribute(ETitle, headerValue);
+ if( err == KErrNone )
+ {
+ SetFileDetailL( aFileDetails->iTitle, headerValue );
+ }
+
+ // Content-Vendor
+ err = content->GetStringAttribute(EContentVendor, headerValue);
+ if( err == KErrNone )
+ {
+ SetFileDetailL( aFileDetails->iProvider, headerValue );
+ }
+
+ // Content-Description
+ err = content->GetStringAttribute(EDescription, headerValue);
+ if( err == KErrNone )
+ {
+ SetFileDetailL( aFileDetails->iDescription, headerValue );
+ }
+
+ // clean up
+ CleanupStack::PopAndDestroy(); // content
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::Is3gpFile
+// -----------------------------------------------------------------------------
+//
+TBool CMPFileDetailsDialog::Is3gpFile( const TDesC& aFileName,
+ CMPFileDetails* aFileDetails )
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::Is3gpFile()"));
+
+ TBool retVal( EFalse );
+ // File extension
+ if( aFileName.FindF( KExt3gpp ) != KErrNotFound ||
+ aFileName.FindF( KExtMp4 ) != KErrNotFound ||
+ aFileName.FindF( KExtM4a ) != KErrNotFound )
+ {
+ retVal = ETrue;
+ }
+
+ // Mimetype
+ if( !retVal && aFileDetails->iFormat )
+ {
+ TPtrC mime = aFileDetails->iFormat->Des();
+ if (mime == KDetaMime3gpp ||
+ mime == KDetaMime3gpp2 ||
+ mime == KDetaMimeMp4)
+ {
+ retVal = ETrue;
+ }
+ }
+
+ return retVal;
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::SetFileDetailL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::SetFileDetailL( HBufC*& aBuf, const TDesC& aDetail )
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::SetFileDetailL()"));
+
+ if( !aBuf && aDetail.Length() )
+ {
+ aBuf = aDetail.AllocL();
+ }
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::SetFileDetailL
+// -----------------------------------------------------------------------------
+//
+void CMPFileDetailsDialog::SetFileDetailL( HBufC*& aBuf, const TDesC8& aDetail )
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::SetFileDetailL()"));
+
+ if( !aBuf && aDetail.Length())
+ {
+ aBuf = HBufC::New( aDetail.Length() );
+ aBuf->Des().Copy( aDetail );
+ }
+}
+
+// CMPFileDetailsDialog::Close
+// -----------------------------------------------------------------------------
+//
+EXPORT_C void CMPFileDetailsDialog::Close()
+{
+ MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::Close()"));
+
+ if ( iPopupList )
+ {
+ iPopupList->CancelPopup();
+ }
+}
+
+// ============================ CMPDummyController ============================
+
+// -----------------------------------------------------------------------------
+// CMPDummyController::CMPDummyController
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CMPDummyController::CMPDummyController()
+{
+ MPX_ENTER_EXIT(_L("CMPDummyController::CMPDummyController()"));
+}
+
+// -----------------------------------------------------------------------------
+// CMPFileDetailsDialog::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CMPDummyController::ConstructL()
+{
+ MPX_ENTER_EXIT(_L("CMPDummyController::ConstructL()"));
+
+ CreateWindowL();
+ SetExtent(TPoint(), TSize());
+ ActivateL();
+ SetPointerCapture(ETrue);
+ ClaimPointerGrab(ETrue);
+}
+
+// -----------------------------------------------------------------------------
+// CMPDummyController::NewLC()
+// Two-phased constructor.
+// -----------------------------------------------------------------------------
+//
+CMPDummyController* CMPDummyController::NewLC()
+{
+ MPX_ENTER_EXIT(_L("CMPDummyController::NewLC()"));
+
+ CMPDummyController* self= new (ELeave) CMPDummyController();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ return self;
+}
+
+// -----------------------------------------------------------------------------
+// CMPDummyController::~CMPDummyController
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CMPDummyController::~CMPDummyController()
+{
+ MPX_ENTER_EXIT(_L("CMPDummyController::~CMPDummyController()"));
+
+ if (iCoeEnv && iEikonEnv->EikAppUi())
+ iEikonEnv->EikAppUi()->RemoveFromStack(this);
+}
+
+// -----------------------------------------------------------------------------
+// CMPDummyController::OfferKeyEventL
+// Absorbs all the key presses
+// -----------------------------------------------------------------------------
+//
+TKeyResponse CMPDummyController::OfferKeyEventL(
+ const TKeyEvent& /*aKeyEvent*/, TEventCode /*aType*/ )
+{
+ MPX_ENTER_EXIT(_L("CMPDummyController::OfferKeyEventL()"));
+ return EKeyWasConsumed;
+}
+
+// End of File