networkprotocolmodules/suplprotocolmodule/HostSettingsApi/src/lbshostsettingsimpl.cpp
changeset 0 9cfd9a3ee49c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/networkprotocolmodules/suplprotocolmodule/HostSettingsApi/src/lbshostsettingsimpl.cpp	Tue Feb 02 01:50:39 2010 +0200
@@ -0,0 +1,980 @@
+// Copyright (c) 2008-2009 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:
+// Internal implentation of the LBS Host Settings Interface
+// 
+//
+
+/**
+ @file
+ @internalAll
+ @deprecated 
+*/
+
+#include <e32base.h>
+#include <centralrepository.h>
+#include <e32debug.h>
+
+#include <lbs/lbshostsettingsclasstypes.h>
+#include <lbs/lbshostsettings.h>
+#include "lbshostsettingsconsts.h"
+#include "lbshostsettingsimpl.h"
+#include "lbshostsettingsnotifier.h"
+
+const TInt KFormattedDateSize = 22;
+_LIT(KDateFormat,"%3%2%1%:1%H%T%S%.%C");
+
+/**
+Provides a seamless interface to the Central Repository.
+
+The uniqueness of each key will be achieved by storing a key in the 
+table, which in effect is a counter that represents the next key to
+be used and that is incremented each time a group of settings is added
+in the table. 
+
+The group of settings associated with a SUPL account will be stored separately
+in the Central Repository instead of storing them as one record. The last 24 bits 
+of the 32-bit key will be used to represent a general key and we will vary the first 
+8 bits to represent each particular setting. They could then be read back by masking 
+those bits. The top 8 bits are defined in TLbsHostSettingRecordType.   
+
+For example:
+
+If the setting id is 4 then the associated record keys will be:
+CreatorId(0x1):        0x10000004
+ConnectionId(0x2):     0x20000004
+ConnectionIdType(0x3): 0x30000004
+HostAddress(0x4):      0x40000004
+etc...
+
+There is a reserved range of keys used for storing metadata values where the upper 4 bits 
+are set to record type EMetaData and the bottom 28 bits are defined by 
+TLbsHostSettingMetaRecordTypes. e.g:
+NextKey(0x1):     0x00000001
+DefaultHost(0x2): 0x00000002 
+
+This class also offers the ability to update a group of settings associated
+with an account, to set a particular account as default, to iterate over settings
+and finally to delete them.
+
+@see CRepository
+@see CLbsHostSettingsStore 
+*/
+
+class CLbsHostSettingsStoreImpl : public CBase, public MLbsHostSettingsStoreImpl
+	{
+public:
+	static CLbsHostSettingsStoreImpl* NewL(TLbsHostStoreId aStoreId, MLbsHostSettingsStoreObserver* aObserver);
+	
+	TInt CreateHostSettings(const TLbsHostSettingsBase& aSettings, TLbsHostCreatorId aCreatorId, TLbsHostSettingsId& aSettingsId);
+	TInt UpdateHostSettings(TLbsHostSettingsId aSettingsId, const TLbsHostSettingsBase& aSettings);
+	TInt GetHostSettings(TLbsHostSettingsId aSettingsId, TLbsHostSettingsBase& aSettings) const;
+	TInt RewindHostSettings();
+	TInt GetNextHostSettings(TLbsHostSettingsBase& aSettings, TLbsHostSettingsId& aSettingsId);
+	TInt GetNextHostSettingsByCreator(TLbsHostCreatorId aCreator, TLbsHostSettingsBase& aSettings, TLbsHostSettingsId& aSettingsId);
+	TInt SetDefaultHostSettings(TLbsHostSettingsId aSettingsId);
+	TInt GetDefaultHostSettings(TLbsHostSettingsBase& aSettings, TLbsHostSettingsId& aSettingsId) const;
+	TInt DeleteHostSettings(TLbsHostSettingsId aSettingsId);
+	~CLbsHostSettingsStoreImpl();
+	
+protected:
+	CLbsHostSettingsStoreImpl();
+	void ConstructL(TLbsHostStoreId aStoreId, MLbsHostSettingsStoreObserver* aObserver);
+
+private:
+	TInt GetSettingNumber(const TUint32 aKey) const;
+	TUint32 CreateKey(const TLbsHostSettingRecordType aRecordType, const TUint32 aSettingNumber) const;
+	TInt UpdateTimestamp(TLbsHostSettingsId aSettingsId) const;
+	TInt ValidateHostSettings(const TLbsHostSettingsSupl& aSettings) const;
+	
+	CRepository* 					iRepository;
+	CLbsHostSettingsNotifier*		iStoreNotifier;
+	
+	// structure to hold setting addresses and 
+	// creator ids
+	struct TIdCreatorPair
+		{
+	    TInt iSettingId;
+	    TUid iCreator;	   	
+		};
+	RArray<TIdCreatorPair> iCurrentView;	
+	TInt iIterator;
+	};
+
+//=============================================================================
+// CLbsHostSettingsStore::ConstructL()
+//=============================================================================
+
+/**
+Creates and assigns the internal resources required by the data store
+library.
+@param aStoreId Specifies which host settings store to utilise.
+@param aObserver If non NULL, the observer receives notifications about
+updates to store specified by aStoreId.
+@internalComponent
+*/  
+void CLbsHostSettingsStore::ConstructL(TLbsHostStoreId aStoreId, MLbsHostSettingsStoreObserver* aObserver)
+	{
+	iImplementation = CLbsHostSettingsStoreImpl::NewL(aStoreId, aObserver);
+	iSettingsStore = iImplementation;
+	}
+
+/**
+Closes the connection to the host settings store and disposes of all open
+or used resources.
+@deprecated
+*/  
+EXPORT_C CLbsHostSettingsStore::~CLbsHostSettingsStore()
+	{
+	delete iImplementation;
+	iImplementation = NULL;
+	}
+
+//=============================================================================
+// CLbsHostSettingsStoreImpl
+//=============================================================================
+
+CLbsHostSettingsStoreImpl::~CLbsHostSettingsStoreImpl()
+	{
+	iCurrentView.Close();
+	delete iStoreNotifier;
+	delete iRepository;
+	}
+
+
+/**
+Creates a new connection to the host settings stored for the specified protocol
+*/  
+CLbsHostSettingsStoreImpl* CLbsHostSettingsStoreImpl::NewL(TLbsHostStoreId aStoreId, MLbsHostSettingsStoreObserver* aObserver)
+	{
+	CLbsHostSettingsStoreImpl* self = new (ELeave) CLbsHostSettingsStoreImpl();
+	CleanupStack::PushL(self);
+	self->ConstructL(aStoreId, aObserver);
+	CleanupStack::Pop(self);
+	return self;
+	}
+
+/**
+Default constructor for the settings store.
+*/  
+CLbsHostSettingsStoreImpl::CLbsHostSettingsStoreImpl(): iIterator(KErrNotFound)
+	{
+	}
+
+void CLbsHostSettingsStoreImpl::ConstructL(TLbsHostStoreId aStoreId, MLbsHostSettingsStoreObserver* aObserver)
+	{
+	iRepository = CRepository::NewL(aStoreId);
+
+	// Create and start notifier if an observer exists
+	if (aObserver)
+		{
+		iStoreNotifier = CLbsHostSettingsNotifier::NewL(aStoreId, *iRepository, aObserver);
+		iStoreNotifier->RequestNotificationL();
+		}
+	}
+
+/**
+Resets the client's view of the data store.
+@see CLbsHostSettingsStore::RewindHostSettings
+*/  
+TInt CLbsHostSettingsStoreImpl::RewindHostSettings()
+	{
+	// set iterator to -1
+	// clear structure
+	
+	iIterator = KErrNotFound;
+	iCurrentView.Reset();
+	
+	// rebuild our data structure
+	RArray<TUint32> foundKeys; //method is non-leaving so no need to put this on the CUS
+	
+	const TUint32 KSettingNumberMask = 0;
+	const TUint32 KPartialKey = CreateKey(ECreatorId, KSettingNumberMask); 
+	
+	// Find all the Creator id keys in the store so that we can generate a list of setting ids.
+	TRAPD(err, err = iRepository->FindL(KPartialKey, KRecordTypeMask, foundKeys));
+	if(err == KErrNone)
+		{
+		for(TInt i = 0, x = foundKeys.Count(); i < x; i++)
+			{		
+			// retrieve the CreatorId values foreach key	
+			TInt creatorId;
+			TIdCreatorPair keyPair;	
+			err = iRepository->Get(foundKeys[i], creatorId);		
+			if(err != KErrNone)
+				{
+				break;
+				}
+			
+			// now add pair to structure
+			// convert creatorValue to TUid for convenience
+			keyPair.iSettingId = GetSettingNumber(foundKeys[i]);
+			keyPair.iCreator = TUid::Uid(creatorId);
+			err = iCurrentView.Append(keyPair);
+			if(err != KErrNone)
+				{
+				break;
+				}
+			}
+		}
+	
+	foundKeys.Close();
+	return err;
+	}
+
+
+/**
+Retrieves the settings for a particular host settings ID.
+@see CLbsHostSettingsStore::GetHostSettings
+*/  
+TInt CLbsHostSettingsStoreImpl::GetHostSettings(TLbsHostSettingsId aSettingsId,	TLbsHostSettingsBase& aSettings) const
+	{
+	ASSERT(aSettingsId.iUid >= 0);
+	if((aSettings.ClassType() & ELbsHostSettingsSuplClass))
+		{
+		TLbsHostSettingsSupl& tgt = (TLbsHostSettingsSupl&)aSettings;
+		
+		// Set the settings id
+		tgt.SetHostSettingsId(aSettingsId);
+		
+		// Get the creator id
+		TInt creatorId;
+		TUint32 creatorIdKey = CreateKey(ECreatorId, aSettingsId.iUid);
+		TInt err = iRepository->Get(creatorIdKey, creatorId);
+		if(err != KErrNone)
+			{
+			return err;
+			}
+		tgt.SetCreatorId(TUid::Uid(creatorId));
+		
+		// Get the connection id
+		TInt connectionId;
+		TUint32 connectionIdKey = CreateKey(EConnectionId, aSettingsId.iUid);
+		err = iRepository->Get(connectionIdKey, connectionId);
+		if(err != KErrNone)
+			{
+			return err;
+			}
+		
+		// Get the connection id type
+		TInt connectionIdType;
+		TUint32 connectionIdTypeKey = CreateKey(EConnectionIdType, aSettingsId.iUid);
+		err = iRepository->Get(connectionIdTypeKey, connectionIdType);
+		if(err != KErrNone)
+			{
+			return err;
+			}
+		tgt.SetConnectionPoint(connectionId, static_cast<TLbsHostSettingsSupl::TLbsConnectionType>(connectionIdType));
+		
+		// Get the host address
+		TLbsHostNameAddress hostAddr;
+		TUint32 hostAddrKey = CreateKey(EHostAddress, aSettingsId.iUid);
+		err = iRepository->Get(hostAddrKey, hostAddr);
+		if(err != KErrNone)
+			{
+			return err;
+			}
+		tgt.SetHostNameAddress(hostAddr);
+		
+		// Get the read only flag
+		TBool readOnly;
+		TUint32 readOnlyKey = CreateKey(EReadOnly, aSettingsId.iUid);
+		err = iRepository->Get(readOnlyKey, readOnly);
+		if(err != KErrNone)
+			{
+			return err;
+			}
+		tgt.SetReadOnly(readOnly);
+		
+		// Get the name
+		TLbsHostName hostName;
+		TUint32 hostNameKey = CreateKey(EHostName, aSettingsId.iUid);
+		err = iRepository->Get(hostNameKey, hostName);
+		if(err != KErrNone)
+			{
+			return err;
+			}
+		tgt.SetName(hostName);
+		
+		// Get the port id
+		TInt portId;
+		TUint32 portIdKey = CreateKey(EHostPort, aSettingsId.iUid);
+		err = iRepository->Get(portIdKey, portId);
+		if(err != KErrNone)
+			{
+			return err;
+			}
+		tgt.SetPortId(portId);
+		
+		// Get the providerId
+		TLbsProviderId providerId;
+		TUint32 providerIdKey = CreateKey(EProviderId, aSettingsId.iUid);
+		err = iRepository->Get(providerIdKey, providerId);
+		if(err != KErrNone)
+			{
+			return err;
+			}
+		tgt.SetProviderId(providerId);
+		
+		// Get the MOLR auth modes
+		TInt authmolr;
+		TUint32 authmolrKey = CreateKey(EAuthMoLr, aSettingsId.iUid);
+		err = iRepository->Get(authmolrKey, authmolr);
+		if(err != KErrNone)
+			{
+			return err;
+			}
+		tgt.SetAuthModesMOLR(authmolr);
+
+		// Get the MTLR auth modes
+		TInt authmtlr;
+		TUint32 authmtlrKey = CreateKey(EAuthMtLr, aSettingsId.iUid);
+		err = iRepository->Get(authmtlrKey, authmtlr);
+		if(err != KErrNone)
+			{
+			return err;
+			}
+		tgt.SetAuthModesMTLR(authmtlr);
+		
+		//Get the last modified timestamp
+		TBuf16<KFormattedDateSize> lastMod;
+		TUint32 lastModKey = CreateKey(ETimestamp, aSettingsId.iUid);
+		err = iRepository->Get(lastModKey, lastMod);
+		if(err != KErrNone)
+			{
+			return err;
+			}
+		TRAP(err, tgt.SetLastModifiedL(lastMod));
+		if(err != KErrNone)
+			{
+			return err;
+			}
+		
+		return KErrNone;
+		}
+	return KErrArgument;
+	}
+
+
+/**
+Retrieves the next host settings following on from the specified host
+setttings ID.
+@see CLbsHostSettingsStore::GetNextHostSettings
+*/  
+TInt CLbsHostSettingsStoreImpl::GetNextHostSettings(TLbsHostSettingsBase& aSettings, TLbsHostSettingsId& aSettingsId)
+	{
+	if((aSettings.ClassType() & ELbsHostSettingsSuplClass))
+		{
+		++iIterator;
+		
+		// check if we have reached end of iteration
+		// return KErrNotFound
+		// this also implies that we need to have called RewindHostSettings
+		// in order to use this method
+		if(iIterator >= iCurrentView.Count())
+			{
+			return KErrNotFound;
+			}
+				
+		TIdCreatorPair currentPair = iCurrentView[iIterator];
+		aSettingsId.iUid = currentPair.iSettingId;
+		return GetHostSettings(aSettingsId, aSettings);
+		}
+	return KErrArgument;
+	}
+
+/**
+Retrieves the next host settings that was provisioned by the specified
+creator.
+@see CLbsHostSettingsStore::GetNextHostSettingsByCreator
+*/  
+TInt CLbsHostSettingsStoreImpl::GetNextHostSettingsByCreator(TLbsHostCreatorId aCreator, TLbsHostSettingsBase& aSettings, TLbsHostSettingsId& aSettingsId)
+	{
+	ASSERT(aCreator.iUid >= 0);
+	if((aSettings.ClassType() & ELbsHostSettingsSuplClass))
+		{
+		TIdCreatorPair currentPair;	
+			
+		for(;;) 
+			{							
+			++iIterator;
+			
+			// check if we have reached end of iteration
+			// return KErrNotFound		
+			if(iIterator >= iCurrentView.Count())
+				{
+				return KErrNotFound;
+				}
+			
+			currentPair = iCurrentView[iIterator];
+			
+			// do we have the right creator id?
+			if(aCreator == currentPair.iCreator)
+				{
+				break;
+				}			
+			}
+									
+		// at this stage we have the right creator
+		// just return setting
+		aSettingsId.iUid = currentPair.iSettingId;
+		return GetHostSettings(aSettingsId, aSettings);
+		}
+	return KErrArgument;
+	}
+
+/**
+Replaces the settings for an existing host settings entry in the data store.
+@see CLbsHostSettingsStore::UpdateHostSettings
+*/  
+TInt CLbsHostSettingsStoreImpl::UpdateHostSettings(TLbsHostSettingsId aSettingsId, const TLbsHostSettingsBase& aSettings)
+	{
+	ASSERT(aSettingsId.iUid >= 0);
+	if((aSettings.ClassType() & ELbsHostSettingsSuplClass))
+		{
+		//cast aSettings to a type we can use
+		const TLbsHostSettingsSupl& src = reinterpret_cast<const TLbsHostSettingsSupl&>(aSettings);
+		
+		TInt err = ValidateHostSettings(src);
+		if(err != KErrNone)
+			{
+			return err;
+			}
+		
+		// Check the setting exists by getting the creator Id
+		TInt creatorId;
+		TUint32 creatorIdKey = CreateKey(ECreatorId, aSettingsId.iUid);
+		err = iRepository->Get(creatorIdKey, creatorId);
+		if(err != KErrNone)
+			{
+			return err;
+			}
+		
+		//set connectionId & type
+		TInt connectionId;
+		TLbsHostSettingsSupl::TLbsConnectionType connectionIdType;
+		src.GetConnectionPoint(connectionId, connectionIdType);
+		TUint32 connectionIdKey = CreateKey(EConnectionId, aSettingsId.iUid);
+		err = iRepository->Set(connectionIdKey, connectionId);
+		if(err != KErrNone)
+			{
+			return err;
+			}
+		TUint32 connectionIdTypeKey = CreateKey(EConnectionIdType, aSettingsId.iUid);
+		err = iRepository->Set(connectionIdTypeKey, connectionIdType);
+		if(err != KErrNone)
+			{
+			return err;
+			}
+		
+		//set hostAddr
+		TLbsHostNameAddress hostAddr;
+		TInt hostAddrKey = CreateKey(EHostAddress, aSettingsId.iUid);
+		src.GetHostNameAddress(hostAddr);
+		err = iRepository->Set(hostAddrKey, hostAddr);
+		if(err != KErrNone)
+			{
+			return err;
+			}
+		
+		// set read only
+		TBool readOnly;
+		TUint32 readOnlyKey = CreateKey(EReadOnly, aSettingsId.iUid);
+		src.GetReadOnly(readOnly);
+		err = iRepository->Set(readOnlyKey, readOnly);
+		if(err != KErrNone)
+			{
+			return err;
+			}
+		
+		//set hostName
+		TLbsHostName hostName;
+		TInt hostNameKey = CreateKey(EHostName, aSettingsId.iUid);
+		src.GetName(hostName);
+		err = iRepository->Set(hostNameKey, hostName);
+		if(err != KErrNone)
+			{
+			return err;
+			}
+		
+		//set port id
+		TInt portId;
+		TUint32 portIdKey = CreateKey(EHostPort, aSettingsId.iUid);
+		src.GetPortId(portId);
+		err = iRepository->Set(portIdKey, portId);
+		if(err != KErrNone)
+			{
+			return err;
+			}
+		
+		//set providerId setting
+		TLbsProviderId providerId;
+		TInt providerIdKey = CreateKey(EProviderId, aSettingsId.iUid);
+		src.GetProviderId(providerId);
+		err = iRepository->Set(providerIdKey, providerId);
+		if(err != KErrNone)
+			{
+			return err;
+			}
+		
+		// Get the MOLR auth modes
+		TLbsHostSettingsSupl::TAuthModes authmolr;
+		TUint32 authmolrKey = CreateKey(EAuthMoLr, aSettingsId.iUid);
+		src.GetAuthModesMOLR(authmolr);
+		err = iRepository->Set(authmolrKey, (TInt)authmolr);
+		if(err != KErrNone)
+			{
+			return err;
+			}
+
+		// Get the MTLR auth modes
+		TLbsHostSettingsSupl::TAuthModes authmtlr;
+		TUint32 authmtlrKey = CreateKey(EAuthMtLr, aSettingsId.iUid);
+		src.GetAuthModesMTLR(authmtlr);
+		err = iRepository->Set(authmtlrKey, (TInt)authmtlr);
+		if(err != KErrNone)
+			{
+			return err;
+			}
+
+		// Set the last modified timestamp.
+		// Note that this should be the last setting updated since the
+		// notifier relies on listening for changes to ETimestamp.
+		return UpdateTimestamp(aSettingsId);
+		}
+	return KErrArgument;
+	}
+
+/**
+Removes the host information with the specified ID from the data store.
+@see CLbsHostSettingsStore::DeleteHostSettings
+*/  
+TInt CLbsHostSettingsStoreImpl::DeleteHostSettings(TLbsHostSettingsId aSettingsId)
+	{
+	ASSERT(aSettingsId.iUid >= 0);
+	// We want to carry on with all of the deletes even if individual deletes fail in
+	// order to clean up after ourselves as best we can. We return the first error that occurs.
+	TInt returnErr = KErrNone;
+	
+	//delete creatorId
+	TUint32 creatorIdKey = CreateKey(ECreatorId, aSettingsId.iUid);
+	TInt err = iRepository->Delete(creatorIdKey);
+	returnErr = err;
+	
+	//delete connection setting 
+	//(no need to check it exists first as Delete will return KErrorNotFound)
+	TUint32 connectionIdKey = CreateKey(EConnectionId, aSettingsId.iUid);
+	err = iRepository->Delete(connectionIdKey);
+	if(returnErr == KErrNone)
+		{
+		returnErr = err;
+		}
+	TUint32 connectionIdTypeKey = CreateKey(EConnectionIdType, aSettingsId.iUid);
+	err = iRepository->Delete(connectionIdTypeKey);
+	if(returnErr == KErrNone)
+		{
+		returnErr = err;
+		}
+	
+	//delete hostAddr setting
+	TUint32 hostAddrKey = CreateKey(EHostAddress, aSettingsId.iUid);
+	err = iRepository->Delete(hostAddrKey);
+	if(returnErr == KErrNone)
+		{
+		returnErr = err;
+		}
+
+	//delete read only setting
+	TUint32 readOnlyKey = CreateKey(EReadOnly, aSettingsId.iUid);
+	err = iRepository->Delete(readOnlyKey);
+	if(returnErr == KErrNone)
+		{
+		returnErr = err;
+		}
+
+	//delete name setting
+	TUint32 hostNameKey = CreateKey(EHostName, aSettingsId.iUid);
+	err = iRepository->Delete(hostNameKey);
+	if(returnErr == KErrNone)
+		{
+		returnErr = err;
+		}
+	
+	// delete port id setting
+	TUint32 portIdKey = CreateKey(EHostPort, aSettingsId.iUid);
+	err = iRepository->Delete(portIdKey);
+	if(returnErr == KErrNone)
+		{
+		returnErr = err;
+		}
+	
+	//delete providerId setting
+	TUint32 providerIdKey = CreateKey(EProviderId, aSettingsId.iUid);
+	err = iRepository->Delete(providerIdKey);
+	if(returnErr == KErrNone)
+		{
+		returnErr = err;
+		}
+
+	//delete authmolr setting
+	TUint32 authMoLr = CreateKey(EAuthMoLr, aSettingsId.iUid);
+	err = iRepository->Delete(authMoLr);
+	if(returnErr == KErrNone)
+		{
+		returnErr = err;
+		}
+
+	//delete authmtlr setting
+	TUint32 authMtLr = CreateKey(EAuthMtLr, aSettingsId.iUid);
+	err = iRepository->Delete(authMtLr);
+	if(returnErr == KErrNone)
+		{
+		returnErr = err;
+		}
+	
+	
+	// delete the last modified timestamp
+	TUint32 lastModKey = CreateKey(ETimestamp, aSettingsId.iUid);
+	err = iRepository->Delete(lastModKey);
+	if (iStoreNotifier && err == KErrNone)
+		{
+		// Suppress notification to this client session
+		iStoreNotifier->SuppressNotification(aSettingsId);
+		}
+
+	if(returnErr == KErrNone)
+		{
+		returnErr = err;
+		}
+
+	// reset the nextID to 0 when no records in cenrep
+	RArray<TUint32> foundKeys;
+	const TUint32 KSettingNumberMask = 0;
+	const TUint32 KPartialKey = CreateKey(ECreatorId, KSettingNumberMask); 
+	TRAP(err, err = iRepository->FindL(KPartialKey, KRecordTypeMask, foundKeys));
+	if (err == KErrNotFound)
+		{
+		TInt nextIdKey = CreateKey(EMetaData, ENextKey);
+		err = iRepository->Set(nextIdKey, 0);
+		}
+	foundKeys.Close();
+	
+	if(returnErr == KErrNone)
+		{
+		returnErr = err;
+		}
+
+	//reset the default host if the default host is being deleted.
+	TInt defaultHost;
+	TInt defaultHostKey = CreateKey(EMetaData, EDefaultHost);
+	err = iRepository->Get(defaultHostKey, defaultHost);
+	if (err == KErrNone)
+		{
+		if (defaultHost == aSettingsId.iUid) 
+			{
+			err = iRepository->Set(defaultHostKey, KMaxTInt);
+			}
+		}
+	
+	if(returnErr == KErrNone)
+		{
+		returnErr = err;
+		}
+
+	return returnErr;
+	}
+
+/**
+Retrieves the settings for the host that is currently specified as the default host.
+@see CLbsHostSettingsStore::GetDefaultHostSettings
+*/  
+TInt CLbsHostSettingsStoreImpl::GetDefaultHostSettings(TLbsHostSettingsBase& aSettings, TLbsHostSettingsId& aSettingsId) const
+	{
+	TInt defaultHost;
+	TInt defaultHostKey = CreateKey(EMetaData, EDefaultHost);
+	TInt err = iRepository->Get(defaultHostKey, defaultHost);
+	if(err != KErrNone)
+		{
+		return err;
+		}
+	//now we have the key for the setting, we can read it if it exists
+	aSettingsId = TUid::Uid(defaultHost);
+	return GetHostSettings(TUid::Uid(defaultHost), aSettings);
+	}
+
+/**
+Changes the default host to that specified by the supplied index.
+@internalComponent
+@see CLbsHostSettingsStore::SetDefaultHostSettings
+*/  
+TInt CLbsHostSettingsStoreImpl::SetDefaultHostSettings(TLbsHostSettingsId aSettingsId)
+	{
+	ASSERT(aSettingsId.iUid >= 0);
+	TInt defaultHostKey = CreateKey(EMetaData, EDefaultHost);
+	return iRepository->Set(defaultHostKey, static_cast<TInt>(aSettingsId.iUid));
+	}
+
+
+/**
+Creates a new host settings entry in the data store.
+@see CLbsHostSettingsStore::CreateHostSettings
+*/  
+TInt CLbsHostSettingsStoreImpl::CreateHostSettings(const TLbsHostSettingsBase& aSettings,	TLbsHostCreatorId  aCreator, TLbsHostSettingsId& aSettingsId)
+	{
+	ASSERT(aCreator.iUid >= 0);
+	if((aSettings.ClassType() & ELbsHostSettingsSuplClass))
+		{						
+		const TLbsHostSettingsSupl& src = reinterpret_cast<const TLbsHostSettingsSupl&>(aSettings);										
+		
+		TInt err = ValidateHostSettings(src);
+		if(err != KErrNone)
+			{
+			return err;
+			}
+		
+		//get the next row id from the cenrep
+		TInt nextId;
+		TInt nextIdKey = CreateKey(EMetaData, ENextKey);
+		err = iRepository->Get(nextIdKey, nextId);
+		if(err != KErrNone)
+			{
+			return err;
+			}
+					
+		//create keys for storing settings in the CenRep store
+		TUint32 creatorIdKey = CreateKey(ECreatorId, nextId);				
+		err = iRepository->Create(creatorIdKey, TInt(aCreator.iUid));
+		if(err != KErrNone)
+			{
+			return err;
+			}
+		
+		// Create the connection id & connection type settings
+		TInt connectionId;
+		TLbsHostSettingsSupl::TLbsConnectionType connectionIdType;
+		src.GetConnectionPoint(connectionId, connectionIdType);
+		
+		TUint32 connectionIdKey = CreateKey(EConnectionId, nextId);
+		err = iRepository->Create(connectionIdKey, connectionId);
+		if(err != KErrNone)
+			{
+			// Cleanup
+			DeleteHostSettings(TLbsHostSettingsId::Uid(nextId));
+			return err;
+			}
+		TUint32 connectionIdTypeKey = CreateKey(EConnectionIdType, nextId);
+		err = iRepository->Create(connectionIdTypeKey, connectionIdType);
+		if(err != KErrNone)
+			{
+			// Cleanup
+			DeleteHostSettings(TLbsHostSettingsId::Uid(nextId));
+			return err;
+			}
+		
+		// Create the host address setting
+		TLbsHostNameAddress hostAddr;			
+		src.GetHostNameAddress(hostAddr);
+		
+		TUint32 hostAddrKey = CreateKey(EHostAddress, nextId);
+		err = iRepository->Create(hostAddrKey, hostAddr);
+		if(err != KErrNone)
+			{
+			// Cleanup
+			DeleteHostSettings(TLbsHostSettingsId::Uid(nextId));
+			return err;
+			}
+		
+		// Create the read only setting
+		TBool readOnly;
+		src.GetReadOnly(readOnly);
+		TUint32 readOnlyKey = CreateKey(EReadOnly, nextId);
+		err = iRepository->Create(readOnlyKey, readOnly);
+		if(err != KErrNone)
+			{
+			// Cleanup
+			DeleteHostSettings(TLbsHostSettingsId::Uid(nextId));
+			return err;
+			}
+		
+		// create the name setting
+		TLbsHostName hostName;
+		src.GetName(hostName);	
+		TUint32 hostNameKey = CreateKey(EHostName, nextId);
+		err = iRepository->Create(hostNameKey, hostName);
+		if(err != KErrNone)
+			{
+			// Cleanup
+			DeleteHostSettings(TLbsHostSettingsId::Uid(nextId));
+			return err;
+			}
+		
+		//set port id
+		TInt portId;
+		TUint32 portIdKey = CreateKey(EHostPort, nextId);
+		src.GetPortId(portId);
+		err = iRepository->Create(portIdKey, portId);
+		if(err != KErrNone)
+			{
+			// Cleanup
+			DeleteHostSettings(TLbsHostSettingsId::Uid(nextId));
+			return err;
+			}
+		
+		// create the providerId setting
+		TLbsProviderId providerId;
+		src.GetProviderId(providerId);	
+		TUint32 providerIdKey = CreateKey(EProviderId, nextId);
+		err = iRepository->Create(providerIdKey, providerId);
+		if(err != KErrNone)
+			{
+			// Cleanup
+			DeleteHostSettings(TLbsHostSettingsId::Uid(nextId));
+			return err;
+			}
+		
+		// Get the MOLR auth modes
+		TLbsHostSettingsSupl::TAuthModes authmolr;
+		TUint32 authmolrKey = CreateKey(EAuthMoLr, nextId);
+		src.GetAuthModesMOLR(authmolr);
+		err = iRepository->Create(authmolrKey, (TInt)authmolr);
+		if(err != KErrNone)
+			{
+			return err;
+			}
+
+		// Get the MTLR auth modes
+		TLbsHostSettingsSupl::TAuthModes authmtlr;
+		TUint32 authmtlrKey = CreateKey(EAuthMtLr, nextId);
+		src.GetAuthModesMTLR(authmtlr);
+		err = iRepository->Create(authmtlrKey, (TInt)authmtlr);
+		if(err != KErrNone)
+			{
+			return err;
+			}		
+				
+		// Create the last modified timestamp.
+		// Note that this should be the last setting created since the
+		// notifier relies on listening for changes to ETimestamp.
+		err = UpdateTimestamp(TLbsHostSettingsId::Uid(nextId));
+		if(err != KErrNone)
+			{
+			// Cleanup
+			DeleteHostSettings(TLbsHostSettingsId::Uid(nextId));
+			return err;
+			}
+		
+		aSettingsId.iUid = nextId;
+	
+		//increment row id & store it
+		err = iRepository->Set(nextIdKey, ++nextId);
+		return err;
+		}
+	return KErrArgument;
+	}
+
+TInt CLbsHostSettingsStoreImpl::GetSettingNumber(const TUint32 aKey) const
+	{
+	return (aKey & KSettingIdMask); 
+	}
+
+TUint32 CLbsHostSettingsStoreImpl::CreateKey(const TLbsHostSettingRecordType aRecordType, const TUint32 aSettingNumber) const
+	{
+	return ((aRecordType << KRecordTypeShift) | (aSettingNumber & KSettingIdMask));
+	}
+
+TInt CLbsHostSettingsStoreImpl::UpdateTimestamp(TLbsHostSettingsId aSettingsId) const
+	{
+	//set the timestamp
+	TTime currentTime;
+	currentTime.UniversalTime();
+	TUint32 lastModKey = CreateKey(ETimestamp, aSettingsId.iUid);
+	TBuf16<KFormattedDateSize> formattedDate;
+  	TLocale locale;
+  	// Make sure that the timestamp will always be recorded in YYYYMMDD format
+  	locale.SetDateFormat(EDateEuropean);
+  	TRAPD(err, currentTime.FormatL(formattedDate, KDateFormat, locale));
+
+	if(err != KErrNone)
+		{
+		return err;
+		}
+	err = iRepository->Set(lastModKey, formattedDate);
+	if (iStoreNotifier && err == KErrNone)
+		{
+		// Suppress notification to this client session
+		iStoreNotifier->SuppressNotification(aSettingsId);
+		}
+
+	return err;
+	}
+
+TInt CLbsHostSettingsStoreImpl::ValidateHostSettings(const TLbsHostSettingsSupl& aSettings) const
+	{
+	//Validate Connection Type
+	TInt connectionId;
+	TLbsHostSettingsSupl::TLbsConnectionType connectionIdType;
+	aSettings.GetConnectionPoint(connectionId, connectionIdType);
+	if(connectionIdType > TLbsHostSettingsSupl::ELbsConnectionTypeProxy || 
+			connectionIdType < TLbsHostSettingsSupl::ELbsConnectionTypeInvalid)
+		{
+		return KErrArgument;
+		}
+	
+	//Validate port, cannot be negative
+	TInt portId;
+	aSettings.GetPortId(portId);
+	if((portId < 0) || (portId > 0xFFFF))
+		{
+		return KErrArgument;
+		}
+	
+	TUint32 maxAuth = TLbsHostSettingsSupl::EAuthNone + 
+						TLbsHostSettingsSupl::EAuthTls + 
+						TLbsHostSettingsSupl::EAuthAcaTls + 
+						TLbsHostSettingsSupl::EAuthPskTls;
+	// Validate molr host settings cannot be larger than:
+	// EAuthNone(0x1) + EAuthTls(0x2) + EAuthAcaTls(0x4) + EAuthPskTls(0x8) = (0xF)
+	TLbsHostSettingsSupl::TAuthModes authmolr;
+	aSettings.GetAuthModesMOLR(authmolr);
+	if(authmolr > maxAuth)
+		{
+		return KErrArgument;
+		}
+	
+	// PSK/TLS is currently not supported by SUPL implementation.
+	// Return KErrNotSupported if PskTls is the only specified authmode.
+	if(authmolr == TLbsHostSettingsSupl::EAuthPskTls)
+		{
+		return KErrNotSupported;
+		}
+
+	// Validate mtlr host settings cannot be larger than:
+	// EAuthNone(0x1) + EAuthTls(0x2) + EAuthAcaTls(0x4) + EAuthPskTls(0x8) = (0xF)
+	TLbsHostSettingsSupl::TAuthModes authmtlr;
+	aSettings.GetAuthModesMTLR(authmtlr);
+	if(authmtlr > maxAuth)
+		{
+		return KErrArgument;
+		}
+	
+	// PSK/TLS is currently not supported by SUPL implementation.
+	// Return KErrNotSupported if PskTls is the only specified authmode.
+	if(authmtlr == TLbsHostSettingsSupl::EAuthPskTls)
+		{
+		return KErrNotSupported;
+		}
+		
+	// Passed validation
+	return KErrNone;
+	}
+