#include "metapi.h"
#include "unicode.h"
#include "remote_thread.h"
#include "base_inject.h"

MetApi api_instance = {
	// PacketApi
	{
		packet_get_tlv_value_bool,
		packet_get_tlv_value_raw,
		packet_add_completion_handler,
		packet_add_exception,
		packet_add_group,
		packet_add_request_id,
		packet_add_tlv_bool,
		packet_add_tlv_group,
		packet_add_tlv_qword,
		packet_add_tlv_raw,
		packet_add_tlv_string,
		packet_add_tlv_uint,
		packet_add_tlv_wstring,
		packet_add_tlv_wstring_len,
		packet_add_tlvs,
		packet_call_completion_handlers,
		packet_enum_tlv,
		packet_get_tlv,
		packet_get_tlv_group_entry,
		packet_get_tlv_string,
		packet_is_tlv_null_terminated,
		packet_remove_completion_handler,
		packet_transmit,
		packet_transmit_empty_response,
		packet_transmit_response,
		packet_get_tlv_value_string,
		packet_create,
		packet_create_group,
		packet_create_response,
		packet_get_type,
		packet_get_tlv_value_qword,
		packet_get_tlv_meta,
		packet_get_tlv_value_uint,
		packet_get_tlv_uint,
		packet_destroy,
		packet_get_tlv_value_wstring,
		packet_get_tlv_value_reflective_loader,
	},
	// CommandApi
	{
		command_deregister_all,
		command_register_all,
		command_handle,
	},
	// ThreadApi
	{
		thread_destroy,
		thread_join,
		thread_kill,
		thread_run,
		thread_sigterm,
		thread_create,
		thread_open,
		create_remote_thread,
		core_update_thread_token,
	},
	// LockApi
	{
		lock_create,
		lock_acquire,
		lock_destroy,
		lock_release,
	},
	// EventApi
	{
		event_destroy,
		event_poll,
		event_signal,
		event_create,
	},
	// ChannelApi
	{
		channel_exists,
		channel_is_interactive,
		channel_is_flag,
		channel_create,
		channel_create_datagram,
		channel_create_pool,
		channel_create_stream,
		channel_find_by_id,
		channel_close,
		channel_default_io_handler,
		channel_get_class,
		channel_get_id,
		channel_interact,
		channel_open,
		channel_read,
		channel_read_from_buffered,
		channel_write,
		channel_write_to_buffered,
		channel_write_to_remote,
		channel_get_native_io_context,
		channel_get_type,
		channel_get_buffered_io_context,
		channel_get_flags,
		channel_destroy,
		channel_set_buffered_io_handler,
		channel_set_flags,
		channel_set_interactive,
		channel_set_native_io_context,
		channel_set_type,
	},
	// SchedulerApi
	{
		scheduler_initialize,
		scheduler_destroy,
		scheduler_insert_waitable,
		scheduler_signal_waitable,
		scheduler_waitable_thread,
	},
	// StringApi
	{
		utf8_to_wchar,
		wchar_to_utf8,
	},
	// InjectApi
	{
		inject_dll,
		inject_via_apcthread,
		inject_via_remotethread,
		inject_via_remotethread_wow64,
	},
	// DesktopApi
	{
		core_update_desktop,
	},
	// ListApi
	{
		list_add,
		list_clear,
		list_enumerate,
		list_push,
		list_remove,
		list_remove_at,
		list_count,
		list_create,
		list_get,
		list_pop,
		list_shift,
		list_destroy,
	},
};

MetApi* met_api = &api_instance;