profilesservices/ProfileEngine/WrapperSrc/CProEngToneHandler.cpp
changeset 0 8c5d936e5675
child 18 e3554c9069b6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/profilesservices/ProfileEngine/WrapperSrc/CProEngToneHandler.cpp	Thu Dec 17 08:52:52 2009 +0200
@@ -0,0 +1,306 @@
+/*
+* 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