/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * Copyright 2010, 2017 * Danny Robson */ #include "except.hpp" #include "../debug.hpp" using cruft::win32::error; /////////////////////////////////////////////////////////////////////////////// error::error (DWORD _code): runtime_error (code_string (_code)), m_code (_code) { CHECK_NEQ (m_code, (DWORD)ERROR_SUCCESS); } //----------------------------------------------------------------------------- error::error (void): error (last_code ()) { ; } /////////////////////////////////////////////////////////////////////////////// DWORD error::code (void) const { return m_code; } //----------------------------------------------------------------------------- DWORD error::last_code (void) { return GetLastError (); } /////////////////////////////////////////////////////////////////////////////// void error::try_code (void) { try_code (last_code ()); } //----------------------------------------------------------------------------- void error::try_code (DWORD id) { if (__builtin_expect (id != ERROR_SUCCESS, false)) throw_code (id); } //----------------------------------------------------------------------------- void error::throw_code (void) { throw_code (last_code ()); } //----------------------------------------------------------------------------- void error::throw_code (DWORD code) { CHECK_NEQ (code, (DWORD)ERROR_SUCCESS); throw error (code); } //----------------------------------------------------------------------------- std::string error::code_string (void) { return code_string (last_code ()); } //----------------------------------------------------------------------------- std::string error::code_string (DWORD code) { char message[256]; auto res = FormatMessage ( FORMAT_MESSAGE_FROM_SYSTEM, NULL, code, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), message, std::size (message), NULL ); if (res == 0) { error::throw_code (); } return std::string (message, message + res); }