/*
* 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: %
*/

// INCLUDES
#if !defined( _EAP_AM_TOOLS_SYMBIAN_H_ )
#define _EAP_AM_TOOLS_SYMBIAN_H_

#include <e32std.h>
#include <e32svr.h>

//#include "eap_am_memory.h"

#include "eap_am_tools.h"
#include "eap_variable_data.h"
#include "eap_tools.h"
#include "eap_status.h"
#include "eap_am_export.h"
#include "eap_am_crypto_symbian.h"
#include "eap_timer_queue.h"
#include "eap_am_mutex_symbian.h"
#include <f32file.h>
#include <d32dbms.h>

/// This class implements functionality of platform adaptation of Symbian.
/**
 *	See function comments on abs_eap_am_tools_c and eap_am_tools_c.
 */
class EAP_EXPORT eap_am_tools_symbian_c
: public eap_am_tools_c
//, public CActive
, public CTimer
{
private:

#if defined(USE_EAP_FILE_TRACE)

	/// File server used in filetrace.
	RFs m_Fs;

	/// File used in filetrace.
	RFile m_LogFile;

	/// File name used in filetrace.
	TBuf<64> m_filename;

#endif //#if defined(USE_EAP_FILE_TRACE)

	/// Prefix string used in filetrace.
	eap_variable_data_c m_prefix_string;

	u64_t m_start_ticks;

	bool m_directory_exists;

	eap_am_crypto_symbian_c m_crypto;

	eap_timer_queue_c m_timer_queue;

	eap_am_mutex_symbian_c m_global_mutex;
	
	eap_am_mutex_symbian_c m_trace_mutex;

	bool m_run_thread;

	bool m_is_valid;

	bool m_configure_called;

#if defined(USE_EAP_TRACE) || defined(USE_EAP_TRACE_ALWAYS)
	/// Bufers are used in traces.
	TBuf8<1024> m_args_buf;
#if defined(USE_EAP_HARDWARE_TRACE)
	TBuf16<1024> m_trace_buf_16;
#endif //#if defined(USE_EAP_HARDWARE_TRACE)
#endif //#if defined(USE_EAP_TRACE) || defined(USE_EAP_TRACE_ALWAYS)

	/// Buffers are used in string conversions.
	TBuf8<1024> m_format_buf;
	TBuf8<1024> m_trace_buf;

	/// These member variables are used in Symbian timer.
	TUint iInterval;
	u64_t iStartTime;
	u64_t iLastTime;

	// This flag tells whether the trace log file is open.
	bool m_logfile_open;

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

	EAP_FUNC_IMPORT void sprint(TDes& KPrintBuf, eap_const_string format, ...);

	EAP_FUNC_IMPORT void KFormatVArgs(TDes& aDes, const TDesC& aFmt, VA_LIST aList);

	// Member function to support active sceduler timer.
	void StartTimer(const TUint aInterval);
	void StopTimer();
	TBool TimerRunning();
	void RunL();
	void DoCancel();

	u32_t limit_microsecond_timeout(u32_t next_timeout_millisecond);

	// On purpose unimplemented constructors.
	eap_am_tools_symbian_c(eap_am_tools_symbian_c &source);
	const eap_am_tools_symbian_c & operator=(const eap_am_tools_symbian_c& source);

public:

	EAP_FUNC_IMPORT virtual ~eap_am_tools_symbian_c();

	EAP_FUNC_IMPORT eap_am_tools_symbian_c(eap_const_string pfilename);


	/// See function comments on abs_eap_am_tools_c and eap_am_tools_c.

	EAP_FUNC_IMPORT eap_status_e configure();

	EAP_FUNC_IMPORT bool get_use_eap_milli_second_timer();

	EAP_FUNC_IMPORT void set_use_eap_milli_second_timer(
		const bool use_eap_millisecond_timer);

	EAP_FUNC_IMPORT void enter_global_mutex();

	EAP_FUNC_IMPORT void leave_global_mutex();

	EAP_FUNC_IMPORT abs_eap_am_mutex_c * get_global_mutex();

	EAP_FUNC_IMPORT void enter_trace_mutex();

	EAP_FUNC_IMPORT void leave_trace_mutex();

	EAP_FUNC_IMPORT abs_eap_am_mutex_c * get_trace_mutex();


	EAP_FUNC_IMPORT void set_timer_resolution_ms(const u32_t timer_resolution_ms);

	EAP_FUNC_IMPORT u32_t get_timer_resolution_ms();

	EAP_FUNC_IMPORT u32_t pulse_timer(const u32_t elapsed_time_in_ms);

	EAP_FUNC_IMPORT bool get_timer_queue_is_empty();


	EAP_FUNC_IMPORT eap_status_e start_timer_thread();

	EAP_FUNC_IMPORT eap_status_e stop_timer_thread();

	EAP_FUNC_IMPORT bool get_is_timer_thread_active();


	EAP_FUNC_IMPORT eap_status_e set_trace_prefix(
		const eap_variable_data_c * const prefix8bit);

	EAP_FUNC_IMPORT eap_status_e set_trace_file_name(const eap_variable_data_c * const trace_output_file);

	EAP_FUNC_IMPORT void set_max_trace_file_size(const u32_t max_trace_file_size);

	EAP_FUNC_IMPORT u32_t snprintf(u8_t * const buffer, u32_t buffer_size, eap_format_string format, ...);

	EAP_FUNC_IMPORT void formatted_print(eap_format_string format, ...);

	EAP_FUNC_IMPORT void memmove(void *dest, const void *src, const u32_t count);

	EAP_FUNC_IMPORT i32_t memcmp(const void * const dest, const void * const src, const u32_t count);

	EAP_FUNC_IMPORT void memset(void * const src, const i32_t fill_byte, const u32_t count);

	EAP_FUNC_IMPORT void *memchr(
		const void *buf,
		u8_t character,
		u32_t count);

	EAP_FUNC_IMPORT void *memrchr(
		const void *buf,
		u8_t character,
		u32_t count);

	EAP_FUNC_IMPORT u32_t strlen(
		eap_const_string string);

	EAP_FUNC_IMPORT u32_t config_strlen(
		eap_config_string string);

	EAP_FUNC_IMPORT abs_eap_am_crypto_c * get_crypto();

	EAP_FUNC_IMPORT u64_t get_hardware_ticks();

	EAP_FUNC_IMPORT u64_t get_hardware_ticks_of_second();

	EAP_FUNC_IMPORT u64_t get_clock_ticks();

	EAP_FUNC_IMPORT u64_t get_clock_ticks_of_second();

	EAP_FUNC_IMPORT u32_t get_gmt_unix_time();

	EAP_FUNC_IMPORT eap_status_e am_set_timer(
		abs_eap_base_timer_c * const initializer, 
		const u32_t id, 
		void * const data,
		const u32_t p_time_ms);

	EAP_FUNC_IMPORT eap_status_e am_cancel_timer(
		abs_eap_base_timer_c * const initializer, 
		const u32_t id);

	EAP_FUNC_IMPORT eap_status_e am_cancel_all_timers();

	EAP_FUNC_IMPORT eap_status_e re_activate_timer_queue();

	EAP_FUNC_IMPORT void enter_crypto_cs();
	EAP_FUNC_IMPORT void leave_crypto_cs();

	EAP_FUNC_IMPORT void timer_sleep(u32_t milli_seconds);

	EAP_FUNC_IMPORT void sleep(u32_t milli_seconds);

	EAP_FUNC_IMPORT bool get_is_valid() const;

	EAP_FUNC_IMPORT eap_status_e begin_db_transaction(RDbNamedDatabase& aDatabase);

	EAP_FUNC_IMPORT eap_status_e begin_db_update(RDbView& aView);
	
	EAP_FUNC_IMPORT eap_status_e begin_db_delete(RDbView& aView);

	/// This function must call eap_am_tools_c::shutdown_am_tools().
	EAP_FUNC_IMPORT eap_status_e shutdown();

	EAP_FUNC_IMPORT eap_status_e convert_unicode_to_utf8(
		eap_variable_data_c & dest,
		const eap_variable_data_c & src);

	EAP_FUNC_IMPORT eap_status_e convert_utf8_to_unicode(
		eap_variable_data_c & dest,
		const eap_variable_data_c & src);

	EAP_FUNC_IMPORT eap_status_e convert_am_error_to_eapol_error(const i32_t am_error_value);

	EAP_FUNC_IMPORT i32_t convert_eapol_error_to_am_error(eap_status_e aErr);

	EAP_FUNC_IMPORT eap_status_e getenv(
		const eap_variable_data_c * const environment_variable_name,
		eap_variable_data_c * const environment_variable_value);

	EAP_FUNC_IMPORT bool isspace(const u8_t character);

	EAP_FUNC_IMPORT u64_struct u64_t_to_u64_struct(const u64_t value);

	EAP_FUNC_IMPORT u64_t u64_struct_to_u64_t(const u64_struct value);
};

#endif //#if !defined( _EAP_AM_TOOLS_SYMBIAN_H_ )



// End of file
