00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef ASIO_SOCKET_ACCEPTOR_SERVICE_HPP
00012 #define ASIO_SOCKET_ACCEPTOR_SERVICE_HPP
00013
00014 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
00015 # pragma once
00016 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
00017
00018 #include "asio/detail/push_options.hpp"
00019
00020 #include "asio/basic_socket.hpp"
00021 #include "asio/error.hpp"
00022 #include "asio/io_service.hpp"
00023 #include "asio/detail/epoll_reactor.hpp"
00024 #include "asio/detail/kqueue_reactor.hpp"
00025 #include "asio/detail/select_reactor.hpp"
00026 #include "asio/detail/service_base.hpp"
00027 #include "asio/detail/reactive_socket_service.hpp"
00028 #include "asio/detail/win_iocp_socket_service.hpp"
00029
00030 namespace asio {
00031
00033 template <typename Protocol>
00034 class socket_acceptor_service
00035 #if defined(GENERATING_DOCUMENTATION)
00036 : public asio::io_service::service
00037 #else
00038 : public asio::detail::service_base<socket_acceptor_service<Protocol> >
00039 #endif
00040 {
00041 public:
00042 #if defined(GENERATING_DOCUMENTATION)
00043
00044 static asio::io_service::id id;
00045 #endif
00046
00048 typedef Protocol protocol_type;
00049
00051 typedef typename protocol_type::endpoint endpoint_type;
00052
00053 private:
00054
00055 #if defined(ASIO_HAS_IOCP)
00056 typedef detail::win_iocp_socket_service<Protocol> service_impl_type;
00057 #elif defined(ASIO_HAS_EPOLL)
00058 typedef detail::reactive_socket_service<
00059 Protocol, detail::epoll_reactor<false> > service_impl_type;
00060 #elif defined(ASIO_HAS_KQUEUE)
00061 typedef detail::reactive_socket_service<
00062 Protocol, detail::kqueue_reactor<false> > service_impl_type;
00063 #elif defined(ASIO_HAS_DEV_POLL)
00064 typedef detail::reactive_socket_service<
00065 Protocol, detail::dev_poll_reactor<false> > service_impl_type;
00066 #else
00067 typedef detail::reactive_socket_service<
00068 Protocol, detail::select_reactor<false> > service_impl_type;
00069 #endif
00070
00071 public:
00073 #if defined(GENERATING_DOCUMENTATION)
00074 typedef implementation_defined implementation_type;
00075 #else
00076 typedef typename service_impl_type::implementation_type implementation_type;
00077 #endif
00078
00080 #if defined(GENERATING_DOCUMENTATION)
00081 typedef implementation_defined native_type;
00082 #else
00083 typedef typename service_impl_type::native_type native_type;
00084 #endif
00085
00087 explicit socket_acceptor_service(asio::io_service& io_service)
00088 : asio::detail::service_base<
00089 socket_acceptor_service<Protocol> >(io_service),
00090 service_impl_(asio::use_service<service_impl_type>(io_service))
00091 {
00092 }
00093
00095 void shutdown_service()
00096 {
00097 }
00098
00100 void construct(implementation_type& impl)
00101 {
00102 service_impl_.construct(impl);
00103 }
00104
00106 void destroy(implementation_type& impl)
00107 {
00108 service_impl_.destroy(impl);
00109 }
00110
00112 asio::error_code open(implementation_type& impl,
00113 const protocol_type& protocol, asio::error_code& ec)
00114 {
00115 return service_impl_.open(impl, protocol, ec);
00116 }
00117
00119 asio::error_code assign(implementation_type& impl,
00120 const protocol_type& protocol, const native_type& native_acceptor,
00121 asio::error_code& ec)
00122 {
00123 return service_impl_.assign(impl, protocol, native_acceptor, ec);
00124 }
00125
00127 bool is_open(const implementation_type& impl) const
00128 {
00129 return service_impl_.is_open(impl);
00130 }
00131
00133 asio::error_code cancel(implementation_type& impl,
00134 asio::error_code& ec)
00135 {
00136 return service_impl_.cancel(impl, ec);
00137 }
00138
00140 asio::error_code bind(implementation_type& impl,
00141 const endpoint_type& endpoint, asio::error_code& ec)
00142 {
00143 return service_impl_.bind(impl, endpoint, ec);
00144 }
00145
00148 asio::error_code listen(implementation_type& impl, int backlog,
00149 asio::error_code& ec)
00150 {
00151 return service_impl_.listen(impl, backlog, ec);
00152 }
00153
00155 asio::error_code close(implementation_type& impl,
00156 asio::error_code& ec)
00157 {
00158 return service_impl_.close(impl, ec);
00159 }
00160
00162 native_type native(implementation_type& impl)
00163 {
00164 return service_impl_.native(impl);
00165 }
00166
00168 template <typename SettableSocketOption>
00169 asio::error_code set_option(implementation_type& impl,
00170 const SettableSocketOption& option, asio::error_code& ec)
00171 {
00172 return service_impl_.set_option(impl, option, ec);
00173 }
00174
00176 template <typename GettableSocketOption>
00177 asio::error_code get_option(const implementation_type& impl,
00178 GettableSocketOption& option, asio::error_code& ec) const
00179 {
00180 return service_impl_.get_option(impl, option, ec);
00181 }
00182
00184 template <typename IoControlCommand>
00185 asio::error_code io_control(implementation_type& impl,
00186 IoControlCommand& command, asio::error_code& ec)
00187 {
00188 return service_impl_.io_control(impl, command, ec);
00189 }
00190
00192 endpoint_type local_endpoint(const implementation_type& impl,
00193 asio::error_code& ec) const
00194 {
00195 return service_impl_.local_endpoint(impl, ec);
00196 }
00197
00199 template <typename SocketService>
00200 asio::error_code accept(implementation_type& impl,
00201 basic_socket<protocol_type, SocketService>& peer,
00202 endpoint_type* peer_endpoint, asio::error_code& ec)
00203 {
00204 return service_impl_.accept(impl, peer, peer_endpoint, ec);
00205 }
00206
00208 template <typename SocketService, typename AcceptHandler>
00209 void async_accept(implementation_type& impl,
00210 basic_socket<protocol_type, SocketService>& peer,
00211 endpoint_type* peer_endpoint, AcceptHandler handler)
00212 {
00213 service_impl_.async_accept(impl, peer, peer_endpoint, handler);
00214 }
00215
00216 private:
00217
00218 service_impl_type& service_impl_;
00219 };
00220
00221 }
00222
00223 #include "asio/detail/pop_options.hpp"
00224
00225 #endif // ASIO_SOCKET_ACCEPTOR_SERVICE_HPP