filedetails/filedetailsdialog/src/MPFileDetailsDialog.cpp
changeset 0 96612d01cf9f
child 1 6711b85517b7
equal deleted inserted replaced
-1:000000000000 0:96612d01cf9f
       
     1 /*
       
     2 * Copyright (c) 2002 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of the License "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:   Implementation of the CMPFileDetailsDialog.*
       
    15 */
       
    16 
       
    17 
       
    18 // Version : %version: 16 %
       
    19 
       
    20 // INCLUDE FILES
       
    21 #include <aknlists.h>
       
    22 #include <bautils.h>
       
    23 #include <StringLoader.h>
       
    24 #include <e32base.h>
       
    25 #include <utf.h>
       
    26 #include <mmf/common/mmferrors.h>
       
    27 #include <DRMHelper.h>
       
    28 #include <aknclearer.h>
       
    29 #include <e32math.h> //for size rounding
       
    30 
       
    31 #include <MPFileDetails.rsg>
       
    32 #include "mpxvideo_debug.h"
       
    33 
       
    34 #include <AiwServiceHandler.h>
       
    35 #include <AiwCdmaCommands.hrh>
       
    36 #include <featmgr.h>
       
    37 #include <data_caging_path_literals.hrh> // KDC_RESOURCE_FILES_DIR
       
    38 #include <centralrepository.h>
       
    39 #include "MediaPlayerVariant.hrh"
       
    40 #include <MetaDataUtility.h>
       
    41 #include <MetaDataFieldContainer.h>
       
    42 #include <caf/content.h>
       
    43 #include <Oma2Agent.h>
       
    44 
       
    45 #include "MediaPlayerPrivateCRKeys.h"
       
    46 #include "MPFileDetailsDialog.h"
       
    47 #include "mppopuplist.h"
       
    48 #include <mediarecognizer.h>
       
    49 #include <streaminglinkmodel.h>
       
    50 #include "MPFileDetails.h"
       
    51 #include "MediaPlayerDrmHelper.h"
       
    52 
       
    53 //
       
    54 //  Inline methods
       
    55 //
       
    56 #include "MPFileDetailsDialog.inl"
       
    57 
       
    58 //#include "MPAppConsts.h"
       
    59 
       
    60 #include <drmutility.h>
       
    61 
       
    62 #ifdef __WINDOWS_MEDIA
       
    63 #include <asxparser.h>
       
    64 #endif
       
    65 
       
    66 // CONSTANTS
       
    67 _LIT(KResourceFile,"z:MPFileDetails.rsc");
       
    68 
       
    69 const TInt KOneKilobyte = 1;
       
    70 const TInt KFileSizeOneKilobyte = 1024;
       
    71 const TInt KThousandNotKilobyte = 1000;
       
    72 const TInt KOneSecond(1000000);
       
    73 const TInt KOneHourInSeconds(3600);
       
    74 const TInt KMaxTimeLength = 36;
       
    75 const TInt KMaxFilePathLength = 2048;
       
    76 
       
    77 // For meta data
       
    78 _LIT( KMPTitle, "Title" );
       
    79 _LIT( KMPArtist, "Artist" );
       
    80 _LIT( KMPAuthor, "Author" );
       
    81 _LIT( KMPCopyright, "Copyright" );
       
    82 _LIT( KMPAbstract, "Abstract" );
       
    83 
       
    84 _LIT( KExt3gpp,     "3gp" );
       
    85 _LIT( KExtMp4,      "mp4" );
       
    86 _LIT( KExtM4a,      "m4a" );
       
    87 
       
    88 _LIT(KDetaMime3gpp,  "audio/3gpp");
       
    89 _LIT(KDetaMime3gpp2, "audio/3gpp2");
       
    90 _LIT(KDetaMimeMp4,   "audio/mp4");
       
    91 
       
    92 _LIT(KFormat,"MimeType");
       
    93 _LIT(KMPX,   "x");
       
    94 
       
    95 
       
    96 // ================= OTHER EXPORTED FUNCTIONS ==============
       
    97 
       
    98 // ============================ MEMBER FUNCTIONS ===============================
       
    99 
       
   100 // -----------------------------------------------------------------------------
       
   101 // CMPFileDetailsDialog::CMPFileDetailsDialog
       
   102 // C++ default constructor can NOT contain any code, that
       
   103 // might leave.
       
   104 // -----------------------------------------------------------------------------
       
   105 //
       
   106 CMPFileDetailsDialog::CMPFileDetailsDialog()
       
   107     : iResourceFileOffset(0)
       
   108     , iResult( KErrNone )
       
   109 {
       
   110     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::CMPFileDetailsDialog()"));
       
   111 }
       
   112 
       
   113 // -----------------------------------------------------------------------------
       
   114 // CMPFileDetailsDialog::ConstructL
       
   115 // Symbian 2nd phase constructor can leave.
       
   116 // -----------------------------------------------------------------------------
       
   117 //
       
   118 void CMPFileDetailsDialog::ConstructL()
       
   119 {
       
   120 
       
   121     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::ConstructL()"));
       
   122 
       
   123     LoadResourcesL();
       
   124     iListBox = new (ELeave) CAknDoublePopupMenuStyleListBox();
       
   125     iGenres = CCoeEnv::Static()->ReadDesCArrayResourceL( R_MP_GENRE_STRINGS );
       
   126 
       
   127 }
       
   128 
       
   129 // -----------------------------------------------------------------------------
       
   130 // CMPFileDetailsDialog::NewL
       
   131 // Two-phased constructor.
       
   132 // -----------------------------------------------------------------------------
       
   133 //
       
   134 EXPORT_C CMPFileDetailsDialog* CMPFileDetailsDialog::NewL()
       
   135 {
       
   136     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog* CMPFileDetailsDialog::NewL()"));
       
   137 
       
   138     CMPFileDetailsDialog* self = new( ELeave ) CMPFileDetailsDialog();
       
   139     CleanupStack::PushL( self );
       
   140     self->ConstructL();
       
   141     CleanupStack::Pop();
       
   142     return self;
       
   143 }
       
   144 
       
   145 // -----------------------------------------------------------------------------
       
   146 // CMPFileDetailsDialog::~CMPFileDetailsDialog
       
   147 // Destructor
       
   148 // -----------------------------------------------------------------------------
       
   149 //
       
   150 EXPORT_C CMPFileDetailsDialog::~CMPFileDetailsDialog()
       
   151 {
       
   152     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::~CMPFileDetailsDialog()"));
       
   153     if( iPopupList )
       
   154         {
       
   155         iPopupList->CancelPopup();
       
   156         }
       
   157 
       
   158     delete iListBox;
       
   159     delete iGenres;
       
   160     UnLoadResources();
       
   161 }
       
   162 
       
   163 // -----------------------------------------------------------------------------
       
   164 // CMPFileDetailsDialog::ExecuteLD
       
   165 // -----------------------------------------------------------------------------
       
   166 //
       
   167 EXPORT_C void CMPFileDetailsDialog::ExecuteLD(const TDesC& aFileName)
       
   168 {
       
   169     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::ExecuteLD()"));
       
   170 
       
   171     CleanupStack::PushL( this );
       
   172     CMPFileDetails* fileDetails = new (ELeave) CMPFileDetails();
       
   173     CleanupStack::PushL( fileDetails );
       
   174 
       
   175 	//
       
   176 	// Obtain file path first so it can be used later
       
   177 	//
       
   178     fileDetails->iFilePath = aFileName.AllocL();
       
   179 
       
   180 #ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
       
   181     RFile64 fileHandle;
       
   182 #else
       
   183     RFile fileHandle;
       
   184 #endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
       
   185     TUint fileMode = EFileShareReadersOrWriters | EFileStream | EFileRead;
       
   186     RFs fs = CEikonEnv::Static()->FsSession();
       
   187 
       
   188     User::LeaveIfError(fileHandle.Open(fs, aFileName, fileMode));
       
   189     CleanupClosePushL(fileHandle);
       
   190 
       
   191     DRM::CDrmUtility* drmUtil = DRM::CDrmUtility::NewLC();
       
   192 
       
   193     TRAP_IGNORE( fileDetails->iDrmProtected =
       
   194         drmUtil->IsProtectedL(fileHandle) );
       
   195 
       
   196     CleanupStack::PopAndDestroy(2); // fileHandle, drmUtil
       
   197 
       
   198     if ( fileDetails->iDrmProtected )
       
   199         {
       
   200         //
       
   201 		// All DRM rights are handled & displayed by DRM component.
       
   202         // MP only needs to display DCF header info (Title, Provider, Description).
       
   203         //
       
   204         FetchDCFHeaderDataL(aFileName, fileDetails);
       
   205         }
       
   206 
       
   207     // recognize file and get format
       
   208     CMediaRecognizer* recognizer = CMediaRecognizer::NewL();
       
   209     CleanupStack::PushL(recognizer);
       
   210     CMediaRecognizer::TMediaType mediaType =
       
   211                 recognizer->IdentifyMediaTypeL( aFileName, ETrue );
       
   212     // mime type not shown for playlists and ram files
       
   213     if ( mediaType != CMediaRecognizer::ELocalRamFile &&
       
   214          mediaType != CMediaRecognizer::ELocalAsxFile &&
       
   215          mediaType != CMediaRecognizer::ELocalAudioPlaylist )
       
   216         {
       
   217         fileDetails->iFormat = recognizer->MimeTypeL( aFileName ).AllocL();
       
   218         }
       
   219     CleanupStack::PopAndDestroy();  // recognizer
       
   220 
       
   221     // filename
       
   222     TParse parse;
       
   223     parse.Set(aFileName,NULL,NULL);
       
   224     fileDetails->iFileName = parse.Name().AllocL();
       
   225 
       
   226     switch (mediaType)
       
   227         {
       
   228         case CMediaRecognizer::ELocalVideoFile:
       
   229             {
       
   230 #ifdef SYMBIAN_BUILD_GCE
       
   231             CVideoPlayerUtility2* videoPlayer = CVideoPlayerUtility2::NewL(*this,
       
   232                 EMdaPriorityNormal,EMdaPriorityPreferenceNone );
       
   233 #else
       
   234             CMPDummyController* dummy = CMPDummyController::NewLC();
       
   235             TRect tmp;
       
   236             CVideoPlayerUtility* videoPlayer = CVideoPlayerUtility::NewL(*this,
       
   237                             EMdaPriorityNormal,EMdaPriorityPreferenceNone,
       
   238                             dummy->GetClientWsSession(),dummy->GetScreenDevice(),
       
   239                             dummy->GetClientWindow(),tmp,tmp);
       
   240 #endif // SYMBIAN_BUILD_GCE
       
   241             CleanupStack::PushL(videoPlayer);
       
   242             // open
       
   243             videoPlayer->OpenFileL(aFileName);
       
   244             // wait open to complete
       
   245             iWait.Start();
       
   246 
       
   247             if (iResult && iResult != KErrMMPartialPlayback)
       
   248                 {
       
   249 #ifdef SYMBIAN_BUILD_GCE
       
   250                 CleanupStack::PopAndDestroy(1); // videoPlayer
       
   251 #else
       
   252                 CleanupStack::PopAndDestroy(2); // dummy and videoPlayer
       
   253 #endif //SYMBIAN_BUILD_GCE
       
   254                 break;
       
   255                 }
       
   256             // prepare
       
   257             videoPlayer->Prepare();
       
   258             // wait prepare to complete
       
   259             iWait.Start();
       
   260 
       
   261             if (iResult && iResult != KErrMMPartialPlayback)
       
   262                 {
       
   263 #ifdef SYMBIAN_BUILD_GCE
       
   264                 CleanupStack::PopAndDestroy(1); // videoPlayer
       
   265 #else
       
   266                 CleanupStack::PopAndDestroy(2); // dummy and videoPlayer
       
   267 #endif //SYMBIAN_BUILD_GCE
       
   268                 break;
       
   269                 }
       
   270             // get video file details
       
   271             // duration
       
   272             fileDetails->iDurationInSeconds =
       
   273                     videoPlayer->DurationL().Int64() / KOneSecond;
       
   274             // resolution
       
   275             TSize size;
       
   276             videoPlayer->VideoFrameSizeL(size);
       
   277             fileDetails->iResolutionHeight = size.iHeight;
       
   278             fileDetails->iResolutionWidth = size.iWidth;
       
   279             // bitrate
       
   280             fileDetails->iBitrate = videoPlayer->VideoBitRateL() +
       
   281                                     videoPlayer->AudioBitRateL();
       
   282 
       
   283             // video track
       
   284             fileDetails->iVideoTrack = videoPlayer->VideoBitRateL();
       
   285 
       
   286             TPtrC8 videoFormat = videoPlayer->VideoFormatMimeType();
       
   287 
       
   288             delete fileDetails->iFormat;
       
   289             fileDetails->iFormat = NULL;
       
   290 
       
   291             if ( videoFormat.Length())
       
   292             {
       
   293                 HBufC* videoFormat16 = HBufC::NewLC(videoFormat.Length());
       
   294                 TPtr videoFormatDes16(videoFormat16->Des());
       
   295                 videoFormatDes16.Copy(videoFormat);
       
   296 
       
   297                 fileDetails->iFormat = videoFormatDes16.AllocL();
       
   298                 CleanupStack::PopAndDestroy();   //videoFormat16
       
   299             }
       
   300 
       
   301             // copyright & title & format
       
   302             TInt metaCount = videoPlayer->NumberOfMetaDataEntriesL();
       
   303             CMMFMetaDataEntry* metaData;
       
   304             for (TInt i = 0; i < metaCount; i++)
       
   305                 {
       
   306                 metaData = videoPlayer->MetaDataEntryL(i);
       
   307                 if (!metaData->Name().CompareF(KMPCopyright))
       
   308                     {
       
   309                     fileDetails->iCopyright = metaData->Value().AllocL();
       
   310                     }
       
   311                 else if (!metaData->Name().CompareF(KMPArtist) || !metaData->Name().Compare(KMPAuthor))
       
   312                     {
       
   313                     fileDetails->iArtist = metaData->Value().Alloc();
       
   314                     }
       
   315                 else if (!metaData->Name().CompareF(KMPTitle))
       
   316                     {
       
   317                     fileDetails->iTitle = metaData->Value().AllocL();
       
   318                     }
       
   319                 else if (!metaData->Name().CompareF(KMPAbstract))
       
   320                      {
       
   321                           fileDetails->iDescription = metaData->Value().AllocL();
       
   322                      }
       
   323                 else if (!(metaData->Name().CompareF(KFormat) || fileDetails->iFormat))
       
   324                      {
       
   325                           fileDetails->iFormat = metaData->Value().AllocL();
       
   326                      }
       
   327                 delete metaData;
       
   328                 }
       
   329 #ifdef SYMBIAN_BUILD_GCE
       
   330             CleanupStack::PopAndDestroy(1); // videoPlayer
       
   331 #else
       
   332             CleanupStack::PopAndDestroy(2); // dummy and videoPlayer
       
   333 #endif //SYMBIAN_BUILD_GCE
       
   334             }
       
   335             break;
       
   336         case CMediaRecognizer::ELocalRamFile:
       
   337             {
       
   338             // get first link
       
   339             CStreamingLinkModel* linkModel = CStreamingLinkModel::NewL();
       
   340             CleanupStack::PushL(linkModel);
       
   341             User::LeaveIfError(linkModel->OpenLinkFileL( aFileName, EFalse ));
       
   342             fileDetails->iUrl = HBufC::NewL(linkModel->MaxLinkLength());
       
   343             TPtr filePtr = fileDetails->iUrl->Des();
       
   344             TBool dummy;
       
   345             linkModel->GetNextLinkL(filePtr,dummy);
       
   346             CleanupStack::PopAndDestroy(); // linkModel
       
   347             }
       
   348             break;
       
   349         case CMediaRecognizer::ELocalAsxFile:
       
   350             {
       
   351 #ifdef __WINDOWS_MEDIA
       
   352 			CAsxParser* asxParser = NULL;
       
   353 			TRAPD(err, asxParser = CAsxParser::NewL( aFileName ));
       
   354 			CleanupStack::PushL( asxParser );
       
   355 
       
   356 			if ( !err && asxParser && asxParser->FileVersion() > 0 )
       
   357 				{
       
   358 				TUint asxUrlCount = 0;
       
   359 				TPtrC8 urlPtr;
       
   360 
       
   361 				asxParser->GetUrlCount(asxUrlCount);
       
   362 				if ( asxUrlCount )
       
   363 					{
       
   364 					// get first link
       
   365 					asxParser->GetUrl(1,urlPtr);
       
   366 					fileDetails->iUrl = HBufC::NewL(urlPtr.Length());
       
   367 					TPtr filePtr = fileDetails->iUrl->Des();
       
   368 					asxParser->PrintUrl(urlPtr,filePtr);
       
   369 					}
       
   370 				}
       
   371 			CleanupStack::PopAndDestroy();  // asxparser
       
   372 #endif
       
   373             }
       
   374             break;
       
   375         case CMediaRecognizer::ELocalAudioFile:
       
   376             {
       
   377             FetchMetaDataL( aFileName, fileDetails );
       
   378             }
       
   379             break;
       
   380         default:
       
   381             break;
       
   382         }
       
   383 
       
   384 
       
   385     if (mediaType != CMediaRecognizer::ELocalRamFile &&
       
   386 		mediaType != CMediaRecognizer::ELocalAsxFile )
       
   387         {
       
   388         RFs fs = CEikonEnv::Static()->FsSession();
       
   389 #ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
       
   390         RFile64 file; 
       
   391 #else
       
   392         RFile file;
       
   393 #endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
       
   394         TInt error = file.Open(fs, aFileName, EFileRead | EFileShareReadersOnly);
       
   395         if (error)
       
   396             {
       
   397             // Try different sharing method if the first one failed.
       
   398             error = file.Open(fs, aFileName, EFileRead | EFileShareAny);
       
   399             }
       
   400 
       
   401         if (!error)
       
   402             {
       
   403             // Set item size, ignore error code
       
   404             if (mediaType != CMediaRecognizer::ELocalAudioPlaylist)
       
   405                 {
       
   406                 file.Size(fileDetails->iSize);
       
   407                 }
       
   408             // Set modification date & time, ignore error code
       
   409             file.Modified(fileDetails->iTime);
       
   410             file.Close();
       
   411             }
       
   412         }
       
   413 
       
   414     // Show File Details in differend ExecuteLD
       
   415     ExecuteLD( fileDetails );
       
   416     CleanupStack::PopAndDestroy(); // fileDetails
       
   417     CleanupStack::Pop(); // this
       
   418 }
       
   419 
       
   420 // -----------------------------------------------------------------------------
       
   421 // CMPFileDetailsDialog::ExecuteLD
       
   422 // -----------------------------------------------------------------------------
       
   423 //
       
   424 EXPORT_C void CMPFileDetailsDialog::ExecuteLD(CMPFileDetails* aFileDetails)
       
   425 {
       
   426     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::ExecuteLD()"));
       
   427 
       
   428     if ( aFileDetails->iDrmProtected && aFileDetails->iFilePath )
       
   429     {
       
   430         // drm data
       
   431         FetchDrmDataL( *aFileDetails->iFilePath, aFileDetails );
       
   432     }
       
   433 
       
   434 
       
   435     if ( iPopupList )
       
   436     {
       
   437         iPopupList->CancelPopup();
       
   438         iPopupList = NULL;
       
   439     }
       
   440 
       
   441     //
       
   442     //  use Media Player's own PopupList, not Avkon's PopupList
       
   443     //
       
   444 #ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
       
   445     TInt64 size(0);
       
   446 #else
       
   447     TInt size(0);
       
   448 #endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
       
   449     TInt error(0);
       
   450     TInt handleExists(0);
       
   451     if (  aFileDetails->iDetailsFileHandle.SubSessionHandle() )
       
   452     {
       
   453         error = aFileDetails->iDetailsFileHandle.Size( size );
       
   454     }
       
   455 
       
   456     handleExists =(!error && size )? ETrue:EFalse;
       
   457 
       
   458     if( handleExists )
       
   459     {
       
   460         iPopupList = CMPPopupList::NewL( iListBox,
       
   461                                          aFileDetails->iDetailsFileHandle,
       
   462                                          aFileDetails->iDrmProtected,
       
   463                                          aFileDetails->iReadingDCFOnly );
       
   464     }
       
   465     else
       
   466     {
       
   467         //
       
   468         //  file path is not available when this ExecuteLD(aFileDetails) method is
       
   469         //	launched by MP Video View for streaming link. Hence, this value is set
       
   470         //  to Null in such case.
       
   471         //
       
   472         HBufC* temp = HBufC::NewL(KMaxFilePathLength);
       
   473         CleanupStack::PushL( temp );
       
   474         TPtr filePathPtr = temp->Des();
       
   475 
       
   476         if ( aFileDetails->iFilePath )
       
   477         {
       
   478             filePathPtr.Append( aFileDetails->iFilePath->Des() );
       
   479         }
       
   480         else
       
   481         {
       
   482             filePathPtr.Append( KNullDesC() );
       
   483         }
       
   484 
       
   485         //
       
   486         //  use Media Player's own PopupList, not Avkon's PopupList
       
   487         //
       
   488         iPopupList = CMPPopupList::NewL( iListBox,
       
   489                                      filePathPtr,
       
   490                                      aFileDetails->iDrmProtected,
       
   491                                      aFileDetails->iReadingDCFOnly );
       
   492 
       
   493         CleanupStack::PopAndDestroy( temp );
       
   494     }
       
   495 
       
   496     TRAPD( err,
       
   497     {
       
   498         iListBox->ConstructL(iPopupList, CEikListBox::EDisableHighlight );
       
   499         iListBox->ItemDrawer()->ColumnData()->EnableMarqueeL( ETrue );
       
   500 
       
   501         iListBox->CreateScrollBarFrameL(ETrue);
       
   502         iListBox->ScrollBarFrame()->
       
   503             SetScrollBarVisibilityL( CEikScrollBarFrame::EOff,
       
   504                                      CEikScrollBarFrame::EAuto );
       
   505 
       
   506         SetTitleL(iPopupList);
       
   507         FillListBoxL(aFileDetails);
       
   508 
       
   509         iPopupList->ExecuteLD();
       
   510         iPopupList = NULL;
       
   511     } );//TRAP
       
   512 
       
   513 	//explicitly cancel the Popup if it's not terminated properly
       
   514     if ( err && iPopupList )
       
   515     {
       
   516         iPopupList->CancelPopup();
       
   517         iPopupList = NULL;
       
   518     }
       
   519 
       
   520     delete this;
       
   521 }
       
   522 
       
   523 // -----------------------------------------------------------------------------
       
   524 // CMPFileDetailsDialog::UnLoadResourceFile
       
   525 // -----------------------------------------------------------------------------
       
   526 //
       
   527 void CMPFileDetailsDialog::UnLoadResources()
       
   528 {
       
   529     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::UnLoadResources()"));
       
   530 
       
   531     if (iResourceFileOffset > 0)
       
   532         {
       
   533         CCoeEnv::Static()->DeleteResourceFile(iResourceFileOffset);
       
   534         iResourceFileOffset = 0;
       
   535         }
       
   536 }
       
   537 // -----------------------------------------------------------------------------
       
   538 // CMPFileDetailsDialog::LoadResourceFileL
       
   539 // -----------------------------------------------------------------------------
       
   540 //
       
   541 void CMPFileDetailsDialog::LoadResourcesL()
       
   542 {
       
   543     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::LoadResourcesL()"));
       
   544 
       
   545     if (iResourceFileOffset == 0)
       
   546         {
       
   547         CCoeEnv* enviro = CCoeEnv::Static();
       
   548         TFileName resourceFile;
       
   549 
       
   550         //
       
   551         // Get the path & file name with the drive not specified
       
   552         //
       
   553         _LIT(KMPTempFile,"MPFileDetails.rsc");
       
   554         TParse parse;
       
   555         parse.Set(KMPTempFile, &KDC_APP_RESOURCE_DIR, NULL);
       
   556         TPtrC rscFile = parse.FullName();
       
   557 
       
   558         //
       
   559         // This is done to ensure upgraded file is used first.
       
   560         // If no upgraded file is found, default file in Z: drive will be used.
       
   561         //
       
   562         TFindFile find( CCoeEnv::Static()->FsSession() );
       
   563         TInt err = find.FindByDir( rscFile, KNullDesC );
       
   564         MPX_DEBUG(_L("CMPFileDetailsDialog::LoadResourcesL() : err(%d)"),err );
       
   565 
       
   566         if ( err )
       
   567         {
       
   568             parse.Set(KResourceFile, &KDC_APP_RESOURCE_DIR, NULL);
       
   569             TPtrC defaultRscFile = parse.FullName();
       
   570             resourceFile.Append( defaultRscFile );
       
   571             MPX_DEBUG(_L("CMPFileDetailsDialog::LoadResourcesL() : defaultRsc(%S)"),&resourceFile );
       
   572         }
       
   573         else
       
   574         {
       
   575             resourceFile.Append( find.File() );
       
   576             MPX_DEBUG(_L("CMPFileDetailsDialog::LoadResourcesL() : upgradeRsc(%S)"),&resourceFile );
       
   577         }
       
   578 
       
   579         BaflUtils::NearestLanguageFile( enviro->FsSession(), resourceFile );
       
   580         iResourceFileOffset = enviro->AddResourceFileL( resourceFile );
       
   581         }
       
   582 }
       
   583 
       
   584 // -----------------------------------------------------------------------------
       
   585 // CMPFileDetailsDialog::SetTitleL
       
   586 // -----------------------------------------------------------------------------
       
   587 //
       
   588 void CMPFileDetailsDialog::SetTitleL(CAknPopupList* aPopupList)
       
   589 {
       
   590     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::SetTitleL()"));
       
   591 
       
   592     HBufC* title = StringLoader::LoadLC(R_MP_FILE_DETAILS);
       
   593     aPopupList->SetTitleL(*title);
       
   594     CleanupStack::PopAndDestroy(); //title
       
   595 }
       
   596 
       
   597 // -----------------------------------------------------------------------------
       
   598 // CMPFileDetailsDialog::FillListBoxL
       
   599 // -----------------------------------------------------------------------------
       
   600 //
       
   601 void CMPFileDetailsDialog::FillListBoxL(CMPFileDetails* aFileDetails)
       
   602 {
       
   603     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::FillListBoxL()"));
       
   604 
       
   605     CDesCArray* itemArray =
       
   606         static_cast<CDesCArray*>( iListBox->Model()->ItemTextArray() );
       
   607 
       
   608     TBool drmProtected = aFileDetails->iDrmProtected;
       
   609 
       
   610     // re-evaluate drm protection
       
   611     // for playlists it may be inaccurate
       
   612     if ( ! drmProtected )
       
   613     {
       
   614         if ( aFileDetails->iDetailsFileHandle.SubSessionHandle() )
       
   615         {
       
   616             CContent* content = CContent::NewL( aFileDetails->iDetailsFileHandle );
       
   617             content->GetAttribute( EIsProtected, drmProtected );
       
   618             delete content;
       
   619         }
       
   620         else if (aFileDetails->iFilePath != NULL)
       
   621         {
       
   622             CContent* content = CContent::NewL( aFileDetails->iFilePath->Des() );
       
   623             content->GetAttribute( EIsProtected, drmProtected );
       
   624             delete content;
       
   625         }
       
   626 
       
   627         //
       
   628         // since 'aFileDetails->iDrmProtected' is EFalse earlier
       
   629         // and now it becomes ETrue after the re-evaluation,
       
   630         // the related softkeys need to be re-initalized here
       
   631         //
       
   632         if ( drmProtected )
       
   633         {
       
   634             iPopupList->ReConstructDrmSoftkeysL(drmProtected);
       
   635         }
       
   636     }
       
   637 
       
   638     // if content is drm protected, fetch the drm data
       
   639     if ( drmProtected && aFileDetails->iFilePath )
       
   640     {
       
   641 		FetchDrmDataL( *aFileDetails->iFilePath, aFileDetails );
       
   642     }
       
   643 
       
   644     if ( drmProtected && ! aFileDetails->iReadingDCFOnly )
       
   645     {
       
   646         //
       
   647         // All DRM rights & constraints are handled & displayed by DRM component.
       
   648         // So, MP only needs to display the Heading here.
       
   649         //
       
   650 
       
   651 		//
       
   652 		// According to UI Spec, DRM info is always the 1st entry of the Details dlg.
       
   653 		// The softkeys of the Details pop-up (CMPPopupList) are constructed based
       
   654         // on this info. Hence, if the order entry of DRM is changed, softkeys in
       
   655         // CMPPopupList need to be updated accordingly.
       
   656 		//
       
   657         DisplayDrmHeadingInfoL( itemArray );
       
   658     }
       
   659 
       
   660     MakeTitleItemL(itemArray,aFileDetails);
       
   661     MakeArtistItemL(itemArray,aFileDetails);
       
   662     MakeOriginalArtistItemL(itemArray,aFileDetails);
       
   663     MakeAlbumItemL(itemArray,aFileDetails);
       
   664     MakeAlbumTrackItemL(itemArray,aFileDetails);
       
   665     MakeGenreItemL(itemArray,aFileDetails);
       
   666     MakeComposerItemL(itemArray,aFileDetails);
       
   667     MakeProviderItemL(itemArray,aFileDetails);
       
   668     MakeFormatItemL(itemArray,aFileDetails);
       
   669     MakeResolutionItemL(itemArray,aFileDetails);
       
   670     MakeDurationItemL(itemArray,aFileDetails);
       
   671     MakeBitrateItemL(itemArray,aFileDetails);
       
   672     MakeSamplerateItemL(itemArray,aFileDetails);
       
   673     MakeSizeItemL(itemArray,aFileDetails);
       
   674     MakeDateItemL(itemArray,aFileDetails);
       
   675     MakeTimeItemL(itemArray,aFileDetails);
       
   676 
       
   677     if ( FeatureManager::FeatureSupported( KFeatureIdLightSurf ) )
       
   678     {
       
   679         MakeUploadStatusL( itemArray, aFileDetails );
       
   680     }
       
   681 
       
   682     MakeYearItemL(itemArray,aFileDetails);
       
   683     MakeDescriptionItemL(itemArray,aFileDetails);
       
   684     MakeCommentItemL(itemArray,aFileDetails);
       
   685     MakeUrlItemL(itemArray,aFileDetails);
       
   686     MakeAudioFileWebPageItemL(itemArray,aFileDetails);
       
   687     MakeCopyrightItemL(itemArray,aFileDetails);
       
   688 
       
   689     iListBox->HandleItemAdditionL();
       
   690     iListBox->SetCurrentItemIndex(0);
       
   691 }
       
   692 
       
   693 // -----------------------------------------------------------------------------
       
   694 // CMPFileDetailsDialog::AddItemToListBoxL
       
   695 // -----------------------------------------------------------------------------
       
   696 //
       
   697 void CMPFileDetailsDialog::AddItemToListBoxL(const TDesC& aHeading,
       
   698                                              const TDesC& aValue,
       
   699                                              CDesCArray* aItemArray)
       
   700 {
       
   701     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::AddItemToListBoxL()"));
       
   702 
       
   703     CDesCArrayFlat* items = new (ELeave) CDesCArrayFlat(2);
       
   704     CleanupStack::PushL(items);
       
   705     items->AppendL(aHeading); //First string (heading)
       
   706 
       
   707     //remove tabs from aValue
       
   708     HBufC* aValueBuf = aValue.AllocLC();
       
   709     TPtr aValuePtr = aValueBuf->Des();
       
   710 
       
   711     // remove EndOfString character
       
   712     if (aValuePtr.Length() > 0)
       
   713         {
       
   714         TChar c = aValuePtr[aValuePtr.Length()-1];
       
   715         if (c.Eos())
       
   716             {
       
   717             aValuePtr.Delete(aValuePtr.Length()-1,aValuePtr.Length());
       
   718             }
       
   719         }
       
   720 
       
   721     for( TInt i = 0; i < aValuePtr.Length(); i++ )
       
   722         {
       
   723         if( aValuePtr[i] == '\t' )
       
   724             {
       
   725             aValuePtr[i] = ' ';
       
   726             }
       
   727         }
       
   728     items->AppendL(aValuePtr);   //Second string (value)
       
   729     CleanupStack::PopAndDestroy( aValueBuf );  //aValueBuf
       
   730 
       
   731     HBufC* headingAndValue =
       
   732             StringLoader::LoadLC( R_MP_FILE_DETAILS_ROW_FORMAT, *items );
       
   733     aItemArray->AppendL(*headingAndValue);
       
   734     CleanupStack::PopAndDestroy(2); // items & headingAndValue
       
   735 }
       
   736 
       
   737 
       
   738 // -----------------------------------------------------------------------------
       
   739 // CMPFileDetailsDialog::MakeTitleItemL
       
   740 // -----------------------------------------------------------------------------
       
   741 //
       
   742 void CMPFileDetailsDialog::MakeTitleItemL( CDesCArray* aItemArray,
       
   743                                            CMPFileDetails* aFileDetails)
       
   744 {
       
   745     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeTitleItemL()"));
       
   746 
       
   747     if (aFileDetails->iTitle)
       
   748         {
       
   749         HBufC* heading = StringLoader::LoadLC(R_MP_FILE_TITLE_HEADING);
       
   750         AddItemToListBoxL(*heading,*aFileDetails->iTitle,aItemArray);
       
   751         CleanupStack::PopAndDestroy(); // heading
       
   752         return;
       
   753         }
       
   754 
       
   755     if (aFileDetails->iFileName)
       
   756         {
       
   757         HBufC* heading = StringLoader::LoadLC(R_MP_FILE_NAME_HEADING);
       
   758         AddItemToListBoxL(*heading,*aFileDetails->iFileName,aItemArray);
       
   759         CleanupStack::PopAndDestroy(); // heading
       
   760         }
       
   761 }
       
   762 
       
   763 
       
   764 // -----------------------------------------------------------------------------
       
   765 // CMPFileDetailsDialog::MakeUrlItemL
       
   766 // -----------------------------------------------------------------------------
       
   767 //
       
   768 void CMPFileDetailsDialog::MakeUrlItemL( CDesCArray* aItemArray,
       
   769                                          CMPFileDetails* aFileDetails)
       
   770 {
       
   771     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeUrlItemL()"));
       
   772 
       
   773     if (aFileDetails->iUrl)
       
   774         {
       
   775         HBufC* heading = StringLoader::LoadLC(R_MP_FILE_URL_HEADING);
       
   776         AddItemToListBoxL(*heading,*aFileDetails->iUrl,aItemArray);
       
   777         CleanupStack::PopAndDestroy(); // heading
       
   778         }
       
   779 }
       
   780 
       
   781 
       
   782 // -----------------------------------------------------------------------------
       
   783 // CMPFileDetailsDialog::MakeFormatItemL
       
   784 // -----------------------------------------------------------------------------
       
   785 //
       
   786 void CMPFileDetailsDialog::MakeFormatItemL(CDesCArray* aItemArray,
       
   787                                            CMPFileDetails* aFileDetails)
       
   788 {
       
   789     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeFormatItemL()"));
       
   790 
       
   791     if (aFileDetails->iFormat)
       
   792         {
       
   793         HBufC* heading = StringLoader::LoadLC(R_MP_FILE_FORMAT_HEADING);
       
   794         AddItemToListBoxL(*heading,*aFileDetails->iFormat,aItemArray);
       
   795         CleanupStack::PopAndDestroy(); // heading
       
   796         }
       
   797 }
       
   798 
       
   799 // -----------------------------------------------------------------------------
       
   800 // CMPFileDetailsDialog::MakeResolutionItemL
       
   801 // -----------------------------------------------------------------------------
       
   802 //
       
   803 void CMPFileDetailsDialog::MakeResolutionItemL(CDesCArray* aItemArray,
       
   804                                                CMPFileDetails* aFileDetails)
       
   805 {
       
   806     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeResolutionItemL()"));
       
   807 
       
   808     if (aFileDetails->iResolutionWidth && aFileDetails->iResolutionHeight)
       
   809         {
       
   810         HBufC* heading = StringLoader::LoadLC(R_MP_FILE_RESOLUTION_HEADING);
       
   811         CArrayFix<TInt>* items = new (ELeave) CArrayFixFlat<TInt>(2);
       
   812         CleanupStack::PushL(items);
       
   813         items->AppendL(aFileDetails->iResolutionWidth);
       
   814         items->AppendL(aFileDetails->iResolutionHeight);
       
   815         HBufC* value = StringLoader::LoadLC(R_MP_FILE_RESOLUTION,*items);
       
   816         TPtr text = value->Des();
       
   817         TInt index = text.FindC(KMPX);
       
   818         LanguageSpecificNumberConversion( text );
       
   819         text.Replace(index,1,KMPX);
       
   820         AddItemToListBoxL(*heading,*value,aItemArray);
       
   821         CleanupStack::PopAndDestroy(3); // heading,items,value
       
   822         }
       
   823 }
       
   824 
       
   825 // -----------------------------------------------------------------------------
       
   826 // CMPFileDetailsDialog::MakeDurationItemL
       
   827 // -----------------------------------------------------------------------------
       
   828 //
       
   829 void CMPFileDetailsDialog::MakeDurationItemL(CDesCArray* aItemArray,
       
   830                                              CMPFileDetails* aFileDetails)
       
   831 {
       
   832     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeDurationItemL()"));
       
   833 
       
   834     TInt64 duration = aFileDetails->iDurationInSeconds;
       
   835     if (duration > 0)
       
   836         {
       
   837         HBufC* dateFormatString;
       
   838         if (duration < KOneHourInSeconds)
       
   839             {
       
   840             // Read time format string from AVKON resource
       
   841             dateFormatString = StringLoader::LoadLC(R_QTN_TIME_DURAT_MIN_SEC);
       
   842             }
       
   843         else
       
   844             {
       
   845             // Read time format string from AVKON resource
       
   846             dateFormatString = StringLoader::LoadLC(R_QTN_TIME_DURAT_LONG);
       
   847             }
       
   848         TBuf<16> dur;
       
   849         TTime durTime = TTime(duration*KOneSecond);
       
   850         durTime.FormatL(dur, *dateFormatString);
       
   851         LanguageSpecificNumberConversion( dur );
       
   852         HBufC* heading = StringLoader::LoadLC(R_MP_FILE_DURATION_HEADING);
       
   853         AddItemToListBoxL(*heading,dur,aItemArray);
       
   854         CleanupStack::PopAndDestroy(2); // heading & dateFormatString
       
   855         }
       
   856 }
       
   857 
       
   858 // -----------------------------------------------------------------------------
       
   859 // CMPFileDetailsDialog::MakeBitrateItemL
       
   860 // -----------------------------------------------------------------------------
       
   861 //
       
   862 void CMPFileDetailsDialog::MakeBitrateItemL(CDesCArray* aItemArray,
       
   863                                             CMPFileDetails* aFileDetails)
       
   864 {
       
   865     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeBitrateItemL()"));
       
   866 
       
   867     if (aFileDetails->iBitrate > 0)
       
   868         {
       
   869         HBufC* heading = StringLoader::LoadLC(R_MP_FILE_BITRATE_HEADING);
       
   870         HBufC* value = StringLoader::LoadLC(
       
   871               R_MP_FILE_BITRATE,aFileDetails->iBitrate / KThousandNotKilobyte );
       
   872         TPtr text = value->Des();
       
   873         LanguageSpecificNumberConversion( text );
       
   874         AddItemToListBoxL(*heading,*value,aItemArray);
       
   875         CleanupStack::PopAndDestroy(2); // heading & value
       
   876         }
       
   877 }
       
   878 
       
   879 // -----------------------------------------------------------------------------
       
   880 // CMPFileDetailsDialog::MakeSamplerateItemL
       
   881 // -----------------------------------------------------------------------------
       
   882 //
       
   883 void CMPFileDetailsDialog::MakeSamplerateItemL(CDesCArray* aItemArray,
       
   884                                                CMPFileDetails* aFileDetails)
       
   885 {
       
   886     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeSamplerateItemL()"));
       
   887 
       
   888     if (aFileDetails->iSamplerate > 0)
       
   889         {
       
   890         HBufC* heading = StringLoader::LoadLC(R_MP_FILE_SAMPLERATE_HEADING);
       
   891         HBufC* value = StringLoader::LoadLC(
       
   892               R_MP_FILE_SAMPLERATE,aFileDetails->iSamplerate);
       
   893         TPtr text = value->Des();
       
   894         LanguageSpecificNumberConversion( text );
       
   895         AddItemToListBoxL(*heading,*value,aItemArray);
       
   896         CleanupStack::PopAndDestroy(2); // heading & value
       
   897         }
       
   898 }
       
   899 
       
   900 // -----------------------------------------------------------------------------
       
   901 // CMPFileDetailsDialog::MakeSizeItemL
       
   902 // -----------------------------------------------------------------------------
       
   903 //
       
   904 void CMPFileDetailsDialog::MakeSizeItemL(CDesCArray* aItemArray,
       
   905                                          CMPFileDetails* aFileDetails)
       
   906 {
       
   907     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeSizeItemL()"));
       
   908 
       
   909     if (aFileDetails->iSize)
       
   910     {
       
   911         TRealFormat format = TRealFormat(KMaxFileName,2);
       
   912         TBuf<KMaxFileName> sizeString;
       
   913         HBufC* value;
       
   914         HBufC* heading = StringLoader::LoadLC(R_MP_FILE_SIZE_HEADING);
       
   915         TReal size = aFileDetails->iSize;
       
   916         TReal truncsize;
       
   917         size = size/KFileSizeOneKilobyte;
       
   918         // Show kilobytes with 3 digits. If more digits needed,
       
   919         // show size in megabytes. Only round up if showing kB
       
   920         if ( size < KThousandNotKilobyte )
       
   921         {
       
   922             if (size > KOneKilobyte) // CR rounding only if size between 1kB and 1MB
       
   923             { // rounding for Gallery/Messaging display equivalency
       
   924                 const TReal tempsize = size; // need const
       
   925                 TInt err = Math::Int(truncsize, tempsize);
       
   926                 if (err == KErrNone) // need to catch error after convert to Tint
       
   927                 {
       
   928                     if ((size > truncsize) && (size < truncsize + 1))
       
   929                     {
       
   930                         size =  truncsize +1;
       
   931                     }
       
   932                 // else do nothing, size will be used
       
   933                 } // if conversion failed, keep it TReal
       
   934             }
       
   935             sizeString.Num(size,format);
       
   936             switch (sizeString.Length())
       
   937             {
       
   938                 case 6:
       
   939                     sizeString = sizeString.Left(3);
       
   940                     break;
       
   941                 case 5:
       
   942                     sizeString = sizeString.Left(4);
       
   943                     break;
       
   944                 default:
       
   945                     break;
       
   946             }
       
   947             value = StringLoader::LoadLC(R_MP_FILE_SIZE_KB,sizeString);
       
   948         }
       
   949         else
       
   950         {
       
   951             size = size/KFileSizeOneKilobyte;
       
   952             sizeString.Num(size,format);
       
   953             switch (sizeString.Length())
       
   954             {
       
   955                 case 6:
       
   956                     sizeString = sizeString.Left(3);
       
   957                     break;
       
   958                 case 5:
       
   959                     sizeString = sizeString.Left(4);
       
   960                     break;
       
   961                 default:
       
   962                     break;
       
   963             }
       
   964             value = StringLoader::LoadLC(R_MP_FILE_SIZE_MB,sizeString);
       
   965         }
       
   966         TPtr text = value->Des();
       
   967         LanguageSpecificNumberConversion( text );
       
   968         AddItemToListBoxL(*heading,*value,aItemArray);
       
   969         CleanupStack::PopAndDestroy(2); // heading & value
       
   970     }
       
   971 }
       
   972 
       
   973 // -----------------------------------------------------------------------------
       
   974 // CMPFileDetailsDialog::MakeDateItemL
       
   975 // -----------------------------------------------------------------------------
       
   976 //
       
   977 void CMPFileDetailsDialog::MakeDateItemL(CDesCArray* aItemArray,
       
   978                                          CMPFileDetails* aFileDetails)
       
   979 {
       
   980     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeDateItemL()"));
       
   981 
       
   982     if (aFileDetails->iTime > TTime(0))
       
   983         {
       
   984         HBufC* heading = StringLoader::LoadLC(R_MP_FILE_DATE_HEADING);
       
   985         HBufC* dateFormatString =
       
   986                 StringLoader::LoadLC( R_QTN_DATE_USUAL_WITH_ZERO );
       
   987         TBuf<KMaxTimeLength> date;
       
   988         TTime localDate = aFileDetails->iTime + User::UTCOffset();
       
   989         localDate.FormatL(date,*dateFormatString);
       
   990         LanguageSpecificNumberConversion( date );
       
   991         AddItemToListBoxL(*heading,date,aItemArray);
       
   992         CleanupStack::PopAndDestroy(2); // heading & dateFormatString
       
   993         }
       
   994 }
       
   995 
       
   996 // -----------------------------------------------------------------------------
       
   997 // CMPFileDetailsDialog::MakeTimeItemL
       
   998 // -----------------------------------------------------------------------------
       
   999 //
       
  1000 void CMPFileDetailsDialog::MakeTimeItemL(CDesCArray* aItemArray,
       
  1001                                          CMPFileDetails* aFileDetails)
       
  1002 {
       
  1003     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeTimeItemL()"));
       
  1004 
       
  1005     if (aFileDetails->iTime > TTime(0))
       
  1006         {
       
  1007         HBufC* heading = StringLoader::LoadLC( R_MP_FILE_TIME_HEADING );
       
  1008         HBufC* timeFormatString =
       
  1009                 StringLoader::LoadLC( R_QTN_TIME_USUAL_WITH_ZERO );
       
  1010         TBuf<32> time;
       
  1011         TTime localTime = aFileDetails->iTime + User::UTCOffset();
       
  1012         localTime.FormatL(time,*timeFormatString);
       
  1013         LanguageSpecificNumberConversion( time );
       
  1014         AddItemToListBoxL(*heading,time,aItemArray);
       
  1015         CleanupStack::PopAndDestroy(2); // heading & timeFormatString
       
  1016         }
       
  1017 }
       
  1018 
       
  1019 // -----------------------------------------------------------------------------
       
  1020 // CMPFileDetailsDialog::MakeUploadStatusL
       
  1021 // -----------------------------------------------------------------------------
       
  1022 //
       
  1023 
       
  1024 void CMPFileDetailsDialog::MakeUploadStatusL(CDesCArray* aItemArray,
       
  1025                                              CMPFileDetails* aFileDetails)
       
  1026 {
       
  1027     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeUploadStatusL()"));
       
  1028 
       
  1029     if(aFileDetails->iVideoTrack)
       
  1030         {
       
  1031         HBufC* heading = StringLoader::LoadLC( R_QTN_MP_FILE_UPLOAD_STATUS );
       
  1032 
       
  1033         CAiwServiceHandler* AIWServiceHandler = CAiwServiceHandler::NewLC();
       
  1034 
       
  1035         // AIW generic input param list
       
  1036         CAiwGenericParamList& mpBaseInputParamsList =
       
  1037                                 AIWServiceHandler->InParamListL();
       
  1038         // Aiw generic output param list
       
  1039         CAiwGenericParamList& mpBaseOutputParamsList =
       
  1040                                 AIWServiceHandler->OutParamListL();
       
  1041 
       
  1042         //assign the file name
       
  1043         TAiwVariant fileNameVariant( aFileDetails->iFileName );
       
  1044         TAiwGenericParam fileNameParam( EGenericParamFile, fileNameVariant );
       
  1045         mpBaseInputParamsList.AppendL( fileNameParam );  //file name
       
  1046 
       
  1047         // Execute the AIW service command
       
  1048         AIWServiceHandler->ExecuteServiceCmdL( KAIWCmdAmsExtendedLightSurfData,
       
  1049                                             mpBaseInputParamsList,
       
  1050                                             mpBaseOutputParamsList );
       
  1051 
       
  1052         HBufC* str;
       
  1053         str = StringLoader::LoadLC(R_QTN_MP_VIDEO_NOT_UPLOADED );
       
  1054         //if file is uploaded, then only provider will add the result
       
  1055         //to the output param list
       
  1056         if ( mpBaseOutputParamsList.Count() > 0)
       
  1057             {
       
  1058             TInt Index = 0;
       
  1059             //check for file type
       
  1060             const TAiwGenericParam* uploadParam =
       
  1061                             mpBaseOutputParamsList.FindFirst( Index,
       
  1062                 EGenericParamCharSet, EVariantTypeDesC );
       
  1063             if(uploadParam != NULL )
       
  1064                 {
       
  1065                 CleanupStack::PopAndDestroy();
       
  1066                 str = StringLoader::LoadLC(R_QTN_MP_VIDEO_UPLOADED );
       
  1067                 }
       
  1068             }
       
  1069 
       
  1070         AddItemToListBoxL(*heading,*str,aItemArray);
       
  1071         CleanupStack::PopAndDestroy(3); // heading, str & AIWServiceHandler
       
  1072         }
       
  1073 }
       
  1074 
       
  1075 // -----------------------------------------------------------------------------
       
  1076 // CMPFileDetailsDialog::MakeCopyrightItemL
       
  1077 // -----------------------------------------------------------------------------
       
  1078 //
       
  1079 void CMPFileDetailsDialog::MakeCopyrightItemL(CDesCArray* aItemArray,
       
  1080                                               CMPFileDetails* aFileDetails)
       
  1081 {
       
  1082     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeCopyrightItemL()"));
       
  1083 
       
  1084     if (aFileDetails->iCopyright)
       
  1085         {
       
  1086         HBufC* heading = StringLoader::LoadLC(R_MP_FILE_COPYRIGHT_HEADING);
       
  1087         TPtr text = aFileDetails->iCopyright->Des();
       
  1088         LanguageSpecificNumberConversion( text );
       
  1089         AddItemToListBoxL(*heading,*aFileDetails->iCopyright,aItemArray);
       
  1090         CleanupStack::PopAndDestroy(); // heading
       
  1091         }
       
  1092 }
       
  1093 
       
  1094 // -----------------------------------------------------------------------------
       
  1095 // CMPFileDetailsDialog::MakeOriginalArtistItemL
       
  1096 // -----------------------------------------------------------------------------
       
  1097 //
       
  1098 void CMPFileDetailsDialog::MakeOriginalArtistItemL(CDesCArray* aItemArray,
       
  1099                                                    CMPFileDetails* aFileDetails)
       
  1100 {
       
  1101     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeOriginalArtistItemL()"));
       
  1102 
       
  1103     if (aFileDetails->iOriginalArtist)
       
  1104         {
       
  1105         HBufC* heading = StringLoader::LoadLC(R_MP_FILE_ARTIST_ORIGINAL_HEADING);
       
  1106         TPtr text = aFileDetails->iOriginalArtist->Des();
       
  1107         LanguageSpecificNumberConversion( text );
       
  1108         AddItemToListBoxL(*heading,*aFileDetails->iOriginalArtist,aItemArray);
       
  1109         CleanupStack::PopAndDestroy(); // heading
       
  1110         }
       
  1111 }
       
  1112 
       
  1113 // -----------------------------------------------------------------------------
       
  1114 // CMPFileDetailsDialog::MakeAlbumTrackItemL
       
  1115 // -----------------------------------------------------------------------------
       
  1116 //
       
  1117 void CMPFileDetailsDialog::MakeAlbumTrackItemL(CDesCArray* aItemArray,
       
  1118                                                CMPFileDetails* aFileDetails)
       
  1119 {
       
  1120     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeAlbumTrackItemL()"));
       
  1121 
       
  1122     if (aFileDetails->iAlbumTrack)
       
  1123         {
       
  1124         HBufC* heading = StringLoader::LoadLC(R_MP_FILE_ALBUM_TRACK_HEADING);
       
  1125         TPtr text = aFileDetails->iAlbumTrack->Des();
       
  1126         LanguageSpecificNumberConversion( text );
       
  1127         AddItemToListBoxL(*heading,*aFileDetails->iAlbumTrack,aItemArray);
       
  1128         CleanupStack::PopAndDestroy(); // heading
       
  1129         }
       
  1130 }
       
  1131 
       
  1132 // -----------------------------------------------------------------------------
       
  1133 // CMPFileDetailsDialog::MakeGenreItemL
       
  1134 // -----------------------------------------------------------------------------
       
  1135 //
       
  1136 void CMPFileDetailsDialog::MakeGenreItemL(CDesCArray* aItemArray,
       
  1137                                           CMPFileDetails* aFileDetails)
       
  1138 {
       
  1139     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeGenreItemL()"));
       
  1140     if (aFileDetails->iGenre)
       
  1141         {
       
  1142         HBufC* heading = StringLoader::LoadLC(R_MP_FILE_GENRE_HEADING);
       
  1143         TPtr text = aFileDetails->iGenre->Des();
       
  1144 
       
  1145         LanguageSpecificNumberConversion( text );
       
  1146         AddItemToListBoxL(*heading,*aFileDetails->iGenre,aItemArray);
       
  1147 
       
  1148         CleanupStack::PopAndDestroy(); // heading
       
  1149         }
       
  1150 }
       
  1151 
       
  1152 // -----------------------------------------------------------------------------
       
  1153 // CMPFileDetailsDialog::MakeComposerItemL
       
  1154 // -----------------------------------------------------------------------------
       
  1155 //
       
  1156 void CMPFileDetailsDialog::MakeComposerItemL(CDesCArray* aItemArray,
       
  1157                                              CMPFileDetails* aFileDetails)
       
  1158 {
       
  1159     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeComposerItemL()"));
       
  1160 
       
  1161     if (aFileDetails->iComposer)
       
  1162         {
       
  1163         HBufC* heading = StringLoader::LoadLC(R_MP_FILE_COMPOSER_HEADING);
       
  1164         TPtr text = aFileDetails->iComposer->Des();
       
  1165         LanguageSpecificNumberConversion( text );
       
  1166         AddItemToListBoxL(*heading,*aFileDetails->iComposer,aItemArray);
       
  1167         CleanupStack::PopAndDestroy(); // heading
       
  1168         }
       
  1169 }
       
  1170 
       
  1171 // -----------------------------------------------------------------------------
       
  1172 // CMPFileDetailsDialog::MakeAudioFileWebPageItemL
       
  1173 // -----------------------------------------------------------------------------
       
  1174 //
       
  1175 void CMPFileDetailsDialog::MakeAudioFileWebPageItemL(
       
  1176         CDesCArray* aItemArray,
       
  1177         CMPFileDetails* aFileDetails )
       
  1178 {
       
  1179     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeAudioFileWebPageItemL()"));
       
  1180 
       
  1181     if (aFileDetails->iAudioFileWebPage)
       
  1182         {
       
  1183         HBufC* heading = StringLoader::LoadLC(R_MP_FILE_INFO_URL_HEADING);
       
  1184         TPtr text = aFileDetails->iAudioFileWebPage->Des();
       
  1185         LanguageSpecificNumberConversion( text );
       
  1186         AddItemToListBoxL(*heading,*aFileDetails->iAudioFileWebPage,aItemArray);
       
  1187         CleanupStack::PopAndDestroy(); // heading
       
  1188         }
       
  1189 }
       
  1190 
       
  1191 // -----------------------------------------------------------------------------
       
  1192 // CMPFileDetailsDialog::MakeCommentItemL
       
  1193 // -----------------------------------------------------------------------------
       
  1194 //
       
  1195 void CMPFileDetailsDialog::MakeCommentItemL(CDesCArray* aItemArray,
       
  1196                                             CMPFileDetails* aFileDetails)
       
  1197 {
       
  1198     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeCommentItemL()"));
       
  1199 
       
  1200     if (aFileDetails->iComment)
       
  1201         {
       
  1202         HBufC* heading = StringLoader::LoadLC(R_MP_FILE_COMMENT_HEADING);
       
  1203         TPtr text = aFileDetails->iComment->Des();
       
  1204         LanguageSpecificNumberConversion( text );
       
  1205         AddItemToListBoxL(*heading,*aFileDetails->iComment,aItemArray);
       
  1206         CleanupStack::PopAndDestroy(); // heading
       
  1207         }
       
  1208 }
       
  1209 
       
  1210 // -----------------------------------------------------------------------------
       
  1211 // CMPFileDetailsDialog::MakeArtistItemL
       
  1212 // -----------------------------------------------------------------------------
       
  1213 //
       
  1214 void CMPFileDetailsDialog::MakeArtistItemL(CDesCArray* aItemArray,
       
  1215                                            CMPFileDetails* aFileDetails)
       
  1216 {
       
  1217     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeArtistItemL()"));
       
  1218 
       
  1219     if (aFileDetails->iArtist)
       
  1220         {
       
  1221         HBufC* heading = StringLoader::LoadLC(R_MP_FILE_ARTIST_HEADING);
       
  1222         AddItemToListBoxL(*heading,*aFileDetails->iArtist,aItemArray);
       
  1223         CleanupStack::PopAndDestroy(); // heading
       
  1224         }
       
  1225 }
       
  1226 
       
  1227 // -----------------------------------------------------------------------------
       
  1228 // CMPFileDetailsDialog::MakeAlbumItemL
       
  1229 // -----------------------------------------------------------------------------
       
  1230 //
       
  1231 void CMPFileDetailsDialog::MakeAlbumItemL(CDesCArray* aItemArray,
       
  1232                                           CMPFileDetails* aFileDetails)
       
  1233 {
       
  1234     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeAlbumItemL()"));
       
  1235 
       
  1236     if (aFileDetails->iAlbum)
       
  1237         {
       
  1238         HBufC* heading = StringLoader::LoadLC(R_MP_FILE_ALBUM_HEADING);
       
  1239         AddItemToListBoxL(*heading,*aFileDetails->iAlbum,aItemArray);
       
  1240         CleanupStack::PopAndDestroy(); // heading
       
  1241         }
       
  1242 }
       
  1243 
       
  1244 // -----------------------------------------------------------------------------
       
  1245 // CMPFileDetailsDialog::MakeYearItemL
       
  1246 // -----------------------------------------------------------------------------
       
  1247 //
       
  1248 void CMPFileDetailsDialog::MakeYearItemL(CDesCArray* aItemArray,
       
  1249                                          CMPFileDetails* aFileDetails)
       
  1250 {
       
  1251     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeYearItemL()"));
       
  1252 
       
  1253     if (aFileDetails->iYear)
       
  1254         {
       
  1255         HBufC* heading = StringLoader::LoadLC(R_MP_FILE_YEAR_HEADING);
       
  1256         TPtr text = aFileDetails->iYear->Des();
       
  1257         LanguageSpecificNumberConversion( text );
       
  1258         AddItemToListBoxL(*heading,*aFileDetails->iYear,aItemArray);
       
  1259         CleanupStack::PopAndDestroy(); // heading
       
  1260         }
       
  1261 }
       
  1262 
       
  1263 
       
  1264 // -----------------------------------------------------------------------------
       
  1265 // CMPFileDetailsDialog::DisplayDrmHeadingInfoL
       
  1266 // -----------------------------------------------------------------------------
       
  1267 //
       
  1268 void CMPFileDetailsDialog::DisplayDrmHeadingInfoL(CDesCArray* aItemArray)
       
  1269 {
       
  1270     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::DisplayDrmHeadingInfoL()"));
       
  1271 
       
  1272     //
       
  1273     // All DRM rights & constraints are handled & displayed by DRM component.
       
  1274     // So, MP only needs to display the Heading here.
       
  1275     //
       
  1276 
       
  1277 	//
       
  1278 	// License
       
  1279 	//   For details click 'View'
       
  1280 	//
       
  1281     HBufC* heading = StringLoader::LoadLC(R_QTN_MP_DRM_LICENSE_HEADING);
       
  1282     HBufC* value = StringLoader::LoadLC(R_QTN_MP_DRM_DETAILS_VIEW);
       
  1283     AddItemToListBoxL(*heading,*value,aItemArray);
       
  1284     CleanupStack::PopAndDestroy(2); // heading && value
       
  1285 }
       
  1286 
       
  1287 
       
  1288 // -----------------------------------------------------------------------------
       
  1289 // CMPFileDetailsDialog::LanguageSpecificNumberConversion
       
  1290 // -----------------------------------------------------------------------------
       
  1291 //
       
  1292 void CMPFileDetailsDialog::LanguageSpecificNumberConversion( TDes& aText ) const
       
  1293 {
       
  1294     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::LanguageSpecificNumberConversion()"));
       
  1295 
       
  1296     if ( AknTextUtils::DigitModeQuery( AknTextUtils::EDigitModeShownToUser ) )
       
  1297         {
       
  1298         AknTextUtils::DisplayTextLanguageSpecificNumberConversion( aText );
       
  1299         }
       
  1300 }
       
  1301 
       
  1302 // Dummy implementations for audio callback
       
  1303 
       
  1304 // -----------------------------------------------------------------------------
       
  1305 // CMPFileDetailsDialog::MapcInitComplete
       
  1306 // -----------------------------------------------------------------------------
       
  1307 //
       
  1308 void CMPFileDetailsDialog::MapcInitComplete(
       
  1309         TInt aError,
       
  1310         const TTimeIntervalMicroSeconds& /*aDuration*/)
       
  1311 {
       
  1312     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MapcInitComplete()"));
       
  1313 
       
  1314     // Open completed, resume ExecuteLD(const TDesC& aFileName)
       
  1315     iResult = aError;
       
  1316     if ( iWait.IsStarted() )
       
  1317         {
       
  1318         iWait.AsyncStop();
       
  1319         }
       
  1320 }
       
  1321 
       
  1322 // -----------------------------------------------------------------------------
       
  1323 // CMPFileDetailsDialog::MapcPlayComplete
       
  1324 // -----------------------------------------------------------------------------
       
  1325 //
       
  1326 void CMPFileDetailsDialog::MapcPlayComplete(TInt /*aError*/)
       
  1327 {
       
  1328     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MapcPlayComplete()"));
       
  1329 }
       
  1330 
       
  1331 
       
  1332 // Dummy implementations for video callback
       
  1333 
       
  1334 // -----------------------------------------------------------------------------
       
  1335 // CMPFileDetailsDialog::MvpuoOpenComplete
       
  1336 // -----------------------------------------------------------------------------
       
  1337 //
       
  1338 void CMPFileDetailsDialog::MvpuoOpenComplete(TInt aError)
       
  1339 {
       
  1340     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MvpuoOpenComplete()"));
       
  1341 
       
  1342     // Open completed, resume ExecuteLD(const TDesC& aFileName)
       
  1343     iResult = aError;
       
  1344     if ( iWait.IsStarted() )
       
  1345         {
       
  1346         iWait.AsyncStop();
       
  1347         }
       
  1348 }
       
  1349 
       
  1350 // -----------------------------------------------------------------------------
       
  1351 // CMPFileDetailsDialog::MvpuoFrameReady
       
  1352 // -----------------------------------------------------------------------------
       
  1353 //
       
  1354 void CMPFileDetailsDialog::MvpuoFrameReady( CFbsBitmap& /*aFrame*/,
       
  1355                                             TInt /*aError*/ )
       
  1356 {
       
  1357     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MvpuoFrameReady()"));
       
  1358 }
       
  1359 
       
  1360 // -----------------------------------------------------------------------------
       
  1361 // CMPFileDetailsDialog::MvpuoPlayComplete
       
  1362 // -----------------------------------------------------------------------------
       
  1363 //
       
  1364 void CMPFileDetailsDialog::MvpuoPlayComplete(TInt /*aError*/)
       
  1365 {
       
  1366     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MvpuoPlayComplete()"));
       
  1367 }
       
  1368 
       
  1369 // -----------------------------------------------------------------------------
       
  1370 // CMPFileDetailsDialog::MvpuoPrepareComplete
       
  1371 // -----------------------------------------------------------------------------
       
  1372 //
       
  1373 void CMPFileDetailsDialog::MvpuoPrepareComplete(TInt aError)
       
  1374 {
       
  1375     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MvpuoPrepareComplete()"));
       
  1376 
       
  1377     // Prepare completed, resume ExecuteLD(const TDesC& aFileName)
       
  1378     iResult = aError;
       
  1379     if ( iWait.IsStarted() )
       
  1380         {
       
  1381         iWait.AsyncStop();
       
  1382         }
       
  1383 }
       
  1384 
       
  1385 // -----------------------------------------------------------------------------
       
  1386 // CMPFileDetailsDialog::MvpuoEvent
       
  1387 // -----------------------------------------------------------------------------
       
  1388 //
       
  1389 void CMPFileDetailsDialog::MvpuoEvent(const TMMFEvent& /*aEvent*/)
       
  1390 {
       
  1391     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MvpuoEvent()"));
       
  1392 }
       
  1393 
       
  1394 // -----------------------------------------------------------------------------
       
  1395 // CMPFileDetailsDialog::FetchMetaDataL
       
  1396 // -----------------------------------------------------------------------------
       
  1397 //
       
  1398 void CMPFileDetailsDialog::FetchMetaDataL( const TDesC& aFileName,
       
  1399                                            CMPFileDetails* aFileDetails )
       
  1400 {
       
  1401     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::FetchMetaDataL()"));
       
  1402 
       
  1403     CMdaAudioPlayerUtility* audioPlayer = CMdaAudioPlayerUtility::NewL(*this);
       
  1404     CleanupStack::PushL( audioPlayer );
       
  1405     // Open audio player with the file.
       
  1406     audioPlayer->OpenFileL( aFileName );
       
  1407     // Wait open to complete. Active Scheduler is resumed, when the player is
       
  1408     // initialized. See CMPFileDetailsDialog::MapcInitComplete.
       
  1409     iWait.Start();
       
  1410 
       
  1411     // iResult is updated according to error code in MapcInitComplete
       
  1412     if ( iResult )
       
  1413         {
       
  1414         // Get metadata
       
  1415         if( aFileDetails->iDrmProtected )
       
  1416             {
       
  1417             switch( aFileDetails->iDRMRightsStatus )
       
  1418                 {
       
  1419                 case EMediaPlayerFull:
       
  1420                 case EMediaPlayerRestricted:
       
  1421                 case KMediaPlayerWmdrmValid:
       
  1422                     {
       
  1423                     FetchAdditionalMetaDataL( aFileName, aFileDetails );
       
  1424                     break;
       
  1425                     }
       
  1426                 case EMediaPlayerMissing:
       
  1427                 case EMediaPlayerExpired:
       
  1428                 case EMediaPlayerPreview:
       
  1429                 case KMediaPlayerWmdrmExpired:
       
  1430                     {
       
  1431                     FetchDCFHeaderDataL( aFileName, aFileDetails );
       
  1432                     break;
       
  1433                     }
       
  1434                 default:
       
  1435                     {
       
  1436                     // nothing to do
       
  1437                     break;
       
  1438                     }
       
  1439                 }
       
  1440             }
       
  1441         else
       
  1442             {
       
  1443             FetchAdditionalMetaDataL( aFileName, aFileDetails );
       
  1444             }
       
  1445         CleanupStack::PopAndDestroy(); // audioPlayer
       
  1446         return;
       
  1447         }
       
  1448 
       
  1449     // get audio file details
       
  1450     aFileDetails->iDurationInSeconds =
       
  1451             audioPlayer->Duration().Int64() / KOneSecond;
       
  1452 
       
  1453     // Bitrate
       
  1454     TPckgBuf<TMMFAudioConfig> data;
       
  1455     const TMMFMessageDestinationPckg destinationPckg(
       
  1456             KUidInterfaceMMFAudioController );
       
  1457     TInt err = audioPlayer->CustomCommandSync( destinationPckg,
       
  1458                                            EMMFAudioControllerGetSourceBitRate,
       
  1459                                            KNullDesC8, KNullDesC8, data );
       
  1460     if ( !err )
       
  1461         {
       
  1462         aFileDetails->iBitrate = data().iSampleRate;
       
  1463         }
       
  1464 
       
  1465     // Samplerate
       
  1466     err = audioPlayer->CustomCommandSync( destinationPckg,
       
  1467                                         EMMFAudioControllerGetSourceSampleRate,
       
  1468                                         KNullDesC8, KNullDesC8, data );
       
  1469     if ( !err )
       
  1470         {
       
  1471         aFileDetails->iSamplerate = data().iSampleRate;
       
  1472         }
       
  1473 
       
  1474     CleanupStack::PopAndDestroy(); // audioPlayer
       
  1475 
       
  1476     // get metadata
       
  1477     FetchAdditionalMetaDataL( aFileName, aFileDetails );
       
  1478 }
       
  1479 
       
  1480 // -----------------------------------------------------------------------------
       
  1481 // CMPFileDetailsDialog::FetchDrmDataL
       
  1482 // -----------------------------------------------------------------------------
       
  1483 //
       
  1484 void CMPFileDetailsDialog::FetchDrmDataL( const TDesC& aFileName,
       
  1485                                           CMPFileDetails* aFileDetails )
       
  1486 {
       
  1487         MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::FetchDrmDataL()"));
       
  1488 
       
  1489     //
       
  1490     // Only 'aFileDetails->iDRMRightsStatus' is still needed to display additional meta data.
       
  1491     // Those additional meta data are obtained in FetchAdditionalMetaDataL() method.
       
  1492     // All other DRM related info (expire constraints, counts, valid from/until, etc.)
       
  1493     // are obtained and displayed by DRM Details component.
       
  1494     //
       
  1495     CDRMHelper* drmHelper = CDRMHelper::NewLC(*CCoeEnv::Static());
       
  1496     CMediaPlayerDrmHelper* mediaDrmHelper = CMediaPlayerDrmHelper::NewL(drmHelper);
       
  1497     CleanupStack::PushL(mediaDrmHelper);
       
  1498 
       
  1499 #ifdef SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
       
  1500     TInt64 size(0);
       
  1501 #else
       
  1502     TInt size(0);
       
  1503 #endif // SYMBIAN_ENABLE_64_BIT_FILE_SERVER_API
       
  1504     TInt err(0);
       
  1505 
       
  1506     if ( aFileDetails->iDetailsFileHandle.SubSessionHandle() )
       
  1507         err = aFileDetails->iDetailsFileHandle.Size( size );
       
  1508 
       
  1509     if (!err && size )
       
  1510         mediaDrmHelper->LoadDrmUsageRightsInfoL(aFileDetails->iDetailsFileHandle);
       
  1511     else
       
  1512         {
       
  1513         RFs fs = CEikonEnv::Static()->FsSession();
       
  1514         TInt error = aFileDetails->iDetailsFileHandle.Open(fs, aFileName, EFileRead | EFileShareReadersOnly);
       
  1515         if (error)
       
  1516             error = aFileDetails->iDetailsFileHandle.Open(fs, aFileName, EFileRead | EFileShareAny);
       
  1517 
       
  1518         if (!error)
       
  1519             mediaDrmHelper->LoadDrmUsageRightsInfoL(aFileDetails->iDetailsFileHandle);
       
  1520         else
       
  1521             mediaDrmHelper->LoadDrmUsageRightsInfoL(aFileName);
       
  1522         }
       
  1523 
       
  1524     mediaDrmHelper->GetDrmUsageRightsStatus(aFileDetails->iDRMRightsStatus);
       
  1525 
       
  1526     // cleanup
       
  1527     CleanupStack::PopAndDestroy(2); // drmHelper, mediaDrmHelper
       
  1528 }
       
  1529 
       
  1530 // -----------------------------------------------------------------------------
       
  1531 // CMPFileDetailsDialog::MakeProviderItemL
       
  1532 // -----------------------------------------------------------------------------
       
  1533 //
       
  1534 void CMPFileDetailsDialog::MakeProviderItemL( CDesCArray* aItemArray,
       
  1535                                               CMPFileDetails* aFileDetails )
       
  1536 {
       
  1537     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeProviderItemL()"));
       
  1538 
       
  1539     if (aFileDetails->iProvider)
       
  1540         {
       
  1541         HBufC* heading = StringLoader::LoadLC(R_MP_FILE_PROVIDER_HEADING);
       
  1542         AddItemToListBoxL(*heading,*aFileDetails->iProvider,aItemArray);
       
  1543         CleanupStack::PopAndDestroy(); // heading
       
  1544         }
       
  1545 }
       
  1546 
       
  1547 // -----------------------------------------------------------------------------
       
  1548 // CMPFileDetailsDialog::MakeDescriptionItemL
       
  1549 // -----------------------------------------------------------------------------
       
  1550 //
       
  1551 void CMPFileDetailsDialog::MakeDescriptionItemL( CDesCArray* aItemArray,
       
  1552                                                  CMPFileDetails* aFileDetails )
       
  1553 {
       
  1554     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::MakeDescriptionItemL()"));
       
  1555 
       
  1556     if (aFileDetails->iDescription)
       
  1557         {
       
  1558         HBufC* heading = StringLoader::LoadLC(R_MP_FILE_DESCRIPTION_HEADING);
       
  1559         AddItemToListBoxL(*heading,*aFileDetails->iDescription,aItemArray);
       
  1560         CleanupStack::PopAndDestroy(); // heading
       
  1561         }
       
  1562 }
       
  1563 
       
  1564 // -----------------------------------------------------------------------------
       
  1565 // CMPFileDetailsDialog::FetchAdditionalMetaDataL
       
  1566 // -----------------------------------------------------------------------------
       
  1567 //
       
  1568 void CMPFileDetailsDialog::FetchAdditionalMetaDataL( const TDesC& aFileName,
       
  1569                                                      CMPFileDetails* aFileDetails )
       
  1570 {
       
  1571     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::FetchAdditionalMetaDataL()"));
       
  1572 
       
  1573     CMetaDataUtility *metaDataUtility = CMetaDataUtility::NewL();
       
  1574     CleanupStack::PushL( metaDataUtility );
       
  1575     TRAPD( err, metaDataUtility->OpenFileL( aFileName ) );
       
  1576     if( err == KErrNone ) // leaves if file in use
       
  1577         {
       
  1578         TInt count = metaDataUtility->MetaDataCount();
       
  1579         for(TInt i = 0; i < count; i++)
       
  1580             {
       
  1581             TMetaDataFieldId fieldId;
       
  1582             TPtrC field = metaDataUtility->MetaDataFieldsL().At( i, fieldId );
       
  1583             if( field != KNullDesC )
       
  1584                 {
       
  1585                 switch( fieldId )
       
  1586                     {
       
  1587                     case EMetaDataSongTitle:
       
  1588                         {
       
  1589                         SetFileDetailL( aFileDetails->iTitle, field );
       
  1590                         break;
       
  1591                         }
       
  1592                     case EMetaDataArtist:
       
  1593                         {
       
  1594                         SetFileDetailL( aFileDetails->iArtist, field );
       
  1595                         break;
       
  1596                         }
       
  1597                     case EMetaDataAlbum:
       
  1598                         {
       
  1599                         SetFileDetailL( aFileDetails->iAlbum, field );
       
  1600                         break;
       
  1601                         }
       
  1602                     case EMetaDataYear:
       
  1603                         {
       
  1604                         SetFileDetailL( aFileDetails->iYear, field );
       
  1605                         break;
       
  1606                         }
       
  1607                     case EMetaDataCopyright:
       
  1608                         {
       
  1609                         SetFileDetailL( aFileDetails->iCopyright, field );
       
  1610                         break;
       
  1611                         }
       
  1612                     case EMetaDataOriginalArtist:
       
  1613                         {
       
  1614                         SetFileDetailL( aFileDetails->iOriginalArtist, field );
       
  1615                         break;
       
  1616                         }
       
  1617                     case EMetaDataAlbumTrack:
       
  1618                         {
       
  1619                         SetFileDetailL( aFileDetails->iAlbumTrack, field );
       
  1620                         break;
       
  1621                         }
       
  1622                     case EMetaDataGenre:
       
  1623                         {
       
  1624                         SetFileDetailL( aFileDetails->iGenre, field );
       
  1625                         break;
       
  1626                         }
       
  1627                     case EMetaDataComposer:
       
  1628                         {
       
  1629                         SetFileDetailL( aFileDetails->iComposer, field );
       
  1630                         break;
       
  1631                         }
       
  1632                     case EMetaDataUserUrl:
       
  1633                     case EMetaDataUrl:     // (L616) fallthrough
       
  1634                         {
       
  1635                         SetFileDetailL( aFileDetails->iAudioFileWebPage, field );
       
  1636                         break;
       
  1637                         }
       
  1638                     case EMetaDataComment:
       
  1639                         {
       
  1640                         SetFileDetailL( aFileDetails->iComment, field );
       
  1641                         break;
       
  1642                         }
       
  1643                     default:
       
  1644                         {
       
  1645                         // nothing to do
       
  1646                         break;
       
  1647                         }
       
  1648                     }
       
  1649                 }
       
  1650             }
       
  1651         }
       
  1652     CleanupStack::PopAndDestroy(); // metaDataUtility
       
  1653 }
       
  1654 
       
  1655 // -----------------------------------------------------------------------------
       
  1656 // CMPFileDetailsDialog::FetchDCFHeaderDataL
       
  1657 // -----------------------------------------------------------------------------
       
  1658 //
       
  1659 void CMPFileDetailsDialog::FetchDCFHeaderDataL( const TDesC& aFileName,
       
  1660                                                 CMPFileDetails* aFileDetails )
       
  1661 {
       
  1662     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::FetchDCFHeaderDataL()"));
       
  1663 
       
  1664     TBuf <256> headerValue;
       
  1665     TInt err( KErrNone );
       
  1666     CContent* content = CContent::NewLC( aFileName );
       
  1667 
       
  1668     // Content-Name
       
  1669     err = content->GetStringAttribute(ETitle, headerValue);
       
  1670     if( err == KErrNone )
       
  1671         {
       
  1672         SetFileDetailL( aFileDetails->iTitle, headerValue );
       
  1673         }
       
  1674 
       
  1675     // Content-Vendor
       
  1676     err = content->GetStringAttribute(EContentVendor, headerValue);
       
  1677     if( err == KErrNone )
       
  1678         {
       
  1679         SetFileDetailL( aFileDetails->iProvider, headerValue );
       
  1680         }
       
  1681 
       
  1682     // Content-Description
       
  1683     err = content->GetStringAttribute(EDescription, headerValue);
       
  1684     if( err == KErrNone )
       
  1685         {
       
  1686         SetFileDetailL( aFileDetails->iDescription, headerValue );
       
  1687         }
       
  1688 
       
  1689     // clean up
       
  1690     CleanupStack::PopAndDestroy(); // content
       
  1691 }
       
  1692 
       
  1693 // -----------------------------------------------------------------------------
       
  1694 // CMPFileDetailsDialog::Is3gpFile
       
  1695 // -----------------------------------------------------------------------------
       
  1696 //
       
  1697 TBool CMPFileDetailsDialog::Is3gpFile( const TDesC& aFileName,
       
  1698                                        CMPFileDetails* aFileDetails )
       
  1699 {
       
  1700     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::Is3gpFile()"));
       
  1701 
       
  1702     TBool retVal( EFalse );
       
  1703     // File extension
       
  1704     if( aFileName.FindF( KExt3gpp ) != KErrNotFound ||
       
  1705         aFileName.FindF( KExtMp4 )  != KErrNotFound ||
       
  1706         aFileName.FindF( KExtM4a )  != KErrNotFound )
       
  1707         {
       
  1708         retVal = ETrue;
       
  1709         }
       
  1710 
       
  1711     // Mimetype
       
  1712     if( !retVal && aFileDetails->iFormat )
       
  1713         {
       
  1714         TPtrC mime = aFileDetails->iFormat->Des();
       
  1715         if (mime == KDetaMime3gpp  ||
       
  1716             mime == KDetaMime3gpp2 ||
       
  1717             mime == KDetaMimeMp4)
       
  1718             {
       
  1719             retVal = ETrue;
       
  1720             }
       
  1721         }
       
  1722 
       
  1723     return retVal;
       
  1724 }
       
  1725 
       
  1726 // -----------------------------------------------------------------------------
       
  1727 // CMPFileDetailsDialog::SetFileDetailL
       
  1728 // -----------------------------------------------------------------------------
       
  1729 //
       
  1730 void CMPFileDetailsDialog::SetFileDetailL( HBufC*& aBuf, const TDesC& aDetail )
       
  1731 {
       
  1732     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::SetFileDetailL()"));
       
  1733 
       
  1734     if( !aBuf && aDetail.Length() )
       
  1735         {
       
  1736         aBuf = aDetail.AllocL();
       
  1737         }
       
  1738 }
       
  1739 
       
  1740 // -----------------------------------------------------------------------------
       
  1741 // CMPFileDetailsDialog::SetFileDetailL
       
  1742 // -----------------------------------------------------------------------------
       
  1743 //
       
  1744 void CMPFileDetailsDialog::SetFileDetailL( HBufC*& aBuf, const TDesC8& aDetail )
       
  1745 {
       
  1746     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::SetFileDetailL()"));
       
  1747 
       
  1748     if( !aBuf && aDetail.Length())
       
  1749         {
       
  1750         aBuf = HBufC::New( aDetail.Length() );
       
  1751         aBuf->Des().Copy( aDetail );
       
  1752         }
       
  1753 }
       
  1754 
       
  1755 // CMPFileDetailsDialog::Close
       
  1756 // -----------------------------------------------------------------------------
       
  1757 //
       
  1758 EXPORT_C void CMPFileDetailsDialog::Close()
       
  1759 {
       
  1760     MPX_ENTER_EXIT(_L("CMPFileDetailsDialog::Close()"));
       
  1761 
       
  1762     if ( iPopupList )
       
  1763     {
       
  1764        iPopupList->CancelPopup();
       
  1765     }
       
  1766 }
       
  1767 
       
  1768 // ============================ CMPDummyController ============================
       
  1769 
       
  1770 // -----------------------------------------------------------------------------
       
  1771 // CMPDummyController::CMPDummyController
       
  1772 // C++ default constructor can NOT contain any code, that
       
  1773 // might leave.
       
  1774 // -----------------------------------------------------------------------------
       
  1775 //
       
  1776 CMPDummyController::CMPDummyController()
       
  1777 {
       
  1778     MPX_ENTER_EXIT(_L("CMPDummyController::CMPDummyController()"));
       
  1779 }
       
  1780 
       
  1781 // -----------------------------------------------------------------------------
       
  1782 // CMPFileDetailsDialog::ConstructL
       
  1783 // Symbian 2nd phase constructor can leave.
       
  1784 // -----------------------------------------------------------------------------
       
  1785 //
       
  1786 void CMPDummyController::ConstructL()
       
  1787 {
       
  1788     MPX_ENTER_EXIT(_L("CMPDummyController::ConstructL()"));
       
  1789 
       
  1790     CreateWindowL();
       
  1791     SetExtent(TPoint(), TSize());
       
  1792     ActivateL();
       
  1793     SetPointerCapture(ETrue);
       
  1794     ClaimPointerGrab(ETrue);
       
  1795 }
       
  1796 
       
  1797 // -----------------------------------------------------------------------------
       
  1798 // CMPDummyController::NewLC()
       
  1799 // Two-phased constructor.
       
  1800 // -----------------------------------------------------------------------------
       
  1801 //
       
  1802 CMPDummyController* CMPDummyController::NewLC()
       
  1803 {
       
  1804     MPX_ENTER_EXIT(_L("CMPDummyController::NewLC()"));
       
  1805 
       
  1806     CMPDummyController* self= new (ELeave) CMPDummyController();
       
  1807     CleanupStack::PushL(self);
       
  1808     self->ConstructL();
       
  1809     return self;
       
  1810 }
       
  1811 
       
  1812 // -----------------------------------------------------------------------------
       
  1813 // CMPDummyController::~CMPDummyController
       
  1814 // Destructor
       
  1815 // -----------------------------------------------------------------------------
       
  1816 //
       
  1817 CMPDummyController::~CMPDummyController()
       
  1818 {
       
  1819     MPX_ENTER_EXIT(_L("CMPDummyController::~CMPDummyController()"));
       
  1820 
       
  1821     if (iCoeEnv && iEikonEnv->EikAppUi())
       
  1822         iEikonEnv->EikAppUi()->RemoveFromStack(this);
       
  1823 }
       
  1824 
       
  1825 // -----------------------------------------------------------------------------
       
  1826 // CMPDummyController::OfferKeyEventL
       
  1827 // Absorbs all the key presses
       
  1828 // -----------------------------------------------------------------------------
       
  1829 //
       
  1830 TKeyResponse CMPDummyController::OfferKeyEventL(
       
  1831         const TKeyEvent& /*aKeyEvent*/, TEventCode /*aType*/ )
       
  1832 {
       
  1833     MPX_ENTER_EXIT(_L("CMPDummyController::OfferKeyEventL()"));
       
  1834     return EKeyWasConsumed;
       
  1835 }
       
  1836 
       
  1837 //  End of File