00001
00005 #ifndef _BOOST_CMT_ASIO_HPP_
00006 #define _BOOST_CMT_ASIO_HPP_
00007 #include <boost/asio.hpp>
00008 #include <boost/thread.hpp>
00009 #include <boost/cmt/future.hpp>
00010
00011 namespace boost { namespace cmt { namespace asio {
00012 namespace detail {
00013 using namespace boost::cmt;
00014
00015 void read_write_handler( const promise<size_t>::ptr& p,
00016 const boost::system::error_code& ec,
00017 size_t bytes_transferred );
00018 void read_write_handler_ec( promise<size_t>* p,
00019 boost::system::error_code* oec,
00020 const boost::system::error_code& ec,
00021 size_t bytes_transferred );
00022
00023 void error_handler( const promise<boost::system::error_code>::ptr& p,
00024 const boost::system::error_code& ec );
00025 void error_handler_ec( promise<boost::system::error_code>* p,
00026 const boost::system::error_code& ec );
00027
00028 template<typename EndpointType, typename IteratorType>
00029 void resolve_handler(
00030 const typename promise<std::vector<EndpointType> >::ptr& p,
00031 const boost::system::error_code& ec,
00032 IteratorType itr) {
00033 if( !ec ) {
00034 std::vector<EndpointType> eps;
00035 while( itr != IteratorType() ) {
00036 eps.push_back(*itr);
00037 ++itr;
00038 }
00039 p->set_value( eps );
00040 } else {
00041 p->set_exception( boost::copy_exception( boost::system::system_error(ec) ) );
00042 }
00043 }
00044 }
00051 boost::asio::io_service& default_io_service();
00052
00056 template<typename AsyncReadStream, typename MutableBufferSequence>
00057 size_t read( AsyncReadStream& s, const MutableBufferSequence& buf, uint64_t timeout_us = -1 ) {
00058 promise<size_t>::ptr p(new promise<size_t>());
00059 boost::asio::async_read( s, buf, boost::bind( detail::read_write_handler, p, _1, _2 ) );
00060 return p->wait(timeout_us);
00061 }
00065 template<typename AsyncReadStream, typename MutableBufferSequence>
00066 size_t read_some( AsyncReadStream& s, const MutableBufferSequence& buf, uint64_t timeout_us = -1 ) {
00067 promise<size_t>::ptr p(new promise<size_t>());
00068 s.async_read_some( buf, boost::bind( detail::read_write_handler, p, _1, _2 ) );
00069 return p->wait(timeout_us);
00070 }
00071
00075 template<typename AsyncReadStream, typename MutableBufferSequence>
00076 size_t write( AsyncReadStream& s, const MutableBufferSequence& buf, uint64_t timeout_us = -1 ) {
00077 promise<size_t>::ptr p(new promise<size_t>());
00078 boost::asio::async_write( s, buf, boost::bind( detail::read_write_handler, p, _1, _2 ) );
00079 return p->wait(timeout_us);
00080 }
00081
00085 template<typename AsyncReadStream, typename MutableBufferSequence>
00086 size_t write_some( AsyncReadStream& s, const MutableBufferSequence& buf, uint64_t timeout_us = -1 ) {
00087 promise<size_t>::ptr p(new promise<size_t>());
00088 s.async_write_some( buf, boost::bind( detail::read_write_handler, p, _1, _2 ) );
00089 return p->wait(timeout_us);
00090 }
00091
00092 namespace tcp {
00093 typedef boost::asio::ip::tcp::endpoint endpoint;
00094 typedef boost::asio::ip::tcp::resolver::iterator resolver_iterator;
00095 typedef boost::asio::ip::tcp::resolver resolver;
00097 std::vector<endpoint> resolve( const std::string& hostname, const std::string& port, uint64_t timeout_us = -1 );
00098
00100 template<typename SocketType, typename AcceptorType>
00101 boost::system::error_code accept( AcceptorType& acc, SocketType& sock, uint64_t timeout_us = -1 ) {
00102 promise<boost::system::error_code>::ptr p( new promise<boost::system::error_code>() );
00103 acc.async_accept( sock, boost::bind( detail::error_handler, p, _1 ) );
00104 return p->wait( timeout_us );
00105 }
00106
00108 template<typename AsyncSocket, typename EndpointType>
00109 boost::system::error_code connect( AsyncSocket& sock, const EndpointType& ep, uint64_t timeout_us = -1 ) {
00110 promise<boost::system::error_code>::ptr p(new promise<boost::system::error_code>());
00111 sock.async_connect( ep, boost::bind( detail::error_handler, p, _1 ) );
00112 return p->wait(timeout_us);
00113 }
00114
00115
00116 }
00117 namespace udp {
00118 typedef boost::asio::ip::udp::endpoint endpoint;
00119 typedef boost::asio::ip::udp::resolver::iterator resolver_iterator;
00120 typedef boost::asio::ip::udp::resolver resolver;
00122 std::vector<endpoint> resolve( resolver& r, const std::string& hostname, const std::string& port, uint64_t timeout_us = -1 );
00123 }
00124
00125
00126 } } }
00127
00128 #endif // _BOOST_CMT_ASIO_HPP_