Merge system from trunk.

------------------------------------------------------------------------
r85699 | chris_kohlhoff | 2013-09-16 23:29:47 +1000 (Mon, 16 Sep 2013) | 2 lines

Add Windows Runtime support to Boost.System.



[SVN r85837]
This commit is contained in:
Christopher Kohlhoff
2013-09-22 21:51:30 +00:00
parent ec4d3bc41e
commit 94898ff8a6

View File

@ -26,7 +26,9 @@
# if defined( BOOST_WINDOWS_API )
# include <windows.h>
# include "local_free_on_destruction.hpp"
# if !defined(WINAPI_FAMILY) || ((WINAPI_FAMILY & WINAPI_PARTITION_APP) == 0)
# include "local_free_on_destruction.hpp"
# endif
# ifndef ERROR_INCORRECT_SIZE
# define ERROR_INCORRECT_SIZE ERROR_BAD_ARGUMENTS
# endif
@ -172,6 +174,17 @@ namespace
using boost::system::errc::invalid_argument;
#endif
# if defined(BOOST_WINDOWS_API)
# if defined(WINAPI_FAMILY) && ((WINAPI_FAMILY & WINAPI_PARTITION_APP) != 0)
// When using the Windows Runtime, most system errors are reported as HRESULTs.
// We want to map the common Win32 errors to their equivalent error condition,
// whether or not they are reported via an HRESULT.
if ( ev < 0 ) // Check for failed HRESULTs only.
if ( HRESULT_FACILITY( ev ) == FACILITY_WIN32 )
ev = HRESULT_CODE( ev );
# endif
# endif
switch ( ev )
{
case 0: return make_error_condition( success );
@ -359,7 +372,36 @@ namespace
std::string system_error_category::message( int ev ) const
{
# ifndef BOOST_NO_ANSI_APIS
# if defined(WINAPI_FAMILY) && ((WINAPI_FAMILY & WINAPI_PARTITION_APP) != 0)
std::string str( 128, char() );
for (;;)
{
DWORD retval = ::FormatMessageA(
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
ev,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
&str[0],
str.size(),
NULL
);
if ( retval > 0 )
{
str.resize( retval );
break;
}
else if ( ::GetLastError() != ERROR_INSUFFICIENT_BUFFER )
{
return std::string("Unknown error");
}
else
{
str.resize( str.size() + str.size()/2 );
}
}
# elif !defined(BOOST_NO_ANSI_APIS)
LPVOID lpMsgBuf = 0;
DWORD retval = ::FormatMessageA(
FORMAT_MESSAGE_ALLOCATE_BUFFER |