eapol/eapol_framework/eapol_common/include/eap_array_algorithms.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_array_algorithms.h	Thu Dec 17 08:47:43 2009 +0200
@@ -0,0 +1,572 @@
+/*
+* 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_ARRAY_ALGORITHMS_H_)
+#define _EAP_ARRAY_ALGORITHMS_H_
+
+#include "eap_am_memory.h"
+#include "eap_am_export.h"
+#include "eap_tools.h"
+#include "eap_am_tools.h"
+#include "eap_array.h"
+
+/** @file */
+
+//--------------------------------------------------
+
+#if defined(_WIN32) && !defined(__GNUC__)
+	#pragma warning( disable : 4275 ) // ingnores non dll-interface class 'abs_eap_array_compare_c<class eap_fast_pac_store_data_c>' used as base for dll-interface class 'eap_fast_pac_store_data_compare_A_ID_reference_c'
+#endif
+
+template <class Type>
+class EAP_EXPORT abs_eap_array_compare_c
+{
+
+public:
+
+	virtual ~abs_eap_array_compare_c()
+	{
+	}
+
+	virtual i32_t compare(const Type * const original_object_from_array, const Type * const searched_data) const = 0;
+};
+
+
+//--------------------------------------------------
+//--------------------------------------------------
+//--------------------------------------------------
+
+/**
+ * This template function copies class objects from original_array to copy_array. 
+ * Type must have the following member functions:
+ * Type * copy();
+ * bool get_is_valid();
+ * bool get_is_valid_data();
+ */
+template <class Type>
+eap_status_e copy(
+	EAP_TEMPLATE_CONST eap_array_c<Type> * const original_array, ///< Stupid Windows compiler cannot compile "const eap_array_c<Type> * const".
+	eap_array_c<Type> * const copy_array,
+	abs_eap_am_tools_c * const m_am_tools,
+	const bool when_true_add_objects)
+{
+	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
+
+	eap_status_e status = eap_status_ok; // Note original_array may be empty, then for loop will not be run. 
+
+	if (when_true_add_objects == false)
+	{
+		copy_array->reset();
+	}
+
+	for (u32_t ind = 0; ind < original_array->get_object_count(); ind++)
+	{
+		Type * const orig_object = original_array->get_object(ind);
+		if (orig_object == 0
+			|| orig_object->get_is_valid() == false)
+		{
+			EAP_UNREFERENCED_PARAMETER(m_am_tools);
+			EAP_TRACE_DEBUG(
+				m_am_tools,
+				TRACE_FLAGS_DEFAULT,
+				(EAPL("copy: orig_object=0x%08x, orig_object->get_is_valid()=%d"),
+				 orig_object,
+				 (orig_object != 0) ? orig_object->get_is_valid(): false));
+			EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+			return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter);
+		}
+
+		Type * const copy_object = orig_object->copy();
+		if (copy_object == 0
+			|| copy_object->get_is_valid() == false)
+		{
+			delete copy_object;
+			EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+			return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error);
+		}
+
+		// Note the original object might be empty without data.
+		if (orig_object->get_is_valid_data() == true
+			&& copy_object->get_is_valid_data() == false)
+		{
+			delete copy_object;
+			EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+			return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error);
+		}
+
+		status = copy_array->add_object(copy_object, true);
+		if (status != eap_status_ok)
+		{
+			EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+			return EAP_STATUS_RETURN(m_am_tools, status);
+		}
+	}
+
+	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+	return EAP_STATUS_RETURN(m_am_tools, status);
+}
+
+
+//--------------------------------------------------
+
+
+/**
+ * This template function copies simple objects from original_array to copy_array. 
+ * Simple types are u16_t, eap_status_e, ...
+ */
+template <class Type>
+eap_status_e copy_simple(
+	EAP_TEMPLATE_CONST eap_array_c<Type> * const original_array, ///< Stupid Windows compiler cannot compile "const eap_array_c<Type> * const".
+	eap_array_c<Type> * const copy_array,
+	abs_eap_am_tools_c * const m_am_tools,
+	const bool when_true_add_objects)
+{
+	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
+
+	eap_status_e status = eap_status_ok; // Note original_array may be empty, then for loop will not be run. 
+
+	if (when_true_add_objects == false)
+	{
+		copy_array->reset();
+	}
+
+	for (u32_t ind = 0; ind < original_array->get_object_count(); ind++)
+	{
+		Type * original_object = original_array->get_object(ind);
+		if (original_object == 0)
+		{
+			EAP_UNREFERENCED_PARAMETER(m_am_tools);
+			EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+			return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error);
+		}
+
+		Type * copy_object = new Type;
+		if (copy_object == 0)
+		{
+			EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+			return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error);
+		}
+
+		*copy_object = *original_object;
+
+		status = copy_array->add_object(copy_object, true);
+		if (status != eap_status_ok)
+		{
+			EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+			return EAP_STATUS_RETURN(m_am_tools, status);
+		}
+	}
+
+	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+	return EAP_STATUS_RETURN(m_am_tools, status);
+}
+
+//--------------------------------------------------
+
+/**
+ * This template function copies data of objects to a eap_variable_data_c object. 
+ */
+template <class Type>
+eap_status_e add_data(
+	EAP_TEMPLATE_CONST eap_array_c<Type> * const source_array, ///< Stupid Windows compiler cannot compile "const eap_array_c<Type> * const".
+	eap_variable_data_c * const buffer,
+	abs_eap_am_tools_c * const m_am_tools)
+{
+	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
+
+	eap_status_e status = eap_status_ok; // Note source_array may be empty, then for loop will not be run. 
+
+	for (u32_t ind = 0; ind < source_array->get_object_count(); ind++)
+	{
+		Type * original_object = source_array->get_object(ind);
+		if (original_object == 0)
+		{
+			EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+			return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error);
+		}
+
+		status = buffer->add_data(
+			original_object->get_data(original_object->get_data_length()),
+			original_object->get_data_length());
+		if (status != eap_status_ok)
+		{
+			EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+			return EAP_STATUS_RETURN(m_am_tools, status);
+		}
+
+		EAP_TRACE_DATA_DEBUG(m_am_tools, TRACE_FLAGS_DEFAULT, (EAPL("data"),
+			original_object->get_data(original_object->get_data_length()),
+			original_object->get_data_length()));
+	}
+
+	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+	return EAP_STATUS_RETURN(m_am_tools, status);
+}
+
+//--------------------------------------------------
+
+/**
+ * This template function copies simple data of objects to a eap_variable_data_c object. 
+ */
+template <class Type>
+eap_status_e add_simple_data(
+	EAP_TEMPLATE_CONST eap_array_c<Type> * const source_array, ///< Stupid Windows compiler cannot compile "const eap_array_c<Type> * const".
+	eap_variable_data_c * const buffer,
+	abs_eap_am_tools_c * const m_am_tools)
+{
+	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
+
+	eap_status_e status = eap_status_ok; // Note source_array may be empty, then for loop will not be run. 
+
+	for (u32_t ind = 0; ind < source_array->get_object_count(); ind++)
+	{
+		Type * original_object = source_array->get_object(ind);
+		if (original_object == 0)
+		{
+			EAP_UNREFERENCED_PARAMETER(m_am_tools);
+			EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+			return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error);
+		}
+
+		status = buffer->add_data(
+			original_object,
+			sizeof(*original_object));
+		if (status != eap_status_ok)
+		{
+			EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+			return EAP_STATUS_RETURN(m_am_tools, status);
+		}
+
+		EAP_TRACE_DATA_DEBUG(m_am_tools, TRACE_FLAGS_DEFAULT, (EAPL("data"),
+			original_object,
+			sizeof(*original_object)));
+	}
+
+	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+	return EAP_STATUS_RETURN(m_am_tools, status);
+}
+
+//--------------------------------------------------
+
+/**
+ * This template function searches the supplied array for given object.
+ * Function returns the index to the found object or -1 if not found or there 
+ * is some other error.
+ * Type must have the following member functions:
+ * i32_t compare(const Type * const data)
+ */
+template <class Type>
+const i32_t find(
+	EAP_TEMPLATE_CONST eap_array_c<Type> * const original_array, ///< Stupid Windows compiler cannot compile "const eap_array_c<Type> * const".
+	const Type * const searched_data,
+	abs_eap_am_tools_c * const m_am_tools)
+{
+	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
+	EAP_UNREFERENCED_PARAMETER(m_am_tools);
+
+	i32_t index = -1;
+	for (u32_t ind = 0; ind < original_array->get_object_count(); ind++)
+	{
+		Type * original_object = original_array->get_object(ind);
+		if (original_object == 0)
+		{			
+			index = -1;
+			break;
+		}
+		if (!original_object->compare(const_cast<Type *> (searched_data)))
+		{
+			// Found it
+			index = ind;
+			break;
+		}
+	}
+	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+	return index;
+}
+
+//--------------------------------------------------
+
+/**
+ * This template function searches the supplied array for given object starting from the last index.
+ * Function returns the index to the found object or -1 if not found or there 
+ * is some other error.
+ * Type must have the following member functions:
+ * i32_t compare(const Type * const data)
+ */
+template <class Type>
+const i32_t find_next(
+	const i32_t last_index,
+	EAP_TEMPLATE_CONST eap_array_c<Type> * const original_array, ///< Stupid Windows compiler cannot compile "const eap_array_c<Type> * const".
+	const Type * const searched_data,
+	abs_eap_am_tools_c * const m_am_tools)
+{
+	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
+	EAP_UNREFERENCED_PARAMETER(m_am_tools);
+
+	i32_t index = -1;
+	for (u32_t ind = last_index+1; ind < original_array->get_object_count(); ind++)
+	{
+		Type * original_object = original_array->get_object(ind);
+		if (original_object == 0)
+		{			
+			index = -1;
+			break;
+		}
+		if (!original_object->compare(const_cast<Type *> (searched_data)))
+		{
+			// Found it
+			index = ind;
+			break;
+		}
+	}
+	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+	return index;
+}
+
+//--------------------------------------------------
+
+/**
+ * This template function searches the supplied array for given object.
+ * Function returns the index to the found object or -1 if not found or there 
+ * is some other error.
+ * Type must have the following member functions:
+ * i32_t compare(const Type * const data)
+ */
+template <class Type>
+const i32_t find_with_compare(
+	const abs_eap_array_compare_c<Type> * const compare,
+	EAP_TEMPLATE_CONST eap_array_c<Type> * const original_array, ///< Stupid Windows compiler cannot compile "const eap_array_c<Type> * const".
+	const Type * const searched_data,
+	abs_eap_am_tools_c * const m_am_tools)
+{
+	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
+	EAP_UNREFERENCED_PARAMETER(m_am_tools);
+
+	i32_t index = -1;
+	for (u32_t ind = 0; ind < original_array->get_object_count(); ind++)
+	{
+		Type * original_object = original_array->get_object(ind);
+		if (original_object == 0)
+		{			
+			index = -1;
+			break;
+		}
+
+		if (!compare->compare(original_object, searched_data))
+		{
+			// Found it
+			index = ind;
+			break;
+		}
+	}
+	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+	return index;
+}
+
+//--------------------------------------------------
+
+/**
+ * This template function searches the supplied array for given object starting from the last index.
+ * Function returns the index to the found object or -1 if not found or there 
+ * is some other error.
+ * Type must have the following member functions:
+ * i32_t compare(const Type * const data)
+ */
+template <class Type>
+const i32_t find_next_with_compare(
+	const i32_t last_index,
+	const abs_eap_array_compare_c<Type> * const compare,
+	EAP_TEMPLATE_CONST eap_array_c<Type> * const original_array, ///< Stupid Windows compiler cannot compile "const eap_array_c<Type> * const".
+	const Type * const searched_data,
+	abs_eap_am_tools_c * const m_am_tools)
+{
+	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
+	EAP_UNREFERENCED_PARAMETER(m_am_tools);
+
+	i32_t index = -1;
+	for (u32_t ind = last_index+1; ind < original_array->get_object_count(); ind++)
+	{
+		Type * original_object = original_array->get_object(ind);
+		if (original_object == 0)
+		{			
+			index = -1;
+			break;
+		}
+
+		if (!compare->compare(original_object, searched_data))
+		{
+			// Found it
+			index = ind;
+			break;
+		}
+	}
+	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+	return index;
+}
+
+//--------------------------------------------------
+
+/**
+ * This template function searches the supplied array for given simple type object.
+ * Simple types are u16_t, eap_status_e, ...
+ * It returns the index to the found object or -1 if not found or there 
+ * is some other error.
+ */
+template <class Type>
+const i32_t find_simple(
+	EAP_TEMPLATE_CONST eap_array_c<Type> * const original_array, ///< Stupid Windows compiler cannot compile "const eap_array_c<Type> * const".
+	const Type * const searched_data,
+	abs_eap_am_tools_c * const m_am_tools)
+{
+	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
+	EAP_UNREFERENCED_PARAMETER(m_am_tools);
+
+	i32_t index = -1;
+	for (u32_t ind = 0; ind < original_array->get_object_count(); ind++)
+	{
+		Type * original_object = original_array->get_object(ind);
+		if (original_object == 0)
+		{			
+			index = -1;
+			break;
+		}
+		if (*original_object == *searched_data)
+		{
+			// Found it
+			index = ind;
+			break;
+		}
+		
+	}
+
+	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+	return index;
+}
+
+//--------------------------------------------------
+
+/**
+ * This template function searches the supplied array for given simple type object.
+ * Simple types are u16_t, eap_status_e, ...
+ * It returns the index to the found object or -1 if not found or there 
+ * is some other error.
+ */
+template <class Type>
+const i32_t find_next_simple(
+	const i32_t last_index,
+	EAP_TEMPLATE_CONST eap_array_c<Type> * const original_array, ///< Stupid Windows compiler cannot compile "const eap_array_c<Type> * const".
+	const Type * const searched_data,
+	abs_eap_am_tools_c * const m_am_tools)
+{
+	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
+	EAP_UNREFERENCED_PARAMETER(m_am_tools);
+
+	i32_t index = -1;
+	for (u32_t ind = last_index+1; ind < original_array->get_object_count(); ind++)
+	{
+		Type * original_object = original_array->get_object(ind);
+		if (original_object == 0)
+		{			
+			index = -1;
+			break;
+		}
+		if (*original_object == *searched_data)
+		{
+			// Found it
+			index = ind;
+			break;
+		}
+		
+	}
+
+	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+	return index;
+}
+
+//--------------------------------------------------
+
+/**
+ * Template function for_each() runs supplied function to all type objects of the supplied array.
+ */
+template <class Type>
+eap_status_e for_each(
+	EAP_TEMPLATE_CONST eap_array_c<Type> * const original_array, ///< Stupid Windows compiler cannot compile "const eap_array_c<Type> * const".
+	eap_status_e (*function)(
+		Type * const value,
+		abs_eap_am_tools_c * const m_am_tools),
+	abs_eap_am_tools_c * const m_am_tools,
+	const bool do_not_care_errors)
+{
+	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
+
+	eap_status_e status = eap_status_ok; // Note original_array may be empty, then for loop will not be run. 
+
+	EAP_TRACE_DEBUG(
+		m_am_tools, 
+		TRACE_FLAGS_DEFAULT, 
+		(EAPL("for_each(): function=0x%08x.\n"),
+		 function));
+
+
+	for (u32_t ind = 0; ind < original_array->get_object_count(); ind++)
+	{
+		Type * original_object = original_array->get_object(ind);
+
+		EAP_TRACE_DEBUG(
+			m_am_tools, 
+			TRACE_FLAGS_DEFAULT, 
+			(EAPL("for_each(): object=0x%08x, ")
+			 EAPL("function=0x%08x.\n"),
+			 original_object,
+			 function));
+
+		if (do_not_care_errors == false
+			&& original_object == 0)
+		{
+			EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+			return EAP_STATUS_RETURN(m_am_tools, eap_status_process_general_error);
+		}
+		else if (original_object != 0)
+		{
+			status = function(original_object, m_am_tools);
+
+			if (do_not_care_errors == false
+				&& status != eap_status_ok)
+			{
+				EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+				return EAP_STATUS_RETURN(m_am_tools, status);
+			}
+		}
+	}
+
+	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+	return EAP_STATUS_RETURN(m_am_tools, status);
+}
+
+//--------------------------------------------------
+
+#endif //#if !defined(_EAP_ARRAY_ALGORITHMS_H_)
+
+
+//--------------------------------------------------
+
+
+
+// End.