eapol/eapol_framework/eapol_symbian/eap_if/src/EapGeneralSettingsImpl.cpp
branchRCL_3
changeset 18 bad0cc58d154
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eapol/eapol_framework/eapol_symbian/eap_if/src/EapGeneralSettingsImpl.cpp	Tue Aug 31 15:16:37 2010 +0300
@@ -0,0 +1,850 @@
+/*
+* Copyright (c) 2001-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:  This is implementation of CEapGeneralSettings interface.
+*
+*/
+
+/*
+* %version: 49 %
+*/
+
+// This is enumeration of EAPOL source code.
+#if defined(USE_EAP_MINIMUM_RELEASE_TRACES)
+	#undef EAP_FILE_NUMBER_ENUM
+	#define EAP_FILE_NUMBER_ENUM 740 
+	#undef EAP_FILE_NUMBER_DATE 
+	#define EAP_FILE_NUMBER_DATE 1127594498 
+#endif //#if defined(USE_EAP_MINIMUM_RELEASE_TRACES)
+
+
+// INCLUDE FILES
+
+#include "EapGeneralSettingsImpl.h"
+#include "EapConversion.h"
+#include "eap_am_assert.h"
+#include <EapTypeInfo.h>
+#include "abs_eap_am_tools.h"
+#include "eap_automatic_variable.h"
+#include <utf.h>                           // for CnvUtfConverter
+#include "abs_eap_am_message_if.h"
+#include "eap_am_message_if.h"
+#include "eap_automatic_variable.h"
+#include "eap_general_settings_message.h"
+#include "eap_am_message_if_symbian.h"
+#include "eap_process_tlv_message_data.h"
+#include "eap_general_settings_client_message_if.h"
+
+// LOCAL CONSTANTS
+
+// The version number of this interface.
+const TUint KInterfaceVersion = 1;
+
+
+// ================= MEMBER FUNCTIONS =======================
+
+CEapGeneralSettingsImpl::CEapGeneralSettingsImpl(
+	const TIndexType aIndexType,	
+	const TInt aIndex)
+: m_am_tools(abs_eap_am_tools_c::new_abs_eap_am_tools_c())
+, m_server(new_eap_general_settings_client_message_if_c(
+		m_am_tools,
+		this))
+, iIndexType(aIndexType)
+, iIndex(aIndex)
+, iActiveEapMethods(0)
+, iDisabledEapMethods(0)
+, iUserCerts(0)
+, iCACerts(0)
+, iWaitState(eap_general_settings_wait_state_none)
+, iCompletionStatus(eap_status_process_general_error)
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("CEapGeneralSettingsImpl::CEapGeneralSettingsImpl(): this=0x%08x.\n"),
+		this));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: CEapGeneralSettingsImpl::CEapGeneralSettingsImpl()");
+
+}
+
+// ----------------------------------------------------------
+
+void CEapGeneralSettingsImpl::ConstructL()
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("CEapGeneralSettingsImpl::ConstructL(): this=0x%08x.\n"),
+		this));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: CEapGeneralSettingsImpl::ConstructL()");
+
+	if (m_am_tools == 0
+		|| m_am_tools->get_is_valid() == false
+		|| m_server == 0
+		|| m_server->get_is_valid() == false)
+	{
+		abs_eap_am_tools_c::delete_abs_eap_am_tools_c(m_am_tools);
+		delete m_server;
+
+		User::Leave(KErrNoMemory);
+	}
+
+	eap_status_e status = m_server->configure();
+	if (status != eap_status_ok)
+	{
+		TInt aStatus = m_am_tools->convert_eapol_error_to_am_error(status);
+			
+		abs_eap_am_tools_c::delete_abs_eap_am_tools_c(m_am_tools);
+		delete m_server;
+
+		User::Leave(aStatus);
+	}
+}
+
+// ----------------------------------------------------------
+
+CEapGeneralSettingsImpl* CEapGeneralSettingsImpl::NewL(SIapInfo* aIapInfo)
+{
+	CEapGeneralSettingsImpl* self = new(ELeave) CEapGeneralSettingsImpl(aIapInfo->indexType, aIapInfo->index);
+
+	CleanupStack::PushL(self);
+
+	self->ConstructL();
+
+	CleanupStack::Pop();
+
+	return self;
+}
+
+// ----------------------------------------------------------
+
+CEapGeneralSettingsImpl::~CEapGeneralSettingsImpl()
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("CEapGeneralSettingsImpl::~CEapGeneralSettingsImpl(): this=0x%08x.\n"),
+		this));
+
+	if (m_server != 0)
+	{
+		m_server->shutdown();
+	}
+	delete m_server;
+
+	abs_eap_am_tools_c::delete_abs_eap_am_tools_c(m_am_tools);
+}
+
+// ----------------------------------------------------------
+
+TUint CEapGeneralSettingsImpl::GetInterfaceVersion()
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("CEapGeneralSettingsImpl::GetInterfaceVersion(): this=0x%08x\n"),
+		this));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: CEapGeneralSettingsImpl::GetInterfaceVersion()");
+
+	return KInterfaceVersion;
+}
+
+//----------------------------------------------------------------
+
+void CEapGeneralSettingsImpl::Activate()
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("CEapGeneralSettingsImpl::Activate(): iAsyncronousStatus=%u\n"),
+		iAsyncronousStatus.Int()));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: CEapGeneralSettingsImpl::Activate()");
+
+	iAsyncronousStatus = KRequestPending;
+
+}
+
+//----------------------------------------------------------------
+
+void CEapGeneralSettingsImpl::Complete()
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("CEapGeneralSettingsImpl::Complete(): iAsyncronousStatus=%u\n"),
+		iAsyncronousStatus.Int()));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: CEapGeneralSettingsImpl::Complete()");
+
+	iAsyncronousStatus = KErrNone;
+
+	// This is needed to continue the execution after Wait.Start(); 
+	iWait.AsyncStop();
+}
+
+//----------------------------------------------------------------
+
+void CEapGeneralSettingsImpl::WaitCompletion()
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("CEapGeneralSettingsImpl::WaitCompletion(): iAsyncronousStatus=%u\n"),
+		iAsyncronousStatus.Int()));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: CEapGeneralSettingsImpl::WaitCompletion()");
+
+	while (iAsyncronousStatus == KRequestPending)
+	{
+		EAP_TRACE_DEBUG(
+			m_am_tools,
+			TRACE_FLAGS_DEFAULT,
+			(EAPL("CEapGeneralSettingsImpl::WaitCompletion(): calls iWait.Start()\n")));
+
+		iWait.Start();
+
+		EAP_TRACE_DEBUG(
+			m_am_tools,
+			TRACE_FLAGS_DEFAULT,
+			(EAPL("CEapGeneralSettingsImpl::WaitCompletion(): iWait.Start() returns, iAsyncronousStatus=%u\n"),
+			iAsyncronousStatus.Int()));
+	}
+}
+
+// ----------------------------------------------------------
+
+void CEapGeneralSettingsImpl::SetCompletionStatusIfStillOk(const eap_status_e status)
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("CEapGeneralSettingsImpl::SetCompletionStatusIfStillOk(): iCompletionStatus=%d=%s, status=%d=%s\n"),
+		iCompletionStatus,
+		eap_status_string_c::get_status_string(iCompletionStatus),
+		status,
+		eap_status_string_c::get_status_string(status)));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: CEapGeneralSettingsImpl::SetCompletionStatusIfStillOk()");
+
+	if (iCompletionStatus == eap_status_ok)
+	{
+		iCompletionStatus = status;
+	}
+}
+
+// ----------------------------------------------------------
+
+TInt CEapGeneralSettingsImpl::GetEapMethods(
+	RArray<TEapExpandedType> & ActiveEapMethods,
+	RArray<TEapExpandedType> & DisabledEapMethods)
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("CEapGeneralSettingsImpl::GetEapMethods(): this=0x%08x.\n"),
+		this));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: CEapGeneralSettingsImpl::GetEapMethods()");
+
+	eap_method_settings_c * const internal_settings = new eap_method_settings_c(m_am_tools);
+
+	eap_automatic_variable_c<eap_method_settings_c> automatic_internal_settings(
+		m_am_tools,
+		internal_settings);
+
+	if (internal_settings == 0)
+	{
+		return m_am_tools->convert_eapol_error_to_am_error(
+			EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error));
+	}
+
+	internal_settings->m_IndexType = iIndexType;
+	internal_settings->m_Index = iIndex;
+
+	iActiveEapMethods = &ActiveEapMethods;
+	iDisabledEapMethods = &DisabledEapMethods;
+
+	eap_status_e status = m_server->get_eap_methods(internal_settings);
+
+	iWaitState = eap_general_settings_wait_state_complete_get_eap_methods;
+	Activate();
+    WaitCompletion();
+
+	if (iCompletionStatus != eap_status_ok)
+	{
+		return m_am_tools->convert_eapol_error_to_am_error(
+			EAP_STATUS_RETURN(m_am_tools, iCompletionStatus));
+	}
+
+	return m_am_tools->convert_eapol_error_to_am_error(
+			EAP_STATUS_RETURN(m_am_tools, status));
+}
+
+// ----------------------------------------------------------
+
+TInt CEapGeneralSettingsImpl::SetEapMethods(
+	const RArray<TEapExpandedType> & ActiveEapMethods,
+	const RArray<TEapExpandedType> & DisabledEapMethods)
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("CEapGeneralSettingsImpl::SetEapMethods(): this=0x%08x.\n"),
+		this));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: CEapGeneralSettingsImpl::SetEapMethods()");
+
+	eap_method_settings_c * const internal_settings = new eap_method_settings_c(m_am_tools);
+
+	eap_automatic_variable_c<eap_method_settings_c> automatic_internal_settings(
+		m_am_tools,
+		internal_settings);
+
+	if (internal_settings == 0)
+	{
+		return m_am_tools->convert_eapol_error_to_am_error(
+			EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error));
+	}
+
+	internal_settings->m_IndexType = iIndexType;
+	internal_settings->m_Index = iIndex;
+
+
+	TInt error = CEapConversion::ConvertExpandedEAPTypesToInternalTypes(
+		m_am_tools,
+		&ActiveEapMethods,
+		&(internal_settings->m_active_eap_methods));
+	if (error != KErrNone)
+	{
+		return error;
+	}
+
+
+	error = CEapConversion::ConvertExpandedEAPTypesToInternalTypes(
+		m_am_tools,
+		&DisabledEapMethods,
+		&(internal_settings->m_disabled_eap_methods));
+	if (error != KErrNone)
+	{
+		return error;
+	}
+
+	internal_settings->m_SelectedEAPTypesPresent = true;
+
+	eap_status_e status = m_server->set_eap_methods(internal_settings);
+
+	iWaitState = eap_general_settings_wait_state_complete_set_eap_methods;
+	Activate();
+    WaitCompletion();
+
+	if (iCompletionStatus != eap_status_ok)
+	{
+		return m_am_tools->convert_eapol_error_to_am_error(
+			EAP_STATUS_RETURN(m_am_tools, iCompletionStatus));
+	}
+
+	return m_am_tools->convert_eapol_error_to_am_error(
+			EAP_STATUS_RETURN(m_am_tools, status));
+}
+
+// ----------------------------------------------------------
+
+eap_status_e CEapGeneralSettingsImpl::complete_get_eap_methods(
+	const eap_method_settings_c * const internal_settings)
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("CEapGeneralSettingsImpl::complete_get_eap_methods(): this=0x%08x, iWaitState=%d, status=%d=%s\n"),
+		this,
+		iWaitState,
+		internal_settings->m_completion_status,
+		eap_status_string_c::get_status_string(internal_settings->m_completion_status)));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: CEapGeneralSettingsImpl::complete_get_eap_methods()");
+
+	if (internal_settings == 0)
+	{
+		iCompletionStatus = eap_status_illegal_parameter;
+
+		Complete();
+
+		return EAP_STATUS_RETURN(m_am_tools, iCompletionStatus);
+	}
+
+	iCompletionStatus = internal_settings->m_completion_status;
+
+	if (iWaitState == eap_general_settings_wait_state_complete_get_eap_methods
+		&& iCompletionStatus == eap_status_ok)
+	{
+		if (iActiveEapMethods != 0
+			&& iDisabledEapMethods != 0
+			&& internal_settings != 0)
+		{
+			TInt error(KErrNone);
+
+			error = CEapConversion::ConvertInternalTypesToExpandedEAPTypes(
+				m_am_tools,
+				&(internal_settings->m_active_eap_methods),
+				iActiveEapMethods);
+			if (error != KErrNone)
+			{
+				SetCompletionStatusIfStillOk(EAP_STATUS_RETURN(m_am_tools, m_am_tools->convert_am_error_to_eapol_error(error)));
+			}
+			else
+			{
+				error = CEapConversion::ConvertInternalTypesToExpandedEAPTypes(
+					m_am_tools,
+					&(internal_settings->m_disabled_eap_methods),
+					iDisabledEapMethods);
+				if (error != KErrNone)
+				{
+					SetCompletionStatusIfStillOk(EAP_STATUS_RETURN(m_am_tools, m_am_tools->convert_am_error_to_eapol_error(error)));
+				}
+			}
+		}
+		else
+		{
+			SetCompletionStatusIfStillOk(EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter));
+		}
+	}
+	else if (iCompletionStatus == eap_status_ok)
+	{
+		// ERROR, wrong state. Other function was completed successfully not the function that was waited.
+		SetCompletionStatusIfStillOk(EAP_STATUS_RETURN(m_am_tools, eap_status_wrong_eap_type_state));
+	}
+
+	Complete();
+
+	return EAP_STATUS_RETURN(m_am_tools, iCompletionStatus);
+}
+
+// ----------------------------------------------------------
+
+eap_status_e CEapGeneralSettingsImpl::complete_set_eap_methods(
+	const eap_status_e completion_status)
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("CEapGeneralSettingsImpl::complete_set_eap_methods(): this=0x%08x, iWaitState=%d, status=%d=%s\n"),
+		this,
+		iWaitState,
+		completion_status,
+		eap_status_string_c::get_status_string(completion_status)));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: CEapGeneralSettingsImpl::complete_set_eap_methods()");
+
+	iCompletionStatus = completion_status;
+
+	if (iWaitState != eap_general_settings_wait_state_complete_set_eap_methods
+		&& iCompletionStatus == eap_status_ok)
+	{
+		// ERROR, wrong state. Other function was completed successfully not the function that was waited.
+		SetCompletionStatusIfStillOk(EAP_STATUS_RETURN(m_am_tools, eap_status_wrong_eap_type_state));
+	}
+
+	Complete();
+
+	return EAP_STATUS_RETURN(m_am_tools, completion_status);
+}
+
+// ----------------------------------------------------------
+
+TInt CEapGeneralSettingsImpl::GetCertificateLists(
+	RPointerArray<EapCertificateEntry> & aUserCerts,
+	RPointerArray<EapCertificateEntry> & aCACerts)
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("CEapGeneralSettingsImpl::GetCertificateLists(): this=0x%08x.\n"),
+		this));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: CEapGeneralSettingsImpl::GetCertificateLists()");
+
+	eap_method_settings_c * const internal_settings = new eap_method_settings_c(m_am_tools);
+
+	eap_automatic_variable_c<eap_method_settings_c> automatic_internal_settings(
+		m_am_tools,
+		internal_settings);
+
+	if (internal_settings == 0)
+	{
+		return m_am_tools->convert_eapol_error_to_am_error(
+			EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error));
+	}
+
+	internal_settings->m_IndexType = iIndexType;
+	internal_settings->m_Index = iIndex;
+
+	iUserCerts = &aUserCerts;
+	iCACerts = &aCACerts;
+
+	eap_status_e status = m_server->get_certificate_lists(internal_settings);
+
+	iWaitState = eap_general_settings_wait_state_complete_get_certificate_lists;
+	Activate();
+	WaitCompletion();
+
+	if (iCompletionStatus != eap_status_ok)
+	{
+		return m_am_tools->convert_eapol_error_to_am_error(
+			EAP_STATUS_RETURN(m_am_tools, iCompletionStatus));
+	}
+
+	return m_am_tools->convert_eapol_error_to_am_error(
+			EAP_STATUS_RETURN(m_am_tools, status));
+}
+
+// ----------------------------------------------------------
+
+eap_status_e CEapGeneralSettingsImpl::complete_get_certificate_lists(
+	const eap_method_settings_c * const internal_settings)
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("CEapGeneralSettingsImpl::complete_get_certificate_lists(): this=0x%08x, iWaitState=%d, status=%d=%s\n"),
+		this,
+		iWaitState,
+		internal_settings->m_completion_status,
+		eap_status_string_c::get_status_string(internal_settings->m_completion_status)));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: CEapGeneralSettingsImpl::complete_get_certificate_lists()");
+
+	if (internal_settings == 0)
+	{
+		// ERROR
+		iCompletionStatus = eap_status_illegal_parameter;
+
+		Complete();
+
+		return EAP_STATUS_RETURN(m_am_tools, iCompletionStatus);
+	}
+
+	iCompletionStatus = internal_settings->m_completion_status;
+
+	if (iWaitState == eap_general_settings_wait_state_complete_get_certificate_lists
+		&& iCompletionStatus == eap_status_ok)
+	{
+		if (iUserCerts != 0
+			&& iCACerts != 0
+			&& internal_settings != 0)
+		{
+			TInt error = CEapConversion::ConvertInternalTypeToCertificates(
+				m_am_tools,
+				eap_certificate_entry_c::eap_certificate_type_user,
+				&(internal_settings->m_Certificates),
+				iUserCerts);
+			if (error != KErrNone)
+			{
+				// ERROR
+				SetCompletionStatusIfStillOk(EAP_STATUS_RETURN(m_am_tools, m_am_tools->convert_am_error_to_eapol_error(error)));
+			}
+			else
+			{
+				error = CEapConversion::ConvertInternalTypeToCertificates(
+					m_am_tools,
+					eap_certificate_entry_c::eap_certificate_type_CA,
+					&(internal_settings->m_Certificates),
+					iCACerts);
+				if (error != KErrNone)
+				{
+					// ERROR
+					SetCompletionStatusIfStillOk(EAP_STATUS_RETURN(m_am_tools, m_am_tools->convert_am_error_to_eapol_error(error)));
+				}
+			}
+		}
+		else
+		{
+			// ERROR
+			SetCompletionStatusIfStillOk(EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter));
+		}
+	}
+	else if (iCompletionStatus == eap_status_ok)
+	{
+		// ERROR, wrong state. Other function was completed successfully not the function that was waited.
+		SetCompletionStatusIfStillOk(EAP_STATUS_RETURN(m_am_tools, eap_status_wrong_eap_type_state));
+	}
+
+	Complete();
+
+	return EAP_STATUS_RETURN(m_am_tools, iCompletionStatus);
+}
+
+// ----------------------------------------------------------
+
+TInt CEapGeneralSettingsImpl::DeleteAllEapSettings()
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("CEapGeneralSettingsImpl::DeleteAllEapSettings(): this=0x%08x.\n"),
+		this));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: CEapGeneralSettingsImpl::DeleteAllEapSettings()");
+
+	eap_method_settings_c * const internal_settings = new eap_method_settings_c(m_am_tools);
+
+	eap_automatic_variable_c<eap_method_settings_c> automatic_internal_settings(
+		m_am_tools,
+		internal_settings);
+
+	if (internal_settings == 0)
+	{
+		return m_am_tools->convert_eapol_error_to_am_error(
+			EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error));
+	}
+
+	internal_settings->m_IndexType = iIndexType;
+	internal_settings->m_Index = iIndex;
+
+	eap_status_e status = m_server->delete_all_eap_settings(internal_settings);
+
+	iWaitState = eap_general_settings_wait_state_complete_delete_all_eap_settings;
+	Activate();
+	WaitCompletion();
+
+	if (iCompletionStatus != eap_status_ok)
+	{
+		return m_am_tools->convert_eapol_error_to_am_error(
+			EAP_STATUS_RETURN(m_am_tools, iCompletionStatus));
+	}
+
+	return m_am_tools->convert_eapol_error_to_am_error(
+			EAP_STATUS_RETURN(m_am_tools, status));
+}
+
+// ----------------------------------------------------------
+
+TInt CEapGeneralSettingsImpl::CopyAllEapSettings(
+	const TIndexType aDestinationIndexType,
+	const TInt aDestinationIndex)
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("CEapGeneralSettingsImpl::CopyAllEapSettings(): this=0x%08x.\n"),
+		this));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: CEapGeneralSettingsImpl::CopyAllEapSettings()");
+
+	eap_method_settings_c * const internal_settings = new eap_method_settings_c(m_am_tools);
+
+	eap_automatic_variable_c<eap_method_settings_c> automatic_internal_settings(
+		m_am_tools,
+		internal_settings);
+
+	if (internal_settings == 0)
+	{
+		return m_am_tools->convert_eapol_error_to_am_error(
+			EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error));
+	}
+
+	internal_settings->m_IndexType = iIndexType;
+	internal_settings->m_Index = iIndex;
+	internal_settings->m_DestinationIndexType = aDestinationIndexType;
+	internal_settings->m_DestinationIndex = aDestinationIndex;
+
+	eap_status_e status = m_server->copy_all_eap_settings(internal_settings);
+
+	iWaitState = eap_general_settings_wait_state_complete_copy_all_eap_settings;
+	Activate();
+	WaitCompletion();
+
+	if (iCompletionStatus != eap_status_ok)
+	{
+		return m_am_tools->convert_eapol_error_to_am_error(
+			EAP_STATUS_RETURN(m_am_tools, iCompletionStatus));
+	}
+
+	return m_am_tools->convert_eapol_error_to_am_error(
+			EAP_STATUS_RETURN(m_am_tools, status));
+}
+
+// ----------------------------------------------------------
+
+eap_status_e CEapGeneralSettingsImpl::complete_delete_all_eap_settings(
+	const eap_status_e completion_status)
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("CEapGeneralSettingsImpl::complete_delete_all_eap_settings(): this=0x%08x, iWaitState=%d, status=%d=%s\n"),
+		this,
+		iWaitState,
+		completion_status,
+		eap_status_string_c::get_status_string(completion_status)));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: CEapGeneralSettingsImpl::complete_delete_all_eap_settings()");
+
+	iCompletionStatus = completion_status;
+
+	if (iWaitState != eap_general_settings_wait_state_complete_delete_all_eap_settings
+		&& iCompletionStatus == eap_status_ok)
+	{
+		// ERROR, wrong state. Other function was completed successfully not the function that was waited.
+		SetCompletionStatusIfStillOk(EAP_STATUS_RETURN(m_am_tools, eap_status_wrong_eap_type_state));
+	}
+
+	Complete();
+
+	return EAP_STATUS_RETURN(m_am_tools, completion_status);
+}
+
+// ----------------------------------------------------------
+
+eap_status_e CEapGeneralSettingsImpl::complete_copy_all_eap_settings(
+	const eap_status_e completion_status)
+{
+	EAP_TRACE_DEBUG(
+		m_am_tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("CEapGeneralSettingsImpl::complete_copy_all_eap_settings(): this=0x%08x, iWaitState=%d, status=%d=%s\n"),
+		this,
+		iWaitState,
+		completion_status,
+		eap_status_string_c::get_status_string(completion_status)));
+
+	EAP_TRACE_RETURN_STRING(m_am_tools, "returns: CEapGeneralSettingsImpl::complete_copy_all_eap_settings()");
+
+	iCompletionStatus = completion_status;
+
+	if (iWaitState != eap_general_settings_wait_state_complete_copy_all_eap_settings
+		&& iCompletionStatus == eap_status_ok)
+	{
+		// ERROR, wrong state. Other function was completed successfully not the function that was waited.
+		SetCompletionStatusIfStillOk(EAP_STATUS_RETURN(m_am_tools, eap_status_wrong_eap_type_state));
+	}
+
+	Complete();
+
+	return EAP_STATUS_RETURN(m_am_tools, completion_status);
+}
+
+// ----------------------------------------------------------
+// ----------------------------------------------------------
+// ----------------------------------------------------------
+
+eap_am_message_if_c * eap_am_message_if_c::new_eap_am_message_if_c(
+	abs_eap_am_tools_c * const tools)
+{
+	EAP_TRACE_DEBUG(
+		tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("eap_am_message_if_c::new_eap_am_server_general_settings_c()\n")));
+
+	EAP_TRACE_RETURN_STRING(tools, "returns: eap_am_message_if_c::new_eap_am_message_if_c()");
+
+    eap_am_message_if_c *client_if = new eap_am_message_if_symbian_c(tools, EEapSettingsNew);
+
+	eap_automatic_variable_c<eap_am_message_if_c> automatic_client_if(
+		tools,
+		client_if);
+
+	if (client_if == 0
+		|| client_if->get_is_valid() == false)
+	{
+		// ERROR.
+		if (client_if != 0)
+		{
+			EAP_TRACE_DEBUG(
+				tools,
+				TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT, 
+				(EAPL("ERROR: calls: eap_am_message_if_c::new_eap_am_server_general_settings_c(): client_if->shutdown()\n")));
+
+			client_if->shutdown();
+		}
+		return 0;
+	}
+
+	automatic_client_if.do_not_free_variable();
+
+	return client_if;
+
+}
+
+// ----------------------------------------------------------
+
+eap_general_settings_message_c * new_eap_general_settings_client_message_if_c(
+	abs_eap_am_tools_c * const tools,
+	abs_eap_general_settings_message_c * const partner)
+{
+	EAP_TRACE_DEBUG(
+		tools,
+		TRACE_FLAGS_DEFAULT,
+		(EAPL("new_eap_general_settings_client_message_if_c()\n")));
+
+	EAP_TRACE_RETURN_STRING(tools, "returns: new_eap_general_settings_client_message_if_c()");
+
+	eap_am_message_if_c *client_if = eap_am_message_if_c::new_eap_am_message_if_c(
+		tools);
+
+	eap_automatic_variable_c<eap_am_message_if_c> automatic_client_if(
+		tools,
+		client_if);
+
+	if (client_if == 0
+		|| client_if->get_is_valid() == false)
+	{
+		// ERROR.
+		if (client_if != 0)
+		{
+			EAP_TRACE_DEBUG(
+				tools,
+				TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT, 
+				(EAPL("ERROR: calls: new_eap_general_settings_client_message_if_c(): client_if->shutdown()\n")));
+
+			(void) client_if->shutdown();
+		}
+		return 0;
+	}
+
+	eap_general_settings_client_message_if_c * new_session_core = new eap_general_settings_client_message_if_c(tools, client_if, partner);
+
+	eap_automatic_variable_c<eap_general_settings_client_message_if_c> automatic_new_session_core(
+		tools,
+		new_session_core);
+
+	if (new_session_core == 0
+		|| new_session_core->get_is_valid() == false)
+	{
+		// ERROR.
+		if (new_session_core != 0)
+		{
+			EAP_TRACE_DEBUG(
+				tools,
+				TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT, 
+				(EAPL("ERROR: calls: new_eap_general_settings_client_message_if_c(): new_session_core->shutdown()\n")));
+
+			new_session_core->shutdown();
+		}
+		return 0;
+	}
+
+	client_if->set_partner(new_session_core);
+
+	automatic_client_if.do_not_free_variable();
+	automatic_new_session_core.do_not_free_variable();
+
+	return new_session_core;
+}
+
+// ----------------------------------------------------------
+// End of file