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

/*
* %version: 4 %
*/

#if !defined(_EAP_NETWORK_ID_H_)
#define _EAP_NETWORK_ID_H_

#include "eap_tools.h"
#include "abs_eap_am_tools.h"
#include "eap_am_tools.h"
#include "eap_am_export.h"

/// This class stores the protocol layer network identity.
/**
 * A eap_am_network_id_c class.
 * Network addresses are handled through eap_am_network_id_c class.
 * It includes source and destination addresses and the type of packet. 
 * Addresses are mostly Ethernet addresses. Packet type is the type of Ethernet packet.
 * The eap_am_network_id class stores the addresses using the eap_variable_data objects.
 */
class EAP_EXPORT eap_am_network_id_c
{

private:

	/// This is pointer to the tools class.
	abs_eap_am_tools_c * const m_am_tools;

	/// This struct decreases the memory print of eap_am_network_id_c.
	class eap_am_network_id_impl_str
	{
	public:
		~eap_am_network_id_impl_str();

		eap_am_network_id_impl_str(
			abs_eap_am_tools_c * const tools);

		/// This is source address.
		eap_variable_data_c m_source;

		/// This is destination address.
		eap_variable_data_c m_destination;

		/// This is type of the packet. Mostly this is Ethernet type.
		u16_t m_type;

		/// This indicates whether this object was generated successfully.
		bool m_is_valid;
	};

	/// This is pointer to data of eap_am_network_id_c.
	/// This decreases memory print of eap_am_network_id_c.
	/// This decreases stack usage of EAP_Core.
	eap_am_network_id_impl_str *  m_data;

	eap_status_e initialize_members();

	/**
	 * The set_is_valid() function sets the state of the eap_core object valid.
	 * The eap_core object calls this function after it is initialized.
	 */
	EAP_FUNC_IMPORT void set_is_valid();

public:

	/**
	 * The destructor does nothing extra. The buffers of each address are 
	 * freed in the destructor of the eap_variable_data class.
	 */
	EAP_FUNC_IMPORT virtual ~eap_am_network_id_c();

	/**
	 * This version initializes the object.
	 * @param tools parameter is pointer to the tools class.
	 */
	EAP_FUNC_IMPORT eap_am_network_id_c(
		abs_eap_am_tools_c * const tools);

	/**
	 * This version takes addresses as pointers to any data.
	 * This could be used to initialize addresses from the received packet.
	 * @param tools parameter is pointer to the tools class.
	 * @param source parameter is pointer to the source address.
	 * @param source_length parameter is length of the source address.
	 * @param destination parameter is pointer to the destination address.
	 * @param destination_length parameter is length of the destination address.
	 * @param type parameter is type of the packet. Mostly this is Ethernet type.
	 * @param free_id parameter indicates whether the source and destination buffers must be freed in destructors.
	 * @param writable_id parameter indicates whether the source and destination buffers are writable.
	 *
	 * NOTE the data buffers are NOT copied.
	 */
	EAP_FUNC_IMPORT eap_am_network_id_c(
		abs_eap_am_tools_c * const tools,
		const void * const source,
		const u32_t source_length,
		const void * const destination,
		const u32_t destination_length,
		const u16_t type,
		const bool free_id,
		const bool writable_id);

	/**
	 * This version takes addresses as pointers to eap_variable_data_c.
	 * @param tools parameter is pointer to the tools class.
	 * @param source parameter is pointer to the source address.
	 * @param destination parameter is pointer to the destination address.
	 * @param type parameter is type of the packet. Mostly this is Ethernet type.
	 *
	 * NOTE the data buffers are NOT copied. This is used to swap addresses of existing
	 * eap_am_network_id_c object and create a new object using existing addresses.
	 */
	EAP_FUNC_IMPORT eap_am_network_id_c(
		abs_eap_am_tools_c * const tools,
		const eap_variable_data_c * const source,
		const eap_variable_data_c * const destination,
		const u16_t type);

	/**
	 * This version uses the data from existing object.
	 * @param tools parameter is pointer to the tools class.
	 * @param network_id parameter is pointer to the existing object.
	 *
	 * NOTE this copies the addresses.
	 */
	EAP_FUNC_IMPORT eap_am_network_id_c(
		abs_eap_am_tools_c * const tools,
		const eap_am_network_id_c * const network_id);

	/**
	 * This function uses the data from existing object.
	 * @param network_id parameter is pointer to the existing object.
	 *
	 * NOTE this copies the addresses.
	 */
	EAP_FUNC_IMPORT eap_status_e set_copy_of_network_id(
		const eap_am_network_id_c * const network_id);

	EAP_FUNC_IMPORT eap_status_e set_copy_of_am_network_id(
		const void * const source,
		const u32_t source_length,
		const void * const destination,
		const u32_t destination_length,
		const u16_t type);

	/**
	 * The get_is_valid() function returns the status of the eap_core object.
	 * True indicates the object is initialized succesfully.
	 */
	EAP_FUNC_IMPORT bool get_is_valid() const;

	/**
	 * The get_is_valid_data() function returns the status of the eap_core object.
	 * True indicates the object does include valid addresses.
	 */
	EAP_FUNC_IMPORT bool get_is_valid_data() const;

	/**
	 * The get_source_id() function returns pointer to the source address.
	 */
	EAP_FUNC_IMPORT const eap_variable_data_c * get_source_id() const;

	/**
	 * The get_destination_id() function returns pointer to the destination address.
	 */
	EAP_FUNC_IMPORT const eap_variable_data_c * get_destination_id() const;


	/**
	 * The get_source() function returns pointer to the source data.
	 */
	EAP_FUNC_IMPORT const u8_t * get_source() const;

	/**
	 * The get_destination() function returns pointer to the destination data.
	 */
	EAP_FUNC_IMPORT const u8_t * get_destination() const;


	/**
	 * The get_source_length() function returns length of the source address.
	 */
	EAP_FUNC_IMPORT u32_t get_source_length() const;

	/**
	 * The get_destination_length() function returns length of the destination address.
	 */
	EAP_FUNC_IMPORT u32_t get_destination_length() const;

	/**
	 * The get_type() function returns type of the packet.
	 */
	EAP_FUNC_IMPORT u16_t get_type() const;

	/**
	 * The get_network_id() function returns pointer to this.
	 */
	EAP_FUNC_IMPORT const eap_am_network_id_c * get_network_id() const;

	/**
	 * The copy() function copies the eap_am_network_id object.
	 * The data of addresses are copied to new buffers.
	 */
	EAP_FUNC_IMPORT eap_am_network_id_c * copy() const;

	/**
	 * Compare the objects are identical.
	 * @return false if data of objects differs.
	 * @return true if data of objects are the same.
	 */
	EAP_FUNC_IMPORT bool compare_network_id(const eap_am_network_id_c * const network_id) const;

	/**
	 * The get_type() function sets type of the packet.
	 */
	EAP_FUNC_IMPORT void set_type(const u16_t type);

	/**
	 * Resets the object.
	 */
	EAP_FUNC_IMPORT void reset();
};


#endif //#if !defined(_EAP_NETWORK_ID_H_)

//--------------------------------------------------



// End.
