eapol/eapol_framework/eapol_symbian/am/type/gsmsim/symbian/plugin/src/EapSimDbUtils.cpp
changeset 0 c8830336c852
child 2 1c7bc153c08e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eapol/eapol_framework/eapol_symbian/am/type/gsmsim/symbian/plugin/src/EapSimDbUtils.cpp	Thu Dec 17 08:47:43 2009 +0200
@@ -0,0 +1,802 @@
+/*
+* Copyright (c) 2001-2006 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "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:  EAP and WLAN authentication protocols.
+*
+*/
+
+
+// This is enumeration of EAPOL source code.
+#if defined(USE_EAP_MINIMUM_RELEASE_TRACES)
+	#undef EAP_FILE_NUMBER_ENUM
+	#define EAP_FILE_NUMBER_ENUM 209 
+	#undef EAP_FILE_NUMBER_DATE 
+	#define EAP_FILE_NUMBER_DATE 1127594498 
+#endif //#if defined(USE_EAP_MINIMUM_RELEASE_TRACES)
+
+
+// INCLUDES
+#include "EapSimDbUtils.h"
+#include "EapSimDbDefaults.h"
+#include "EapSimDbParameterNames.h"
+
+#include "eap_am_trace_symbian.h"
+
+const TInt KMaxSqlQueryLength = 2048;
+const TInt KMicroSecsInAMinute = 60000000; // 60000000 micro seconds is 1 minute.
+
+// ================= MEMBER FUNCTIONS =======================
+
+void EapSimDbUtils::OpenDatabaseL(RDbNamedDatabase& aDatabase, RDbs& aSession, const TIndexType aIndexType,
+	const TInt aIndex, const eap_type_value_e aTunnelingType)
+{
+#ifdef USE_EAP_EXPANDED_TYPES
+
+	TUint aTunnelingVendorType = aTunnelingType.get_vendor_type();
+
+#else
+
+	TUint aTunnelingVendorType = static_cast<TUint>(aTunnelingType);
+
+#endif //#ifdef USE_EAP_EXPANDED_TYPES
+
+	EAP_TRACE_DEBUG_SYMBIAN((_L("EapSimDbUtils::OpenDatabaseL -Start- aIndexType=%d, aIndex=%d, aTunnelingVendorType=%d \n"),
+	aIndexType,aIndex,aTunnelingVendorType) );
+
+	// 1. Open/create a database	
+	
+	// Connect to the DBMS server.
+	User::LeaveIfError(aSession.Connect());		
+	CleanupClosePushL(aSession);	
+	// aSession and aDatabase are pushed to the cleanup stack even though they may be member
+	// variables of the calling class and would be closed in the destructor anyway. This ensures
+	// that if they are not member variables they will be closed. Closing the handle twice
+	// does no harm.	
+	
+#ifdef SYMBIAN_SECURE_DBMS
+	
+	// Create the secure shared database with the specified secure policy.
+	// Database will be created in the data caging path for DBMS (C:\private\100012a5).
+	
+	TInt err = aDatabase.Create(aSession, KDatabaseName, KSecureUIDFormat);
+	
+	EAP_TRACE_DEBUG_SYMBIAN((_L("EapSimDbUtils::OpenDatabaseL - Created Secure DB for eapsim.dat. err=%d\n"), err));
+
+	
+	if(err == KErrNone)
+	{
+		aDatabase.Close();
+		
+	} else if (err != KErrAlreadyExists) 
+	{
+		User::LeaveIfError(err);
+	}
+	
+	User::LeaveIfError(aDatabase.Open(aSession, KDatabaseName, KSecureUIDFormat));
+	CleanupClosePushL(aDatabase);		
+		
+#else
+	// Non secured database. The database will be created in the old location (c:\system\data).
+	
+	RFs fsSession;		
+	User::LeaveIfError(fsSession.Connect());
+	CleanupClosePushL(fsSession);	
+	TInt err = aDatabase.Create(fsSession, KDatabaseName);
+	
+	EAP_TRACE_DEBUG_SYMBIAN((_L("EapSimDbUtils::OpenDatabaseL - Created Non-Secure DB for eapsim.dat. err=%d\n"), err));
+	
+	
+	if(err == KErrNone)
+	{
+		aDatabase.Close();
+		
+	} else if (err != KErrAlreadyExists) 
+	{
+		User::LeaveIfError(err);
+	}
+	CleanupStack::PopAndDestroy( &fsSession ); // close fsSession
+	
+	User::LeaveIfError(aDatabase.Open(aSession, KDatabaseName));
+	CleanupClosePushL(aDatabase);		
+	    
+#endif // #ifdef SYMBIAN_SECURE_DBMS
+
+	// 2. Create the eapsim table to database (ignore error if exists)
+	
+// Table columns:
+//// NAME ///////////////////////////////////////////////// TYPE ////////////// Constant /////////
+//| ServiceType									| UNSIGNED INTEGER | KServiceType      |//
+//| ServiceIndex								| UNSIGNED INTEGER | KServiceIndex     |//
+//| TunnelingType								| UNSIGNED INTEGER | KTunnelingType    |//
+//| EAP_GSMSIM_use_manual_realm					| UNSIGNED INTEGER | cf_str_EAP_GSMSIM_use_manual_realm_literal   |//
+//| EAP_GSMSIM_manual_realm						| VARCHAR(255)	   | cf_str_EAP_GSMSIM_manual_realm_literal			   |//
+//| EAP_GSMSIM_use_manual_username				| UNSIGNED INTEGER | cf_str_EAP_GSMSIM_use_manual_username_literal|//
+//| EAP_GSMSIM_manual_username					| VARCHAR(255)	   | cf_str_EAP_GSMSIM_manual_username_literal		   |//
+//| PseudonymId									| LONG VARBINARY   | KPseudonymId      |//
+//| XKEY										| BINARY(20)       | KXKey             |//
+//| K_aut										| BINARY(16)       | KK_aut            |//
+//| K_encr										| BINARY(16)       | KK_encr           |//
+//| ReauthCounter								| UNSIGNED INTEGER | KReauthCounter    |//
+//| ReauthId									| LONG VARBINARY   | KReauthId         |//
+//| PreviousIMSI								| VARBINARY(15)	   | KPreviousIMSI	   |//
+//| EAP_GSMSIM_use_pseudonym_identity 			| UNSIGNED INTEGER | cf_str_EAP_GSMSIM_use_pseudonym_identity_literal	   	|//
+//| EAP_GSMSIM_max_session_validity_time		| BIGINT		   | cf_str_EAP_GSMSIM_max_session_validity_time_literal   |//
+//| EAP_GSMSIM_last_full_authentication_time	| BIGINT		   | KGSMSIMLastFullAuthTime	|//
+//////////////////////////////////////////////////////////////////////////////////////////////////
+
+	HBufC* buf = HBufC::NewLC(KMaxSqlQueryLength);
+	TPtr sqlStatement = buf->Des();
+	
+	_LIT(KSQLCreateTable, "CREATE TABLE %S (%S UNSIGNED INTEGER, \
+												 %S UNSIGNED INTEGER, \
+												 %S UNSIGNED INTEGER, \
+												 %S UNSIGNED INTEGER, \
+												 %S VARCHAR(%d), \
+												 %S UNSIGNED INTEGER, \
+												 %S VARCHAR(%d), \
+												 %S LONG VARBINARY, \
+												 %S BINARY(%d), \
+												 %S BINARY(%d), \
+												 %S BINARY(%d), \
+												 %S UNSIGNED INTEGER, \
+												 %S LONG VARBINARY, \
+												 %S VARBINARY(%d), \
+												 %S UNSIGNED INTEGER, \
+												 %S BIGINT, \
+												 %S BIGINT)");
+												 
+	sqlStatement.Format(KSQLCreateTable, &KSimTableName, &KServiceType,
+														 &KServiceIndex, 
+														 &KTunnelingType,
+														 &cf_str_EAP_GSMSIM_use_manual_realm_literal, 
+														 &cf_str_EAP_GSMSIM_manual_realm_literal, KMaxManualRealmLengthInDB, 
+														 &cf_str_EAP_GSMSIM_use_manual_username_literal, 
+														 &cf_str_EAP_GSMSIM_manual_username_literal, KMaxManualUsernameLengthInDB, 
+														 &KPseudonymId,
+														 &KXKey, KMaxXKeyLengthInDB, 
+														 &KK_aut, KMaxK_autLengthInDB, 
+														 &KK_encr, KMaxK_encrLengthInDB, 
+														 &KReauthCounter, 
+														 &KReauthId, 
+														 &KPreviousIMSI, KMaxIMSILengthInDB,
+														 &cf_str_EAP_GSMSIM_use_pseudonym_identity_literal,														 
+														 &cf_str_EAP_GSMSIM_max_session_validity_time_literal, 
+														 &KGSMSIMLastFullAuthTime);
+																					
+	err = aDatabase.Execute(sqlStatement);
+	if (err != KErrNone && err != KErrAlreadyExists)
+	{
+		User::Leave(err);
+	}
+	
+	// 4. Check if database table contains a row for this service type and id  
+	
+	_LIT(KSQLQueryRow, "SELECT %S FROM %S WHERE %S=%d AND %S=%d AND %S=%d");
+	sqlStatement.Format(KSQLQueryRow, &cf_str_EAP_GSMSIM_manual_realm_literal, &KSimTableName, 
+		&KServiceType, aIndexType, &KServiceIndex, aIndex, &KTunnelingType, aTunnelingVendorType);
+		
+	RDbView view;
+	User::LeaveIfError(view.Prepare(aDatabase, TDbQuery(sqlStatement), TDbWindow::EUnlimited));
+	// View must be closed when no longer needed
+	CleanupClosePushL(view);
+	
+	User::LeaveIfError(view.EvaluateAll());
+	
+	// 5. If row is not found then add it
+	
+	TInt rows = view.CountL();
+	CleanupStack::PopAndDestroy( &view ); // Close view.
+	if (rows == 0)
+	{
+		_LIT(KSQLInsert, "SELECT * FROM %S");
+		sqlStatement.Format(KSQLInsert, &KSimTableName);	
+										
+		User::LeaveIfError(view.Prepare(aDatabase, TDbQuery(sqlStatement), TDbWindow::EUnlimited, RDbView::EInsertOnly));
+		CleanupClosePushL(view);
+		
+		// Get column set so we get the correct column numbers
+		CDbColSet* colSet = view.ColSetL();		
+		CleanupStack::PushL(colSet);
+		
+		view.InsertL();
+		view.SetColL(colSet->ColNo(KServiceType), static_cast<TInt>(aIndexType));
+		view.SetColL(colSet->ColNo(KServiceIndex), aIndex);
+		view.SetColL(colSet->ColNo(KTunnelingType), aTunnelingVendorType);
+		
+		view.SetColL(colSet->ColNo(cf_str_EAP_GSMSIM_use_manual_realm_literal), default_EAP_GSMSIM_use_manual_realm);	
+		view.SetColL(colSet->ColNo(cf_str_EAP_GSMSIM_manual_realm_literal), default_EAP_GSMSIM_manual_realm);
+		
+		view.SetColL(colSet->ColNo(cf_str_EAP_GSMSIM_use_manual_username_literal), default_EAP_GSMSIM_use_manual_username);
+		view.SetColL(colSet->ColNo(cf_str_EAP_GSMSIM_manual_username_literal), default_EAP_GSMSIM_manual_username);
+		
+		view.SetColL(colSet->ColNo(cf_str_EAP_GSMSIM_use_pseudonym_identity_literal), default_EAP_GSMSIM_use_pseudonym_identity);			
+		
+		view.SetColL(colSet->ColNo(cf_str_EAP_GSMSIM_max_session_validity_time_literal), default_MaxSessionTime);
+		
+		view.SetColL(colSet->ColNo(KGSMSIMLastFullAuthTime), default_FullAuthTime);				
+
+		view.PutL();
+		
+		CleanupStack::PopAndDestroy( colSet ); // Delete colSet.
+		
+		CleanupStack::PopAndDestroy( &view ); // Close view.
+	}
+	
+	CleanupStack::PopAndDestroy( buf ); // Delete buf	
+	CleanupStack::Pop( &aDatabase );	
+	CleanupStack::Pop( &aSession );	
+	
+	aDatabase.Compact();
+}
+
+void EapSimDbUtils::SetIndexL(
+	RDbNamedDatabase& aDatabase, 		
+	const TIndexType aIndexType,
+	const TInt aIndex,
+	const eap_type_value_e aTunnelingType,
+	const TIndexType aNewIndexType,
+	const TInt aNewIndex,
+	const eap_type_value_e aNewTunnelingType)
+{
+#ifdef USE_EAP_EXPANDED_TYPES
+
+	TUint aTunnelingVendorType = aTunnelingType.get_vendor_type();
+	TUint aNewTunnelingVendorType = aNewTunnelingType.get_vendor_type();
+
+#else
+
+	TUint aTunnelingVendorType = static_cast<TUint>(aTunnelingType);
+	TUint aNewTunnelingVendorType = static_cast<TUint>(aNewTunnelingType);
+
+#endif //#ifdef USE_EAP_EXPANDED_TYPES
+
+	HBufC* buf = HBufC::NewLC(KMaxSqlQueryLength);
+	TPtr sqlStatement = buf->Des();
+
+	_LIT(KSQL, "SELECT * FROM %S WHERE %S=%d AND %S=%d AND %S=%d");
+
+	sqlStatement.Format(KSQL, &KSimTableName, 
+		&KServiceType, aIndexType, &KServiceIndex, aIndex, &KTunnelingType, aTunnelingVendorType);
+	
+	RDbView view;
+	
+	User::LeaveIfError(view.Prepare(aDatabase, TDbQuery(sqlStatement), TDbWindow::EUnlimited));
+	
+	// View must be closed when no longer needed
+	CleanupClosePushL(view);
+	
+	User::LeaveIfError(view.EvaluateAll());
+			
+	TInt rows = view.CountL();
+	
+	if (rows == 0)
+	{
+		User::Leave(KErrNotFound);
+	}
+	
+	// Get the first (and only) row
+	view.FirstL();
+	view.GetL();				
+	
+	// Get column set so we get the correct column numbers
+	CDbColSet* colSet = view.ColSetL();
+	CleanupStack::PushL(colSet);
+	
+	view.UpdateL();
+	
+    view.SetColL(colSet->ColNo(KServiceType), static_cast<TUint>(aNewIndexType));
+    
+    view.SetColL(colSet->ColNo(KServiceIndex), aNewIndex);
+    
+    view.SetColL(colSet->ColNo(KTunnelingType), aNewTunnelingVendorType);
+
+    view.PutL();
+    	
+	CleanupStack::PopAndDestroy(3); // view, colset, buf
+}
+
+void EapSimDbUtils::SetConfigurationL(
+	RDbNamedDatabase& aDatabase,
+	const EAPSettings& aSettings, 
+	const TIndexType aIndexType,
+	const TInt aIndex,
+	const eap_type_value_e aTunnelingType)
+{
+#ifdef USE_EAP_EXPANDED_TYPES
+
+	TUint aTunnelingVendorType = aTunnelingType.get_vendor_type();
+
+#else
+
+	TUint aTunnelingVendorType = static_cast<TUint>(aTunnelingType);
+
+#endif //#ifdef USE_EAP_EXPANDED_TYPES
+
+	EAP_TRACE_DEBUG_SYMBIAN((_L("EapSimDbUtils::SetConfigurationL -Start- aIndexType=%d, aIndex=%d, aTunnelingVendorType=%d\n"),
+						aIndexType,aIndex, aTunnelingVendorType));
+	
+	EAP_TRACE_DEBUG_SYMBIAN((_L("*************************** SetConfigurationL - Set the below values: ***************************\n")) );
+	EAP_TRACE_DEBUG_SYMBIAN((_L("SetConfigurationL - Set these values for EAPType=%d"),aSettings.iEAPType) );
+	EAP_TRACE_DEBUG_SYMBIAN((_L("SetConfigurationL - present=%d, Username=%S"),aSettings.iUsernamePresent, &(aSettings.iUsername)) );
+	EAP_TRACE_DEBUG_SYMBIAN((_L("SetConfigurationL - present=%d, Password=%S"),aSettings.iPasswordPresent, &(aSettings.iPassword)) );
+	EAP_TRACE_DEBUG_SYMBIAN((_L("SetConfigurationL - present=%d, Realm=%S"),aSettings.iRealmPresent, &(aSettings.iRealm)) );
+	EAP_TRACE_DEBUG_SYMBIAN((_L("SetConfigurationL - present=%d, UsePseudonyms=%d"),aSettings.iUsePseudonymsPresent, aSettings.iUsePseudonyms) );
+	EAP_TRACE_DEBUG_SYMBIAN((_L("SetConfigurationL - present=%d, VerifyServerRealm=%d"),
+						aSettings.iVerifyServerRealmPresent, aSettings.iVerifyServerRealm) );
+
+	EAP_TRACE_DEBUG_SYMBIAN((_L("SetConfigurationL - present=%d, RequireClientAuthentication=%d"),
+						aSettings.iRequireClientAuthenticationPresent, aSettings.iRequireClientAuthentication) );
+						
+	EAP_TRACE_DEBUG_SYMBIAN((_L("SetConfigurationL - present=%d, SessionValidityTime=%d minutes"),
+						aSettings.iSessionValidityTimePresent, aSettings.iSessionValidityTime) );
+												
+	EAP_TRACE_DEBUG_SYMBIAN((_L("SetConfigurationL - present=%d, CipherSuites Count=%d"),
+						aSettings.iCipherSuitesPresent, aSettings.iCipherSuites.Count()) );
+	
+	EAP_TRACE_DEBUG_SYMBIAN((_L("SetConfigurationL - present=%d, PEAPv0Allowed=%d, PEAPv1Allowed=%d, PEAPv2Allowed=%d"),
+						aSettings.iPEAPVersionsPresent, aSettings.iPEAPv0Allowed,aSettings.iPEAPv1Allowed, aSettings.iPEAPv2Allowed ) );
+		
+	EAP_TRACE_DEBUG_SYMBIAN((_L("SetConfigurationL - present=%d, Certificates Count=%d"),
+						aSettings.iCertificatesPresent, aSettings.iCertificates.Count()) );
+						
+	EAP_TRACE_DEBUG_SYMBIAN((_L("SetConfigurationL - Certificate details below: \n")) );
+	
+	for( TInt n=0; n < aSettings.iCertificates.Count(); n++ )
+	{
+		EAP_TRACE_DEBUG_SYMBIAN((_L("SetConfigurationL - Certificate type:%d \n"), aSettings.iCertificates[n].iCertType) );
+		
+		EAP_TRACE_DEBUG_SYMBIAN((_L("SetConfigurationL - certificates - present=%d, SubjectName=%S"),
+						aSettings.iCertificates[n].iSubjectNamePresent, &(aSettings.iCertificates[n].iSubjectName) ) );
+						
+		EAP_TRACE_DEBUG_SYMBIAN((_L("SetConfigurationL - certificates - present=%d, IssuerName=%S"),
+						aSettings.iCertificates[n].iIssuerNamePresent, &(aSettings.iCertificates[n].iIssuerName) ) );
+						
+		EAP_TRACE_DEBUG_SYMBIAN((_L("SetConfigurationL - certificates - present=%d, SerialNumber=%S"),
+						aSettings.iCertificates[n].iSerialNumberPresent, &(aSettings.iCertificates[n].iSerialNumber) ) );
+						
+		EAP_TRACE_DEBUG_SYMBIAN((_L("SetConfigurationL - certificates - SubjectKeyID present=%d"),
+						aSettings.iCertificates[n].iSubjectKeyIDPresent ) );						
+						
+		EAP_TRACE_DATA_DEBUG_SYMBIAN( ( "SubjectKeyID:", aSettings.iCertificates[n].iSubjectKeyID.Ptr(), 
+													aSettings.iCertificates[n].iSubjectKeyID.Size() ) );
+						
+		EAP_TRACE_DEBUG_SYMBIAN((_L("SetConfigurationL - certificates - present=%d, Thumbprint=%S"),
+						aSettings.iCertificates[n].iThumbprintPresent, &(aSettings.iCertificates[n].iThumbprint) ) );
+	}						
+
+	EAP_TRACE_DEBUG_SYMBIAN((_L("SetConfigurationL - present=%d, EncapsulatedEAPTypes Count=%d"),
+						aSettings.iEncapsulatedEAPTypesPresent, aSettings.iEncapsulatedEAPTypes.Count()) );
+	for( TInt m=0; m < aSettings.iEncapsulatedEAPTypes.Count(); m++ )
+	{	
+		EAP_TRACE_DEBUG_SYMBIAN((_L("SetConfigurationL - EncapsulatedEAPTypes=%d"),
+						aSettings.iEncapsulatedEAPTypes[m]) );
+	}						
+
+	EAP_TRACE_DEBUG_SYMBIAN((_L("*************************** SetConfigurationL - Set the above values: ***************************\n")) );
+
+	// Check if the settings are for the correct type
+	if (aSettings.iEAPType != EAPSettings::EEapSim)
+	{
+		User::Leave(KErrNotSupported);
+	}
+	
+	HBufC* buf = HBufC::NewLC(KMaxSqlQueryLength);
+	TPtr sqlStatement = buf->Des();	
+
+	RDbView view;
+
+	_LIT(KSQLQuery, "SELECT * FROM %S WHERE %S=%d AND %S=%d AND %S=%d");
+	sqlStatement.Format(KSQLQuery, &KSimTableName, 
+		&KServiceType, aIndexType, &KServiceIndex, aIndex, &KTunnelingType, aTunnelingVendorType);
+	
+	// Evaluate view
+	User::LeaveIfError(view.Prepare(aDatabase, TDbQuery(sqlStatement)));
+	
+	CleanupClosePushL(view);
+	
+	User::LeaveIfError(view.EvaluateAll());	
+
+	view.FirstL();
+	
+	view.UpdateL();
+	
+	// Get column set so we get the correct column numbers
+	CDbColSet* colSet = view.ColSetL();
+	CleanupStack::PushL(colSet);
+
+	// Manual username
+	//if (aSettings.iUsernamePresent) // no need to check as there may be empty usernames with the present status is EFlase.
+	{
+		// Check if length of username is less than the max length.
+		if(aSettings.iUsername.Length() > KMaxManualUsernameLengthInDB)
+		{
+			// Username too long. Can not be stored in DB.
+			
+			EAP_TRACE_DEBUG_SYMBIAN((_L("EapSimDbUtils::SetConfigurationL: Too long Username. Length=%d \n"),
+			aSettings.iUsername.Length()));
+			
+			User::Leave(KErrArgument);
+		}
+		
+		// Length is ok. Set the value in DB. Value could be empty. It doesn't matter.
+		view.SetColL(colSet->ColNo(cf_str_EAP_GSMSIM_manual_username_literal), aSettings.iUsername);
+		
+		// This is to set the automatic or manual status.
+		TUint useManualUsernameStatus;
+		
+		if (aSettings.iUsernamePresent)
+		{
+			useManualUsernameStatus = EGSMSIMUseManualUsernameYes;
+		}
+		else
+		{
+			useManualUsernameStatus = EGSMSIMUseManualUsernameNo;
+		}
+		
+		// Set the value.
+		view.SetColL(colSet->ColNo(cf_str_EAP_GSMSIM_use_manual_username_literal), useManualUsernameStatus);
+	}
+		
+	// Manual realm
+	//if (aSettings.iRealmPresent)  // no need to check as there may be empty realms with the present status is EFlase.
+	{
+		// Check if length of realm is less than the max length.
+		if(aSettings.iRealm.Length() > KMaxManualRealmLengthInDB)
+		{
+			// Realm too long. Can not be stored in DB.
+
+			EAP_TRACE_DEBUG_SYMBIAN((_L("EapSimDbUtils::SetConfigurationL: Too long Realm. Length=%d \n"),
+			aSettings.iRealm.Length()));
+			
+			User::Leave(KErrArgument);
+		}
+
+		// Length is ok. Set the value in DB. Value could be empty. It doesn't matter.
+		view.SetColL(colSet->ColNo(cf_str_EAP_GSMSIM_manual_realm_literal), aSettings.iRealm);
+		
+		// This is to set the automatic or manual status.
+		TUint useManualRealmStatus;
+		
+		if (aSettings.iRealmPresent)
+		{
+			useManualRealmStatus = EGSMSIMUseManualRealmYes;
+		}
+		else
+		{
+			useManualRealmStatus = EGSMSIMUseManualRealmNo;
+		}
+		
+		// Set the value.
+		view.SetColL(colSet->ColNo(cf_str_EAP_GSMSIM_use_manual_realm_literal), useManualRealmStatus);	
+	}
+	
+	// UsePseudonym
+	if (aSettings.iUsePseudonymsPresent)
+	{
+		if (aSettings.iUsePseudonyms)
+		{
+			// Use pseudonym.
+			view.SetColL(colSet->ColNo(cf_str_EAP_GSMSIM_use_pseudonym_identity_literal), EGSMSIMUsePseudonymIdYes);
+		}
+		else
+		{			
+			// Don't use pseudonym.
+			view.SetColL(colSet->ColNo(cf_str_EAP_GSMSIM_use_pseudonym_identity_literal), EGSMSIMUsePseudonymIdNo);			
+		}
+	}
+	else
+	{
+		// Value is not configured. Value is read from config file if needed.
+		view.SetColL(colSet->ColNo(cf_str_EAP_GSMSIM_use_pseudonym_identity_literal), EGSMSIMUsePseudonymIdNotValid);		
+	}
+	
+	// Session validity time
+	if (aSettings.iSessionValidityTimePresent)
+	{
+		// User or device management wants to store the session validity time.
+		// Convert the time to micro seconds and save.
+		
+		TInt64 validityInMicro = (aSettings.iSessionValidityTime) *  KMicroSecsInAMinute;
+		
+		view.SetColL(colSet->ColNo(cf_str_EAP_GSMSIM_max_session_validity_time_literal), validityInMicro);
+	}
+	
+	if (aIndexType != EVpn) // This allows current VPN IF to use reauthentication. VPN does not zero last full authentication time.
+	{
+		// Last full authentication time should be made zero when EAP configurations are modified.
+		// This makes sure that the next authentication with this EAP would be full authentication
+		// instead of reauthentication even if the session is still valid.
+		
+		view.SetColL(colSet->ColNo(KGSMSIMLastFullAuthTime), default_FullAuthTime);
+
+		EAP_TRACE_DEBUG_SYMBIAN((_L("Session Validity: EAP-Type=%d, Resetting Full Auth Time since settings are modified\n"),
+									aSettings.iEAPType ));
+	}
+	
+	view.PutL();
+	CleanupStack::PopAndDestroy(3); // view, colset, buf
+}
+
+void EapSimDbUtils::GetConfigurationL(
+	RDbNamedDatabase& aDatabase,
+	EAPSettings& aSettings, 
+	const TIndexType aIndexType,
+	const TInt aIndex,
+	const eap_type_value_e aTunnelingType)
+{
+#ifdef USE_EAP_EXPANDED_TYPES
+
+	TUint aTunnelingVendorType = aTunnelingType.get_vendor_type();
+
+#else
+
+	TUint aTunnelingVendorType = static_cast<TUint>(aTunnelingType);
+
+#endif //#ifdef USE_EAP_EXPANDED_TYPES
+
+	HBufC* buf = HBufC::NewLC(KMaxSqlQueryLength);
+	TPtr sqlStatement = buf->Des();	
+
+	RDbView view;
+
+	// Form the query
+	_LIT(KSQLQuery, "SELECT * FROM %S WHERE %S=%d AND %S=%d AND %S=%d");
+	sqlStatement.Format(KSQLQuery, &KSimTableName, 
+		&KServiceType, aIndexType, &KServiceIndex, aIndex, &KTunnelingType, aTunnelingVendorType);
+	
+	// Evaluate view
+	User::LeaveIfError(view.Prepare(aDatabase, TDbQuery(sqlStatement)));
+	
+	CleanupClosePushL(view);
+	
+	User::LeaveIfError(view.EvaluateAll());	
+
+	// Get the first (and only) row
+	view.FirstL();
+	view.GetL();				
+	
+	// Get column set so we get the correct column numbers
+	CDbColSet* colSet = view.ColSetL();
+	CleanupStack::PushL(colSet);
+
+	aSettings.iEAPType = EAPSettings::EEapSim;
+	
+	// Username
+	TPtrC username = view.ColDes(colSet->ColNo(cf_str_EAP_GSMSIM_manual_username_literal));
+	aSettings.iUsername.Copy(username);
+	
+	// For manual or automatic status.
+	TUint useUsername = view.ColUint(colSet->ColNo(cf_str_EAP_GSMSIM_use_manual_username_literal));
+	if(useUsername == EGSMSIMUseManualUsernameNo)
+	{
+		aSettings.iUsernamePresent = EFalse;		
+	}
+	else
+	{
+		aSettings.iUsernamePresent = ETrue;		
+	}
+	
+	// Realm
+	TPtrC realm = view.ColDes(colSet->ColNo(cf_str_EAP_GSMSIM_manual_realm_literal));
+	aSettings.iRealm.Copy(realm);
+	
+	// For manual or automatic status.
+	TUint useRealm = view.ColUint(colSet->ColNo(cf_str_EAP_GSMSIM_use_manual_realm_literal));
+	if(useRealm == EGSMSIMUseManualRealmNo)
+	{
+		aSettings.iRealmPresent = EFalse;
+	}
+	else
+	{
+		aSettings.iRealmPresent = ETrue;
+	}
+	
+	TInt usePseudonym = view.ColUint(colSet->ColNo(cf_str_EAP_GSMSIM_use_pseudonym_identity_literal));
+	
+	if (usePseudonym == EGSMSIMUsePseudonymIdNotValid)
+	{
+		aSettings.iUsePseudonymsPresent = EFalse;
+	}
+	else
+	{
+		if (usePseudonym == EGSMSIMUsePseudonymIdNo)
+		{
+			aSettings.iUsePseudonyms = EFalse;
+		}
+		else
+		{
+			aSettings.iUsePseudonyms = ETrue;
+		}
+		
+		aSettings.iUsePseudonymsPresent = ETrue;		
+	}	
+	
+	// Session validity time	
+	TInt64 maxSessionTimeMicro = view.ColInt64(colSet->ColNo(cf_str_EAP_GSMSIM_max_session_validity_time_literal));
+	
+	// Convert the time to minutes.	
+	TInt64 maxSessionTimeMin = maxSessionTimeMicro / KMicroSecsInAMinute;
+	
+	aSettings.iSessionValidityTime = static_cast<TUint>(maxSessionTimeMin);
+	aSettings.iSessionValidityTimePresent = ETrue;
+	
+	CleanupStack::PopAndDestroy(3); // view, colset, buf
+}
+
+void EapSimDbUtils::CopySettingsL(
+	RDbNamedDatabase& aDatabase, 		
+	const TIndexType aSrcIndexType,
+	const TInt aSrcIndex,
+	const eap_type_value_e aSrcTunnelingType,
+	const TIndexType aDestIndexType,
+	const TInt aDestIndex,
+	const eap_type_value_e aDestTunnelingType)
+{
+#ifdef USE_EAP_EXPANDED_TYPES
+
+	TUint aSrcTunnelingVendorType = aSrcTunnelingType.get_vendor_type();
+	TUint aDestTunnelingVendorType = aDestTunnelingType.get_vendor_type();
+
+#else
+
+	TUint aSrcTunnelingVendorType = static_cast<TUint>(aSrcTunnelingType);
+	TUint aDestTunnelingVendorType = static_cast<TUint>(aDestTunnelingType);
+
+#endif //#ifdef USE_EAP_EXPANDED_TYPES
+
+	HBufC* buf = HBufC::NewLC(KMaxSqlQueryLength);
+	TPtr sqlStatement = buf->Des();
+
+	_LIT(KSQL, "SELECT * FROM %S WHERE %S=%d AND %S=%d AND %S=%d");
+
+	sqlStatement.Format(KSQL, &KSimTableName, 
+		&KServiceType, aSrcIndexType, &KServiceIndex, aSrcIndex, &KTunnelingType, aSrcTunnelingVendorType);
+	
+	RDbView view;
+	
+	User::LeaveIfError(view.Prepare(aDatabase, TDbQuery(sqlStatement), TDbWindow::EUnlimited));
+	
+	// View must be closed when no longer needed
+	CleanupClosePushL(view);
+	
+	User::LeaveIfError(view.EvaluateAll());
+			
+	TInt rows = view.CountL();
+	
+	if (rows == 0)
+	{
+		User::Leave(KErrNotFound);
+	}
+	
+	// Get the first (and only) row
+	view.FirstL();
+	
+	view.GetL();
+		
+	view.InsertCopyL();
+	
+	// Get column set so we get the correct column numbers
+	CDbColSet* colSet = view.ColSetL();
+	
+	CleanupStack::PushL(colSet);
+		
+	view.SetColL(colSet->ColNo(KServiceType), static_cast<TUint>(aDestIndexType));
+    
+    view.SetColL(colSet->ColNo(KServiceIndex), aDestIndex);
+    
+    view.SetColL(colSet->ColNo(KTunnelingType), aDestTunnelingVendorType);
+
+    view.PutL();
+    	
+	CleanupStack::PopAndDestroy(3); // view, colset, buf
+}
+
+void EapSimDbUtils::DeleteConfigurationL(	
+	const TIndexType aIndexType,
+	const TInt aIndex,
+	const eap_type_value_e aTunnelingType)
+{
+#ifdef USE_EAP_EXPANDED_TYPES
+
+	TUint aTunnelingVendorType = aTunnelingType.get_vendor_type();
+
+#else
+
+	TUint aTunnelingVendorType = static_cast<TUint>(aTunnelingType);
+
+#endif //#ifdef USE_EAP_EXPANDED_TYPES
+
+	RDbs session;
+	RDbNamedDatabase database;
+	// Connect to the DBMS server.
+	User::LeaveIfError(session.Connect());
+	CleanupClosePushL(session);	
+		
+#ifdef SYMBIAN_SECURE_DBMS
+	
+	// Create the secure shared database with the specified secure policy.
+	// Database will be created in the data caging path for DBMS (C:\private\100012a5).
+	
+	TInt err = database.Create(session, KDatabaseName, KSecureUIDFormat);
+	
+	if(err == KErrNone)
+	{
+		// Database was created so it was empty. No need for further actions.
+		database.Destroy();
+		CleanupStack::PopAndDestroy();
+		return;
+		
+	} 
+	else if (err != KErrAlreadyExists) 
+	{
+		User::LeaveIfError(err);
+	}
+	
+	// Database existed, open it.
+	User::LeaveIfError(database.Open(session, KDatabaseName, KSecureUIDFormat));
+	CleanupClosePushL(database);
+		
+#else
+	// For non-secured database. The database will be created in the old location (c:\system\data).
+	
+	RFs fsSession;		
+	User::LeaveIfError(fsSession.Connect());
+	CleanupClosePushL(fsSession);	
+	TInt err = database.Create(fsSession, KDatabaseName);
+
+	if(err == KErrNone)
+	{
+		// Database was created so it was empty. No need for further actions.
+		database.Destroy();
+		CleanupStack::PopAndDestroy(2); // fsSession, database session
+		return;
+		
+	} 
+	else if (err != KErrAlreadyExists) 
+	{
+		User::LeaveIfError(err);
+	}
+	
+	CleanupStack::PopAndDestroy(); // close fsSession
+	
+	User::LeaveIfError(database.Open(session, KDatabaseName));
+	CleanupClosePushL(database);		
+	    
+#endif // #ifdef SYMBIAN_SECURE_DBMS
+
+	HBufC* buf = HBufC::NewLC(KMaxSqlQueryLength);
+	TPtr sqlStatement = buf->Des();
+
+	// Main settings table
+	_LIT(KSQL, "SELECT * FROM %S WHERE %S=%d AND %S=%d AND %S=%d");
+	sqlStatement.Format(KSQL, &KSimTableName, 
+		&KServiceType, aIndexType, &KServiceIndex, aIndex, &KTunnelingType, aTunnelingVendorType);
+	// Evaluate view
+	RDbView view;
+	User::LeaveIfError(view.Prepare(database,TDbQuery(sqlStatement), TDbWindow::EUnlimited));
+	CleanupClosePushL(view);
+	User::LeaveIfError(view.EvaluateAll());
+
+	// Delete rows
+	if (view.FirstL())
+	{		
+		do {
+			view.DeleteL();
+		} while (view.NextL() != EFalse);
+	}
+
+	// Close database
+	CleanupStack::PopAndDestroy(4); // view, buf, database, session
+}
+
+// End of file