supl/locationsuplfw/settingsapi/src/epos_csettingsdatabasehandler.cpp
changeset 0 667063e416a2
child 4 42de37ce7ce4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/supl/locationsuplfw/settingsapi/src/epos_csettingsdatabasehandler.cpp	Tue Feb 02 01:06:48 2010 +0200
@@ -0,0 +1,3750 @@
+/*
+* Copyright (c) 2007-2008 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:   SUPL Settings class
+*
+*/
+
+
+
+#include <f32file.h>
+#include <badesca.h>    // CDesCArrayFlat
+#include <bautils.h>    // file helpers
+#include <eikenv.h>
+#include <e32cmn.h>
+#include <centralrepository.h> //for central repository
+
+//#define PRINT_MESSAGE           //for logging 
+#define ENABLE_DEBUG
+
+#include "epos_csuplsettings.h"
+#include "epos_csettingsdatabasehandler.h"
+#include "epos_csuplsettingparams.h"
+#include "epos_csuplsettingextensionparams.h"
+#include "epos_csuplsettingsconstants.h"
+#include "epos_csuplsettingsinternalconstants.h"
+#include "epos_csuplserverprivatecrkeys.h" //for keys of default setting values stored in cen rep
+#include "epos_csuplsettingsinternalcrkeys.h"     //for keys of setting change events used for notification
+
+// Implementation specific constants
+
+//some string length contants
+const int KDateStringLen = 64;         
+const int KGenericStringLen = 255;
+const int KShortStringLen = 32;
+
+const TInt KMaxLenSLPAddress = 64;
+const TInt KMaxLenIAPName = 16;
+
+//integer values used to set or reset a boolen flag corresponding to slp properties
+const TInt KEmergencySupport = 1;
+const TInt KTlsEnabled = 2;
+const TInt KPskTlsUsed = 4;
+const TInt KServerEnabled = 8;
+const TInt KSimChangeRemove = 32;
+const TInt KUsageInHomeNw = 64;
+const TInt KEditable = 128;
+
+//values used to set and retrieve major and minor version numbers from a single int
+const TInt KVersionMinorMask = 255;
+const TInt KVersionMajorMask = 8;
+
+//values used to set and retrieve mcc,mnc values from a single int
+const TInt KMccShift = 20;
+const TInt KMncMask = 1023;
+const TInt KMncShift= 10;
+
+
+const TInt KMinPriorityValue = 1; //The minimum value for the priority field
+
+//all strings related to SQL Statements used to form valid SQL statements
+
+_LIT(KSecureDBDrive,"c:");
+_LIT(KSecureDBName,"settings.db");
+_LIT(KCreateTable, "CREATE TABLE");
+_LIT(KCreateTableName," SUPLSETTINGS ");
+_LIT(KInsertIntoTable," INSERT INTO ");
+_LIT(KValues," VALUES");
+_LIT(KDeleteRecord,"DELETE FROM ");
+_LIT(KUpdateRecord,"UPDATE ");
+_LIT(KWhere," WHERE ");
+_LIT(KSET," SET ");
+_LIT(KSelect,"SELECT ");
+_LIT(KFrom," FROM ");
+_LIT(KMax," MAX ");
+_LIT(KOrderBy," ORDER BY ");
+_LIT(KOpeningBracket,"(");
+_LIT(KClosingBracket,")");
+_LIT(KCommaSeparator,",");
+_LIT(KQuotes,"'");
+_LIT(KEquals," = ");
+_LIT(KGreaterOrEquals," >= ");
+_LIT(KGreaterThan," > ");
+_LIT(KStar," * ");
+_LIT(KCount," Count ");
+_LIT(KColSLPId,"SlpID");
+_LIT(KColSLPAddress,"SLPName");
+_LIT(KColManuName, "ManuName");
+_LIT(KColProtocolVersionMajor,"MajorVersion");
+_LIT(KColIap,"IAP");      
+_LIT(KColTimeLastUse,"LastTimeUsed");
+_LIT(KColTimeLastTried,"LastTimeTried");
+_LIT(KColNetInfoLastUse,"NetInfoLastUse");
+_LIT(KColNetLastUseCId,"NwInfoLastUseCId");
+_LIT(KColNetLastUseParams,"NwInfoLastUseParams");
+_LIT(KColNetInfoLastSucess,"NetInfoLastSucess");
+_LIT(KColNetLastSuccParams,"NwInfoLastSuccParams");
+_LIT(KColNetLastSuccCId,"NwInfoLastSuccCId");
+//EEmergencySupport,ETlsEnabled,EPskTlsUsed,EServerEnabled,ESimChangeRemove,EUsageInHomeNw,EEditable
+_LIT(KColOtherProperties,"OtherProperties");
+_LIT(KColPriority,"Priority");
+_LIT(KCaseInsensitive," COLLATE NOCASE ");
+_LIT(KValuePriority,":Priority");
+_LIT(KValueSlpId,":SlpId");
+_LIT(KDataTypeInteger," INTEGER ");
+_LIT(KDataTypeString," VARCHAR");
+_LIT(KDataTypeTime," TIMESTAMP NULL");
+_LIT(KPrimaryKey,"PRIMARY KEY AUTOINCREMENT");
+_LIT(KDateTimeFormat,"%M%D%Y%/0%1%/1%2%/2%3%/3 %-B%:0%J%:1%T%:2%S%:3%+B");   // MM/DD/YYYY hh:mm:ss AM/PM
+
+_LIT(KSessionTableName," SESSIONSETTINGS ");
+_LIT(KColSessionId,"SessionID");
+_LIT(KColSessionName,"SessionName");
+_LIT(KColNotificationPresent,"NotificationPresent");
+_LIT(KColTriggerNotificationStatus, "NotificationStatus");
+_LIT(KColTriggerType,"TriggerType");
+_LIT(KColRequestType,"RequestType");
+_LIT(KColOutstandingTrigger,"OutstandingTrigger");      
+_LIT(KColInterval,"Interval");
+
+_LIT(KColServerId,"ServerId");
+_LIT(KColIap1,"Iap1");
+_LIT(KColIap2,"Iap2");
+_LIT(KColServerAddress,"ServerAddress");
+_LIT(KColServerAddType,"ServerAddType");
+
+
+
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::NewL()
+// ---------------------------------------------------------------------------
+CSettingsDatabaseHandler* CSettingsDatabaseHandler::NewL() 
+    {
+    CSettingsDatabaseHandler* tmp = new (ELeave)CSettingsDatabaseHandler();
+    CleanupStack::PushL(tmp);
+    tmp->ConstructL();
+    CleanupStack::Pop();
+    return tmp;
+    }
+
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::~CSettingsDatabaseHandler()
+//
+// Destructor method
+// ---------------------------------------------------------------------------
+CSettingsDatabaseHandler::~CSettingsDatabaseHandler()
+    {
+    if(iSettingsRep)
+        {
+        delete iSettingsRep;
+        iSettingsRep = NULL;
+        }    
+    if(iSettingsNotifierRep)
+        {
+        delete iSettingsNotifierRep;
+        iSettingsNotifierRep = NULL;
+        }
+    iDb.Close();
+    LogQuery(_L("Deleted Settings DB Handle CLosed"));
+    }
+
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::ConstructL()
+//
+// Second phase construction. Can Leave.
+// ---------------------------------------------------------------------------
+void CSettingsDatabaseHandler::ConstructL()
+    {
+    iSettingsRep = CRepository::NewL(KCRUidSuplConfiguration);
+    iSettingsNotifierRep = CRepository::NewL(KCRUidSuplSettings);
+    CreateOpenSecureDatabaseL();
+    }
+
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::CSettingsDatabaseHandler()
+//
+// Constructor
+// ---------------------------------------------------------------------------
+CSettingsDatabaseHandler::CSettingsDatabaseHandler()
+    {
+
+    }
+
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::CreateOpenSecureDatabaseL()
+//
+// Create a new database and open. The database will be in exclusive access mode.
+// ---------------------------------------------------------------------------
+
+void CSettingsDatabaseHandler::CreateOpenSecureDatabaseL(/*const TDesC& aDbFile*/)
+    {
+    //create a security policy for the database
+    const TSecurityPolicy KPolicy1(ECapabilityReadUserData,ECapabilityWriteUserData);
+    const TSecurityPolicy KPolicy2(ECapabilityReadUserData);
+
+    TSecurityPolicy defaultPolicy(TSecurityPolicy::EAlwaysPass);
+    RSqlSecurityPolicy securityPolicy;
+    CleanupClosePushL(securityPolicy);
+    TInt err = securityPolicy.Create(defaultPolicy);
+
+    PrintErrorMessage(_L(""),err,4);
+ 
+    
+    User::LeaveIfError(err);
+
+    securityPolicy.SetDbPolicy(RSqlSecurityPolicy::ESchemaPolicy, KPolicy1);
+    securityPolicy.SetDbPolicy(RSqlSecurityPolicy::EWritePolicy, KPolicy2);
+   
+    
+
+    TBuf<KShortStringLen> dbPath;
+    TBuf<KShortStringLen> pathBuf;
+    err = GetDBPathFromCR(pathBuf);
+
+    PrintErrorMessage(pathBuf,err,7);
+    
+    if(pathBuf.Length()) //if there is a DB path existing in the CenRep try to open that
+        {
+        dbPath.Copy(KSecureDBDrive);
+        dbPath.Append(pathBuf);
+        dbPath.Append(KSecureDBName);
+        err = iDb.Open(dbPath); // Check if DB exists
+        PrintErrorMessage(dbPath,err,3);       
+        }       
+    							
+
+    if( KErrNotFound == err || pathBuf.Length() <= 0) // if there is no DB Path in the cen rep or the Db does not exist
+        {
+        RProcess process;
+        TBuf<KShortStringLen> uidname;
+        TInt error = process.SecureId().iId;
+        if(error < 0) // if there is no secure id associated with the app use the UID3 value
+            {
+            TUidType tempUidType = process.Type();
+            const TUid& uid = tempUidType[2];
+            uidname.Copy(uid.Name());
+            }
+        else // use the secure id value to create the DB
+            {
+            TSecureId secureID = process.SecureId();
+            TUid uid = TUid::Uid(error);
+            uidname.Copy(uid.Name());
+            
+            }
+        dbPath.Zero();
+        dbPath.Append(KSecureDBDrive);
+        dbPath.Append(uidname);
+        dbPath.Append(KSecureDBName);
+        err = iDb.Create(dbPath, securityPolicy); // create the db with the path that was formed
+
+        PrintErrorMessage(dbPath,err,0);
+                
+        User::LeaveIfError(err);
+                
+        //DB created successfully copy the DB path to CenRep
+        StoreDBPathToCR(uidname);
+        CreateTableL();
+        CreateSessionTableL();
+        }
+    CleanupStack::PopAndDestroy();//securityPolicy;
+  
+    PrintErrorMessage(dbPath,err,3);
+    User::LeaveIfError(err);
+    }
+ 
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::RemoveDb()
+//
+// 
+// ---------------------------------------------------------------------------
+TInt CSettingsDatabaseHandler::RemoveDb()
+    {
+    Close();
+   // iDbs.DeleteDatabase(KWordDatabase,KSecureUid);
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::Close()
+//
+// Close the database.
+// ---------------------------------------------------------------------------
+TInt CSettingsDatabaseHandler::Close()
+    {
+    iDb.Close();
+    LogQuery(_L("CLOSED DB"));
+    return KErrNone;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::CreateTableL()
+//
+// Creates the SUPL Settings table. Leaves, if the table cannot be created.
+// ---------------------------------------------------------------------------
+void CSettingsDatabaseHandler::CreateTableL()
+    {
+    
+    iSQLString.Copy(KCreateTable);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KOpeningBracket);
+
+    iSQLString.Append(KColSLPId);
+    iSQLString.Append(KDataTypeInteger);
+    iSQLString.Append(KPrimaryKey);
+    iSQLString.Append(KCommaSeparator);
+
+    iSQLString.Append(KColSLPAddress);
+    iSQLString.Append(KDataTypeString);
+    iSQLString.Append(KOpeningBracket);
+    iSQLString.AppendNum(KMaxLenSLPAddress);
+    iSQLString.Append(KClosingBracket);
+    iSQLString.Append(KCommaSeparator);
+
+    iSQLString.Append(KColProtocolVersionMajor);
+    iSQLString.Append(KDataTypeInteger);
+    iSQLString.Append(KCommaSeparator);
+
+    iSQLString.Append(KColPriority);
+    iSQLString.Append(KDataTypeInteger);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.Append(KColManuName);
+    iSQLString.Append(KDataTypeString);
+    iSQLString.Append(KOpeningBracket);
+    iSQLString.AppendNum(KGenericStringLen);
+    iSQLString.Append(KClosingBracket);
+    iSQLString.Append(KCommaSeparator); 
+
+    iSQLString.Append(KColIap);
+    iSQLString.Append(KDataTypeString);
+    iSQLString.Append(KOpeningBracket);
+    iSQLString.AppendNum(KMaxLenIAPName);
+    iSQLString.Append(KClosingBracket);
+    iSQLString.Append(KCommaSeparator);
+
+    iSQLString.Append(KColTimeLastUse);
+    iSQLString.Append(KDataTypeTime);
+    iSQLString.Append(KCommaSeparator);
+
+    iSQLString.Append(KColTimeLastTried);
+    iSQLString.Append(KDataTypeTime);
+    iSQLString.Append(KCommaSeparator);
+
+    iSQLString.Append(KColNetInfoLastUse);
+    iSQLString.Append(KDataTypeInteger);
+    iSQLString.Append(KCommaSeparator);
+
+    iSQLString.Append(KColNetInfoLastSucess);
+    iSQLString.Append(KDataTypeInteger);
+    iSQLString.Append(KCommaSeparator);
+
+    iSQLString.Append(KColNetLastUseCId);
+    iSQLString.Append(KDataTypeInteger);
+    iSQLString.Append(KCommaSeparator);
+    iSQLString.Append(KColNetLastUseParams);
+    iSQLString.Append(KDataTypeInteger);
+    iSQLString.Append(KCommaSeparator);
+    iSQLString.Append(KColNetLastSuccCId);
+    iSQLString.Append(KDataTypeInteger);
+    iSQLString.Append(KCommaSeparator);
+    iSQLString.Append(KColNetLastSuccParams);
+    iSQLString.Append(KDataTypeInteger);
+    iSQLString.Append(KCommaSeparator);
+
+    iSQLString.Append(KColOtherProperties);
+    iSQLString.Append(KDataTypeInteger);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.Append(KColServerId);
+    iSQLString.Append(KDataTypeString);
+    iSQLString.Append(KOpeningBracket);
+    iSQLString.AppendNum(KMaxServerIdLen);
+    iSQLString.Append(KClosingBracket);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.Append(KColIap1);
+    iSQLString.Append(KDataTypeString);
+    iSQLString.Append(KOpeningBracket);
+    iSQLString.AppendNum(KMaxLenIAPName);
+    iSQLString.Append(KClosingBracket);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.Append(KColIap2);
+    iSQLString.Append(KDataTypeString);
+    iSQLString.Append(KOpeningBracket);
+    iSQLString.AppendNum(KMaxLenIAPName);
+    iSQLString.Append(KClosingBracket);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.Append(KColServerAddress);
+    iSQLString.Append(KDataTypeString);
+    iSQLString.Append(KOpeningBracket);
+    iSQLString.AppendNum(KMaxServerAddLen);
+    iSQLString.Append(KClosingBracket);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.Append(KColServerAddType);
+    iSQLString.Append(KDataTypeString);
+    iSQLString.Append(KOpeningBracket);
+    iSQLString.AppendNum(KMaxServerAddTypeLen);
+    iSQLString.Append(KClosingBracket);
+    
+    iSQLString.Append(KClosingBracket);
+   
+    TInt err = iDb.Exec(iSQLString);
+
+    PrintErrorMessage(iSQLString,err,1);							
+        
+    User::LeaveIfError(err);
+
+    }
+
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::InsertSLPRecordL()
+//
+// This method is used to insert SLP record into the SUPL Settings DB
+// ---------------------------------------------------------------------------
+void CSettingsDatabaseHandler::InsertSLPRecordL(const CServerParams* aServParamValues,TInt64& aSlpId)
+    {    
+   
+    HBufC* SLPAddress = HBufC::NewLC( KMaxHSLPAddrLen);
+    HBufC* IAPName = HBufC::NewLC( KMaxIAPLen);      
+    HBufC* manuName = HBufC::NewLC(KMaxHSLPAddrLen);
+    
+    TBuf<KMaxServerAddTypeLen> serverAddTypeDefault;
+    serverAddTypeDefault.Copy(_L("FQDN"));
+    
+    TUint16* buf = NULL;
+    TPtr nullDefault(buf,0);
+        
+    TBuf<KDateStringLen> lastUseDateTimeFormat;
+    TBuf<KDateStringLen> lasttriedDateTimeFormat;
+    
+    TInt err = KErrNone;
+    
+    TInt64 slpId;
+    TInt protocolVersion = 0; 
+    TTime  timeLastUse;
+    TTime  timeLastTried;
+    
+    TInt32  netInfoLastUse = 0;
+    TInt32  netInfoLastSucess = 0;
+    TBool   serverEnabled,simChangeRemove,usageInHomeNw,editable;
+    
+    TInt ret = 0;
+    ret = aServParamValues->Get(slpId,SLPAddress->Des(),IAPName->Des(),serverEnabled,simChangeRemove,usageInHomeNw,editable);
+    if(ret == KErrNotFound)
+        {
+        CleanupStack::PopAndDestroy(3); //SLPAddress,IAPName,manuName
+        aSlpId = -1;
+        PrintErrorMessage(_L(""),KErrNotFound,8);
+        User::Leave(KErrGeneral);        
+        }
+    if(IsSlpExists(*SLPAddress))
+        {
+        PrintErrorMessage(_L(""),KErrAlreadyExists,8);
+        User::Leave(KErrAlreadyExists);  
+        }
+    err = GetDefaultCRValues(KSuplProtoclVersion,protocolVersion); //get default values to be set from CR
+    PrintErrorMessage(_L(""),err,8);
+    User::LeaveIfError(err);
+    TBool   emergencySupport;
+    err = GetDefaultCRValues(KSuplEmergencySupport,emergencySupport); //get default values to be set from CR
+    PrintErrorMessage(_L(""),err,8);
+    User::LeaveIfError(err);
+    TBool   tlsEnabled;
+    err = GetDefaultCRValues(KSuplTlsEnable,tlsEnabled); //get default values to be set from CR
+    PrintErrorMessage(_L(""),err,8);
+    User::LeaveIfError(err);
+    TBool   pskTlsUsed;
+    err = GetDefaultCRValues(KSuplPskTlsEnable,pskTlsUsed); //get default values to be set from CR
+    PrintErrorMessage(_L(""),err,8);
+    User::LeaveIfError(err);
+
+    timeLastUse.FormatL(lastUseDateTimeFormat,KDateTimeFormat); 
+    timeLastTried.FormatL(lasttriedDateTimeFormat,KDateTimeFormat); 
+    //form other properties int based on the returned TBool Values
+    TInt OtherProperties = 0; //set to all false
+   
+    if(emergencySupport)
+        {
+        OtherProperties |= KEmergencySupport;
+        }
+    if(tlsEnabled)
+        {
+        OtherProperties |= KTlsEnabled;
+        }
+    if(pskTlsUsed)
+        {
+        OtherProperties |= KPskTlsUsed;
+        }
+    if(serverEnabled)
+        {
+        OtherProperties |= KServerEnabled;
+        }
+    if(simChangeRemove)
+        {
+        OtherProperties |= KSimChangeRemove;
+        }
+    if(usageInHomeNw)
+        {
+        OtherProperties |= KUsageInHomeNw;
+        }
+    if(editable)
+        {
+        OtherProperties |= KEditable;
+        }
+    
+    TBuf<KGenericStringLen> tempBuf;
+    tempBuf.Copy(*SLPAddress);
+    tempBuf.Trim();
+    
+    iSQLString.Copy(KInsertIntoTable);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KOpeningBracket);
+
+    iSQLString.Append(KColSLPAddress);
+    iSQLString.Append(KCommaSeparator);
+
+
+    iSQLString.Append(KColPriority);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.Append(KColProtocolVersionMajor);
+    iSQLString.Append(KCommaSeparator);
+
+    iSQLString.Append(KColManuName);
+    iSQLString.Append(KCommaSeparator);
+        
+    iSQLString.Append(KColIap);
+    iSQLString.Append(KCommaSeparator);
+
+    iSQLString.Append(KColTimeLastUse);
+    iSQLString.Append(KCommaSeparator);
+
+    iSQLString.Append(KColTimeLastTried);
+    iSQLString.Append(KCommaSeparator);
+
+    iSQLString.Append(KColNetInfoLastUse);
+    iSQLString.Append(KCommaSeparator);
+
+    iSQLString.Append(KColNetInfoLastSucess);
+    iSQLString.Append(KCommaSeparator);
+
+    iSQLString.Append(KColOtherProperties);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.Append(KColServerId);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.Append(KColIap1);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.Append(KColIap2);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.Append(KColServerAddress);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.Append(KColServerAddType);
+        
+    iSQLString.Append(KClosingBracket);
+
+    iSQLString.Append(KValues);
+
+    iSQLString.Append(KOpeningBracket);
+
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(tempBuf);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(KCommaSeparator);
+
+    TInt priority = 0;
+    GetMaxPriorityL(priority);
+    iSQLString.AppendNum(priority); // set all servers to max priority by default   
+    iSQLString.Append(KCommaSeparator);
+
+    iSQLString.AppendNum(protocolVersion);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(*manuName);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(KCommaSeparator);
+
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(*IAPName);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(KCommaSeparator);
+
+
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(lastUseDateTimeFormat);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(KCommaSeparator);
+
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(lasttriedDateTimeFormat);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(KCommaSeparator);
+
+    iSQLString.AppendNum(netInfoLastUse);
+    iSQLString.Append(KCommaSeparator);
+
+    iSQLString.AppendNum(netInfoLastSucess);
+    iSQLString.Append(KCommaSeparator);
+
+    iSQLString.AppendNum(OtherProperties);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(nullDefault);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(nullDefault);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(nullDefault);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(nullDefault);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(serverAddTypeDefault);
+    iSQLString.Append(KQuotes);
+        
+    iSQLString.Append(KClosingBracket);
+
+    CleanupStack::PopAndDestroy(3); //SLPAddress,IAPName,manuName
+    
+    err = iDb.Exec(_L("BEGIN")); 
+    err = iDb.Exec(iSQLString);
+    PrintErrorMessage(iSQLString,err,2);                                         
+    if(err < 0)
+        User::Leave(KErrGeneral);
+    aSlpId  = GetLastInsertedSLPID();
+    iDb.Exec(_L("COMMIT")); 
+
+    err = NotifyDBChange(MSuplSettingsObserver::ESuplSettingsDBAddEvent,aSlpId);
+    
+    }
+    
+// ----------------------------------------------------------------------------
+// CSettingsDatabaseHandler::DeleteSLPRecordL()
+//
+// This method is used to delete a SLP record corresponding to the given SLP ID
+// ----------------------------------------------------------------------------
+void CSettingsDatabaseHandler::DeleteSLPRecordL(TInt64 aSLPId)
+    {
+    if(!IsSlpExists(aSLPId)) //no slp exists with the given id so return error
+        {
+        PrintErrorMessage(_L(""),KErrNotFound,9);
+        User::Leave(KErrNotFound);
+        }
+
+    iSQLString.Copy(KDeleteRecord);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSLPId);
+    iSQLString.Append(KEquals);
+    iSQLString.AppendNum(aSLPId);
+
+    TInt err = iDb.Exec(iSQLString);
+    PrintErrorMessage(iSQLString,err,5);
+    if(err < 0)
+        User::Leave(KErrGeneral);
+    NormalizePriorityL();
+    err = NotifyDBChange(MSuplSettingsObserver::ESuplSettingsDBDeleteEvent,aSLPId); // notify about a change in the database
+
+    }
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::UpdateSLPRecordL()
+//
+// This method is used to update a column of string value corresponding 
+// to a particular slp
+// ---------------------------------------------------------------------------
+       
+void CSettingsDatabaseHandler::UpdateSLPRecordL(TInt64 aSLPId,CSuplSettingsInternal::TServerParam aParameter,const TDesC& aValue)
+    {
+    if(!IsSlpExists(aSLPId)) //no slp exists with the given id so return error
+        {
+        PrintErrorMessage(_L(""),KErrArgument,9);
+        User::Leave(KErrArgument);
+        }
+    switch(aParameter)
+        {
+        case CSuplSettingsInternal::EIap:
+            if(aValue.Length() > KMaxIAPLen || aValue.Length() <= 0) //check for max length of IAP 
+                {
+                PrintErrorMessage(_L(""),KErrArgument,9);
+                User::Leave(KErrArgument);
+                }
+
+            break;
+        case CSuplSettingsInternal::EServerAddress:
+            {
+            TInt64 slpId;
+            if(IsSlpExists(aValue,slpId))
+                {
+                if(slpId == aSLPId)//the requested server already has the server name set
+                    return;
+                PrintErrorMessage(_L(""),KErrAlreadyExists,9);
+                User::Leave(KErrAlreadyExists);
+                }
+            if(aValue.Length() > KGenericStringLen || aValue.Length() <= 0)
+                {
+                PrintErrorMessage(_L(""),KErrArgument,9);
+                User::Leave(KErrArgument);
+                }
+            }
+            break;
+        default:
+            if(aValue.Length() > KGenericStringLen || aValue.Length() <= 0)
+                {
+                PrintErrorMessage(_L(""),KErrArgument,9);
+                User::Leave(KErrArgument);
+                }
+            break;
+        
+        }
+
+
+    iSQLString.Copy(KUpdateRecord);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KSET);
+
+    TBuf<KGenericStringLen> tempBuf;
+    tempBuf.Copy(aValue);
+    //remove additional spaces
+    tempBuf.Trim();
+    FormSLPQueryL(aParameter,tempBuf,iSQLString);
+
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSLPId);
+    iSQLString.Append(KEquals);
+    iSQLString.AppendNum(aSLPId);
+
+    TInt err = iDb.Exec(iSQLString);
+    PrintErrorMessage(iSQLString,err,6);				
+    if(err < 0)
+           User::Leave(KErrGeneral);
+    err = NotifyDBChange(MSuplSettingsObserver::ESuplSettingsDBUpdateEvent,aSLPId);
+
+    }
+
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::UpdateSLPRecordL()
+//
+// This method is used to update a column of integer value corresponding 
+//  to a particular slp
+// ---------------------------------------------------------------------------
+       
+void CSettingsDatabaseHandler::UpdateSLPRecordL(TInt64 aSLPId,CSuplSettingsInternal::TServerParam aParameter,TInt aValue)
+    {
+    
+    if(!IsSlpExists(aSLPId))
+        {
+        PrintErrorMessage(_L(""),KErrArgument,9);
+        User::Leave(KErrArgument);
+        }
+    iSLPId = aSLPId;
+
+    iSQLString.Copy(KUpdateRecord);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KSET);
+
+    FormSLPQueryL(aParameter,aValue,iSQLString);
+
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSLPId);
+    iSQLString.Append(KEquals);
+    iSQLString.AppendNum(aSLPId);
+
+    TInt err = iDb.Exec(iSQLString);
+    PrintErrorMessage(iSQLString,err,6);	
+    if(err < 0)
+           User::Leave(KErrGeneral);
+    err = NotifyDBChange(MSuplSettingsObserver::ESuplSettingsDBUpdateEvent,aSLPId);
+    }
+
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::UpdateSLPRecordL()
+//
+// This method is used to update a column of TTime value corresponding to 
+// a particular slp
+// ---------------------------------------------------------------------------
+        
+void CSettingsDatabaseHandler::UpdateSLPRecordL(TInt64 aSLPId,CSuplSettingsInternal::TServerParam aParameter,TTime aValue)
+    {
+
+    iSQLString.Copy(KUpdateRecord);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KSET);
+
+    FormSLPQueryL(aParameter,aValue,iSQLString);
+
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSLPId);
+    iSQLString.Append(KEquals);
+    iSQLString.AppendNum(aSLPId);
+
+    TInt err = iDb.Exec(iSQLString); 
+
+    PrintErrorMessage(iSQLString,err,6);	
+    
+    if(err < 0)
+           User::Leave(KErrGeneral);
+    err = NotifyDBChange(MSuplSettingsObserver::ESuplSettingsDBUpdateEvent,aSLPId);
+    }
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::UpdateSLPRecordL()
+//
+// This method is used to update all configurable parameters corresponding 
+// to a partiular SLP
+// ---------------------------------------------------------------------------
+void CSettingsDatabaseHandler::UpdateSLPRecordL(const CServerParams* aParamValues)
+    {
+
+    TInt64 slpId;
+    HBufC* SLPAddress = HBufC::NewLC( KMaxHSLPAddrLen);
+    
+    HBufC* IAPName = HBufC::NewLC( KMaxIAPLen);
+    TBool  serverEnabled,simChangeRemove,usageInHomeNw,editable;
+
+
+    TInt ret = 0;
+    ret = aParamValues->Get(slpId,SLPAddress->Des(),IAPName->Des(),serverEnabled,simChangeRemove,usageInHomeNw,editable);
+    if(ret == KErrNotFound || slpId == -1 )
+        {
+        CleanupStack::PopAndDestroy(2); //SLPAddress,IAPName
+        PrintErrorMessage(_L(""),KErrArgument,9);
+        User::Leave(KErrArgument); 
+        }
+    if(!IsSlpExists(slpId))
+        {
+        CleanupStack::PopAndDestroy(2); //SLPAddress,IAPName
+        PrintErrorMessage(_L(""),KErrNotFound,9);
+        User::Leave(KErrNotFound);
+        }
+    
+    //form other properties int based on the returned TBool Values
+    TInt OtherProperties = 0; //set to all false
+    ret = GetOtherPropertyValue(slpId,OtherProperties); //get the current value of all flags
+    if(ret != KErrNone)
+        {
+        CleanupStack::PopAndDestroy(2);//SLPAddress,IAPName
+        PrintErrorMessage(_L(""),KErrGeneral,9);
+        User::Leave(KErrGeneral);
+        }
+
+    if(serverEnabled)
+         {
+         OtherProperties |= KServerEnabled;
+         }
+     else
+         {
+         OtherProperties &= ~KServerEnabled;
+         }
+     if(simChangeRemove)
+         {
+         OtherProperties |= KSimChangeRemove;
+         }
+     else
+         {
+         OtherProperties &= ~KSimChangeRemove;
+         }
+     if(usageInHomeNw)
+         {
+         OtherProperties |= KUsageInHomeNw;
+         }
+     else
+         {
+         OtherProperties &= ~KUsageInHomeNw;
+         }
+     if(editable)
+         {
+         OtherProperties |= KEditable;
+         }
+     else
+         {
+         OtherProperties &= ~KEditable;
+         }
+
+     TBuf<KGenericStringLen> tempBuf;
+     tempBuf.Copy(*SLPAddress);
+     tempBuf.Trim();
+    iSQLString.Copy(KUpdateRecord);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KSET);
+    iSQLString.Append(KColSLPAddress);
+    iSQLString.Append(KEquals);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(tempBuf);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(KCommaSeparator);
+
+    iSQLString.Append(KColIap);
+    iSQLString.Append(KEquals);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(*IAPName);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(KCommaSeparator);
+
+
+    iSQLString.Append(KColOtherProperties);
+    iSQLString.Append(KEquals);
+    iSQLString.Append(KQuotes);
+    iSQLString.AppendNum(OtherProperties);
+    iSQLString.Append(KQuotes);
+
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSLPId);
+    iSQLString.Append(KEquals);
+    iSQLString.AppendNum(slpId);
+    
+    TInt err = iDb.Exec(iSQLString); 
+    PrintErrorMessage(iSQLString,err,6); 
+    CleanupStack::PopAndDestroy(2);
+    if(err < 0)
+        {
+        PrintErrorMessage(_L(""),KErrGeneral,9);
+        User::Leave(KErrGeneral);
+        }
+
+    err = NotifyDBChange(MSuplSettingsObserver::ESuplSettingsDBUpdateEvent,slpId);
+    }
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::UpdateSLPRecordL()
+//
+// This method is used to update a column  corresponding to version number 
+// of a particular slp
+// ---------------------------------------------------------------------------
+void CSettingsDatabaseHandler::UpdateSLPRecordL(TInt64 aSLPId,TInt aMajor, TInt aMinor)
+    {
+    if(!IsSlpExists(aSLPId))
+        {
+        PrintErrorMessage(_L(""),KErrArgument,9);
+        User::Leave(KErrArgument); 
+        }
+    if(aMajor < 0 || aMajor > 255 || aMinor < 0 || aMinor > 255 )
+        {
+        PrintErrorMessage(_L(""),KErrArgument,9);
+        User::Leave(KErrArgument); 
+        }
+    TInt protocolVersion = aMajor<< KVersionMajorMask | aMinor;
+
+    iSQLString.Copy(KUpdateRecord);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KSET);
+    iSQLString.Append(KColProtocolVersionMajor);
+    iSQLString.Append(KEquals);
+    iSQLString.Append(KQuotes);
+    iSQLString.AppendNum(protocolVersion);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSLPId);
+    iSQLString.Append(KEquals);
+    iSQLString.AppendNum(aSLPId);
+
+    TInt err = iDb.Exec(iSQLString);
+
+    PrintErrorMessage(iSQLString,err,6); 
+
+    if(err < 0)
+        User::Leave(KErrGeneral);
+    err = NotifyDBChange(MSuplSettingsObserver::ESuplSettingsDBUpdateEvent,aSLPId);
+    }
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::UpdateSLPRecordL()
+//
+// This method is used to update a column corresponding to N/w Info Last Use/ 
+//  Last Success of a particular slp
+// ---------------------------------------------------------------------------
+void CSettingsDatabaseHandler::UpdateSLPRecordL(TInt64 aSLPId,CSuplSettingsInternal::TServerParam aParamType ,
+                                                const CSuplSettingsInternal::TSuplSettingsNetworkType aNetType, 
+                                                const TInt aMcc, const TInt aMnc, const TInt aCid, const TInt aLac)
+    {
+    if(!IsSlpExists(aSLPId))
+        {
+        PrintErrorMessage(_L(""),KErrArgument,9);
+        User::Leave(KErrArgument); 
+        }
+    if(aMcc < 0 || aMcc > 999 || aMnc < 0 || aMnc > 999 || aLac < 0 || aLac > 65535)//these params are 8 bit ints and cant go beyond 255
+        {
+        PrintErrorMessage(_L(""),KErrArgument,9);
+        User::Leave(KErrArgument); 
+        }
+    TInt64 nwparams = aMcc << KMccShift | aMnc << KMncShift | aLac;
+    
+
+    iSQLString.Copy(KUpdateRecord);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KSET);
+    switch(aParamType)
+        {
+        case CSuplSettingsInternal::ENetInfoLastUse:
+            iSQLString.Append(KColNetInfoLastUse);
+            iSQLString.Append(KEquals);
+            iSQLString.Append(KQuotes);
+            iSQLString.AppendNum(aNetType);
+            iSQLString.Append(KQuotes);
+            iSQLString.Append(KCommaSeparator);
+
+            iSQLString.Append(KColNetLastUseCId);
+            iSQLString.Append(KEquals);
+            iSQLString.Append(KQuotes);
+            iSQLString.AppendNum(aCid);
+            iSQLString.Append(KQuotes);
+            iSQLString.Append(KCommaSeparator);
+
+            iSQLString.Append(KColNetLastUseParams);
+            iSQLString.Append(KEquals);
+            iSQLString.Append(KQuotes);
+            iSQLString.AppendNum(nwparams);
+            iSQLString.Append(KQuotes);
+            break;
+        case CSuplSettingsInternal::ENetInfoLastSucess:
+            iSQLString.Append(KColNetInfoLastSucess);
+            iSQLString.Append(KEquals);
+            iSQLString.Append(KQuotes);
+            iSQLString.AppendNum(aNetType);
+            iSQLString.Append(KQuotes);
+            iSQLString.Append(KCommaSeparator);
+
+            iSQLString.Append(KColNetLastSuccCId);
+            iSQLString.Append(KEquals);
+            iSQLString.Append(KQuotes);
+            iSQLString.AppendNum(aCid);
+            iSQLString.Append(KQuotes);
+            iSQLString.Append(KCommaSeparator);
+
+            iSQLString.Append(KColNetLastSuccParams);
+            iSQLString.Append(KEquals);
+            iSQLString.Append(KQuotes);
+            iSQLString.AppendNum(nwparams);
+            iSQLString.Append(KQuotes);
+            break;
+        default:
+            User::Leave(KErrGeneral);
+            break;
+        }
+    
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSLPId);
+    iSQLString.Append(KEquals);
+    iSQLString.AppendNum(aSLPId);
+
+    TInt err = iDb.Exec(iSQLString);
+
+    PrintErrorMessage(iSQLString,err,6); 
+    if(err < 0)
+        User::Leave(KErrGeneral);
+    err = NotifyDBChange(MSuplSettingsObserver::ESuplSettingsDBUpdateEvent,aSLPId);
+    }
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::UpdateDefaultServerL()
+//
+// This method is used to update all configurable parameters corresponding 
+// to a default SLP
+// ---------------------------------------------------------------------------
+void CSettingsDatabaseHandler::UpdateDefaultServerL(const CServerParams* aParamValues)
+    {
+
+    TInt64 defaultSlpId;
+    GetDefaultSLPId(defaultSlpId);
+    if(defaultSlpId == -1) // no server set as default
+        {
+        PrintErrorMessage(_L(""),KErrNotFound,10);
+        User::Leave(KErrNotFound);
+        }
+        
+    HBufC* SLPAddress = HBufC::NewLC( KMaxHSLPAddrLen);           
+    HBufC* IAPName = HBufC::NewLC( KMaxIAPLen);
+    
+    TBool  serverEnabled,simChangeRemove,usageInHomeNw,editable;
+
+
+    TInt ret = 0;
+    TInt64 slpId;
+    ret = aParamValues->Get(slpId,SLPAddress->Des(),IAPName->Des(),serverEnabled,simChangeRemove,usageInHomeNw,editable);
+    if(ret == KErrNotFound )
+        {
+        CleanupStack::PopAndDestroy(2); //SLPAddress,IAPName
+        PrintErrorMessage(_L(""),KErrArgument,10);
+        User::Leave(KErrArgument);
+        }
+    
+    //form other properties int based on the returned TBool Values
+    TInt OtherProperties = 0; //set to all false
+    ret = GetOtherPropertyValue(defaultSlpId,OtherProperties); //get the current value of all flags
+    if(ret != KErrNone)
+        {
+        CleanupStack::PopAndDestroy(2); //SLPAddress,IAPName
+        PrintErrorMessage(_L(""),KErrGeneral,10);
+        User::Leave(KErrGeneral);
+        }
+        
+    
+    if(serverEnabled)
+        {
+        OtherProperties |= KServerEnabled;
+        }
+    else
+        {
+        OtherProperties &= ~KServerEnabled;
+        }
+    if(simChangeRemove)
+        {
+        OtherProperties |= KSimChangeRemove;
+        }
+    else
+        {
+        OtherProperties &= ~KSimChangeRemove;
+        }
+    if(usageInHomeNw)
+        {
+        OtherProperties |= KUsageInHomeNw;
+        }
+    else
+        {
+        OtherProperties &= ~KUsageInHomeNw;
+        }
+    if(editable)
+        {
+        OtherProperties |= KEditable;
+        }
+    else
+        {
+        OtherProperties &= ~KEditable;
+        }
+
+    TBuf<KGenericStringLen> tempBuf;
+    tempBuf.Copy(*SLPAddress);
+    tempBuf.Trim();
+    iSQLString.Copy(KUpdateRecord);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KSET);
+    iSQLString.Append(KColSLPAddress);
+    iSQLString.Append(KEquals);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(tempBuf);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.Append(KColIap);
+    iSQLString.Append(KEquals);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(*IAPName);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(KCommaSeparator);
+
+    iSQLString.Append(KColOtherProperties);
+    iSQLString.Append(KEquals);
+    iSQLString.Append(KQuotes);
+    iSQLString.AppendNum(OtherProperties);
+    iSQLString.Append(KQuotes);
+
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSLPId);
+    iSQLString.Append(KEquals);
+    iSQLString.AppendNum(defaultSlpId);
+    
+    TInt err = iDb.Exec(iSQLString);
+    PrintErrorMessage(iSQLString,err,6); 
+    CleanupStack::PopAndDestroy(2); //SLPAddress,IAPName
+    if(err < 0)
+        {
+        User::Leave(KErrGeneral);
+        }
+   
+    err = NotifyDBChange(MSuplSettingsObserver::ESuplSettingsDBUpdateEvent,defaultSlpId);
+    
+    }
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::SetSLPAsDefaultL()
+//
+// This method is used to set a SLP with a particular id as default
+// ---------------------------------------------------------------------------
+void CSettingsDatabaseHandler::SetSLPAsDefaultL(TInt64 aSLPId)
+    {
+    if(!IsSlpExists(aSLPId))
+        {
+        PrintErrorMessage(_L(""),KErrNotFound,12);
+        User::LeaveIfError(KErrNotFound);
+        }
+
+    SetPriorityL(aSLPId,KMinPriorityValue);
+    PrintErrorMessage(_L(""),KErrNone,12);
+    }
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::GetDefaultSLPId()
+//
+// This method is used to get SLP Id of the default server
+// ---------------------------------------------------------------------------
+TInt CSettingsDatabaseHandler::GetDefaultSLPId(TInt64& aSlpId)
+    {
+    aSlpId = -1;
+
+    iSQLString.Copy(KSelect);
+    iSQLString.Append(KStar);
+    iSQLString.Append(KFrom);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KOrderBy);
+    iSQLString.Append(KColPriority);
+    iSQLString.Append(KCommaSeparator);
+    iSQLString.Append(KColSLPId);
+
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb, iSQLString);
+    TInt columnIndexSLPID = stmt.ColumnIndex(KColSLPId);
+    TInt columnIndexPriority = stmt.ColumnIndex(KColPriority);
+    //Get the first slp in the list in the order of priority/slp id
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        aSlpId = stmt.ColumnInt(columnIndexSLPID);
+        break;
+        }
+     
+    stmt.Close();
+    PrintErrorMessage(iSQLString,err,13);
+    if(aSlpId == -1)
+        {
+        PrintErrorMessage(_L(""),KErrNotFound,14);
+        return KErrNotFound;
+        }
+    PrintErrorMessage(_L(""),KErrNone,14);
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::FormSLPQueryL()
+//
+// Forms part of the query string, used to form a query string that contains 
+// a TTIme value in it 
+// ---------------------------------------------------------------------------
+void CSettingsDatabaseHandler::FormSLPQueryL(CSuplSettingsInternal::TServerParam aParameter,TTime aValue,TDes& aQueryString)
+    {
+    TBuf<64> dateTimeFormat;   
+    aValue.FormatL(dateTimeFormat,KDateTimeFormat); 
+
+    switch(aParameter)
+        {
+        case CSuplSettingsInternal::ETimeLastTried: 
+            {
+            aQueryString.Append(KColTimeLastTried);
+            break;
+            }
+        case CSuplSettingsInternal::ETimeLastUse:
+            {
+            aQueryString.Append(KColTimeLastUse);
+            break;
+            }
+        default:User::Leave(KErrArgument);
+        }
+
+    aQueryString.Append(KEquals);
+    aQueryString.Append(KQuotes);
+    aQueryString.Append(dateTimeFormat);
+    aQueryString.Append(KQuotes);
+    }
+
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::FormSLPQueryL()
+//
+// Forms part of the query string, used to form a query string that contains 
+// a TInt value in it 
+// ---------------------------------------------------------------------------
+    
+void CSettingsDatabaseHandler::FormSLPQueryL(CSuplSettingsInternal::TServerParam aParameter,TInt aValue,TDes& aQueryString)
+    { 
+    switch(aParameter)
+        {
+        case CSuplSettingsInternal::ENetInfoLastUse:
+            {
+            aQueryString.Append(KColNetInfoLastUse);
+            break;
+            }
+        case CSuplSettingsInternal::ENetInfoLastSucess:
+            {
+            aQueryString.Append(KColNetInfoLastSucess);
+            break;
+            }
+        case CSuplSettingsInternal::EEmergencySupport: 
+        case CSuplSettingsInternal::ETlsEnabled: 
+        case CSuplSettingsInternal::EPskTlsUsed: 
+        case CSuplSettingsInternal::EServerEnabled: 
+        case CSuplSettingsInternal::EManufacturer: 
+        case CSuplSettingsInternal::ESimChangeRemove:
+        case CSuplSettingsInternal::EUsageInHomeNw:
+        case CSuplSettingsInternal::EEditable:
+            {
+            aValue = SetOtherPropertiesL(aParameter,aValue);
+            aQueryString.Append(KColOtherProperties);
+            break;
+            }
+        default:
+            {
+            User::Leave(KErrArgument);
+            break;
+            }
+
+
+        }	
+    aQueryString.Append(KEquals);
+    aQueryString.AppendNum(aValue);
+    }
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::FormSLPQueryL()
+//
+// Forms part of the query string, used to form a query string that contains 
+// a String value in it 
+// ---------------------------------------------------------------------------
+void CSettingsDatabaseHandler::FormSLPQueryL(CSuplSettingsInternal::TServerParam aParameter,const TDesC& aValue,TDes& aQueryString)
+    {
+    switch(aParameter)
+        {
+
+        case CSuplSettingsInternal::EServerAddress: 
+            {
+            aQueryString.Append(KColSLPAddress);
+            break;
+            }
+
+        case CSuplSettingsInternal::EIap: 
+            {
+            aQueryString.Append(KColIap);
+            break;
+            }
+        case CSuplSettingsInternal::EManufacturer: 
+            {
+            aQueryString.Append(KColManuName);
+            break;
+            }
+
+        default:User::Leave(KErrArgument);
+        }
+
+    aQueryString.Append(KEquals);
+    aQueryString.Append(KQuotes);
+    aQueryString.Append(aValue);
+    aQueryString.Append(KQuotes);
+    }				
+
+
+
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::GetNwInfoPropertiesL()
+//
+// This method is used to retrieve a colummn corresponding to N/w Info Last 
+//  Use/Last Success of a particular slp
+// ---------------------------------------------------------------------------
+void CSettingsDatabaseHandler::GetNwInfoPropertiesL(TInt64 aSLPId,CSuplSettingsInternal::TServerParam& aParamType ,
+        CSuplSettingsInternal::TSuplSettingsNetworkType& aNetType,TInt& aMcc,TInt& aMnc, 
+        TInt& aCid, TInt& aLac)
+    {
+    if(!IsSlpExists(aSLPId))
+        {
+        PrintErrorMessage(_L(""),KErrArgument,14);
+        User::Leave(KErrArgument);
+        }
+
+    iSQLString.Copy(KSelect);
+    iSQLString.Append(KStar);
+    iSQLString.Append(KFrom);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSLPId);
+    iSQLString.Append(KEquals);
+    iSQLString.AppendNum(aSLPId);
+
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb, iSQLString);
+    if(err != KErrNone)
+        {
+        PrintErrorMessage(_L(""),KErrGeneral,14);
+        User::Leave(KErrGeneral);
+        }
+           
+    TInt columnIndexNwType = 0;
+    TInt columnIndexCid = 0;
+    TInt columnIndexParams = 0;
+    TInt64 nwParams = 0;
+
+                
+    switch(aParamType)
+        {
+        case CSuplSettingsInternal::ENetInfoLastSucess:
+            columnIndexNwType = stmt.ColumnIndex(KColNetInfoLastSucess);
+            columnIndexParams = stmt.ColumnIndex(KColNetLastSuccParams);
+            columnIndexCid = stmt.ColumnIndex(KColNetLastSuccCId);
+            break;
+        case CSuplSettingsInternal::ENetInfoLastUse:
+            columnIndexNwType = stmt.ColumnIndex(KColNetInfoLastUse);
+            columnIndexParams = stmt.ColumnIndex(KColNetLastUseParams);
+            columnIndexCid = stmt.ColumnIndex(KColNetLastUseCId);
+            break;
+        default:
+            User::Leave(KErrGeneral);
+        }
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        aNetType = (CSuplSettingsInternal::TSuplSettingsNetworkType) stmt.ColumnInt(columnIndexNwType);
+        aCid = stmt.ColumnInt(columnIndexCid);
+        nwParams = stmt.ColumnInt64(columnIndexParams);
+        }
+    aMcc = nwParams>>KMccShift;
+    aMnc = (nwParams>>KMncShift)& KMncMask;
+    aLac = nwParams & KMncMask;
+    PrintErrorMessage(_L(""),KErrNone,14);
+    #ifdef PRINT_MESSAGE
+        TBuf<5> mccBuf;
+        mccBuf.AppendNum(aMcc);
+        TBuf<5> mncBuf;
+        mncBuf.AppendNum(aMnc);
+        TBuf<5> lacBuf;
+        lacBuf.AppendNum(aLac);
+        LogQuery(mccBuf);
+        LogQuery(mncBuf);
+        LogQuery(lacBuf);
+    #endif
+    stmt.Close();
+    }
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::SetOtherPropertiesL()
+//
+//
+// ---------------------------------------------------------------------------
+TInt CSettingsDatabaseHandler::SetOtherPropertiesL(CSuplSettingsInternal::TServerParam aParameter,TInt aValue)
+    {
+    TInt OtherProperty = 0;
+    TBuf<KGenericStringLen>  sqlString;
+    sqlString.Copy(KSelect);
+    sqlString.Append(KColOtherProperties);
+    sqlString.Append(KFrom);
+    sqlString.Append(KCreateTableName);
+    sqlString.Append(KWhere);
+    sqlString.Append(KColSLPId);
+    sqlString.Append(KEquals);
+    sqlString.AppendNum(iSLPId);
+
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb, sqlString);
+    if(err != KErrNone)
+        User::Leave(KErrGeneral);
+    TInt columnIndex0=0; 
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        OtherProperty = stmt.ColumnInt(columnIndex0);
+        }	
+
+    if(aValue == 1)
+        {
+        switch(aParameter)
+            {
+            case CSuplSettingsInternal::EEmergencySupport: 
+                OtherProperty = OtherProperty | KEmergencySupport; break;
+            case CSuplSettingsInternal::ETlsEnabled: 
+                OtherProperty = OtherProperty | KTlsEnabled; break;
+            case CSuplSettingsInternal::EPskTlsUsed: 
+                OtherProperty = OtherProperty | KPskTlsUsed; break;
+            case CSuplSettingsInternal::EServerEnabled: 
+                OtherProperty = OtherProperty | KServerEnabled; break;
+            
+            case CSuplSettingsInternal::ESimChangeRemove:
+                OtherProperty = OtherProperty | KSimChangeRemove; break;
+            case CSuplSettingsInternal::EUsageInHomeNw:
+                OtherProperty = OtherProperty | KUsageInHomeNw; break;
+            case CSuplSettingsInternal::EEditable:
+                OtherProperty = OtherProperty | KEditable; break;
+            default:{ User::Leave(KErrArgument);}
+            }	
+        }
+    else
+        {
+        switch(aParameter)
+            {
+            case CSuplSettingsInternal::EEmergencySupport: 
+                OtherProperty = OtherProperty & ~KEmergencySupport; break;
+            case CSuplSettingsInternal::ETlsEnabled: 
+                OtherProperty = OtherProperty & ~KTlsEnabled; break;
+            case CSuplSettingsInternal::EPskTlsUsed: 
+                OtherProperty = OtherProperty & ~KPskTlsUsed; break;
+            case CSuplSettingsInternal::EServerEnabled: 
+                OtherProperty = OtherProperty & ~KServerEnabled; break;
+            
+            case CSuplSettingsInternal::ESimChangeRemove:
+                OtherProperty = OtherProperty & ~KSimChangeRemove; break;
+            case CSuplSettingsInternal::EUsageInHomeNw:
+                OtherProperty = OtherProperty & ~KUsageInHomeNw; break;
+            case CSuplSettingsInternal::EEditable:
+                OtherProperty = OtherProperty & ~KEditable; break;
+            default:User::Leave(KErrArgument);
+            }
+        }	 
+    stmt.Close();
+    return OtherProperty;			
+    }
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::GetOtherPropertiesL()
+//
+// This method is used to get other flags associated with a slp
+// ---------------------------------------------------------------------------
+void CSettingsDatabaseHandler::GetOtherPropertiesL(TInt64 aSLPId,CSuplSettingsInternal::TServerParam aParameter,TInt& aValue)
+    {
+    if(!IsSlpExists(aSLPId))
+        User::Leave(KErrArgument);
+    TInt OtherProperty = 0;
+
+    iSQLString.Copy(KSelect);
+    iSQLString.Append(KColOtherProperties);
+    iSQLString.Append(KFrom);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSLPId);
+    iSQLString.Append(KEquals);
+    iSQLString.AppendNum(aSLPId);
+
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb, iSQLString);
+    if(err != KErrNone)
+        User::Leave(KErrGeneral);
+    TInt columnIndex0=0; 
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        OtherProperty = stmt.ColumnInt(columnIndex0);
+        }   
+    
+    switch(aParameter)
+        {
+        case CSuplSettingsInternal::EEmergencySupport: 
+            OtherProperty = OtherProperty & KEmergencySupport; break;
+        case CSuplSettingsInternal::ETlsEnabled: 
+            OtherProperty = OtherProperty & KTlsEnabled; break;
+        case CSuplSettingsInternal::EPskTlsUsed: 
+            OtherProperty = OtherProperty & KPskTlsUsed; break;
+        case CSuplSettingsInternal::EServerEnabled: 
+            OtherProperty = OtherProperty & KServerEnabled; break;
+        case CSuplSettingsInternal::ESimChangeRemove:
+            OtherProperty = OtherProperty & KSimChangeRemove; break;
+        case CSuplSettingsInternal::EUsageInHomeNw:
+            OtherProperty = OtherProperty & KUsageInHomeNw; break;
+        case CSuplSettingsInternal::EEditable:
+            OtherProperty = OtherProperty & KEditable; break;
+        default:
+            User::Leave(KErrArgument);break;
+        }   
+    if(OtherProperty > 0)
+        {
+        aValue = ETrue;
+        }
+    else
+        aValue = EFalse;
+
+    stmt.Close();
+    }
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::GetOtherPropertyValue()
+//
+// Used to retrieve other parameters associated with a slp
+// ---------------------------------------------------------------------------
+TInt CSettingsDatabaseHandler::GetOtherPropertyValue(TInt64 aSLPId,TInt& aOtherPropertyValue)
+    {
+
+    TInt OtherProperty = 0;
+
+
+    iSQLString.Copy(KSelect);
+    iSQLString.Append(KColOtherProperties);
+    iSQLString.Append(KFrom);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSLPId);
+    iSQLString.Append(KEquals);
+    iSQLString.AppendNum(aSLPId);
+
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb, iSQLString);
+    if(err != KErrNone)
+        return KErrGeneral;
+    TInt columnIndex0=0; 
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        OtherProperty = stmt.ColumnInt(columnIndex0);
+        }   
+    
+    aOtherPropertyValue = OtherProperty;
+    stmt.Close();
+    return KErrNone;
+    }
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::GetLastInsertedSLPID()
+//
+// Returns the last inserted slp id
+// ---------------------------------------------------------------------------
+TInt64 CSettingsDatabaseHandler::GetLastInsertedSLPID()
+    {
+
+    iSQLString.Copy(KSelect);
+    iSQLString.Append(KMax);
+    iSQLString.Append(KOpeningBracket);
+    iSQLString.Append(KColSLPId);
+    iSQLString.Append(KClosingBracket);
+    iSQLString.Append(KFrom);
+    iSQLString.Append(KCreateTableName);
+
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb, iSQLString);
+    if(err != KErrNone)
+        return KErrGeneral;
+    TInt64 SLPId =  -1;
+    TInt columnIndex0 = 0; 
+
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        SLPId = stmt.ColumnInt(columnIndex0);
+        }	
+
+    PrintErrorMessage(iSQLString,err,-1);				
+
+    LogQuery(iSQLString);
+
+    TBuf<KShortStringLen> buf(_L("Last SLP ID... "));
+    buf.AppendNum(SLPId);
+    LogQuery(buf);
+    stmt.Close();
+    return SLPId;
+    }
+
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::GetAllSLP()
+//
+// Returns a list of all SLPs in the order of priority
+// ---------------------------------------------------------------------------
+void CSettingsDatabaseHandler::GetAllSLPL(RPointerArray<CServerParams>& aParamValues)
+    {
+    TInt count = 0;
+    SlpCount(count);
+    if(count<= 0)
+        User::Leave(KErrNotFound);
+        
+
+    iSQLString.Copy(KSelect);
+    iSQLString.Append(KStar);
+    iSQLString.Append(KFrom);
+    iSQLString.Append(KCreateTableName); // retrieve list of all SLPs in order of priority
+    iSQLString.Append(KOrderBy);
+    iSQLString.Append(KColPriority);
+    iSQLString.Append(KCommaSeparator);
+    iSQLString.Append(KColSLPId);
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb, iSQLString);
+    PrintErrorMessage(iSQLString,err,13);
+    if(err != KErrNone)
+            User::Leave(KErrGeneral);
+    TInt64 SLPId =  -1;
+    TBuf<KGenericStringLen> ServerAddress,Iap;
+
+    TInt otherprops;
+    TBuf<KShortStringLen> otherpropbuf;
+
+    
+    TBool serverEnabled = EFalse;
+    TBool simChangeRemove = EFalse;
+    TBool usageInHomeNw = EFalse;
+    TBool editable = EFalse;
+
+
+    TInt columnIndexSLPID = stmt.ColumnIndex(KColSLPId);
+    TInt columnIndexSLPAddress = stmt.ColumnIndex(KColSLPAddress);
+    TInt columnIndexIAP = stmt.ColumnIndex(KColIap);
+    TInt columnIndexOtherProperties = stmt.ColumnIndex(KColOtherProperties);
+
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        CServerParams *params = CServerParams::NewL();
+        SLPId = stmt.ColumnInt(columnIndexSLPID);
+        stmt.ColumnText(columnIndexSLPAddress,ServerAddress);
+              
+        stmt.ColumnText(columnIndexIAP,Iap);            
+        otherprops = stmt.ColumnInt(columnIndexOtherProperties);
+        otherpropbuf.Zero();
+        otherpropbuf.AppendNum(otherprops);
+        LogQuery(ServerAddress);
+        LogQuery(Iap);
+        LogQuery(otherpropbuf);
+        serverEnabled = otherprops & KServerEnabled;
+        simChangeRemove = otherprops & KSimChangeRemove; 
+        usageInHomeNw = otherprops & KUsageInHomeNw; 
+        editable = otherprops & KEditable;
+        params->Set(ServerAddress,Iap,serverEnabled,simChangeRemove,usageInHomeNw,editable,SLPId);
+        aParamValues.Append(params);//ownership transferred to RPointerArray
+        }   
+
+    stmt.Close();
+    LogAllSLP();
+    }
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::GetAllSLP()
+//
+// ---------------------------------------------------------------------------
+void CSettingsDatabaseHandler::GetAllSLPL(RPointerArray<CServerParams>& aParamValues,TRequestStatus& aStatus)
+    {
+    iStatus = &aStatus;
+    TInt count;
+    SlpCount(count);
+    if(count<= 0)
+        User::RequestComplete(iStatus,KErrNotFound);
+
+    iSQLString.Copy(KSelect);
+    iSQLString.Append(KStar);
+    iSQLString.Append(KFrom);
+    iSQLString.Append(KCreateTableName); // retrieve list of all SLPs 
+    iSQLString.Append(KOrderBy);
+    iSQLString.Append(KColPriority);
+    iSQLString.Append(KCommaSeparator);
+    iSQLString.Append(KColSLPId);
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb, iSQLString);
+    PrintErrorMessage(iSQLString,err,13);
+    if(err != KErrNone)
+        User::RequestComplete(iStatus,KErrGeneral);
+
+    TInt64 SLPId =  -1;
+    TBuf<KGenericStringLen> ServerAddress,Iap;
+
+    TInt otherprops;
+    TBuf<KShortStringLen> otherpropbuf;
+
+    
+    TBool serverEnabled = EFalse;
+    TBool simChangeRemove = EFalse;
+    TBool usageInHomeNw = EFalse;
+    TBool editable = EFalse;
+
+
+    TInt columnIndexSLPID = stmt.ColumnIndex(KColSLPId);
+    TInt columnIndexSLPAddress = stmt.ColumnIndex(KColSLPAddress);
+    TInt columnIndexIAP = stmt.ColumnIndex(KColIap);
+    TInt columnIndexOtherProperties = stmt.ColumnIndex(KColOtherProperties);
+
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        CServerParams *params = CServerParams::NewL();
+        SLPId = stmt.ColumnInt(columnIndexSLPID);
+        stmt.ColumnText(columnIndexSLPAddress,ServerAddress);
+              
+        stmt.ColumnText(columnIndexIAP,Iap);            
+        otherprops = stmt.ColumnInt(columnIndexOtherProperties);
+        otherpropbuf.Zero();
+        otherpropbuf.AppendNum(otherprops);
+        LogQuery(ServerAddress);
+        LogQuery(Iap);
+        LogQuery(otherpropbuf);
+        serverEnabled = otherprops & KServerEnabled;
+        simChangeRemove = otherprops & KSimChangeRemove; 
+        usageInHomeNw = otherprops & KUsageInHomeNw; 
+        editable = otherprops & KEditable;
+        params->Set(ServerAddress,Iap,serverEnabled,simChangeRemove,usageInHomeNw,editable,SLPId);
+        aParamValues.Append(params);//ownership transferred to RPointerArray
+        }   
+
+    stmt.Close();
+    LogAllSLP();
+    User::RequestComplete(iStatus,KErrNone);
+    }
+
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::GetServerAddress()
+//
+// This method is used to retrieve server address for a slp of a particular id
+// ---------------------------------------------------------------------------
+TInt CSettingsDatabaseHandler::GetServerAddress(const TInt64 aSlpId, TDes& aServerAddress) 
+    {
+    if(!IsSlpExists(aSlpId))
+        return KErrArgument;
+    TBuf<KGenericStringLen> serveraddress;
+
+    iSQLString.Copy(KSelect);
+    iSQLString.Append(KColSLPAddress);
+    iSQLString.Append(KFrom);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSLPId);
+    iSQLString.Append(KEquals);
+    iSQLString.Append(KQuotes);
+    iSQLString.AppendNum(aSlpId);
+    iSQLString.Append(KQuotes);
+    
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb,iSQLString);
+    PrintErrorMessage(iSQLString,err,13);
+    if(err != KErrNone)
+        return KErrGeneral;
+       
+    TInt columnIndexSLPName = stmt.ColumnIndex(KColSLPAddress);
+    aServerAddress.Zero();
+    
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        stmt.ColumnText(columnIndexSLPName,serveraddress);
+        }   
+    
+    stmt.Close();
+    if(aServerAddress.MaxLength() < serveraddress.Length())
+        return KErrOverflow;
+    aServerAddress = serveraddress;
+    return KErrNone;
+    }
+// -------------------------------------------------------------------------------
+// CSettingsDatabaseHandler::GetLastTriedTime()
+//
+// This method is to last tried time of a SLP corresponding to a particular Slp Id
+// --------------------------------------------------------------------------------
+TInt CSettingsDatabaseHandler::GetLastTriedTime(const TInt64 aSlpId, TTime& aLastTriedTime)
+    {
+    if(!IsSlpExists(aSlpId))
+        return KErrNotFound;
+
+    iSQLString.Copy(KSelect);
+    iSQLString.Append(KColTimeLastTried);
+    iSQLString.Append(KFrom);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSLPId);
+    iSQLString.Append(KEquals);
+    iSQLString.Append(KQuotes);
+    iSQLString.AppendNum(aSlpId);
+    iSQLString.Append(KQuotes);
+    
+    TBuf<KGenericStringLen> timeString;
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb,iSQLString);
+    PrintErrorMessage(iSQLString,err,13);
+    if(err != KErrNone)
+        return KErrGeneral;
+       
+    TInt columnIndexSLPName = stmt.ColumnIndex(KColTimeLastTried);
+    
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        stmt.ColumnText(columnIndexSLPName,timeString);
+        }   
+    aLastTriedTime.Parse(timeString);
+    stmt.Close();
+    
+    return KErrNone;
+    }
+// ------------------------------------------------------------------------------
+// CSettingsDatabaseHandler::GetLastUsedTime()
+//
+// This method is to last used time of a SLP corresponding to a particular Slp Id
+// ------------------------------------------------------------------------------
+TInt CSettingsDatabaseHandler::GetLastUsedTime(const TInt64 aSlpId, TTime& aLastUsedTime)
+    {
+    if(!IsSlpExists(aSlpId))
+        return KErrArgument;
+
+    iSQLString.Copy(KSelect);
+    iSQLString.Append(KColTimeLastUse);
+    iSQLString.Append(KFrom);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSLPId);
+    iSQLString.Append(KEquals);
+    iSQLString.Append(KQuotes);
+    iSQLString.AppendNum(aSlpId);
+    iSQLString.Append(KQuotes);
+    
+    TBuf<KGenericStringLen> timeString;
+    
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb,iSQLString);
+    PrintErrorMessage(iSQLString,err,13);
+    if(err != KErrNone)
+        return KErrGeneral;
+       
+    TInt columnIndexSLPName = stmt.ColumnIndex(KColTimeLastUse);
+    
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        stmt.ColumnText(columnIndexSLPName,timeString);
+        }   
+    aLastUsedTime.Parse(timeString);
+    stmt.Close();
+
+    return KErrNone;
+    }
+// -------------------------------------------------------------------------------------
+// CSettingsDatabaseHandler::GetManufacturer()
+//
+// This method is to Get manufacturer name of a SLP corresponding to a particular Slp Id
+// --------------------------------------------------------------------------------------
+TInt CSettingsDatabaseHandler::GetManufacturer(const TInt64 aSlpId, TDes& aManuName)
+    {
+    if(!IsSlpExists(aSlpId))
+            return KErrArgument;
+    TBuf<KGenericStringLen> manuname;
+
+    iSQLString.Copy(KSelect);
+    iSQLString.Append(KColManuName);
+    iSQLString.Append(KFrom);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSLPId);
+    iSQLString.Append(KEquals);
+    iSQLString.Append(KQuotes);
+    iSQLString.AppendNum(aSlpId);
+    iSQLString.Append(KQuotes);
+    
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb,iSQLString);
+    PrintErrorMessage(iSQLString,err,13);
+    if(err != KErrNone)
+        return KErrGeneral;
+       
+    TInt columnIndexSLPName = stmt.ColumnIndex(KColManuName);
+    aManuName.Zero();
+
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        stmt.ColumnText(columnIndexSLPName,manuname);
+        }   
+    
+    stmt.Close();
+    
+    if(aManuName.MaxLength() < manuname.Length())
+        return KErrOverflow;
+    aManuName = manuname;
+    return KErrNone;    
+    }
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::GetIAPName()
+//
+// This method is to Get IAP name of a SLP corresponding to a particular Slp Id
+// ---------------------------------------------------------------------------
+TInt CSettingsDatabaseHandler::GetIAPName(const TInt64 aSlpId, TDes& aIAPName)
+    {
+    if(!IsSlpExists(aSlpId))
+        return KErrArgument;
+    TBuf<KGenericStringLen> iapname;
+
+    iSQLString.Copy(KSelect);
+    iSQLString.Append(KColIap);
+    iSQLString.Append(KFrom);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSLPId);
+    iSQLString.Append(KEquals);
+    iSQLString.Append(KQuotes);
+    iSQLString.AppendNum(aSlpId);
+    iSQLString.Append(KQuotes);
+    
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb,iSQLString);
+    PrintErrorMessage(iSQLString,err,13);
+    if(err != KErrNone)
+        return KErrGeneral;
+       
+    TInt columnIndexSLPName = stmt.ColumnIndex(KColIap);
+    aIAPName.Zero();
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        stmt.ColumnText(columnIndexSLPName,iapname);
+        }   
+    
+    stmt.Close();
+    if(aIAPName.MaxLength() < iapname.Length())
+        return KErrOverflow;
+    aIAPName = iapname;
+    return KErrNone;    
+    }
+// ------------------------------------------------------------------------------------
+// CSettingsDatabaseHandler::GetVersion()
+//
+// This method is to Get Protocol Version of a SLP corresponding to a particular Slp Id
+// ------------------------------------------------------------------------------------
+TInt CSettingsDatabaseHandler::GetVersion(const TInt64 aSlpId,TInt& aMajor, TInt& aMinor)
+    {
+    if(!IsSlpExists(aSlpId))
+        return KErrArgument;
+
+    iSQLString.Copy(KSelect);
+    iSQLString.Append(KColProtocolVersionMajor);
+    iSQLString.Append(KFrom);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSLPId);
+    iSQLString.Append(KEquals);
+    iSQLString.Append(KQuotes);
+    iSQLString.AppendNum(aSlpId);
+    iSQLString.Append(KQuotes);
+    
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb,iSQLString);
+    PrintErrorMessage(iSQLString,err,13);
+       
+    TInt columnIndexVersion = stmt.ColumnIndex(KColProtocolVersionMajor);
+    TInt protocolVersion = 0;
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        protocolVersion = stmt.ColumnInt(columnIndexVersion);
+        }   
+    
+    stmt.Close();
+    aMajor = protocolVersion >> KVersionMajorMask;
+    aMinor = protocolVersion & KVersionMinorMask;
+    return KErrNone;    
+    }
+// -------------------------------------------------------------------------------------
+// CSettingsDatabaseHandler::GetSlpInfoFromId()
+//
+// This method is retrieve all configurable parameters corresponding to a particular SLP
+// -------------------------------------------------------------------------------------
+TInt CSettingsDatabaseHandler::GetSlpInfoFromId(const TInt64 aSlpId,CServerParams* aParamValues)
+    {
+    if(!IsSlpExists(aSlpId))
+        return KErrNotFound;
+
+    iSQLString.Copy(KSelect);
+    iSQLString.Append(KStar);
+    iSQLString.Append(KFrom);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSLPId);
+    iSQLString.Append(KEquals);
+    iSQLString.Append(KQuotes);
+    iSQLString.AppendNum(aSlpId);
+    iSQLString.Append(KQuotes);
+
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb, iSQLString);
+    PrintErrorMessage(iSQLString,err,13);
+    if(err != KErrNone)
+        return KErrGeneral;
+    
+    TInt64 SLPId =  -1;
+    TBuf<KMaxHSLPAddrLen> serverAddress;
+    TBuf<KMaxIAPLen> Iap;
+       TInt otherprops;
+    TBuf<KShortStringLen> otherpropbuf;
+
+    
+    TBool serverEnabled = EFalse;
+    TBool simChangeRemove = EFalse;
+    TBool usageInHomeNw = EFalse;
+    TBool editable = EFalse;
+    
+    TInt columnIndexSLPID = stmt.ColumnIndex(KColSLPId);
+    TInt columnIndexSLPAddress = stmt.ColumnIndex(KColSLPAddress);
+    
+    TInt columnIndexIAP = stmt.ColumnIndex(KColIap);
+    
+    TInt columnIndexOtherProperties = stmt.ColumnIndex(KColOtherProperties);
+
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        SLPId = stmt.ColumnInt(columnIndexSLPID);
+        stmt.ColumnText(columnIndexSLPAddress,serverAddress);
+        stmt.ColumnText(columnIndexIAP,Iap);  
+        
+        otherprops = stmt.ColumnInt(columnIndexOtherProperties);
+        
+        
+        serverEnabled = otherprops & KServerEnabled;
+        simChangeRemove = otherprops & KSimChangeRemove;
+        usageInHomeNw = otherprops & KUsageInHomeNw;
+        editable = otherprops & KEditable;
+        //logging
+        otherpropbuf.Zero();
+        otherpropbuf.AppendNum(otherprops);
+        LogQuery(serverAddress);
+        LogQuery(Iap)   ;     
+        LogQuery(otherpropbuf);
+        }   
+
+    stmt.Close();
+    
+    aParamValues->Set(serverAddress,Iap,serverEnabled,simChangeRemove,usageInHomeNw,editable,SLPId);
+    return KErrNone;
+    }
+// --------------------------------------------------------------------------------------
+// CSettingsDatabaseHandler::GetSlpInfoFromAddress()
+//
+// This method is retrieve all configurable parameters corresponding to a particular SLP
+// --------------------------------------------------------------------------------------
+TInt CSettingsDatabaseHandler::GetSlpInfoFromAddress(const TDesC& aServerAddress,CServerParams* aParamValues)
+    {
+
+    TBuf<KGenericStringLen> tempBuf;
+    tempBuf.Copy(aServerAddress);
+    tempBuf.Trim();
+    iSQLString.Copy(KSelect);
+    iSQLString.Append(KStar);
+    iSQLString.Append(KFrom);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSLPAddress);
+    iSQLString.Append(KEquals);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(tempBuf);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(KCaseInsensitive);
+
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb, iSQLString);
+    PrintErrorMessage(iSQLString,err,13);
+    if(err != KErrNone)
+        return KErrGeneral;
+    
+    TInt64 SLPId =  -1;
+    TBuf<KMaxHSLPAddrLen> serverAddress;
+    TBuf<KMaxIAPLen> Iap;
+    
+    TInt otherprops;
+    TBuf<KShortStringLen> otherpropbuf;
+
+    TBool serverEnabled = EFalse;
+    TBool simChangeRemove = EFalse;
+    TBool usageInHomeNw = EFalse;
+    TBool editable = EFalse;
+    
+    TInt columnIndexSLPID = stmt.ColumnIndex(KColSLPId);
+    TInt columnIndexSLPAddress = stmt.ColumnIndex(KColSLPAddress);
+    
+    TInt columnIndexIAP = stmt.ColumnIndex(KColIap);
+    TInt columnIndexOtherProperties = stmt.ColumnIndex(KColOtherProperties);
+
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        SLPId = stmt.ColumnInt(columnIndexSLPID);
+        stmt.ColumnText(columnIndexSLPAddress,serverAddress);
+             
+        stmt.ColumnText(columnIndexIAP,Iap);  
+        
+        otherprops = stmt.ColumnInt(columnIndexOtherProperties);
+        
+        
+        serverEnabled = otherprops & KServerEnabled;
+        simChangeRemove = otherprops & KSimChangeRemove;
+        usageInHomeNw = otherprops & KUsageInHomeNw;
+        editable = otherprops & KEditable;
+        //logging
+        otherpropbuf.Zero();
+        otherpropbuf.AppendNum(otherprops);
+        LogQuery(serverAddress);
+        LogQuery(Iap);
+
+        LogQuery(otherpropbuf);
+        }   
+    
+    stmt.Close();
+    
+    if(SLPId == -1)//we did not find any server by the slp id that was requested for
+        return KErrNotFound;
+    
+    aParamValues->Set(serverAddress,Iap,serverEnabled,simChangeRemove,usageInHomeNw,editable,SLPId);
+    return KErrNone;
+    }
+// ------------------------------------------------------------------------------------
+// CSettingsDatabaseHandler::GetDefaultServer()
+//
+// This method is retrieve all configurable parameters corresponding to the default SLP
+// -----------------------------------------------------------------------------------
+TInt CSettingsDatabaseHandler::GetDefaultServer(CServerParams* aParamValues)
+    {
+
+    iSQLString.Copy(KSelect);
+    iSQLString.Append(KStar);
+    iSQLString.Append(KFrom);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KOrderBy);
+    iSQLString.Append(KColPriority);
+    iSQLString.Append(KCommaSeparator);
+    iSQLString.Append(KColSLPId);
+    
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb, iSQLString);
+    PrintErrorMessage(iSQLString,err,13);
+    if(err != KErrNone)
+        return KErrGeneral;
+    TInt64 SLPId =  -1;
+    TBuf<KMaxHSLPAddrLen> serverAddress;
+    TBuf<KMaxIAPLen> Iap;
+    TInt otherprops;
+    TBuf<KShortStringLen> otherpropbuf; //for logging
+    
+
+    
+    TBool serverEnabled = EFalse;
+    TBool simChangeRemove = EFalse;
+    TBool usageInHomeNw = EFalse;
+    TBool editable = EFalse;
+
+    TInt columnIndexSLPID = stmt.ColumnIndex(KColSLPId);
+    TInt columnIndexSLPAddress = stmt.ColumnIndex(KColSLPAddress);
+    TInt columnIndexIAP = stmt.ColumnIndex(KColIap);
+    TInt columnIndexOtherProperties = stmt.ColumnIndex(KColOtherProperties);
+
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        SLPId = stmt.ColumnInt(columnIndexSLPID);
+        stmt.ColumnText(columnIndexSLPAddress,serverAddress);
+             
+        stmt.ColumnText(columnIndexIAP,Iap);  
+        otherprops = stmt.ColumnInt(columnIndexOtherProperties);
+       
+        serverEnabled = otherprops & KServerEnabled;
+        simChangeRemove = otherprops & KSimChangeRemove;
+        usageInHomeNw = otherprops & KUsageInHomeNw;
+        editable = otherprops & KEditable;
+        //logging
+        otherpropbuf.Zero();
+        otherpropbuf.AppendNum(otherprops);
+        LogQuery(serverAddress);
+        LogQuery(Iap);
+        LogQuery(otherpropbuf);
+        break; //obtain only the first record as that would be the default server
+        }   
+    if(SLPId == -1) // no record obtained so return error
+        {
+        PrintErrorMessage(_L(""),KErrNotFound,17);
+        return KErrNotFound;
+        }
+    stmt.Close();
+
+    aParamValues->Set(serverAddress,Iap,serverEnabled,simChangeRemove,usageInHomeNw,editable,SLPId);
+    return KErrNone;
+    }
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::SlpCount()
+//
+// This method is retrieve the count of slp entries present
+// ---------------------------------------------------------------------------
+TInt CSettingsDatabaseHandler::SlpCount(TInt& aCount)
+    {
+    //Select all slps existing in the records
+    TBuf<KGenericStringLen> sqlString;
+
+    sqlString.Copy(KSelect);
+    sqlString.Append(KCount);
+    sqlString.Append(KOpeningBracket);
+    sqlString.Append(KStar);
+    sqlString.Append(KClosingBracket);
+    sqlString.Append(KFrom);
+    sqlString.Append(KCreateTableName);
+    
+    
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb, sqlString);
+    if(err != KErrNone)
+        return KErrGeneral;
+    TInt count = 0;
+    TInt columnIndex0 = 0; 
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        count = stmt.ColumnInt(columnIndex0); //count number of rows
+        }
+    stmt.Close();
+    PrintErrorMessage(_L(""),count,16);
+    if(count == 0 )
+        {
+        return KErrNotFound;
+        }
+    aCount = count;    
+    return KErrNone;       
+    }
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::IsSlpExists()
+//
+// This method is to check is a slp entry exists corresponding to a particular SLP Id
+// ---------------------------------------------------------------------------
+TBool CSettingsDatabaseHandler::IsSlpExists(const TInt64 aSlpId)
+    {
+    //Select all slps existing in the records corresponing to the Slp Id
+    TBuf<KGenericStringLen> sqlString;
+    sqlString.Copy(KSelect);
+    sqlString.Append(KCount);
+    sqlString.Append(KOpeningBracket);
+    sqlString.Append(KStar);
+    sqlString.Append(KClosingBracket);
+    sqlString.Append(KFrom);
+    sqlString.Append(KCreateTableName);
+    sqlString.Append(KWhere);
+    sqlString.Append(KColSLPId);
+    sqlString.Append(KEquals);
+    sqlString.Append(KQuotes);
+    sqlString.AppendNum(aSlpId);
+    sqlString.Append(KQuotes);
+
+		
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb, sqlString);
+
+    TInt count = 0;
+    TInt columnIndex0 = 0; 
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        count = stmt.ColumnInt(columnIndex0); //count number of rows
+        }
+    stmt.Close();
+    if(count == 0)
+        {
+        PrintErrorMessage(_L(""),EFalse,15);
+        return EFalse;
+        }
+    PrintErrorMessage(_L(""),ETrue,15);
+    return ETrue;
+    }
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::IsSlpExists()
+//
+// This method is to check is a slp entry exists corresponding to a particular 
+// SLP Address
+// ---------------------------------------------------------------------------
+TBool CSettingsDatabaseHandler::IsSlpExists(const TDesC& aServerAdress)
+    {
+    //Select all slps existing in the records corresponding to the Server Address 
+
+    TBuf<KGenericStringLen> tempBuf;
+    tempBuf.Copy(aServerAdress);
+    tempBuf.Trim();
+    iSQLString.Copy(KSelect);
+    iSQLString.Append(KCount);
+    iSQLString.Append(KOpeningBracket);
+    iSQLString.Append(KStar);
+    iSQLString.Append(KClosingBracket);
+    iSQLString.Append(KFrom);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSLPAddress);
+    iSQLString.Append(KEquals);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(tempBuf);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(KCaseInsensitive);
+
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb, iSQLString);
+
+    TInt count = 0;
+    TInt columnIndex0 = 0; 
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        count = stmt.ColumnInt(columnIndex0); //count number of rows
+        }
+    stmt.Close();
+    if(count == 0)
+        {
+        PrintErrorMessage(_L(""),EFalse,15);
+        return EFalse;
+        }
+    PrintErrorMessage(_L(""),ETrue,15);
+    return ETrue;    
+    }
+TBool  CSettingsDatabaseHandler::IsSlpExists(const TDesC& aServerAddress,TInt64& aSlpId)
+    {
+    //Select all slps existing in the records corresponding to the Server Address 
+
+    iSQLString.Copy(KSelect);
+    iSQLString.Append(KColSLPId);
+    iSQLString.Append(KFrom);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSLPAddress);
+    iSQLString.Append(KEquals);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(aServerAddress);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(KCaseInsensitive);
+
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb, iSQLString);
+    aSlpId = -1;
+    TInt count = 0; // count the number of slps present in the records
+    TInt columnIndexSLPID = stmt.ColumnIndex(KColSLPId);
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        aSlpId = stmt.ColumnInt(columnIndexSLPID);
+        count++;
+        }
+    stmt.Close();
+    if(count == 0)
+        {
+        PrintErrorMessage(_L(""),EFalse,15);
+        return EFalse;
+        }
+    PrintErrorMessage(_L(""),ETrue,15);
+    return ETrue; 
+    }
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::GetDefaultCRValues()
+//
+// This method is used to retrieve default settings value from the cen rep
+// ---------------------------------------------------------------------------
+TInt CSettingsDatabaseHandler::GetDefaultCRValues(TInt aKey,TInt& aValue)
+    {
+    TInt err;            
+
+    err = iSettingsRep->Get(aKey, aValue);
+    if (err != KErrNone)
+        return err;         
+    return KErrNone;
+    }
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::GetDBPathFromCR()
+//
+// This method is used to retrieve settings db path value from the cen rep
+// ---------------------------------------------------------------------------
+TInt CSettingsDatabaseHandler::GetDBPathFromCR(TDes& aPath)
+    {
+    TInt err;            
+
+    err = iSettingsNotifierRep->Get(KSuplSettigsDBPath, aPath);
+    if (err != KErrNone)
+        return err;         
+    return KErrNone;
+    }
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::StoreDBPathToCR()
+//
+// This method is used to store settings db path value to the cen rep
+// ---------------------------------------------------------------------------
+TInt CSettingsDatabaseHandler::StoreDBPathToCR(TDes& aPath)
+    {
+    TInt err;            
+    err = iSettingsNotifierRep->Set(KSuplSettigsDBPath, aPath);
+    if (err != KErrNone)
+        return err;   
+    return KErrNone;
+    }
+
+//-----------------------------------------------------------------------------
+// CSettingsDatabaseHandler::NotifyDBChange()
+//
+// This method is used to notify that a change has occured in the DB via the CR 
+// ----------------------------------------------------------------------------
+TInt CSettingsDatabaseHandler::NotifyDBChange(MSuplSettingsObserver::TSuplSettingsEventType aChangedEventType,TInt64 aSlpId)
+    {
+    TInt err;
+    TReal idChanged = aSlpId;
+    err = iSettingsNotifierRep->Set(KSuplSettingsDBChangedSLPId,idChanged);
+    if(err != KErrNone)
+        return err;
+    TInt curEvent;
+    TInt keyValue;
+    err = iSettingsNotifierRep->Get(KSuplSettingsDBEvent,curEvent);
+    if(aChangedEventType == (MSuplSettingsObserver::TSuplSettingsEventType)curEvent)
+        {
+        keyValue = aChangedEventType+1;
+        }
+    else
+        keyValue = aChangedEventType;
+    err = iSettingsNotifierRep->Set(KSuplSettingsDBEvent,keyValue);
+    if(err != KErrNone)
+        return err;
+    return KErrNone;
+    }
+//----------------------------------------------------------------------------
+// CSettingsDatabaseHandler::ChangePriority()
+//
+// This method is used to alter priority of a particular server
+// ---------------------------------------------------------------------------
+void CSettingsDatabaseHandler::ChangePriorityL(TInt aSlpId,TInt aValue,TBool aDirection)
+    {
+    if(!IsSlpExists(aSlpId))
+        User::Leave(KErrNotFound);
+    if(aValue <= 0)
+        User::Leave(KErrArgument);
+    TInt count;
+    SlpCount(count);
+
+    
+    TInt priorityToSet;
+    
+    GetPriorityL(aSlpId,priorityToSet);
+    
+    if(aDirection)
+        {
+        priorityToSet -= aValue; //move up 
+        } 
+    else
+        {
+        priorityToSet += aValue;//move down
+        }
+    if(priorityToSet > count || priorityToSet <= 0)
+        User::Leave(KErrArgument);
+    
+    //Select all slps existing in the records corresponding to the Server Address 
+   
+    iSQLString.Copy(KSelect);
+    iSQLString.Append(KStar);
+    iSQLString.Append(KFrom);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColPriority);
+    if(aDirection)
+        iSQLString.Append(KGreaterOrEquals);
+    else
+        iSQLString.Append(KGreaterThan);
+    iSQLString.Append(KQuotes);
+    iSQLString.AppendNum(priorityToSet);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(KOrderBy);
+    iSQLString.Append(KColPriority);
+    iSQLString.Append(KCommaSeparator);
+    iSQLString.Append(KColSLPId);
+    
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb, iSQLString);
+    TInt64 SLPId;
+    TInt priority;
+    TInt columnIndexSLPID = stmt.ColumnIndex(KColSLPId);
+    TInt columnIndexPriority = stmt.ColumnIndex(KColPriority);
+    count = 0; // count the number of slps present in the records
+    RArray<TInt64> slpIndexArray;
+    //Get all slp ids whose priorities wil get affected
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        SLPId = stmt.ColumnInt64(columnIndexSLPID);
+        if(SLPId != aSlpId)
+            slpIndexArray.Append(stmt.ColumnInt64(columnIndexSLPID));
+        }
+    stmt.Reset(); 
+    stmt.Close();
+    //update the priority of the requested server first
+    if(!aDirection)
+        priorityToSet++;
+    iSQLString.Zero();
+    iSQLString.Append(KUpdateRecord);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KSET);
+    iSQLString.Append(KColPriority);
+    iSQLString.Append(KEquals);
+    iSQLString.AppendNum(priorityToSet); 
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSLPId);
+    iSQLString.Append(KEquals);
+    iSQLString.AppendNum(aSlpId);
+    
+    err = iDb.Exec(iSQLString);
+    iSQLString.Zero();
+        
+    iSQLString.Append(KUpdateRecord);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KSET);
+    iSQLString.Append(KColPriority);
+    iSQLString.Append(KEquals);
+    iSQLString.Append(KValuePriority);
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSLPId);
+    iSQLString.Append(KEquals);
+    iSQLString.Append(KValueSlpId);
+    
+    err = stmt.Prepare(iDb,iSQLString);
+    //update priority of other slps
+    TInt priorityParamIndex = stmt.ParameterIndex(KValuePriority);
+    TInt slpIdParamIndex = stmt.ParameterIndex(KValueSlpId);
+    
+    priority = priorityToSet + 1;
+    for(TInt i=0 ;i < slpIndexArray.Count(); i++,priority++)
+        {
+        err = stmt.BindInt(priorityParamIndex, priority);
+        err = stmt.BindInt(slpIdParamIndex, slpIndexArray[i]);
+        err = stmt.Exec();
+        err = stmt.Reset();
+        }
+    slpIndexArray.Close();
+    stmt.Close();
+    
+    NormalizePriorityL();
+    
+    err = NotifyDBChange(MSuplSettingsObserver::ESuplSettingsDBUpdateEvent,0); //indicates that all the records may have been altered
+    LogAllSLP();
+    }
+//----------------------------------------------------------------------------
+//CSettingsDatabaseHandler::GetPriority()
+//This method is used to retrieve priority of a particular SLP
+//
+//----------------------------------------------------------------------------
+void CSettingsDatabaseHandler::GetPriorityL(TInt aSlpId,TInt& aPriority)
+    {
+
+    iSQLString.Copy(KSelect);
+    iSQLString.Append(KStar);
+    iSQLString.Append(KFrom);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSLPId);
+    iSQLString.Append(KEquals);
+    iSQLString.Append(KQuotes);
+    iSQLString.AppendNum(aSlpId);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(KOrderBy);
+    iSQLString.Append(KColPriority);
+    iSQLString.Append(KCommaSeparator);
+    iSQLString.Append(KColSLPId);
+    
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb, iSQLString);
+    if(err != KErrNone)
+            User::LeaveIfError(KErrGeneral);
+    TInt priorityParamIndex = stmt.ColumnIndex(KColPriority);
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        aPriority = stmt.ColumnInt(priorityParamIndex);
+        break;
+        }
+    stmt.Close();
+    }
+
+//----------------------------------------------------------------------------
+// CSettingsDatabaseHandler::SetPriority()
+//
+// This method is used to alter priority of a particular server
+// ---------------------------------------------------------------------------
+void CSettingsDatabaseHandler::GetMaxPriorityL(TInt& aPriorityValue)
+    {
+    TInt count;
+    SlpCount(count);
+    if(count <= 0)//no slp entries exist
+        {
+        aPriorityValue = KMinPriorityValue;
+        return;
+        }
+    
+    //Select all slps existing in the records corresponding to the Server Address 
+    TBuf<KGenericStringLen> sqlString;
+    sqlString.Copy(KSelect);
+    sqlString.Append(KMax);
+    sqlString.Append(KOpeningBracket);
+    sqlString.Append(KColPriority);
+    sqlString.Append(KClosingBracket);
+    sqlString.Append(KFrom);
+    sqlString.Append(KCreateTableName);
+    
+
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb, sqlString);
+    TInt columnIndex0 = 0; 
+
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        aPriorityValue = stmt.ColumnInt(columnIndex0);
+        }   
+    aPriorityValue++;
+    stmt.Close();
+    }
+
+//----------------------------------------------------------------------------
+// CSettingsDatabaseHandler::SetPriority()
+//
+// This method is used to alter priority of a particular server
+// ---------------------------------------------------------------------------
+void CSettingsDatabaseHandler::SetPriorityL(TInt aSlpId,TInt aValue)
+    {
+    if(aValue <= 0)
+        User::Leave(KErrArgument);
+    TInt count;
+    SlpCount(count);
+    if(aValue > count)
+        User::Leave(KErrArgument);
+    //Select all slps existing in the records corresponding to the Server Address 
+
+    iSQLString.Copy(KSelect);
+    iSQLString.Append(KStar);
+    iSQLString.Append(KFrom);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColPriority);
+    iSQLString.Append(KGreaterOrEquals);
+    iSQLString.Append(KQuotes);
+    iSQLString.AppendNum(aValue);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(KOrderBy);
+    iSQLString.Append(KColPriority);
+    iSQLString.Append(KCommaSeparator);
+    iSQLString.Append(KColSLPId);
+    
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb, iSQLString);
+    TInt64 SLPId;
+    TInt priority;
+    TInt columnIndexSLPID = stmt.ColumnIndex(KColSLPId);
+    TInt columnIndexPriority = stmt.ColumnIndex(KColPriority);
+    count = 0; // count the number of slps present in the records
+    RArray<TInt64> slpIndexArray;
+    //Get all slp ids whose priorities wil get affected
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        SLPId = stmt.ColumnInt64(columnIndexSLPID);
+        if(SLPId != aSlpId)
+            slpIndexArray.Append(stmt.ColumnInt64(columnIndexSLPID));
+        }
+    stmt.Reset(); 
+    stmt.Close();
+    //update the priority of the requested server first
+    iSQLString.Zero();
+    iSQLString.Append(KUpdateRecord);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KSET);
+    iSQLString.Append(KColPriority);
+    iSQLString.Append(KEquals);
+    iSQLString.AppendNum(aValue); 
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSLPId);
+    iSQLString.Append(KEquals);
+    iSQLString.AppendNum(aSlpId);
+    
+    err = iDb.Exec(iSQLString);
+    iSQLString.Zero();
+        
+    iSQLString.Append(KUpdateRecord);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KSET);
+    iSQLString.Append(KColPriority);
+    iSQLString.Append(KEquals);
+    iSQLString.Append(KValuePriority);
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSLPId);
+    iSQLString.Append(KEquals);
+    iSQLString.Append(KValueSlpId);
+    
+    err = stmt.Prepare(iDb,iSQLString);
+    //update priority of other slps
+    TInt priorityParamIndex = stmt.ParameterIndex(KValuePriority);
+    TInt slpIdParamIndex = stmt.ParameterIndex(KValueSlpId);
+    
+    priority = aValue + 1;
+    for(TInt i=0 ;i < slpIndexArray.Count(); i++,priority++)
+        {
+        err = stmt.BindInt(priorityParamIndex, priority);
+        err = stmt.BindInt(slpIdParamIndex, slpIndexArray[i]);
+        err = stmt.Exec();
+        err = stmt.Reset();
+        }
+    slpIndexArray.Close();
+    stmt.Close();
+    
+    err = NotifyDBChange(MSuplSettingsObserver::ESuplSettingsDBUpdateEvent,0); //indicates that all the records may have been altered
+    LogAllSLP();
+    }
+//--------------------------------------------------------------------------------
+// CSettingsDatabaseHandler::NormalizePriorityL()
+//
+// This method is used to order the priority values in proper incremental sequence
+// -------------------------------------------------------------------------------
+void CSettingsDatabaseHandler::NormalizePriorityL()
+    { 
+    TInt count;
+    SlpCount(count);
+    if(count <= 0)
+        return;
+
+    iSQLString.Copy(KSelect);
+    iSQLString.Append(KStar);
+    iSQLString.Append(KFrom);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KOrderBy);
+    iSQLString.Append(KColPriority);
+    iSQLString.Append(KCommaSeparator);
+    iSQLString.Append(KColSLPId);
+
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb, iSQLString);
+    User::LeaveIfError(err);
+
+    TInt columnIndexSLPID = stmt.ColumnIndex(KColSLPId);
+    RArray<TInt64> slpIdArray;
+    //Get all slp ids currently in the database
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        slpIdArray.Append(stmt.ColumnInt64(columnIndexSLPID));
+        }
+    stmt.Reset();
+    
+    iSQLString.Zero();
+
+    iSQLString.Append(KUpdateRecord);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KSET);
+    iSQLString.Append(KColPriority);
+    iSQLString.Append(KEquals);
+    iSQLString.Append(KValuePriority);
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSLPId);
+    iSQLString.Append(KEquals);
+    iSQLString.Append(KValueSlpId);
+
+    err = stmt.Prepare(iDb,iSQLString);
+    //update priority of other slps
+    TInt priorityParamIndex = stmt.ParameterIndex(KValuePriority);
+    TInt slpIdParamIndex = stmt.ParameterIndex(KValueSlpId);
+
+    TInt priorityToSet = KMinPriorityValue;
+    for(TInt i=0 ;i < slpIdArray.Count(); i++,priorityToSet++)
+        {
+        err = stmt.BindInt(priorityParamIndex, priorityToSet);
+        err = stmt.BindInt(slpIdParamIndex, slpIdArray[i]);
+        err = stmt.Exec();
+        err = stmt.Reset();
+        }
+    slpIdArray.Close();
+    stmt.Close();
+   
+    }
+//----------------------------------------------------------------------------
+// CSettingsDatabaseHandler::RemoveOnSimChangeL()
+//
+// This method is used to delete all entries that have the sim change remove 
+// property set
+// ---------------------------------------------------------------------------
+void CSettingsDatabaseHandler::RemoveOnSimChangeL()
+    {        
+
+    iSQLString.Copy(KSelect);
+    iSQLString.Append(KStar);
+    iSQLString.Append(KFrom);
+    iSQLString.Append(KCreateTableName); // retrieve list of all SLPs 
+    iSQLString.Append(KOrderBy);
+    iSQLString.Append(KColPriority);
+    iSQLString.Append(KCommaSeparator);
+    iSQLString.Append(KColSLPId);
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb, iSQLString);
+    if(err != KErrNone)
+        User::Leave(KErrGeneral);
+    TInt64 slpId = -1;
+    TInt columnIndexSLPID = stmt.ColumnIndex(KColSLPId);
+    TBool simChangeRemove;
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        
+        slpId = stmt.ColumnInt64(columnIndexSLPID);
+        GetOtherPropertiesL(slpId,CSuplSettingsInternal::ESimChangeRemove,simChangeRemove);
+        if(simChangeRemove) //if sim change remove flag is set delete it
+            DeleteSLPRecordL(slpId); 
+        }
+        
+    stmt.Close();
+    LogAllSLP();
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::CreateSessionTableL()
+//
+// Creates the SUPL session settings table. Leaves, if the table cannot be created.
+// ---------------------------------------------------------------------------
+void CSettingsDatabaseHandler::CreateSessionTableL()
+    {
+    iSQLString.Copy(KCreateTable);
+    iSQLString.Append(KSessionTableName);
+    iSQLString.Append(KOpeningBracket);
+
+    iSQLString.Append(KColSessionId);
+    iSQLString.Append(KDataTypeInteger);
+    iSQLString.Append(KPrimaryKey);
+    iSQLString.Append(KCommaSeparator);
+
+    iSQLString.Append(KColSessionName);
+    iSQLString.Append(KDataTypeString);
+    iSQLString.Append(KOpeningBracket);
+    iSQLString.AppendNum(KMaxTriggerSessionNameLen);
+    iSQLString.Append(KClosingBracket);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.Append(KColNotificationPresent);
+    iSQLString.Append(KDataTypeInteger);
+    iSQLString.Append(KCommaSeparator);
+
+    iSQLString.Append(KColTriggerNotificationStatus);
+    iSQLString.Append(KDataTypeInteger);
+    iSQLString.Append(KCommaSeparator);
+
+    iSQLString.Append(KColTriggerType);
+    iSQLString.Append(KDataTypeInteger);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.Append(KColRequestType);
+    iSQLString.Append(KDataTypeInteger);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.Append(KColOutstandingTrigger);
+    iSQLString.Append(KDataTypeInteger);
+    iSQLString.Append(KCommaSeparator); 
+
+    iSQLString.Append(KColInterval);
+    iSQLString.Append(KDataTypeInteger);
+    iSQLString.Append(KClosingBracket);
+    
+    TInt err = iDb.Exec(iSQLString);
+    
+    PrintErrorMessage(iSQLString,err,1);                            
+            
+    User::LeaveIfError(err);
+    
+    }
+
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::InsertSessionRecordL()
+//
+// This method is used to insert session record into the SUPL session DB
+// ---------------------------------------------------------------------------
+void CSettingsDatabaseHandler::InsertSessionRecordL(const CTriggerParams* aSessionParamValues)
+    {    
+    if( !aSessionParamValues )
+        {
+        User::Leave(KErrArgument);
+        }
+    HBufC* sessionName = HBufC::NewL( KMaxTriggerSessionNameLen);
+    
+    
+    TInt64 sessionId;
+    TBool notificationPresent;
+    TBool triggerNotificationStatus;
+    CTriggerParams::TTriggerType triggerType;
+    CTriggerParams::TRequestType requestType;
+    TUint64 outstandingTrigger;
+    TUint64 interval;
+    
+    TInt ret = aSessionParamValues->Get(sessionId,sessionName->Des(),notificationPresent,triggerNotificationStatus,
+                             triggerType,requestType,outstandingTrigger,interval );
+         
+    if(ret == KErrNotFound)
+        {
+        delete sessionName;
+        User::Leave(KErrGeneral);        
+        }
+          
+    iSQLString.Copy(KInsertIntoTable);
+    iSQLString.Append(KSessionTableName);
+    iSQLString.Append(KOpeningBracket);
+
+    iSQLString.Append(KColSessionId);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.Append(KColSessionName);
+    iSQLString.Append(KCommaSeparator);
+
+    iSQLString.Append(KColNotificationPresent);
+    iSQLString.Append(KCommaSeparator);
+
+    iSQLString.Append(KColTriggerNotificationStatus);
+    iSQLString.Append(KCommaSeparator);
+
+    iSQLString.Append(KColTriggerType);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.Append(KColRequestType);
+    iSQLString.Append(KCommaSeparator);
+        
+    iSQLString.Append(KColOutstandingTrigger);
+    iSQLString.Append(KCommaSeparator); 
+
+    iSQLString.Append(KColInterval);
+    iSQLString.Append(KClosingBracket);
+    
+    iSQLString.Append(KValues);
+
+    iSQLString.Append(KOpeningBracket);
+
+    iSQLString.AppendNum(sessionId);
+    iSQLString.Append(KCommaSeparator);
+            
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(sessionName->Des());
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.AppendNum(notificationPresent);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.AppendNum(triggerNotificationStatus);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.AppendNum(triggerType);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.AppendNum(requestType);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.AppendNum(outstandingTrigger);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.AppendNum(interval);
+          
+    iSQLString.Append(KClosingBracket);
+
+    delete sessionName;   
+    TInt err = iDb.Exec(_L("BEGIN")); 
+    err = iDb.Exec(iSQLString);
+    if(err < 0)
+            User::Leave(KErrGeneral);  
+    iDb.Exec(_L("COMMIT")); 
+
+    err = NotifySessionDBChange(MSuplSessionObserver::ESuplSessionDBAddEvent,sessionId);
+    
+    }
+    
+// ----------------------------------------------------------------------------
+// CSettingsDatabaseHandler::DeleteSessionRecordL()
+//
+// This method is used to delete a session record corresponding to the given session ID
+// ----------------------------------------------------------------------------
+void CSettingsDatabaseHandler::DeleteSessionRecordL(TInt64 aSessionId)
+    {
+    if(!IsSessionExists(aSessionId)) //no session exists with the given id so return error
+        {
+        User::Leave(KErrNotFound);
+        }
+
+    iSQLString.Copy(KDeleteRecord);
+    iSQLString.Append(KSessionTableName);
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSessionId);
+    iSQLString.Append(KEquals);
+    iSQLString.AppendNum(aSessionId);
+
+    TInt err = iDb.Exec(iSQLString);
+    
+    if(err < 0)
+        User::Leave(KErrGeneral);
+    err = NotifySessionDBChange(MSuplSessionObserver::ESuplSessionDBDeleteEvent,aSessionId); // notify about a change in the database
+
+    }
+
+// ----------------------------------------------------------------------------
+// CSettingsDatabaseHandler::DeleteAllSessionRecordsL()
+//
+// This method is used to delete all session records from session table
+// ----------------------------------------------------------------------------
+void CSettingsDatabaseHandler::DeleteAllSessionRecordsL()
+    {
+    iSQLString.Copy(KDeleteRecord);
+    iSQLString.Append(KSessionTableName);
+   
+    TInt err = iDb.Exec(iSQLString);
+    
+    if(err < 0)
+      User::Leave(KErrGeneral);
+     }
+
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::UpdateSessionRecordL()
+//
+// This method is used to update a column of string value corresponding 
+// to a particular session
+// ---------------------------------------------------------------------------
+       
+void CSettingsDatabaseHandler::UpdateSessionRecordL(TInt64 aSessionId,CSuplSettingsInternal::TSessionParam aParameter,TUint64 aValue)
+    {
+    if(!IsSessionExists(aSessionId)) //no session exists with the given id so return error
+        {
+        User::Leave(KErrNotFound);
+        }
+   
+    iSQLString.Copy(KUpdateRecord);
+    iSQLString.Append(KSessionTableName);
+    iSQLString.Append(KSET);
+
+    FormSessionQueryL(aParameter,aValue,iSQLString);
+
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSessionId);
+    iSQLString.Append(KEquals);
+    iSQLString.AppendNum(aSessionId);
+
+    TInt err = iDb.Exec(iSQLString);
+    if(err < 0)
+        User::Leave(KErrGeneral);
+    err = NotifySessionDBChange(MSuplSessionObserver::ESuplSessionDBUpdateEvent,aSessionId);
+
+    }
+
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::FormSessionQueryL()
+//
+// Forms part of the query string, used to form a query string that contains 
+// a String value in it 
+// ---------------------------------------------------------------------------
+void CSettingsDatabaseHandler::FormSessionQueryL(CSuplSettingsInternal::TSessionParam aParameter,TUint64 aValue,TDes& aQueryString)
+    {
+    switch(aParameter)
+        {
+        case CSuplSettingsInternal::ETriggerNotificationStatus: 
+            {
+            aQueryString.Append(KColTriggerNotificationStatus);
+            break;
+            }
+        case CSuplSettingsInternal::EOutstandingTriggers: 
+            {
+            aQueryString.Append(KColOutstandingTrigger);
+            break;
+            }    
+
+        default:
+            User::Leave(KErrArgument);
+        }
+
+    aQueryString.Append(KEquals);
+    aQueryString.Append(KQuotes);
+    aQueryString.AppendNum(aValue);
+    aQueryString.Append(KQuotes);
+    }               
+
+
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::GetAllSessionsL()
+//
+// Returns a list of all sessions in the order of priority
+// ---------------------------------------------------------------------------
+void CSettingsDatabaseHandler::GetAllSessionsL(RPointerArray<CTriggerParams>& aParamValues)
+    {
+    iSQLString.Copy(KSelect);
+    iSQLString.Append(KStar);
+    iSQLString.Append(KFrom);
+    iSQLString.Append(KSessionTableName); // retrieve list of all session in order of priority
+    iSQLString.Append(KOrderBy);
+    iSQLString.Append(KColSessionId);
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb, iSQLString);
+    
+    if(err != KErrNone)
+        {
+        stmt.Close();
+        User::Leave(KErrGeneral);
+        }
+            
+    
+    TInt64 sessionId;
+    TBool notificationPresent;
+    TBool triggerNotificationStatus;
+    CTriggerParams::TTriggerType triggerType;
+    CTriggerParams::TRequestType requestType;
+    TUint64 outstandingTrigger;
+    TUint64 interval;
+    TBuf<KGenericStringLen> sessionName;
+    
+    TInt columnIndexSessionID = stmt.ColumnIndex(KColSessionId);
+    TInt columnIndexSessionName = stmt.ColumnIndex(KColSessionName);
+    TInt columnIndexNotificationPresent = stmt.ColumnIndex(KColNotificationPresent);
+    TInt columnIndexTriggerNotificationStatus = stmt.ColumnIndex(KColTriggerNotificationStatus);
+    TInt columnIndexTriggerType = stmt.ColumnIndex(KColTriggerType);
+    TInt columnIndexRequestType = stmt.ColumnIndex(KColRequestType);
+    TInt columnIndexOutstandingTrigger = stmt.ColumnIndex(KColOutstandingTrigger);
+    TInt columnIndexInterval = stmt.ColumnIndex(KColInterval);
+
+    // Reset client array
+    aParamValues.Reset();
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        CTriggerParams *params = CTriggerParams::NewL();
+        sessionId = stmt.ColumnInt(columnIndexSessionID);
+        stmt.ColumnText(columnIndexSessionName,sessionName);
+        notificationPresent = stmt.ColumnInt(columnIndexNotificationPresent);
+        triggerNotificationStatus = stmt.ColumnInt(columnIndexTriggerNotificationStatus);
+        triggerType = (CTriggerParams::TTriggerType) stmt.ColumnInt(columnIndexTriggerType);
+        requestType = (CTriggerParams::TRequestType) stmt.ColumnInt(columnIndexRequestType);
+        outstandingTrigger = stmt.ColumnInt(columnIndexOutstandingTrigger);
+        interval = stmt.ColumnInt(columnIndexInterval);
+        
+        params->Set(sessionId,sessionName,notificationPresent,triggerNotificationStatus,triggerType,requestType,outstandingTrigger,interval);
+        aParamValues.Append(params);//ownership transferred to RPointerArray
+        }   
+
+    stmt.Close();
+    if(aParamValues.Count()==0)
+        {
+        User::Leave(KErrNotFound);
+        }
+    
+    }
+
+
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::GetSessionL()
+//
+// Returns the session parameters for a given session id
+// ---------------------------------------------------------------------------
+void CSettingsDatabaseHandler::GetSessionL(TInt64 aSessionId,
+                                                CTriggerParams*& aParamValues)
+    {
+    if( !IsSessionExists(aSessionId) ) //no session exists with the given id so return error
+        {
+        User::Leave(KErrNotFound);
+        }
+    iSQLString.Copy(KSelect);
+    iSQLString.Append(KStar);
+    iSQLString.Append(KFrom);
+    iSQLString.Append(KSessionTableName); // retrieve list of all session in order of priority
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSessionId);
+    iSQLString.Append(KEquals);
+    iSQLString.AppendNum(aSessionId);
+        
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb,iSQLString);
+    if(err != KErrNone)
+        {
+        stmt.Close();
+        User::Leave(KErrGeneral);
+        }
+    
+    TInt64 sessionId;
+    TBool notificationPresent;
+    TBool triggerNotificationStatus;
+    CTriggerParams::TTriggerType triggerType;
+    CTriggerParams::TRequestType requestType;
+    TUint64 outstandingTrigger;
+    TUint64 interval;
+    TBuf<KGenericStringLen> sessionName;
+        
+    TInt columnIndexSessionID = stmt.ColumnIndex(KColSessionId);
+    TInt columnIndexSessionName = stmt.ColumnIndex(KColSessionName);
+    TInt columnIndexNotificationPresent = stmt.ColumnIndex(KColNotificationPresent);
+    TInt columnIndexTriggerNotificationStatus = stmt.ColumnIndex(KColTriggerNotificationStatus);
+    TInt columnIndexTriggerType = stmt.ColumnIndex(KColTriggerType);
+    TInt columnIndexRequestType = stmt.ColumnIndex(KColRequestType);
+    TInt columnIndexOutstandingTrigger = stmt.ColumnIndex(KColOutstandingTrigger);
+    TInt columnIndexInterval = stmt.ColumnIndex(KColInterval);
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        sessionId = stmt.ColumnInt(columnIndexSessionID);
+        stmt.ColumnText(columnIndexSessionName,sessionName);
+        notificationPresent = stmt.ColumnInt(columnIndexNotificationPresent);
+        triggerNotificationStatus = stmt.ColumnInt(columnIndexTriggerNotificationStatus);
+        triggerType = (CTriggerParams::TTriggerType) stmt.ColumnInt(columnIndexTriggerType);
+        requestType = (CTriggerParams::TRequestType) stmt.ColumnInt(columnIndexRequestType);
+        outstandingTrigger = stmt.ColumnInt(columnIndexOutstandingTrigger);
+        interval = stmt.ColumnInt(columnIndexInterval);
+                
+        aParamValues->Set(sessionId,sessionName,notificationPresent,triggerNotificationStatus,triggerType,requestType,outstandingTrigger,interval);
+        }   
+
+    stmt.Close();
+    }
+
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::SessionCount()
+//
+// This method is retrieve the count of session entries present
+// ---------------------------------------------------------------------------
+TInt CSettingsDatabaseHandler::SessionCount(TInt& aCount)
+    {
+    //Select all slps existing in the records
+    TBuf<KGenericStringLen> sqlString;
+
+    sqlString.Copy(KSelect);
+    sqlString.Append(KCount);
+    sqlString.Append(KOpeningBracket);
+    sqlString.Append(KStar);
+    sqlString.Append(KClosingBracket);
+    sqlString.Append(KFrom);
+    sqlString.Append(KSessionTableName);
+    
+    
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb, sqlString);
+    if(err != KErrNone)
+        {
+        stmt.Close();
+        return KErrGeneral;
+        }
+        
+    aCount = 0;
+    TInt columnIndex0 = 0; 
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        aCount = stmt.ColumnInt(columnIndex0); //count number of rows
+        }
+    stmt.Close();
+    
+    if(aCount == 0 )
+        {
+        return KErrNotFound;
+        }
+    return KErrNone;       
+    }
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::IsSessionExists()
+//
+// This method is to check if a session entry exists corresponding to a particular session Id
+// ---------------------------------------------------------------------------
+TBool CSettingsDatabaseHandler::IsSessionExists(const TInt64 aSessionId)
+    {
+    //Select all sessions existing in the records corresponing to the session Id
+    
+    TBuf<KGenericStringLen> sqlString;
+    
+    sqlString.Copy(KSelect);
+    sqlString.Append(KCount);
+    sqlString.Append(KOpeningBracket);
+    sqlString.Append(KStar);
+    sqlString.Append(KClosingBracket);
+    sqlString.Append(KFrom);
+    sqlString.Append(KSessionTableName);
+    sqlString.Append(KWhere);
+    sqlString.Append(KColSessionId);
+    sqlString.Append(KEquals);
+    sqlString.AppendNum(aSessionId);
+   
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb, sqlString);
+   
+    TInt count = 0;
+    TInt columnIndex0 = 0; 
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        count = stmt.ColumnInt(columnIndex0); //count number of rows
+        }
+    stmt.Close();
+    if(count == 0)
+        {
+        return EFalse;
+        }
+    
+    return ETrue;
+    }
+
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::GetServerExtensionParamsL()
+//
+// This method is used to retrieve extended parameters of given server
+// ---------------------------------------------------------------------------
+void  CSettingsDatabaseHandler::GetServerExtensionParamsL( TInt64 aSlpId,CServerExtensionParams* aServerExtnParams )
+	{
+	if(!IsSlpExists(aSlpId))
+		{
+		User::Leave(KErrNotFound);
+		}
+    iSQLString.Copy(KSelect);
+    iSQLString.Append(KStar);
+    iSQLString.Append(KFrom);
+    iSQLString.Append(KCreateTableName); // retrieve list of all session in order of priority
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSLPId);
+    iSQLString.Append(KEquals);
+    iSQLString.AppendNum(aSlpId);
+        
+    RSqlStatement stmt;
+    TInt err = stmt.Prepare(iDb,iSQLString);
+    if(err != KErrNone)
+        {
+        stmt.Close();
+        User::Leave(err);
+        }
+    
+    TBuf<KMaxServerIdLen> serverId;
+    TBuf<KMaxIAPLen> iap1;
+    TBuf<KMaxIAPLen> iap2;
+    TBuf<KMaxServerAddLen> serverAddr;
+    TBuf<KMaxServerAddTypeLen> serverAddrType;
+   
+    TInt columnIndexServerId = stmt.ColumnIndex(KColServerId);
+    TInt columnIndexIap1 = stmt.ColumnIndex(KColIap1);
+    TInt columnIndexIap2 = stmt.ColumnIndex(KColIap2);
+    TInt columnIndexServerAddress = stmt.ColumnIndex(KColServerAddress);
+    TInt columnIndexServerAddType = stmt.ColumnIndex(KColServerAddType);
+    
+    while((err=stmt.Next())==KSqlAtRow)
+        {
+        stmt.ColumnText(columnIndexServerId,serverId);
+        stmt.ColumnText(columnIndexIap1,iap1);
+        stmt.ColumnText(columnIndexIap2,iap2);
+        stmt.ColumnText(columnIndexServerAddress,serverAddr);
+        stmt.ColumnText(columnIndexServerAddType,serverAddrType);
+                
+        aServerExtnParams->Set(serverId,iap1,iap2,serverAddr,serverAddrType);
+        }   
+
+    stmt.Close();
+	}
+	
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::UpdateServerExtensionParamsL()
+//
+// This method is used to set extended parameters of a given server.
+// ---------------------------------------------------------------------------
+void  CSettingsDatabaseHandler::UpdateServerExtensionParamsL( TInt64 aSlpId,CServerExtensionParams* aServerExtnParams )
+	{
+	if(!IsSlpExists(aSlpId))
+		{
+		User::Leave(KErrNotFound);
+		}
+	
+    HBufC* serverId = HBufC::NewLC( KMaxServerIdLen);
+    HBufC* iap1 = HBufC::NewLC( KMaxIAPLen);
+    HBufC* iap2 = HBufC::NewLC( KMaxIAPLen);
+    HBufC* serverAddr = HBufC::NewLC( KMaxServerAddLen);
+    HBufC* serverAddrType = HBufC::NewLC( KMaxServerAddTypeLen);
+        
+    TInt ret = 0;
+    ret = aServerExtnParams->Get(serverId->Des(),iap1->Des(),iap2->Des(),serverAddr->Des(),serverAddrType->Des());
+    if(ret == KErrNotFound)
+        {
+        CleanupStack::PopAndDestroy(5); 
+        User::Leave(KErrArgument); 
+        }
+   
+    iSQLString.Copy(KUpdateRecord);
+    iSQLString.Append(KCreateTableName);
+    iSQLString.Append(KSET);
+    
+    iSQLString.Append(KColServerId);
+    iSQLString.Append(KEquals);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(*serverId);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(KCommaSeparator);
+
+    iSQLString.Append(KColIap1);
+    iSQLString.Append(KEquals);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(*iap1);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.Append(KColIap2);
+    iSQLString.Append(KEquals);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(*iap2);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.Append(KColServerAddress);
+    iSQLString.Append(KEquals);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(*serverAddr);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(KCommaSeparator);
+    
+    iSQLString.Append(KColServerAddType);
+    iSQLString.Append(KEquals);
+    iSQLString.Append(KQuotes);
+    iSQLString.Append(*serverAddrType);
+    iSQLString.Append(KQuotes);
+    
+    iSQLString.Append(KWhere);
+    iSQLString.Append(KColSLPId);
+    iSQLString.Append(KEquals);
+    iSQLString.AppendNum(aSlpId);  
+    
+    TInt err = iDb.Exec(iSQLString); 
+    PrintErrorMessage(iSQLString,err,6); 
+    CleanupStack::PopAndDestroy(5);
+    if(err < 0)
+        {
+        User::Leave(err);
+        }
+	}	
+
+
+
+//-----------------------------------------------------------------------------
+// CSettingsDatabaseHandler::NotifySessionDBChange()
+//
+// This method is used to notify that a change has occured in the DB via the CR 
+// ----------------------------------------------------------------------------
+TInt CSettingsDatabaseHandler::NotifySessionDBChange(MSuplSessionObserver::TSuplSessionEventType aChangedEventType,TInt64 aSessionId)
+    {
+    TInt err;
+    TReal idChanged = aSessionId;
+    err = iSettingsNotifierRep->Set(KSuplSessionDBChangedSessionId,idChanged);
+    if(err != KErrNone)
+        {
+        return err;
+        }
+    TInt curEvent;
+    TInt keyValue;
+    err = iSettingsNotifierRep->Get(KSuplSessionDBEvent,curEvent);
+    if(err != KErrNone)
+        {
+        return err;
+        }
+    if(aChangedEventType == (MSuplSessionObserver::TSuplSessionEventType)curEvent)
+        {
+        keyValue = aChangedEventType+1;
+        }
+    else
+        keyValue = aChangedEventType;
+    err = iSettingsNotifierRep->Set(KSuplSessionDBEvent,keyValue);
+    return err;
+    }
+
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::PrintErrorMessage(const TDesC& aQueryFired,
+//                                          TInt aErrorCode,TInt aOperationCode)
+//
+// Used to print error messages. Used for logging purposes
+// (other items were commented in a header)
+// --------------------------------------------------------------------------- 
+void CSettingsDatabaseHandler::PrintErrorMessage(
+        const TDesC& 
+#ifdef PRINT_MESSAGE 
+        aQueryFired
+#endif
+        ,TInt 
+#ifdef PRINT_MESSAGE 
+        aErrorCode
+#endif    
+        ,TInt 
+#ifdef PRINT_MESSAGE 
+        aOperationCode
+#endif    
+    )    
+    {
+    #ifdef PRINT_MESSAGE 
+    
+        LogQuery(aQueryFired);
+        TBuf<64> buf;
+    
+        if(!(aOperationCode == 4 || aOperationCode == 3 || aOperationCode == 7))
+            {                   
+            buf.Copy(iDb.LastErrorMessage());
+            TRACETEXT(buf)
+            }
+    
+        switch(aOperationCode)
+            {
+            case 0:
+                {
+                buf.Copy(_L("DB Created with error code..."));
+                break;
+                }
+            case 1 :
+                {
+                buf.Copy(_L("Table Created With Error Code..."));
+                break;
+                }
+            case 2 : 
+                {
+                buf.Copy(_L("Record Inserted With Error Code..."));
+                break;
+                }
+            case 3:
+                {
+                buf.Copy(_L("DB Opened with error code..."));
+                break;
+                }
+            case 4:
+                {
+                buf.Copy(_L("Security Policy error code ... "));
+                break;
+                }
+    
+            case 5:
+                {
+                buf.Copy(_L("Record Deleted with error code..."));
+                break;
+                }
+            case 6:
+                {
+                buf.Copy(_L("Record Updated with error code..."));
+                break;
+                }
+            case 7:
+                {
+                buf.Copy(_L("Retrieved from CRep with error code"));
+                }
+                break;
+            case 8:
+                {
+                buf.Copy(_L("InsertSLPRecordL completed. Reason  "));
+                }
+                break;
+            case 9:
+                {
+                buf.Copy(_L("UpdateDefaultServerL completed. Reason "));
+                }
+                break;
+            case 10:
+                {
+                buf.Copy(_L("UpdateSLPRecordL completed. Reason "));
+                }
+                break;
+            case 11:
+                {
+                buf.Copy(_L("DeleteSLPRecordL completed. Reason "));
+                }
+            case 12 :
+                {
+                buf.Copy(_L("SetSLPAsDefaultL completed. Reason "));
+                }
+                break;
+            case 13 : 
+                {
+                buf.Copy(_L("Record Retreived with error code..."));
+                break;
+                }
+            case 14:
+                {
+                buf.Copy(_L("GetDefaultSLPId completed. Reason"));
+                }
+                break;
+            case 15 :
+                {
+                buf.Copy(_L("IsSlpExists completed. Return Code "));
+                }
+                break;
+            case 16:
+                {
+                buf.Copy(_L("SlpCount Completed. Count "));
+                }
+                break;
+            case 17:
+                {
+                buf.Copy(_L("GetDefaultServer completed. Reason "));
+                }
+                break;
+            case 18:
+                {
+                buf.Copy(_L("GetNwInfoPropertiesL completed. Reason "));
+                }
+                break;
+            default:
+                {
+                buf.Copy(_L("Unknown Operation Completed With Error Code..."));
+                }
+                break;
+            }
+    
+        buf.AppendNum(aErrorCode);
+        TRACETEXT(buf)
+    
+    #endif                              
+    }
+    
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::LogQuery(const TDesC& aBuffer)
+//
+// Used to print error messages. Used for logging purposes
+// ---------------------------------------------------------------------------   
+void CSettingsDatabaseHandler::LogQuery(const TDesC& 
+#ifdef PRINT_MESSAGE
+        aBuffer
+#endif
+        )
+    {
+    #ifdef PRINT_MESSAGE
+        const TInt MaxLength = 125;
+        TBuf<MaxLength> buff;
+        TInt len = aBuffer.Length();
+        if(len == 0) return;
+        TInt start = 0;
+        while(start<=len)
+            {
+            if( len - start > MaxLength)
+                buff.Copy(aBuffer.Mid(start,MaxLength));
+            else
+                buff.Copy(aBuffer.Mid(start));
+    
+            TRACETEXT(buff) 
+            start = start + MaxLength;
+    
+            }
+    #endif
+    }
+
+// ---------------------------------------------------------------------------
+// CSettingsDatabaseHandler::LogAllSLP()
+//
+// 
+// ---------------------------------------------------------------------------
+
+void CSettingsDatabaseHandler::LogAllSLP()
+    {
+    #ifdef PRINT_MESSAGE
+        TBuf<KCustomSqlMaxLength> sqlString;
+        sqlString.Append(KSelect);
+        sqlString.Append(KStar);
+        sqlString.Append(KFrom);
+        sqlString.Append(KCreateTableName);
+        sqlString.Append(KOrderBy);
+        sqlString.Append(KColPriority);
+        sqlString.Append(KCommaSeparator);
+        sqlString.Append(KColSLPId);
+    
+        RSqlStatement stmt;
+        TInt err = stmt.Prepare(iDb, sqlString);
+       
+        TInt64 SLPId =  -1;
+        TBuf<256> ServerAddress,Manufacturer1,Iap;
+        TBuf<10> priorityBuf;
+        TBuf<256> lastusetime;
+        TBuf<256> lasttried;
+        TInt otherprops;
+        TBuf<10> otherpropbuf;
+        TBuf<10> slpIdBuf;
+    
+        TTime TimeLastUse;
+        TTime TimeLastTried;
+        TInt priority = 0;
+        TInt columnIndexSLPID = stmt.ColumnIndex(KColSLPId);
+        TInt columnIndexSLPAddress = stmt.ColumnIndex(KColSLPAddress);
+        TInt columnIndexMajorVersion = stmt.ColumnIndex(KColProtocolVersionMajor);
+        TInt columnIndexIAP = stmt.ColumnIndex(KColIap);
+        TInt columnIndexTimeLastUse = stmt.ColumnIndex(KColTimeLastUse);
+        TInt columnIndexTimeLastTried = stmt.ColumnIndex(KColTimeLastTried);
+    
+        TInt columnIndexNetInfoLastUse = stmt.ColumnIndex(KColNetInfoLastUse);
+        TInt columnIndexNetInfoLastSucess = stmt.ColumnIndex(KColNetInfoLastSucess);
+        TInt columnIndexOtherProperties = stmt.ColumnIndex(KColOtherProperties);
+        TInt columnIndexPriority = stmt.ColumnIndex(KColPriority);
+        while((err=stmt.Next())==KSqlAtRow)
+            {
+            SLPId = stmt.ColumnInt(columnIndexSLPID);
+            priority = stmt.ColumnInt(columnIndexPriority);
+            stmt.ColumnText(columnIndexSLPAddress,ServerAddress);
+            stmt.ColumnText(columnIndexIAP,Iap);            
+            stmt.ColumnText(columnIndexTimeLastUse,lastusetime);
+            stmt.ColumnText(columnIndexTimeLastTried,lasttried);
+            otherprops = stmt.ColumnInt(columnIndexOtherProperties);
+            otherpropbuf.Zero();
+            otherpropbuf.AppendNum(otherprops);
+            priorityBuf.Zero();
+            priorityBuf.AppendNum(priority);
+            slpIdBuf.Zero();
+            slpIdBuf.AppendNum(SLPId);
+            TRACETEXT(slpIdBuf)
+            TRACETEXT(priorityBuf)
+            TRACETEXT(ServerAddress)
+            TRACETEXT(Iap)
+            TRACETEXT(Manufacturer1)
+            TRACETEXT(lastusetime)
+            TRACETEXT(lasttried)
+            TRACETEXT(otherpropbuf)
+            
+            }   
+    
+        stmt.Close();
+    #endif
+    }