diff -r 000000000000 -r 667063e416a2 locationsystemui/locationsysui/locsysuiview/src/locsettingsuipluginloader.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/locationsystemui/locationsysui/locsysuiview/src/locsettingsuipluginloader.cpp Tue Feb 02 01:06:48 2010 +0200 @@ -0,0 +1,362 @@ +/* +* Copyright (c) 2005-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: Manages the E-Comm Plugin handling for the Settings UI. +* +*/ + + +// System Include +#include +#include + +// User Include +#include "locsettingsuipluginloader.h" +#include "locationsettings.h" +#include "locsettingsui.h" +#include "locsettingsuiparams.h" +#include "locsettingsuiecomnotifier.h" + + +// Global Constants + +//Forward declaration. Function for sorted ordering of settings ui plug-ins +static TInt SettingsDescOrdering( const CLocationSettings& aSettings1, + const CLocationSettings& aSettings2 ); + +// ========================= MEMBER FUNCTIONS ================================ + +// --------------------------------------------------------------------------- +// CLocSettingsUiPluginLoader::CLocSettingsUiPluginLoader +// Overloaded Constructor +// +// --------------------------------------------------------------------------- +// +CLocSettingsUiPluginLoader::CLocSettingsUiPluginLoader( CAknViewAppUi& aAppUi ) + :CActive( EPriorityStandard ), + iAppUi( aAppUi ) + { + // Add self to the Active scheduler + CActiveScheduler::Add( this ); + } + +// --------------------------------------------------------------------------- +// CLocSettingsUiPluginLoader::~CLocSettingsUiPluginLoader +// Destructor +// +// --------------------------------------------------------------------------- +// +CLocSettingsUiPluginLoader::~CLocSettingsUiPluginLoader() + { + Cancel(); + } + +// --------------------------------------------------------------------------- +// CLocSettingsUiPluginLoader* CLocSettingsUiPluginLoader::NewL +// Creates an instance of the Settings UI Plug-in Loader +// +// @param aAppUi App Ui Reference +// @return CLocSettingsUiPluginLoader* Reference to the instantiated class +// --------------------------------------------------------------------------- +// +CLocSettingsUiPluginLoader* CLocSettingsUiPluginLoader::NewL( + CAknViewAppUi& aAppUi ) + { + CLocSettingsUiPluginLoader* self = + CLocSettingsUiPluginLoader::NewLC( aAppUi ); + CleanupStack::Pop(self); + return self; + } + +// --------------------------------------------------------------------------- +// CLocSettingsUiPluginLoader* CLocSettingsUiPluginLoader::NewLC +// Creates an instance of the Settings UI Plug-in Loader +// +// @param aObserver Observer to the CLocSettingsUiPluginLoader class +// @param aAppUi App Ui Reference +// @return CLocSettingsUiPluginLoader* Reference to the instantiated class +// --------------------------------------------------------------------------- +// +CLocSettingsUiPluginLoader* CLocSettingsUiPluginLoader::NewLC( + CAknViewAppUi& aAppUi ) + { + CLocSettingsUiPluginLoader* self = new(ELeave) CLocSettingsUiPluginLoader( aAppUi ); + CleanupStack::PushL(self); + return self; + } + +// --------------------------------------------------------------------------- +// void CLocSettingsUiPluginLoader::CreateAvailableSettingsUisL +// Creates all the settings UI currently available in the system. The +// user if this interface should ensure that he passes an empty +// Settings Array structure. +// +// @param aDescArray Array of Settings UI. +// --------------------------------------------------------------------------- +// +void CLocSettingsUiPluginLoader::CreateAvailableSettingsUisL( + RPointerArray& aSettingsArray ) + { + // List all the available implementations for KSettingsUiInterfaceUID + RImplInfoPtrArray impInfoArray; + + REComSession::ListImplementationsL( KSettingsUiInterfaceUID, + impInfoArray ); + for ( TInt impInfoArrayIterator = 0; + impInfoArrayIterator < impInfoArray.Count(); + impInfoArrayIterator ++ ) + { + // Obtain the Implementation UID + CImplementationInformation* info = impInfoArray[impInfoArrayIterator]; + TUid implUid = info->ImplementationUid(); + + // Create the Location Settings UI class which inturn creates the + // sub-settings plug-in + + CLocationSettings* settings = NULL; + TRAPD( error, settings = CLocationSettings::NewL( implUid, iAppUi );); + if( !error ) + { + // Insert them in order. The order is specified by the SettingsDescOrdering + // function + error = aSettingsArray.InsertInOrder( settings, + SettingsDescOrdering ); + if ( error ) + { + // Issue with creating the Settings UI component. Delete it + delete settings; + } + } + } + // Destroy the implementation info array obtained from ECom Session + impInfoArray.ResetAndDestroy(); + } + +// --------------------------------------------------------------------------- +// void CLocSettingsUiPluginLoader::CreateSettingsUiL +// Creates the Settings UI and the corresponding description entry. This +// Location Settings object. The created object is appended to the existing +// list and a reference to it returned. +// +// @param aImplementationUid The Implementation UID of the plug-in that +// has to be created +// @param aSettingsArray Array of Settings UIs +// @return CLocationSettings& Reference to the created object. The ownership is not +// by the return value. +// --------------------------------------------------------------------------- +// +CLocationSettings& CLocSettingsUiPluginLoader::CreateSettingsUiL( + TUid aImplementationUid, + RPointerArray& aSettingsArray ) + { + // Create the plug in + + // The Function does not check for the existence of the plug-in + // in the implementation array. + + // The function is not trapped. If there is a leave then the function would + // leave with the error code generated. The calling function has to take + // care of the non-existence of the plug-in + + CLocationSettings* settings = CLocationSettings::NewLC( aImplementationUid, + iAppUi ); + + // Insert them in order. The order is specified by the SettingsDescOrdering + // function + User::LeaveIfError( aSettingsArray.InsertInOrder( settings, + SettingsDescOrdering )); + CleanupStack::Pop( settings ); + + // Return the reference to the Settings UI + return *settings; + } + +// --------------------------------------------------------------------------- +// void CLocSettingsUiPluginLoader::UpdateAvailableSettingsUisL +// Updates the Settings UI list and the description structures. The new +// additions are appened in-order. The interface does not +// delete any instances if they are not in the current implementation +// list +// +// @param aSettingsArray Array of Settings UIs. +// @param aInitParams Opaque Initialization parameters that are +// passed onto the Settings UI. The PluginLoader +// does not understand these parameters +// --------------------------------------------------------------------------- +// +void CLocSettingsUiPluginLoader::UpdateAvailableSettingsUisL( + RPointerArray& aSettingsArray ) + { + // List all the available implementations for KSettingsUiInterfaceUID + RImplInfoPtrArray impInfoArray; + + REComSession::ListImplementationsL( KSettingsUiInterfaceUID, + impInfoArray ); + + for ( TInt impInfoArrayIterator = 0; + impInfoArrayIterator < impInfoArray.Count(); + impInfoArrayIterator ++ ) + { + // Obtain the Implementation UID + CImplementationInformation* info = impInfoArray[impInfoArrayIterator]; + TUid implUid = info->ImplementationUid(); + + // Search if the plug-in already exists. + TInt index = KErrNotFound; + // Iterate through the Settings UI array + for ( TInt count = 0; count < aSettingsArray.Count(); count++ ) + { + CLocationSettings* currentItem = aSettingsArray[count]; + // If the Settings object for the Implementation UID already + // exisits then dont do anything + if ( implUid == currentItem->ImplementationUid()) + { + index = count; + break; + } + } + + // If the index value is not set Create the plug in + if ( KErrNotFound == index ) + { + // Create the Location Settings UI class which inturn creates the + // sub-settings plug-in + + CLocationSettings* settings = NULL; + TRAPD( error, settings = CLocationSettings::NewL( implUid, iAppUi );); + if( !error ) + { + // Insert them in order. The order is specified by the SettingsDescOrdering + // function + error = aSettingsArray.InsertInOrder( settings, + SettingsDescOrdering ); + if ( error ) + { + // Issue with creating the Settings UI component. Delete it + delete settings; + } + } + } + } + + impInfoArray.ResetAndDestroy(); + } + +// --------------------------------------------------------------------------- +// Inherited from CActive +// --------------------------------------------------------------------------- +// +void CLocSettingsUiPluginLoader::RunL() + { + if ( iStatus.Int() != KErrCancel ) + { + // Restart the Notification request inorder to listen for future + // notifications + StartEComNotifyL(); + // Notify the state change to the observer + if( iNotifier ) + { + iNotifier->EComSessionStateChanged( iStatus.Int()); + } + } + } + +// --------------------------------------------------------------------------- +// Inherited from CActive +// --------------------------------------------------------------------------- +// +void CLocSettingsUiPluginLoader::DoCancel() + { + if ( iSession ) + { + iSession->CancelNotifyOnChange( iStatus ); + iSession->Close(); + iSession = NULL; + } + } + +// --------------------------------------------------------------------------- +// Inherited from CActive +// --------------------------------------------------------------------------- +// +TInt CLocSettingsUiPluginLoader::RunError( TInt /* aError */) + { + return KErrNone; + } + +// --------------------------------------------------------------------------- +// Initiates a notify request on the ECom Session +// +// @param aSettingsNotifer Notifier for communication of changes in the +// Ecom loading and unloading for sub-settings +// plug-ins +// --------------------------------------------------------------------------- +// +void CLocSettingsUiPluginLoader::StartEComNotifyL( + MLocSettingsUiEcomNotifer* aNotifier ) + { + // Set the notifier if its valid + if( aNotifier ) + { + iNotifier = aNotifier; + } + + // If the notifier is present then initaite a request + // Open the ECom Session handle if its not been opened + if( !iSession ) + { + iSession = &( REComSession::OpenL()); + } + + // Issue a new request + if ( !IsActive()) + { + // Set the notifier + iSession->NotifyOnChange( iStatus ); + + SetActive(); + } + } + +// --------------------------------------------------------------------------- +// +// Stop the outstanding EComNotification +// --------------------------------------------------------------------------- +// +void CLocSettingsUiPluginLoader::StopEComNotify() + { + // Cancel any outstanding request + Cancel(); + } + +// --------------------------------------------------------------------------- +// static TInt SettingsDescOrdering +// Ordering function for inserting the elements into the List box array. +// The ordering is done first based on the priority. +// +// @param CLocationSettings& First Settings Element +// @param CLocationSettings& Second Settings Element +// @return 1. zero, if the two objects are equal. +// +// 2. a negative value, if the first object is less than the second. +// +// 3. a positive value, if the first object is greater than the second. +// +// --------------------------------------------------------------------------- +TInt SettingsDescOrdering( const CLocationSettings& aSettings1, + const CLocationSettings& aSettings2 ) + { + CLocationSettings* settings1 = const_cast< CLocationSettings*>(&aSettings1); + CLocationSettings* settings2 = const_cast< CLocationSettings*>(&aSettings2); + return ( settings1->Priority() - settings2->Priority()); + }