Chris@16: // (C) Copyright 2008 CodeRage, LLC (turkanis at coderage dot com) Chris@16: // (C) Copyright 2005-2007 Jonathan Turkanis Chris@16: // (C) Copyright Jonathan Graehl 2004. Chris@16: // Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.) Chris@16: Chris@16: // See http://www.boost.org/libs/iostreams for documentation. Chris@16: Chris@16: // Used by mapped_file.cpp. Chris@16: Chris@16: #ifndef BOOST_IOSTREAMS_DETAIL_SYSTEM_FAILURE_HPP_INCLUDED Chris@16: #define BOOST_IOSTREAMS_DETAIL_SYSTEM_FAILURE_HPP_INCLUDED Chris@16: Chris@16: #if defined(_MSC_VER) && (_MSC_VER >= 1020) Chris@16: # pragma once Chris@16: #endif Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include // failure. Chris@16: Chris@16: #if defined(BOOST_NO_STDC_NAMESPACE) && !defined(__LIBCOMO__) Chris@16: namespace std { using ::strlen; } Chris@16: #endif Chris@16: Chris@16: #ifdef BOOST_IOSTREAMS_WINDOWS Chris@16: # define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers Chris@16: # include Chris@16: #else Chris@16: # include Chris@16: # include Chris@16: #endif Chris@16: Chris@16: namespace boost { namespace iostreams { namespace detail { Chris@16: Chris@16: inline BOOST_IOSTREAMS_FAILURE system_failure(const char* msg) Chris@16: { Chris@16: std::string result; Chris@16: #ifdef BOOST_IOSTREAMS_WINDOWS Chris@16: DWORD err; Chris@16: LPVOID lpMsgBuf; Chris@16: if ( (err = ::GetLastError()) != NO_ERROR && Chris@16: ::FormatMessageA( FORMAT_MESSAGE_ALLOCATE_BUFFER | Chris@16: FORMAT_MESSAGE_FROM_SYSTEM, Chris@16: NULL, Chris@16: err, Chris@16: MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), Chris@16: (LPSTR) &lpMsgBuf, Chris@16: 0, Chris@16: NULL ) != 0 ) Chris@16: { Chris@16: result.reserve(std::strlen(msg) + 2 + std::strlen((LPSTR)lpMsgBuf)); Chris@16: result.append(msg); Chris@16: result.append(": "); Chris@16: result.append((LPSTR) lpMsgBuf); Chris@16: ::LocalFree(lpMsgBuf); Chris@16: } else { Chris@16: result += msg; Chris@16: } Chris@16: #else Chris@16: const char* system_msg = errno ? strerror(errno) : ""; Chris@16: result.reserve(std::strlen(msg) + 2 + std::strlen(system_msg)); Chris@16: result.append(msg); Chris@16: result.append(": "); Chris@16: result.append(system_msg); Chris@16: #endif Chris@16: return BOOST_IOSTREAMS_FAILURE(result); Chris@16: } Chris@16: Chris@16: inline BOOST_IOSTREAMS_FAILURE system_failure(const std::string& msg) Chris@16: { return system_failure(msg.c_str()); } Chris@16: Chris@16: inline void throw_system_failure(const char* msg) Chris@16: { boost::throw_exception(system_failure(msg)); } Chris@16: Chris@16: inline void throw_system_failure(const std::string& msg) Chris@16: { boost::throw_exception(system_failure(msg)); } Chris@16: Chris@16: } } } // End namespaces detail, iostreams, boost. Chris@16: Chris@16: #endif // #ifndef BOOST_IOSTREAMS_DETAIL_SYSTEM_FAILURE_HPP_INCLUDED