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