void async_write_some(Const_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_write_handler); if (m_write_handler) { m_io_service.post(boost::bind<void>(handler, asio::error::operation_not_supported, 0)); return; } for (typename Const_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_write_buffer((void*)buffer_cast<void const*>(*i), buffer_size(*i)); } m_write_handler = handler; set_write_handler(&utp_stream::on_write); }
void async_write_some(Const_Buffers const& buffers, Handler const& handler) { if (m_impl == nullptr) { m_io_service.post(std::bind<void>(handler , boost::asio::error::not_connected, std::size_t(0))); return; } TORRENT_ASSERT(!m_write_handler); if (m_write_handler) { m_io_service.post(std::bind<void>(handler , boost::asio::error::operation_not_supported, std::size_t(0))); return; } std::size_t bytes_added = 0; #if BOOST_VERSION >= 106600 for (auto i = buffer_sequence_begin(buffers) , end(buffer_sequence_end(buffers)); i != end; ++i) #else for (typename Const_Buffers::const_iterator i = buffers.begin() , end(buffers.end()); i != end; ++i) #endif { if (buffer_size(*i) == 0) continue; using boost::asio::buffer_cast; using boost::asio::buffer_size; add_write_buffer(buffer_cast<void const*>(*i), buffer_size(*i)); bytes_added += buffer_size(*i); } if (bytes_added == 0) { // if we're writing 0 bytes, post handler immediately // asio's SSL layer depends on this behavior m_io_service.post(std::bind<void>(handler, error_code(), std::size_t(0))); return; } m_write_handler = handler; issue_write(); }
bool check(const Const_Buffers& buffers, size_t length) { if (length != position_) return false; typename Const_Buffers::const_iterator iter = buffers.begin(); typename Const_Buffers::const_iterator end = buffers.end(); size_t checked_length = 0; for (; iter != end && checked_length < length; ++iter) { size_t buffer_length = asio::buffer_size(*iter); if (buffer_length > length - checked_length) buffer_length = length - checked_length; if (memcmp(data_ + checked_length, asio::buffer_cast<const void*>(*iter), buffer_length) != 0) return false; checked_length += buffer_length; } return true; }
size_t write_some(const Const_Buffers& buffers) { size_t total_length = 0; typename Const_Buffers::const_iterator iter = buffers.begin(); typename Const_Buffers::const_iterator end = buffers.end(); for (; iter != end && total_length < next_write_length_; ++iter) { size_t length = asio::buffer_size(*iter); if (length > length_ - position_) length = length_ - position_; if (length > next_write_length_ - total_length) length = next_write_length_ - total_length; memcpy(data_ + position_, asio::buffer_cast<const void*>(*iter), length); position_ += length; total_length += length; } return total_length; }
void async_write_some(Const_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_write_handler); if (m_write_handler) { m_io_service.post(boost::bind<void>(handler , boost::asio::error::operation_not_supported, 0)); return; } int bytes_added = 0; for (typename Const_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_write_buffer((void*)buffer_cast<void const*>(*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_write_handler = handler; issue_write(); }