phonebookui/Phonebook2/CommonUI/src/CPbk2DrmManager.cpp
changeset 0 e686773b3f54
child 68 9da50d567e3c
equal deleted inserted replaced
-1:000000000000 0:e686773b3f54
       
     1 /*
       
     2 * Copyright (c) 2002-2007 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 "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: 
       
    15 *           Phonebook 2 DRM manager.
       
    16 *
       
    17 */
       
    18 
       
    19 
       
    20 // INCLUDE FILES
       
    21 #include "CPbk2DrmManager.h"
       
    22 
       
    23 // Phonebook 2
       
    24 #include <Pbk2CommonUi.rsg>
       
    25 
       
    26 // System includes
       
    27 #include <featmgr.h>
       
    28 #include <DRMCommon.h>
       
    29 #include <StringLoader.h>
       
    30 #include <aknnotewrappers.h>
       
    31 #include <apgcli.h>                     // RApaLsSession
       
    32 #include <musicplayerdomaincrkeys.h>    // KCRUidMusicPlayerFeatures
       
    33 #include <centralrepository.h>
       
    34 #include <DRMHelper.h>
       
    35 #include <coemain.h>
       
    36 
       
    37 #ifdef RD_DRM_COMMON_INTERFACE_FOR_OMA_AND_WMDRM
       
    38 #include <drmutility.h>
       
    39 #include <drmagents.h>
       
    40 #endif
       
    41 
       
    42 /// Unnamed namespace for local definitions
       
    43 namespace {
       
    44 
       
    45 _LIT(KSpaceTxt, " ");
       
    46 
       
    47 } /// namespace
       
    48 
       
    49 // --------------------------------------------------------------------------
       
    50 // CPbk2DrmManager::CPbk2DrmManager
       
    51 // --------------------------------------------------------------------------
       
    52 //
       
    53 CPbk2DrmManager::CPbk2DrmManager() :
       
    54         iDrmEnabled( EFalse )
       
    55     {
       
    56     }
       
    57 
       
    58 // --------------------------------------------------------------------------
       
    59 // CPbk2DrmManager::~CPbk2DrmManager
       
    60 // --------------------------------------------------------------------------
       
    61 //
       
    62 EXPORT_C CPbk2DrmManager::~CPbk2DrmManager()
       
    63     {
       
    64     if ( iDrmClient )
       
    65         {
       
    66         iDrmClient->Disconnect();
       
    67         }
       
    68     delete iDrmClient;
       
    69     delete iDrmHelper;
       
    70     delete iMusicPlayerFeatures;
       
    71     
       
    72     FeatureManager::UnInitializeLib();
       
    73     }
       
    74 
       
    75 // --------------------------------------------------------------------------
       
    76 // CPbk2DrmManager::NewL
       
    77 // --------------------------------------------------------------------------
       
    78 //
       
    79 EXPORT_C CPbk2DrmManager* CPbk2DrmManager::NewL()
       
    80     {
       
    81     CPbk2DrmManager* self = new ( ELeave ) CPbk2DrmManager;
       
    82     CleanupStack::PushL( self );
       
    83     self->ConstructL();
       
    84     CleanupStack::Pop( self );
       
    85     return self;
       
    86     }
       
    87 
       
    88 // --------------------------------------------------------------------------
       
    89 // CPbk2DrmManager::ConstructL
       
    90 // --------------------------------------------------------------------------
       
    91 //
       
    92 void CPbk2DrmManager::ConstructL()
       
    93     {
       
    94     // Sets up TLS, must be done before FeatureManager is used
       
    95     FeatureManager::InitializeLibL();
       
    96 
       
    97     iDrmHelper = CDRMHelper::NewL();
       
    98     iDrmClient = DRMCommon::NewL();
       
    99     if ( iDrmClient->Connect() == DRMCommon::EOk )
       
   100         {
       
   101         // If unable to connect, DRM protection is always on
       
   102         iDrmEnabled = ETrue;
       
   103         }
       
   104     
       
   105     iMusicPlayerFeatures = CRepository::NewLC( KCRUidMusicPlayerFeatures );
       
   106     CleanupStack::Pop(); // iMusicPlayerFeatures
       
   107     }
       
   108 
       
   109 #ifndef RD_DRM_COMMON_INTERFACE_FOR_OMA_AND_WMDRM
       
   110 
       
   111 // Some magic constants
       
   112 static const TInt KMinContentLength( 16 );
       
   113 _LIT8( KContentProtectionType, "DRM" );
       
   114 _LIT8( KASFHeaderObject, "75B22630668E11CFA6D900AA0062CE6C" );
       
   115 
       
   116 
       
   117 // -----------------------------------------------------------------------------
       
   118 // FormatGUID
       
   119 // -----------------------------------------------------------------------------
       
   120 //
       
   121 LOCAL_C void FormatGUID( TDes8& aGUID )
       
   122     {
       
   123     TBuf8<16> copyGUID( aGUID );
       
   124     TInt i;
       
   125     for( i = 0; i < 4; i++ )
       
   126         {
       
   127         copyGUID[i] = aGUID[3-i];
       
   128         }
       
   129     for( i = 4; i < 6; i++ )
       
   130         {
       
   131         copyGUID[i] = aGUID[9 - i];
       
   132         }
       
   133     for( i = 6; i < 8; i++ )
       
   134         {
       
   135         copyGUID[i] = aGUID[13 - i];
       
   136         }
       
   137     for( i = 8; i < 16 ; i++ )
       
   138         {
       
   139         copyGUID[i] = aGUID[i];
       
   140         }
       
   141     aGUID.Delete( 0, 32 );
       
   142     for( i = 0; i <16; i++ )
       
   143         {
       
   144         aGUID.AppendNumFixedWidthUC( copyGUID[i], EHex, 2 );
       
   145         }
       
   146     }
       
   147 
       
   148 // -----------------------------------------------------------------------------
       
   149 // ConvertToInt64
       
   150 // -----------------------------------------------------------------------------
       
   151 //
       
   152 LOCAL_C TInt64 ConvertToInt64( TDesC8& aDes )
       
   153     {
       
   154     TInt64 num = 0;
       
   155     TInt i;
       
   156     for( i = 7 ; i >= 0; i-- )
       
   157         {
       
   158         num <<= 8;
       
   159         num |= aDes[i];
       
   160         }
       
   161     return num;
       
   162     }
       
   163 
       
   164 
       
   165 // -----------------------------------------------------------------------------
       
   166 // IsProtectedWmDrmL
       
   167 // returns ETrue, if file is protected WMDRM file
       
   168 //         EFalse if file is not protected WMDRM file
       
   169 // Leaves with KErrUnderflow if file has too little data to decide
       
   170 //         whether WmDrm or not
       
   171 //         may also leave with other system wide error code
       
   172 // -----------------------------------------------------------------------------
       
   173 //
       
   174 LOCAL_C TBool IsProtectedWmDrmL( RFile& aFileHandle )
       
   175     {
       
   176     TInt r( KErrNone );
       
   177     HBufC8* buffer( NULL );
       
   178     TInt pos( 0 );
       
   179     RFile file;
       
   180     TBuf8< 32 > header;
       
   181 
       
   182     TInt64 headerSize( 0 );
       
   183     TBool isProtectedWmDrm( EFalse );
       
   184     TPtr8 headerPtr( NULL, 0 );
       
   185 
       
   186     // Leave if given handle is invalid
       
   187     if( !aFileHandle.SubSessionHandle() )
       
   188         {
       
   189         User::Leave( KErrBadHandle );
       
   190         }
       
   191 
       
   192     file.Duplicate( aFileHandle );
       
   193     CleanupClosePushL( file );
       
   194 
       
   195     User::LeaveIfError( file.Seek( ESeekStart, pos ) );
       
   196 
       
   197     // Check if the file is an ASF file
       
   198     // TODO: Check on runtime wether WM DRM is supporeted or not
       
   199     //       Take Implementation from DRM::CDrmUtility::GetDrmInfoL,
       
   200     //       which is not yet available
       
   201 
       
   202     User::LeaveIfError( file.Read( 0, header, KMinContentLength ) );
       
   203     if( header.Length() < KMinContentLength )
       
   204         {
       
   205         User::Leave( KErrUnderflow );
       
   206         }
       
   207 
       
   208     FormatGUID( header );
       
   209 
       
   210     if( header == KASFHeaderObject )
       
   211         {
       
   212         // It's ASF, check still whether it's WM DRM protected or not
       
   213         file.Read( header,8 );
       
   214         headerSize = ConvertToInt64( header );
       
   215         if( headerSize <= 30 )
       
   216             {
       
   217             User::Leave( KErrUnderflow );
       
   218             }
       
   219         if ( headerSize > KMaxTInt16 )
       
   220             {
       
   221             User::Leave( KErrOverflow );
       
   222             }
       
   223         buffer = HBufC8::NewLC( headerSize );
       
   224 
       
   225         headerPtr.Set( buffer->Des() );
       
   226         User::LeaveIfError( file.Read( headerPtr, headerSize - 24 ) );
       
   227 
       
   228         r = headerPtr.Find( KContentProtectionType );
       
   229         if ( KErrNotFound != r )
       
   230             {
       
   231             isProtectedWmDrm = ETrue;
       
   232             }
       
   233         CleanupStack::PopAndDestroy( buffer ); // buffer
       
   234         }
       
   235         CleanupStack::PopAndDestroy(); // file
       
   236 
       
   237     return isProtectedWmDrm;
       
   238     }
       
   239 
       
   240 #endif // RD_DRM_COMMON_INTERFACE_FOR_OMA_AND_WMDRM
       
   241 
       
   242 // -----------------------------------------------------------------------------
       
   243 // CPbk2DrmManager::IsFileWMDRMProtectedL
       
   244 // -----------------------------------------------------------------------------
       
   245 //
       
   246 TBool CPbk2DrmManager::IsFileWMDRMProtectedL( const TDesC& aFileName,
       
   247 											TBool& aIsProtected  ) const
       
   248 	{
       
   249 	TBool res = EFalse;
       
   250 	RFs& fsSession( CCoeEnv::Static()->FsSession() );
       
   251 	RFile hFile;
       
   252 
       
   253 	TInt err = hFile.Open( fsSession, aFileName, 
       
   254 						EFileRead | EFileStream | EFileShareReadersOnly );
       
   255 	if( err == KErrInUse )
       
   256 		{
       
   257 		err = hFile.Open( fsSession, aFileName, 
       
   258 						EFileRead | EFileStream | EFileShareAny );
       
   259 		}
       
   260 	if( err != KErrNone )
       
   261 		{
       
   262 		User::Leave( err );
       
   263 		}
       
   264 	CleanupClosePushL( hFile );
       
   265 
       
   266 #ifdef RD_DRM_COMMON_INTERFACE_FOR_OMA_AND_WMDRM
       
   267 	TPtrC agent( KNullDesC );
       
   268 	DRM::CDrmUtility* drmUtil( DRM::CDrmUtility::NewLC() );
       
   269 	drmUtil->GetAgentL( hFile, agent );
       
   270 	if( agent.Compare( DRM::KDrmWMAgentName ) == 0 )
       
   271 		{
       
   272 		res = ETrue;
       
   273 		}
       
   274 	else
       
   275 		{
       
   276 		res = iDrmClient->IsProtectedFile( aFileName, aIsProtected );	
       
   277 		}	
       
   278 	CleanupStack::PopAndDestroy( drmUtil );
       
   279 #else
       
   280 	res = IsProtectedWmDrmL( hFile );
       
   281 	aIsProtected = EFalse;
       
   282 #endif
       
   283 
       
   284 	CleanupStack::PopAndDestroy( &hFile );
       
   285 	return res;
       
   286 	}
       
   287 
       
   288 // --------------------------------------------------------------------------
       
   289 // CPbk2DrmManager::IsProtectedFile
       
   290 // --------------------------------------------------------------------------
       
   291 //
       
   292 
       
   293 EXPORT_C TInt CPbk2DrmManager::IsProtectedFile(
       
   294         const TDesC& aFileName,
       
   295         TBool& aIsProtected )
       
   296     {
       
   297     aIsProtected = ETrue;
       
   298         
       
   299     const TBool drmSupported =
       
   300         ( FeatureManager::FeatureSupported( KFeatureIdDrm )||
       
   301           FeatureManager::FeatureSupported( KFeatureIdDrmFull ) );
       
   302 
       
   303     TInt drmErrorCode( KErrNone );
       
   304     if ( !drmSupported )
       
   305         {
       
   306         // No DRM support, file retrieval always ok
       
   307         aIsProtected = EFalse;
       
   308         }
       
   309     else if ( iDrmEnabled )
       
   310         {
       
   311         // Check is the file protected
       
   312 		drmErrorCode = IsFileWMDRMProtectedL( aFileName,aIsProtected );
       
   313         }
       
   314     return drmErrorCode;
       
   315     }
       
   316 
       
   317 // --------------------------------------------------------------------------
       
   318 // CPbk2DrmManager::IsRingingToneForbidden
       
   319 // --------------------------------------------------------------------------
       
   320 //
       
   321 EXPORT_C TInt CPbk2DrmManager::IsRingingToneForbidden( 
       
   322         const TDesC& aFileName,
       
   323         TBool& aIsProtected )
       
   324     {
       
   325     aIsProtected = ETrue;
       
   326     TInt error( KErrNone );
       
   327     const TBool drmSupported =
       
   328         ( FeatureManager::FeatureSupported( KFeatureIdDrm ) ||
       
   329           FeatureManager::FeatureSupported( KFeatureIdDrmFull ) );
       
   330 
       
   331     if ( !drmSupported )
       
   332         {
       
   333         // No DRM support, file retrieval always ok
       
   334         aIsProtected = EFalse;
       
   335         }
       
   336     else
       
   337         {
       
   338         // DRM is enabled. File must be checked
       
   339         error = IsProtectedFile( aFileName, aIsProtected );
       
   340         if ( error == KErrNone )
       
   341             {
       
   342             if ( aIsProtected )
       
   343                 {
       
   344                 TRAP( error, CheckProtectedFileL( aFileName, aIsProtected ) );
       
   345                 }
       
   346             else
       
   347                 {
       
   348                 TRAP( error, CheckUnprotectedFileL( aFileName, aIsProtected ) );
       
   349                 }
       
   350             }
       
   351          else
       
   352          	{
       
   353          	error = 0;
       
   354          	TRAP_IGNORE( ShowErrorNoteL( R_QTN_PHOB_PROTECTED_TONE ) );
       
   355          	}           
       
   356         }
       
   357     return error;       
       
   358     }
       
   359 
       
   360 // --------------------------------------------------------------------------
       
   361 // CPbk2DrmManager::IsThumbnailForbidden
       
   362 // --------------------------------------------------------------------------
       
   363 //
       
   364 EXPORT_C TInt CPbk2DrmManager::IsThumbnailForbidden( 
       
   365         const TDesC& aFileName,
       
   366         TBool& aIsProtected )
       
   367     {
       
   368     aIsProtected = ETrue;
       
   369     TInt error = IsProtectedFile( aFileName, aIsProtected );
       
   370     
       
   371     // Thumbnails with any DRM protection are not allowed
       
   372     if ( error == KErrNone && aIsProtected )
       
   373         {
       
   374         TRAP_IGNORE( ShowErrorNoteL( R_PBK2_QTN_DRM_NOT_ALLOWED ) );
       
   375         }
       
   376     
       
   377     return error;
       
   378     }
       
   379 
       
   380 // --------------------------------------------------------------------------
       
   381 // CPbk2DrmManager::ShowErrorNoteL
       
   382 // --------------------------------------------------------------------------
       
   383 //
       
   384 void CPbk2DrmManager::ShowErrorNoteL( TInt aResource )
       
   385     {
       
   386     CEikonEnv* env = CEikonEnv::Static();
       
   387     HBufC* noteText = StringLoader::LoadLC( aResource, env );
       
   388 
       
   389     // DRM notifications are shown as waiting information notes
       
   390     CAknInformationNote* note = new ( ELeave ) CAknInformationNote( ETrue );
       
   391     note->ExecuteLD( *noteText );
       
   392 
       
   393     CleanupStack::PopAndDestroy( noteText ); //noteText
       
   394     }
       
   395 
       
   396 // --------------------------------------------------------------------------
       
   397 // CPbk2DrmManager::IsDrmRequiredForPlaybackL
       
   398 // --------------------------------------------------------------------------
       
   399 //
       
   400 TBool CPbk2DrmManager::IsDrmRequiredForPlaybackL()
       
   401     {
       
   402     // It is possible to disable support for non-DRM protected rich audio
       
   403     // formats    
       
   404     TInt value( 0 );
       
   405     User::LeaveIfError(
       
   406         iMusicPlayerFeatures->Get( KRequireDRMInPlayback, value ) );    
       
   407     return static_cast<TBool>( value );
       
   408     }
       
   409 
       
   410 // --------------------------------------------------------------------------
       
   411 // CPbk2DrmManager::IsBlockedMimeTypeL
       
   412 // --------------------------------------------------------------------------
       
   413 //
       
   414 TBool CPbk2DrmManager::IsBlockedMimeTypeL( const TDesC& aMimeType )
       
   415     {
       
   416     TBool ret = EFalse;    
       
   417     TBuf<1> tmp; // Magic: 1 char to get length of actual value
       
   418     TInt realLen = 0;
       
   419     TInt err = iMusicPlayerFeatures->Get(
       
   420         KPlaybackRestrictedMimeTypes, tmp, realLen );
       
   421     if ( err == KErrOverflow )
       
   422         {
       
   423         // Prepare list of blocked MIME types
       
   424         HBufC* listBuf = HBufC::NewLC( realLen + KSpaceTxt().Length() );
       
   425         TPtr list = listBuf->Des();
       
   426         User::LeaveIfError(
       
   427             iMusicPlayerFeatures->Get
       
   428                 ( KPlaybackRestrictedMimeTypes, list ) );
       
   429         list.Append( KSpaceTxt );
       
   430 
       
   431         // Prepare buffer for aMimeType
       
   432         HBufC* mimeBuf = HBufC::NewLC( aMimeType.Length() +
       
   433                                        KSpaceTxt().Length() );
       
   434         TPtr mime = mimeBuf->Des();
       
   435         mime = aMimeType;
       
   436         // FindF() would find "audio/3gpp" in "audio/3gpp2" without
       
   437         // the added space
       
   438         mime.Append( KSpaceTxt );
       
   439 
       
   440         // If result is not KErrNotFound, this MIME-type is indeed blocked
       
   441         ret = ( list.FindF( mime ) >= 0 );
       
   442 
       
   443         CleanupStack::PopAndDestroy(2); // listBuf, mimeBuf
       
   444         }
       
   445     else
       
   446         {
       
   447         User::LeaveIfError( err );
       
   448         }    
       
   449     return ret;
       
   450     }
       
   451 
       
   452 // --------------------------------------------------------------------------
       
   453 // CPbk2DrmManager::CheckProtectedFileL
       
   454 // --------------------------------------------------------------------------
       
   455 //
       
   456 void CPbk2DrmManager::CheckProtectedFileL( 
       
   457         const TDesC& aFileName,
       
   458         TBool& aProtected )
       
   459     {
       
   460     aProtected = ETrue;
       
   461     TBool automatedOk(EFalse);
       
   462 
       
   463     // Check that file can be set as automated content.
       
   464     TInt err = iDrmHelper->CanSetAutomated( aFileName, automatedOk );
       
   465     if ( err==KErrNone )
       
   466         {
       
   467         if ( !automatedOk )
       
   468             {
       
   469             ShowErrorNoteL(R_QTN_PHOB_DRM_PREV_RIGHTS_SET);
       
   470             }
       
   471         else
       
   472             {
       
   473             DRMCommon::TContentProtection protection;
       
   474             HBufC8* mimeType = NULL; // ignored
       
   475             HBufC8* contentUri = NULL;
       
   476             TUint dataLength; // ignored
       
   477             err = iDrmClient->GetFileInfo( 
       
   478                     aFileName, protection, mimeType, contentUri, dataLength );
       
   479             delete mimeType;
       
   480             mimeType = NULL;
       
   481             if( err )
       
   482                 {
       
   483                 delete contentUri;
       
   484                 User::Leave( err );
       
   485                 }
       
   486 
       
   487             CDRMRights* rights = NULL;
       
   488             err = iDrmClient->GetActiveRights( 
       
   489                     *contentUri, DRMCommon::EPlay, rights );
       
   490 
       
   491             switch ( err )
       
   492                 {
       
   493                 case CDRMRights::EFullRights: // Fall through
       
   494                 case CDRMRights::ERestrictedRights:
       
   495                     {
       
   496                     CDRMRights::TRestriction restriction; // ignore
       
   497                     CDRMRights::TExpiration expiration;
       
   498                     TUint32 constType;
       
   499 
       
   500                     // Ignore return value
       
   501                     rights->GetRightsInfo( 
       
   502                         DRMCommon::EPlay, restriction, expiration, constType );
       
   503 
       
   504                     // This is CFM protected file, ringingtone is set to "no"
       
   505                     if ( ( rights->GetPermission().iInfoBits & ENoRingingTone )
       
   506                         // This is normal DRM protected tone
       
   507                         || ( constType & ( CDRMRights::ECountBased |
       
   508                                            CDRMRights::ETimeIsAccumulatedTime ) ) )
       
   509                         {
       
   510                         ShowErrorNoteL( R_QTN_PHOB_DRM_PREV_RIGHTS_SET );
       
   511                         }
       
   512                     else
       
   513                         {
       
   514                         switch ( expiration )
       
   515                             {
       
   516                             case CDRMRights::EValidRights:
       
   517                                 {
       
   518                                 aProtected = EFalse;
       
   519                                 break;
       
   520                                 }
       
   521                             case CDRMRights::EFutureRights:
       
   522                                 {
       
   523                                 iDrmHelper->HandleErrorL( 
       
   524                                     DRMCommon::ENoRights, aFileName );
       
   525                                 break;
       
   526                                 }
       
   527                             case CDRMRights::EExpiredRights:
       
   528                                 {
       
   529                                 iDrmHelper->HandleErrorL( 
       
   530                                     DRMCommon::ERightsExpired, aFileName );
       
   531                                 break;
       
   532                                 }
       
   533                             default:
       
   534                                 {
       
   535                                 // Do nothing
       
   536                                 break;
       
   537                                 }
       
   538                             }
       
   539                         }
       
   540                     break;
       
   541                     }
       
   542                 case CDRMRights::EPreviewRights:
       
   543                     {
       
   544                     ShowErrorNoteL( R_QTN_PHOB_DRM_PREV_RIGHTS_SET );
       
   545                     break;
       
   546                     }
       
   547                 case DRMCommon::ENoRights:
       
   548                     {
       
   549                     iDrmHelper->HandleErrorL( DRMCommon::ENoRights, aFileName );
       
   550                     break;
       
   551                     }
       
   552                 default:
       
   553                     {
       
   554                     // Do nothing
       
   555                     break;
       
   556                     }
       
   557                 }
       
   558 
       
   559             delete rights;
       
   560             delete contentUri;
       
   561             }
       
   562         }
       
   563     else
       
   564         {
       
   565         // Locked file case is handled separately.
       
   566         if ( err==KErrInUse )
       
   567             {
       
   568             CCoeEnv::Static()->HandleError( KErrInUse );
       
   569             }
       
   570         else
       
   571             {
       
   572             // Leave if DrmHelper not handle the error
       
   573             User::LeaveIfError( iDrmHelper->HandleErrorL(err,aFileName) );
       
   574             }
       
   575         }
       
   576     }
       
   577 
       
   578 // --------------------------------------------------------------------------
       
   579 // CPbk2DrmManager::CheckUnprotectedFileL
       
   580 // --------------------------------------------------------------------------
       
   581 //
       
   582 void CPbk2DrmManager::CheckUnprotectedFileL( 
       
   583         const TDesC& aFileName, 
       
   584         TBool& aProtected )
       
   585     {
       
   586     aProtected = ETrue;    
       
   587     RApaLsSession apaLs;
       
   588     User::LeaveIfError( apaLs.Connect() );
       
   589     TUid appUidNotUsed = KNullUid;
       
   590     TDataType dataType;
       
   591     TInt err = apaLs.AppForDocument( aFileName, appUidNotUsed, dataType );
       
   592     apaLs.Close();
       
   593     User::LeaveIfError( err );
       
   594 
       
   595     // Check if this unprotected MIME type should be blocked
       
   596     if ( IsDrmRequiredForPlaybackL() &&
       
   597          IsBlockedMimeTypeL( dataType.Des() ) )
       
   598         {
       
   599         ShowErrorNoteL( R_QTN_PHOB_UNPROTECTED_TONE );
       
   600         }
       
   601     else
       
   602         {
       
   603         aProtected = EFalse;
       
   604         }
       
   605     }
       
   606 
       
   607 //  End of File