commondrm/drmutility/src/drmutilitywmdrmwrapper.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Wed, 09 Jun 2010 09:59:43 +0300
branchRCL_3
changeset 20 29f3cf766061
parent 16 457cd4423b8c
child 26 1221b68b8a5f
permissions -rw-r--r--
Revision: 201021 Kit: 2010123

/*
* Copyright (c) 2006-2010 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:  WM Drm wrapper implementation
*
*/


// INCLUDE FILES

// launching embedded details view
#include <AknLaunchAppService.h>
#include <AiwGenericParam.h>
#include <apgcli.h>
#include <apgtask.h>
#include <w32std.h>

// character conversions
#include <utf.h>
#include <f32file.h>
#include <avkon.hrh>

// access point utils
#include <centralrepository.h>
#include <cdblen.h>
#include <cmconnectionmethod.h>
#include <cmdestination.h>
#include <cmconnectionmethoddef.h>
#include <cmmanager.h>
#ifdef __SERIES60_NATIVE_BROWSER
#include <browseruisdkcrkeys.h>
#endif

#include <featdiscovery.h>
#include <aknmessagequerydialog.h>

#include    <wmdrmagent.h> // for WMDRM file details view
#include    <drmutilitytypes.h>
#include    <drmuicheckrightsobserver.h>

// resources
#include    <drmutility.rsg>

#include    "drmutilitywmdrmwrapper.h"
#include    "drmutilityui.h"

#include    "drmagents.h"
#include    "DRMClockClient.h"

#include    "drmutilityinternaltypes.h"
#include    "drmutilitywmdrmutilities.h"

#include    "wmdrmdlawrapper.h"

using namespace DRM;

// CONSTANTS
const TInt KMaxUrlLength( 1024 );
const TInt KMaxUrlSanityLength( 102400 );

#ifndef __SERIES60_NATIVE_BROWSER
const TUid KCRUidBrowser = {0x10008D39};
const TUint32 KBrowserDefaultAccessPoint = 0x0000000E;
const TUint32 KBrowserAccessPointSelectionMode = 0x0000001E;
#endif

#ifdef _DEBUG
// debug panic
_LIT( KWmDrmWrapperDebugPanicMessage, "WmDrmWrapperDebugPanic" );
const TInt KWmDrmWrapperDebugPanicCode( 1 );
#endif

// ============================ MEMBER FUNCTIONS ===============================

// -----------------------------------------------------------------------------
// CDrmUtilityWMDrmWrapper::CDrmUtilityWMDrmWrapper
// C++ default constructor can NOT contain any code, that
// might leave.
// -----------------------------------------------------------------------------
//
DRM::CDrmUtilityWMDrmWrapper::CDrmUtilityWMDrmWrapper() :
    iCoeEnv( NULL ),
    iDrmUtilityUi( NULL ),
    iWmDrmDlaSupportOn ( ETrue )
    {
    }

// -----------------------------------------------------------------------------
// CDrmUtilityWMDrmWrapper::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void DRM::CDrmUtilityWMDrmWrapper::ConstructL()
    {
    User::LeaveIfError( iFs.Connect() );
    TUid u = TUid::Uid( KFeatureIdFfWmdrmDlaSupport );
    TRAPD(err, iWmDrmDlaSupportOn = CFeatureDiscovery::IsFeatureSupportedL( u ));
    }

// -----------------------------------------------------------------------------
// CDrmUtilityWMDrmWrapper::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
EXPORT_C DRM::CDrmUtilityWMDrmWrapper* DRM::CDrmUtilityWMDrmWrapper::NewL()
    {
    DRM::CDrmUtilityWMDrmWrapper* self( NewLC() );

    CleanupStack::Pop( self );

    return self;
    }


// -----------------------------------------------------------------------------
// CDrmUtilityWMDrmWrapper::NewLC
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
EXPORT_C DRM::CDrmUtilityWMDrmWrapper* DRM::CDrmUtilityWMDrmWrapper::NewLC()
    {
    DRM::CDrmUtilityWMDrmWrapper* self( new( ELeave ) CDrmUtilityWMDrmWrapper );

    CleanupStack::PushL( self );
    self->ConstructL();

    return self;
    }


