psln/PslnLibraryLoaders/src/pslnprofilesettingsloader.cpp
changeset 0 2f259fa3e83a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/psln/PslnLibraryLoaders/src/pslnprofilesettingsloader.cpp	Tue Feb 02 01:00:49 2010 +0200
@@ -0,0 +1,292 @@
+/*
+* Copyright (c) 2006-2007 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:  Wrapper for media gallery and profiles libraries.
+*
+*/
+
+#include <MProfile.h> 
+#include <MProfileTones.h>               
+#include <MProfilesNamesArray.h>
+#include <MProfileEngineExtended.h>
+#include <MProfileSetExtraTones.h>
+#include <MProfileSetTones.h>
+#include <MProfileExtended.h>
+#include <MProfileName.h>
+
+#include <DRMHelper.h>
+
+#ifdef RD_CONTENTNOTIFICATION
+#include <contentnotification.hrh>
+#include <contentcreatedevent.h>
+#include <contentnotification.h>
+#endif //RD_CONTENTNOTIFICATION
+#include <coemain.h>
+
+#include "pslnprofilesettingsloader.h"
+#include "PslnConst.h"
+
+#ifdef RD_CONTENTNOTIFICATION
+const TInt KPslnEventArraySize = 2;
+#endif // RD_CONTENTNOTIFICATION
+
+// ======== MEMBER FUNCTIONS ========
+
+// ---------------------------------------------------------------------------
+// C++ default constructor can NOT contain any code, that might leave.
+// ---------------------------------------------------------------------------
+//
+CPslnProfileSettingsLoader::CPslnProfileSettingsLoader()
+    {
+    }
+
+// ---------------------------------------------------------------------------
+// Two-phased constructor.
+// ---------------------------------------------------------------------------
+//
+CPslnProfileSettingsLoader* CPslnProfileSettingsLoader::NewL()
+    {
+    CPslnProfileSettingsLoader* self = 
+        new( ELeave ) CPslnProfileSettingsLoader();
+
+    return self;
+    }
+
+// ---------------------------------------------------------------------------
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CPslnProfileSettingsLoader::~CPslnProfileSettingsLoader()
+    {
+#ifdef RD_CONTENTNOTIFICATION
+    if ( iEventArray )
+        {
+        iEventArray->Delete( 0 );
+        iEventArray->Reset();        
+        }
+    delete iEventArray;
+#endif // RD_CONTENTNOTIFICATION
+    }
+
+// ---------------------------------------------------------------------------
+// Sets tone for all profiles.
+// ---------------------------------------------------------------------------
+//
+void CPslnProfileSettingsLoader::SetToneForProfilesL( 
+    TInt aType, TDes& aFullName )
+    {
+    MProfileEngineExtended* profileEngine = CreateProfileEngineExtendedL();
+    CleanupReleasePushL( *profileEngine );
+    MProfilesNamesArray* profileArray = profileEngine->ProfilesNamesArrayLC();
+
+    TInt arrayCount( profileArray->MdcaCount() );
+    TInt arrayIndex( 0 );
+    TInt profileId( 0 );
+    TInt activeId( profileEngine->ActiveProfileId() );
+
+    while( arrayIndex < arrayCount )
+    	{
+    	profileId = profileArray->ProfileName( arrayIndex )->Id();
+    	// Updating of the active profile will be done last to make sure that
+    	// UI gets the new value of the ringing tone if settings view is active
+    	// and it is containing settings of another than active profile
+    	if( profileId != activeId )
+    		{
+    	    TRAPD(r, DoSetProfileToneL( profileEngine, profileId, aType, aFullName ));
+    	    // Filter situation when profile is not allowed to be changed
+    	    // e.g. Drive-profile
+    	    if( ( r != KErrNone ) && ( r != KErrAccessDenied ) )
+    	    	{
+    	    	User::Leave( r );
+    	    	}
+    	    }
+    	arrayIndex ++;
+    	}	    
+
+    // Update the active profile:
+    TRAPD(r, DoSetProfileToneL( profileEngine, activeId, aType, aFullName ));
+    if( ( r != KErrNone ) && ( r != KErrAccessDenied ) )
+    	{
+        User::Leave( r );
+        }
+	CleanupStack::PopAndDestroy( 2 ); //profileEngine,profileArray
+    }
+
+// ---------------------------------------------------------------------------
+// Do Sets tone for all profiles.
+// ---------------------------------------------------------------------------
+//
+void CPslnProfileSettingsLoader::DoSetProfileToneL( MProfileEngineExtended* aProfileEngine,
+		TInt aProfileId, TInt aType,const TDesC& aFileName )
+	{
+	MProfileExtended* profile = aProfileEngine->ProfileLC( aProfileId );
+	CDRMHelper* drmHelper = CDRMHelper::NewLC();
+	
+	// Get the old tone in order to remove it from the automated content list
+	TFileName oldTone( ToneL( *profile, aType ) );
+
+	// Replace the old tone with the new tone
+	SetToneL( *profile, aType, aFileName );
+	
+	// Commit changes. Write the new settings to the Profiles Engine
+	aProfileEngine->CommitChangeL( *profile );
+
+	// Register file as automated content
+	TInt err( SetAutomated( drmHelper, aType, aFileName ) );
+	if( err == KErrNone )
+		{
+	    // Remove old tone from the automated content list
+	    RemoveAutomated( drmHelper,oldTone );
+	    }
+	else
+		{
+	    // Put the old tone back into Profiles:
+	    TRAP_IGNORE(
+	    		SetToneL( *profile, aType, oldTone );
+	    		aProfileEngine->CommitChangeL( *profile );
+	            );
+	    }
+
+	CleanupStack::PopAndDestroy( 2 ); // profile,drmHelper
+	}
+
+// ---------------------------------------------------------------------------
+// SetTones.
+// ---------------------------------------------------------------------------
+//
+void CPslnProfileSettingsLoader::SetToneL( MProfileExtended& aProfile,
+   		TInt aType, const TDesC& aFileName )
+	{
+	MProfileSetTones& setTones = aProfile.ProfileSetTones();
+	switch ( aType )
+		{
+		case EAknsMinorSoundRingingTone:
+			setTones.SetRingingTone1L( aFileName );
+			break;
+		case EAknsMinorSoundMessageAlert:
+			setTones.SetMessageAlertToneL( aFileName );
+			break;
+		default:
+			User::Leave( KErrArgument );
+			break;
+		}
+	}
+
+// ---------------------------------------------------------------------------
+// Read Tones.
+// ---------------------------------------------------------------------------
+//
+const TDesC& CPslnProfileSettingsLoader::ToneL( MProfileExtended& aProfile,
+   		TInt aType )
+	{
+	const MProfileTones& tones = aProfile.ProfileTones();	
+	switch ( aType )
+		{
+		case EAknsMinorSoundRingingTone:
+			{
+			return tones.RingingTone1();
+			}
+		case EAknsMinorSoundMessageAlert:
+			{
+			return tones.MessageAlertTone();
+			}
+		default:
+			User::Leave( KErrArgument );
+			break;
+		}
+	return KNullDesC;
+	}
+
+// -----------------------------------------------------------------------------
+// SetAutomated
+// -----------------------------------------------------------------------------
+//
+TInt CPslnProfileSettingsLoader::SetAutomated( CDRMHelper* aDrmHelper,TInt aType,
+                                        const TDesC& aFileName )
+    {
+    switch ( aType )
+    	{
+		case EAknsMinorSoundRingingTone:
+			aDrmHelper->SetAutomatedType( CDRMHelper::EAutomatedTypeRingingTone );
+			break;
+    	case EAknsMinorSoundMessageAlert:
+    		aDrmHelper->SetAutomatedType( CDRMHelper::EAutomatedTypeMessageAlert );
+    		break;
+    	default:
+    		aDrmHelper->SetAutomatedType( CDRMHelper::EAutomatedTypeOther );
+    	}
+    return aDrmHelper->SetAutomatedSilent( aFileName, EFalse );
+    }
+
+// -----------------------------------------------------------------------------
+// RemoveAutomated
+// -----------------------------------------------------------------------------
+//
+void CPslnProfileSettingsLoader::RemoveAutomated( CDRMHelper* aDrmHelper,const TDesC& aFileName )
+    {
+    aDrmHelper->RemoveAutomatedPassive( aFileName ); // ignore return value
+    }
+
+// ---------------------------------------------------------------------------
+// Indicates to the Media Gallery that new file has been copied.
+// ---------------------------------------------------------------------------
+//
+void CPslnProfileSettingsLoader::IndicateFileUpdationL( const TDesC& aFullPath )
+    {
+	// Notice: this code is used to avoid the building warning!
+    aFullPath.Length();
+#ifdef RD_CONTENTNOTIFICATION
+	CContentNotification* notifier = CContentNotification::NewL();
+    CleanupStack::PushL( notifier );
+
+    if ( iEventArray )
+        {
+        iEventArray->Delete( 0 );
+        iEventArray->Reset();
+        delete iEventArray;
+        iEventArray = NULL;
+        }
+
+    iEventArray =
+        new CArrayFixFlat<CContentNotificationEvent*>(KPslnEventArraySize);
+
+	// Nofication about new content
+	CContentNotificationEvent* event = 
+        CContentCreatedEvent::NewL( aFullPath );
+    CleanupStack::PushL( event );
+    iEventArray->AppendL( event );
+    CleanupStack::Pop( event ); // array owns the event
+
+	// Send all notification event with one call
+    User::LeaveIfError( notifier->SendNotification( iEventArray->Array() ) );
+    delete event;
+    event = NULL;
+    CleanupStack::PopAndDestroy( notifier );
+#endif //RD_CONTENTNOTIFICATION
+    }
+
+//----------------------------------------------------------------------------
+// Launcher gate function
+//----------------------------------------------------------------------------
+EXPORT_C TAny* GateFunction()
+    {
+    CPslnProfileSettingsLoader* launcher = NULL;
+    TRAPD( err, launcher = CPslnProfileSettingsLoader::NewL() );
+    if( err != KErrNone )
+        {
+        return NULL;
+        }
+    return launcher;
+    }
+
+//  End of File