locationsystemui/locationsysui/locsysuiview/src/locsettingsuiengine.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 25 May 2010 13:09:42 +0300
branchRCL_3
changeset 13 9c303455e256
parent 0 667063e416a2
permissions -rw-r--r--
Revision: 201019 Kit: 2010121

/*
* 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: This defines the engine class for Location settings Ui
*
*/


// System Include 
#include <aknViewAppUi.h>

// User Include
#include "locsettingsuiengine.h"
#include "locsettingsuiecomnotifier.h"
#include "locationsettings.h"
#include "locsettingsuipluginloader.h"
#include "locsettingsui.h"
#include "locsettingsuiparams.h"

// ========================= MEMBER FUNCTIONS ================================

// ---------------------------------------------------------------------------
// CLocSettingsUiEngine::CLocSettingsUiEngine
// Overloaded Constructor
//
// ---------------------------------------------------------------------------
//
CLocSettingsUiEngine::CLocSettingsUiEngine( CAknViewAppUi&	aAppUi )
	:iAppUi( aAppUi )
	{		
	}

// ---------------------------------------------------------------------------
// CLocationSystemUiView::~CLocSettingsUiEngine
// Destructor
//
// ---------------------------------------------------------------------------
//
CLocSettingsUiEngine::~CLocSettingsUiEngine()
	{

	// Delete the Settings UI Descriptions
	while ( iSettingsArray.Count() > 0 )
		{
		// Remove the first item
		CLocationSettings* item = iSettingsArray[0];
		iSettingsArray.Remove( 0 );
		
		// Delete the element
		delete item;
		item = NULL;
		}
	iSettingsArray.Reset();
	iSettingsArray.Close();
	
	// Delete the Plug-in Loader
	delete iPluginLoader;	
	}	
					 
// ---------------------------------------------------------------------------
// CLocSettingsUiEngine* CLocSettingsUiEngine::NewL
// Two Phase Constructor. 
//
// @param 	aAppUi				    Reference to the Application UI class that
//									launched the Settings Application
// @return	CLocSettingsUiEngine*	Reference to the created object
// ---------------------------------------------------------------------------  
//
EXPORT_C CLocSettingsUiEngine* CLocSettingsUiEngine::NewL( CAknViewAppUi& aAppUi )
	{
    CLocSettingsUiEngine* self = CLocSettingsUiEngine::NewLC( aAppUi );
	CleanupStack::Pop( self );
	return self;
	}
	
// ---------------------------------------------------------------------------
// CLocSettingsUiEngine* CLocSettingsUiEngine::NewLC
// Two Phase Constructor. 
//
// @param 	aAppUi					Reference to the Application UI class that
//									launched the Settings Application
// @return	CLocSettingsUiEngine*	Reference to the created object
// ---------------------------------------------------------------------------  
//
EXPORT_C CLocSettingsUiEngine* CLocSettingsUiEngine::NewLC( CAknViewAppUi&	aAppUi )
	{
    CLocSettingsUiEngine* self = new(ELeave) CLocSettingsUiEngine( aAppUi );
	CleanupStack::PushL( self );
	self->ConstructL();
	return self;
	}

// ---------------------------------------------------------------------------
// void CLocSettingsUiDesc::ConstructL
// Second Phase of the two phase constructor. The caption string is copied into
// 
// ---------------------------------------------------------------------------
//									 
void CLocSettingsUiEngine::ConstructL()
	{
	
	// Construct the Plug-In Loader
	iPluginLoader = CLocSettingsUiPluginLoader::NewL( iAppUi );

	}

// ---------------------------------------------------------------------------
// CLocationSettings* CLocSettingsUiEngine::CreateSettingsUiL
// 
// Creates a single Settings UI Object.
// In case the object already exists, then a reference to the existing object is
// returned and no new object is created. In either case, the class retains the
// ownership of the created object.
//
// @param aImplementationUid The Implementation UID of the plug-in that
//                           has to be created.
// @return CLocationSettings* Reference to the created object.
// ---------------------------------------------------------------------------
//
EXPORT_C CLocationSettings* CLocSettingsUiEngine::CreateSettingsUiL( 
                                                        TUid aImplementationUid )
    {
    // Scan through the existing list of Settings UIs. Incase, a UI with the
    // same UID exists then return the same. If not create a new implmentation
    // and return a reference to it
    
    TInt index = KErrNotFound;
    
    // Iterate through the Settings UI array
	for ( TInt count = 0; count < iSettingsArray.Count(); count++ )
	{
	CLocationSettings* currentItem = iSettingsArray[count];
	// If the Settings object for the Implementation UID already
	// exisits then dont do anything
	if ( aImplementationUid == currentItem->ImplementationUid())
		{
		index = count;
		break;
		}
	}
    
    if( KErrNotFound != index )
        {
        // A Settings UI corresponding to the UID already exists. Return a 
        // reference to the same.
        return iSettingsArray[index];
        }
    else
        {
        // Settings UI does not exist. Create a new implementation and 
        // return the same
        return  &( iPluginLoader->CreateSettingsUiL( aImplementationUid,
                                                     iSettingsArray ));                                                   
        
        }
    }
        