// Destructor
DRM::CDrmUtilityWMDrmWrapper::~CDrmUtilityWMDrmWrapper()
    {
    delete iDrmUtilityUi;
    delete iDlaWrapper;
    iDlaWrapperDll.Close();
    iFs.Close();
    }


// -----------------------------------------------------------------------------
// CDrmUtilityWMDrmWrapper::CheckWmRightsAmountL()
// Syncronous method
// -----------------------------------------------------------------------------
//

EXPORT_C void DRM::CDrmUtilityWMDrmWrapper::CheckWmRightsAmountL(
    ContentAccess::CData& aContent,
    ContentAccess::TIntent aIntent,
    DRM::MDrmUiCheckRightsObserver* aObserver,
    TInt aOperationId )
    {
    TInt value( EFalse );
    HBufC* contentId( HBufC::NewLC( KMaxUrlLength ) ); // 1024
    TPtr cid( contentId->Des() );
    TBool unlimited( EFalse );
    TInt32 reason( 0 );
    TInt counts( 0 );
    TTimeIntervalSeconds time( 0 );
    TTimeIntervalSeconds accumulated( 0 );
    TInt error( KErrNone );

    // Check intent:
    switch( aIntent )
        {
        case ContentAccess::EPlay:
        case ContentAccess::EView:

            break;

        default:

            // Intent not supported, leave with argument:
            User::Leave( KErrArgument );

            break;
        }


    // Ask the rights from CAF, same call for both ECanPlay and ECanView
    User::LeaveIfError( aContent.GetAttribute( ContentAccess::ECanPlay, value ) );

    // Loop needed to make sure the full path name fits to the cid.
    // If the size is not enough, increase it in steps of one kB.
    while ( ( error = aContent.GetStringAttribute( DRM::EDrmFullName, cid ) )
        == KErrOverflow )
        {
        if ( contentId->Size() + KMaxUrlLength > KMaxUrlSanityLength )
            {
            // Cid is so big that it can not fit to the 100 kB default max buffer.
            User::Leave( error );
            }
        CleanupStack::Pop( contentId );
        contentId->ReAllocL( contentId->Size() + KMaxUrlLength );
        cid.Set( contentId->Des() );
        CleanupStack::PushL( contentId );
        }

    if ( error )
        {
        User::Leave( error );
        }

    // Object can be played and rights are in order:
    if ( value )
        {
        // Get the rights data
        GetRightsDataL(
            cid,
            unlimited,
            time,
            counts,
            accumulated );

        // call given CheckRightsObserver
        // What kind of rights are available:
        CallRightsLeftL (
            aObserver,
            aOperationId,
            unlimited,
            time,
            counts,
            accumulated,
            aContent,
            cid );
        }
    else // The rights are not valid at this point always claim they have expired
        {
        CallRightsNotValidL(
            aObserver,
            aOperationId,
            EUHCheckRightsExpiredRights,
            reason,
            aContent,
            cid );
        }

    CleanupStack::PopAndDestroy( contentId );
    }


// -----------------------------------------------------------------------------
// CDrmUtilityWMDrmWrapper::HandleWmErrorL()
// Syncronous method
// -----------------------------------------------------------------------------
//

EXPORT_C void DRM::CDrmUtilityWMDrmWrapper::HandleWmErrorL(
    ContentAccess::CData& aContent,
    ContentAccess::TIntent /* aIntent */,
    TInt /* aError */,
    DRM::MDrmHandleErrorObserver* aObserver,
    TInt aOperationId )
    {

    TInt32 reason( 0 );
    TInt value( EFalse );
    HBufC* contentId( HBufC::NewLC( KMaxUrlLength ) ); // 1024
    TPtr cid( contentId->Des() );

    // Check Content Id via CAF
    User::LeaveIfError( aContent.GetStringAttribute( ContentAccess::EContentId, cid ) );

    // Ask the rights from CAF, same call for both ECanPlay and ECanView
    User::LeaveIfError( aContent.GetAttribute( ContentAccess::ECanPlay, value ) );

    if ( !value )
        {
        ShowNoRightsNoteL( aContent, reason );
        User::LeaveIfError( aContent.GetAttribute( ContentAccess::ECanPlay, value ) );
        if ( value )
            {
            CallRightsAvailable( aObserver, aOperationId, KErrNone );
            }
        else
            {
            CallRightsAvailable( aObserver, aOperationId, KErrCANoRights );
            }
        }
    else
        {
        User::Leave( KErrArgument );
        }

    CleanupStack::PopAndDestroy( contentId );
    }


