profilesservices/ProfileEngine/WrapperSrc/CProEngToneHandlerDrmFull.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 25 May 2010 13:00:04 +0300
branchRCL_3
changeset 17 3b47783fdf16
parent 0 8c5d936e5675
child 24 8ee96d21d9bf
permissions -rw-r--r--
Revision: 201019 Kit: 2010121

/*
* Copyright (c) 2002-2004 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: Implementation of the CProEngToneHandler.
*
*/



// INCLUDE FILES
#include    "CProEngToneHandler.h"

#include    <DRMHelper.h>
#include    <DRMCommon.h>
#include    <proengwrapper.rsg>

#include <caf/caf.h>


// ============================ LOCAL FUNCTIONS ================================

CDRMHelper::TDRMHelperAutomatedType SettingIdToAutomatedType( TProfileSettingId aSettingId )
    {
    switch( aSettingId )
        {
        case EProfileSettingIdRingingTone:
        case EProfileSettingIdRingingTone2:
            {
            return CDRMHelper::EAutomatedTypeRingingTone;
            }
        case EProfileSettingIdMsgTone:
            {
            return CDRMHelper::EAutomatedTypeMessageAlert;
            }
        case EProfileSettingIdEmailTone:
            {
            return CDRMHelper::EAutomatedTypeEmailAlert;
            }
        default:
            {
            return CDRMHelper::EAutomatedTypeOther;
            }
        }
    }

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

// -----------------------------------------------------------------------------
// CProEngToneHandler::DrmConstructL
// 2nd phase construct for DRM objects
// -----------------------------------------------------------------------------
//
void CProEngToneHandler::DrmConstructL()
    {
    iDrmCommon = DRMCommon::NewL();
    iDrmHelper = CDRMHelper::NewL();
    }

// -----------------------------------------------------------------------------
// CProEngToneHandler::ReleaseDrm
// Destructor for DRM objects
// -----------------------------------------------------------------------------
//
void CProEngToneHandler::ReleaseDrm()
    {
    delete iDrmHelper;
    iDrmHelper = NULL;
    delete iDrmCommon;
    iDrmCommon = NULL;
    }

// -----------------------------------------------------------------------------
// CProEngToneHandler::CheckProtectedFileL
// -----------------------------------------------------------------------------
//
TInt CProEngToneHandler::CheckProtectedFileL( const TDesC& aFileName )
    {
    DRMCommon::TContentProtection protection;
    HBufC8* mimeType = NULL; // ignored
    HBufC8* contentUri = NULL;
    TUint dataLength; // ignored
    TInt err = iDrmCommon->GetFileInfo( aFileName, protection, mimeType,
                                        contentUri, dataLength );
    delete mimeType;
    if( err )
        {
        delete contentUri;
        User::Leave( err );
        }
    CleanupStack::PushL( contentUri );

    TInt result( KErrGeneral );
    CDRMRights* rights = NULL;
    err = iDrmCommon->GetActiveRights( *contentUri, DRMCommon::EPlay, rights );

    CleanupStack::PopAndDestroy( contentUri );

    if( rights == NULL )
        {
        if( err == DRMCommon::ENoRights )
            {
            // Handle "No rights" situation here
            iDrmHelper->HandleErrorL( DRMCommon::ENoRights, aFileName );
            return result;
            }
        else
            {
            User::Leave( KErrGeneral );
            }
        }

    CleanupStack::PushL( rights );
    
	switch ( err )
		{
		case CDRMRights::EFullRights: // Fall through
		case CDRMRights::ERestrictedRights:
			{
			CDRMRights::TRestriction restriction; // ignore
			CDRMRights::TExpiration expiration;
			TUint32 constType;
			
			rights->GetRightsInfo( DRMCommon::EPlay, restriction, // ignore return
                                   expiration, constType );       // value
		
            // This is CFM protected file, ringingtone is set to "no"
            if ( ( rights->GetPermission().iInfoBits & ENoRingingTone )
                // This is normal DRM protected count-based tone
                || ( constType & CDRMRights::ECountBased ) )
                    {
                    ShowErrorNoteL( R_PROENG_TEXT_DRM_PREV_RIGHTS_SET );
                    }		
                else
                    {
                    switch ( expiration )
                        {
                        case CDRMRights::EValidRights:
                            {
                            result = KErrNone;
                            break;
                            }

                        case CDRMRights::EFutureRights:
                            {
                            iDrmHelper->HandleErrorL( DRMCommon::ENoRights,
                                                      aFileName );
                            break;
                            }

                        case CDRMRights::EExpiredRights: 
                            {
                            iDrmHelper->HandleErrorL( DRMCommon::ERightsExpired,
                                                      aFileName );
                            break;
                            }

                        default:
                            {
                            break;
                            }
                        }	

                    }
				

			break;
			}

		case CDRMRights::EPreviewRights:
			{
			ShowErrorNoteL( R_PROENG_TEXT_DRM_PREV_RIGHTS_SET );
			break;
			}

		case DRMCommon::ENoRights:
			{
			iDrmHelper->HandleErrorL( DRMCommon::ENoRights, aFileName );
			break;
			}

		default:
			{
			break;
			}

		}
   
    CleanupStack::PopAndDestroy( rights );

	return result;
    }

