mpxmusicplayer/commonui/src/mpxdrmuihelper.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Thu, 17 Dec 2009 08:45:05 +0200
changeset 0 ff3acec5bc43
child 2 b70d77332e66
permissions -rw-r--r--
Revision: 200949 Kit: 200951

/*
* Copyright (c) 2006 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:  Helper utility for Common UI
*
*/



// INCLUDE FILES
#include <eikenv.h>
#include <mpxmedia.h>
#include <mpxmediadrmdefs.h>
#include <mpxmediageneraldefs.h>
#include <caf/caferr.h>
#include <mpxcommonui.rsg>
#include <StringLoader.h>
// S60 Specific

#include <mpxconstants.h>
#include "mpxdrmuihelper.h"
#include "mpxcommonuihelper.h"
#include "mpxlog.h"

#ifdef CAMESE_IN_DRM_UTILITY
#include <drmutility.h>
#include <drmuihandling.h>
#include <drmerrorhandling.h>
#include <caf/caf.h>
#include <caf/data.h>
#include <caf/caftypes.h>
#else
#include <drmhelper.h>
#endif

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

// ---------------------------------------------------------------------------
// Two-phased constructor.
// ---------------------------------------------------------------------------
//
CMPXDrmUiHelper* CMPXDrmUiHelper::NewL( CMPXCommonUiHelper* aHelper )
    {
    CMPXDrmUiHelper* self = new ( ELeave ) CMPXDrmUiHelper( aHelper );
    CleanupStack::PushL( self );
    self->ConstructL();
    CleanupStack::Pop();
    return self;
    }

// ---------------------------------------------------------------------------
// Symbian 2nd phase constructor can leave.
// ---------------------------------------------------------------------------
//
void CMPXDrmUiHelper::ConstructL()
    {
    CCoeEnv* coeEnv = CEikonEnv::Static();
#ifdef CAMESE_IN_DRM_UTILITY	
    iDrmUiHandler = DRM::CDrmUiHandling::NewL();
#else
    iDrmHelper = CDRMHelper::NewL( *coeEnv );
#endif
    }

// ---------------------------------------------------------------------------
// C++ default constructor can NOT contain any code, that
// might leave.
// ---------------------------------------------------------------------------
//
CMPXDrmUiHelper::CMPXDrmUiHelper( CMPXCommonUiHelper* aHelper )
    : iCommonUiHelper( aHelper )
    {
    }

// ---------------------------------------------------------------------------
// Destructor
// ---------------------------------------------------------------------------
//
CMPXDrmUiHelper::~CMPXDrmUiHelper()
    {
#ifdef CAMESE_IN_DRM_UTILITY	
    delete iDrmUiHandler;
#else
    delete iDrmHelper;
#endif
    }

// -----------------------------------------------------------------------------
// Handles displaying the error message for given error code
// according to the media object provided
// -----------------------------------------------------------------------------
//
TInt CMPXDrmUiHelper::HandleDrmErrorL(
    TInt aError,
    const CMPXMedia* aMedia, /*=NULL*/
    RFile* aFile /*=NULL*/ )
    {
    MPX_DEBUG2("CMPXDrmUiHelper::HandleErrorL(%d) entering", aError);

    TInt ret( KErrNone );
    if ( aMedia )
        {
        if ( aMedia->IsSupported( KMPXMediaDrmType ) )
            {
#ifdef CAMESE_IN_DRM_UTILITY
            // all cases will be handled with same logic now
            ret = HandleOMAErrorL( aError, aMedia, aFile );
#else
            TMPXMediaDrmType type(
                    aMedia->ValueTObjectL<TMPXMediaDrmType>( KMPXMediaDrmType ));

            if ( EMPXDrmTypeOMA == type )
                {
                ret = HandleOMAErrorL( aError, aMedia, aFile );
                }
            else if ( EMPXDrmTypeWMA == type )
                {
                ret = HandleWMAErrorL( aError, aMedia, aFile );
                }
#endif
            }
        }

    MPX_DEBUG2("CMPXDrmUiHelper::HandleErrorL() exiting, returning %d", ret);
    return ret;
    }


