--- /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.