Add support for Windows 8.1 store apps.
diff --git a/asio/include/Makefile.am b/asio/include/Makefile.am
index 7fe3b28..cbca7cc 100644
--- a/asio/include/Makefile.am
+++ b/asio/include/Makefile.am
@@ -211,6 +211,7 @@
asio/detail/wait_handler.hpp \
asio/detail/wait_op.hpp \
asio/detail/weak_ptr.hpp \
+ asio/detail/winapp_thread.hpp \
asio/detail/wince_thread.hpp \
asio/detail/win_event.hpp \
asio/detail/win_fd_set_adapter.hpp \
diff --git a/asio/include/asio/detail/config.hpp b/asio/include/asio/detail/config.hpp
index 9d7bd52..f2e7c81 100644
--- a/asio/include/asio/detail/config.hpp
+++ b/asio/include/asio/detail/config.hpp
@@ -517,25 +517,41 @@
# endif // !defined(ASIO_DISABLE_STD_MUTEX_AND_CONDVAR)
#endif // !defined(ASIO_HAS_STD_MUTEX_AND_CONDVAR)
-// WinRT target.
-#if !defined(ASIO_WINDOWS_RUNTIME)
-# if defined(__cplusplus_winrt)
+// Windows App target. Windows but with a limited API.
+#if !defined(ASIO_WINDOWS_APP)
+# if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0603)
# include <winapifamily.h>
# if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) \
&& !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
-# define ASIO_WINDOWS_RUNTIME 1
+# define ASIO_WINDOWS_APP 1
# endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
// && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
-# endif // defined(__cplusplus_winrt)
+# endif // defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0603)
+#endif // !defined(ASIO_WINDOWS_APP)
+
+// Legacy WinRT target. Windows App is preferred.
+#if !defined(ASIO_WINDOWS_RUNTIME)
+# if !defined(ASIO_WINDOWS_APP)
+# if defined(__cplusplus_winrt)
+# include <winapifamily.h>
+# if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) \
+ && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
+# define ASIO_WINDOWS_RUNTIME 1
+# endif // WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP)
+ // && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
+# endif // defined(__cplusplus_winrt)
+# endif // !defined(ASIO_WINDOWS_APP)
#endif // !defined(ASIO_WINDOWS_RUNTIME)
-// Windows target. Excludes WinRT.
+// Windows target. Excludes WinRT but includes Windows App targets.
#if !defined(ASIO_WINDOWS)
# if !defined(ASIO_WINDOWS_RUNTIME)
# if defined(ASIO_HAS_BOOST_CONFIG) && defined(BOOST_WINDOWS)
# define ASIO_WINDOWS 1
# elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__)
# define ASIO_WINDOWS 1
+# elif defined(ASIO_WINDOWS_APP)
+# define ASIO_WINDOWS 1
# endif // defined(ASIO_HAS_BOOST_CONFIG) && defined(BOOST_WINDOWS)
# endif // !defined(ASIO_WINDOWS_RUNTIME)
#endif // !defined(ASIO_WINDOWS)
@@ -603,11 +619,11 @@
#if !defined(ASIO_HAS_IOCP)
# if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
# if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0400)
-# if !defined(UNDER_CE)
+# if !defined(UNDER_CE) && !defined(ASIO_WINDOWS_APP)
# if !defined(ASIO_DISABLE_IOCP)
# define ASIO_HAS_IOCP 1
# endif // !defined(ASIO_DISABLE_IOCP)
-# endif // !defined(UNDER_CE)
+# endif // !defined(UNDER_CE) && !defined(ASIO_WINDOWS_APP)
# endif // defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0400)
# endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
#endif // !defined(ASIO_HAS_IOCP)
@@ -723,9 +739,9 @@
#if !defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE)
# if !defined(ASIO_DISABLE_WINDOWS_OBJECT_HANDLE)
# if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
-# if !defined(UNDER_CE)
+# if !defined(UNDER_CE) && !defined(ASIO_WINDOWS_APP)
# define ASIO_HAS_WINDOWS_OBJECT_HANDLE 1
-# endif // !defined(UNDER_CE)
+# endif // !defined(UNDER_CE) && !defined(ASIO_WINDOWS_APP)
# endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
# endif // !defined(ASIO_DISABLE_WINDOWS_OBJECT_HANDLE)
#endif // !defined(ASIO_HAS_WINDOWS_OBJECT_HANDLE)
diff --git a/asio/include/asio/detail/impl/socket_ops.ipp b/asio/include/asio/detail/impl/socket_ops.ipp
index 6d3de48..c06497b 100644
--- a/asio/include/asio/detail/impl/socket_ops.ipp
+++ b/asio/include/asio/detail/impl/socket_ops.ipp
@@ -1633,7 +1633,8 @@
return socket_error_retval;
}
-#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+#if defined(ASIO_WINDOWS) && !defined(ASIO_WINDOWS_APP) \
+ || defined(__CYGWIN__)
if (cached)
{
// Check if socket is still connected.
@@ -1654,9 +1655,11 @@
ec = asio::error_code();
return 0;
}
-#else // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+#else // defined(ASIO_WINDOWS) && !defined(ASIO_WINDOWS_APP)
+ // || defined(__CYGWIN__)
(void)cached;
-#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+#endif // defined(ASIO_WINDOWS) && !defined(ASIO_WINDOWS_APP)
+ // || defined(__CYGWIN__)
clear_last_error();
int result = error_wrapper(call_getpeername(
diff --git a/asio/include/asio/detail/impl/win_event.ipp b/asio/include/asio/detail/impl/win_event.ipp
index 38bfe52..c9b60e4 100644
--- a/asio/include/asio/detail/impl/win_event.ipp
+++ b/asio/include/asio/detail/impl/win_event.ipp
@@ -31,7 +31,11 @@
win_event::win_event()
: state_(0)
{
+#if defined(ASIO_WINDOWS_APP)
+ events_[0] = ::CreateEventEx(0, 0, CREATE_EVENT_MANUAL_RESET, 0);
+#else // defined(ASIO_WINDOWS_APP)
events_[0] = ::CreateEvent(0, true, false, 0);
+#endif // defined(ASIO_WINDOWS_APP)
if (!events_[0])
{
DWORD last_error = ::GetLastError();
@@ -40,7 +44,11 @@
asio::detail::throw_error(ec, "event");
}
+#if defined(ASIO_WINDOWS_APP)
+ events_[1] = ::CreateEventEx(0, 0, 0, 0);
+#else // defined(ASIO_WINDOWS_APP)
events_[1] = ::CreateEvent(0, false, false, 0);
+#endif // defined(ASIO_WINDOWS_APP)
if (!events_[1])
{
DWORD last_error = ::GetLastError();
diff --git a/asio/include/asio/detail/impl/win_mutex.ipp b/asio/include/asio/detail/impl/win_mutex.ipp
index 608f4f5..6a601b2 100644
--- a/asio/include/asio/detail/impl/win_mutex.ipp
+++ b/asio/include/asio/detail/impl/win_mutex.ipp
@@ -43,6 +43,8 @@
// we'll just call the Windows API and hope.
# if defined(UNDER_CE)
::InitializeCriticalSection(&crit_section_);
+# elif defined(ASIO_WINDOWS_APP)
+ ::InitializeCriticalSectionEx(&crit_section_, 0x80000000, 0);
# else
if (!::InitializeCriticalSectionAndSpinCount(&crit_section_, 0x80000000))
return ::GetLastError();
@@ -53,6 +55,8 @@
{
# if defined(UNDER_CE)
::InitializeCriticalSection(&crit_section_);
+# elif defined(ASIO_WINDOWS_APP)
+ ::InitializeCriticalSectionEx(&crit_section_, 0x80000000, 0);
# else
if (!::InitializeCriticalSectionAndSpinCount(&crit_section_, 0x80000000))
return ::GetLastError();
diff --git a/asio/include/asio/detail/impl/win_static_mutex.ipp b/asio/include/asio/detail/impl/win_static_mutex.ipp
index 2654aa6..024ad49 100644
--- a/asio/include/asio/detail/impl/win_static_mutex.ipp
+++ b/asio/include/asio/detail/impl/win_static_mutex.ipp
@@ -49,13 +49,23 @@
mutex_name, 128, L"asio-58CCDC44-6264-4842-90C2-F3C545CB8AA7-%u-%p",
static_cast<unsigned int>(::GetCurrentProcessId()), this);
+#if defined(ASIO_WINDOWS_APP)
+ HANDLE mutex = ::CreateMutexExW(0, mutex_name, CREATE_MUTEX_INITIAL_OWNER, 0);
+#else // defined(ASIO_WINDOWS_APP)
HANDLE mutex = ::CreateMutexW(0, TRUE, mutex_name);
+#endif // defined(ASIO_WINDOWS_APP)
DWORD last_error = ::GetLastError();
if (mutex == 0)
return ::GetLastError();
if (last_error == ERROR_ALREADY_EXISTS)
+ {
+#if defined(ASIO_WINDOWS_APP)
+ ::WaitForSingleObjectEx(mutex, INFINITE, false);
+#else // defined(ASIO_WINDOWS_APP)
::WaitForSingleObject(mutex, INFINITE);
+#endif // defined(ASIO_WINDOWS_APP)
+ }
if (initialised_)
{
@@ -83,6 +93,8 @@
{
# if defined(UNDER_CE)
::InitializeCriticalSection(&crit_section_);
+# elif defined(ASIO_WINDOWS_APP)
+ ::InitializeCriticalSectionEx(&crit_section_, 0x80000000, 0);
# else
if (!::InitializeCriticalSectionAndSpinCount(&crit_section_, 0x80000000))
{
diff --git a/asio/include/asio/detail/impl/win_thread.ipp b/asio/include/asio/detail/impl/win_thread.ipp
index 70b2c85..784f2c2 100644
--- a/asio/include/asio/detail/impl/win_thread.ipp
+++ b/asio/include/asio/detail/impl/win_thread.ipp
@@ -17,7 +17,9 @@
#include "asio/detail/config.hpp"
-#if defined(ASIO_WINDOWS) && !defined(UNDER_CE)
+#if defined(ASIO_WINDOWS) \
+ && !defined(ASIO_WINDOWS_APP) \
+ && !defined(UNDER_CE)
#include <process.h>
#include "asio/detail/throw_error.hpp"
@@ -134,6 +136,8 @@
#include "asio/detail/pop_options.hpp"
-#endif // defined(ASIO_WINDOWS) && !defined(UNDER_CE)
+#endif // defined(ASIO_WINDOWS)
+ // && !defined(ASIO_WINDOWS_APP)
+ // && !defined(UNDER_CE)
#endif // ASIO_DETAIL_IMPL_WIN_THREAD_IPP
diff --git a/asio/include/asio/detail/local_free_on_block_exit.hpp b/asio/include/asio/detail/local_free_on_block_exit.hpp
index 2960dea..05d9f9e 100644
--- a/asio/include/asio/detail/local_free_on_block_exit.hpp
+++ b/asio/include/asio/detail/local_free_on_block_exit.hpp
@@ -18,6 +18,7 @@
#include "asio/detail/config.hpp"
#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+#if !defined(ASIO_WINDOWS_APP)
#include "asio/detail/noncopyable.hpp"
#include "asio/detail/socket_types.hpp"
@@ -52,6 +53,7 @@
#include "asio/detail/pop_options.hpp"
+#endif // !defined(ASIO_WINDOWS_APP)
#endif // defined(ASIO_WINDOWS) || defined(__CYGWIN__)
#endif // ASIO_DETAIL_LOCAL_FREE_ON_BLOCK_EXIT_HPP
diff --git a/asio/include/asio/detail/socket_types.hpp b/asio/include/asio/detail/socket_types.hpp
index f2600c2..57cf877 100644
--- a/asio/include/asio/detail/socket_types.hpp
+++ b/asio/include/asio/detail/socket_types.hpp
@@ -37,7 +37,9 @@
# endif // defined(WINAPI_FAMILY)
# include <winsock2.h>
# include <ws2tcpip.h>
-# include <mswsock.h>
+# if !defined(ASIO_WINDOWS_APP)
+# include <mswsock.h>
+# endif // !defined(ASIO_WINDOWS_APP)
# if defined(ASIO_WSPIAPI_H_DEFINED)
# undef _WSPIAPI_H_
# undef ASIO_WSPIAPI_H_DEFINED
@@ -47,7 +49,9 @@
# pragma comment(lib, "ws2.lib")
# elif defined(_MSC_VER) || defined(__BORLANDC__)
# pragma comment(lib, "ws2_32.lib")
-# pragma comment(lib, "mswsock.lib")
+# if !defined(ASIO_WINDOWS_APP)
+# pragma comment(lib, "mswsock.lib")
+# endif // !defined(ASIO_WINDOWS_APP)
# endif // defined(_MSC_VER) || defined(__BORLANDC__)
# endif // !defined(ASIO_NO_DEFAULT_LINKED_LIBS)
# include "asio/detail/old_win_sdk_compat.hpp"
diff --git a/asio/include/asio/detail/thread.hpp b/asio/include/asio/detail/thread.hpp
index 3592a70..e1c2fa3 100644
--- a/asio/include/asio/detail/thread.hpp
+++ b/asio/include/asio/detail/thread.hpp
@@ -22,6 +22,8 @@
#elif defined(ASIO_WINDOWS)
# if defined(UNDER_CE)
# include "asio/detail/wince_thread.hpp"
+# elif defined(ASIO_WINDOWS_APP)
+# include "asio/detail/winapp_thread.hpp"
# else
# include "asio/detail/win_thread.hpp"
# endif
@@ -41,6 +43,8 @@
#elif defined(ASIO_WINDOWS)
# if defined(UNDER_CE)
typedef wince_thread thread;
+# elif defined(ASIO_WINDOWS_APP)
+typedef winapp_thread thread;
# else
typedef win_thread thread;
# endif
diff --git a/asio/include/asio/detail/win_event.hpp b/asio/include/asio/detail/win_event.hpp
index f4170b9..adb0c78 100644
--- a/asio/include/asio/detail/win_event.hpp
+++ b/asio/include/asio/detail/win_event.hpp
@@ -101,7 +101,11 @@
{
state_ += 2;
lock.unlock();
+#if defined(ASIO_WINDOWS_APP)
+ ::WaitForMultipleObjectsEx(2, events_, false, INFINITE, false);
+#else // defined(ASIO_WINDOWS_APP)
::WaitForMultipleObjects(2, events_, false, INFINITE);
+#endif // defined(ASIO_WINDOWS_APP)
lock.lock();
state_ -= 2;
}
diff --git a/asio/include/asio/detail/win_thread.hpp b/asio/include/asio/detail/win_thread.hpp
index 4286814..3d97c76 100644
--- a/asio/include/asio/detail/win_thread.hpp
+++ b/asio/include/asio/detail/win_thread.hpp
@@ -17,7 +17,9 @@
#include "asio/detail/config.hpp"
-#if defined(ASIO_WINDOWS) && !defined(UNDER_CE)
+#if defined(ASIO_WINDOWS) \
+ && !defined(ASIO_WINDOWS_APP) \
+ && !defined(UNDER_CE)
#include "asio/detail/noncopyable.hpp"
#include "asio/detail/socket_types.hpp"
@@ -134,6 +136,8 @@
# include "asio/detail/impl/win_thread.ipp"
#endif // defined(ASIO_HEADER_ONLY)
-#endif // defined(ASIO_WINDOWS) && !defined(UNDER_CE)
+#endif // defined(ASIO_WINDOWS)
+ // && !defined(ASIO_WINDOWS_APP)
+ // && !defined(UNDER_CE)
#endif // ASIO_DETAIL_WIN_THREAD_HPP
diff --git a/asio/include/asio/detail/winapp_thread.hpp b/asio/include/asio/detail/winapp_thread.hpp
new file mode 100644
index 0000000..3e2151e
--- /dev/null
+++ b/asio/include/asio/detail/winapp_thread.hpp
@@ -0,0 +1,116 @@
+//
+// detail/winapp_thread.hpp
+// ~~~~~~~~~~~~~~~~~~~~~~~~
+//
+// Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
+//
+// 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)
+//
+
+#ifndef ASIO_DETAIL_WINAPP_THREAD_HPP
+#define ASIO_DETAIL_WINAPP_THREAD_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+# pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "asio/detail/config.hpp"
+
+#if defined(ASIO_WINDOWS) && defined(ASIO_WINDOWS_APP)
+
+#include "asio/detail/memory.hpp"
+#include "asio/detail/noncopyable.hpp"
+#include "asio/detail/socket_types.hpp"
+#include "asio/detail/throw_error.hpp"
+#include "asio/error.hpp"
+
+#include "asio/detail/push_options.hpp"
+
+namespace asio {
+namespace detail {
+
+DWORD WINAPI winapp_thread_function(LPVOID arg);
+
+class winapp_thread
+ : private noncopyable
+{
+public:
+ // Constructor.
+ template <typename Function>
+ winapp_thread(Function f, unsigned int = 0)
+ {
+ std::auto_ptr<func_base> arg(new func<Function>(f));
+ DWORD thread_id = 0;
+ thread_ = ::CreateThread(0, 0, winapp_thread_function,
+ arg.get(), 0, &thread_id);
+ if (!thread_)
+ {
+ DWORD last_error = ::GetLastError();
+ asio::error_code ec(last_error,
+ asio::error::get_system_category());
+ asio::detail::throw_error(ec, "thread");
+ }
+ arg.release();
+ }
+
+ // Destructor.
+ ~winapp_thread()
+ {
+ ::CloseHandle(thread_);
+ }
+
+ // Wait for the thread to exit.
+ void join()
+ {
+ ::WaitForSingleObjectEx(thread_, INFINITE, false);
+ }
+
+private:
+ friend DWORD WINAPI winapp_thread_function(LPVOID arg);
+
+ class func_base
+ {
+ public:
+ virtual ~func_base() {}
+ virtual void run() = 0;
+ };
+
+ template <typename Function>
+ class func
+ : public func_base
+ {
+ public:
+ func(Function f)
+ : f_(f)
+ {
+ }
+
+ virtual void run()
+ {
+ f_();
+ }
+
+ private:
+ Function f_;
+ };
+
+ ::HANDLE thread_;
+};
+
+inline DWORD WINAPI winapp_thread_function(LPVOID arg)
+{
+ std::auto_ptr<winapp_thread::func_base> func(
+ static_cast<winapp_thread::func_base*>(arg));
+ func->run();
+ return 0;
+}
+
+} // namespace detail
+} // namespace asio
+
+#include "asio/detail/pop_options.hpp"
+
+#endif // defined(ASIO_WINDOWS) && defined(ASIO_WINDOWS_APP)
+
+#endif // ASIO_DETAIL_WINAPP_THREAD_HPP
diff --git a/asio/include/asio/impl/error_code.ipp b/asio/include/asio/impl/error_code.ipp
index ccb70dd..674f5fb 100644
--- a/asio/include/asio/impl/error_code.ipp
+++ b/asio/include/asio/impl/error_code.ipp
@@ -44,22 +44,7 @@
std::string message(int value) const
{
-#if defined(ASIO_WINDOWS) || defined(__CYGWIN__)
- char* msg = 0;
- DWORD length = ::FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER
- | FORMAT_MESSAGE_FROM_SYSTEM
- | FORMAT_MESSAGE_IGNORE_INSERTS, 0, value,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (char*)&msg, 0, 0);
- detail::local_free_on_block_exit local_free_obj(msg);
- if (length && msg[length - 1] == '\n')
- msg[--length] = '\0';
- if (length && msg[length - 1] == '\r')
- msg[--length] = '\0';
- if (length)
- return msg;
- else
- return "asio.system error";
-#elif defined(ASIO_WINDOWS_RUNTIME)
+#if defined(ASIO_WINDOWS_RUNTIME) || defined(ASIO_WINDOWS_APP)
std::wstring wmsg(128, wchar_t());
for (;;)
{
@@ -89,7 +74,22 @@
else
return "asio.system error";
}
-#else // defined(ASIO_WINDOWS)
+#elif defined(ASIO_WINDOWS) || defined(__CYGWIN__)
+ char* msg = 0;
+ DWORD length = ::FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER
+ | FORMAT_MESSAGE_FROM_SYSTEM
+ | FORMAT_MESSAGE_IGNORE_INSERTS, 0, value,
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (char*)&msg, 0, 0);
+ detail::local_free_on_block_exit local_free_obj(msg);
+ if (length && msg[length - 1] == '\n')
+ msg[--length] = '\0';
+ if (length && msg[length - 1] == '\r')
+ msg[--length] = '\0';
+ if (length)
+ return msg;
+ else
+ return "asio.system error";
+#else // defined(ASIO_WINDOWS_DESKTOP) || defined(__CYGWIN__)
#if !defined(__sun)
if (value == ECANCELED)
return "Operation aborted.";
@@ -109,7 +109,7 @@
char buf[256] = "";
return strerror_r(value, buf, sizeof(buf));
#endif
-#endif // defined(ASIO_WINDOWS)
+#endif // defined(ASIO_WINDOWS_DESKTOP) || defined(__CYGWIN__)
}
};
diff --git a/asio/src/Makefile.msc b/asio/src/Makefile.msc
index 791a6db..8a91a23 100644
--- a/asio/src/Makefile.msc
+++ b/asio/src/Makefile.msc
@@ -31,7 +31,11 @@
!endif
!ifndef _WIN32_WINNT
+! ifdef STORE
+_WIN32_WINNT=0x0603
+! else
_WIN32_WINNT=0x0501
+! endif
!endif
!ifdef WIN9X
@@ -40,14 +44,21 @@
-D_WIN32_WINNT=$(_WIN32_WINNT) \
-DBOOST_ALL_NO_LIB
!else
-! ifdef WINRT
+! ifdef STORE
+DEFINES = \
+ -DWINAPI_FAMILY=WINAPI_FAMILY_PC_APP \
+ -DBOOST_ALL_NO_LIB -D_WIN32_WINNT=$(_WIN32_WINNT) \
+ -DUNICODE -D_UNICODE
+! else
+! ifdef WINRT
DEFINES = \
-ZW -FI SDKDDKVer.h -FI winapifamily.h -DWINAPI_FAMILY=WINAPI_PARTITION_APP \
-DBOOST_ALL_NO_LIB
-! else
+! else
DEFINES = \
-D_WIN32_WINNT=$(_WIN32_WINNT) \
-DBOOST_ALL_NO_LIB
+! endif
! endif
!endif