// -----------------------------------------------------------------------------
// CDrmUtilityWMDrmWrapper::SetCoeEnv()
// Syncronous method
// -----------------------------------------------------------------------------
//
EXPORT_C void DRM::CDrmUtilityWMDrmWrapper::SetCoeEnv( CCoeEnv* aCoeEnv )
    {
    iCoeEnv = aCoeEnv;
    }

// -----------------------------------------------------------------------------
// CDrmUtilityWMDrmWrapper::GetRightsManagerL
// -----------------------------------------------------------------------------
//
ContentAccess::CRightsManager* DRM::CDrmUtilityWMDrmWrapper::GetRightsManagerL()
    {
    ContentAccess::CManager* manager( NULL );
    ContentAccess::CRightsManager* rightsManager( NULL );
    RArray<ContentAccess::TAgent> agents;
    TInt agent( 0 );

    CleanupClosePushL( agents );
    manager = ContentAccess::CManager::NewLC();

    manager->ListAgentsL( agents );

    for ( agent = 0; agent < agents.Count(); agent++ )
        {
        if (agents[agent].Name().Compare( KWmDrmAgentName ) == 0)
            {
            break;
            }
        }

    // If no WM DRM agent is found, leave
    if( agent >= agents.Count() )
        {
        User::Leave( KErrNotSupported );
        }


    // Create a CRightsManager for the agent found
    rightsManager = manager->CreateRightsManagerL( agents[agent] );

    CleanupStack::PopAndDestroy( manager ); // manager
    CleanupStack::PopAndDestroy( &agents ); // agents
    return rightsManager;
    }


// -----------------------------------------------------------------------------
// CDrmUtilityWMDrmWrapper::GetRightsDataL
// -----------------------------------------------------------------------------
//
void DRM::CDrmUtilityWMDrmWrapper::GetRightsDataL(
    const TDesC& aUniqueId,
    TBool& aUnconstrained,
    TTimeIntervalSeconds& aTime,
    TInt& aCounts,
    TTimeIntervalSeconds& aAccumulated )
    {
    ContentAccess::RStreamablePtrArray<ContentAccess::CRightsInfo> aArray;
    ContentAccess::CRightsManager* manager( NULL );
    CleanupClosePushL(aArray);

    aUnconstrained = EFalse;
    aTime = 0;
    aCounts = 0;
    aAccumulated = 0;

    // Create the manager:
    manager = GetRightsManagerL();
    CleanupStack::PushL( manager );

    // Get the list of rights:
    manager->ListRightsL( aArray, aUniqueId );

    // Evaluate the rights:
    if( aArray.Count() )
        {
        for ( TInt i( 0 ); i < aArray.Count(); i++ )
            {
            switch( aArray[i]->RightsStatus() )
                {
                // All of these the rights don't exist or are expired:
                case ContentAccess::ERightsStatusNone:
                case ContentAccess::ERightsStatusExpired:
                case ContentAccess::ERightsStatusPending:

                    break;

                // the rights are valid:
                // Check the duration, counts and whether the rights
                // are unlimited or not
                case ContentAccess::ERightsStatusValid:
                    DrmUtilityWmDrmUtilities::CheckWmDrmRightsL(
                        aUnconstrained, aTime, aCounts, *aArray[0] );
                    break;
                }
            }
        }
    else
        {
        User::Leave( KErrCANoRights );
        }

    CleanupStack::PopAndDestroy( manager );
    CleanupStack::PopAndDestroy( &aArray ); // aArray
    }