// ---------------------------------------------------------------------------
// RPointerArray<CLocationSettings>& CLocSettingsUiEngine::CreateAvailableSettingsUiL
//
// Creates all the available settings UI. This function call performs
// an ECom discovery of all the possible ECom plugins that are 
// available and creates the Settings UI components as well as the 
// plug-in UI. The ownership of the created objects is not transferred
// to the callee but retained with the Engine class. This function needs 
// that No settings UIs have been already created. Incase, there exists
// any Settings UIs then the function leaves with KErrAlreadyExists.
//
// @return RPointerArray<CLocationSettings>& Reference to the array of Settings
//                                           objects.
// ---------------------------------------------------------------------------
//
RPointerArray<CLocationSettings>& CLocSettingsUiEngine::CreateAvailableSettingsUiL()
    {
	
	// The function expects that there are no existing Settings UI elements 
	// present. Hence, the need to check
	if( iSettingsArray.Count())
	    {
	    User::Leave( KErrAlreadyExists );
	    }
	    
	// Create the Settings UIs 
	iPluginLoader->CreateAvailableSettingsUisL( iSettingsArray );
	
	// Return a reference to the created Settings UI structures
	return iSettingsArray;	
    }
        
// ---------------------------------------------------------------------------
// PointerArray<CLocationSettings>& CLocSettingsUiEngine::UpdateAvailableSettingsUisL()
//
// Updates the list of available UIs. The new list would contain all the
// latest additions to the list of UIs in addition to the existing
// UIs. The interface does not delete any instances if they are not in
// the current implementation list.
//
// @return RPointerArray<CLocationSettings>& Reference to the array of Settings
//                                           objects.   
// ---------------------------------------------------------------------------
//
RPointerArray<CLocationSettings>& CLocSettingsUiEngine::UpdateAvailableSettingsUisL()
	{
	
	// Create the Settings UIs 
	iPluginLoader->CreateAvailableSettingsUisL( iSettingsArray );
	
	// Return a reference to the created Settings UI structures
	return iSettingsArray;
	}
	
// ---------------------------------------------------------------------------
// RPointerArray<CLocationSettings>& CLocSettingsUiEngine::SettingsUiArray
// 
// Accessor function to obtain the Settings UI structures. The ownership of the 
// internal objects is not transferred.
// 
//  @return RPointerArray<CLocationSettings>& Reference to the array of Settings
//                                            objects. 
// ---------------------------------------------------------------------------
//
RPointerArray<CLocationSettings>& CLocSettingsUiEngine::SettingsUiArray()
    {
    return iSettingsArray;
    }

// ---------------------------------------------------------------------------
// void CLocSettingsUiEngine::StartSettingsEComNotification
// Starts the Ecom notification for observing loading and unloading of the 
// underlying sub-settings plug-ins
//
// @param aSettingsNotifer  Notifier for communication of changes in the 
//                          Ecom loading and unloading for sub-settings
//                          plug-ins
// ---------------------------------------------------------------------------
//
void CLocSettingsUiEngine::StartSettingsEComNotificationL( 
                            MLocSettingsUiEcomNotifer*   aNotifier )
    {
    iPluginLoader->StartEComNotifyL( aNotifier );
    }
                    
// ---------------------------------------------------------------------------
// void CLocSettingsUiEngine::StopSettingsEComNotification
// Stops ECom notification. Does nothing in case there was no outstanding
// request
// ---------------------------------------------------------------------------
//
void CLocSettingsUiEngine::StopSettingsEComNotification()
    {
    iPluginLoader->StopEComNotify();
    }