MACE  1.0.0
 All Classes Namespaces Files Functions Variables Enumerations Defines
libs/cmt/include/mace/cmt/asio.hpp
Go to the documentation of this file.
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_