mobilemessaging/unieditor/model/src/UniDrmInfo.cpp
changeset 0 72b543305e3a
equal deleted inserted replaced
-1:000000000000 0:72b543305e3a
       
     1 /*
       
     2 * Copyright (c) 2006-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 *       CUniDrmInfo, Storage for single attachment in presentation. 
       
    16 *
       
    17 */
       
    18 
       
    19 
       
    20 
       
    21 // ========== INCLUDE FILES ================================
       
    22 
       
    23 #include <e32def.h>     // for basic types
       
    24 #include <eikenv.h>     // for CBase
       
    25 #include <coemain.h>    // for CEikonEnv
       
    26 #include <mtclbase.h>   // for CBaseMtm
       
    27 #include <msvids.h>     // for KMsvTempIndexEntryId
       
    28 #include <msvstore.h>
       
    29 #include <mmsvattachmentmanager.h>
       
    30 #include <mmsvattachmentmanagersync.h>
       
    31 #include <cmsvattachment.h>
       
    32 
       
    33 // Features
       
    34 #include <featmgr.h>    
       
    35 #include <bldvariant.hrh>
       
    36 
       
    37 // DRM
       
    38 #ifndef DRMCOMMONIN_POISTO
       
    39 #include <DRMCommon.h>
       
    40 #endif
       
    41 
       
    42 #include <DRMHelper.h>
       
    43 #include <fileprotectionresolver.h>
       
    44 
       
    45 #include <MsgMimeTypes.h>
       
    46 #include <MsgMediaInfo.h>
       
    47 #include <MsgTextInfo.h>
       
    48 
       
    49 #include "UniModelConst.h"
       
    50 #include "UniMimeInfo.h"
       
    51 #include "UniDrmInfo.h"
       
    52 #include "UniObject.h"
       
    53 #include "UniDataUtils.h"
       
    54 
       
    55 #include "UniEditorLogging.h"
       
    56 
       
    57 // ========== EXTERNAL DATA STRUCTURES =====================
       
    58 
       
    59 // ========== EXTERNAL FUNCTION PROTOTYPES =================
       
    60 
       
    61 // ========== CONSTANTS ====================================
       
    62 
       
    63 // ========== MACROS =======================================
       
    64 
       
    65 // ========== LOCAL CONSTANTS AND MACROS ===================
       
    66 
       
    67 // ========== MODULE DATA STRUCTURES =======================
       
    68 
       
    69 
       
    70 // ========== LOCAL FUNCTION PROTOTYPES ====================
       
    71 
       
    72 // ========== LOCAL FUNCTIONS ==============================
       
    73 
       
    74 // ========== MEMBER FUNCTIONS =============================
       
    75 
       
    76 // ---------------------------------------------------------
       
    77 // CUniDrmInfo::NewLC
       
    78 //
       
    79 // Factory method.
       
    80 // ---------------------------------------------------------
       
    81 //
       
    82 EXPORT_C CUniDrmInfo* CUniDrmInfo::NewLC( RFs& aFs,
       
    83                                           CBaseMtm& aMtm,
       
    84                                           TMsvAttachmentId& aId,
       
    85                                           CMsgMediaInfo& aMediaInfo )
       
    86     {
       
    87     CUniDrmInfo* self =  new ( ELeave ) CUniDrmInfo( aFs, aMtm, aId, aMediaInfo );
       
    88     
       
    89     CleanupStack::PushL( self );
       
    90     self->ConstructL();
       
    91     
       
    92     return self;
       
    93     }
       
    94 
       
    95 // ---------------------------------------------------------
       
    96 // CUniDrmInfo::NewL
       
    97 //
       
    98 // Factory method.
       
    99 // ---------------------------------------------------------
       
   100 //
       
   101 EXPORT_C CUniDrmInfo* CUniDrmInfo::NewL( RFs& aFs,
       
   102                                          CBaseMtm& aMtm,
       
   103                                          TMsvAttachmentId& aId,
       
   104                                          CMsgMediaInfo& aMediaInfo )
       
   105     {
       
   106     CUniDrmInfo* self = NewLC( aFs, aMtm, aId, aMediaInfo );
       
   107     CleanupStack::Pop( self );
       
   108     
       
   109     return self;
       
   110     }
       
   111 
       
   112 // ---------------------------------------------------------
       
   113 // CUniDrmInfo::CUniDrmInfo
       
   114 //
       
   115 // Constructor.
       
   116 // ---------------------------------------------------------
       
   117 //
       
   118 CUniDrmInfo::CUniDrmInfo( RFs& aFs,
       
   119                           CBaseMtm& aMtm,
       
   120                           TMsvAttachmentId& aId,
       
   121                           CMsgMediaInfo& aMediaInfo ) :
       
   122     iFs( aFs ),
       
   123     iMtm( aMtm ),
       
   124     iAttachmentId( aId ),
       
   125     iMediaInfo( aMediaInfo ),
       
   126     iDRMConsumeStatus( EUniDRMNone ),
       
   127     iDRMConsumeCount( 0 ),
       
   128     iDRMRightsExist( ETrue ), //Rights ok by default
       
   129     iDRMExpiration( CDRMRights::EValidRights ),
       
   130     iDRMRestriction( CDRMRights::EFullRights ),
       
   131     iDRMConstraintType( CDRMRights::ENoConstraints )
       
   132     {
       
   133     }
       
   134 
       
   135 // ---------------------------------------------------------
       
   136 // CUniDrmInfo::CUniDrmInfo
       
   137 //
       
   138 // Destructor.
       
   139 // ---------------------------------------------------------
       
   140 //
       
   141 CUniDrmInfo::~CUniDrmInfo()
       
   142     {
       
   143     ReleaseRights();
       
   144     delete iDRMHelper;
       
   145     
       
   146 #ifdef DRMCOMMONIN_POISTO
       
   147     delete iRightsManager;
       
   148 #else
       
   149     delete iDRMCommon;
       
   150 #endif
       
   151 
       
   152     delete iSendContentUrl;
       
   153     }
       
   154 
       
   155 // ---------------------------------------------------------
       
   156 // CUniDrmInfo::ConstructL
       
   157 //
       
   158 // 2nd phase constructor.
       
   159 // ---------------------------------------------------------
       
   160 //
       
   161 void CUniDrmInfo::ConstructL()
       
   162     {
       
   163     if ( !iMediaInfo.DRMContentURI()->Length() )
       
   164         {
       
   165         User::Leave( KErrNotSupported );
       
   166         }
       
   167         
       
   168     // Get supported features from feature manager.
       
   169     FeatureManager::InitializeLibL();
       
   170     if ( FeatureManager::FeatureSupported( KFeatureIdDrmFull ) )
       
   171         {
       
   172         iSupportedFeatures |= EUniFeatureDrmFull;
       
   173         }
       
   174     FeatureManager::UnInitializeLib();
       
   175 
       
   176 #ifdef DRMCOMMONIN_POISTO
       
   177 
       
   178     // Seems pretty heavy. Should be done only once by e.g. Document
       
   179     // and a reference should be passed as an input parameter?
       
   180     CManager* manager = CManager::NewLC();
       
   181     
       
   182     RArray<TAgent> agents;
       
   183     manager->ListAgentsL( agents );
       
   184     CleanupClosePushL( agents );
       
   185     
       
   186     for ( TInt i = 0; !iRightsManager && i < agents.Count(); i++ )
       
   187         {
       
   188         if ( agents[ i ].Name().Compare( KOmaDrm2AgentName ) == 0 )
       
   189             {
       
   190             iRightsManager = manager->CreateRightsManagerL( agents[ i ] );
       
   191             }
       
   192         }
       
   193         
       
   194     CleanupStack::PopAndDestroy( 2, manager ); // agents, manager
       
   195     
       
   196     if ( !iRightsManager )
       
   197         {
       
   198         User::Leave( KErrNotFound );
       
   199         }
       
   200         
       
   201 #else // DRMCOMMONIN_POISTO
       
   202 
       
   203     iDRMCommon = DRMCommon::NewL();
       
   204     
       
   205 #endif // DRMCOMMONIN_POISTO
       
   206 
       
   207     iDRMHelper = CDRMHelper::NewL( *CEikonEnv::Static( ), iFs );
       
   208     DoGetRightsInfoL();
       
   209     
       
   210     // Check it here that image count is rights.
       
   211     // When image is displayed, use count is already decremented.
       
   212     SetIsDrmWithOnePreviewL();
       
   213 
       
   214     TInt drmMethods;
       
   215     CDRMHelper::TDRMHelperOMALevel omaLevel;
       
   216     iDRMHelper->SupportedDRMMethods2( drmMethods, omaLevel );
       
   217     iOma2 = ( omaLevel == CDRMHelper::EOMA_2_0 ? ETrue : EFalse );
       
   218     }
       
   219 
       
   220 // ---------------------------------------------------------
       
   221 // CUniDrmInfo::DoGetRightsInfoL
       
   222 // ---------------------------------------------------------
       
   223 //
       
   224 void CUniDrmInfo::DoGetRightsInfoL( CDRMRights** aRightsObj )
       
   225     {
       
   226     if ( iSupportedFeatures & EUniFeatureDrmFull )
       
   227         {
       
   228         CDRMRights* rightsObj = NULL; 
       
   229         TInt rightSpec = ConsumeIntent();
       
   230 
       
   231 #ifdef DRMCOMMONIN_POISTO
       
   232         
       
   233         MAgentRightsBase* cafRights = NULL;
       
   234         RStreamablePtrArray<CRightsInfo> rights;
       
   235 
       
   236         // Copy to 16-bit buffer
       
   237         // TODO: Is this really the correct parameter to give to ListRightsL?! 
       
   238         HBufC* temp = HBufC::NewLC( iMediaInfo.DRMContentURI()->Length() );
       
   239         TPtr ptr = temp->Des();
       
   240         ptr.Copy( *iMediaInfo.DRMContentURI() );
       
   241 
       
   242         iRightsManager->ListRightsL( rights, *temp );
       
   243 
       
   244         CleanupStack::PopAndDestroy( temp );
       
   245         if ( rights.Count() )
       
   246             {
       
   247             // The active RO is the first one in the list
       
   248             //CRightsInfo* rightsInfo = rights[0]->AllocL();
       
   249             CRightsInfo* rightsInfo = rights[ 0 ];
       
   250             cafRights = iRightsManager->GetRightsDataL( *rightsInfo );
       
   251             rightsObj = reinterpret_cast<CDRMRights*>( cafRights );
       
   252             rightsObj->GetRightsInfo( 
       
   253                 rightSpec,
       
   254                 iDRMRestriction,
       
   255                 iDRMExpiration,
       
   256                 iDRMConstraintType );
       
   257             iDRMRightsExist = ETrue;
       
   258             }
       
   259         else
       
   260             {
       
   261             iDRMRightsExist = EFalse;
       
   262             }
       
   263         rights.ResetAndDestroy();
       
   264 
       
   265 #else // DRMCOMMONIN_POISTO
       
   266 
       
   267         TInt restriction = iDRMCommon->GetActiveRights(
       
   268             *iMediaInfo.DRMContentURI(),
       
   269             rightSpec,
       
   270             rightsObj );
       
   271             
       
   272         if ( restriction == CDRMRights::ENoRights ||
       
   273             !rightsObj )
       
   274             {
       
   275             iDRMRightsExist = EFalse;
       
   276             }
       
   277         else
       
   278             {
       
   279             rightsObj->GetRightsInfo( 
       
   280                 rightSpec,
       
   281                 iDRMRestriction,
       
   282                 iDRMExpiration,
       
   283                 iDRMConstraintType );
       
   284             iDRMRightsExist = ETrue;
       
   285             }
       
   286 
       
   287 #endif // DRMCOMMONIN_POISTO
       
   288 
       
   289         if ( aRightsObj )
       
   290             {
       
   291             (*aRightsObj) = rightsObj;
       
   292             }
       
   293         else
       
   294             {
       
   295             delete rightsObj;
       
   296             }
       
   297         }
       
   298     }
       
   299 
       
   300 // ---------------------------------------------------------
       
   301 // CUniDrmInfo::ConsumeRights
       
   302 // ---------------------------------------------------------
       
   303 //
       
   304 EXPORT_C TInt CUniDrmInfo::ConsumeRights()
       
   305     {
       
   306     UNILOGGER_ENTERFN( "CUniDrmInfo::ConsumeRights" );
       
   307     
       
   308     TInt err( KErrNone );
       
   309     if ( ( iMediaInfo.MediaType() == EMsgMediaAudio || 
       
   310            ( iMediaInfo.MediaType() != EMsgMediaAudio && 
       
   311              iDRMExpiration == CDRMRights::EValidRights ) ) &&  
       
   312          iDRMConsumeStatus != EUniDRMConsumed )
       
   313         {
       
   314         if ( iDRMConsumeCount )
       
   315             {
       
   316             UNILOGGER_WRITE( "Rights freezed" );
       
   317             
       
   318             // Already once consumed. Freeze is enough!
       
   319             FreezeRights();
       
   320             }
       
   321         else
       
   322             {
       
   323             if ( iDRMConsumeStatus == EUniDRMFrozen )
       
   324                 {
       
   325                 UNILOGGER_WRITE( "Rights released" );
       
   326                 
       
   327                 ReleaseRights();
       
   328                 }
       
   329                 
       
   330             err = iDRMHelper->Consume2( iMediaInfo.DRMContentURI()->Des(),
       
   331                                         ConsumeIntent(),
       
   332                                         CDRMHelper::EStart );
       
   333 
       
   334             if ( !err )
       
   335                 {
       
   336                 UNILOGGER_WRITE( "Rights consumed" );
       
   337                 
       
   338                 iDRMConsumeStatus = EUniDRMConsumed;
       
   339                 iDRMConsumeCount++;
       
   340                 }
       
   341             }
       
   342         }
       
   343     // else - never consume for preview
       
   344     
       
   345     UNILOGGER_WRITEF( _L("Result: %d"), err );
       
   346     UNILOGGER_LEAVEFN( "CUniDrmInfo::ConsumeRights" );
       
   347     
       
   348     return err;
       
   349     }
       
   350     
       
   351 // ---------------------------------------------------------
       
   352 // CUniDrmInfo::EvaluateRights
       
   353 // ---------------------------------------------------------
       
   354 //
       
   355 EXPORT_C TInt CUniDrmInfo::EvaluateRights( TBool& aConsumed )
       
   356     {
       
   357     UNILOGGER_ENTERFN( "CUniDrmInfo::EvaluateRights" );
       
   358     
       
   359     aConsumed = ( iDRMConsumeStatus == EUniDRMConsumed ||  iDRMConsumeCount );
       
   360     
       
   361     TInt err( KErrNone ); 
       
   362     
       
   363     CData* cData = NULL;
       
   364     TRAP_IGNORE( cData = CreateCDataL() );
       
   365     
       
   366     if ( cData )
       
   367         {
       
   368         err = cData->EvaluateIntent( ConsumeIntent() );
       
   369         delete cData;
       
   370         }
       
   371     
       
   372     UNILOGGER_WRITEF( _L("Result: %d, aConsumed %d"), err, aConsumed );
       
   373     UNILOGGER_LEAVEFN( "CUniDrmInfo::EvaluateRights" );
       
   374     
       
   375     return err;
       
   376     }
       
   377 
       
   378 // ---------------------------------------------------------
       
   379 // CUniDrmInfo::FreezeRights
       
   380 // ---------------------------------------------------------
       
   381 //
       
   382 EXPORT_C TInt CUniDrmInfo::FreezeRights()
       
   383     {
       
   384     UNILOGGER_ENTERFN( "CUniDrmInfo::FreezeRights" );
       
   385     
       
   386     TInt err( KErrNone );
       
   387     if ( ( iMediaInfo.MediaType() == EMsgMediaAudio || 
       
   388            ( iMediaInfo.MediaType() != EMsgMediaAudio && 
       
   389              iDRMExpiration == CDRMRights::EValidRights ) ) &&  
       
   390          iDRMConsumeStatus == EUniDRMNone )
       
   391         {
       
   392         err = iDRMHelper->Consume2( iMediaInfo.DRMContentURI()->Des(),
       
   393                                     ContentAccess::EInstall,
       
   394                                     CDRMHelper::EStart );
       
   395 
       
   396         if ( !err )
       
   397             {
       
   398             UNILOGGER_WRITE( "Rights frozen" );
       
   399             
       
   400             iDRMConsumeStatus = EUniDRMFrozen;
       
   401             }
       
   402         }
       
   403     
       
   404     UNILOGGER_WRITEF( _L("Result: %d"), err );
       
   405     UNILOGGER_LEAVEFN( "CUniDrmInfo::FreezeRights" );
       
   406     
       
   407     return err;
       
   408     }
       
   409 
       
   410 // ---------------------------------------------------------
       
   411 // CUniDrmInfo::ReleaseRights 
       
   412 // ---------------------------------------------------------
       
   413 //
       
   414 EXPORT_C TInt CUniDrmInfo::ReleaseRights()
       
   415     {
       
   416     UNILOGGER_ENTERFN( "CUniDrmInfo::ReleaseRights" );
       
   417     
       
   418     TInt err( KErrNone );
       
   419     if ( iDRMConsumeStatus != EUniDRMNone )
       
   420         {
       
   421         TUint32 rightsSpec = ( iDRMConsumeStatus == EUniDRMFrozen )
       
   422             ? ContentAccess::EInstall
       
   423             : ConsumeIntent();
       
   424             
       
   425         err = iDRMHelper->Consume2( iMediaInfo.DRMContentURI()->Des(),
       
   426                                     rightsSpec,
       
   427                                     CDRMHelper::EFinish );
       
   428         
       
   429         UNILOGGER_WRITE( "Rights released" );
       
   430         
       
   431         // else - never consumed for preview
       
   432         iDRMConsumeStatus = EUniDRMNone;
       
   433         }
       
   434     
       
   435     UNILOGGER_WRITEF( _L("Result: %d"), err );
       
   436     UNILOGGER_LEAVEFN( "CUniDrmInfo::ReleaseRights" );
       
   437     
       
   438     return err;
       
   439     }
       
   440 
       
   441 // ---------------------------------------------------------
       
   442 //  CUniDrmInfo::RightsValidL
       
   443 // ---------------------------------------------------------
       
   444 //
       
   445 EXPORT_C TBool CUniDrmInfo::RightsValidL( TBool aUpdate )
       
   446     {
       
   447     UNILOGGER_ENTERFN( "CUniDrmInfo::RightsValidL" );
       
   448     UNILOGGER_WRITEF( _L("aUpdate: %d"), aUpdate );
       
   449     
       
   450     // By default rights are valid
       
   451     TBool retVal = ETrue;
       
   452     if ( aUpdate )
       
   453         {
       
   454         DoGetRightsInfoL();
       
   455         
       
   456         UNILOGGER_WRITE( "Update done" );
       
   457         }
       
   458         
       
   459     if ( iMediaInfo.Protection() &
       
   460         ( EFileProtForwardLocked | EFileProtSuperDistributable ) )
       
   461         {
       
   462         if ( iDRMRightsExist )
       
   463             {
       
   464             if ( iDRMExpiration == CDRMRights::EExpiredRights ||
       
   465                  iDRMExpiration == CDRMRights::EFutureRights )
       
   466                 {
       
   467                 // Expired or future rights
       
   468                 retVal = EFalse;
       
   469                 }
       
   470             }
       
   471         else
       
   472             {
       
   473             // No rights
       
   474             retVal = EFalse;
       
   475             }
       
   476         }
       
   477     
       
   478     UNILOGGER_WRITEF( _L("Result: %d"), retVal );
       
   479     UNILOGGER_LEAVEFN( "CUniDrmInfo::RightsValidL" );
       
   480     
       
   481     return retVal;
       
   482     }
       
   483     
       
   484 // ---------------------------------------------------------
       
   485 // CUniDrmInfo::IsDrmWithOnePreview
       
   486 // ---------------------------------------------------------
       
   487 //
       
   488 EXPORT_C TBool CUniDrmInfo::IsDrmWithOnePreview()
       
   489     {
       
   490     return iDrmOnePreview;
       
   491     }
       
   492 
       
   493 // ---------------------------------------------------------
       
   494 // CUniDrmInfo::SetIsDrmWithOnePreviewL
       
   495 // ---------------------------------------------------------
       
   496 //
       
   497 void CUniDrmInfo::SetIsDrmWithOnePreviewL()
       
   498     {
       
   499     iDrmOnePreview = EFalse;
       
   500     if ( !( iSupportedFeatures & EUniFeatureDrmFull ) ) 
       
   501         {
       
   502         return;
       
   503         }
       
   504         
       
   505     // Check only object list. Attachments are left for
       
   506     // dedicated attachment handler's responsibility.
       
   507     CDRMRights* rights = NULL;
       
   508     DoGetRightsInfoL(&rights);
       
   509 
       
   510     if ( rights && 
       
   511          iDRMRightsExist &&  
       
   512          !( iDRMConstraintType ^ CDRMRights::ECountBased ) &&   // only ECountBased bit set
       
   513          iMediaInfo.Protection() & EFileProtForwardLocked )
       
   514         {
       
   515         // must get count still
       
   516         // no leaving functions in this function
       
   517         CDRMRightsConstraints* constraint = NULL;
       
   518         TMsgMediaType mediaType = iMediaInfo.MediaType();
       
   519         
       
   520         if ( mediaType == EMsgMediaImage || 
       
   521              mediaType == EMsgMediaSvg )
       
   522             {
       
   523             rights->GetDisplayRight( constraint );    
       
   524             }
       
   525         else if ( mediaType == EMsgMediaAudio ||  
       
   526                   mediaType == EMsgMediaVideo )
       
   527             {
       
   528             rights->GetPlayRight( constraint );
       
   529             }
       
   530             
       
   531         if ( constraint &&  
       
   532              constraint->IsPreview() )
       
   533             {
       
   534             TUint32 origCount = 0;
       
   535             TUint32 nowCount = 0;
       
   536             constraint->GetCounters( nowCount,  origCount);
       
   537             
       
   538             if ( nowCount == 1 )
       
   539                 {
       
   540                 iDrmOnePreview = ETrue;
       
   541                 }
       
   542             }
       
   543             
       
   544         delete constraint;
       
   545         }        
       
   546         
       
   547     delete rights;
       
   548     }
       
   549     
       
   550     
       
   551 // ---------------------------------------------------------
       
   552 // CUniDrmInfo::CreateCDataL
       
   553 // ---------------------------------------------------------
       
   554 //
       
   555 CData* CUniDrmInfo::CreateCDataL()
       
   556     {
       
   557     CData* result = NULL;
       
   558     
       
   559     if ( iMediaInfo.DRMContentURI() )
       
   560         {
       
   561         // depends on iAttachmentId
       
   562         RFile attachmentFile = CUniDataUtils::GetAttachmentFileL( iMtm, iAttachmentId );
       
   563         CleanupClosePushL( attachmentFile );
       
   564         
       
   565         result = CData::NewL( attachmentFile, 
       
   566                               KDefaultContentObject,
       
   567                               EPeek );
       
   568                                
       
   569         CleanupStack::PopAndDestroy( &attachmentFile );
       
   570         }
       
   571     
       
   572     return result;
       
   573     }
       
   574     
       
   575 // ---------------------------------------------------------
       
   576 // CUniDrmInfo::HandleDrmErrorL
       
   577 // ---------------------------------------------------------
       
   578 //
       
   579 EXPORT_C void CUniDrmInfo::HandleDrmErrorL( TInt aError )
       
   580     {
       
   581     if ( iDRMHelper )
       
   582         {
       
   583         RFile attachmentFile = CUniDataUtils::GetAttachmentFileL( iMtm, iAttachmentId );
       
   584         CleanupClosePushL( attachmentFile );
       
   585         
       
   586         iDRMHelper->HandleErrorL(   aError,
       
   587                                     attachmentFile );
       
   588         CleanupStack::PopAndDestroy( &attachmentFile );
       
   589         }
       
   590     }
       
   591     
       
   592     
       
   593 // EOF