--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/profilesapplication/Profiles/GSProfilesPlugin/src/GSProfilesPlugin.cpp Wed Sep 01 12:30:29 2010 +0100
@@ -0,0 +1,587 @@
+/*
+* Copyright (c) 2005 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: GSProfilesPlugin implementation.
+*
+*/
+
+
+// User includes
+#include "GSProfilesPlugin.h"
+#include <gsparentplugin.h>
+#include <gscommon.hrh>
+#include <gsprofilespluginrsc.rsg> // GUI Resource
+#include <gsprofilesplugin.mbg>
+#include <gsprivatepluginproviderids.h>
+#include <ProfileEngineSDKCRKeys.h>
+#include <hwrmvibrasdkcrkeys.h>
+
+// System includes
+#include <apadoc.h>
+#include <AknNullService.h>
+#include <bautils.h>
+#include <StringLoader.h>
+#include <centralrepository.h>
+
+#include <ProEngFactory.h>
+#include <MProfileEngine.h>
+#include <MProfile.h>
+#include <MProfileTones.h>
+#include <MProEngToneSettings.h>
+#include <MProfileExtraSettings.h>
+#include <MProfileFeedbackSettings.h>
+#include <TProfileToneSettings.h>
+
+#include <ProfileEng.hrh>
+#include <ProfileEngineInternalCRKeys.h>
+
+// PSM client
+#include <psmclient.h>
+#include <psmsettings.h>
+#include <e32property.h>
+#include <MProfileEngineExtended.h>
+#include <MProfileExtended.h>
+#include <ProfileEnginePrivatePSKeys.h>
+
+
+// ========================= MEMBER FUNCTIONS ================================
+
+// ---------------------------------------------------------------------------
+// CGSProfilesPlugin::CGSProfilesPlugin
+//
+// ---------------------------------------------------------------------------
+//
+CGSProfilesPlugin::CGSProfilesPlugin()
+ : iResources( *iCoeEnv ), iNullService(NULL)
+ {
+ }
+
+
+// ---------------------------------------------------------------------------
+// CGSProfilesPlugin::~CGSProfilesPlugin
+//
+// ---------------------------------------------------------------------------
+//
+CGSProfilesPlugin::~CGSProfilesPlugin()
+ {
+ iResources.Close();
+
+ if ( iNullService )
+ {
+ delete iNullService;
+ }
+ }
+
+
+// ---------------------------------------------------------------------------
+// CGSProfilesPlugin::ConstructL
+//
+// ---------------------------------------------------------------------------
+//
+void CGSProfilesPlugin::ConstructL()
+ {
+ OpenLocalizedResourceFileL( KGSProfilesPluginResourceFileName, iResources );
+ }
+
+
+// ---------------------------------------------------------------------------
+// CGSProfilesPlugin::NewL
+//
+// ---------------------------------------------------------------------------
+//
+CGSProfilesPlugin* CGSProfilesPlugin::NewL( TAny* /*aInitParams*/ )
+ {
+ CGSProfilesPlugin* self = new ( ELeave ) CGSProfilesPlugin();
+ CleanupStack::PushL(self);
+ self->ConstructL();
+ CleanupStack::Pop(self);
+ return self;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CGSProfilesPlugin::Id (from CGSPluginInterface)
+//
+// -----------------------------------------------------------------------------
+//
+TUid CGSProfilesPlugin::Id() const
+ {
+ return KGSProfilesPluginImplUID;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CGSProfilesPlugin::DoActivateL (from CGSPluginInterface)
+//
+// -----------------------------------------------------------------------------
+//
+void CGSProfilesPlugin::DoActivateL( const TVwsViewId& /*aPrevViewId*/,
+ TUid /*aCustomMessageId*/,
+ const TDesC8& /*aCustomMessage*/ )
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+// CGSProfilesPlugin::DoDeactivate (from CGSPluginInterface)
+//
+// -----------------------------------------------------------------------------
+//
+void CGSProfilesPlugin::DoDeactivate()
+ {
+ }
+
+
+
+// -----------------------------------------------------------------------------
+// CGSProfilesPlugin::GetCaptionL (from CGSPluginInterface)
+//
+// -----------------------------------------------------------------------------
+//
+void CGSProfilesPlugin::GetCaptionL( TDes& aCaption ) const
+ {
+ HBufC* result = StringLoader::LoadL( R_GS_PROFILES_PLUGIN_CAPTION );
+
+ if (result->Des().Length() < aCaption.MaxLength())
+ {
+ aCaption.Copy( *result );
+ }
+ else
+ {
+ aCaption = KNullDesC;
+ }
+
+ delete result;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CGSProfilesPlugin::PluginProviderCategory (from CGSPluginInterface)
+//
+// -----------------------------------------------------------------------------
+//
+TInt CGSProfilesPlugin::PluginProviderCategory() const
+ {
+ return KGSPluginProviderInternal;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CGSProfilesPlugin::ItemType (from CGSPluginInterface)
+//
+// -----------------------------------------------------------------------------
+//
+TGSListboxItemTypes CGSProfilesPlugin::ItemType()
+ {
+ return EGSItemTypeSettingDialog;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CGSProfilesPlugin::GetValue (from CGSPluginInterface)
+//
+// -----------------------------------------------------------------------------
+//
+void CGSProfilesPlugin::GetValue( const TGSPluginValueKeys /*aKey*/,
+ TDes& /*aValue*/ )
+ {
+ }
+
+
+// -----------------------------------------------------------------------------
+// CGSProfilesPlugin::HandleSelection (from CGSPluginInterface)
+//
+// -----------------------------------------------------------------------------
+//
+void CGSProfilesPlugin::HandleSelection(
+ const TGSSelectionTypes /*aSelectionType*/ )
+ {
+ TRAP_IGNORE( LaunchProfilesAppL() );
+ }
+
+// ---------------------------------------------------------------------------
+// CGSProfilesPlugin::CreateIconL (from CGSPluginInterface)
+//
+// ---------------------------------------------------------------------------
+//
+
+CGulIcon* CGSProfilesPlugin::CreateIconL( const TUid aIconType )
+ {
+ CGulIcon* icon;
+ TParse* fp = new ( ELeave ) TParse();
+ CleanupStack::PushL( fp );
+ fp->Set( KGSProfilesPluginIconDirAndName, &KDC_BITMAP_DIR, NULL );
+
+ if ( aIconType == KGSIconTypeLbxItem )
+ {
+ icon = AknsUtils::CreateGulIconL(
+ AknsUtils::SkinInstance(),
+ KAknsIIDQgnPropCpPersoProf,
+ fp->FullName(),
+ EMbmGsprofilespluginQgn_prop_cp_perso_prof,
+ EMbmGsprofilespluginQgn_prop_cp_perso_prof_mask );
+ }
+ else
+ {
+ icon = CGSPluginInterface::CreateIconL( aIconType );
+ }
+
+ CleanupStack::PopAndDestroy( fp );
+
+ return icon;
+ }
+
+
+// -----------------------------------------------------------------------------
+// CGSProfilesPlugin::OpenLocalizedResourceFileL
+//
+// -----------------------------------------------------------------------------
+//
+void CGSProfilesPlugin::OpenLocalizedResourceFileL(
+ const TDesC& aResourceFileName,
+ RConeResourceLoader& aResourceLoader )
+ {
+ RFs fsSession;
+ User::LeaveIfError( fsSession.Connect() );
+ CleanupClosePushL(fsSession);
+
+ // Find the resource file:
+ TParse parse;
+ parse.Set( aResourceFileName, &KDC_RESOURCE_FILES_DIR, NULL );
+ TFileName fileName( parse.FullName() );
+
+ // Get language of resource file:
+ BaflUtils::NearestLanguageFile( fsSession, fileName );
+
+ // Open resource file:
+ aResourceLoader.OpenL( fileName );
+
+ CleanupStack::PopAndDestroy(&fsSession);
+ }
+
+
+// -----------------------------------------------------------------------------
+// CGSProfilesPlugin::LaunchProfilesAppL
+//
+// -----------------------------------------------------------------------------
+//
+void CGSProfilesPlugin::LaunchProfilesAppL()
+ {
+ // Get the correct application data
+ RWsSession ws;
+ User::LeaveIfError(ws.Connect());
+ CleanupClosePushL(ws);
+
+ // Find the task with uid
+ TApaTaskList taskList(ws);
+ TApaTask task = taskList.FindApp( KGsProfilesAppUid );
+
+ if ( task.Exists() )
+ {
+ task.BringToForeground();
+ }
+ else
+ {
+ //Launch Profiles application as embedded
+ TAppInfo app( KGsProfilesAppUid, KGSProfilesApp );
+ iEmbedded=NULL;
+ EmbedAppL( app );
+ }
+ CleanupStack::PopAndDestroy(&ws);
+ }
+
+
+// -----------------------------------------------------------------------------
+// CGSProfilesPlugin::EmbedAppL
+//
+// -----------------------------------------------------------------------------
+//
+void CGSProfilesPlugin::EmbedAppL( const TAppInfo& aApp )
+ {
+ // Launch settings app
+ if ( iNullService )
+ {
+ delete iNullService;
+ iNullService = NULL;
+ }
+ iNullService = CAknNullService::NewL( aApp.iUid, this );
+ }
+
+
+
+/******************************************************************************
+ * class CPSMProfilesPlugin
+ ******************************************************************************/
+
+
+//
+// config file goes to:
+// \epoc32\release\winscw\udeb\Z\private\2000B187 (emulator)
+// \epoc32\data\Z\private\2000B187 (image)
+//
+
+
+
+// ----------------------------------------------------------------------------------
+// CPSMProfilesPlugin::CPSMProfilesPlugin()
+// ----------------------------------------------------------------------------------
+//
+CPSMProfilesPlugin::CPSMProfilesPlugin( TPsmPluginCTorParams& aInitParams ) :
+ CPsmPluginBase( aInitParams )
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// CPSMProfilesPlugin::ConstructL(
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CPSMProfilesPlugin::ConstructL()
+ {
+ }
+
+
+// ----------------------------------------------------------------------------------
+// CPSMProfilesPlugin::NewL()
+// ----------------------------------------------------------------------------------
+//
+CPSMProfilesPlugin* CPSMProfilesPlugin::NewL( TPsmPluginCTorParams& aInitParams )
+ {
+ CPSMProfilesPlugin* self = new ( ELeave ) CPSMProfilesPlugin( aInitParams );
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+
+ return self;
+ }
+
+
+// ----------------------------------------------------------------------------------
+// CPSMProfilesPlugin::~CPSMProfilesPlugin()
+// ----------------------------------------------------------------------------------
+//
+CPSMProfilesPlugin::~CPSMProfilesPlugin()
+ {
+ }
+
+
+
+// ----------------------------------------------------------------------------------
+// CPSMProfilesPlugin::NotifyModeChange (from CPsmPluginBase)
+// ----------------------------------------------------------------------------------
+//
+void CPSMProfilesPlugin::NotifyModeChange( const TInt aMode )
+ {
+ TInt ignoreError = KErrNone;
+
+ TRAP( ignoreError, NotifyModeChangeL( aMode) );
+ }
+
+
+// ----------------------------------------------------------------------------------
+// CPSMProfilesPlugin::NotifyModeChangeL()
+// ----------------------------------------------------------------------------------
+//
+void CPSMProfilesPlugin::NotifyModeChangeL( const TInt aMode )
+ {
+ TPsmSettingItems set;
+
+ if ( aMode == EPsmsrvModeNormal || aMode == EPsmsrvPartialMode )
+ {
+ GetActiveProfileSettingsL( set );
+ }
+ else if ( aMode == EPsmsrvModePowerSave )
+ {
+ GetPsmConfigSettingsL( set );
+ }
+ else
+ {
+ User::Leave( KErrUnknown );
+ }
+
+ CRepository* cenrep = CRepository::NewLC( KCRUidVibraCtrl );
+ User::LeaveIfError( cenrep->Set( KVibraCtrlProfileVibraEnabled,
+ set.iVibraAlert ) );
+ User::LeaveIfError( cenrep->Set( KVibraCtrlProfileFeedbackEnabled,
+ set.iTactileFeedback ) );
+ CleanupStack::PopAndDestroy( cenrep );
+
+ cenrep = CRepository::NewLC( KCRUidProfileEngine );
+ User::LeaveIfError( cenrep->Set( KProEngActiveKeypadVolume,
+ set.iKeypadVolume ) );
+ User::LeaveIfError( cenrep->Set( KProEngActiveAudioFeedback,
+ set.iAudioFeedback ) );
+ User::LeaveIfError( cenrep->Set( KProEngActiveTactileFeedback,
+ set.iTactileFeedback ) );
+ CleanupStack::PopAndDestroy( cenrep );
+
+ // Set up internal PSM PubSub key
+ _LIT_SECURITY_POLICY_PASS( KProfileEngReadPolicy );
+ const TSecurityPolicy KProfileEngWritePolicy( ECapabilityWriteDeviceData );
+ TInt err = RProperty::Define( KPSUidProfileEngine,
+ KProEngPsmChanged, RProperty::EInt,
+ KProfileEngReadPolicy, KProfileEngWritePolicy );
+ if( err == KErrNone || err == KErrAlreadyExists )
+ {
+ RProperty::Set( KPSUidProfileEngine, KProEngPsmChanged, aMode );
+
+ // Notify engine about power save mode change
+ MProfileEngine* profileEngine = CreateProfileEngineL();
+ CleanupReleasePushL( *profileEngine );
+ TInt activeProfileId = profileEngine->ActiveProfileId();
+ CleanupStack::PopAndDestroy( profileEngine );
+
+ MProfileEngineExtended* engine = CreateProfileEngineExtendedL();
+ CleanupReleasePushL( *engine );
+ MProfileExtended* profile = engine->ProfileL( activeProfileId );
+ CleanupReleasePushL( *profile );
+
+ // CommitChangeL is needed so that an event will be created for profile
+ // modification listeners.
+ engine->CommitChangeL( *profile );
+
+ CleanupStack::PopAndDestroy( profile );
+ CleanupStack::PopAndDestroy( engine );
+ }
+
+ }
+
+
+// ----------------------------------------------------------------------------------
+// CPSMProfilesPlugin::GetActiveProfileSettingsL()
+// ----------------------------------------------------------------------------------
+//
+void CPSMProfilesPlugin::GetActiveProfileSettingsL( TPsmSettingItems& aSettings )
+ {
+ CRepository* repository = CRepository::NewLC( KCRUidProfileEngine );
+
+ TInt activeProfile = KErrNotFound;
+ User::LeaveIfError( repository->Get( KProEngActiveProfile, activeProfile ) );
+
+ TInt num = ResolveKey( EProfileSettingIdVibra, activeProfile );
+ User::LeaveIfError( repository->Get( num, aSettings.iVibraAlert ) );
+
+ num = ResolveKey( EProfileSettingIdKeypadVolume, activeProfile );
+ User::LeaveIfError( repository->Get( num, aSettings.iKeypadVolume ) );
+
+ num = ResolveKey( EProfileSettingIdTactileFeedback, activeProfile );
+ User::LeaveIfError( repository->Get( num, aSettings.iTactileFeedback ) );
+
+ num = ResolveKey( EProfileSettingIdAudioFeedback, activeProfile );
+ User::LeaveIfError( repository->Get( num, aSettings.iAudioFeedback ) );
+
+ CleanupStack::PopAndDestroy( repository );
+
+ return;
+ }
+
+
+// ----------------------------------------------------------------------------------
+// CPSMProfilesPlugin::GetActiveProfileSettingsL()
+// ----------------------------------------------------------------------------------
+//
+/*
+void CPSMProfilesPlugin::GetActiveProfileSettings2L( TPsmSettingItems& aSettings )
+ {
+ MProfileEngine* profileEngine = CreateProfileEngineL();
+ CleanupReleasePushL( *profileEngine );
+
+ MProfile* activeProfile = profileEngine->ActiveProfileLC();
+
+ const MProfileTones& tones = activeProfile->ProfileTones();
+ const TProfileToneSettings& ts = tones.ToneSettings();
+
+ aSettings.iVibraAlert = ts.iVibratingAlert;
+ aSettings.iKeypadVolume = ts.iKeypadVolume;
+
+ const MProfileExtraSettings& extra = activeProfile->ProfileExtraSettings();
+ const MProfileFeedbackSettings& feedBack = extra.ProfileFeedbackSettings();
+ aSettings.iTactileFeedback = feedBack.TactileFeedback();
+ aSettings.iAudioFeedback = feedBack.AudioFeedback();
+
+ CleanupStack::PopAndDestroy(); // profile
+ CleanupStack::PopAndDestroy( profileEngine );
+ }
+*/
+
+// ----------------------------------------------------------------------------------
+// CPSMProfilesPlugin::GetPsmConfigSettingsL()
+// ----------------------------------------------------------------------------------
+//
+void CPSMProfilesPlugin::GetPsmConfigSettingsL( TPsmSettingItems& aSettings )
+ {
+ RConfigInfoArray arr;
+ CleanupClosePushL( arr );
+
+ TPsmsrvConfigInfo info;
+ info.iConfigId = EPsmPluginKeyVibra;
+ info.iConfigType = EConfigTypeInt;
+ info.iIntValue = KErrNotFound;
+ User::LeaveIfError( arr.Append( info ) );
+
+ info.iConfigId = EPsmPluginKeyKbdVolume;
+ info.iConfigType = EConfigTypeInt;
+ info.iIntValue = KErrNotFound;
+ User::LeaveIfError( arr.Append( info ) );
+
+ info.iConfigId = EPsmPluginTactileFeedback ;
+ info.iConfigType = EConfigTypeInt;
+ info.iIntValue = KErrNotFound;
+ User::LeaveIfError( arr.Append( info ) );
+
+ info.iConfigId = EPsmPluginAudioFeedback;
+ info.iConfigType = EConfigTypeInt;
+ info.iIntValue = KErrNotFound;
+ User::LeaveIfError( arr.Append( info ) );
+
+ iSettingsProvider.GetSettingsL( arr, KGSProfilesPluginUID.iUid );
+
+ aSettings.iVibraAlert = arr[0].iIntValue;
+ aSettings.iKeypadVolume = arr[1].iIntValue;
+ aSettings.iTactileFeedback = arr[2].iIntValue;
+ aSettings.iAudioFeedback = arr[3].iIntValue;
+
+ CleanupStack::PopAndDestroy( &arr );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CPSMProfilesPlugin::ResolveKey
+//
+// -----------------------------------------------------------------------------
+//
+TUint32 CPSMProfilesPlugin::ResolveKey( TUint aPartialKey, TInt aProfileId )
+ {
+ const TInt KProfileIdShift = 24;
+
+ return ( ( aProfileId << KProfileIdShift ) | aPartialKey );
+ }
+
+
+// -----------------------------------------------------------------------------
+// CPSMProfilesPlugin::Panic
+//
+// -----------------------------------------------------------------------------
+//
+void CPSMProfilesPlugin::Panic( TInt aReason )
+ {
+ _LIT(KPanicCategory,"CPSMProfilesPlugin");
+
+ User::Panic(KPanicCategory, aReason);
+ }
+
+
+
+
+// End of file