// -----------------------------------------------------------------------------
// CProEngToneHandler::CanSetAutomated
// -----------------------------------------------------------------------------
//
TBool CProEngToneHandler::CanSetAutomated( const TDesC& aFileName )
    {
    TBool canSetAutomated( EFalse );
    return
        ( iDrmHelper->CanSetAutomated( aFileName, canSetAutomated ) == KErrNone
        && canSetAutomated );
    }

// -----------------------------------------------------------------------------
// CProEngToneHandler::AskAutomated
// -----------------------------------------------------------------------------
//
TInt CProEngToneHandler::AskAutomated( const TDesC& aFileName )
    {
    return iDrmHelper->ShowAutomatedNote( aFileName );
    }

// -----------------------------------------------------------------------------
// CProEngToneHandler::SetAutomated
// -----------------------------------------------------------------------------
//
TInt CProEngToneHandler::SetAutomated( TProfileSettingId aSettingId,
                                       const TDesC& aFileName )
    {
    TInt err = KErrNone;

    TRAP_IGNORE( err = SetAutomatedL( aSettingId, aFileName ) );

    return err;
    }

// -----------------------------------------------------------------------------
// CProEngToneHandler::SetAutomatedL
// -----------------------------------------------------------------------------
//
TInt CProEngToneHandler::SetAutomatedL( TProfileSettingId aSettingId,
                                       const TDesC& aFileName )
    {
    iDrmHelper->SetAutomatedType( SettingIdToAutomatedType( aSettingId ) );
    TInt err( iDrmHelper->SetAutomatedSilent( aFileName, EFalse ) );
    if( err == KErrNone )
        {
        using namespace ContentAccess;
       	TVirtualPathPtr path( aFileName, KDefaultContentObject );
        CData* data = CData::NewLC( path, EContentShareReadWrite );
        err = data->ExecuteIntent( EPlay );
        CleanupStack::PopAndDestroy( data );
        // According to Risto Vilkman from DRM, KErrAccessDenied
        // can be ignored at this point, since if
        // CanSetAutomated says the tone is OK, it's OK.
        if( err == KErrAccessDenied )
        	{
        	err = KErrNone;
        	}
        }
    return err;
    }

// -----------------------------------------------------------------------------
// CProEngToneHandler::RemoveAutomated
// -----------------------------------------------------------------------------
//
void CProEngToneHandler::RemoveAutomated( const TDesC& aFileName )
    {
    iDrmHelper->RemoveAutomatedPassive( aFileName ); // ignore return value
    }

// -----------------------------------------------------------------------------
// CProEngToneHandler::IsProtected
// -----------------------------------------------------------------------------
//
TBool CProEngToneHandler::IsProtected( const TDesC& aFileName ) const
    {
    TBool result = EFalse;
    TRAP_IGNORE( result = IsProtectedL( aFileName ) );
    return result;
    }

// -----------------------------------------------------------------------------
// CProEngToneHandler::IsProtectedL
// -----------------------------------------------------------------------------
//
TBool CProEngToneHandler::IsProtectedL( const TDesC& aFileName ) const
    {
    TInt isProtected( EFalse );
   	ContentAccess::TVirtualPathPtr path( aFileName,
   						ContentAccess::KDefaultContentObject );
   	CData* data = CData::NewLC( path, EContentShareReadWrite );
   	TInt result = data->GetAttribute( EIsProtected, isProtected );
   	CleanupStack::PopAndDestroy(); // data

    return( ( result == DRMCommon::EOk ) && isProtected );
    }

//  End of File