// -----------------------------------------------------------------------------
// CDrmUtilityWMDrmWrapper::CallRightsLeftL
// -----------------------------------------------------------------------------
//
void DRM::CDrmUtilityWMDrmWrapper::CallRightsLeftL(
    DRM::MDrmUiCheckRightsObserver* aObserver,
    TInt aOperationId,
    TBool aUnconstrained,
    TTimeIntervalSeconds aTime,
    TInt aCounts,
    TTimeIntervalSeconds aAccumulated,
    ContentAccess::CData& aContent,
    const TDesC& aContentUri )
    {
    DRM::TCheckRightsAction rightsAction( DRM::EUHCheckRightsActionDefault );

    if ( aObserver )
        {
        rightsAction = aObserver->RightsLeft( aOperationId,
                                              aUnconstrained,
                                              aTime,
                                              aCounts,
                                              aAccumulated );
        }

    switch ( rightsAction )
        {
        case DRM::EUHCheckRightsActionDefault:
            {
            // show appropriate notes, none at the moment
            }
            break;

        case DRM::EUHCheckRightsActionOpenDetailsView:
            {
            // Commented out for now, should do details for WM DRM when supported
            // create parameter string
            HBufC* launchParam( NULL );
            CreateLaunchParamL( &aContentUri, launchParam ); // use zero as localid
            CleanupStack::PushL( launchParam );

            // show details
            LaunchRightsManagerUiL( *launchParam );
            CleanupStack::PopAndDestroy( launchParam );
            }
            break;

        case DRM::EUHCheckRightsActionAcquireNewRights:
            TRAPD( err, LoadDlaWrapperL() );
            if ( !err )
                {
                SilentDlaLicenseAcquisitionL( aContent );
                }
            break;

        case DRM::EUHCheckRightsActionIgnore:
            // do nothing
            break;

        default:
            break;
        }
    }


// -----------------------------------------------------------------------------
// CDrmUtilityWMDrmWrapper::CallRightsNotValidL
// -----------------------------------------------------------------------------
//
void DRM::CDrmUtilityWMDrmWrapper::CallRightsNotValidL(
    DRM::MDrmUiCheckRightsObserver* aObserver,
    TInt aOperationId,
    DRM::TCheckRightsStatus aRightsStatus,
    TUint32 aReason,
    ContentAccess::CData& aContent,
    const TDesC& aContentUri )
    {
    DRM::TCheckRightsAction rightsAction( DRM::EUHCheckRightsActionDefault );

    if ( aObserver )
        {
        // call given CheckRightsObserver
        rightsAction = aObserver->RightsNotValid( aOperationId,
                                                  aRightsStatus,
                                                  RejectReason( aReason ) );
        }

    //rightsAction = DRM::EUHCheckRightsActionDefault;

    switch ( rightsAction )
        {
        case DRM::EUHCheckRightsActionDefault:
            {
            ShowNoRightsNoteL( aContent, aReason );
            }
            break;

        case DRM::EUHCheckRightsActionOpenDetailsView:
            {
            // Commented out for now, should do details for WM DRM when supported
            // create parameter string
            HBufC* launchParam( NULL );
            CreateLaunchParamL( &aContentUri, launchParam ); // use zero as localid
            CleanupStack::PushL( launchParam );

            // show details
            LaunchRightsManagerUiL( *launchParam );
            CleanupStack::PopAndDestroy( launchParam );
            }
            break;

        case DRM::EUHCheckRightsActionAcquireNewRights:
            TRAPD( err, LoadDlaWrapperL() );
            if ( !err )
                {
                SilentDlaLicenseAcquisitionL( aContent );
                }
            break;

        case DRM::EUHCheckRightsActionIgnore:
            // do nothing
            break;

        default:
            break;
        }
    }

// -----------------------------------------------------------------------------
// CDrmUtilityWMDrmWrapper::CallRightsAvailable
// -----------------------------------------------------------------------------
//
void DRM::CDrmUtilityWMDrmWrapper::CallRightsAvailable(
    DRM::MDrmHandleErrorObserver* aObserver,
    TInt aOperationId,
    TInt aError )
    {

    if ( aObserver )
        {
        // call given HandleErrorObserver
        aObserver->RightsAvailable( aOperationId, aError );
        }
    }

