MACE
1.0.0
|
00001 00005 #ifndef _MACE_CMT_ASIO_HPP_ 00006 #define _MACE_CMT_ASIO_HPP_ 00007 #include <boost/asio.hpp> 00008 #include <boost/thread.hpp> 00009 #include <mace/cmt/future.hpp> 00010 00011 namespace mace { namespace cmt { 00015 namespace asio { 00019 namespace detail { 00020 using namespace mace::cmt; 00021 00022 void read_write_handler( const promise<size_t>::ptr& p, 00023 const boost::system::error_code& ec, 00024 size_t bytes_transferred ); 00025 void read_write_handler_ec( promise<size_t>* p, 00026 boost::system::error_code* oec, 00027 const boost::system::error_code& ec, 00028 size_t bytes_transferred ); 00029 void error_handler( const promise<boost::system::error_code>::ptr& p, 00030 const boost::system::error_code& ec ); 00031 void error_handler_ec( promise<boost::system::error_code>* p, 00032 const boost::system::error_code& ec ); 00033 } 00040 boost::asio::io_service& default_io_service(); 00041 00045 template<typename AsyncReadStream, typename MutableBufferSequence> 00046 cmt::future<size_t> read( AsyncReadStream& s, const MutableBufferSequence& buf ) { 00047 promise<size_t>::ptr p(new promise<size_t>()); 00048 boost::asio::async_read( s, buf, boost::bind( detail::read_write_handler, p, _1, _2 ) ); 00049 return p; 00050 } 00054 template<typename AsyncReadStream, typename MutableBufferSequence> 00055 cmt::future<size_t> read_some( AsyncReadStream& s, const MutableBufferSequence& buf ) { 00056 promise<size_t>::ptr p(new promise<size_t>()); 00057 s.async_read_some( buf, boost::bind( detail::read_write_handler, p, _1, _2 ) ); 00058 return p; 00059 } 00060 00064 template<typename AsyncReadStream, typename MutableBufferSequence> 00065 cmt::future<size_t> write( AsyncReadStream& s, const MutableBufferSequence& buf ) { 00066 promise<size_t>::ptr p(new promise<size_t>()); 00067 boost::asio::async_write( s, buf, boost::bind( detail::read_write_handler, p, _1, _2 ) ); 00068 return p; 00069 } 00070 00074 template<typename AsyncReadStream, typename MutableBufferSequence> 00075 cmt::future<size_t> write_some( AsyncReadStream& s, const MutableBufferSequence& buf ) { 00076 promise<size_t>::ptr p(new promise<size_t>()); 00077 s.async_write_some( buf, boost::bind( detail::read_write_handler, p, _1, _2 ) ); 00078 return p; 00079 } 00080 00081 namespace tcp { 00082 typedef boost::asio::ip::tcp::endpoint endpoint; 00083 typedef boost::asio::ip::tcp::resolver::iterator resolver_iterator; 00084 typedef boost::asio::ip::tcp::resolver resolver; 00086 cmt::future<std::vector<endpoint> > resolve( const std::string& hostname, const std::string& port ); 00087 00089 template<typename SocketType, typename AcceptorType> 00090 cmt::future<boost::system::error_code> accept( AcceptorType& acc, SocketType& sock ) { 00091 promise<boost::system::error_code>::ptr p( new promise<boost::system::error_code>() ); 00092 acc.async_accept( sock, boost::bind( mace::cmt::asio::detail::error_handler, p, _1 ) ); 00093 return p; 00094 } 00095 00097 template<typename AsyncSocket, typename EndpointType> 00098 cmt::future<boost::system::error_code> connect( AsyncSocket& sock, const EndpointType& ep ) { 00099 promise<boost::system::error_code>::ptr p(new promise<boost::system::error_code>()); 00100 sock.async_connect( ep, boost::bind( mace::cmt::asio::detail::error_handler, p, _1 ) ); 00101 return p; 00102 } 00103 } 00104 namespace udp { 00105 typedef boost::asio::ip::udp::endpoint endpoint; 00106 typedef boost::asio::ip::udp::resolver::iterator resolver_iterator; 00107 typedef boost::asio::ip::udp::resolver resolver; 00109 cmt::future<std::vector<endpoint> > resolve( resolver& r, const std::string& hostname, const std::string& port ); 00110 } 00111 00112 00113 } } } // namespace mace::cmt::asio 00114 00115 #endif // _BOOST_CMT_ASIO_HPP_