profilesservices/ProfileEngine/WrapperSrc/CProEngToneHandler.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 15:29:50 +0300
branchRCL_3
changeset 24 8ee96d21d9bf
parent 0 8c5d936e5675
child 25 7e0eff37aedb
permissions -rw-r--r--
Revision: 201033 Kit: 201035

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



// INCLUDE FILES
#include    "CProEngToneHandler.h"
#include    "CProEngMediaVariation.h"
#include    <bautils.h> // BaflUtils
#include    <barsread.h>  // TResourceReader
#include    <barsc.h>  // RResourceFile
#include    <e32const.h> // KKilo
#include 	<centralrepository.h>
#include    <ProfileEngineDomainCRKeys.h> // KProEngRingingToneMaxSize
#include    <ProfileEng.hrh>

namespace
	{
	// CONSTANTS
	_LIT( KProEngROMDriveLetter, "Z:" );
	// The filename of the resource file
	_LIT( KProEngResourceFileName, "Z:ProEngWrapper.RSC" );
	}

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

// -----------------------------------------------------------------------------
// CProEngToneHandler::CProEngToneHandler
// C++ default constructor can NOT contain any code, that might leave.
// -----------------------------------------------------------------------------
//
CProEngToneHandler::CProEngToneHandler()
    {
    }

// -----------------------------------------------------------------------------
// CProEngToneHandler::ConstructL
// Symbian 2nd phase constructor can leave.
// -----------------------------------------------------------------------------
//
void CProEngToneHandler::ConstructL()
    {
    DrmConstructL();
    User::LeaveIfError( iFs.Connect() );
    iMediaVariation = CProEngMediaVariation::NewL();
    GetMaxToneFileSizeL( iToneFileSizeLimitKB );
    }

// -----------------------------------------------------------------------------
// CProEngToneHandler::NewLC
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CProEngToneHandler* CProEngToneHandler::NewLC()
    {
    CProEngToneHandler* self = new( ELeave ) CProEngToneHandler();
    CleanupStack::PushL( self );
    self->ConstructL();
    return self;
    }

// -----------------------------------------------------------------------------
// CProEngToneHandler::NewL
// Two-phased constructor.
// -----------------------------------------------------------------------------
//
CProEngToneHandler* CProEngToneHandler::NewL()
    {
    CProEngToneHandler* self = CProEngToneHandler::NewLC();
    CleanupStack::Pop( self );
    return self;
    }

// Destructor
CProEngToneHandler::~CProEngToneHandler()
    {
    delete iMediaVariation;
    iFs.Close();
    ReleaseDrm();
    }

// -----------------------------------------------------------------------------
// CProEngToneHandler::CheckToneFileL
// -----------------------------------------------------------------------------
//
TInt CProEngToneHandler::CheckToneFileL( const TDesC& aFileName, TInt aToneType )
    {
    // Check the file which is tried to set as ringing or alert tone.
    TInt returnValue( DoCheckToneFileL( aFileName, aToneType ) );
    if( returnValue != KErrNone )
        {
        return returnValue;
        }

    if( IsProtected( aFileName ) && CanSetAutomated( aFileName ) )
        {
        // If the file in question is unactivated protected content,
        // ask user if he/she wants to activate it.
        if( AskAutomated( aFileName ) == KErrCancel )
            {
            // User doesn't want to activate unactivated protected content.
            return KErrCancel;
            }
        }

    return KErrNone;
    }

// -----------------------------------------------------------------------------
// CProEngToneHandler::HandleAutomatedContentL
// -----------------------------------------------------------------------------
//
TInt CProEngToneHandler::HandleAutomatedContent( TProfileSettingId aSettingId,
                                                 const TDesC& aFileName,
                                                 const TDesC& aOldFileName)

    {
    // Register file as automated content
    TInt err( SetAutomated( aSettingId, aFileName ) );
    if( !err )
        {
        // Remove the old tone from the automated content list
        RemoveAutomated( aOldFileName );
        }

    return err;
    }