// -----------------------------------------------------------------------------
// CDrmUtilityWMDrmWrapper::ShowNoRightsNoteL
// -----------------------------------------------------------------------------
//
void DRM::CDrmUtilityWMDrmWrapper::ShowNoRightsNoteL(
    ContentAccess::CData& aContent,
    TUint32 /*aReason*/ )
    {
    TRAPD( err, LoadDlaWrapperL() );
    if ( !err )
        {
        TInt ret( EAknSoftkeyYes );
        RFile file;
        GetRFileFromCDataL( aContent, file );
        CleanupClosePushL( file );
        TBool isSilent( EFalse );
        TRAP( err, isSilent = IsDlaLicenseAcquisitionSilentL( file ) );
        if ( !err && !isSilent )
            {
            if ( !iDrmUtilityUi )
                {
                iDrmUtilityUi = DRM::CDrmUtilityUI::NewL( iCoeEnv );
                }
            TFileName fileName;
            User::LeaveIfError( aContent.GetStringAttribute( DRM::EDrmFileName, fileName ) );
            if(iWmDrmDlaSupportOn)
                {
                ret = iDrmUtilityUi->DisplayQueryL( R_DRM_QUERY_EXPIRED_OR_NO_RO, fileName );
                }
            else
                {
                ret = iDrmUtilityUi->DisplayMessageQueryL( R_DRMUTILITY_SYNC_WITH_PC, R_DRMUTILITY_HEAD_NO_LICENSE, fileName);
                }
            }
        if ( !err && ( ret == EAknSoftkeyYes || ret == EAknSoftkeyOk ) && iWmDrmDlaSupportOn)
            {
            TRAP_IGNORE( DlaLicenseAcquisitionL( file ) );
            }
        CleanupStack::PopAndDestroy( &file );
        }
    else
        {
        if ( !iDrmUtilityUi )
            {
            iDrmUtilityUi = DRM::CDrmUtilityUI::NewL( iCoeEnv );
            }
        iDrmUtilityUi->DisplayNoteL( R_DRM_INFO_EXPIRED_OR_NO_RO );
        }
    }

// -----------------------------------------------------------------------------
// CDrmUtilityWMDrmWrapper::RejectReason
// -----------------------------------------------------------------------------
//
TInt DRM::CDrmUtilityWMDrmWrapper::RejectReason(
    TUint32 /* aReason */ )
    {
    TInt ret = DRM::EURejectionNone;

    return ret;
    }


// -----------------------------------------------------------------------------
// CDrmUtilityWMDrmWrapper::LaunchRightsManagerUiL
// -----------------------------------------------------------------------------
//
void DRM::CDrmUtilityWMDrmWrapper::LaunchRightsManagerUiL(
    const TDesC& aParam16 )
    {

    const TUid KUidDRMUI = { 0x101f85c7 };

    if ( iCoeEnv )
        {
        CAiwGenericParamList* paramList( CAiwGenericParamList::NewLC() );
        TAiwVariant variantObject( aParam16 );
        TAiwGenericParam param( EGenericParamFile, variantObject );
        paramList->AppendL( param );

        CAknLaunchAppService* launchAppService(
                                    CAknLaunchAppService::NewL( KUidDRMUI,
                                                                this,
                                                                paramList ) );
        CleanupStack::PushL( launchAppService );
        iWait.Start();
        CleanupStack::PopAndDestroy( 2, paramList );
        }
    else
        {
        // no UI to embed, launch Rights Manager UI stand-alone
        // check if Rights Manager UI is already running
        RWsSession wsSession;
        User::LeaveIfError( wsSession.Connect() );
        CleanupClosePushL( wsSession );
        TApaTaskList tasklist( wsSession );
        TApaTask task( tasklist.FindApp( KUidDRMUI ) );
        if ( task.Exists() )
            {
            // Rights Manager UI is already running
            HBufC8* param8( HBufC8::NewLC( aParam16.Length() ) );
            TPtr8 parametersPtr( param8->Des() );
            parametersPtr.Copy( aParam16 );
            task.SendMessage( TUid::Uid( KUidApaMessageSwitchOpenFileValue ),
                                         *param8 );
            CleanupStack::PopAndDestroy( param8 );
            }
        else
            {
            RApaLsSession appArcSession;
            User::LeaveIfError( appArcSession.Connect() );
            TThreadId id;
            appArcSession.StartDocument( aParam16, KUidDRMUI, id );
            appArcSession.Close();
            }
        CleanupStack::PopAndDestroy( &wsSession );
        }
    }


