eapol/eapol_framework/eapol_common/include/eap_core_map.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_core_map.h	Thu Dec 17 08:47:43 2009 +0200
@@ -0,0 +1,667 @@
+/*
+* 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_TYPE_MAP_H_)
+#define _EAP_TYPE_MAP_H_
+
+#include "eap_am_memory.h"
+#include "eap_am_export.h"
+#include "abs_eap_core_map.h"
+#include "eap_variable_data.h"
+#include "eap_am_tools.h"
+
+
+const u32_t EAP_MAP_SIZE = 256;
+
+
+#if defined(_WIN32) && !defined(__GNUC__)
+	#pragma warning (disable : 4251)
+#endif
+
+
+//
+template <class Type, class Selector_Type>
+class EAP_EXPORT eap_state_map_atom_c
+{
+private:
+
+	abs_eap_am_tools_c * const m_am_tools;
+
+	Type *m_object;
+	Selector_Type *m_selector;
+	eap_state_map_atom_c<Type, Selector_Type> *m_next_atom;
+
+	bool m_is_valid;
+
+public:
+
+	//
+	virtual ~eap_state_map_atom_c()
+	{
+		EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
+
+		EAP_TRACE_DEBUG(
+			m_am_tools,
+			EAP_TRACE_MASK_HASH_MAP,
+			(EAPL("CORE_MAP: ~eap_state_map_atom_c(): this 0x%08x starts.\n"),
+			 this));
+
+		if (m_selector != 0)
+		{
+			EAP_TRACE_DEBUG(
+				m_am_tools,
+				EAP_TRACE_MASK_HASH_MAP,
+				(EAPL("CORE_MAP: ~eap_state_map_atom_c(): delete m_selector starts: selector 0x%08x.\n"),
+				 m_selector));
+
+			delete m_selector;
+
+			EAP_TRACE_DEBUG(
+				m_am_tools,
+				EAP_TRACE_MASK_HASH_MAP,
+				(EAPL("CORE_MAP: ~eap_state_map_atom_c(): delete m_selector ends.\n")));
+
+			m_selector = 0;
+		}
+
+		if (m_object != 0)
+		{
+			EAP_TRACE_DEBUG(
+				m_am_tools,
+				EAP_TRACE_MASK_HASH_MAP,
+				(EAPL("CORE_MAP: ~eap_state_map_atom_c(): delete m_object starts: object 0x%08x.\n"),
+				 m_object));
+
+			delete m_object;
+
+			EAP_TRACE_DEBUG(
+				m_am_tools,
+				EAP_TRACE_MASK_HASH_MAP,
+				(EAPL("CORE_MAP: ~eap_state_map_atom_c(): delete m_object ends.\n")));
+
+			m_object = 0;
+		}
+
+		if (m_next_atom != 0)
+		{
+			EAP_TRACE_DEBUG(
+				m_am_tools,
+				EAP_TRACE_MASK_HASH_MAP,
+				(EAPL("CORE_MAP: ~eap_state_map_atom_c(): delete m_next_atom starts: next atom 0x%08x.\n"),
+				 m_next_atom));
+
+			delete m_next_atom;
+
+			EAP_TRACE_DEBUG(
+				m_am_tools,
+				EAP_TRACE_MASK_HASH_MAP,
+				(EAPL("CORE_MAP: ~eap_state_map_atom_c(): delete m_next_atom ends.\n")));
+
+			m_next_atom = 0;
+		}
+		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+	}
+
+	//
+	eap_state_map_atom_c()
+		: m_am_tools(0)
+		, m_object(0)
+		, m_selector(0)
+		, m_next_atom(0)
+		, m_is_valid(false)
+	{
+	}
+
+	//
+	eap_state_map_atom_c(
+		Selector_Type * const p_selector,
+		abs_eap_am_tools_c * const tools,
+		Type * const p_object)
+		: m_am_tools(tools)
+		, m_object(p_object)
+		, m_selector(p_selector)
+		, m_next_atom(0)
+		, m_is_valid(false)
+	{
+		if (m_am_tools == 0
+			|| m_am_tools->get_is_valid() == false
+			|| m_object == 0
+			|| m_selector == 0)
+		{
+			return;
+		}
+
+		set_is_valid();
+	}
+
+	//
+	Type * const get_object()
+	{
+		return m_object;
+	}
+
+	//
+	const Type * const get_const_object() const
+	{
+		return m_object;
+	}
+
+	//
+	void set_object(Type * const p_type)
+	{
+		m_object = p_type;
+	}
+
+	const Selector_Type * const get_selector() const
+	{
+		return m_selector;
+	}
+
+	eap_state_map_atom_c * const get_next_atom() const
+	{
+		return m_next_atom;
+	}
+
+	void set_next_atom(eap_state_map_atom_c<Type, Selector_Type> * const next)
+	{
+		m_next_atom = next;
+	}
+
+	void set_is_valid()
+	{
+		m_is_valid = true;
+	}
+
+	bool get_is_valid()
+	{
+		return m_is_valid;
+	}
+};
+
+
+/// This template class stores the Type identified with Selector_Type.
+/**
+  * A eap_core_map_c template class.
+  * The eap_core_map_c template class includes an array that is indexed with 
+  * type of Selector_Type parameter.
+  * @param Type template parameter is the actual type which is stored.
+  * @param Abs_Type template parameter is the abstract partner type of Type.
+  * @param Selector_Type template type is the type of the selector object.
+  * The Selector_Type could be any class that offers three functions with 
+  * the following prototypes:
+  * @code
+  * i32_t compare(
+  * 	const Selector_Type * const data) const;
+  * 
+  * u32_t hash(
+  * 	const u32_t size) const;
+  * 
+  * Selector_Type * const copy() const;
+  * @endcode
+  *
+  * The Type could be any class that offers two functions with
+  * the following prototypes:
+  * @code
+  * void object_increase_reference_count();
+  *
+  * u32_t object_decrease_reference_count();
+  *
+  * @endcode
+  *
+  */
+template <class Type, class Abs_Type, class Selector_Type>
+class EAP_EXPORT eap_core_map_c
+{
+private:
+	//--------------------------------------------------
+
+	/// This is back pointer to object which created this object.
+	Abs_Type * const m_partner;
+
+	/// This is hash-table to all objects stored to the eap_core_map object.
+	/// Objects are stored using the eap_state_map_atom template class.
+	eap_state_map_atom_c<Type, Selector_Type> *m_map[EAP_MAP_SIZE];
+
+	/// This is pointer to the tools class. 
+	abs_eap_am_tools_c * const m_am_tools;
+
+	//--------------------------------------------------
+protected:
+	//--------------------------------------------------
+
+	//--------------------------------------------------
+public:
+	//--------------------------------------------------
+
+	/**
+	 * The destructor of the eap_core_map template class deletes all stored objects.
+	 */
+	virtual ~eap_core_map_c()
+	{
+		EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
+
+		(void) reset();
+
+		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+	}
+
+	/**
+	 * The constructor initializes attributes using the passed parameters.
+	 * Each pointer of m_map array is initialized null.
+	 * @param tools is pointer to the tools class. @see abs_eap_am_tools_c.
+	 * @param partner is back pointer to object which created this object.
+	 */
+	eap_core_map_c(
+		abs_eap_am_tools_c * const tools,
+		Abs_Type * const partner)
+	: m_partner(partner)
+	, m_am_tools(tools)
+	{
+		EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
+		for (u32_t ind = 0u; ind < EAP_MAP_SIZE; ind++)
+		{
+			m_map[ind] = 0;
+		}
+		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+	}
+
+	u32_t get_atom_count() const
+	{
+		return EAP_MAP_SIZE;
+	}
+
+	const eap_state_map_atom_c<Type, Selector_Type> *get_atom(const u32_t index) const
+	{
+		if (index >= EAP_MAP_SIZE)
+		{
+			return 0;
+		}
+
+		return m_map[index];
+	}
+
+	/**
+	 * The add_handler() function stores a new type to the eap_core_map object.
+	 * @param p_selector is pointer to a selector object.
+	 * The p_selector object identifies the stored type.
+	 * @param type is pointer to the stored object.
+	 */
+	eap_status_e add_handler(
+		const Selector_Type * const p_selector,
+		Type * const object)
+	{
+		EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
+
+		const u32_t index = p_selector->hash(EAP_MAP_SIZE);
+
+		if (index >= EAP_MAP_SIZE)
+		{
+			return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_hashed_index);
+		}
+
+		eap_state_map_atom_c<Type, Selector_Type> *cursor = m_map[index];
+		eap_state_map_atom_c<Type, Selector_Type> *last_cursor = 0;
+
+		EAP_TRACE_DEBUG(
+			m_am_tools,
+			EAP_TRACE_MASK_HASH_MAP,
+			(EAPL("CORE_MAP: add_handler(): index %d\n"),
+			index));
+
+		EAP_TRACE_DATA_DEBUG(
+			m_am_tools,
+			EAP_TRACE_MASK_HASH_MAP,
+			(EAPL("CORE_MAP: selector"),
+			p_selector->get_data(p_selector->get_data_length()),
+			p_selector->get_data_length()));
+
+		while (cursor != 0)
+		{
+			EAP_TRACE_DEBUG(
+				m_am_tools,
+				EAP_TRACE_MASK_HASH_MAP,
+				(EAPL("CORE_MAP: add_handler(): cursor 0x%08x\n"),
+				cursor));
+
+			if (p_selector->compare(cursor->get_selector()) == 0)
+			{
+				// match
+				break;
+			}
+			last_cursor = cursor;
+			cursor = cursor->get_next_atom();
+		}
+
+		if (cursor != 0)
+		{
+			// Already exists.
+			return EAP_STATUS_RETURN(m_am_tools, eap_status_handler_exists_error);
+		}
+		else
+		{
+			eap_state_map_atom_c<Type, Selector_Type> *atom
+				= new eap_state_map_atom_c<Type, Selector_Type>(
+					p_selector->copy(), m_am_tools, object);
+
+			if (atom == 0
+				|| atom->get_is_valid() == false)
+			{
+				delete atom;
+				return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error);
+			}
+
+			EAP_TRACE_DEBUG(
+				m_am_tools,
+				EAP_TRACE_MASK_HASH_MAP,
+				(EAPL("CORE_MAP: add_handler(): atom 0x%08x, object 0x%08x\n"),
+				atom,
+				object));
+
+			if (last_cursor != 0)
+			{
+				last_cursor->set_next_atom(atom);
+			}
+			else
+			{
+				m_map[index] = atom;
+			}
+
+			object->object_increase_reference_count();
+		}
+
+		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+		return eap_status_ok;
+	}
+
+
+	/**
+	 * @return The get_handler() function returns a pointer to the type object or NULL.
+	 * @param p_selector is pointer to a selector object.
+	 * The p_selector object identifies the required object.
+	 */
+	Type * const get_handler(
+		const Selector_Type * const p_selector) const
+	{
+		EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
+
+		if (p_selector->get_is_valid() == false)
+		{
+			return 0;
+		}
+
+		Type *object = 0;
+		const u32_t index = p_selector->hash(EAP_MAP_SIZE);
+
+		if (index >= EAP_MAP_SIZE)
+		{
+			return 0;
+		}
+
+		eap_state_map_atom_c<Type, Selector_Type> *cursor = m_map[index];
+
+		EAP_TRACE_DEBUG(
+			m_am_tools,
+			EAP_TRACE_MASK_HASH_MAP,
+			(EAPL("CORE_MAP: get_handler(): index %d\n"),
+			index));
+
+		EAP_TRACE_DATA_DEBUG(
+			m_am_tools,
+			EAP_TRACE_MASK_HASH_MAP,
+			(EAPL("CORE_MAP: selector"),
+			p_selector->get_data(p_selector->get_data_length()),
+			p_selector->get_data_length()));
+
+		while (cursor != 0)
+		{
+			EAP_TRACE_DEBUG(
+				m_am_tools,
+				EAP_TRACE_MASK_HASH_MAP,
+				(EAPL("CORE_MAP: get_handler(): cursor 0x%08x\n"),
+				cursor));
+
+			if (p_selector->compare(cursor->get_selector()) == 0)
+			{
+				// match
+				break;
+			}
+
+			cursor = cursor->get_next_atom();
+		}
+
+		if (cursor != 0)
+		{
+			object = cursor->get_object();
+
+			EAP_TRACE_DEBUG(
+				m_am_tools,
+				EAP_TRACE_MASK_HASH_MAP,
+				(EAPL("CORE_MAP: get_handler(): found cursor 0x%08x\n"),
+				cursor));
+
+			EAP_TRACE_DEBUG(
+				m_am_tools,
+				EAP_TRACE_MASK_HASH_MAP,
+				(EAPL("CORE_MAP: get_handler(): found object 0x%08x\n"),
+				object));
+		}
+		else
+		{
+			EAP_TRACE_DEBUG(
+				m_am_tools,
+				EAP_TRACE_MASK_HASH_MAP,
+				(EAPL("CORE_MAP: get_handler(): NOT found\n")));
+		}
+
+		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+		return object;
+	}
+
+
+	/**
+	 * The remove_handler() function removes and deletes the object from MAP.
+	 * @param p_selector is pointer to a selector object.
+	 * @param delete_object tells whether the object is deleted (true) or not (false).
+	 * The p_selector object identifies the removed object.
+	 */
+	eap_status_e remove_handler(
+		const Selector_Type * const p_selector,
+		const bool delete_object)
+	{
+		EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
+
+		const u32_t index = p_selector->hash(EAP_MAP_SIZE);
+
+		if (index >= EAP_MAP_SIZE)
+		{
+			return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_hashed_index);
+		}
+
+		eap_state_map_atom_c<Type, Selector_Type> *cursor = m_map[index];
+		eap_state_map_atom_c<Type, Selector_Type> *last_cursor = 0;
+
+		EAP_TRACE_DEBUG(
+			m_am_tools,
+			EAP_TRACE_MASK_HASH_MAP,
+			(EAPL("CORE_MAP: remove_handler(): index %d\n"),
+			index));
+
+		EAP_TRACE_DATA_DEBUG(
+			m_am_tools,
+			EAP_TRACE_MASK_HASH_MAP,
+			(EAPL("CORE_MAP: selector"),
+			p_selector->get_data(p_selector->get_data_length()),
+			p_selector->get_data_length()));
+
+		while (cursor != 0)
+		{
+			EAP_TRACE_DEBUG(
+				m_am_tools,
+				EAP_TRACE_MASK_HASH_MAP,
+				(EAPL("CORE_MAP: remove_handler(): cursor 0x%08x\n"),
+				cursor));
+
+			if (p_selector->compare(cursor->get_selector()) == 0)
+			{
+				if (cursor->get_object()->object_decrease_reference_count() > 0u)
+				{
+					// Other users of the EAP-type are still active.
+					EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+					return EAP_STATUS_RETURN(m_am_tools, eap_status_state_reference_count_not_zero);
+				}
+				// match
+				break;
+			}
+			last_cursor = cursor;
+			cursor = cursor->get_next_atom();
+		}
+
+		if (cursor == 0)
+		{
+			EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+			return EAP_STATUS_RETURN(m_am_tools, eap_status_handler_does_not_exists_error);
+		}
+
+		EAP_TRACE_DEBUG(
+			m_am_tools,
+			EAP_TRACE_MASK_HASH_MAP,
+			(EAPL("CORE_MAP: remove_handler(): cursor 0x%08x, object 0x%08x\n"),
+			cursor,
+			cursor->get_object()));
+
+		if (last_cursor != 0)
+		{
+			last_cursor->set_next_atom(cursor->get_next_atom());
+		}
+		else
+		{
+			m_map[index] = cursor->get_next_atom();
+		}
+		cursor->set_next_atom(0);
+
+		if (delete_object == false)
+		{
+			// Object will be used on other location.
+			// We do not delete it here.
+			cursor->set_object(0);
+		}
+
+		delete cursor;
+
+		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+		return eap_status_ok;
+	}
+
+
+	/**
+	 * The for_each() function runs function for the each object in the MAP.
+	 * @param p_selector is pointer to a selector object.
+	 * The p_selector object identifies the removed object.
+	 */
+	eap_status_e for_each(
+		eap_status_e (*function)(
+			Type * const value,
+			abs_eap_am_tools_c * const m_am_tools),
+		const bool /* do_not_care_errors */)
+	{
+		EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
+
+		u32_t index = 0ul;
+
+		for (index = 0ul; index < EAP_MAP_SIZE; index++)
+		{
+			eap_state_map_atom_c<Type, Selector_Type> *cursor = m_map[index];
+
+			while (cursor != 0)
+			{
+				eap_status_e status = function(cursor->get_object(), m_am_tools);
+
+				if (status != eap_status_ok)
+				{
+					EAP_TRACE_DEBUG(
+						m_am_tools,
+						EAP_TRACE_MASK_HASH_MAP,
+						(EAPL("CORE_MAP: ERROR: for_each(): cursor 0x%08x, status %d\n"),
+						 cursor,
+						 status));
+				}
+
+				cursor = cursor->get_next_atom();
+
+			} // while()
+		} // for()
+
+		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+		return eap_status_ok;
+	}
+
+	bool get_is_valid()
+	{
+		return true;
+	}
+
+	eap_status_e reset()
+	{
+		EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
+
+		EAP_TRACE_DEBUG(
+			m_am_tools,
+			EAP_TRACE_MASK_HASH_MAP,
+			(EAPL("CORE_MAP: eap_core_map_c::reset(): this 0x%08x starts.\n"),
+			 this));
+
+		for (u32_t ind = 0u; ind < EAP_MAP_SIZE; ind++)
+		{
+			if (m_map[ind] != 0)
+			{
+				EAP_TRACE_DEBUG(
+					m_am_tools,
+					EAP_TRACE_MASK_HASH_MAP,
+					(EAPL("CORE_MAP: eap_core_map_c::reset(): delete m_map[%d], atom 0x%08x starts.\n"),
+					ind,
+					m_map[ind]));
+
+				eap_state_map_atom_c<Type, Selector_Type> *tmp = m_map[ind];
+				m_map[ind] = 0;
+				delete tmp;
+
+				EAP_TRACE_DEBUG(
+					m_am_tools,
+					EAP_TRACE_MASK_HASH_MAP,
+					(EAPL("CORE_MAP: eap_core_map_c::reset(): delete m_map[%d] ends.\n"),
+					ind));
+			}
+		}
+
+		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+		return eap_status_ok;
+	}
+
+	//--------------------------------------------------
+}; // class eap_core_map_c
+
+#endif //#if !defined(_EAP_TYPE_MAP_H_)
+
+
+//--------------------------------------------------
+
+
+
+// End.