eapol/eapol_framework/eapol_common/include/eap_configuration_field.h
changeset 0 c8830336c852
child 2 1c7bc153c08e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eapol/eapol_framework/eapol_common/include/eap_configuration_field.h	Thu Dec 17 08:47:43 2009 +0200
@@ -0,0 +1,255 @@
+/*
+* Copyright (c) 2001-2006 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  EAP and WLAN authentication protocols.
+*
+*/
+
+
+
+
+#if !defined(_EAP_CONFIGURATION_FIELD_H_)
+#define _EAP_CONFIGURATION_FIELD_H_
+
+#include "eap_am_memory.h"
+#include "eap_am_types.h"
+#include "eap_am_tools.h"
+
+
+const char EAP_FILECONFIG_SECTION_SEPARATOR[] = ":";
+const u32_t EAP_FILECONFIG_SECTION_SEPARATOR_LENGTH = (sizeof(EAP_FILECONFIG_SECTION_SEPARATOR)-1ul);
+
+
+//--------------------------------------------------------------------------------------------------
+
+enum eap_configure_type_e
+{
+	eap_configure_type_none,
+	eap_configure_type_u32_t,
+	eap_configure_type_boolean,
+	eap_configure_type_string,
+	eap_configure_type_hex_data,
+	eap_configure_type_u32array,
+	eap_configure_type_section,
+	eap_configure_type_subsection,
+};
+
+//--------------------------------------------------------------------------------------------------
+
+class eap_configuration_field_c
+{
+public:
+
+	~eap_configuration_field_c()
+	{
+		delete m_subsection_name;
+		m_subsection_name = 0;
+	}
+
+	const bool get_is_secret() const
+	{
+		return m_is_secret;
+	}
+
+	const eap_configure_type_e get_type() const
+	{
+		return m_type;
+	}
+
+	const u32_t get_field_length() const
+	{
+		return m_field_length;
+	}
+
+	eap_config_string get_field() const
+	{
+		return m_field;
+	}
+
+	eap_status_e set_subsection(
+		abs_eap_am_tools_c * const tools,
+		const eap_configuration_field_c * const p_subsection_name,
+		const eap_variable_data_c * const p_subsection_value)
+	{
+		delete m_subsection_name;
+		m_subsection_name = 0;
+
+		m_subsection_name = new eap_variable_data_c(tools);
+		if (m_subsection_name == 0)
+		{
+			return EAP_STATUS_RETURN(tools, eap_status_allocation_error);
+		}
+
+		eap_status_e status = m_subsection_name->add_data(
+			p_subsection_name->get_field(),
+			p_subsection_name->get_field_length());
+		if (status != eap_status_ok)
+		{
+			return EAP_STATUS_RETURN(tools, status);
+		}
+
+		status = m_subsection_name->add_data(
+			EAP_FILECONFIG_SECTION_SEPARATOR,
+			EAP_FILECONFIG_SECTION_SEPARATOR_LENGTH);
+		if (status != eap_status_ok)
+		{
+			return EAP_STATUS_RETURN(tools, status);
+		}
+
+		status = m_subsection_name->add_data(
+			p_subsection_value->get_data(),
+			p_subsection_value->get_data_length());
+		if (status != eap_status_ok)
+		{
+			return EAP_STATUS_RETURN(tools, status);
+		}
+
+		return EAP_STATUS_RETURN(tools, eap_status_ok);
+	}
+
+	const eap_variable_data_c * get_subsection() const
+	{
+		return m_subsection_name;
+	}
+
+	bool compare(
+		abs_eap_am_tools_c * const tools,
+		const eap_configuration_field_c * const field) const
+	{
+		return field->get_field_length() == get_field_length()
+			&& tools->memcmp(
+				field->get_field(),
+				get_field(),
+				field->get_field_length()) == 0;
+	}
+
+
+	bool compare(
+		abs_eap_am_tools_c * const tools,
+		const eap_variable_data_c * const data) const
+	{
+		return data->get_data_length() == get_field_length()
+			&& tools->memcmp(
+				data->get_data(),
+				get_field(),
+				data->get_data_length()) == 0;
+	}
+
+	eap_configuration_field_c * copy(
+		abs_eap_am_tools_c * const tools,
+		const eap_configuration_field_c * const p_subsection_name,
+		const eap_variable_data_c * const p_subsection_value) const
+	{
+		// This allocates memory for object and following field.
+		u32_t data_length = sizeof(eap_configuration_field_c) + m_field_length;
+		u8_t * const new_buffer = new u8_t[data_length];
+		if (new_buffer == 0)
+		{
+			return 0;
+		}
+
+		eap_configuration_field_c * tmp = reinterpret_cast<eap_configuration_field_c *>(new_buffer);
+
+		tools->memmove(tmp, this, data_length);
+
+		eap_status_e status = tmp->set_subsection(
+			tools,
+			p_subsection_name,
+			p_subsection_value);
+		if (status != eap_status_ok
+			|| tmp->get_subsection() == 0)
+		{
+			delete tmp;
+			tmp = 0;
+		}
+
+		return tmp;
+	}
+
+private:
+	bool                 m_is_secret;
+	eap_configure_type_e m_type;
+	eap_variable_data_c *m_subsection_name;
+	u32_t                m_field_length;
+	i8_t                 m_field[1];
+};
+
+//--------------------------------------------------------------------------------------------------
+
+template <u32_t buffer_length>
+class eap_configuration_field_template_c
+{
+public:
+	inline const eap_configuration_field_c * get_field() const;
+
+	inline eap_status_e set_fields(
+		abs_eap_am_tools_c* const am_tools,
+		const void * const field,
+		const eap_configure_type_e type,
+		const bool is_secret)
+	{
+		m_is_secret = false;
+		m_type = eap_configure_type_none;
+
+		u32_t field_length = (static_cast<eap_am_tools_c *> (am_tools))->strlen(
+			static_cast<const eap_char *>(field));
+		if (field_length+1 > buffer_length)
+		{
+			m_field_length = 0ul;
+			m_field[0] = '\0';
+			return EAP_STATUS_RETURN(am_tools, eap_status_allocation_error);
+		}
+
+		m_is_secret = is_secret;
+		m_type = type;
+		am_tools->memmove(m_field, field, field_length+1);
+		m_field_length = field_length;
+
+		return EAP_STATUS_RETURN(am_tools, eap_status_ok);
+	}
+
+	inline bool get_is_valid() const
+	{
+		EAP_STATIC_ASSERT(sizeof(eap_configuration_field_template_c<buffer_length>) >= sizeof(eap_configuration_field_c));
+		return true;
+	}
+
+
+public:
+	bool                 m_is_secret;
+	eap_configure_type_e m_type;
+	eap_variable_data_c *m_subsection_name;
+	u32_t                m_field_length;
+	i8_t                 m_field[buffer_length];
+};
+
+template <u32_t buffer_length>
+inline const eap_configuration_field_c * eap_configuration_field_template_c<buffer_length>::get_field() const
+{
+	return reinterpret_cast<const eap_configuration_field_c *>(this);
+}
+
+#define EAP_CONFIGURATION_FIELD(name, field, type, is_secret) \
+	static const eap_configuration_field_template_c<sizeof(field)> name \
+		EAP_ATTRIBUTE_UNUSED = {is_secret, type, 0, sizeof(field)-1, field}; \
+	EAP_AM_CONFIGURATION_FIELD_LITERAL(name, field)
+
+//--------------------------------------------------------------------------------------------------
+
+
+#endif //#if !defined(_EAP_CONFIGURATION_FIELD_H_)
+
+//--------------------------------------------------
+
+
+// End.