--- /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;
+ }
+