profilesservices/ProfileEngine/WrapperSrc/CProEngToneHandler.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:20:44 +0100
branchRCL_3
changeset 25 7e0eff37aedb
parent 24 8ee96d21d9bf
permissions -rw-r--r--
Revert incorrect RCL_3 drop: 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    <bautils.h> // BaflUtils
#include    <AknGlobalNote.h> // CAknGlobalNote
#include    <barsread.h>  // TResourceReader
#include    <barsc.h>  // RResourceFile
#include    <e32const.h> // KKilo
#include    "CProEngMediaVariation.h"
#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 )
    {
	TParse* fp = new(ELeave) TParse();
	fp->Set(KProEngResourceFileName, &KDC_RESOURCE_FILES_DIR, NULL);
	TFileName localizedFileName( fp->FullName() );
	delete fp;

    BaflUtils::NearestLanguageFile( iFs, localizedFileName );

    RResourceFile resourceFile;
    resourceFile.OpenL( iFs, localizedFileName );
    CleanupClosePushL( resourceFile );
    resourceFile.ConfirmSignatureL();

    HBufC8* resBuf = resourceFile.AllocReadLC( aResourceId );
    TResourceReader reader;
    reader.SetBuffer( resBuf );
    TPtrC errorText( reader.ReadTPtrC() );

    CAknGlobalNote* note = CAknGlobalNote::NewLC();
    note->ShowNoteL( EAknGlobalInformationNote, errorText );

	CleanupStack::PopAndDestroy( 3, &resourceFile );
    }


// -----------------------------------------------------------------------------
// 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