locationsystemui/locationsysui/locsysuiview/src/locsettingsuipluginloader.cpp
changeset 0 667063e416a2
--- /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 <ecom/implementationinformation.h>
+#include <aknViewAppUi.h>
+	
+// 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<CLocationSettings>&   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<CLocationSettings>&    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<CLocationSettings>&    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());
+	}