eapol/eapol_framework/eapol_common/include/eap_variable_data.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_variable_data.h	Thu Dec 17 08:47:43 2009 +0200
@@ -0,0 +1,495 @@
+/*
+* 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_VARIABLE_DATA_H_)
+#define _EAP_VARIABLE_DATA_H_
+
+#include "eap_am_types.h"
+#include "eap_am_export.h"
+//#include "eap_am_memory.h"
+#include "eap_am_assert.h"
+#include "eap_status.h"
+
+//--------------------------------------------------
+
+class abs_eap_am_tools_c;
+
+
+/// This class stores any data in byte array.
+class EAP_EXPORT eap_variable_data_c
+{
+private:
+	//--------------------------------------------------
+
+	/// This is pointer to the tools class. @see abs_eap_am_tools_c
+	abs_eap_am_tools_c * const m_am_tools;
+
+	/// This struct decreases the memory print of eap_variable_data_c.
+	struct eap_variable_data_impl_str
+	{
+		/// This is pointer to the buffer.
+		u8_t *m_buffer;
+
+		/// This indicates the length of the buffer.
+		u32_t m_buffer_length;
+
+		/// This indicates the start of the data in the buffer.
+		u32_t m_real_data_start_index;
+
+		/// This indicates the length of data in the buffer.
+		u32_t m_real_data_length;
+
+		/// This indicates the buffer is initialized. The attribute m_buffer points 
+		/// to a memory buffer which length is m_buffer_length bytes.
+		bool m_is_valid;
+
+		/// This indicates the buffer will be freed in destructor.
+		bool m_free_buffer;
+
+		/// This indicates the buffer pointed by m_buffer can be modified.
+		bool m_is_writable;
+	};
+
+	/// This is pointer to data of eap_variable_data_c.
+	/// This decreases memory print of eap_variable_data_c.
+	/// This decreases stack usage of EAP_Core.
+	eap_variable_data_impl_str *  m_data;
+
+
+	EAP_FUNC_IMPORT eap_status_e initialize_members();
+
+	EAP_FUNC_IMPORT eap_status_e allocate_buffer(
+		const u32_t required_buffer_length);
+
+	//--------------------------------------------------
+protected:
+	//--------------------------------------------------
+
+	//--------------------------------------------------
+public:
+	//--------------------------------------------------
+
+	/**
+	 * Destructor of the eap_variable_data class will release 
+	 * the buffer if attribute m_free_buffer is true.
+	 */
+	EAP_FUNC_IMPORT virtual ~eap_variable_data_c();
+
+	/**
+	 * Constructor takes only one parameter called tools.
+	 * @param tools is pointer to the tools class. @see abs_eap_am_tools_c.
+	 */
+	EAP_FUNC_IMPORT eap_variable_data_c(
+		abs_eap_am_tools_c * const tools);
+
+	/**
+	 * Constructor takes five parameters.
+	 * @param tools is pointer to the tools class. @see abs_eap_am_tools_c.
+	 * @param buffer is pointer to the buffer.
+	 * @param buffer_length is size of the buffer.
+	 * @param free_buffer indicates whether the buffer must be freed in the destructor.
+	 * @param is_writable indicates whether the buffer is writable.
+	 */
+	EAP_FUNC_IMPORT eap_variable_data_c(
+		abs_eap_am_tools_c * const tools,
+		const void * const buffer,
+		const u32_t buffer_length,
+		bool free_buffer,
+		bool is_writable);
+
+
+	/**
+	 * The get_is_valid() function returns the status of the eap_variable_data object.
+	 * @return True indicates the object is initialized.
+	 */
+	EAP_FUNC_IMPORT bool get_is_valid() const;
+
+
+	/**
+	 * The get_is_valid_data() function returns the status of the
+	 * data included in eap_variable_data object.
+	 * Note the object may include zero length data, and that is valid data.
+	 * @return True indicates the object includes valid data.
+	 */
+	EAP_FUNC_IMPORT bool get_is_valid_data() const;
+
+	/**
+	 * The set_is_valid() function sets the state of the eap_variable_data object valid.
+	 * The eap_variable_data_c object calls this function after it is initialized.
+	 */
+	EAP_FUNC_IMPORT void set_is_valid();
+
+	/**
+	 * The set_is_invalid() function sets the state of the eap_variable_data object invalid.
+	 * The eap_variable_data_c object calls this function after it is uninitialized.
+	 */
+	EAP_FUNC_IMPORT void set_is_invalid();
+
+	/**
+	 * This function returns flag that indicates whether this
+	 * buffer is writeble (true) or read only (false).
+	 */
+	EAP_FUNC_IMPORT bool get_is_writable() const;
+
+	/**
+	 * The get_data_offset() function returns the pointer to the buffer.
+	 * @param offset is offset from the begin of the buffer.
+	 * @param buffer_length is required count of bytes.
+	 */
+	EAP_FUNC_IMPORT u8_t * get_buffer_offset(
+		const u32_t offset,
+		const u32_t buffer_length) const;
+
+	/**
+	 * The get_buffer() function returns the pointer to the buffer.
+	 */
+	EAP_FUNC_IMPORT u8_t * get_buffer(const u32_t buffer_length) const;
+
+	/**
+	 * The get_data_offset() function returns the pointer to the data.
+	 * @param offset is offset from the begin of the data.
+	 * @param data_length is required count of bytes.
+	 */
+	EAP_FUNC_IMPORT u8_t * get_data_offset(
+		const u32_t offset,
+		const u32_t data_length) const;
+
+	/**
+	 * The get_data() function returns the pointer to the begin of the data.
+	 */
+	EAP_FUNC_IMPORT u8_t * get_data(const u32_t data_length) const;
+
+
+	/**
+	 * The get_data() function returns the pointer to the begin of the data.
+	 * This function assumes the whole data is needed.
+	 * User should test the validity of object and the length of the data before use of it.
+	 * The purpose of this function is reduce code size.
+	 */
+#if defined(USE_EAP_INLINE_FUNCTIONS)
+	EAP_INLINE u8_t * get_data() const
+	{
+
+#if defined(USE_EAP_INLINE_FUNCTIONS_RUNTIME_CHECKS)
+		if (m_data != 0
+			&& m_data->m_is_valid == true)
+		{
+#endif //#if defined(USE_EAP_INLINE_FUNCTIONS_RUNTIME_CHECKS)
+
+			return m_data->m_buffer + m_data->m_real_data_start_index;
+
+#if defined(USE_EAP_INLINE_FUNCTIONS_RUNTIME_CHECKS)
+		}
+		else
+		{
+			return 0;
+		}
+#endif //#if defined(USE_EAP_INLINE_FUNCTIONS_RUNTIME_CHECKS)
+
+	}
+
+#else
+
+	EAP_FUNC_IMPORT u8_t * get_data() const;
+
+#endif //#if defined(USE_EAP_INLINE_FUNCTIONS)
+
+
+	/**
+	 * The get_data_length() function returns the count of bytes stored to the buffer.
+	 */
+#if defined(USE_EAP_INLINE_FUNCTIONS)
+	EAP_INLINE u32_t get_data_length() const
+	{
+
+#if defined(USE_EAP_INLINE_FUNCTIONS_RUNTIME_CHECKS)
+		if (m_data != 0
+			&& m_data->m_is_valid == true)
+		{
+#endif //#if defined(USE_EAP_INLINE_FUNCTIONS_RUNTIME_CHECKS)
+
+			return m_data->m_real_data_length;
+
+#if defined(USE_EAP_INLINE_FUNCTIONS_RUNTIME_CHECKS)
+		}
+		else
+		{
+			return 0u;
+		}
+#endif //#if defined(USE_EAP_INLINE_FUNCTIONS_RUNTIME_CHECKS)
+
+	}
+
+#else
+
+	EAP_FUNC_IMPORT u32_t get_data_length() const;
+
+#endif //#if defined(USE_EAP_INLINE_FUNCTIONS)
+
+
+	/**
+	 * The get_buffer_length() function returns the size of the buffer.
+	 */
+#if defined(USE_EAP_INLINE_FUNCTIONS)
+
+	EAP_INLINE u32_t get_buffer_length() const
+	{
+
+#if defined(USE_EAP_INLINE_FUNCTIONS_RUNTIME_CHECKS)
+		if (m_data != 0
+			&& m_data->m_is_valid == true)
+		{
+#endif //#if defined(USE_EAP_INLINE_FUNCTIONS_RUNTIME_CHECKS)
+
+			return m_data->m_buffer_length;
+
+#if defined(USE_EAP_INLINE_FUNCTIONS_RUNTIME_CHECKS)
+		}
+		else
+		{
+			return 0u;
+		}
+#endif //#if defined(USE_EAP_INLINE_FUNCTIONS_RUNTIME_CHECKS)
+
+	}
+
+#else
+
+	EAP_FUNC_IMPORT u32_t get_buffer_length() const;
+
+#endif //#if defined(USE_EAP_INLINE_FUNCTIONS)
+
+
+	/**
+	 * The reset_start_offset_and_data_length() function sets the begin offset of the data to zero
+	 * and the length of data to zero.
+	 */
+	EAP_FUNC_IMPORT eap_status_e reset_start_offset_and_data_length();
+
+	/**
+	 * The set_start_offset() function sets the begin offset of the data to index.
+	 * With this function data in the begin of the buffer can be removed
+	 * without any copy operations.
+	 */
+	EAP_FUNC_IMPORT eap_status_e set_start_offset(const u32_t index);
+
+	/**
+	 * The set_data_length() function changes the length of the data.
+	 * @param length is count of bytes in the buffer.
+	 */
+	EAP_FUNC_IMPORT eap_status_e set_data_length(
+		const u32_t length);
+
+	/**
+	 * The set_buffer() function initializes the eap_variable_data object
+	 * using existing buffer.
+	 * @param buffer is pointer to the buffer.
+	 * @param buffer_length is size of the buffer.
+	 * @param free_buffer indicates whether the buffer must be freed in the destructor.
+	 * @param is_writable indicates whether the buffer is writable.
+	 */
+	EAP_FUNC_IMPORT eap_status_e set_buffer(
+		const void * const buffer,
+		const u32_t buffer_length,
+		bool free_buffer,
+		bool is_writable);
+
+	/**
+	 * The set_buffer() function initializes the eap_variable_data object
+	 * using existing buffer.
+	 * @param buffer is pointer to the buffer.
+	 * @param buffer_length is size of the buffer.
+	 * @param free_buffer indicates whether the buffer must be freed in the destructor.
+	 * @param is_writable indicates whether the buffer is writable.
+	 */
+	EAP_FUNC_IMPORT eap_status_e set_buffer(
+		void * const buffer,
+		const u32_t buffer_length,
+		bool free_buffer,
+		bool is_writable);
+
+	/**
+	 * The set_buffer() function initializes the eap_variable_data object
+	 * using existing buffer. Note the data will be in the same buffer.
+	 * Data can be modified through both eap_variable_data objects.
+	 * @param buffer is pointer to the buffer.
+	 */
+	EAP_FUNC_IMPORT eap_status_e set_buffer(
+		const eap_variable_data_c * const buffer);
+
+	/**
+	 * The set_copy_of_buffer() function copies the data of the buffer.
+	 * @param buffer points the data to be copied.
+	 * @param buffer_length is length of the buffer in bytes.
+	 */
+	EAP_FUNC_IMPORT eap_status_e set_copy_of_buffer(
+		const void * const buffer,
+		const u32_t buffer_length);
+
+	/**
+	 * The set_copy_of_buffer() function copies the data of the buffer.
+	 * The first version copies data pointed by parameter buffer.
+	 * @param buffer points the data to be copied.
+	 */
+	EAP_FUNC_IMPORT eap_status_e set_copy_of_buffer(
+		const eap_variable_data_c * const buffer);
+
+	/**
+	 * The set_buffer_length() function sets length ot the buffer
+	 * atleast to buffer_length bytes.
+	 * If the buffer is empty or less than buffer_length bytes, length of the buffer is set to buffer_length bytes.
+	 * If the buffer includes data, data is kept in the buffer.
+	 * @param buffer points the data to be added.
+	 * @param buffer_length is length of the buffer in bytes.
+	 */
+	EAP_FUNC_IMPORT eap_status_e set_buffer_length(
+		const u32_t buffer_length);
+
+	/**
+	 * The add_data() function adds data to the end of the buffer.
+	 * If the buffer is empty the data is added to begin of the buffer.
+	 * @param buffer points the data to be added.
+	 * @param buffer_length is length of the buffer in bytes.
+	 */
+	EAP_FUNC_IMPORT eap_status_e add_data(
+		const void * const buffer,
+		const u32_t buffer_length);
+
+	/**
+	 * The add_data() function adds data to the end of the buffer.
+	 * If the buffer is empty the data is added to begin of the buffer.
+	 * @param buffer points the data to be added.
+	 */
+	EAP_FUNC_IMPORT eap_status_e add_data(
+		const eap_variable_data_c * const buffer);
+
+	/**
+	 * The add_data_to_offset() function adds data to the offset of the buffer.
+	 * @param offset tells the place where data will begin.
+	 * @param buffer points the data to be added.
+	 * @param buffer_length is length of the buffer in bytes.
+	 */
+	EAP_FUNC_IMPORT eap_status_e add_data_to_offset(
+		const u32_t offset,
+		const void * const buffer,
+		const u32_t buffer_length);
+
+	/**
+	 * The add_data() function adds data to the offset of the buffer.
+	 * @param offset tells the place where data will begin.
+	 * @param buffer points the data to be added.
+	 */
+	EAP_FUNC_IMPORT eap_status_e add_data_to_offset(
+		const u32_t offset,
+		const eap_variable_data_c * const buffer);
+
+	/**
+	 * The add_end_null() function adds 16-bit null ('\0\0') to the end of the buffer.
+	 * This does not increase the data length.
+	 * This function is usefull when null terminated strings are stored to
+	 * eap_variable_data_c object.
+	 */
+	EAP_FUNC_IMPORT eap_status_e add_end_null();
+
+	/**
+	 * The reset() function resets the eap_variable_data object.
+	 * Memory of the buffer is freed if the m_free_buffer attribute is true.
+	 * Object does not include data after this call and get_is_valid_data()
+	 * returns false.
+	 */
+	EAP_FUNC_IMPORT eap_status_e reset();
+
+	/**
+	 * The init() function initializes the eap_variable_data object.
+	 * @param length is length of buffer in bytes that is allocated.
+	 * Buffer is set empty, data length is set zero.
+	 */
+	EAP_FUNC_IMPORT eap_status_e init(
+		const u32_t length);
+
+	/**
+	 * The copy() function copies the eap_variable_data object and data.
+	 */
+	EAP_FUNC_IMPORT eap_variable_data_c * copy() const;
+
+
+	/**
+	 * The compare_length() function compares first compare_length bytes of the objects.
+	 * @return Function returns zero when first compare_length bytes of the data are equal.
+	 * If the data of the caller object is shorter than compare_length bytes
+	 * or the first different byte of the caller is smaller the function returns negative value.
+	 * If the data of the parameter object is shorter than compare_length bytes
+	 * or the first different byte of the caller is larger the function returns positive value.
+	 */
+	EAP_FUNC_IMPORT i32_t compare_length(
+		const void * const data,
+		const u32_t data_length,
+		const u32_t compare_length_of_data) const;
+
+	/**
+	 * The compare_length() function compares first compare_length bytes of the objects.
+	 * @return Function returns zero when first compare_length bytes of the data are equal.
+	 * If the data of the caller object is shorter than compare_length bytes
+	 * or the first different byte of the caller is smaller the function returns negative value.
+	 * If the data of the parameter object is shorter than compare_length bytes
+	 * or the first different byte of the caller is larger the function returns positive value.
+	 */
+	EAP_FUNC_IMPORT i32_t compare_length(
+		const eap_variable_data_c * const data,
+		const u32_t compare_length_of_data) const;
+
+	/**
+	 * The compare() function compares the objects.
+	 * @return Function returns zero when data lengths and the data are equal.
+	 * If the data of the caller object is shorter or the first different byte
+	 * of the caller is smaller the function returns negative value.
+	 * If the data of the caller object is longer or the first different byte
+	 * of the caller is larger the function returns positive value.
+	 */
+	EAP_FUNC_IMPORT i32_t compare(
+		const void * const data,
+		const u32_t data_length) const;
+
+	/**
+	 * The compare() function compares the objects.
+	 * @return Function returns zero when data lengths and the data are equal.
+	 * If the data of the caller object is shorter or the first different byte
+	 * of the caller is smaller the function returns negative value.
+	 * If the data of the caller object is longer or the first different byte
+	 * of the caller is larger the function returns positive value.
+	 */
+	EAP_FUNC_IMPORT i32_t compare(
+		const eap_variable_data_c * const data) const;
+
+
+	/**
+	 * The hash() function returns HASH-value calculated from the data.
+	 * @return Maximum returned value is size-1. Minimum returned value is zero.
+	 */
+	EAP_FUNC_IMPORT u32_t hash(
+		const u32_t size) const;
+
+	//--------------------------------------------------
+}; // class eap_variable_data_c
+
+
+#endif //#if !defined(_EAP_VARIABLE_DATA_H_)
+
+// End.