// -----------------------------------------------------------------------------
// Handles OMA specific error messages
// -----------------------------------------------------------------------------
//
TInt CMPXDrmUiHelper::HandleOMAErrorL(
    TInt aError,
    const CMPXMedia* aMedia,
    RFile* aFile )
    {
    MPX_DEBUG2("CMPXDrmUiHelper::HandleOMAErrorL(%d) entering", aError);
    HBufC8* previewUrl = NULL;

    // Get filename of media
    TInt ret( KErrNone );
    TFileName filename( KNullDesC );
    if ( aMedia->IsSupported( KMPXMediaGeneralUri ) )
        {
        filename = aMedia->ValueText( KMPXMediaGeneralUri );
        }

    TBool useFile( EFalse );
    if ( aFile )
        {
        if ( aFile->SubSessionHandle() )
            {
            useFile = ETrue;
            }
        }
#ifdef CAMESE_IN_DRM_UTILITY
    switch ( aError )
        {
        case KMPXRightsAboutToExpire:
        case KErrCANoRights:
            {
            iRightsValid = EFalse;
            
            // This will ask from user if new rights are acquired
            if ( useFile )
                {
                iDrmUiHandler->CheckRightsAmountL( *aFile,
                		ContentAccess::EPlay, this );
                }
            else if ( filename.CompareF( KNullDesC ) != 0 )
                {
                ContentAccess::TVirtualPathPtr virtualPath( filename, ContentAccess::KDefaultContentObject );
                ContentAccess::CData* content( NULL );
                TRAPD( r, content = ContentAccess::CData::NewL( 
                		virtualPath, ContentAccess::EPeek, 
                		ContentAccess::EContentShareReadWrite ) );
                if ( r == KErrInUse )
                    {
                    content = ContentAccess::CData::NewL( virtualPath, ContentAccess::EPeek, 
                    		ContentAccess::EContentShareReadOnly );
                    }
                else
                    {
                    User::LeaveIfError( r );
                    }
                CleanupStack::PushL( content );
                
                iDrmUiHandler->CheckRightsAmountL( *content,
                	ContentAccess::EPlay, this );
                
                CleanupStack::PopAndDestroy( content );
                }
            if( !iRightsValid )
            	{
            	// Rights still not valid. Cancel the operation.
            	ret = KErrCancel;
            	}
            break;
            }
        default:
            {
			if ( useFile )
                {
                DRM::MDrmErrorHandling& errorHandler = iDrmUiHandler->GetErrorHandler();
                errorHandler.HandleErrorL( *aFile, ContentAccess::EPlay, aError, NULL );
                }
            else if ( filename.CompareF( KNullDesC ) != 0 )
                {
				ContentAccess::TVirtualPathPtr virtualPath( filename, ContentAccess::KDefaultContentObject );
                ContentAccess::CData* content( NULL );
                TRAPD( r, content = ContentAccess::CData::NewL( 
                		virtualPath, ContentAccess::EPeek, 
                		ContentAccess::EContentShareReadWrite ) );
                if ( r == KErrInUse )
                    {
                    content = ContentAccess::CData::NewL( virtualPath, ContentAccess::EPeek, 
                    		ContentAccess::EContentShareReadOnly );
                    }
                else
                    {
                    User::LeaveIfError( r );
                    }
                CleanupStack::PushL( content );
                
                DRM::MDrmErrorHandling& errorHandler = iDrmUiHandler->GetErrorHandler();
                errorHandler.HandleErrorL( *content, ContentAccess::EPlay, aError, NULL );

                CleanupStack::PopAndDestroy( content );
                }
            break;
            }
#else
            switch ( aError )
                {
                case KMPXRightsAboutToExpire:
                    {
                    if ( useFile )
                        {
                        ret = iDrmHelper->CheckRightsAmountL( *aFile );
                        }
                    else if ( filename.CompareF( KNullDesC ) != 0 )
                        {
                        ret = iDrmHelper->CheckRightsAmountL( filename );
                        }
                    break;
                    }
                default:
                    {
                    if ( useFile )
                        {
                        ret = iDrmHelper->HandleErrorOrPreviewL( aError, *aFile, previewUrl );
                        if( previewUrl )
                            {
                            delete previewUrl;
                            }
                        }
                    else if ( filename.CompareF( KNullDesC ) != 0 )
                        {
                        ret = iDrmHelper->HandleErrorOrPreviewL( aError, filename, previewUrl );
                        if( previewUrl )
                            {
                            delete previewUrl;
                            }
                        }
                    break;
                    }

#endif			
                }

    MPX_DEBUG2("CMPXDrmUiHelper::HandleOMAErrorL(%d) exiting, returning %d", ret);
    return ret;
    }

// -----------------------------------------------------------------------------
// Handles WMA specific error messages
// -----------------------------------------------------------------------------
//
TInt CMPXDrmUiHelper::HandleWMAErrorL(
    TInt aError,
    const CMPXMedia* aMedia,
    RFile* /*aFile*/ )
    {
    MPX_DEBUG2("CMPXDrmUiHelper::HandleWMAErrorL(%d) entering", aError);

    TInt ret( KErrNone );
    HBufC* notificationText( NULL );

    // Get filename of media
    TFileName filename( KNullDesC );
    if ( aMedia->IsSupported( KMPXMediaGeneralUri ) )
        {
        filename = aMedia->ValueText( KMPXMediaGeneralUri );
        }

    switch ( aError )
        {
        case KMPXRightsAboutToExpire:
            {
/*
            if ( aMedia->IsSupported( EMPXMediaDrmRightsType ))
                {
                TMPXMediaDrmRightsType type =
                    aMedia->ValueTObject<TMPXMediaDrmRightsType>(
                        EMPXMediaDrmRightsType );
                switch ( type )
                    {
                    case EMPXDrmRightsTypeTime:
                        {
                        TTime endTime = *aMedia->Value<TTime>(
                                            EMPXMediaDrmEndTime );
                        TTime currentTime;
                        currentTime.HomeTime();
                        TTimeIntervalDays daysRemain =
                            endTime.DaysFrom( currentTime );
                        TInt days( daysRemain.Int() );
                        if ( days < 1 )
                            {
                            notificationText = StringLoader::LoadLC(
                                R_MPX_CUI_WMDRM_RIGHTS_ABOUT_EXPIRE_NOTIFICATION );
                            }
                        else if ( days == 1 )
                            {
                            notificationText = StringLoader::LoadLC(
                                R_MPX_CUI_WMDRM_RIGHTS_ABOUT_EXPIRE_ONE_DAY_NOTIFICATION );
                            }
                        else
                            {
                            notificationText = StringLoader::LoadLC(
                                R_MUSICPLAYER_CUI_WMDRM_RIGHTS_ABOUT_EXPIRE_MULTIPLE_DAY_NOTIFICATION );
                            }
                        break;
                        }   // end case EMPXDrmRightsTypeTime
                    case EMPXDrmRightsTypeCount:
                    case EMPXDrmRightsTypeTimeCount:
                        {
                        TUint32 count(
                            aMedia->ValueTObject<TUint32>(
                                EMPXMediaDrmCount ));
                        if ( count <= KMPXWmaDrmAboutToExpireCount )
                            {
                            if ( count == 1 )
                                {
                                notificationText = StringLoader::LoadLC(
                                    R_MUSICPLAYER_CUI_WMDRM_RIGHTS_ACTIVATION_KEY_ONE_COUNT_NOTIFICATION );
                                }
                            else if ( count > 1 )
                                {
                                notificationText = StringLoader::LoadLC(
                                    R_MUSICPLAYER_CUI_WMDRM_RIGHTS_ACTIVATION_KEY_MORE_THAN_ONE_COUNT_NOTIFICATION );
                                }
                            }
                        }   // end case EMPXDrmRightsTypeCount, EMPXDrmRightsTypeTimeCount
                    default:
                        {
                        // do nothing
                        break;
                        }
                    }
                }
*/
            }   // end case KMPXRightsAboutToExpire
        case KErrCANotSupported:
        case KErrCANoPermission:
        case KErrCANoRights:
//        case KErrCANoAgent:
//        case KErrCAOutOfRange:
//        case KErrCAPendingRights:
//        case KErrCASizeNotDetermined:
//        case KErrCANewFileHandleRequired:
            {
            if ( filename.CompareF( KNullDesC ) != 0 )
                {
                TParsePtrC parse( filename );
                notificationText = StringLoader::LoadLC(
                    R_MPX_DRM_EXPIRED_PLAYBACK, parse.Name() );
                iCommonUiHelper->DisplayInfoNoteL( *notificationText );
                CleanupStack::PopAndDestroy( notificationText );
                notificationText = NULL;
                }
            break;
            }
        default:
            {
            break;
            }
        }

    MPX_DEBUG2("CMPXDrmUiHelper::HandleWMAErrorL(%d) exiting, returning %d", ret);
    return ret;
    }
#ifdef CAMESE_IN_DRM_UTILITY
// ----------------------------------------------------------------------------
// Called when valid rights are found
// ----------------------------------------------------------------------------
//
DRM::TCheckRightsAction CMPXDrmUiHelper::RightsLeft(
            TInt /*aOperationId*/,
            TBool /*aUnconstrained*/,
            TTimeIntervalSeconds /*aTime*/,
            TInt /*aCounts*/,
            TTimeIntervalSeconds /*aAccumulated*/ )
	{
	iRightsValid = ETrue;
	return DRM::EUHCheckRightsActionIgnore;
	}
 
// ----------------------------------------------------------------------------
// Called when there is no valid rights
// ----------------------------------------------------------------------------
//
DRM::TCheckRightsAction CMPXDrmUiHelper::RightsNotValid(
            TInt /*aOperationId*/,
            DRM::TCheckRightsStatus /*aRightsStatus*/,
            TInt /*aReason*/ )
	{
	iRightsValid = EFalse;

	// DrmUiHandling will ask for more rights
	return DRM::EUHCheckRightsActionDefault;
	}

// ----------------------------------------------------------------------------
// Unused observation method
// ----------------------------------------------------------------------------
//
DRM::TEmbeddedPreviewAction CMPXDrmUiHelper::EmbeddedPreviewAvailable(
            TInt /*aOperationId*/,
            const TDesC& /*aUniqueId*/,
            TInt /*aRightsStatus*/,
            TInt /*aReason*/ )
	{
	return DRM::EUEmbeddedPreviewActionIgnore;
	}

// ----------------------------------------------------------------------------
// Unused observation method
// ----------------------------------------------------------------------------
//
DRM::TPreviewRightsAction CMPXDrmUiHelper::PreviewRightsUrlAvailable(
            TInt /*aOperationId*/,
            const TDesC& /*aPreviewRightsUrl*/,
            TInt /*aRightsStatus*/,
            TInt /*aReason*/ )
	{
	return DRM::EUPreviewRightsActionIgnore;
	}

// ----------------------------------------------------------------------------
// Unused observation method
// ----------------------------------------------------------------------------
//
DRM::TSilentRightsAction CMPXDrmUiHelper::SilentRightsUrlAvailable(
            TInt /*aOperationId*/,
            const TDesC& /*aSilentRightsUrl*/,
            TInt /*aRightsStatus*/,
            TInt /*aReason*/ )
	{
	return DRM::EUSilentRightsActionDefault;
	}

// ----------------------------------------------------------------------------
// Unused observation method
// ----------------------------------------------------------------------------
//
DRM::TRightsAction CMPXDrmUiHelper::RightsUrlAvailable(
            TInt /*aOperationId*/,
            const TDesC& /*aRightsUrl*/,
            TInt /*aRightsStatus*/,
            TInt /*aReason*/,
            TInt /*aUrlType*/ )
	{
	return DRM::EURightsActionDefault;
	}

// ----------------------------------------------------------------------------
// Unused observation method
// ----------------------------------------------------------------------------
//
void CMPXDrmUiHelper::PreviewRightsAvailable(
            TInt /*aOperationId*/,
            TInt /*aError*/ )
	{
	}

// ----------------------------------------------------------------------------
// Unused observation method
// ----------------------------------------------------------------------------
//
void CMPXDrmUiHelper::SilentRightsAvailable(
            TInt /*aOperationId*/,
            TInt /*aError*/ )
	{
    }

// ----------------------------------------------------------------------------
// Unused observation method
// ----------------------------------------------------------------------------
//
void CMPXDrmUiHelper::RightsAvailable(
            TInt /*aOperationId*/,
            TInt /*aError*/ )
	{
	}

// ----------------------------------------------------------------------------
// Unused observation method
// ----------------------------------------------------------------------------
//
void CMPXDrmUiHelper::PlayEmbeddedPreviewSelected(
        TInt /*aOperationId*/,
        const TDesC& /*aUniqueId*/ )
	{
	}

// ----------------------------------------------------------------------------
// Unused observation method
// ----------------------------------------------------------------------------
//
void CMPXDrmUiHelper::OperationCompleted( 
		TInt /*aOperationId*/, TInt /*aOperationStatus*/ )
	{
	}
#endif		
//  End of File