Imported Upstream version 1.64.0
[platform/upstream/boost.git] / boost / process / detail / windows / pipe_in.hpp
1 // Copyright (c) 2006, 2007 Julio M. Merino Vidal\r
2 // Copyright (c) 2008 Ilya Sokolov, Boris Schaeling\r
3 // Copyright (c) 2009 Boris Schaeling\r
4 // Copyright (c) 2010 Felipe Tanus, Boris Schaeling\r
5 // Copyright (c) 2011, 2012 Jeff Flinn, Boris Schaeling\r
6 //\r
7 // Distributed under the Boost Software License, Version 1.0. (See accompanying\r
8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\r
9
10 #ifndef BOOST_PROCESS_WINDOWS_INITIALIZERS_PIPE_IN_HPP\r
11 #define BOOST_PROCESS_WINDOWS_INITIALIZERS_PIPE_IN_HPP\r
12
13 #include <boost/detail/winapi/process.hpp>\r
14 #include <boost/detail/winapi/handles.hpp>\r
15 #include <boost/process/detail/handler_base.hpp>\r
16
17 namespace boost { namespace process { namespace detail { namespace windows {\r
18
19 struct pipe_in : public ::boost::process::detail::handler_base\r
20 {\r
21     ::boost::detail::winapi::HANDLE_ handle;\r
22
23     pipe_in(::boost::detail::winapi::HANDLE_ handle) : handle(handle) {}\r
24
25     template<typename T> //async_pipe\r
26     pipe_in(T & p) : handle(p.native_source())\r
27     {\r
28         p.assign_source(::boost::detail::winapi::INVALID_HANDLE_VALUE_);\r
29     }\r
30
31     template <class WindowsExecutor>\r
32     void on_setup(WindowsExecutor &e) const\r
33     {\r
34         boost::detail::winapi::SetHandleInformation(handle,\r
35                 boost::detail::winapi::HANDLE_FLAG_INHERIT_,\r
36                 boost::detail::winapi::HANDLE_FLAG_INHERIT_);\r
37
38         e.startup_info.hStdInput = handle;\r
39         e.startup_info.dwFlags  |= boost::detail::winapi::STARTF_USESTDHANDLES_;\r
40         e.inherit_handles = true;\r
41     }\r
42     template<typename WindowsExecutor>\r
43     void on_error(WindowsExecutor &, const std::error_code &) const\r
44     {\r
45         ::boost::detail::winapi::CloseHandle(handle);\r
46     }\r
47
48     template<typename WindowsExecutor>\r
49     void on_success(WindowsExecutor &) const\r
50     {\r
51         ::boost::detail::winapi::CloseHandle(handle);\r
52     }\r
53 };\r
54
55 class async_pipe;\r
56
57 struct async_pipe_in : public pipe_in\r
58 {\r
59     async_pipe &pipe;\r
60
61     template<typename AsyncPipe>\r
62     async_pipe_in(AsyncPipe & p) : pipe_in(p.native_source()), pipe(p)\r
63     {\r
64     }\r
65
66     template<typename Pipe, typename Executor>\r
67     static void close(Pipe & pipe, Executor &)\r
68     {\r
69         boost::system::error_code ec;\r
70         std::move(pipe).source().close(ec);\r
71     }\r
72
73     template<typename Executor>\r
74     void on_error(Executor & exec, const std::error_code &)\r
75     {\r
76         close(pipe, exec);\r
77     }\r
78
79     template<typename Executor>\r
80     void on_success(Executor &exec)\r
81     {\r
82         close(pipe, exec);\r
83     }\r
84 };\r
85
86
87 }}}}\r
88
89 #endif\r