/*************************************************************************/
/* Copyright (c) 2015 dx, http://kaimi.ru                                */
/*                                                                       */
/* Permission is hereby granted, free of charge, to any person           */
/* obtaining a copy of this software and associated documentation        */
/* files (the "Software"), to deal in the Software without               */
/* restriction, including without limitation the rights to use,          */
/* copy, modify, merge, publish, distribute, sublicense, and/or          */
/* sell copies of the Software, and to permit persons to whom the        */
/* Software is furnished to do so, subject to the following conditions:  */
/* The above copyright notice and this permission notice shall be        */
/* included in all copies or substantial portions of the Software.       */
/*                                                                       */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
/*************************************************************************/
#pragma once
#include <exception>
#include <stdexcept>

namespace pe_bliss
{
//PE exception class
class pe_exception : public std::runtime_error
{
public:
	//Exception IDs
	enum exception_id
	{
		unknown_error,
		bad_pe_file,
		bad_dos_header,
		image_nt_headers_not_found,
		error_reading_image_nt_headers,
		error_reading_data_directories,
		error_reading_file,
		pe_signature_incorrect,
		incorrect_number_of_rva_and_sizes,
		error_changing_section_virtual_size,
		section_number_incorrect,
		section_table_incorrect,
		incorrect_section_alignment,
		incorrect_file_alignment,
		incorrect_size_of_image,
		incorrect_size_of_headers,
		image_section_headers_not_found,
		zero_section_sizes,
		section_incorrect_addr_or_size,
		section_not_found,
		image_section_data_not_found,
		no_section_found,
		image_section_table_incorrect,
		directory_does_not_exist,
		rva_not_exists,
		error_reading_section_header,
		error_reading_overlay,
		incorrect_address_conversion,

		incorrect_export_directory,
		incorrect_import_directory,
		incorrect_relocation_directory,
		incorrect_tls_directory,
		incorrect_config_directory,
		incorrect_bound_import_directory,
		incorrect_resource_directory,
		incorrect_exception_directory,
		incorrect_debug_directory,

		resource_directory_entry_error,
		resource_directory_entry_not_found,
		resource_data_entry_not_found,
		resource_incorrect_bitmap,
		resource_incorrect_icon,
		resource_incorrect_cursor,
		resource_incorrect_string_table,
		resource_string_not_found,
		resource_incorrect_message_table,
		resource_incorrect_version_info,

		advanced_debug_information_request_error,
		image_does_not_have_managed_code,

		section_is_empty,
		data_is_empty,
		stream_is_bad,

		section_is_not_attached,
		insufficient_space,

		cannot_rebase_relocations,

		exports_list_is_empty,
		duplicate_exported_function_ordinal,
		duplicate_exported_function_name,

		version_info_string_does_not_exist,

		no_more_sections_can_be_added,

		no_icon_group_found,
		no_cursor_group_found,

		encoding_convertion_error,

		error_expanding_section,

		cannot_rebuild_image
	};

public:
	//Class constructors
	explicit pe_exception(const char* text, exception_id id = unknown_error);
	explicit pe_exception(const std::string& text, exception_id id = unknown_error);

	//Returns exception ID from exception_id enumeration
	exception_id get_id() const;

	//Destructor
	virtual ~pe_exception() throw()
	{}

private:
	exception_id id_;
};
}