// -----------------------------------------------------------------------------
// CDrmUtilityWMDrmWrapper::CreateLaunchParamL
// -----------------------------------------------------------------------------
//
void DRM::CDrmUtilityWMDrmWrapper::CreateLaunchParamL(
    const TDesC* aUrl,
    HBufC*& aLaunchParam )
    {

    __ASSERT_DEBUG( !aLaunchParam && aUrl,
                    User::Panic( KWmDrmWrapperDebugPanicMessage,
                                 KWmDrmWrapperDebugPanicCode ) );

    _LIT( KZero, "0" );
    _LIT( KMarker, "\x00" );

    TPtr ptr( NULL, 0 );

    // length of startparam and drm protection type indicator and zero local id
    // are always 1 and total of 4 markers are needed
    TInt length( 1 + aUrl->Length() + 1 + 4 + 1 );

    aLaunchParam = HBufC::NewLC( length );
    ptr.Set( aLaunchParam->Des() );

    // Start parameter is 3 or 4 for launching details view embedded or standalone from
    // DRM Utility, respectively, with full path name included as a parameter. Values 1
    // and 2 are for launching details view from DRM Helper.
    if ( iCoeEnv )
        {
        ptr.AppendNum( EDrmLaunchParamEmbeddedUtility );
        }
    else
        {
        ptr.AppendNum( EDrmLaunchParamStandAloneUtility );
        }
    ptr.Append( KMarker );
    // Default value 0 for localId in case of WM DRM file
    ptr.Append( KZero );
    ptr.Append( KMarker );
    ptr.Append( *aUrl );
    ptr.Append( KMarker );
    // WM DRM protection scheme
    ptr.AppendNum( EDrmSchemeWmDrm );
    ptr.Append( KMarker );

    CleanupStack::Pop( aLaunchParam );
    }

// -----------------------------------------------------------------------------
// CDrmUtilityWMDrmWrapper::HandleServerAppExit
// -----------------------------------------------------------------------------
//
void DRM::CDrmUtilityWMDrmWrapper::HandleServerAppExit( TInt /*aReason*/ )
    {
    if ( iWait.IsStarted() )
        {
        iWait.AsyncStop();
        }
    }

// -----------------------------------------------------------------------------
// CDrmUtilityWMDrmWrapper::LoadDlaWrapperL
// -----------------------------------------------------------------------------
//
void DRM::CDrmUtilityWMDrmWrapper::LoadDlaWrapperL()
    {
    if ( !iDlaWrapper )
        {
        User::LeaveIfError( iDlaWrapperDll.Load( KWmDrmDlaWrapperName ) );
        iDlaWrapper = (CWmDrmDlaWrapper*)iDlaWrapperDll.Lookup( KWmDrmDlaNewL )();
        }
    }

// -----------------------------------------------------------------------------
// CDrmUtilityWMDrmWrapper::GetRFileFromCDataL
// -----------------------------------------------------------------------------
//
void DRM::CDrmUtilityWMDrmWrapper::GetRFileFromCDataL(
    ContentAccess::CData& aContent,
    RFile& aFile )
    {
    TFileName fileName;
    User::LeaveIfError( aContent.GetStringAttribute( DRM::EDrmFullName, fileName ) );
    User::LeaveIfError( aFile.Open( iFs, fileName, EFileRead | EFileShareReadersOnly ) );
    }

// -----------------------------------------------------------------------------
// CDrmUtilityWMDrmWrapper::IsDlaLicenseAcquisitionSilentL
// -----------------------------------------------------------------------------
//
TBool DRM::CDrmUtilityWMDrmWrapper::IsDlaLicenseAcquisitionSilentL(
    RFile& aFile  )
    {
    LoadDlaWrapperL();
    return iDlaWrapper->SilentL( aFile );
    }

