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