// -----------------------------------------------------------------------------
// CProEngToneHandler::DoCheckToneFileL
// -----------------------------------------------------------------------------
//
TInt CProEngToneHandler::DoCheckToneFileL( const TDesC& aFileName, TInt aToneType )
    {
    if( aFileName.Length() == 0 )
        {
        // The filename is empty, ok.
        // It will be changed to "No_sound.wav" when writing to Profiles Engine.
        return KErrNone;
        }

    if( !BaflUtils::FileExists( iFs, aFileName ) )
        {
        // The file does not exist. No good (start the dance).
        return KErrNotFound;
        }

    // The file exists. Check its data (MIME) type.
    TBuf< KMaxDataTypeLength > dataType;
    iMediaVariation->GetDataTypeL( aFileName, dataType );

    if( !iMediaVariation->IsSupported( dataType ) )
        {
        return KErrNotSupported;
        }


    // File size check for ringing tones 1&2
    if (aToneType == EProfileSettingIdRingingTone  ||
        aToneType == EProfileSettingIdRingingTone2)
        {
        if (KErrNone != CheckFileSizeLimit( aFileName ))
            {
            return KErrTooBig;
            }
        }

    // The file is a sound file. Can it be found on ROM
    if( aFileName.Left( KProEngROMDriveLetter().Length() ).
        CompareF( KProEngROMDriveLetter ) == 0 )
        {
        // Tone files on ROM are always valid
        return KErrNone;
        }

    TInt result( KErrNone );
    if( IsProtected( aFileName ) )
        {
        if( !iMediaVariation->IsAllowedProtected( dataType ) )
            {
            return KErrArgument;
            }

        result = CheckProtectedFileL( aFileName );

        }
    else if( !iMediaVariation->IsAllowedUnProtected( dataType ) )
        {
        result = KErrPermissionDenied;
        }
    return result;
    }

// -----------------------------------------------------------------------------
// CProEngToneHandler::ShowErrorNoteL
// -----------------------------------------------------------------------------
//
void CProEngToneHandler::ShowErrorNoteL( TInt /*aResourceId*/ )
    {
    }


// -----------------------------------------------------------------------------
// CProEngToneHandler::CheckFileSizeLimitL
// -----------------------------------------------------------------------------
//
TInt CProEngToneHandler::CheckFileSizeLimit( const TDesC& aFileName ) const
    {
    TInt error = KErrNone;

    if ( iToneFileSizeLimitKB )
        {
        if ( CheckToneFileSize( aFileName, iToneFileSizeLimitKB ) != KErrNone )
            {
            error = KErrTooBig;
            }
        }

    return error;
    }

// -----------------------------------------------------------------------------
// CProEngToneHandler::GetMaxToneFileSizeL
// -----------------------------------------------------------------------------
//
void CProEngToneHandler::GetMaxToneFileSizeL( TInt& aMaxSizeKB ) const
    {
	CRepository* cenrep = CRepository::NewL( KCRUidProfileEngine );
	TInt error = cenrep->Get( KProEngRingingToneMaxSize, aMaxSizeKB );
    delete cenrep;

	if ( error != KErrNone )
    	{
        aMaxSizeKB = 0;
    	}
	if ( aMaxSizeKB < 0 )
	    {
	     aMaxSizeKB = 0;
	    }
    }

// -----------------------------------------------------------------------------
// CProEngToneHandler::CheckToneFileSizeL
// -----------------------------------------------------------------------------
//
TInt CProEngToneHandler::CheckToneFileSize( const TDesC& aFile,
                                            TInt aSizeLimitKB ) const
    {
    // Get file size
    TInt size = 0;
    TInt error = KErrNone;

    TEntry entry;
    error = iFs.Entry( aFile, entry );
    if ( !error )
        {
        size = entry.iSize;
        }

    // Check
    aSizeLimitKB *= KKilo;
    if ( aSizeLimitKB  &&  size > aSizeLimitKB )
        {
        error = KErrTooBig;
        }

    return error;
    }

//  End of File