// -----------------------------------------------------------------------------
// CDrmUtilityWMDrmWrapper::DlaLicenseAcquisitionL
// -----------------------------------------------------------------------------
//
void DRM::CDrmUtilityWMDrmWrapper::DlaLicenseAcquisitionL(
    RFile& aFile )
    {
    if( iWmDrmDlaSupportOn )
        {
        TInt iapId( 0 );
        HBufC* contentUrl( NULL );
        HBufC* htmlData( NULL );
        LoadDlaWrapperL();
        TRAPD( err, iapId = DefaultAccessPointL() );
        if ( !err )
            {
            iDlaWrapper->SetIapId( iapId );
            }
        iDlaWrapper->AcquireLicenseL( aFile, contentUrl, htmlData  );
        delete contentUrl;
        delete htmlData;
        }
    else
        {
        if ( !iDrmUtilityUi )
            {
            iDrmUtilityUi = DRM::CDrmUtilityUI::NewL( iCoeEnv );
            }
        TFileName aFileName;
        TInt err = aFile.Name(aFileName);
        iDrmUtilityUi->DisplayNoteL( R_DRMUTILITY_SYNC_WITH_PC , aFileName);
        }
    }

// -----------------------------------------------------------------------------
// CDrmUtilityWMDrmWrapper::SilentDlaLicenseAcquisitionL
// -----------------------------------------------------------------------------
//
void DRM::CDrmUtilityWMDrmWrapper::SilentDlaLicenseAcquisitionL(
    ContentAccess::CData& aContent )
    {
    RFile file;
    GetRFileFromCDataL( aContent, file );
    CleanupClosePushL( file );
    DlaLicenseAcquisitionL( file );
    CleanupStack::PopAndDestroy( &file );
    }

// -----------------------------------------------------------------------------
// CDrmUtilityWMDrmWrapper::DefaultAccessPointL
// -----------------------------------------------------------------------------
//
TInt DRM::CDrmUtilityWMDrmWrapper::DefaultAccessPointL()
    {
    const TInt KDestinationSelectionMode( 2 );
    CRepository* repository( NULL );
    TInt ap( 0 );
    TInt alwaysAsk( 0 );
    TUint32 iapd32( 0 );
    TInt defaultSnap( 0 );

    repository = CRepository::NewL( KCRUidBrowser );
    CleanupStack::PushL( repository );
    repository->Get( KBrowserDefaultAccessPoint, ap );
    repository->Get( KBrowserAccessPointSelectionMode, alwaysAsk );
    repository->Get( KBrowserNGDefaultSnapId, defaultSnap );
    CleanupStack::PopAndDestroy( repository );

    if ( ap <= KErrNotFound && defaultSnap <= KErrNotFound )
        {
        alwaysAsk = ETrue;
        }
    else
        {
        RCmManager cmManager;
        cmManager.OpenLC();
        if ( !alwaysAsk )
            {
            iapd32 =
                cmManager.GetConnectionMethodInfoIntL( ap,
                                                       CMManager::ECmIapId );
            }
        else if ( alwaysAsk == KDestinationSelectionMode )
            {
            RCmDestination dest( cmManager.DestinationL( defaultSnap ) );
            CleanupClosePushL( dest );

            if ( dest.ConnectionMethodCount() <= 0 )
                {
                User::Leave( KErrNotFound );
                }

            RCmConnectionMethod cMeth( dest.ConnectionMethodL( 0 ) );
            CleanupClosePushL( cMeth );

            iapd32 = cMeth.GetIntAttributeL( CMManager::ECmIapId );
            CleanupStack::PopAndDestroy( 2, &dest ); //cMeth, dest
            }
        CleanupStack::PopAndDestroy( &cmManager );
        }
    if ( alwaysAsk && alwaysAsk != KDestinationSelectionMode )
        {
        User::Leave( KErrAccessDenied );
        }
    return iapd32;
    }

//  End of File