std::size_t read_some(Mutable_Buffers const& buffers, error_code& ec) { TORRENT_ASSERT(!m_read_handler); if (m_impl == 0) { ec = boost::asio::error::not_connected; return 0; } if (read_buffer_size() == 0) { ec = boost::asio::error::would_block; return 0; } #if TORRENT_USE_ASSERTS size_t buf_size = 0; #endif for (typename Mutable_Buffers::const_iterator i = buffers.begin() , end(buffers.end()); i != end; ++i) { using boost::asio::buffer_cast; using boost::asio::buffer_size; add_read_buffer(buffer_cast<void*>(*i), buffer_size(*i)); #if TORRENT_USE_ASSERTS buf_size += buffer_size(*i); #endif } std::size_t ret = read_some(true); TORRENT_ASSERT(ret <= buf_size); TORRENT_ASSERT(ret > 0); return ret; }
void async_read_some(Mutable_Buffers const& buffers, Handler const& handler) { if (m_impl == 0) { m_io_service.post(boost::bind<void>(handler, asio::error::not_connected, 0)); return; } TORRENT_ASSERT(!m_read_handler); if (m_read_handler) { m_io_service.post(boost::bind<void>(handler, asio::error::operation_not_supported, 0)); return; } for (typename Mutable_Buffers::const_iterator i = buffers.begin() , end(buffers.end()); i != end; ++i) { TORRENT_ASSERT(buffer_size(*i) > 0); using asio::buffer_cast; using asio::buffer_size; add_read_buffer(buffer_cast<void*>(*i), buffer_size(*i)); } m_read_handler = handler; set_read_handler(&utp_stream::on_read); }
void async_read_some(Mutable_Buffers const& buffers, Handler const& handler) { if (m_impl == 0) { m_io_service.post(boost::bind<void>(handler, boost::asio::error::not_connected, 0)); return; } TORRENT_ASSERT(!m_read_handler); if (m_read_handler) { m_io_service.post(boost::bind<void>(handler, boost::asio::error::operation_not_supported, 0)); return; } int bytes_added = 0; for (typename Mutable_Buffers::const_iterator i = buffers.begin() , end(buffers.end()); i != end; ++i) { if (buffer_size(*i) == 0) continue; using boost::asio::buffer_cast; using boost::asio::buffer_size; add_read_buffer(buffer_cast<void*>(*i), buffer_size(*i)); bytes_added += buffer_size(*i); } if (bytes_added == 0) { // if we're reading 0 bytes, post handler immediately // asio's SSL layer depends on this behavior m_io_service.post(boost::bind<void>(handler, error_code(), 0)); return; } m_read_handler = handler; issue_read(); }
size_t read_some(const Mutable_Buffers& buffers) { using namespace std; // For memcpy. size_t total_length = 0; typename Mutable_Buffers::const_iterator iter = buffers.begin(); typename Mutable_Buffers::const_iterator end = buffers.end(); for (; iter != end && total_length < next_read_length_; ++iter) { size_t length = boost::asio::buffer_size(*iter); if (length > length_ - position_) length = length_ - position_; if (length > next_read_length_ - total_length) length = next_read_length_ - total_length; memcpy(boost::asio::buffer_cast<void*>(*iter), data_ + position_, length); position_ += length; total_length += length; } return total_length; }