eapol/eapol_framework/eapol_symbian/eap_server/src/eap_am_general_settings_symbian.cpp
branchRCL_3
changeset 45 bad0cc58d154
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eapol/eapol_framework/eapol_symbian/eap_server/src/eap_am_general_settings_symbian.cpp	Tue Aug 31 15:16:37 2010 +0300
@@ -0,0 +1,2660 @@
+/*
+* Copyright (c) 2009-2010 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 general settings configuration.
+*
+*/
+
+/*
+* %version: 60 %
+*/
+
+#include "eap_tools.h"
+#include "eap_status.h"
+#include "eap_am_export.h"
+#include "eap_expanded_type.h"
+#include "eap_array.h"
+#include "eap_database_reference_if.h"
+#include "eap_am_general_settings_symbian.h"
+#include "abs_eap_am_general_settings.h"
+#include "eap_automatic_variable.h"
+#include "EapTraceSymbian.h"
+#include "EapConversion.h"
+#include "EapTlsPeapCertFetcher.h"
+#include "EapPluginTools.h"
+#include <EapTypePlugin.h>
+#include "EapAutomatic.h"
+
+/** @file */
+
+// ----------------------------------------------------------------------
+
+EAP_LITERAL_SYMBIAN(KGeneralsettingsDatabaseName, "eap_methods.dat");
+
+EAP_LITERAL_SYMBIAN(KGeneralSettingsTableName, "eap_general_settings");
+
+_LIT(KEapMethodEnabledValue, "enabled");
+_LIT(KEapMethodDisabledValue, "disabled");
+
+_LIT(KServiceType, "service_type");
+_LIT(KServiceIndex, "service_index");
+
+_LIT(KSQL, "SELECT %S, %S, %S, %S FROM %S WHERE %S=%d AND %S=%d");
+
+const TUint KMaxSqlQueryLength = 512;
+const TInt	KDefaultColumnInView_One = 4; // For DB view.
+
+// ----------------------------------------------------------------------
+
+eap_am_general_settings_symbian_c::eap_am_general_settings_symbian_c(
+	abs_eap_am_tools_c * const tools,
+	abs_eap_am_general_settings_c * const partner)
+	: m_am_tools(tools)
+	, m_partner(partner)
+	, m_is_valid(false)
+	, m_shutdown_was_called(false)
+	, iGeneralSettingsDbCreated(EFalse)
+	, iGeneralSettingsSessionOpened(EFalse)
+	, iCertificateFetcher(0)
+	, m_completion_status(eap_status_process_general_error)
+	, m_EAPType(eap_type_none)
+	, m_IndexType(0ul)
+	, m_Index(0ul)
+{
+	if (m_am_tools == 0
+		|| m_am_tools->get_is_valid() == false
+		|| m_partner == 0)
+	{
+		return;
+	}
+
+	m_is_valid = true;
+
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::eap_am_general_settings_symbian_c(): this=0x%08x.\n"),
+		this));
+}
+
+// ----------------------------------------------------------------------
+
+eap_am_general_settings_symbian_c::eap_am_general_settings_symbian_c(
+	abs_eap_am_tools_c * const tools)
+	: m_am_tools(tools)
+	, m_partner(0)
+	, m_is_valid(false)
+	, m_shutdown_was_called(false)
+	, iGeneralSettingsDbCreated(EFalse)
+	, iGeneralSettingsSessionOpened(EFalse)
+	, iCertificateFetcher(0)
+	, m_completion_status(eap_status_process_general_error)
+	, m_EAPType(eap_type_none)
+	, m_IndexType(0ul)
+	, m_Index(0ul)
+{
+	if (m_am_tools == 0
+		|| m_am_tools->get_is_valid() == false)
+	{
+		return;
+	}
+
+	m_is_valid = true;
+
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::eap_am_general_settings_symbian_c(): this=0x%08x.\n"),
+		this));
+}
+
+// ----------------------------------------------------------------------
+
+eap_am_general_settings_symbian_c::~eap_am_general_settings_symbian_c()
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::~eap_am_general_settings_symbian_c(): this=0x%08x.\n"),
+		this));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: eap_am_general_settings_symbian_c::~eap_am_general_settings_symbian_c()");
+
+	EAP_UNREFERENCED_PARAMETER(KGeneralsettingsDatabaseName_8bit);
+
+	EAP_UNREFERENCED_PARAMETER(KGeneralSettingsTableName_8bit);
+
+	CloseGeneralSettings();
+
+	delete iCertificateFetcher;
+	iCertificateFetcher = 0;
+
+	EAP_ASSERT(m_shutdown_was_called == true);
+}
+
+// ----------------------------------------------------------------------
+
+bool eap_am_general_settings_symbian_c::get_is_valid()
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::get_is_valid(): this=0x%08x, m_is_valid=%d.\n"),
+		this,
+		m_is_valid));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: eap_am_general_settings_symbian_c::get_is_valid()");
+
+	return m_is_valid;
+}
+
+// ----------------------------------------------------------------------
+
+// This is documented in abs_eap_stack_interface_c::configure().
+eap_status_e eap_am_general_settings_symbian_c::configure()
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::configure(): this=0x%08x.\n"),
+		this));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: eap_am_general_settings_symbian_c::configure()");
+
+	return EAP_STATUS_RETURN(m_am_tools, eap_status_ok);
+}
+
+// ----------------------------------------------------------------------
+
+// This is documented in abs_eap_stack_interface_c::shutdown().
+eap_status_e eap_am_general_settings_symbian_c::shutdown()
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::shutdown(): this=0x%08x.\n"),
+		this));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: eap_am_general_settings_symbian_c::shutdown()");
+
+	m_shutdown_was_called = true;
+
+	return EAP_STATUS_RETURN(m_am_tools, eap_status_ok);
+}
+
+// ----------------------------------------------------------------------
+
+void eap_am_general_settings_symbian_c::CloseGeneralSettings()
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::CloseGeneralSettings(): this=0x%08x.\n"),
+		this));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: eap_am_general_settings_symbian_c::CloseGeneralSettings()");
+
+	iGeneralSettingsDb.Close();
+	iGeneralSettingsDbCreated = EFalse;
+
+	iGeneralSettingsFileServerSession.Close();
+	iGeneralSettingsSessionOpened = EFalse;
+}
+
+// ----------------------------------------------------------------------
+
+void eap_am_general_settings_symbian_c::OpenGeneralSettingsL()
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::OpenGeneralSettingsL(): this=0x%08x.\n"),
+		this));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: eap_am_general_settings_symbian_c::OpenGeneralSettingsL()");
+
+	if(iGeneralSettingsDbCreated == EFalse
+		|| iGeneralSettingsSessionOpened == EFalse)
+	{
+		// The general settings store DB and tables are not created. So create it.
+		CreateGeneralSettingsL();
+	}
+}
+
+// ----------------------------------------------------------------------
+
+void eap_am_general_settings_symbian_c::CreateGeneralSettingsL()
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::CreateGeneralSettingsL(): this=0x%08x.\n"),
+		this));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: eap_am_general_settings_symbian_c::CreateGeneralSettingsL()");
+
+	// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+	// 1. Open/create a database
+
+	TInt error(KErrNone);
+
+	// Connect to the DBMS server, if not connected already.
+	if(iGeneralSettingsSessionOpened == EFalse)
+	{
+		error = iGeneralSettingsFileServerSession.Connect();
+		(void)EAP_STATUS_RETURN(m_am_tools, m_am_tools->convert_am_error_to_eapol_error(error));
+		User::LeaveIfError(error);
+
+		iGeneralSettingsSessionOpened = ETrue;
+	}
+
+	TFileName aPrivateDatabasePathName;
+
+	EapPluginTools::CreateDatabaseLC(
+		iGeneralSettingsDb,
+		iGeneralSettingsFileServerSession,
+		error,
+		KGeneralsettingsDatabaseName,
+		aPrivateDatabasePathName);
+
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::CreateGeneralSettingsL() - Created Secure DB for %S. error=%d (-11=DB already exist)\n"),
+		&KGeneralsettingsDatabaseName_8bit,
+		error) );
+
+	if(error == KErrNone)
+	{
+		// Database is closed if it was created in EapPluginTools::CreateDatabaseLC().
+		// If database exists it was not opened in EapPluginTools::CreateDatabaseLC().
+		iGeneralSettingsDb.Close();
+	}
+	else if (error != KErrAlreadyExists)
+	{
+		(void)EAP_STATUS_RETURN(m_am_tools, m_am_tools->convert_am_error_to_eapol_error(error));
+		User::LeaveIfError(error);
+	}
+
+	error = iGeneralSettingsDb.Open(iGeneralSettingsFileServerSession, aPrivateDatabasePathName);
+
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::CreateGeneralSettingsL() - Open Secure DB for %S. error=%d (-11=DB already exist)\n"),
+		&KGeneralsettingsDatabaseName_8bit,
+		error) );
+
+	User::LeaveIfError(error);
+
+	// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+	// 2. Create the tables to database (ignore error if tables exist)
+
+	HBufC* buf = HBufC::NewLC(KMaxSqlQueryLength);
+	TPtr sqlStatement = buf->Des();
+
+	// Create table for enabled and disabled EAP-types.
+
+	//// NAME //////////////////// TYPE ///////////// Constant ////////////////////
+	//| ServiceType				| UNSIGNED INTEGER | KServiceType				|//
+	//| ServiceIndex			| UNSIGNED INTEGER | KServiceIndex				|//
+	//| Enabled EAP-methods		| LONG VARBINARY   | KEapMethodEnabledValue		|//
+	//| Disabled EAP-methods	| LONG VARBINARY   | KEapMethodDisabledValue	|//
+	///////////////////////////////////////////////////////////////////////////////
+
+	_LIT(KSQLCreateTable2, "CREATE TABLE %S (%S UNSIGNED INTEGER, \
+		%S UNSIGNED INTEGER, \
+		%S LONG VARBINARY, \
+		%S LONG VARBINARY)");
+
+	sqlStatement.Format(
+		KSQLCreateTable2,
+		&KGeneralSettingsTableName,
+		&KServiceType,
+		&KServiceIndex,
+		&KEapMethodEnabledValue,
+		&KEapMethodDisabledValue);
+
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::CreateGeneralSettingsL() - SQL query formated OK\n")));
+
+	error = iGeneralSettingsDb.Execute(sqlStatement);
+	if (error != KErrNone
+		&& error != KErrAlreadyExists)
+	{
+		(void)EAP_STATUS_RETURN(m_am_tools, m_am_tools->convert_am_error_to_eapol_error(error));
+		User::Leave(error);
+	}
+
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::CreateGeneralSettingsL() Created Groups table\n")));
+
+	// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
+	CleanupStack::PopAndDestroy( buf );
+	CleanupStack::Pop(&iGeneralSettingsDb);
+	CleanupStack::Pop(&iGeneralSettingsFileServerSession);
+
+	iGeneralSettingsDbCreated = ETrue;
+
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::CreateGeneralSettingsL(): End \n")));	
+
+} // eap_am_general_settings_symbian_c::CreateGeneralSettingsL()
+
+// ----------------------------------------------------------------------
+
+void eap_am_general_settings_symbian_c::GetGeneralSettingsLongBinaryL(
+	RDbView &aViev,
+	const TDesC &aColName,
+	HBufC8** const aMethods)
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::GetGeneralSettingsLongBinaryL(): this=0x%08x.\n"),
+		this));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: eap_am_general_settings_symbian_c::GetGeneralSettingsLongBinaryL()");
+
+	// Get column set so we get the correct column numbers
+	CDbColSet* colSet = aViev.ColSetL();
+	CleanupStack::PushL(colSet);
+
+	TDbColNo colNoReference = 0;
+	colNoReference = colSet->ColNo(aColName);
+
+	switch (aViev.ColType(colNoReference))
+	{
+		case EDbColLongBinary:
+		{
+			EAP_TRACE_DATA_DEBUG(
+				m_am_tools,
+				TRACE_FLAGS_DEFAULT,
+				(EAPL("eap_am_general_settings_symbian_c::GetGeneralSettingsLongBinaryL() - Long Binary column"),
+				aColName.Ptr(),
+				aColName.Size()));
+
+			// A stream is needed for LONG columns in DB.
+			RDbColReadStream readStream;
+
+			// Get the value from DB.
+			HBufC8* valueBuf = HBufC8::NewLC(aViev.ColLength(colNoReference)); // Buffer for the data.
+			TPtr8 value8 = valueBuf->Des();
+
+			readStream.OpenLC(aViev, colNoReference);
+			readStream.ReadL(value8, aViev.ColLength(colNoReference));
+			readStream.Close();
+			CleanupStack::PopAndDestroy(&readStream);
+
+			EAP_TRACE_DATA_DEBUG(
+				m_am_tools,
+				TRACE_FLAGS_DEFAULT,
+				(EAPL("eap_am_general_settings_symbian_c::GetGeneralSettingsLongBinaryL(): LONG BINARY value from DB"),
+				value8.Ptr(), 
+				value8.Size()));
+
+			*aMethods = HBufC8::New(value8.Size());
+
+			// This to avoid the use of clean up stack for output parameter.
+			if ((*aMethods) != 0)
+			{
+				TPtr8 aDbBinaryColumnValuePtr = (*aMethods)->Des();			
+
+				aDbBinaryColumnValuePtr.Copy(value8);
+
+				EAP_TRACE_DATA_DEBUG(
+					m_am_tools,
+					TRACE_FLAGS_DEFAULT,
+					(EAPL("eap_am_general_settings_symbian_c::GetGeneralSettingsLongBinaryL(): LONG BINARY value to caller"),
+					aDbBinaryColumnValuePtr.Ptr(), 
+					aDbBinaryColumnValuePtr.Size()));
+			}
+			else
+			{
+				User::Leave(KErrNoMemory);
+			}
+
+			CleanupStack::PopAndDestroy(valueBuf);
+
+			break;
+		}
+		default:
+			EAP_TRACE_ERROR(
+				m_am_tools,
+				TRACE_FLAGS_ERROR,
+				(EAPL("ERROR: eap_am_general_settings_symbian_c::GetGeneralSettingsLongBinaryL(): Unsupported DB field:%d = %S\n"),
+				aViev.ColType(colNoReference),
+				&aColName));	
+
+			User::Leave(KErrNotSupported);
+			break;
+	} // End: switch ()
+
+	CleanupStack::PopAndDestroy(colSet);
+}
+
+// ----------------------------------------------------------------------
+
+void eap_am_general_settings_symbian_c::GetGeneralSettingsDataL(
+	const TUint indexType,
+	const TUint index,
+	HBufC8** const aEnabledEapMethods,
+	HBufC8** const aDisabledEapMethods)
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::GetGeneralSettingsDataL(): iGeneralSettingsSessionOpened=%d, iGeneralSettingsDbCreated=%d"),
+		iGeneralSettingsSessionOpened,
+		iGeneralSettingsDbCreated));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: eap_am_general_settings_symbian_c::GetGeneralSettingsDataL()");
+
+	*aEnabledEapMethods = 0;
+	*aDisabledEapMethods = 0;
+
+	if(iGeneralSettingsSessionOpened == EFalse)
+	{
+		EAP_TRACE_ERROR(
+			m_am_tools,
+			TRACE_FLAGS_ERROR,
+			(EAPL("eap_am_general_settings_symbian_c::GetGeneralSettingsDataL(): ERROR: General settings session not opened!")));
+
+		User::Leave(KErrSessionClosed);
+	}	
+
+	HBufC* buf = HBufC::NewLC(KMaxSqlQueryLength);
+	TPtr sqlStatement = buf->Des();
+
+	sqlStatement.Format(
+		KSQL,
+		&KServiceType,
+		&KServiceIndex,
+		&KEapMethodEnabledValue,
+		&KEapMethodDisabledValue,
+		&KGeneralSettingsTableName,
+		&KServiceType,
+		indexType,
+		&KServiceIndex,
+		index);
+
+
+	RDbView view;
+
+	User::LeaveIfError(view.Prepare(
+		iGeneralSettingsDb, 
+		TDbQuery(sqlStatement), 
+		TDbWindow::EUnlimited,
+		RDbView::EReadOnly));
+
+	CleanupClosePushL(view);
+
+	User::LeaveIfError(view.EvaluateAll());
+
+	if (view.IsEmptyL())
+	{				
+		EAP_TRACE_DEBUG(
+			m_am_tools,
+			TRACE_FLAGS_DEFAULT,
+			(EAPL("eap_am_general_settings_symbian_c::GetGeneralSettingsDataL(): No entries in this table (%S) RETURN EMPTY VALUE"),
+			&KGeneralSettingsTableName_8bit));
+
+		EAP_TRACE_DATA_DEBUG(
+			m_am_tools,
+			TRACE_FLAGS_DEFAULT,
+			(EAPL("eap_am_general_settings_symbian_c::GetGeneralSettingsDataL():sqlStatement"),
+			sqlStatement.Ptr(), 
+			sqlStatement.Size()));
+
+		CleanupStack::PopAndDestroy(&view);
+
+		CleanupStack::PopAndDestroy(buf);	
+
+		return;
+	}
+	else
+	{
+		EAP_TRACE_DEBUG(
+			m_am_tools,
+			TRACE_FLAGS_DEFAULT,
+			(EAPL("eap_am_general_settings_symbian_c::GetGeneralSettingsDataL(): Number of entries in table %S=%d"),
+			&KGeneralSettingsTableName_8bit, view.CountL()));
+	}
+
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::GetGeneralSettingsDataL() - view evaluated OK\n")));
+
+
+	if (view.FirstL())
+	{
+		EAP_TRACE_DEBUG(
+			m_am_tools,
+			TRACE_FLAGS_DEFAULT,
+			(EAPL("eap_am_general_settings_symbian_c::GetGeneralSettingsDataL() - First OK\n")));
+
+		view.GetL();
+
+		EAP_TRACE_DEBUG(
+			m_am_tools,
+			TRACE_FLAGS_DEFAULT,
+			(EAPL("eap_am_general_settings_symbian_c::GetGeneralSettingsDataL() - First Got\n")));
+
+		GetGeneralSettingsLongBinaryL(view, KEapMethodEnabledValue, aEnabledEapMethods);
+
+		GetGeneralSettingsLongBinaryL(view, KEapMethodDisabledValue, aDisabledEapMethods);
+	}
+
+	CleanupStack::PopAndDestroy( &view );
+
+	CleanupStack::PopAndDestroy(buf); // We don't need buf or sqlStatement any more.
+
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::GetGeneralSettingsDataL(): End")));	
+}
+
+// ----------------------------------------------------------------------
+
+void eap_am_general_settings_symbian_c::SetGeneralSettingsLongBinaryL(
+	RDbView &aViev,
+	const TDesC &aColName,
+	const TDesC8& aMethods)
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::SetGeneralSettingsLongBinaryL(): iGeneralSettingsSessionOpened=%d, iGeneralSettingsDbCreated=%d"),
+		iGeneralSettingsSessionOpened,
+		iGeneralSettingsDbCreated));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: eap_am_general_settings_symbian_c::SetGeneralSettingsLongBinaryL()");
+
+	// Get column set so we get the correct column numbers
+	CDbColSet* colSet = aViev.ColSetL();
+	CleanupStack::PushL(colSet);
+
+	TDbColNo colNoReference = 0;
+	colNoReference = colSet->ColNo(aColName);
+
+	switch (aViev.ColType(colNoReference))
+	{
+		case EDbColLongBinary:
+		{
+			EAP_TRACE_DATA_DEBUG(
+				m_am_tools,
+				TRACE_FLAGS_DEFAULT,
+				(EAPL("eap_am_general_settings_symbian_c::SetGeneralSettingsLongBinaryL() - Long Binary column"),
+				aColName.Ptr(), 
+				aColName.Size()));
+
+			// A stream is needed for LONG columns in DB.
+			RDbColWriteStream writeStream;					
+			writeStream.OpenLC( aViev, colNoReference );
+			writeStream.WriteL( aMethods );
+			writeStream.Close();
+			CleanupStack::PopAndDestroy( &writeStream );
+			break;
+		}
+		default:
+			EAP_TRACE_ERROR(
+				m_am_tools,
+				TRACE_FLAGS_ERROR,
+				(EAPL("eap_am_general_settings_symbian_c::SetGeneralSettingsLongBinaryL(): ERROR: Unsupported DB field:%d = %S\n"),
+				aViev.ColType(colNoReference),
+				&aColName));	
+
+			User::Leave(KErrNotSupported);
+			break;
+
+	} // End: switch (aViev.ColType(colNoReference))
+
+	CleanupStack::PopAndDestroy(colSet);
+}
+
+//-------------------------------------------------------------
+
+void eap_am_general_settings_symbian_c::SetGeneralSettingsDataL(
+	const TUint indexType,
+	const TUint index,
+	const TDesC8& aEnabledEapMethods,
+	const TDesC8& aDisabledEapMethods)
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::SetGeneralSettingsDataL(): iGeneralSettingsSessionOpened=%d, iGeneralSettingsDbCreated=%d"),
+		iGeneralSettingsSessionOpened, iGeneralSettingsDbCreated));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: eap_am_general_settings_symbian_c::SetGeneralSettingsDataL()");
+
+	EAP_TRACE_DATA_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::SetGeneralSettingsDataL(): Set this value in general settings DB"),
+		aEnabledEapMethods.Ptr(),
+		aEnabledEapMethods.Size()));
+
+	if(iGeneralSettingsSessionOpened == EFalse)
+	{
+		EAP_TRACE_ERROR(
+			m_am_tools,
+			TRACE_FLAGS_ERROR,
+			(EAPL("eap_am_general_settings_symbian_c::SetGeneralSettingsDataL(): ERROR: General settings session not opened!")));
+
+		User::Leave(KErrSessionClosed);
+	}	
+
+	HBufC* buf = HBufC::NewLC(KMaxSqlQueryLength);
+	TPtr sqlStatement = buf->Des();
+
+	sqlStatement.Format(
+		KSQL,
+		&KServiceType,
+		&KServiceIndex,
+		&KEapMethodEnabledValue,
+		&KEapMethodDisabledValue,
+		&KGeneralSettingsTableName,
+		&KServiceType,
+		indexType,
+		&KServiceIndex,
+		index);
+
+	EAP_TRACE_DATA_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::SetGeneralSettingsDataL():sqlStatement"),
+		sqlStatement.Ptr(), 
+		sqlStatement.Size()));
+
+	RDbView view;
+
+	User::LeaveIfError(view.Prepare(
+		iGeneralSettingsDb, 
+		TDbQuery(sqlStatement), 
+		TDbWindow::EUnlimited,
+		RDbView::EUpdatable));
+
+	CleanupClosePushL(view);
+
+	User::LeaveIfError(view.EvaluateAll());
+
+	{	
+		if(view.ColCount() != KDefaultColumnInView_One)
+		{
+			EAP_TRACE_ERROR(
+				m_am_tools,
+				TRACE_FLAGS_ERROR,
+				(EAPL("eap_am_general_settings_symbian_c::SetGeneralSettingsDataL(): ERROR: Problem with rows or columns in DB view, view.IsEmptyL()=%d, row count=%d, col count=%d \n"),
+				view.IsEmptyL(),
+				view.CountL(),
+				view.ColCount()));	
+
+			User::Leave(KErrNotFound);				
+		}	
+
+		if (view.FirstL())
+		{
+			view.UpdateL(); // Here it is update.
+		}
+		else
+		{
+			view.InsertL(); // Here it is insert.
+		}
+
+		{
+			CDbColSet* colSet = view.ColSetL();
+			CleanupStack::PushL(colSet);		
+
+			TDbColNo colNoServiceType = 0;
+			TDbColNo colNoServiceIndex = 0;
+
+			colNoServiceType = colSet->ColNo(KServiceType);
+			colNoServiceIndex = colSet->ColNo(KServiceIndex);		
+			
+			CleanupStack::PopAndDestroy(colSet); // delete colSet.
+
+			view.SetColL(colNoServiceType, indexType);
+			view.SetColL(colNoServiceIndex, index);
+
+			SetGeneralSettingsLongBinaryL(view,	KEapMethodEnabledValue, aEnabledEapMethods);
+
+			SetGeneralSettingsLongBinaryL(view,	KEapMethodDisabledValue, aDisabledEapMethods);
+		}
+	}
+
+	// Now it should go to the DB.
+	view.PutL();	
+
+	CleanupStack::PopAndDestroy( &view );
+
+	CleanupStack::PopAndDestroy(buf);
+}
+
+//-------------------------------------------------------------
+
+void eap_am_general_settings_symbian_c::DeleteGeneralSettingsDataL(
+	const TUint indexType,
+	const TUint index)
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::DeleteGeneralSettingsDataL(): iGeneralSettingsSessionOpened=%d, iGeneralSettingsDbCreated=%d"),
+		iGeneralSettingsSessionOpened, iGeneralSettingsDbCreated));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: eap_am_general_settings_symbian_c::DeleteGeneralSettingsDataL()");
+
+	if(iGeneralSettingsSessionOpened == EFalse)
+	{
+		EAP_TRACE_ERROR(
+			m_am_tools,
+			TRACE_FLAGS_ERROR,
+			(EAPL("eap_am_general_settings_symbian_c::DeleteGeneralSettingsDataL(): ERROR: General settings session not opened!")));
+
+		User::Leave(KErrSessionClosed);
+	}	
+
+	HBufC* buf = HBufC::NewLC(KMaxSqlQueryLength);
+	TPtr sqlStatement = buf->Des();
+
+	sqlStatement.Format(
+		KSQL,
+		&KServiceType,
+		&KServiceIndex,
+		&KEapMethodEnabledValue,
+		&KEapMethodDisabledValue,
+		&KGeneralSettingsTableName,
+		&KServiceType,
+		indexType,
+		&KServiceIndex,
+		index);
+
+	EAP_TRACE_DATA_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::DeleteGeneralSettingsDataL():sqlStatement"),
+		sqlStatement.Ptr(), 
+		sqlStatement.Size()));
+
+	RDbView view;
+
+	User::LeaveIfError(view.Prepare(
+		iGeneralSettingsDb, 
+		TDbQuery(sqlStatement), 
+		TDbWindow::EUnlimited,
+		RDbView::EUpdatable));
+
+	CleanupClosePushL(view);
+
+	User::LeaveIfError(view.EvaluateAll());
+
+	{	
+		// Delete old row and also rows that are for same IAP.
+		if (view.FirstL())
+		{
+			CDbColSet* colSet = view.ColSetL();
+			CleanupStack::PushL(colSet);
+
+			do {
+				view.GetL();
+
+				if (view.ColUint32(colSet->ColNo(KServiceType)) == static_cast<TUint>(indexType)
+						&& view.ColUint32(colSet->ColNo(KServiceIndex)) == static_cast<TUint>(index))
+				{
+					view.DeleteL();
+				}
+				
+			} while (view.NextL() != EFalse);
+
+			CleanupStack::PopAndDestroy(colSet); // delete colSet.
+		}
+	}
+
+	CleanupStack::PopAndDestroy( &view );
+
+	CleanupStack::PopAndDestroy(buf);
+}
+
+// ----------------------------------------------------------------------
+
+void eap_am_general_settings_symbian_c::CopyGeneralSettingsDataL(
+	const TUint aSourceIndexType,
+	const TUint aSourceIndex,
+	const TUint aDestinationIndexType,
+	const TUint aDestinationIndex)
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::CopyGeneralSettingsDataL(): iGeneralSettingsSessionOpened=%d, iGeneralSettingsDbCreated=%d"),
+		iGeneralSettingsSessionOpened, iGeneralSettingsDbCreated));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: eap_am_general_settings_symbian_c::CopyGeneralSettingsDataL()");
+
+	if(iGeneralSettingsSessionOpened == EFalse)
+	{
+		EAP_TRACE_ERROR(
+			m_am_tools,
+			TRACE_FLAGS_ERROR,
+			(EAPL("eap_am_general_settings_symbian_c::CopyGeneralSettingsDataL(): ERROR: General settings session not opened!")));
+
+		User::Leave(KErrSessionClosed);
+	}
+
+	if (aSourceIndexType == aDestinationIndexType
+		&& aSourceIndex == aDestinationIndex)
+	{
+		EAP_TRACE_ERROR(
+			m_am_tools,
+			TRACE_FLAGS_ERROR,
+			(EAPL("eap_am_general_settings_symbian_c::CopyGeneralSettingsDataL(): ERROR: aSourceIndexType == aDestinationIndexType && aSourceIndex == aDestinationIndex")));
+
+		User::Leave(KErrArgument);
+	}
+
+	HBufC* buf = HBufC::NewLC(KMaxSqlQueryLength);
+	TPtr sqlStatement = buf->Des();
+
+	sqlStatement.Format(
+		KSQL,
+		&KServiceType,
+		&KServiceIndex,
+		&KEapMethodEnabledValue,
+		&KEapMethodDisabledValue,
+		&KGeneralSettingsTableName,
+		&KServiceType,
+		aDestinationIndexType,
+		&KServiceIndex,
+		aDestinationIndex);
+
+	EAP_TRACE_DATA_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::CopyGeneralSettingsDataL():sqlStatement"),
+		sqlStatement.Ptr(), 
+		sqlStatement.Size()));
+
+	RDbView view;
+
+	User::LeaveIfError(view.Prepare(
+		iGeneralSettingsDb, 
+		TDbQuery(sqlStatement), 
+		TDbWindow::EUnlimited,
+		RDbView::EUpdatable));
+
+	CleanupClosePushL(view);
+
+	User::LeaveIfError(view.EvaluateAll());
+
+	{	
+		// Delete destination old data.
+		if (view.FirstL())
+		{
+			CDbColSet* colSet = view.ColSetL();
+			CleanupStack::PushL(colSet);
+
+  			do 
+  			{
+	  			view.GetL();
+
+				if (view.ColUint(colSet->ColNo(KServiceType)) == static_cast<TUint>(aDestinationIndexType)
+					&& view.ColUint(colSet->ColNo(KServiceIndex)) == static_cast<TUint>(aDestinationIndex))
+				{  		
+      				EAP_TRACE_DEBUG_SYMBIAN((_L("eap_am_general_settings_symbian_c::CopyGeneralSettingsDataL(): Delete old records\n") ) );
+      				view.DeleteL();
+   				}
+			}
+			while (view.NextL() != EFalse);
+
+			view.Close();
+
+			CleanupStack::PopAndDestroy(colSet); // delete colSet.
+		}
+
+		sqlStatement.Format(
+			KSQL,
+			&KServiceType,
+			&KServiceIndex,
+			&KEapMethodEnabledValue,
+			&KEapMethodDisabledValue,
+			&KGeneralSettingsTableName,
+			&KServiceType,
+			aSourceIndexType,
+			&KServiceIndex,
+			aSourceIndex);
+
+		EAP_TRACE_DATA_DEBUG(
+			m_am_tools,
+			TRACE_FLAGS_DEFAULT,
+			(EAPL("eap_am_general_settings_symbian_c::CopyGeneralSettingsDataL():sqlStatement"),
+			sqlStatement.Ptr(), 
+			sqlStatement.Size()));
+
+		User::LeaveIfError(view.Prepare(
+			iGeneralSettingsDb, 
+			TDbQuery(sqlStatement), 
+			TDbWindow::EUnlimited,
+			RDbView::EUpdatable));
+
+		User::LeaveIfError(view.EvaluateAll());
+
+		// Copy source row to destination.
+		if (view.FirstL())
+		{
+			CDbColSet* colSet = view.ColSetL();
+			CleanupStack::PushL(colSet);
+			TDbBookmark bookmark;
+
+			do
+			{
+				view.GetL();
+
+				if (view.ColUint32(colSet->ColNo(KServiceType)) == static_cast<TUint>(aSourceIndexType)
+						&& view.ColUint32(colSet->ColNo(KServiceIndex)) == static_cast<TUint>(aSourceIndex))
+				{	
+					bookmark = view.Bookmark();
+					
+					view.InsertCopyL();
+					
+					view.SetColL(colSet->ColNo(KServiceType), static_cast<TUint>(aDestinationIndexType));
+	    			view.SetColL(colSet->ColNo(KServiceIndex), static_cast<TUint>(aDestinationIndex));
+					
+					view.PutL();
+				
+					view.GotoL(bookmark);
+				}
+				
+			}
+			while (view.NextL() != EFalse);
+
+			CleanupStack::PopAndDestroy(colSet); // delete colSet.
+		}
+	}
+
+	CleanupStack::PopAndDestroy( &view );
+
+	CleanupStack::PopAndDestroy(buf);
+}
+
+// ----------------------------------------------------------------------
+
+eap_status_e eap_am_general_settings_symbian_c::error_complete(
+	const eap_status_e completion_status,
+	const eap_method_settings_c * const internal_settings,
+	const eap_tlv_message_type_function_e error_completion_function)
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::error_complete(): this=0x%08x.\n"),
+		this));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: eap_am_general_settings_symbian_c::error_complete()");
+
+	CloseGeneralSettings();
+
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::error_complete(): this=0x%08x, CloseGeneralSettings()\n"),
+		this));
+
+	if (internal_settings == 0)
+	{
+		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+		return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error);
+	}
+
+	eap_method_settings_c * const complete_settings = new eap_method_settings_c(m_am_tools, internal_settings);
+
+	eap_automatic_variable_c<eap_method_settings_c> automatic_complete_settings(
+		m_am_tools,
+		complete_settings);
+
+	if (complete_settings == 0)
+	{
+		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+		return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error);
+	}
+
+	complete_settings->m_completion_status = completion_status;
+
+	eap_status_e status(eap_status_not_supported);
+
+	switch(error_completion_function)
+	{
+	case eap_tlv_message_type_function_general_settings_complete_get_eap_methods:
+		status = m_partner->complete_get_eap_methods(complete_settings);
+		break;
+	case eap_tlv_message_type_function_general_settings_complete_set_eap_methods:
+		status = m_partner->complete_set_eap_methods(complete_settings);
+		break;
+	case eap_tlv_message_type_function_general_settings_complete_get_certificate_lists:
+		status = m_partner->complete_get_certificate_lists(complete_settings);
+		break;
+	case eap_tlv_message_type_function_general_settings_complete_delete_all_eap_settings:
+		status = m_partner->complete_delete_all_eap_settings(complete_settings);
+		break;
+	case eap_tlv_message_type_function_general_settings_complete_copy_all_eap_settings:
+		status = m_partner->complete_copy_all_eap_settings(complete_settings);
+		break;
+	default:
+		EAP_TRACE_ERROR(
+			m_am_tools,
+			TRACE_FLAGS_ERROR,
+			(EAPL("ERROR: eap_am_general_settings_symbian_c::error_complete(): unknown function %d.\n"),
+			 error_completion_function));
+
+		EAP_ASSERT_ANYWAY_TOOLS(m_am_tools);
+
+		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+		return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter);
+	}
+
+	return EAP_STATUS_RETURN(m_am_tools, status);
+}
+
+// ----------------------------------------------------------------------
+
+eap_status_e eap_am_general_settings_symbian_c::filter_eap_methods(
+	eap_array_c<eap_type_value_e> * const eap_methods,
+	RPointerArray<TEapExpandedType> * const aPlugins)
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::filter_eap_methods(): this=0x%08x.\n"),
+		this));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: eap_am_general_settings_symbian_c::filter_eap_methods()");
+
+	eap_status_e status(eap_status_ok);
+
+	for (TInt act_ind = 0; act_ind < eap_methods->get_object_count(); ++act_ind)
+	{
+		const eap_type_value_e * active_type = eap_methods->get_object(act_ind);
+		if (active_type == 0)
+		{
+			return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error);
+		}
+
+		EAP_TRACE_DEBUG(
+			m_am_tools,
+			TRACE_FLAGS_DEFAULT,
+			(EAPL("eap_am_general_settings_symbian_c::filter_eap_methods(): eap_methods[%d] EAP-type=0xfe%06x%08x\n"),
+			act_ind,
+			active_type->get_vendor_id(),
+			active_type->get_vendor_type()));
+
+		bool exists(false);
+
+		for (TInt plugin_ind = 0; plugin_ind < aPlugins->Count(); ++plugin_ind)
+		{
+			const TEapExpandedType * eap_type = (*aPlugins)[plugin_ind];
+			if (eap_type == 0)
+			{
+				return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error);
+			}
+
+			EAP_TRACE_DEBUG_SYMBIAN((_L("eap_am_general_settings_symbian_c::filter_eap_methods(): aPlugins[%d] EAP-type=0xfe%06x%08x\n"),
+				plugin_ind,
+				eap_type->GetVendorId(),
+				eap_type->GetVendorType()));
+
+			const eap_type_value_e common_eap_type(
+				static_cast<eap_type_vendor_id_e>(eap_type->GetVendorId()),
+				eap_type->GetVendorType());
+
+			if (common_eap_type == *active_type)
+			{
+				// OK, this active EAP-method have implementation.
+				exists = true;
+
+				EAP_TRACE_DEBUG(
+					m_am_tools,
+					TRACE_FLAGS_DEFAULT,
+					(EAPL("eap_am_general_settings_symbian_c::filter_eap_methods(): Removes from aPlugins EAP-type=0xfe%06x%08x\n"),
+					common_eap_type.get_vendor_id(),
+					common_eap_type.get_vendor_type()));
+
+				// Remove this plugin EAP-method because it is in the list of EAP-methods.
+				delete (*aPlugins)[plugin_ind];
+				aPlugins->Remove(plugin_ind);
+
+				break;
+			}
+		} // for()
+
+		if (exists == false)
+		{
+			// Remove this EAP-method because there are no implementation.
+
+			EAP_TRACE_DEBUG(
+				m_am_tools,
+				TRACE_FLAGS_DEFAULT,
+				(EAPL("eap_am_general_settings_symbian_c::filter_eap_methods(): Removes from eap_methods EAP-type=0xfe%06x%08x\n"),
+				active_type->get_vendor_id(),
+				active_type->get_vendor_type()));
+
+			status = eap_methods->remove_object(act_ind);
+			if (status != eap_status_ok)
+			{
+				return EAP_STATUS_RETURN(m_am_tools, status);
+			}
+
+			--act_ind;
+		}
+	} // for()
+
+	return EAP_STATUS_RETURN(m_am_tools, status);
+}
+
+// ----------------------------------------------------------------------
+
+eap_status_e eap_am_general_settings_symbian_c::read_eap_methods_synchronously(
+	const TUint indexType,
+	const TUint index,
+	eap_array_c<eap_type_value_e> * const aEnabledEapMethodsArray,
+	eap_array_c<eap_type_value_e> * const aDisabledEapMethodsArray)
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::read_eap_methods_synchronously(): this=0x%08x.\n"),
+		this));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: eap_am_general_settings_symbian_c::read_eap_methods_synchronously()");
+
+	TInt error = KErrNone;
+
+	TRAP(error, (OpenGeneralSettingsL()));
+
+	if (error != KErrNone)
+	{
+		EAP_TRACE_ERROR(
+			m_am_tools,
+			TRACE_FLAGS_ERROR,
+			(EAPL("ERROR: eap_am_general_settings_symbian_c::read_eap_methods_synchronously(): OpenGeneralSettingsL() failed, indexType=%d, index=%d, error=%d.\n"),
+			indexType,
+			index,
+			error));
+
+		CloseGeneralSettings();
+
+		EAP_TRACE_DEBUG(
+			m_am_tools,
+			TRACE_FLAGS_DEFAULT,
+			(EAPL("eap_am_general_settings_symbian_c::read_eap_methods_synchronously(): this=0x%08x, CloseGeneralSettings()\n"),
+			this));
+
+		return EAP_STATUS_RETURN(
+			m_am_tools,
+			m_am_tools->convert_am_error_to_eapol_error(error));
+	}
+
+
+	HBufC8 *aEnabledEapMethods = 0;
+	HBufC8 *aDisabledEapMethods = 0;
+
+	// The output parameters aEnabledEapMethods and aDisabledEapMethods are NOT in clean up stack.
+	TRAP(error, (GetGeneralSettingsDataL(
+		indexType,
+		index,
+		&aEnabledEapMethods,
+		&aDisabledEapMethods)));
+
+	eap_automatic_variable_c<HBufC8> automatic_aEnabledEapMethods(
+		m_am_tools,
+		aEnabledEapMethods);
+
+	eap_automatic_variable_c<HBufC8> automatic_aDisabledEapMethods(
+		m_am_tools,
+		aDisabledEapMethods);
+
+	if (error != KErrNone)
+	{
+		EAP_TRACE_ERROR(
+			m_am_tools,
+			TRACE_FLAGS_ERROR,
+			(EAPL("ERROR: eap_am_general_settings_symbian_c::read_eap_methods_synchronously(): GetGeneralSettingsDataL() failed, index_type=%d, index=%d, error=%d.\n"),
+			indexType,
+			index,
+			error));
+
+		CloseGeneralSettings();
+
+		EAP_TRACE_DEBUG(
+			m_am_tools,
+			TRACE_FLAGS_DEFAULT,
+			(EAPL("eap_am_general_settings_symbian_c::read_eap_methods_synchronously(): this=0x%08x, CloseGeneralSettings()\n"),
+			this));
+
+		return EAP_STATUS_RETURN(
+			m_am_tools,
+			m_am_tools->convert_am_error_to_eapol_error(error));
+	}
+
+	if (aEnabledEapMethods != 0)
+	{
+		error = CEapConversion::ConvertHBufC8ToInternalTypes(
+			m_am_tools,
+			aEnabledEapMethods,
+			aEnabledEapMethodsArray);
+
+		if (error != KErrNone)
+		{
+			EAP_TRACE_ERROR(
+				m_am_tools,
+				TRACE_FLAGS_ERROR,
+				(EAPL("ERROR: eap_am_general_settings_symbian_c::read_eap_methods_synchronously(): index_type=%d, index=%d.\n"),
+				indexType,
+				index));
+
+			CloseGeneralSettings();
+
+			EAP_TRACE_DEBUG(
+				m_am_tools,
+				TRACE_FLAGS_DEFAULT,
+				(EAPL("eap_am_general_settings_symbian_c::read_eap_methods_synchronously(): this=0x%08x, CloseGeneralSettings()\n"),
+				this));
+
+			return EAP_STATUS_RETURN(
+				m_am_tools,
+				m_am_tools->convert_am_error_to_eapol_error(error));
+		}
+	}
+
+	if (aDisabledEapMethods != 0)
+	{
+		error = CEapConversion::ConvertHBufC8ToInternalTypes(
+			m_am_tools,
+			aDisabledEapMethods,
+			aDisabledEapMethodsArray);
+
+		if (error != KErrNone)
+		{
+			EAP_TRACE_ERROR(
+				m_am_tools,
+				TRACE_FLAGS_ERROR,
+				(EAPL("ERROR: eap_am_general_settings_symbian_c::read_eap_methods_synchronously(): index_type=%d, index=%d.\n"),
+				indexType,
+				index));
+
+			CloseGeneralSettings();
+
+			EAP_TRACE_DEBUG(
+				m_am_tools,
+				TRACE_FLAGS_DEFAULT,
+				(EAPL("eap_am_general_settings_symbian_c::read_eap_methods_synchronously(): this=0x%08x, CloseGeneralSettings()\n"),
+				this));
+
+			return EAP_STATUS_RETURN(
+				m_am_tools,
+				m_am_tools->convert_am_error_to_eapol_error(error));
+		}
+	}
+
+	iGeneralSettingsDb.Compact();
+
+	CloseGeneralSettings();
+
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::read_eap_methods_synchronously(): this=0x%08x, CloseGeneralSettings()\n"),
+		this));
+
+	return EAP_STATUS_RETURN(m_am_tools, m_am_tools->convert_am_error_to_eapol_error(error));
+}
+
+// ----------------------------------------------------------------------
+
+eap_status_e eap_am_general_settings_symbian_c::get_eap_methods(const eap_method_settings_c * const internal_settings)
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::get_eap_methods(): this=0x%08x.\n"),
+		this));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: eap_am_general_settings_symbian_c::get_eap_methods()");
+
+	const eap_tlv_message_type_function_e error_completion_function(eap_tlv_message_type_function_general_settings_complete_get_eap_methods);
+
+	HBufC8 *aEnabledEapMethods = 0;
+	HBufC8 *aDisabledEapMethods = 0;
+
+	TInt error(KErrNone);
+	eap_status_e status(eap_status_ok);
+
+	TRAP(error, (OpenGeneralSettingsL()));
+
+	if (error != KErrNone)
+	{
+		EAP_TRACE_ERROR(
+			m_am_tools,
+			TRACE_FLAGS_ERROR,
+			(EAPL("ERROR: eap_am_general_settings_symbian_c::get_eap_methods(): OpenGeneralSettingsL() failed, EAP-type=0xfe%06x%08x, index_type=%d, index=%d, error=%d.\n"),
+			internal_settings->m_EAPType.get_vendor_id(),
+			internal_settings->m_EAPType.get_vendor_type(),
+			internal_settings->m_IndexType,
+			internal_settings->m_Index,
+			error));
+
+		return EAP_STATUS_RETURN(
+			m_am_tools,
+			error_complete(
+				m_am_tools->convert_am_error_to_eapol_error(error),
+				internal_settings,
+				error_completion_function));
+	}
+
+
+	// The output parameters aEnabledEapMethods and aDisabledEapMethods are NOT in clean up stack.
+	TRAP(error, (GetGeneralSettingsDataL(
+		internal_settings->m_IndexType,
+		internal_settings->m_Index,
+		&aEnabledEapMethods,
+		&aDisabledEapMethods)));
+
+	eap_automatic_variable_c<HBufC8> automatic_aEnabledEapMethods(
+		m_am_tools,
+		aEnabledEapMethods);
+
+	eap_automatic_variable_c<HBufC8> automatic_aDisabledEapMethods(
+		m_am_tools,
+		aDisabledEapMethods);
+
+	if (error != KErrNone)
+	{
+		EAP_TRACE_ERROR(
+			m_am_tools,
+			TRACE_FLAGS_ERROR,
+			(EAPL("ERROR: eap_am_general_settings_symbian_c::get_eap_methods(): GetGeneralSettingsDataL() failed, EAP-type=0xfe%06x%08x, index_type=%d, index=%d, error=%d.\n"),
+			internal_settings->m_EAPType.get_vendor_id(),
+			internal_settings->m_EAPType.get_vendor_type(),
+			internal_settings->m_IndexType,
+			internal_settings->m_Index,
+			error));
+
+		return EAP_STATUS_RETURN(
+			m_am_tools,
+			error_complete(
+				m_am_tools->convert_am_error_to_eapol_error(error),
+				internal_settings,
+				error_completion_function));
+	}
+
+
+	RPointerArray<TEapExpandedType> plugins_array;
+
+	PointerArrayResetAndDestroy<TEapExpandedType> aAutomaticPlugins(&plugins_array, EFalse);
+
+	EapPluginTools aPluginTool;
+
+	TEapExpandedType aTunnelingType(*EapExpandedTypeNone.GetType());
+
+	TRAP(error, (aPluginTool.ListAllEapPluginsL(static_cast<TIndexType>(internal_settings->m_IndexType), aTunnelingType, plugins_array)));
+	if (error != KErrNone)
+	{
+		EAP_TRACE_ERROR(
+			m_am_tools,
+			TRACE_FLAGS_ERROR,
+			(EAPL("ERROR: eap_am_general_settings_symbian_c::get_eap_methods(): aPluginTool.ListAllEapPluginsL() failed, EAP-type=0xfe%06x%08x, index_type=%d, index=%d, error=%d.\n"),
+			internal_settings->m_EAPType.get_vendor_id(),
+			internal_settings->m_EAPType.get_vendor_type(),
+			internal_settings->m_IndexType,
+			internal_settings->m_Index,
+			error));
+
+		return EAP_STATUS_RETURN(
+			m_am_tools,
+			error_complete(
+				m_am_tools->convert_am_error_to_eapol_error(error),
+				internal_settings,
+				error_completion_function));
+	}
+
+	eap_method_settings_c * const complete_settings = new eap_method_settings_c(m_am_tools);
+
+	eap_automatic_variable_c<eap_method_settings_c> automatic_complete_settings(
+		m_am_tools,
+		complete_settings);
+
+	if (complete_settings == 0)
+	{
+		return EAP_STATUS_RETURN(
+			m_am_tools,
+			error_complete(
+				eap_status_allocation_error,
+				internal_settings,
+				error_completion_function));
+	}
+
+	if (aEnabledEapMethods != 0)
+	{
+		error = CEapConversion::ConvertHBufC8ToInternalTypes(
+			m_am_tools,
+			aEnabledEapMethods,
+			&(complete_settings->m_active_eap_methods));
+
+		if (error != KErrNone)
+		{
+			EAP_TRACE_ERROR(
+				m_am_tools,
+				TRACE_FLAGS_ERROR,
+				(EAPL("ERROR: eap_am_general_settings_symbian_c::get_eap_methods(): EAP-type=0xfe%06x%08x, index_type=%d, index=%d.\n"),
+				internal_settings->m_EAPType.get_vendor_id(),
+				internal_settings->m_EAPType.get_vendor_type(),
+				internal_settings->m_IndexType,
+				internal_settings->m_Index));
+			return EAP_STATUS_RETURN(
+				m_am_tools,
+				error_complete(
+					m_am_tools->convert_am_error_to_eapol_error(error),
+					internal_settings,
+					error_completion_function));
+		}
+	}
+
+	if (aDisabledEapMethods != 0)
+	{
+		error = CEapConversion::ConvertHBufC8ToInternalTypes(
+			m_am_tools,
+			aDisabledEapMethods,
+			&(complete_settings->m_disabled_eap_methods));
+
+		if (error != KErrNone)
+		{
+			EAP_TRACE_ERROR(
+				m_am_tools,
+				TRACE_FLAGS_ERROR,
+				(EAPL("ERROR: eap_am_general_settings_symbian_c::get_eap_methods(): EAP-type=0xfe%06x%08x, index_type=%d, index=%d.\n"),
+				internal_settings->m_EAPType.get_vendor_id(),
+				internal_settings->m_EAPType.get_vendor_type(),
+				internal_settings->m_IndexType,
+				internal_settings->m_Index));
+			return EAP_STATUS_RETURN(
+				m_am_tools,
+				error_complete(
+					m_am_tools->convert_am_error_to_eapol_error(error),
+					internal_settings,
+					error_completion_function));
+		}
+	}
+
+	// Next filter out unimplemented EAP-methods.
+	status = filter_eap_methods(
+		&(complete_settings->m_active_eap_methods),
+		&plugins_array);
+	if (status != eap_status_ok)
+	{
+		return EAP_STATUS_RETURN(
+			m_am_tools,
+			error_complete(
+				status,
+				internal_settings,
+				error_completion_function));
+	}
+
+	// Check the disabled EAP-method have implementation.
+	status = filter_eap_methods(
+		&(complete_settings->m_disabled_eap_methods),
+		&plugins_array);
+	if (status != eap_status_ok)
+	{
+		return EAP_STATUS_RETURN(
+			m_am_tools,
+			error_complete(
+				status,
+				internal_settings,
+				error_completion_function));
+	}
+
+	// Add the rest of the implemented EAP-methods to the disabled EAP-methods.
+	for (TInt plugin_ind = 0; plugin_ind < plugins_array.Count(); ++plugin_ind)
+	{
+		const TEapExpandedType * eap_type = plugins_array[plugin_ind];
+		if (eap_type == 0)
+		{
+			return EAP_STATUS_RETURN(
+				m_am_tools,
+				error_complete(
+					eap_status_allocation_error,
+					internal_settings,
+					error_completion_function));
+		}
+
+		const eap_type_value_e common_eap_type(
+			static_cast<eap_type_vendor_id_e>(eap_type->GetVendorId()),
+			eap_type->GetVendorType());
+
+		EAP_TRACE_DEBUG(
+			m_am_tools,
+			TRACE_FLAGS_DEFAULT,
+			(EAPL("eap_am_general_settings_symbian_c::get_eap_methods(): Adds disabled EAP-type=0xfe%06x%08x\n"),
+			eap_type->GetVendorId(),
+			eap_type->GetVendorType()));
+
+		status = complete_settings->m_disabled_eap_methods.add_object(common_eap_type.copy(), true);
+		if (status != eap_status_ok)
+		{
+			return EAP_STATUS_RETURN(
+				m_am_tools,
+				error_complete(
+					status,
+					internal_settings,
+					error_completion_function));
+		}
+	} // for()
+
+	complete_settings->m_SelectedEAPTypesPresent = true;
+
+	complete_settings->m_completion_status = eap_status_ok;
+	complete_settings->m_EAPType = internal_settings->m_EAPType;
+	complete_settings->m_IndexType = internal_settings->m_IndexType;
+	complete_settings->m_Index = internal_settings->m_Index;
+
+	status = m_partner->complete_get_eap_methods(complete_settings);
+
+
+	iGeneralSettingsDb.Compact();
+
+	CloseGeneralSettings();
+
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::get_eap_methods(): this=0x%08x, CloseGeneralSettings()\n"),
+		this));
+
+	return EAP_STATUS_RETURN(m_am_tools, status);
+}
+
+// ----------------------------------------------------------------------
+
+eap_status_e eap_am_general_settings_symbian_c::set_eap_methods(const eap_method_settings_c * const internal_settings)
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::set_eap_methods(): this=0x%08x.\n"),
+		this));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: eap_am_general_settings_symbian_c::set_eap_methods()");
+
+	const eap_tlv_message_type_function_e error_completion_function(eap_tlv_message_type_function_general_settings_complete_set_eap_methods);
+
+	TInt error = KErrNone;
+
+	TRAP(error, (OpenGeneralSettingsL()));
+
+	if (error != KErrNone)
+	{
+		EAP_TRACE_ERROR(
+			m_am_tools,
+			TRACE_FLAGS_ERROR,
+			(EAPL("ERROR: eap_am_general_settings_symbian_c::set_eap_methods(): OpenGeneralSettingsL() failed, EAP-type=0xfe%06x%08x, index_type=%d, index=%d, error=%d.\n"),
+			internal_settings->m_EAPType.get_vendor_id(),
+			internal_settings->m_EAPType.get_vendor_type(),
+			internal_settings->m_IndexType,
+			internal_settings->m_Index,
+			error));
+
+		return EAP_STATUS_RETURN(
+			m_am_tools,
+			error_complete(
+				m_am_tools->convert_am_error_to_eapol_error(error),
+				internal_settings,
+				error_completion_function));
+	}
+
+
+	HBufC8 *aEnabledEapMethods = 0;
+	HBufC8 *aDisabledEapMethods = 0;
+
+	error = CEapConversion::ConvertInternalTypesToHBufC8(
+		m_am_tools,
+		&(internal_settings->m_active_eap_methods),
+		&aEnabledEapMethods);
+
+	eap_automatic_variable_c<HBufC8> automatic_aEnabledEapMethods(
+		m_am_tools,
+		aEnabledEapMethods);
+
+	if (error != KErrNone)
+	{
+		EAP_TRACE_ERROR(
+			m_am_tools,
+			TRACE_FLAGS_ERROR,
+			(EAPL("ERROR: eap_am_general_settings_symbian_c::set_eap_methods(): EAP-type=0xfe%06x%08x, index_type=%d, index=%d.\n"),
+			internal_settings->m_EAPType.get_vendor_id(),
+			internal_settings->m_EAPType.get_vendor_type(),
+			internal_settings->m_IndexType,
+			internal_settings->m_Index));
+		return EAP_STATUS_RETURN(
+			m_am_tools,
+			error_complete(
+				m_am_tools->convert_am_error_to_eapol_error(error),
+				internal_settings,
+				error_completion_function));
+	}
+
+	error = CEapConversion::ConvertInternalTypesToHBufC8(
+		m_am_tools,
+		&(internal_settings->m_disabled_eap_methods),
+		&aDisabledEapMethods);
+
+	eap_automatic_variable_c<HBufC8> automatic_aDisabledEapMethods(
+		m_am_tools,
+		aDisabledEapMethods);
+
+	if (error != KErrNone)
+	{
+		EAP_TRACE_ERROR(
+			m_am_tools,
+			TRACE_FLAGS_ERROR,
+			(EAPL("ERROR: eap_am_general_settings_symbian_c::set_eap_methods(): EAP-type=0xfe%06x%08x, index_type=%d, index=%d.\n"),
+			internal_settings->m_EAPType.get_vendor_id(),
+			internal_settings->m_EAPType.get_vendor_type(),
+			internal_settings->m_IndexType,
+			internal_settings->m_Index));
+		return EAP_STATUS_RETURN(
+			m_am_tools,
+			error_complete(
+				m_am_tools->convert_am_error_to_eapol_error(error),
+				internal_settings,
+				error_completion_function));
+	}
+
+	TRAP(error, (SetGeneralSettingsDataL(
+		internal_settings->m_IndexType,
+		internal_settings->m_Index,
+		*aEnabledEapMethods,
+		*aDisabledEapMethods)));
+	if (error != KErrNone)
+	{
+		EAP_TRACE_ERROR(
+			m_am_tools,
+			TRACE_FLAGS_ERROR,
+			(EAPL("ERROR: eap_am_general_settings_symbian_c::set_eap_methods(): EAP-type=0xfe%06x%08x, index_type=%d, index=%d.\n"),
+			internal_settings->m_EAPType.get_vendor_id(),
+			internal_settings->m_EAPType.get_vendor_type(),
+			internal_settings->m_IndexType,
+			internal_settings->m_Index));
+		return EAP_STATUS_RETURN(
+			m_am_tools,
+			error_complete(
+				m_am_tools->convert_am_error_to_eapol_error(error),
+				internal_settings,
+				error_completion_function));
+	}
+
+	eap_method_settings_c * const complete_settings = new eap_method_settings_c(m_am_tools);
+
+	eap_automatic_variable_c<eap_method_settings_c> automatic_complete_settings(
+		m_am_tools,
+		complete_settings);
+
+	if (complete_settings == 0)
+	{
+		return EAP_STATUS_RETURN(
+			m_am_tools,
+			error_complete(
+				eap_status_allocation_error,
+				internal_settings,
+				error_completion_function));
+	}
+
+	complete_settings->m_completion_status = eap_status_ok;
+	complete_settings->m_EAPType = internal_settings->m_EAPType;
+	complete_settings->m_IndexType = internal_settings->m_IndexType;
+	complete_settings->m_Index = internal_settings->m_Index;
+
+	eap_status_e status = m_partner->complete_set_eap_methods(complete_settings);
+
+	iGeneralSettingsDb.Compact();
+
+	CloseGeneralSettings();
+
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::set_eap_methods(): this=0x%08x, CloseGeneralSettings()\n"),
+		this));
+
+	return EAP_STATUS_RETURN(m_am_tools, status);
+}
+
+// ----------------------------------------------------------------------
+
+eap_status_e eap_am_general_settings_symbian_c::get_certificate_lists(const eap_method_settings_c * const internal_settings)
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::get_certificate_lists(): this=0x%08x.\n"),
+		this));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: eap_am_general_settings_symbian_c::get_certificate_lists()");
+
+	TInt error(KErrNone);
+
+	const eap_tlv_message_type_function_e error_completion_function(eap_tlv_message_type_function_general_settings_complete_get_certificate_lists);
+
+	if (iCertificateFetcher == 0)
+	{
+		TRAP(error, iCertificateFetcher = CEapTlsPeapCertFetcher::NewL(this));
+		if (error != KErrNone)
+		{
+			EAP_TRACE_ERROR(
+				m_am_tools,
+				TRACE_FLAGS_ERROR,
+				(EAPL("ERROR: eap_am_general_settings_symbian_c::get_certificate_lists(): this=0x%08x: CEapTlsPeapCertFetcher::NewL() failed=%d\n"),
+				this,
+				error));
+
+			eap_method_settings_c * const complete_settings = new eap_method_settings_c(m_am_tools);
+
+			eap_automatic_variable_c<eap_method_settings_c> automatic_complete_settings(
+				m_am_tools,
+				complete_settings);
+
+			return EAP_STATUS_RETURN(
+				m_am_tools,
+				error_complete(
+					m_am_tools->convert_am_error_to_eapol_error(error),
+					complete_settings,
+					error_completion_function));
+		}
+	}
+
+	m_completion_status = internal_settings->m_completion_status;
+	m_EAPType = internal_settings->m_EAPType;
+	m_IndexType = internal_settings->m_IndexType;
+	m_Index = internal_settings->m_Index;
+
+	TRAP(error, (iCertificateFetcher->GetCertificatesL()));
+	if (error != KErrNone)
+	{
+		EAP_TRACE_ERROR(
+			m_am_tools,
+			TRACE_FLAGS_ERROR,
+			(EAPL("ERROR: eap_am_general_settings_symbian_c::get_certificate_lists(): iCertificateFetcher->GetCertificatesL(), error=%d\n"),
+			error));
+		return EAP_STATUS_RETURN(
+			m_am_tools,
+			error_complete(
+				m_am_tools->convert_am_error_to_eapol_error(error),
+				internal_settings,
+				error_completion_function));
+	}
+
+	CloseGeneralSettings();
+
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::get_certificate_lists(): this=0x%08x, CloseGeneralSettings()\n"),
+		this));
+
+	return EAP_STATUS_RETURN(m_am_tools, eap_status_ok);
+}
+
+// ----------------------------------------------------------
+
+void eap_am_general_settings_symbian_c::CompleteReadCertificatesL(
+		const RPointerArray<EapCertificateEntry>& aAvailableUserCerts, 
+		const RPointerArray<EapCertificateEntry>& aAvailableCACerts)
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::CompleteReadCertificatesL(): - Available cert count in device - USER=%d, CA=%d \n"),
+		aAvailableUserCerts.Count(),
+		aAvailableCACerts.Count()));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: eap_am_general_settings_symbian_c::CompleteReadCertificatesL()");
+
+	// Now all available certificates have been read.
+
+	const eap_tlv_message_type_function_e error_completion_function(eap_tlv_message_type_function_general_settings_complete_get_certificate_lists);
+
+	eap_method_settings_c * const complete_settings = new eap_method_settings_c(m_am_tools);
+
+	eap_automatic_variable_c<eap_method_settings_c> automatic_complete_settings(
+		m_am_tools,
+		complete_settings);
+
+	if (complete_settings == 0)
+	{
+		(void) EAP_STATUS_RETURN(m_am_tools, error_complete(
+			eap_status_allocation_error,
+			complete_settings,
+			error_completion_function));
+	}
+
+	TInt error = CEapConversion::ConvertCertificatesToInternalType(
+		m_am_tools,
+		&aAvailableUserCerts,
+		&(complete_settings->m_Certificates));
+	if (error != KErrNone)
+	{
+		(void) EAP_STATUS_RETURN(m_am_tools, error_complete(
+			m_am_tools->convert_am_error_to_eapol_error(error),
+			complete_settings,
+			error_completion_function));
+	}
+
+	error = CEapConversion::ConvertCertificatesToInternalType(
+		m_am_tools,
+		&aAvailableCACerts,
+		&(complete_settings->m_Certificates));
+	if (error != KErrNone)
+	{
+		(void) EAP_STATUS_RETURN(m_am_tools, error_complete(
+			m_am_tools->convert_am_error_to_eapol_error(error),
+			complete_settings,
+			error_completion_function));
+	}
+
+	complete_settings->m_CertificatesPresent = true;
+
+	complete_settings->m_completion_status = eap_status_ok;
+	complete_settings->m_EAPType = m_EAPType;
+	complete_settings->m_IndexType = m_IndexType;
+	complete_settings->m_Index = m_Index;
+
+	eap_status_e status = m_partner->complete_get_certificate_lists(complete_settings);
+
+	(void) EAP_STATUS_RETURN(m_am_tools, status);
+	EAP_UNREFERENCED_PARAMETER(status);
+}
+
+// ----------------------------------------------------------------------
+
+eap_status_e eap_am_general_settings_symbian_c::delete_all_eap_settings(const eap_method_settings_c * const internal_settings)
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::delete_all_eap_settings(): this=0x%08x.\n"),
+		this));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: eap_am_general_settings_symbian_c::delete_all_eap_settings()");
+
+	const eap_tlv_message_type_function_e error_completion_function(eap_tlv_message_type_function_general_settings_complete_delete_all_eap_settings);
+
+	TInt error(KErrNone);
+
+	TRAP(error, (OpenGeneralSettingsL()));
+
+	if (error != KErrNone)
+	{
+		EAP_TRACE_ERROR(
+			m_am_tools,
+			TRACE_FLAGS_ERROR,
+			(EAPL("ERROR: eap_am_general_settings_symbian_c::delete_all_eap_settings(): OpenGeneralSettingsL() failed, EAP-type=0xfe%06x%08x, index_type=%d, index=%d, error=%d.\n"),
+			internal_settings->m_EAPType.get_vendor_id(),
+			internal_settings->m_EAPType.get_vendor_type(),
+			internal_settings->m_IndexType,
+			internal_settings->m_Index,
+			error));
+
+		return EAP_STATUS_RETURN(
+			m_am_tools,
+			error_complete(
+				m_am_tools->convert_am_error_to_eapol_error(error),
+				internal_settings,
+				error_completion_function));
+	}
+
+	eap_method_settings_c * const complete_settings = new eap_method_settings_c(m_am_tools);
+
+	eap_automatic_variable_c<eap_method_settings_c> automatic_complete_settings(
+		m_am_tools,
+		complete_settings);
+
+	if (complete_settings == 0)
+	{
+		return EAP_STATUS_RETURN(
+			m_am_tools,
+			error_complete(
+				eap_status_allocation_error,
+				internal_settings,
+				error_completion_function));
+	}
+
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::delete_all_eap_settings(): this=0x%08x: DeleteGeneralSettingsDataL(): EAP-type=0xfe%06x%08x, index_type=%d, index=%d\n"),
+		this,
+		internal_settings->m_EAPType.get_vendor_id(),
+		internal_settings->m_EAPType.get_vendor_type(),
+		internal_settings->m_IndexType,
+		internal_settings->m_Index));
+
+	TRAP(error, (DeleteGeneralSettingsDataL(
+		internal_settings->m_IndexType,
+		internal_settings->m_Index)));
+	if (error != KErrNone)
+	{
+		EAP_TRACE_ERROR(
+			m_am_tools,
+			TRACE_FLAGS_ERROR,
+			(EAPL("ERROR: eap_am_general_settings_symbian_c::delete_all_eap_settings(): EAP-type=0xfe%06x%08x, index_type=%d, index=%d.\n"),
+			internal_settings->m_EAPType.get_vendor_id(),
+			internal_settings->m_EAPType.get_vendor_type(),
+			internal_settings->m_IndexType,
+			internal_settings->m_Index));
+		return EAP_STATUS_RETURN(
+			m_am_tools,
+			error_complete(
+				m_am_tools->convert_am_error_to_eapol_error(error),
+				internal_settings,
+				error_completion_function));
+	}
+
+	{
+		RPointerArray<TEapExpandedType> plugins_array;
+
+		PointerArrayResetAndDestroy<TEapExpandedType> aAutomaticPlugins(&plugins_array, EFalse);
+
+		EapPluginTools aPluginTool;
+
+		TEapExpandedType aTunnelingType(*EapExpandedTypeNone.GetType());
+
+		EAP_TRACE_DEBUG(
+			m_am_tools,
+			TRACE_FLAGS_DEFAULT,
+			(EAPL("eap_am_general_settings_symbian_c::delete_all_eap_settings(): this=0x%08x: aPluginTool.ListAllEapPluginsL(): tunneling EAP-type=0xfe%06x%08x, index_type=%d, index=%d\n"),
+			this,
+			aTunnelingType.GetVendorId(),
+			aTunnelingType.GetVendorType(),
+			internal_settings->m_IndexType,
+			internal_settings->m_Index));
+
+		// This will list all outer EAP-methods because aTunnelingType = None.
+		TRAP(error, (aPluginTool.ListAllEapPluginsL(static_cast<TIndexType>(internal_settings->m_IndexType), aTunnelingType, plugins_array)));
+		if (error != KErrNone)
+		{
+			EAP_TRACE_ERROR(
+				m_am_tools,
+				TRACE_FLAGS_ERROR,
+				(EAPL("ERROR: eap_am_general_settings_symbian_c::delete_all_eap_settings(): aPluginTool.ListAllEapPluginsL() failed, tunneling EAP-type=0xfe%06x%08x, index_type=%d, index=%d, error=%d.\n"),
+				aTunnelingType.GetVendorId(),
+				aTunnelingType.GetVendorType(),
+				internal_settings->m_IndexType,
+				internal_settings->m_Index,
+				error));
+
+			return EAP_STATUS_RETURN(
+				m_am_tools,
+				error_complete(
+					m_am_tools->convert_am_error_to_eapol_error(error),
+					internal_settings,
+					error_completion_function));
+		}
+
+		TUint ind_outer(0ul);
+
+		for (ind_outer = 0ul; ind_outer < plugins_array.Count(); ++ind_outer)
+		{
+
+			// List all plugins that could be used inside the each outer EAP-method on each plugin.
+
+			RPointerArray<TEapExpandedType> tunneled_plugins;
+
+			PointerArrayResetAndDestroy<TEapExpandedType> aAutomaticTunneledPlugins(&tunneled_plugins, EFalse);
+
+			EAP_TRACE_DEBUG(
+				m_am_tools,
+				TRACE_FLAGS_DEFAULT,
+				(EAPL("eap_am_general_settings_symbian_c::delete_all_eap_settings(): this=0x%08x: aPluginTool.ListAllEapPluginsL(): tunneling EAP-type=0xfe%06x%08x, index_type=%d, index=%d\n"),
+				this,
+				plugins_array[ind_outer]->GetVendorId(),
+				plugins_array[ind_outer]->GetVendorType(),
+				internal_settings->m_IndexType,
+				internal_settings->m_Index));
+
+			// This will list all inner EAP-methods of EAP-type.
+			TRAP(error, (aPluginTool.ListAllEapPluginsL(static_cast<TIndexType>(internal_settings->m_IndexType), plugins_array[ind_outer], tunneled_plugins)));
+			if (error != KErrNone)
+			{
+				EAP_TRACE_ERROR(
+					m_am_tools,
+					TRACE_FLAGS_ERROR,
+					(EAPL("ERROR: eap_am_general_settings_symbian_c::delete_all_eap_settings(): aPluginTool.ListAllEapPluginsL() failed, tunneling EAP-type=0xfe%06x%08x, index_type=%d, index=%d, error=%d.\n"),
+					plugins_array[ind_outer]->GetVendorId(),
+					plugins_array[ind_outer]->GetVendorType(),
+					internal_settings->m_IndexType,
+					internal_settings->m_Index,
+					error));
+
+				return EAP_STATUS_RETURN(
+					m_am_tools,
+					error_complete(
+						m_am_tools->convert_am_error_to_eapol_error(error),
+						internal_settings,
+						error_completion_function));
+			}
+
+
+			// Delete possible configuration of each inner EAP-method that could be configured inside of outer EAP-method.
+
+			TUint ind_inner(0ul);
+
+			for (ind_inner = 0ul; ind_inner < tunneled_plugins.Count(); ++ind_inner)
+			{
+				CEapTypePlugin * eapType = NULL;
+
+				EAP_TRACE_DEBUG(
+					m_am_tools,
+					TRACE_FLAGS_DEFAULT,
+					(EAPL("eap_am_general_settings_symbian_c::delete_all_eap_settings(): this=0x%08x: CEapTypePlugin::NewL(): EAP-type=0xfe%06x%08x, index_type=%d, index=%d\n"),
+					this,
+					tunneled_plugins[ind_inner]->GetVendorId(),
+					tunneled_plugins[ind_inner]->GetVendorType(),
+					internal_settings->m_IndexType,
+					internal_settings->m_Index));
+
+				TRAP(error, (eapType = CEapTypePlugin::NewL(
+					tunneled_plugins[ind_inner]->GetValue(),
+					static_cast<TIndexType>(internal_settings->m_IndexType),
+					internal_settings->m_Index)));
+
+				// This will automatically delete eapType.
+				eap_automatic_variable_c<CEapTypePlugin> automatic_eap_type(
+					m_am_tools,
+					eapType);
+
+				if(error != KErrNone
+					|| eapType == NULL)
+				{
+					EAP_TRACE_ERROR(
+						m_am_tools,
+						TRACE_FLAGS_ERROR,
+						(EAPL("ERROR: eap_am_general_settings_symbian_c::delete_all_eap_settings(): CEapTypePlugin::NewL() failed, EAP-type=0xfe%06x%08x, index_type=%d, index=%d, error=%d.\n"),
+						tunneled_plugins[ind_inner]->GetVendorId(),
+						tunneled_plugins[ind_inner]->GetVendorType(),
+						internal_settings->m_IndexType,
+						internal_settings->m_Index,
+						error));
+
+					return EAP_STATUS_RETURN(
+						m_am_tools,
+						error_complete(
+							m_am_tools->convert_am_error_to_eapol_error(error),
+							internal_settings,
+							error_completion_function));
+				}
+				
+			    eapType->SetTunnelingType(plugins_array[ind_outer]);
+
+				EAP_TRACE_DEBUG(
+					m_am_tools,
+					TRACE_FLAGS_DEFAULT,
+					(EAPL("eap_am_general_settings_symbian_c::delete_all_eap_settings(): this=0x%08x: eapType->DeleteConfigurationL(): EAP-type=0xfe%06x%08x, index_type=%d, index=%d\n"),
+					this,
+					tunneled_plugins[ind_inner]->GetVendorId(),
+					tunneled_plugins[ind_inner]->GetVendorType(),
+					internal_settings->m_IndexType,
+					internal_settings->m_Index));
+
+				TRAP(error, (eapType->DeleteConfigurationL()));
+				if(error != KErrNone)
+				{
+					EAP_TRACE_ERROR(
+						m_am_tools,
+						TRACE_FLAGS_ERROR,
+						(EAPL("ERROR: eap_am_general_settings_symbian_c::delete_all_eap_settings(): eapType->DeleteConfigurationL() failed, EAP-type=0xfe%06x%08x, index_type=%d, index=%d, error=%d.\n"),
+						tunneled_plugins[ind_inner]->GetVendorId(),
+						tunneled_plugins[ind_inner]->GetVendorType(),
+						internal_settings->m_IndexType,
+						internal_settings->m_Index,
+						error));
+
+					return EAP_STATUS_RETURN(
+						m_am_tools,
+						error_complete(
+							m_am_tools->convert_am_error_to_eapol_error(error),
+							internal_settings,
+							error_completion_function));
+				}
+
+			} // for()
+
+
+			{
+
+				// Delete possible configuration of each outer EAP-method on each plugin.
+
+				EAP_TRACE_DEBUG(
+					m_am_tools,
+					TRACE_FLAGS_DEFAULT,
+					(EAPL("eap_am_general_settings_symbian_c::delete_all_eap_settings(): this=0x%08x: CEapTypePlugin::NewL(): outer EAP-type=0xfe%06x%08x, index_type=%d, index=%d\n"),
+					this,
+					plugins_array[ind_outer]->GetVendorId(),
+					plugins_array[ind_outer]->GetVendorType(),
+					internal_settings->m_IndexType,
+					internal_settings->m_Index));
+
+				CEapTypePlugin * eapType = NULL;
+
+				TRAP(error, (eapType = CEapTypePlugin::NewL(
+					plugins_array[ind_outer]->GetValue(),
+					static_cast<TIndexType>(internal_settings->m_IndexType),
+					internal_settings->m_Index)));
+
+				// This will automatically delete eapType.
+				eap_automatic_variable_c<CEapTypePlugin> automatic_eap_type(
+					m_am_tools,
+					eapType);
+				
+				if(error != KErrNone
+					|| eapType == NULL)
+				{
+					EAP_TRACE_ERROR(
+						m_am_tools,
+						TRACE_FLAGS_ERROR,
+						(EAPL("ERROR: eap_am_general_settings_symbian_c::delete_all_eap_settings(): CEapTypePlugin::NewL() failed, outer EAP-type=0xfe%06x%08x, index_type=%d, index=%d, error=%d.\n"),
+						plugins_array[ind_outer]->GetVendorId(),
+						plugins_array[ind_outer]->GetVendorType(),
+						internal_settings->m_IndexType,
+						internal_settings->m_Index,
+						error));
+
+					return EAP_STATUS_RETURN(
+						m_am_tools,
+						error_complete(
+							m_am_tools->convert_am_error_to_eapol_error(error),
+							internal_settings,
+							error_completion_function));
+				}
+				
+				EAP_TRACE_DEBUG(
+					m_am_tools,
+					TRACE_FLAGS_DEFAULT,
+					(EAPL("eap_am_general_settings_symbian_c::delete_all_eap_settings(): this=0x%08x: eapType->DeleteConfigurationL(): outer EAP-type=0xfe%06x%08x, index_type=%d, index=%d\n"),
+					this,
+					plugins_array[ind_outer]->GetVendorId(),
+					plugins_array[ind_outer]->GetVendorType(),
+					internal_settings->m_IndexType,
+					internal_settings->m_Index));
+
+				TRAP(error, (eapType->DeleteConfigurationL()));
+				if(error != KErrNone)
+				{
+					EAP_TRACE_ERROR(
+						m_am_tools,
+						TRACE_FLAGS_ERROR,
+						(EAPL("ERROR: eap_am_general_settings_symbian_c::delete_all_eap_settings(): eapType->DeleteConfigurationL() failed, outer EAP-type=0xfe%06x%08x, index_type=%d, index=%d, error=%d.\n"),
+						plugins_array[ind_outer]->GetVendorId(),
+						plugins_array[ind_outer]->GetVendorType(),
+						internal_settings->m_IndexType,
+						internal_settings->m_Index,
+						error));
+
+					return EAP_STATUS_RETURN(
+						m_am_tools,
+						error_complete(
+							m_am_tools->convert_am_error_to_eapol_error(error),
+							internal_settings,
+							error_completion_function));
+				}
+			}
+
+		} // for()
+
+	}
+
+	complete_settings->m_completion_status = eap_status_ok;
+	complete_settings->m_EAPType = internal_settings->m_EAPType;
+	complete_settings->m_IndexType = internal_settings->m_IndexType;
+	complete_settings->m_Index = internal_settings->m_Index;
+
+	eap_status_e status = m_partner->complete_delete_all_eap_settings(complete_settings);
+
+	iGeneralSettingsDb.Compact();
+
+	CloseGeneralSettings();
+
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::delete_all_eap_settings(): this=0x%08x, CloseGeneralSettings()\n"),
+		this));
+
+	return EAP_STATUS_RETURN(m_am_tools, status);
+}
+
+// ----------------------------------------------------------------------
+
+eap_status_e eap_am_general_settings_symbian_c::copy_all_eap_settings(const eap_method_settings_c * const internal_settings)
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::copy_all_eap_settings(): this=0x%08x.\n"),
+		this));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: eap_am_general_settings_symbian_c::copy_all_eap_settings()");
+
+	const eap_tlv_message_type_function_e error_completion_function(eap_tlv_message_type_function_general_settings_complete_copy_all_eap_settings);
+
+	TInt error(KErrNone);
+
+	TRAP(error, (OpenGeneralSettingsL()));
+
+	if (error != KErrNone)
+	{
+		EAP_TRACE_ERROR(
+			m_am_tools,
+			TRACE_FLAGS_ERROR,
+			(EAPL("ERROR: eap_am_general_settings_symbian_c::copy_all_eap_settings(): OpenGeneralSettingsL() failed, EAP-type=0xfe%06x%08x, index_type=%d, index=%d, error=%d.\n"),
+			internal_settings->m_EAPType.get_vendor_id(),
+			internal_settings->m_EAPType.get_vendor_type(),
+			internal_settings->m_IndexType,
+			internal_settings->m_Index,
+			error));
+
+		return EAP_STATUS_RETURN(
+			m_am_tools,
+			error_complete(
+				m_am_tools->convert_am_error_to_eapol_error(error),
+				internal_settings,
+				error_completion_function));
+	}
+
+	eap_method_settings_c * const complete_settings = new eap_method_settings_c(m_am_tools);
+
+	eap_automatic_variable_c<eap_method_settings_c> automatic_complete_settings(
+		m_am_tools,
+		complete_settings);
+
+	if (complete_settings == 0)
+	{
+		return EAP_STATUS_RETURN(
+			m_am_tools,
+			error_complete(
+				eap_status_allocation_error,
+				internal_settings,
+				error_completion_function));
+	}
+
+	if (internal_settings == 0
+		|| internal_settings->m_DestinationIndexAndTypePresent == false)
+	{
+		// Cannot copy without destination.
+		return EAP_STATUS_RETURN(
+			m_am_tools,
+			error_complete(
+				eap_status_illegal_parameter,
+				internal_settings,
+				error_completion_function));
+	}
+
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::copy_all_eap_settings(): this=0x%08x: DeleteGeneralSettingsDataL(): EAP-type=0xfe%06x%08x, m_IndexType=%d, m_Index=%d, m_DestinationIndexType=%d, m_DestinationIndex=%d\n"),
+		this,
+		internal_settings->m_EAPType.get_vendor_id(),
+		internal_settings->m_EAPType.get_vendor_type(),
+		internal_settings->m_IndexType,
+		internal_settings->m_Index,
+		internal_settings->m_DestinationIndexType,
+		internal_settings->m_DestinationIndex));
+
+	TRAP(error, (CopyGeneralSettingsDataL(
+		internal_settings->m_IndexType,
+		internal_settings->m_Index,
+		internal_settings->m_DestinationIndexType,
+		internal_settings->m_DestinationIndex)));
+	if (error != KErrNone)
+	{
+		EAP_TRACE_ERROR(
+			m_am_tools,
+			TRACE_FLAGS_ERROR,
+			(EAPL("ERROR: eap_am_general_settings_symbian_c::copy_all_eap_settings(): EAP-type=0xfe%06x%08x, m_IndexType=%d, m_Index=%d, m_DestinationIndexType=%d, m_DestinationIndex=%d, error=%d.\n"),
+			internal_settings->m_EAPType.get_vendor_id(),
+			internal_settings->m_EAPType.get_vendor_type(),
+			internal_settings->m_IndexType,
+			internal_settings->m_Index,
+			internal_settings->m_DestinationIndexType,
+			internal_settings->m_DestinationIndex,
+			error));
+		return EAP_STATUS_RETURN(
+			m_am_tools,
+			error_complete(
+				m_am_tools->convert_am_error_to_eapol_error(error),
+				internal_settings,
+				error_completion_function));
+	}
+
+	{
+		RPointerArray<TEapExpandedType> plugins;
+
+		PointerArrayResetAndDestroy<TEapExpandedType> aAutomaticPlugins(&plugins, EFalse);
+
+		EapPluginTools aPluginTool;
+
+		TEapExpandedType aTunnelingType(*EapExpandedTypeNone.GetType());
+
+		EAP_TRACE_DEBUG(
+			m_am_tools,
+			TRACE_FLAGS_DEFAULT,
+			(EAPL("eap_am_general_settings_symbian_c::copy_all_eap_settings(): this=0x%08x: aPluginTool.ListAllEapPluginsL(): tunneling EAP-type=0xfe%06x%08x, m_IndexType=%d, m_Index=%d, m_DestinationIndexType=%d, m_DestinationIndex=%d\n"),
+			this,
+			aTunnelingType.GetVendorId(),
+			aTunnelingType.GetVendorType(),
+			internal_settings->m_IndexType,
+			internal_settings->m_Index,
+			internal_settings->m_DestinationIndexType,
+			internal_settings->m_DestinationIndex));
+
+		// This will list all outer EAP-methods because aTunnelingType = None.
+		TRAP(error, (aPluginTool.ListAllEapPluginsL(static_cast<TIndexType>(internal_settings->m_IndexType), aTunnelingType, plugins)));
+		if (error != KErrNone)
+		{
+			EAP_TRACE_ERROR(
+				m_am_tools,
+				TRACE_FLAGS_ERROR,
+				(EAPL("ERROR: eap_am_general_settings_symbian_c::copy_all_eap_settings(): aPluginTool.ListAllEapPluginsL() failed, tunneling EAP-type=0xfe%06x%08x, m_IndexType=%d, m_Index=%d, m_DestinationIndexType=%d, m_DestinationIndex=%d, error=%d.\n"),
+				aTunnelingType.GetVendorId(),
+				aTunnelingType.GetVendorType(),
+				internal_settings->m_IndexType,
+				internal_settings->m_Index,
+				internal_settings->m_DestinationIndexType,
+				internal_settings->m_DestinationIndex,
+				error));
+
+			return EAP_STATUS_RETURN(
+				m_am_tools,
+				error_complete(
+					m_am_tools->convert_am_error_to_eapol_error(error),
+					internal_settings,
+					error_completion_function));
+		}
+
+		TUint ind_outer(0ul);
+
+		for (ind_outer = 0ul; ind_outer < plugins.Count(); ++ind_outer)
+		{
+
+			// List all plugins that could be used inside the each outer EAP-method on each plugin.
+
+			RPointerArray<TEapExpandedType> tunneled_plugins;
+
+			PointerArrayResetAndDestroy<TEapExpandedType> aAutomaticTunneledPlugins(&tunneled_plugins, EFalse);
+
+			EAP_TRACE_DEBUG(
+				m_am_tools,
+				TRACE_FLAGS_DEFAULT,
+				(EAPL("eap_am_general_settings_symbian_c::copy_all_eap_settings(): this=0x%08x: aPluginTool.ListAllEapPluginsL(): tunneling EAP-type=0xfe%06x%08x, m_IndexType=%d, m_Index=%d, m_DestinationIndexType=%d, m_DestinationIndex=%d\n"),
+				this,
+				plugins[ind_outer]->GetVendorId(),
+				plugins[ind_outer]->GetVendorType(),
+				internal_settings->m_IndexType,
+				internal_settings->m_Index,
+				internal_settings->m_DestinationIndexType,
+				internal_settings->m_DestinationIndex));
+
+			// This will list all inner EAP-methods of EAP-type.
+			TRAP(error, (aPluginTool.ListAllEapPluginsL(static_cast<TIndexType>(internal_settings->m_IndexType), plugins[ind_outer], tunneled_plugins)));
+			if (error != KErrNone)
+			{
+				EAP_TRACE_ERROR(
+					m_am_tools,
+					TRACE_FLAGS_ERROR,
+					(EAPL("ERROR: eap_am_general_settings_symbian_c::copy_all_eap_settings(): aPluginTool.ListAllEapPluginsL() failed, tunneling EAP-type=0xfe%06x%08x, m_IndexType=%d, m_Index=%d, m_DestinationIndexType=%d, m_DestinationIndex=%d, error=%d.\n"),
+					plugins[ind_outer]->GetVendorId(),
+					plugins[ind_outer]->GetVendorType(),
+					internal_settings->m_IndexType,
+					internal_settings->m_Index,
+					internal_settings->m_DestinationIndexType,
+					internal_settings->m_DestinationIndex,
+					error));
+
+				return EAP_STATUS_RETURN(
+					m_am_tools,
+					error_complete(
+						m_am_tools->convert_am_error_to_eapol_error(error),
+						internal_settings,
+						error_completion_function));
+			}
+
+
+			// Copy possible configuration of each inner EAP-method that could be configured inside of outer EAP-method.
+
+			TUint ind_inner(0ul);
+
+			for (ind_inner = 0ul; ind_inner < tunneled_plugins.Count(); ++ind_inner)
+			{
+				CEapTypePlugin * eapType = NULL;
+
+				EAP_TRACE_DEBUG(
+					m_am_tools,
+					TRACE_FLAGS_DEFAULT,
+					(EAPL("eap_am_general_settings_symbian_c::copy_all_eap_settings(): this=0x%08x: CEapTypePlugin::NewL(): EAP-type=0xfe%06x%08x, m_IndexType=%d, m_Index=%d, m_DestinationIndexType=%d, m_DestinationIndex=%d\n"),
+					this,
+					tunneled_plugins[ind_inner]->GetVendorId(),
+					tunneled_plugins[ind_inner]->GetVendorType(),
+					internal_settings->m_IndexType,
+					internal_settings->m_Index,
+					internal_settings->m_DestinationIndexType,
+					internal_settings->m_DestinationIndex));
+
+				TRAP(error, (eapType = CEapTypePlugin::NewL(
+					tunneled_plugins[ind_inner]->GetValue(),
+					static_cast<TIndexType>(internal_settings->m_IndexType),
+					internal_settings->m_Index)));
+
+				// This will automatically delete eapType.
+				eap_automatic_variable_c<CEapTypePlugin> automatic_eap_type(
+					m_am_tools,
+					eapType);
+
+				if(error != KErrNone
+					|| eapType == NULL)
+				{
+					EAP_TRACE_ERROR(
+						m_am_tools,
+						TRACE_FLAGS_ERROR,
+						(EAPL("ERROR: eap_am_general_settings_symbian_c::copy_all_eap_settings(): CEapTypePlugin::NewL() failed, EAP-type=0xfe%06x%08x, m_IndexType=%d, m_Index=%d, m_DestinationIndexType=%d, m_DestinationIndex=%d, error=%d.\n"),
+						tunneled_plugins[ind_inner]->GetVendorId(),
+						tunneled_plugins[ind_inner]->GetVendorType(),
+						internal_settings->m_IndexType,
+						internal_settings->m_Index,
+						internal_settings->m_DestinationIndexType,
+						internal_settings->m_DestinationIndex,
+						error));
+
+					return EAP_STATUS_RETURN(
+						m_am_tools,
+						error_complete(
+							m_am_tools->convert_am_error_to_eapol_error(error),
+							internal_settings,
+							error_completion_function));
+				}
+				
+			    eapType->SetTunnelingType(plugins[ind_outer]);
+
+				EAP_TRACE_DEBUG(
+					m_am_tools,
+					TRACE_FLAGS_DEFAULT,
+					(EAPL("eap_am_general_settings_symbian_c::copy_all_eap_settings(): this=0x%08x: eapType->CopySettingsL(): EAP-type=0xfe%06x%08x, m_IndexType=%d, m_Index=%d, m_DestinationIndexType=%d, m_DestinationIndex=%d\n"),
+					this,
+					tunneled_plugins[ind_inner]->GetVendorId(),
+					tunneled_plugins[ind_inner]->GetVendorType(),
+					internal_settings->m_IndexType,
+					internal_settings->m_Index,
+					internal_settings->m_DestinationIndexType,
+					internal_settings->m_DestinationIndex));
+
+				TRAP(error, (eapType->CopySettingsL(
+					static_cast<TIndexType>(internal_settings->m_DestinationIndexType),
+					internal_settings->m_DestinationIndex)));
+				if(error != KErrNone)
+				{
+					EAP_TRACE_ERROR(
+						m_am_tools,
+						TRACE_FLAGS_ERROR,
+						(EAPL("ERROR: eap_am_general_settings_symbian_c::copy_all_eap_settings(): eapType->CopySettingsL() failed, EAP-type=0xfe%06x%08x, m_IndexType=%d, m_Index=%d, m_DestinationIndexType=%d, m_DestinationIndex=%d, error=%d.\n"),
+						tunneled_plugins[ind_inner]->GetVendorId(),
+						tunneled_plugins[ind_inner]->GetVendorType(),
+						internal_settings->m_IndexType,
+						internal_settings->m_Index,
+						internal_settings->m_DestinationIndexType,
+						internal_settings->m_DestinationIndex,
+						error));
+
+					return EAP_STATUS_RETURN(
+						m_am_tools,
+						error_complete(
+							m_am_tools->convert_am_error_to_eapol_error(error),
+							internal_settings,
+							error_completion_function));
+				}
+
+			} // for()
+
+
+			{
+
+				// Copy possible configuration of each outer EAP-method on each plugin.
+
+				EAP_TRACE_DEBUG(
+					m_am_tools,
+					TRACE_FLAGS_DEFAULT,
+					(EAPL("eap_am_general_settings_symbian_c::copy_all_eap_settings(): this=0x%08x: CEapTypePlugin::NewL(): outer EAP-type=0xfe%06x%08x, m_IndexType=%d, m_Index=%d, m_DestinationIndexType=%d, m_DestinationIndex=%d\n"),
+					this,
+					plugins[ind_outer]->GetVendorId(),
+					plugins[ind_outer]->GetVendorType(),
+					internal_settings->m_IndexType,
+					internal_settings->m_Index,
+					internal_settings->m_DestinationIndexType,
+					internal_settings->m_DestinationIndex));
+
+				CEapTypePlugin * eapType = NULL;
+
+				TRAP(error, (eapType = CEapTypePlugin::NewL(
+					plugins[ind_outer]->GetValue(),
+					static_cast<TIndexType>(internal_settings->m_IndexType),
+					internal_settings->m_Index)));
+
+				// This will automatically delete eapType.
+				eap_automatic_variable_c<CEapTypePlugin> automatic_eap_type(
+					m_am_tools,
+					eapType);
+				
+				if(error != KErrNone
+					|| eapType == NULL)
+				{
+					EAP_TRACE_ERROR(
+						m_am_tools,
+						TRACE_FLAGS_ERROR,
+						(EAPL("ERROR: eap_am_general_settings_symbian_c::copy_all_eap_settings(): CEapTypePlugin::NewL() failed, outer EAP-type=0xfe%06x%08x, m_IndexType=%d, m_Index=%d, m_DestinationIndexType=%d, m_DestinationIndex=%d, error=%d.\n"),
+						plugins[ind_outer]->GetVendorId(),
+						plugins[ind_outer]->GetVendorType(),
+						internal_settings->m_IndexType,
+						internal_settings->m_Index,
+						internal_settings->m_DestinationIndexType,
+						internal_settings->m_DestinationIndex,
+						error));
+
+					return EAP_STATUS_RETURN(
+						m_am_tools,
+						error_complete(
+							m_am_tools->convert_am_error_to_eapol_error(error),
+							internal_settings,
+							error_completion_function));
+				}
+				
+				EAP_TRACE_DEBUG(
+					m_am_tools,
+					TRACE_FLAGS_DEFAULT,
+					(EAPL("eap_am_general_settings_symbian_c::copy_all_eap_settings(): this=0x%08x: eapType->CopySettingsL(): outer EAP-type=0xfe%06x%08x, m_IndexType=%d, m_Index=%d, m_DestinationIndexType=%d, m_DestinationIndex=%d\n"),
+					this,
+					plugins[ind_outer]->GetVendorId(),
+					plugins[ind_outer]->GetVendorType(),
+					internal_settings->m_IndexType,
+					internal_settings->m_Index,
+					internal_settings->m_DestinationIndexType,
+					internal_settings->m_DestinationIndex));
+
+				TRAP(error, (eapType->CopySettingsL(
+					static_cast<TIndexType>(internal_settings->m_DestinationIndexType),
+					internal_settings->m_DestinationIndex)));
+				if(error != KErrNone)
+				{
+					EAP_TRACE_ERROR(
+						m_am_tools,
+						TRACE_FLAGS_ERROR,
+						(EAPL("ERROR: eap_am_general_settings_symbian_c::copy_all_eap_settings(): eapType->CopySettingsL() failed, outer EAP-type=0xfe%06x%08x, m_IndexType=%d, m_Index=%d, m_DestinationIndexType=%d, m_DestinationIndex=%d, error=%d.\n"),
+						plugins[ind_outer]->GetVendorId(),
+						plugins[ind_outer]->GetVendorType(),
+						internal_settings->m_IndexType,
+						internal_settings->m_Index,
+						internal_settings->m_DestinationIndexType,
+						internal_settings->m_DestinationIndex,
+						error));
+
+					return EAP_STATUS_RETURN(
+						m_am_tools,
+						error_complete(
+							m_am_tools->convert_am_error_to_eapol_error(error),
+							internal_settings,
+							error_completion_function));
+				}
+			}
+
+		} // for()
+
+	}
+
+	complete_settings->m_completion_status = eap_status_ok;
+	complete_settings->m_EAPType = internal_settings->m_EAPType;
+	complete_settings->m_IndexType = internal_settings->m_IndexType;
+	complete_settings->m_Index = internal_settings->m_Index;
+
+	eap_status_e status = m_partner->complete_copy_all_eap_settings(complete_settings);
+
+	iGeneralSettingsDb.Compact();
+
+	CloseGeneralSettings();
+
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_general_settings_symbian_c::get_eap_methods(): this=0x%08x, CloseGeneralSettings()\n"),
+		this));
+
+	return EAP_STATUS_RETURN(m_am_tools, status);
+}
+
+// ----------------------------------------------------------------------
+// End