diff --git a/libtorrent/include/alert.hpp b/libtorrent/include/alert.hpp deleted file mode 100755 index a820ef225..000000000 --- a/libtorrent/include/alert.hpp +++ /dev/null @@ -1,174 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg, Daniel Wallin -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_ALERT_HPP_INCLUDED -#define TORRENT_ALERT_HPP_INCLUDED - -#include -#include -#include -#include -#include - -#ifdef _MSC_VER -#pragma warning(push, 1) -#endif - -#include - -#include -#include -#include -#include -#include - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -#include "libtorrent/config.hpp" - -#define TORRENT_MAX_ALERT_TYPES 10 - -namespace libtorrent { - - class TORRENT_EXPORT alert - { - public: - enum severity_t { debug, info, warning, critical, fatal, none }; - - alert(severity_t severity, const std::string& msg); - virtual ~alert(); - - // a timestamp is automatically created in the constructor - boost::posix_time::ptime timestamp() const; - - const std::string& msg() const; - - severity_t severity() const; - - virtual std::auto_ptr clone() const = 0; - - private: - std::string m_msg; - severity_t m_severity; - boost::posix_time::ptime m_timestamp; - }; - - class TORRENT_EXPORT alert_manager - { - public: - alert_manager(); - ~alert_manager(); - - void post_alert(const alert& alert_); - bool pending() const; - std::auto_ptr get(); - - void set_severity(alert::severity_t severity); - bool should_post(alert::severity_t severity) const; - - private: - std::queue m_alerts; - alert::severity_t m_severity; - mutable boost::mutex m_mutex; - }; - - struct TORRENT_EXPORT unhandled_alert : std::exception - { - unhandled_alert() {} - }; - - namespace detail { - - struct void_; - - template< - class Handler - , BOOST_PP_ENUM_PARAMS(TORRENT_MAX_ALERT_TYPES, class T) - > - void handle_alert_dispatch( - const std::auto_ptr& alert_ - , const Handler& handler - , const std::type_info& typeid_ - , BOOST_PP_ENUM_BINARY_PARAMS(TORRENT_MAX_ALERT_TYPES, T, *p)) - { - if (typeid_ == typeid(T0)) - handler(*static_cast(alert_.get())); - else - handle_alert_dispatch( - alert_ - , handler - , typeid_ - , BOOST_PP_ENUM_SHIFTED_PARAMS(TORRENT_MAX_ALERT_TYPES, p), (void_*)0 - ); - } - - template - void handle_alert_dispatch( - const std::auto_ptr& alert_ - , const Handler& handler - , const std::type_info& typeid_ - , BOOST_PP_ENUM_PARAMS(TORRENT_MAX_ALERT_TYPES, void_* BOOST_PP_INTERCEPT)) - { - throw unhandled_alert(); - } - - } // namespace detail - - template< - BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(TORRENT_MAX_ALERT_TYPES, class T, detail::void_) - > - struct TORRENT_EXPORT handle_alert - { - template - handle_alert( - const std::auto_ptr& alert_ - , const Handler& handler) - { - #define ALERT_POINTER_TYPE(z, n, text) (BOOST_PP_CAT(T, n)*)0 - - detail::handle_alert_dispatch( - alert_ - , handler - , typeid(*alert_) - , BOOST_PP_ENUM(TORRENT_MAX_ALERT_TYPES, ALERT_POINTER_TYPE, _) - ); - - #undef ALERT_POINTER_TYPE - } - }; - -} // namespace libtorrent - -#endif // TORRENT_ALERT_HPP_INCLUDED - diff --git a/libtorrent/include/alert_types.hpp b/libtorrent/include/alert_types.hpp deleted file mode 100755 index 7a5cb7fd3..000000000 --- a/libtorrent/include/alert_types.hpp +++ /dev/null @@ -1,300 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_ALERT_TYPES_HPP_INCLUDED -#define TORRENT_ALERT_TYPES_HPP_INCLUDED - -#include "libtorrent/alert.hpp" -#include "libtorrent/torrent_handle.hpp" -#include "libtorrent/socket.hpp" -#include "libtorrent/peer_connection.hpp" -#include "libtorrent/config.hpp" - -namespace libtorrent -{ - struct TORRENT_EXPORT tracker_alert: alert - { - tracker_alert(torrent_handle const& h - , int times - , int status - , std::string const& msg) - : alert(alert::warning, msg) - , handle(h) - , times_in_row(times) - , status_code(status) - {} - - virtual std::auto_ptr clone() const - { return std::auto_ptr(new tracker_alert(*this)); } - - torrent_handle handle; - int times_in_row; - int status_code; - }; - - struct TORRENT_EXPORT tracker_warning_alert: alert - { - tracker_warning_alert(torrent_handle const& h - , std::string const& msg) - : alert(alert::warning, msg) - , handle(h) - {} - - virtual std::auto_ptr clone() const - { return std::auto_ptr(new tracker_warning_alert(*this)); } - - torrent_handle handle; - }; - - - - struct TORRENT_EXPORT tracker_reply_alert: alert - { - tracker_reply_alert(torrent_handle const& h - , std::string const& msg) - : alert(alert::info, msg) - , handle(h) - {} - - virtual std::auto_ptr clone() const - { return std::auto_ptr(new tracker_reply_alert(*this)); } - - torrent_handle handle; - }; - - struct TORRENT_EXPORT tracker_announce_alert: alert - { - tracker_announce_alert(torrent_handle const& h, std::string const& msg) - : alert(alert::info, msg) - , handle(h) - {} - - virtual std::auto_ptr clone() const - { return std::auto_ptr(new tracker_announce_alert(*this)); } - - torrent_handle handle; - }; - - struct TORRENT_EXPORT hash_failed_alert: alert - { - hash_failed_alert( - torrent_handle const& h - , int index - , std::string const& msg) - : alert(alert::info, msg) - , handle(h) - , piece_index(index) - { assert(index >= 0);} - - virtual std::auto_ptr clone() const - { return std::auto_ptr(new hash_failed_alert(*this)); } - - torrent_handle handle; - int piece_index; - }; - - struct TORRENT_EXPORT peer_ban_alert: alert - { - peer_ban_alert(tcp::endpoint const& pip, torrent_handle h, std::string const& msg) - : alert(alert::info, msg) - , ip(pip) - , handle(h) - {} - - virtual std::auto_ptr clone() const - { return std::auto_ptr(new peer_ban_alert(*this)); } - - tcp::endpoint ip; - torrent_handle handle; - }; - - struct TORRENT_EXPORT peer_error_alert: alert - { - peer_error_alert(tcp::endpoint const& pip, peer_id const& pid_, std::string const& msg) - : alert(alert::debug, msg) - , ip(pip) - , pid(pid_) - {} - - virtual std::auto_ptr clone() const - { return std::auto_ptr(new peer_error_alert(*this)); } - - tcp::endpoint ip; - peer_id pid; - }; - - struct TORRENT_EXPORT chat_message_alert: alert - { - chat_message_alert( - const torrent_handle& h - , const tcp::endpoint& sender - , const std::string& msg) - : alert(alert::critical, msg) - , handle(h) - , ip(sender) - {} - - virtual std::auto_ptr clone() const - { return std::auto_ptr(new chat_message_alert(*this)); } - - torrent_handle handle; - tcp::endpoint ip; - }; - - struct TORRENT_EXPORT invalid_request_alert: alert - { - invalid_request_alert( - peer_request const& r - , torrent_handle const& h - , tcp::endpoint const& sender - , peer_id const& pid_ - , std::string const& msg) - : alert(alert::debug, msg) - , handle(h) - , ip(sender) - , request(r) - , pid(pid_) - {} - - virtual std::auto_ptr clone() const - { return std::auto_ptr(new invalid_request_alert(*this)); } - - torrent_handle handle; - tcp::endpoint ip; - peer_request request; - peer_id pid; - }; - - struct TORRENT_EXPORT torrent_finished_alert: alert - { - torrent_finished_alert( - const torrent_handle& h - , const std::string& msg) - : alert(alert::warning, msg) - , handle(h) - {} - - virtual std::auto_ptr clone() const - { return std::auto_ptr(new torrent_finished_alert(*this)); } - - torrent_handle handle; - }; - - struct TORRENT_EXPORT url_seed_alert: alert - { - url_seed_alert( - const std::string& url_ - , const std::string& msg) - : alert(alert::warning, msg) - , url(url_) - {} - - virtual std::auto_ptr clone() const - { return std::auto_ptr(new url_seed_alert(*this)); } - - std::string url; - }; - - struct TORRENT_EXPORT file_error_alert: alert - { - file_error_alert( - const torrent_handle& h - , const std::string& msg) - : alert(alert::fatal, msg) - , handle(h) - {} - - virtual std::auto_ptr clone() const - { return std::auto_ptr(new file_error_alert(*this)); } - - torrent_handle handle; - }; - - struct TORRENT_EXPORT metadata_failed_alert: alert - { - metadata_failed_alert( - const torrent_handle& h - , const std::string& msg) - : alert(alert::info, msg) - , handle(h) - {} - - virtual std::auto_ptr clone() const - { return std::auto_ptr(new metadata_failed_alert(*this)); } - - torrent_handle handle; - }; - - struct TORRENT_EXPORT metadata_received_alert: alert - { - metadata_received_alert( - const torrent_handle& h - , const std::string& msg) - : alert(alert::info, msg) - , handle(h) - {} - - virtual std::auto_ptr clone() const - { return std::auto_ptr(new metadata_received_alert(*this)); } - - torrent_handle handle; - }; - - struct TORRENT_EXPORT listen_failed_alert: alert - { - listen_failed_alert( - const std::string& msg) - : alert(alert::fatal, msg) - {} - - virtual std::auto_ptr clone() const - { return std::auto_ptr(new listen_failed_alert(*this)); } - }; - - struct TORRENT_EXPORT fastresume_rejected_alert: alert - { - fastresume_rejected_alert(torrent_handle const& h - , std::string const& msg) - : alert(alert::warning, msg) - , handle(h) - {} - - virtual std::auto_ptr clone() const - { return std::auto_ptr(new fastresume_rejected_alert(*this)); } - - torrent_handle handle; - }; - -} - - -#endif diff --git a/libtorrent/include/allocate_resources.hpp b/libtorrent/include/allocate_resources.hpp deleted file mode 100644 index b859b6b47..000000000 --- a/libtorrent/include/allocate_resources.hpp +++ /dev/null @@ -1,72 +0,0 @@ -/* - -Copyright (c) 2003, Magnus Jonsson -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_ALLOCATE_RESOURCES_HPP_INCLUDED -#define TORRENT_ALLOCATE_RESOURCES_HPP_INCLUDED - -#include -#include - -#include - -#include "libtorrent/resource_request.hpp" -#include "libtorrent/peer_id.hpp" -#include "libtorrent/socket.hpp" - -namespace libtorrent -{ - class peer_connection; - class torrent; - - int saturated_add(int a, int b); - - // Function to allocate a limited resource fairly among many consumers. - // It takes into account the current use, and the consumer's desired use. - // Should be invoked periodically to allow it adjust to the situation (make - // sure "used" is updated between calls!). - // If resources = std::numeric_limits::max() it means there is an infinite - // supply of resources (so everyone can get what they want). - - void allocate_resources( - int resources - , std::map >& torrents - , resource_request torrent::* res); - - void allocate_resources( - int resources - , std::map& connections - , resource_request peer_connection::* res); - -} - - -#endif diff --git a/libtorrent/include/asio.hpp b/libtorrent/include/asio.hpp deleted file mode 100644 index 3bd10de70..000000000 --- a/libtorrent/include/asio.hpp +++ /dev/null @@ -1,71 +0,0 @@ -// -// asio.hpp -// ~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_HPP -#define ASIO_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/basic_datagram_socket.hpp" -#include "asio/basic_deadline_timer.hpp" -#include "asio/basic_io_object.hpp" -#include "asio/basic_resolver.hpp" -#include "asio/basic_socket_acceptor.hpp" -#include "asio/basic_socket_iostream.hpp" -#include "asio/basic_socket_streambuf.hpp" -#include "asio/basic_stream_socket.hpp" -#include "asio/basic_streambuf.hpp" -#include "asio/buffer.hpp" -#include "asio/buffered_read_stream_fwd.hpp" -#include "asio/buffered_read_stream.hpp" -#include "asio/buffered_stream_fwd.hpp" -#include "asio/buffered_stream.hpp" -#include "asio/buffered_write_stream_fwd.hpp" -#include "asio/buffered_write_stream.hpp" -#include "asio/completion_condition.hpp" -#include "asio/datagram_socket_service.hpp" -#include "asio/deadline_timer_service.hpp" -#include "asio/deadline_timer.hpp" -#include "asio/error_handler.hpp" -#include "asio/error.hpp" -#include "asio/handler_alloc_hook.hpp" -#include "asio/handler_invoke_hook.hpp" -#include "asio/io_service.hpp" -#include "asio/ip/address.hpp" -#include "asio/ip/address_v4.hpp" -#include "asio/ip/address_v6.hpp" -#include "asio/ip/basic_endpoint.hpp" -#include "asio/ip/basic_resolver_entry.hpp" -#include "asio/ip/basic_resolver_iterator.hpp" -#include "asio/ip/basic_resolver_query.hpp" -#include "asio/ip/host_name.hpp" -#include "asio/ip/multicast.hpp" -#include "asio/ip/resolver_query_base.hpp" -#include "asio/ip/tcp.hpp" -#include "asio/ip/udp.hpp" -#include "asio/is_read_buffered.hpp" -#include "asio/is_write_buffered.hpp" -#include "asio/placeholders.hpp" -#include "asio/read.hpp" -#include "asio/read_until.hpp" -#include "asio/resolver_service.hpp" -#include "asio/socket_acceptor_service.hpp" -#include "asio/socket_base.hpp" -#include "asio/strand.hpp" -#include "asio/stream_socket_service.hpp" -#include "asio/streambuf.hpp" -#include "asio/system_exception.hpp" -#include "asio/thread.hpp" -#include "asio/time_traits.hpp" -#include "asio/write.hpp" - -#endif // ASIO_HPP diff --git a/libtorrent/include/asio/basic_datagram_socket.hpp b/libtorrent/include/asio/basic_datagram_socket.hpp deleted file mode 100644 index f555ae506..000000000 --- a/libtorrent/include/asio/basic_datagram_socket.hpp +++ /dev/null @@ -1,802 +0,0 @@ -// -// basic_datagram_socket.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BASIC_DATAGRAM_SOCKET_HPP -#define ASIO_BASIC_DATAGRAM_SOCKET_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/basic_socket.hpp" -#include "asio/datagram_socket_service.hpp" -#include "asio/error_handler.hpp" - -namespace asio { - -/// Provides datagram-oriented socket functionality. -/** - * The basic_datagram_socket class template provides asynchronous and blocking - * datagram-oriented socket functionality. - * - * @par Thread Safety: - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Concepts: - * Async_Object, Error_Source. - */ -template > -class basic_datagram_socket - : public basic_socket -{ -public: - /// The native representation of a socket. - typedef typename Service::native_type native_type; - - /// The protocol type. - typedef Protocol protocol_type; - - /// The endpoint type. - typedef typename Protocol::endpoint endpoint_type; - - /// Construct a basic_datagram_socket without opening it. - /** - * This constructor creates a datagram socket without opening it. The open() - * function must be called before data can be sent or received on the socket. - * - * @param io_service The io_service object that the datagram socket will use - * to dispatch handlers for any asynchronous operations performed on the - * socket. - */ - explicit basic_datagram_socket(asio::io_service& io_service) - : basic_socket(io_service) - { - } - - /// Construct and open a basic_datagram_socket. - /** - * This constructor creates and opens a datagram socket. - * - * @param io_service The io_service object that the datagram socket will use - * to dispatch handlers for any asynchronous operations performed on the - * socket. - * - * @param protocol An object specifying protocol parameters to be used. - * - * @throws asio::error Thrown on failure. - */ - basic_datagram_socket(asio::io_service& io_service, - const protocol_type& protocol) - : basic_socket(io_service, protocol) - { - } - - /// Construct a basic_datagram_socket, opening it and binding it to the given - /// local endpoint. - /** - * This constructor creates a datagram socket and automatically opens it bound - * to the specified endpoint on the local machine. The protocol used is the - * protocol associated with the given endpoint. - * - * @param io_service The io_service object that the datagram socket will use - * to dispatch handlers for any asynchronous operations performed on the - * socket. - * - * @param endpoint An endpoint on the local machine to which the datagram - * socket will be bound. - * - * @throws asio::error Thrown on failure. - */ - basic_datagram_socket(asio::io_service& io_service, - const endpoint_type& endpoint) - : basic_socket(io_service, endpoint) - { - } - - /// Construct a basic_datagram_socket on an existing native socket. - /** - * This constructor creates a datagram socket object to hold an existing - * native socket. - * - * @param io_service The io_service object that the datagram socket will use - * to dispatch handlers for any asynchronous operations performed on the - * socket. - * - * @param protocol An object specifying protocol parameters to be used. - * - * @param native_socket The new underlying socket implementation. - * - * @throws asio::error Thrown on failure. - */ - basic_datagram_socket(asio::io_service& io_service, - const protocol_type& protocol, const native_type& native_socket) - : basic_socket(io_service, protocol, native_socket) - { - } - - /// Send some data on a connected socket. - /** - * This function is used to send data on the datagram socket. The function - * call will block until the data has been sent successfully or an error - * occurs. - * - * @param buffers One ore more data buffers to be sent on the socket. - * - * @returns The number of bytes sent. - * - * @throws asio::error Thrown on failure. - * - * @note The send operation can only be used with a connected socket. Use - * the send_to function to send data on an unconnected datagram socket. - * - * @par Example: - * To send a single data buffer use the @ref buffer function as follows: - * @code socket.send(asio::buffer(data, size)); @endcode - * See the @ref buffer documentation for information on sending multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t send(const Const_Buffers& buffers) - { - return this->service.send(this->implementation, buffers, 0, throw_error()); - } - - /// Send some data on a connected socket. - /** - * This function is used to send data on the datagram socket. The function - * call will block until the data has been sent successfully or an error - * occurs. - * - * @param buffers One ore more data buffers to be sent on the socket. - * - * @param flags Flags specifying how the send call is to be made. - * - * @returns The number of bytes sent. - * - * @throws asio::error Thrown on failure. - * - * @note The send operation can only be used with a connected socket. Use - * the send_to function to send data on an unconnected datagram socket. - */ - template - std::size_t send(const Const_Buffers& buffers, - socket_base::message_flags flags) - { - return this->service.send(this->implementation, buffers, flags, - throw_error()); - } - - /// Send some data on a connected socket. - /** - * This function is used to send data on the datagram socket. The function - * call will block until the data has been sent successfully or an error - * occurs. - * - * @param buffers One or more data buffers to be sent on the socket. - * - * @param flags Flags specifying how the send call is to be made. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation. - * ); @endcode - * - * @returns The number of bytes sent. - * - * @note The send operation can only be used with a connected socket. Use - * the send_to function to send data on an unconnected datagram socket. - */ - template - std::size_t send(const Const_Buffers& buffers, - socket_base::message_flags flags, Error_Handler error_handler) - { - return this->service.send(this->implementation, buffers, flags, - error_handler); - } - - /// Start an asynchronous send on a connected socket. - /** - * This function is used to send data on the datagram socket. The function - * call will block until the data has been sent successfully or an error - * occurs. - * - * @param buffers One or more data buffers to be sent on the socket. Although - * the buffers object may be copied as necessary, ownership of the underlying - * memory blocks is retained by the caller, which must guarantee that they - * remain valid until the handler is called. - * - * @param handler The handler to be called when the send operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes sent. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - * - * @note The async_send operation can only be used with a connected socket. - * Use the async_send_to function to send data on an unconnected datagram - * socket. - * - * @par Example: - * To send a single data buffer use the @ref buffer function as follows: - * @code - * socket.async_send(asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on sending multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - void async_send(const Const_Buffers& buffers, Handler handler) - { - this->service.async_send(this->implementation, buffers, 0, handler); - } - - /// Start an asynchronous send on a connected socket. - /** - * This function is used to send data on the datagram socket. The function - * call will block until the data has been sent successfully or an error - * occurs. - * - * @param buffers One or more data buffers to be sent on the socket. Although - * the buffers object may be copied as necessary, ownership of the underlying - * memory blocks is retained by the caller, which must guarantee that they - * remain valid until the handler is called. - * - * @param flags Flags specifying how the send call is to be made. - * - * @param handler The handler to be called when the send operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes sent. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - * - * @note The async_send operation can only be used with a connected socket. - * Use the async_send_to function to send data on an unconnected datagram - * socket. - */ - template - void async_send(const Const_Buffers& buffers, - socket_base::message_flags flags, Handler handler) - { - this->service.async_send(this->implementation, buffers, flags, handler); - } - - /// Send a datagram to the specified endpoint. - /** - * This function is used to send a datagram to the specified remote endpoint. - * The function call will block until the data has been sent successfully or - * an error occurs. - * - * @param buffers One or more data buffers to be sent to the remote endpoint. - * - * @param destination The remote endpoint to which the data will be sent. - * - * @returns The number of bytes sent. - * - * @throws asio::error Thrown on failure. - * - * @par Example: - * To send a single data buffer use the @ref buffer function as follows: - * @code - * asio::ip::udp::endpoint destination( - * asio::ip::address::from_string("1.2.3.4"), 12345); - * socket.send_to(asio::buffer(data, size), destination); - * @endcode - * See the @ref buffer documentation for information on sending multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t send_to(const Const_Buffers& buffers, - const endpoint_type& destination) - { - return this->service.send_to(this->implementation, buffers, destination, 0, - throw_error()); - } - - /// Send a datagram to the specified endpoint. - /** - * This function is used to send a datagram to the specified remote endpoint. - * The function call will block until the data has been sent successfully or - * an error occurs. - * - * @param buffers One or more data buffers to be sent to the remote endpoint. - * - * @param destination The remote endpoint to which the data will be sent. - * - * @param flags Flags specifying how the send call is to be made. - * - * @returns The number of bytes sent. - * - * @throws asio::error Thrown on failure. - */ - template - std::size_t send_to(const Const_Buffers& buffers, - const endpoint_type& destination, socket_base::message_flags flags) - { - return this->service.send_to(this->implementation, buffers, destination, - flags, throw_error()); - } - - /// Send a datagram to the specified endpoint. - /** - * This function is used to send a datagram to the specified remote endpoint. - * The function call will block until the data has been sent successfully or - * an error occurs. - * - * @param buffers One or more data buffers to be sent to the remote endpoint. - * - * @param destination The remote endpoint to which the data will be sent. - * - * @param flags Flags specifying how the send call is to be made. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation. - * ); @endcode - * - * @returns The number of bytes sent. - */ - template - std::size_t send_to(const Const_Buffers& buffers, - const endpoint_type& destination, socket_base::message_flags flags, - Error_Handler error_handler) - { - return this->service.send_to(this->implementation, buffers, destination, - flags, error_handler); - } - - /// Start an asynchronous send. - /** - * This function is used to asynchronously send a datagram to the specified - * remote endpoint. The function call always returns immediately. - * - * @param buffers One or more data buffers to be sent to the remote endpoint. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param destination The remote endpoint to which the data will be sent. - * Copies will be made of the endpoint as required. - * - * @param handler The handler to be called when the send operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes sent. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - * - * @par Example: - * To send a single data buffer use the @ref buffer function as follows: - * @code - * asio::ip::udp::endpoint destination( - * asio::ip::address::from_string("1.2.3.4"), 12345); - * socket.async_send_to( - * asio::buffer(data, size), destination, handler); - * @endcode - * See the @ref buffer documentation for information on sending multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - void async_send_to(const Const_Buffers& buffers, - const endpoint_type& destination, Handler handler) - { - this->service.async_send_to(this->implementation, buffers, destination, 0, - handler); - } - - /// Start an asynchronous send. - /** - * This function is used to asynchronously send a datagram to the specified - * remote endpoint. The function call always returns immediately. - * - * @param buffers One or more data buffers to be sent to the remote endpoint. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param flags Flags specifying how the send call is to be made. - * - * @param destination The remote endpoint to which the data will be sent. - * Copies will be made of the endpoint as required. - * - * @param handler The handler to be called when the send operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes sent. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - */ - template - void async_send_to(const Const_Buffers& buffers, - const endpoint_type& destination, socket_base::message_flags flags, - Handler handler) - { - this->service.async_send_to(this->implementation, buffers, destination, - flags, handler); - } - - /// Receive some data on a connected socket. - /** - * This function is used to receive data on the datagram socket. The function - * call will block until data has been received successfully or an error - * occurs. - * - * @param buffers One or more buffers into which the data will be received. - * - * @returns The number of bytes received. - * - * @throws asio::error Thrown on failure. - * - * @note The receive operation can only be used with a connected socket. Use - * the receive_from function to receive data on an unconnected datagram - * socket. - * - * @par Example: - * To receive into a single data buffer use the @ref buffer function as - * follows: - * @code socket.receive(asio::buffer(data, size)); @endcode - * See the @ref buffer documentation for information on receiving into - * multiple buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t receive(const Mutable_Buffers& buffers) - { - return this->service.receive(this->implementation, buffers, 0, - throw_error()); - } - - /// Receive some data on a connected socket. - /** - * This function is used to receive data on the datagram socket. The function - * call will block until data has been received successfully or an error - * occurs. - * - * @param buffers One or more buffers into which the data will be received. - * - * @param flags Flags specifying how the receive call is to be made. - * - * @returns The number of bytes received. - * - * @throws asio::error Thrown on failure. - * - * @note The receive operation can only be used with a connected socket. Use - * the receive_from function to receive data on an unconnected datagram - * socket. - */ - template - std::size_t receive(const Mutable_Buffers& buffers, - socket_base::message_flags flags) - { - return this->service.receive(this->implementation, buffers, flags, - throw_error()); - } - - /// Receive some data on a connected socket. - /** - * This function is used to receive data on the datagram socket. The function - * call will block until data has been received successfully or an error - * occurs. - * - * @param buffers One or more buffers into which the data will be received. - * - * @param flags Flags specifying how the receive call is to be made. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation. - * ); @endcode - * - * @returns The number of bytes received. - * - * @note The receive operation can only be used with a connected socket. Use - * the receive_from function to receive data on an unconnected datagram - * socket. - */ - template - std::size_t receive(const Mutable_Buffers& buffers, - socket_base::message_flags flags, Error_Handler error_handler) - { - return this->service.receive(this->implementation, buffers, flags, - error_handler); - } - - /// Start an asynchronous receive on a connected socket. - /** - * This function is used to asynchronously receive data from the datagram - * socket. The function call always returns immediately. - * - * @param buffers One or more buffers into which the data will be received. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the receive operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes received. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - * - * @note The async_receive operation can only be used with a connected socket. - * Use the async_receive_from function to receive data on an unconnected - * datagram socket. - * - * @par Example: - * To receive into a single data buffer use the @ref buffer function as - * follows: - * @code - * socket.async_receive(asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on receiving into - * multiple buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - void async_receive(const Mutable_Buffers& buffers, Handler handler) - { - this->service.async_receive(this->implementation, buffers, 0, handler); - } - - /// Start an asynchronous receive on a connected socket. - /** - * This function is used to asynchronously receive data from the datagram - * socket. The function call always returns immediately. - * - * @param buffers One or more buffers into which the data will be received. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param flags Flags specifying how the receive call is to be made. - * - * @param handler The handler to be called when the receive operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes received. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - * - * @note The async_receive operation can only be used with a connected socket. - * Use the async_receive_from function to receive data on an unconnected - * datagram socket. - */ - template - void async_receive(const Mutable_Buffers& buffers, - socket_base::message_flags flags, Handler handler) - { - this->service.async_receive(this->implementation, buffers, flags, handler); - } - - /// Receive a datagram with the endpoint of the sender. - /** - * This function is used to receive a datagram. The function call will block - * until data has been received successfully or an error occurs. - * - * @param buffers One or more buffers into which the data will be received. - * - * @param sender_endpoint An endpoint object that receives the endpoint of - * the remote sender of the datagram. - * - * @returns The number of bytes received. - * - * @throws asio::error Thrown on failure. - * - * @par Example: - * To receive into a single data buffer use the @ref buffer function as - * follows: - * @code - * asio::ip::udp::endpoint sender_endpoint; - * socket.receive_from( - * asio::buffer(data, size), sender_endpoint); - * @endcode - * See the @ref buffer documentation for information on receiving into - * multiple buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t receive_from(const Mutable_Buffers& buffers, - endpoint_type& sender_endpoint) - { - return this->service.receive_from(this->implementation, buffers, - sender_endpoint, 0, throw_error()); - } - - /// Receive a datagram with the endpoint of the sender. - /** - * This function is used to receive a datagram. The function call will block - * until data has been received successfully or an error occurs. - * - * @param buffers One or more buffers into which the data will be received. - * - * @param sender_endpoint An endpoint object that receives the endpoint of - * the remote sender of the datagram. - * - * @param flags Flags specifying how the receive call is to be made. - * - * @returns The number of bytes received. - * - * @throws asio::error Thrown on failure. - */ - template - std::size_t receive_from(const Mutable_Buffers& buffers, - endpoint_type& sender_endpoint, socket_base::message_flags flags) - { - return this->service.receive_from(this->implementation, buffers, - sender_endpoint, flags, throw_error()); - } - - /// Receive a datagram with the endpoint of the sender. - /** - * This function is used to receive a datagram. The function call will block - * until data has been received successfully or an error occurs. - * - * @param buffers One or more buffers into which the data will be received. - * - * @param sender_endpoint An endpoint object that receives the endpoint of - * the remote sender of the datagram. - * - * @param flags Flags specifying how the receive call is to be made. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation. - * ); @endcode - * - * @returns The number of bytes received. - */ - template - std::size_t receive_from(const Mutable_Buffers& buffers, - endpoint_type& sender_endpoint, socket_base::message_flags flags, - Error_Handler error_handler) - { - return this->service.receive_from(this->implementation, buffers, - sender_endpoint, flags, error_handler); - } - - /// Start an asynchronous receive. - /** - * This function is used to asynchronously receive a datagram. The function - * call always returns immediately. - * - * @param buffers One or more buffers into which the data will be received. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param sender_endpoint An endpoint object that receives the endpoint of - * the remote sender of the datagram. Ownership of the sender_endpoint object - * is retained by the caller, which must guarantee that it is valid until the - * handler is called. - * - * @param handler The handler to be called when the receive operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes received. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - * - * @par Example: - * To receive into a single data buffer use the @ref buffer function as - * follows: - * @code socket.async_receive_from( - * asio::buffer(data, size), 0, sender_endpoint, handler); @endcode - * See the @ref buffer documentation for information on receiving into - * multiple buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - void async_receive_from(const Mutable_Buffers& buffers, - endpoint_type& sender_endpoint, Handler handler) - { - this->service.async_receive_from(this->implementation, buffers, - sender_endpoint, 0, handler); - } - - /// Start an asynchronous receive. - /** - * This function is used to asynchronously receive a datagram. The function - * call always returns immediately. - * - * @param buffers One or more buffers into which the data will be received. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param sender_endpoint An endpoint object that receives the endpoint of - * the remote sender of the datagram. Ownership of the sender_endpoint object - * is retained by the caller, which must guarantee that it is valid until the - * handler is called. - * - * @param flags Flags specifying how the receive call is to be made. - * - * @param handler The handler to be called when the receive operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes received. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - */ - template - void async_receive_from(const Mutable_Buffers& buffers, - endpoint_type& sender_endpoint, socket_base::message_flags flags, - Handler handler) - { - this->service.async_receive_from(this->implementation, buffers, - sender_endpoint, flags, handler); - } -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_BASIC_DATAGRAM_SOCKET_HPP diff --git a/libtorrent/include/asio/basic_deadline_timer.hpp b/libtorrent/include/asio/basic_deadline_timer.hpp deleted file mode 100644 index 7a2765a20..000000000 --- a/libtorrent/include/asio/basic_deadline_timer.hpp +++ /dev/null @@ -1,309 +0,0 @@ -// -// basic_deadline_timer.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BASIC_DEADLINE_TIMER_HPP -#define ASIO_BASIC_DEADLINE_TIMER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/basic_io_object.hpp" -#include "asio/deadline_timer_service.hpp" -#include "asio/error.hpp" - -namespace asio { - -/// Provides waitable timer functionality. -/** - * The basic_deadline_timer class template provides the ability to perform a - * blocking or asynchronous wait for a timer to expire. - * - * Most applications will use the asio::deadline_timer typedef. - * - * @par Thread Safety: - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Concepts: - * Async_Object, Error_Source. - * - * @sa @ref deadline_timer_reset - * - * @par Examples: - * Performing a blocking wait: - * @code - * // Construct a timer without setting an expiry time. - * asio::deadline_timer timer(io_service); - * - * // Set an expiry time relative to now. - * timer.expires_from_now(boost::posix_time::seconds(5)); - * - * // Wait for the timer to expire. - * timer.wait(); - * @endcode - * - * @par - * Performing an asynchronous wait: - * @code - * void handler(const asio::error& error) - * { - * if (!error) - * { - * // Timer expired. - * } - * } - * - * ... - * - * // Construct a timer with an absolute expiry time. - * asio::deadline_timer timer(io_service, - * boost::posix_time::time_from_string("2005-12-07 23:59:59.000")); - * - * // Start an asynchronous wait. - * timer.async_wait(handler); - * @endcode - */ -template , - typename Service = deadline_timer_service > -class basic_deadline_timer - : public basic_io_object -{ -public: - /// The type used for reporting errors. - typedef asio::error error_type; - - /// The time traits type. - typedef Time_Traits traits_type; - - /// The time type. - typedef typename traits_type::time_type time_type; - - /// The duration type. - typedef typename traits_type::duration_type duration_type; - - /// Constructor. - /** - * This constructor creates a timer without setting an expiry time. The - * expires_at() or expires_from_now() functions must be called to set an - * expiry time before the timer can be waited on. - * - * @param io_service The io_service object that the timer will use to dispatch - * handlers for any asynchronous operations performed on the timer. - */ - explicit basic_deadline_timer(asio::io_service& io_service) - : basic_io_object(io_service) - { - } - - /// Constructor to set a particular expiry time as an absolute time. - /** - * This constructor creates a timer and sets the expiry time. - * - * @param io_service The io_service object that the timer will use to dispatch - * handlers for any asynchronous operations performed on the timer. - * - * @param expiry_time The expiry time to be used for the timer, expressed - * as an absolute time. - */ - basic_deadline_timer(asio::io_service& io_service, - const time_type& expiry_time) - : basic_io_object(io_service) - { - this->service.expires_at(this->implementation, expiry_time); - } - - /// Constructor to set a particular expiry time relative to now. - /** - * This constructor creates a timer and sets the expiry time. - * - * @param io_service The io_service object that the timer will use to dispatch - * handlers for any asynchronous operations performed on the timer. - * - * @param expiry_time The expiry time to be used for the timer, relative to - * now. - */ - basic_deadline_timer(asio::io_service& io_service, - const duration_type& expiry_time) - : basic_io_object(io_service) - { - this->service.expires_from_now(this->implementation, expiry_time); - } - - /// Cancel any asynchronous operations that are waiting on the timer. - /** - * This function forces the completion of any pending asynchronous wait - * operations against the timer. The handler for each cancelled operation will - * be invoked with the asio::error::operation_aborted error code. - * - * Cancelling the timer does not change the expiry time. - * - * @return The number of asynchronous operations that were cancelled. - */ - std::size_t cancel() - { - return this->service.cancel(this->implementation); - } - - /// Get the timer's expiry time as an absolute time. - /** - * This function may be used to obtain the timer's current expiry time. - * Whether the timer has expired or not does not affect this value. - */ - time_type expires_at() const - { - return this->service.expires_at(this->implementation); - } - - /// Set the timer's expiry time as an absolute time. - /** - * This function sets the expiry time. Any pending asynchronous wait - * operations will be cancelled. The handler for each cancelled operation will - * be invoked with the asio::error::operation_aborted error code. - * - * See @ref deadline_timer_reset for more information on altering the expiry - * time of an active timer. - * - * @param expiry_time The expiry time to be used for the timer. - * - * @return The number of asynchronous operations that were cancelled. - */ - std::size_t expires_at(const time_type& expiry_time) - { - return this->service.expires_at(this->implementation, expiry_time); - } - - /// Get the timer's expiry time relative to now. - /** - * This function may be used to obtain the timer's current expiry time. - * Whether the timer has expired or not does not affect this value. - */ - duration_type expires_from_now() const - { - return this->service.expires_from_now(this->implementation); - } - - /// Set the timer's expiry time relative to now. - /** - * This function sets the expiry time. Any pending asynchronous wait - * operations will be cancelled. The handler for each cancelled operation will - * be invoked with the asio::error::operation_aborted error code. - * - * See @ref deadline_timer_reset for more information on altering the expiry - * time of an active timer. - * - * @param expiry_time The expiry time to be used for the timer. - * - * @return The number of asynchronous operations that were cancelled. - */ - std::size_t expires_from_now(const duration_type& expiry_time) - { - return this->service.expires_from_now(this->implementation, expiry_time); - } - - /// Perform a blocking wait on the timer. - /** - * This function is used to wait for the timer to expire. This function - * blocks and does not return until the timer has expired. - * - * @throws asio::error Thrown on failure. - */ - void wait() - { - this->service.wait(this->implementation); - } - - /// Start an asynchronous wait on the timer. - /** - * This function may be used to initiate an asynchronous wait against the - * timer. It always returns immediately. - * - * For each call to async_wait(), the supplied handler will be called exactly - * once. The handler will be called when: - * - * @li The timer has expired. - * - * @li The timer was cancelled, in which case the handler is passed the error - * code asio::error::operation_aborted. - * - * @param handler The handler to be called when the timer expires. Copies - * will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * const asio::error& error // Result of operation - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - */ - template - void async_wait(Handler handler) - { - this->service.async_wait(this->implementation, handler); - } -}; - -/** - * @page deadline_timer_reset Changing an active deadline_timer's expiry time - * - * Changing the expiry time of a timer while there are pending asynchronous - * waits causes those wait operations to be cancelled. To ensure that the action - * associated with the timer is performed only once, use something like this: - * used: - * - * @code - * void on_some_event() - * { - * if (my_timer.expires_from_now(seconds(5)) > 0) - * { - * // We managed to cancel the timer. Start new asynchronous wait. - * my_timer.async_wait(on_timeout); - * } - * else - * { - * // Too late, timer has already expired! - * } - * } - * - * void on_timeout(const asio::error& e) - * { - * if (e != asio::error::operation_aborted) - * { - * // Timer was not cancelled, take necessary action. - * } - * } - * @endcode - * - * @li The asio::basic_deadline_timer::expires_from_now() function - * cancels any pending asynchronous waits, and returns the number of - * asynchronous waits that were cancelled. If it returns 0 then you were too - * late and the wait handler has already been executed, or will soon be - * executed. If it returns 1 then the wait handler was successfully cancelled. - * - * @li If a wait handler is cancelled, the asio::error passed to it - * contains the value asio::error::operation_aborted. - * - * @sa asio::basic_deadline_timer - */ - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_BASIC_DEADLINE_TIMER_HPP diff --git a/libtorrent/include/asio/basic_io_object.hpp b/libtorrent/include/asio/basic_io_object.hpp deleted file mode 100644 index 99d8e567f..000000000 --- a/libtorrent/include/asio/basic_io_object.hpp +++ /dev/null @@ -1,75 +0,0 @@ -// -// basic_io_object.hpp -// ~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BASIC_IO_OBJECT_HPP -#define ASIO_BASIC_IO_OBJECT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/io_service.hpp" -#include "asio/detail/noncopyable.hpp" - -namespace asio { - -/// Base class for all I/O objects. -template -class basic_io_object - : private noncopyable -{ -public: - /// The type of the service that will be used to provide I/O operations. - typedef Service service_type; - - /// The underlying implementation type of I/O object. - typedef typename service_type::implementation_type implementation_type; - - /// Get the io_service associated with the object. - /** - * This function may be used to obtain the io_service object that the I/O - * object uses to dispatch handlers for asynchronous operations. - * - * @return A reference to the io_service object that the I/O object will use - * to dispatch handlers. Ownership is not transferred to the caller. - */ - asio::io_service& io_service() - { - return service.io_service(); - } - -protected: - /// Construct a basic_io_object. - explicit basic_io_object(asio::io_service& io_service) - : service(asio::use_service(io_service)) - { - service.construct(implementation); - } - - /// Protected destructor to prevent deletion through this type. - ~basic_io_object() - { - service.destroy(implementation); - } - - // The backend service implementation. - service_type& service; - - // The underlying native implementation. - implementation_type implementation; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_BASIC_IO_OBJECT_HPP diff --git a/libtorrent/include/asio/basic_resolver.hpp b/libtorrent/include/asio/basic_resolver.hpp deleted file mode 100644 index 5df89d545..000000000 --- a/libtorrent/include/asio/basic_resolver.hpp +++ /dev/null @@ -1,252 +0,0 @@ -// -// basic_resolver.hpp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BASIC_RESOLVER_HPP -#define ASIO_BASIC_RESOLVER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/basic_io_object.hpp" -#include "asio/error.hpp" -#include "asio/error_handler.hpp" -#include "asio/resolver_service.hpp" - -namespace asio { - -/// Provides endpoint resolution functionality. -/** - * The basic_resolver class template provides the ability to resolve a query - * to a list of endpoints. - * - * @par Thread Safety: - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Concepts: - * Async_Object, Error_Source. - */ -template > -class basic_resolver - : public basic_io_object -{ -public: - /// The protocol type. - typedef Protocol protocol_type; - - /// The endpoint type. - typedef typename Protocol::endpoint endpoint_type; - - /// The query type. - typedef typename Protocol::resolver_query query; - - /// The iterator type. - typedef typename Protocol::resolver_iterator iterator; - - /// The type used for reporting errors. - typedef asio::error error_type; - - /// Constructor. - /** - * This constructor creates a basic_resolver. - * - * @param io_service The io_service object that the resolver will use to - * dispatch handlers for any asynchronous operations performed on the timer. - */ - explicit basic_resolver(asio::io_service& io_service) - : basic_io_object(io_service) - { - } - - /// Cancel any asynchronous operations that are waiting on the resolver. - /** - * This function forces the completion of any pending asynchronous - * operations on the host resolver. The handler for each cancelled operation - * will be invoked with the asio::error::operation_aborted error code. - */ - void cancel() - { - return this->service.cancel(this->implementation); - } - - /// Resolve a query to a list of entries. - /** - * This function is used to resolve a query into a list of endpoint entries. - * - * @param q A query object that determines what endpoints will be returned. - * - * @returns A forward-only iterator that can be used to traverse the list - * of endpoint entries. - * - * @throws asio::error Thrown on failure. - * - * @note A default constructed iterator represents the end of the list. - * - * @note A successful call to this function is guaranteed to return at least - * one entry. - */ - iterator resolve(const query& q) - { - return this->service.resolve(this->implementation, q, throw_error()); - } - - /// Resolve a query to a list of entries. - /** - * This function is used to resolve a query into a list of endpoint entries. - * - * @param q A query object that determines what endpoints will be returned. - * - * @returns A forward-only iterator that can be used to traverse the list - * of endpoint entries. Returns a default constructed iterator if an error - * occurs. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation. - * ); @endcode - * - * @note A default constructed iterator represents the end of the list. - * - * @note A successful call to this function is guaranteed to return at least - * one entry. - */ - template - iterator resolve(const query& q, Error_Handler error_handler) - { - return this->service.resolve(this->implementation, q, error_handler); - } - - /// Asynchronously resolve a query to a list of entries. - /** - * This function is used to asynchronously resolve a query into a list of - * endpoint entries. - * - * @param q A query object that determines what endpoints will be returned. - * - * @param handler The handler to be called when the resolve operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error& error, // Result of operation. - * resolver::iterator iterator // Forward-only iterator that can be used to - * // traverse the list of endpoint entries. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - * - * @note A default constructed iterator represents the end of the list. - * - * @note A successful resolve operation is guaranteed to pass at least one - * entry to the handler. - */ - template - void async_resolve(const query& q, Handler handler) - { - return this->service.async_resolve(this->implementation, q, handler); - } - - /// Resolve an endpoint to a list of entries. - /** - * This function is used to resolve an endpoint into a list of endpoint - * entries. - * - * @param e An endpoint object that determines what endpoints will be - * returned. - * - * @returns A forward-only iterator that can be used to traverse the list - * of endpoint entries. - * - * @throws asio::error Thrown on failure. - * - * @note A default constructed iterator represents the end of the list. - * - * @note A successful call to this function is guaranteed to return at least - * one entry. - */ - iterator resolve(const endpoint_type& e) - { - return this->service.resolve(this->implementation, e, throw_error()); - } - - /// Resolve an endpoint to a list of entries. - /** - * This function is used to resolve an endpoint into a list of endpoint - * entries. - * - * @param e An endpoint object that determines what endpoints will be - * returned. - * - * @returns A forward-only iterator that can be used to traverse the list - * of endpoint entries. Returns a default constructed iterator if an error - * occurs. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation. - * ); @endcode - * - * @note A default constructed iterator represents the end of the list. - * - * @note A successful call to this function is guaranteed to return at least - * one entry. - */ - template - iterator resolve(const endpoint_type& e, Error_Handler error_handler) - { - return this->service.resolve(this->implementation, e, error_handler); - } - - /// Asynchronously resolve an endpoint to a list of entries. - /** - * This function is used to asynchronously resolve an endpoint into a list of - * endpoint entries. - * - * @param e An endpoint object that determines what endpoints will be - * returned. - * - * @param handler The handler to be called when the resolve operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error& error, // Result of operation. - * resolver::iterator iterator // Forward-only iterator that can be used to - * // traverse the list of endpoint entries. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - * - * @note A default constructed iterator represents the end of the list. - * - * @note A successful resolve operation is guaranteed to pass at least one - * entry to the handler. - */ - template - void async_resolve(const endpoint_type& e, Handler handler) - { - return this->service.async_resolve(this->implementation, e, handler); - } -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_BASIC_RESOLVER_HPP diff --git a/libtorrent/include/asio/basic_socket.hpp b/libtorrent/include/asio/basic_socket.hpp deleted file mode 100644 index 2cc31404c..000000000 --- a/libtorrent/include/asio/basic_socket.hpp +++ /dev/null @@ -1,919 +0,0 @@ -// -// basic_socket.hpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BASIC_SOCKET_HPP -#define ASIO_BASIC_SOCKET_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/basic_io_object.hpp" -#include "asio/error.hpp" -#include "asio/error_handler.hpp" -#include "asio/socket_base.hpp" - -namespace asio { - -/// Provides socket functionality. -/** - * The basic_socket class template provides functionality that is common to both - * stream-oriented and datagram-oriented sockets. - * - * @par Thread Safety: - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Concepts: - * Error_Source, IO_Object. - */ -template -class basic_socket - : public basic_io_object, - public socket_base -{ -public: - /// The native representation of a socket. - typedef typename Service::native_type native_type; - - /// The protocol type. - typedef Protocol protocol_type; - - /// The endpoint type. - typedef typename Protocol::endpoint endpoint_type; - - /// The type used for reporting errors. - typedef asio::error error_type; - - /// A basic_socket is always the lowest layer. - typedef basic_socket lowest_layer_type; - - /// Construct a basic_socket without opening it. - /** - * This constructor creates a socket without opening it. - * - * @param io_service The io_service object that the socket will use to - * dispatch handlers for any asynchronous operations performed on the socket. - */ - explicit basic_socket(asio::io_service& io_service) - : basic_io_object(io_service) - { - } - - /// Construct and open a basic_socket. - /** - * This constructor creates and opens a socket. - * - * @param io_service The io_service object that the socket will use to - * dispatch handlers for any asynchronous operations performed on the socket. - * - * @param protocol An object specifying protocol parameters to be used. - * - * @throws asio::error Thrown on failure. - */ - basic_socket(asio::io_service& io_service, - const protocol_type& protocol) - : basic_io_object(io_service) - { - this->service.open(this->implementation, protocol, throw_error()); - } - - /// Construct a basic_socket, opening it and binding it to the given local - /// endpoint. - /** - * This constructor creates a socket and automatically opens it bound to the - * specified endpoint on the local machine. The protocol used is the protocol - * associated with the given endpoint. - * - * @param io_service The io_service object that the socket will use to - * dispatch handlers for any asynchronous operations performed on the socket. - * - * @param endpoint An endpoint on the local machine to which the socket will - * be bound. - * - * @throws asio::error Thrown on failure. - */ - basic_socket(asio::io_service& io_service, - const endpoint_type& endpoint) - : basic_io_object(io_service) - { - this->service.open(this->implementation, endpoint.protocol(), - throw_error()); - this->service.bind(this->implementation, endpoint, throw_error()); - } - - /// Construct a basic_socket on an existing native socket. - /** - * This constructor creates a socket object to hold an existing native socket. - * - * @param io_service The io_service object that the socket will use to - * dispatch handlers for any asynchronous operations performed on the socket. - * - * @param protocol An object specifying protocol parameters to be used. - * - * @param native_socket A native socket. - * - * @throws asio::error Thrown on failure. - */ - basic_socket(asio::io_service& io_service, - const protocol_type& protocol, const native_type& native_socket) - : basic_io_object(io_service) - { - this->service.assign(this->implementation, protocol, native_socket, - throw_error()); - } - - /// Get a reference to the lowest layer. - /** - * This function returns a reference to the lowest layer in a stack of - * layers. Since a basic_socket cannot contain any further layers, it simply - * returns a reference to itself. - * - * @return A reference to the lowest layer in the stack of layers. Ownership - * is not transferred to the caller. - */ - lowest_layer_type& lowest_layer() - { - return *this; - } - - /// Open the socket using the specified protocol. - /** - * This function opens the socket so that it will use the specified protocol. - * - * @param protocol An object specifying protocol parameters to be used. - * - * @throws asio::error Thrown on failure. - * - * @par Example: - * @code - * asio::ip::tcp::socket socket(io_service); - * socket.open(asio::ip::tcp::v4()); - * @endcode - */ - void open(const protocol_type& protocol = protocol_type()) - { - this->service.open(this->implementation, protocol, throw_error()); - } - - /// Open the socket using the specified protocol. - /** - * This function opens the socket so that it will use the specified protocol. - * - * @param protocol An object specifying which protocol is to be used. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - * - * @par Example: - * @code - * asio::ip::tcp::socket socket(io_service); - * asio::error error; - * socket.open(asio::ip::tcp::v4(), asio::assign_error(error)); - * if (error) - * { - * // An error occurred. - * } - * @endcode - */ - template - void open(const protocol_type& protocol, Error_Handler error_handler) - { - this->service.open(this->implementation, protocol, error_handler); - } - - /// Assign an existing native socket to the socket. - /* - * This function opens the socket to hold an existing native socket. - * - * @param protocol An object specifying which protocol is to be used. - * - * @param native_socket A native socket. - * - * @throws asio::error Thrown on failure. - */ - void assign(const protocol_type& protocol, const native_type& native_socket) - { - this->service.assign(this->implementation, protocol, native_socket, - throw_error()); - } - - /// Assign an existing native socket to the socket. - /* - * This function opens the socket to hold an existing native socket. - * - * @param protocol An object specifying which protocol is to be used. - * - * @param native_socket A native socket. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - */ - template - void assign(const protocol_type& protocol, const native_type& native_socket, - Error_Handler error_handler) - { - this->service.assign(this->implementation, protocol, native_socket, - error_handler); - } - - /// Close the socket. - /** - * This function is used to close the socket. Any asynchronous send, receive - * or connect operations will be cancelled immediately, and will complete - * with the asio::error::operation_aborted error. - * - * @throws asio::error Thrown on failure. - */ - void close() - { - this->service.close(this->implementation, throw_error()); - } - - /// Close the socket. - /** - * This function is used to close the socket. Any asynchronous send, receive - * or connect operations will be cancelled immediately, and will complete - * with the asio::error::operation_aborted error. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - * - * @par Example: - * @code - * asio::ip::tcp::socket socket(io_service); - * ... - * asio::error error; - * socket.close(asio::assign_error(error)); - * if (error) - * { - * // An error occurred. - * } - * @endcode - */ - template - void close(Error_Handler error_handler) - { - this->service.close(this->implementation, error_handler); - } - - /// Get the native socket representation. - /** - * This function may be used to obtain the underlying representation of the - * socket. This is intended to allow access to native socket functionality - * that is not otherwise provided. - */ - native_type native() - { - return this->service.native(this->implementation); - } - - /// Cancel all asynchronous operations associated with the socket. - /** - * This function causes all outstanding asynchronous connect, send and receive - * operations to finish immediately, and the handlers for cancelled operations - * will be passed the asio::error::operation_aborted error. - * - * @throws asio::error Thrown on failure. - */ - void cancel() - { - this->service.cancel(this->implementation, throw_error()); - } - - /// Cancel all asynchronous operations associated with the socket. - /** - * This function causes all outstanding asynchronous connect, send and receive - * operations to finish immediately, and the handlers for cancelled operations - * will be passed the asio::error::operation_aborted error. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - */ - template - void cancel(Error_Handler error_handler) - { - this->service.cancel(this->implementation, error_handler); - } - - /// Bind the socket to the given local endpoint. - /** - * This function binds the socket to the specified endpoint on the local - * machine. - * - * @param endpoint An endpoint on the local machine to which the socket will - * be bound. - * - * @throws asio::error Thrown on failure. - * - * @par Example: - * @code - * asio::ip::tcp::socket socket(io_service); - * socket.open(asio::ip::tcp::v4()); - * socket.bind(asio::ip::tcp::endpoint( - * asio::ip::tcp::v4(), 12345)); - * @endcode - */ - void bind(const endpoint_type& endpoint) - { - this->service.bind(this->implementation, endpoint, throw_error()); - } - - /// Bind the socket to the given local endpoint. - /** - * This function binds the socket to the specified endpoint on the local - * machine. - * - * @param endpoint An endpoint on the local machine to which the socket will - * be bound. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - * - * @par Example: - * @code - * asio::ip::tcp::socket socket(io_service); - * socket.open(asio::ip::tcp::v4()); - * asio::error error; - * socket.bind(asio::ip::tcp::endpoint( - * asio::ip::tcp::v4(), 12345), - * asio::assign_error(error)); - * if (error) - * { - * // An error occurred. - * } - * @endcode - */ - template - void bind(const endpoint_type& endpoint, Error_Handler error_handler) - { - this->service.bind(this->implementation, endpoint, error_handler); - } - - /// Connect the socket to the specified endpoint. - /** - * This function is used to connect a socket to the specified remote endpoint. - * The function call will block until the connection is successfully made or - * an error occurs. - * - * The socket is automatically opened if it is not already open. If the - * connect fails, and the socket was automatically opened, the socket is - * returned to the closed state. - * - * @param peer_endpoint The remote endpoint to which the socket will be - * connected. - * - * @throws asio::error Thrown on failure. - * - * @par Example: - * @code - * asio::ip::tcp::socket socket(io_service); - * asio::ip::tcp::endpoint endpoint( - * asio::ip::address::from_string("1.2.3.4"), 12345); - * socket.connect(endpoint); - * @endcode - */ - void connect(const endpoint_type& peer_endpoint) - { - this->service.connect(this->implementation, peer_endpoint, throw_error()); - } - - /// Connect the socket to the specified endpoint. - /** - * This function is used to connect a socket to the specified remote endpoint. - * The function call will block until the connection is successfully made or - * an error occurs. - * - * The socket is automatically opened if it is not already open. If the - * connect fails, and the socket was automatically opened, the socket is - * returned to the closed state. - * - * @param peer_endpoint The remote endpoint to which the socket will be - * connected. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - * - * @par Example: - * @code - * asio::ip::tcp::socket socket(io_service); - * asio::ip::tcp::endpoint endpoint( - * asio::ip::address::from_string("1.2.3.4"), 12345); - * asio::error error; - * socket.connect(endpoint, asio::assign_error(error)); - * if (error) - * { - * // An error occurred. - * } - * @endcode - */ - template - void connect(const endpoint_type& peer_endpoint, Error_Handler error_handler) - { - this->service.connect(this->implementation, peer_endpoint, error_handler); - } - - /// Start an asynchronous connect. - /** - * This function is used to asynchronously connect a socket to the specified - * remote endpoint. The function call always returns immediately. - * - * The socket is automatically opened if it is not already open. If the - * connect fails, and the socket was automatically opened, the socket is - * returned to the closed state. - * - * @param peer_endpoint The remote endpoint to which the socket will be - * connected. Copies will be made of the endpoint object as required. - * - * @param handler The handler to be called when the connection operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error& error // Result of operation - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - * - * @par Example: - * @code - * void connect_handler(const asio::error& error) - * { - * if (!error) - * { - * // Connect succeeded. - * } - * } - * - * ... - * - * asio::ip::tcp::socket socket(io_service); - * asio::ip::tcp::endpoint endpoint( - * asio::ip::address::from_string("1.2.3.4"), 12345); - * socket.async_connect(endpoint, connect_handler); - * @endcode - */ - template - void async_connect(const endpoint_type& peer_endpoint, Handler handler) - { - this->service.async_connect(this->implementation, peer_endpoint, handler); - } - - /// Set an option on the socket. - /** - * This function is used to set an option on the socket. - * - * @param option The new option value to be set on the socket. - * - * @throws asio::error Thrown on failure. - * - * @sa Socket_Option @n - * asio::socket_base::broadcast @n - * asio::socket_base::do_not_route @n - * asio::socket_base::keep_alive @n - * asio::socket_base::linger @n - * asio::socket_base::receive_buffer_size @n - * asio::socket_base::receive_low_watermark @n - * asio::socket_base::reuse_address @n - * asio::socket_base::send_buffer_size @n - * asio::socket_base::send_low_watermark @n - * asio::ip::multicast::join_group @n - * asio::ip::multicast::leave_group @n - * asio::ip::multicast::enable_loopback @n - * asio::ip::multicast::outbound_interface @n - * asio::ip::multicast::hops @n - * asio::ip::tcp::no_delay - * - * @par Example: - * Setting the IPPROTO_TCP/TCP_NODELAY option: - * @code - * asio::ip::tcp::socket socket(io_service); - * ... - * asio::ip::tcp::no_delay option(true); - * socket.set_option(option); - * @endcode - */ - template - void set_option(const Socket_Option& option) - { - this->service.set_option(this->implementation, option, throw_error()); - } - - /// Set an option on the socket. - /** - * This function is used to set an option on the socket. - * - * @param option The new option value to be set on the socket. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - * - * @sa Socket_Option @n - * asio::socket_base::broadcast @n - * asio::socket_base::do_not_route @n - * asio::socket_base::keep_alive @n - * asio::socket_base::linger @n - * asio::socket_base::receive_buffer_size @n - * asio::socket_base::receive_low_watermark @n - * asio::socket_base::reuse_address @n - * asio::socket_base::send_buffer_size @n - * asio::socket_base::send_low_watermark @n - * asio::ip::multicast::join_group @n - * asio::ip::multicast::leave_group @n - * asio::ip::multicast::enable_loopback @n - * asio::ip::multicast::outbound_interface @n - * asio::ip::multicast::hops @n - * asio::ip::tcp::no_delay - * - * @par Example: - * Setting the IPPROTO_TCP/TCP_NODELAY option: - * @code - * asio::ip::tcp::socket socket(io_service); - * ... - * asio::ip::tcp::no_delay option(true); - * asio::error error; - * socket.set_option(option, asio::assign_error(error)); - * if (error) - * { - * // An error occurred. - * } - * @endcode - */ - template - void set_option(const Socket_Option& option, Error_Handler error_handler) - { - this->service.set_option(this->implementation, option, error_handler); - } - - /// Get an option from the socket. - /** - * This function is used to get the current value of an option on the socket. - * - * @param option The option value to be obtained from the socket. - * - * @throws asio::error Thrown on failure. - * - * @sa Socket_Option @n - * asio::socket_base::broadcast @n - * asio::socket_base::do_not_route @n - * asio::socket_base::keep_alive @n - * asio::socket_base::linger @n - * asio::socket_base::receive_buffer_size @n - * asio::socket_base::receive_low_watermark @n - * asio::socket_base::reuse_address @n - * asio::socket_base::send_buffer_size @n - * asio::socket_base::send_low_watermark @n - * asio::ip::multicast::join_group @n - * asio::ip::multicast::leave_group @n - * asio::ip::multicast::enable_loopback @n - * asio::ip::multicast::outbound_interface @n - * asio::ip::multicast::hops @n - * asio::ip::tcp::no_delay - * - * @par Example: - * Getting the value of the SOL_SOCKET/SO_KEEPALIVE option: - * @code - * asio::ip::tcp::socket socket(io_service); - * ... - * asio::ip::tcp::socket::keep_alive option; - * socket.get_option(option); - * bool is_set = option.get(); - * @endcode - */ - template - void get_option(Socket_Option& option) const - { - this->service.get_option(this->implementation, option, throw_error()); - } - - /// Get an option from the socket. - /** - * This function is used to get the current value of an option on the socket. - * - * @param option The option value to be obtained from the socket. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - * - * @sa Socket_Option @n - * asio::socket_base::broadcast @n - * asio::socket_base::do_not_route @n - * asio::socket_base::keep_alive @n - * asio::socket_base::linger @n - * asio::socket_base::receive_buffer_size @n - * asio::socket_base::receive_low_watermark @n - * asio::socket_base::reuse_address @n - * asio::socket_base::send_buffer_size @n - * asio::socket_base::send_low_watermark @n - * asio::ip::multicast::join_group @n - * asio::ip::multicast::leave_group @n - * asio::ip::multicast::enable_loopback @n - * asio::ip::multicast::outbound_interface @n - * asio::ip::multicast::hops @n - * asio::ip::tcp::no_delay - * - * @par Example: - * Getting the value of the SOL_SOCKET/SO_KEEPALIVE option: - * @code - * asio::ip::tcp::socket socket(io_service); - * ... - * asio::ip::tcp::socket::keep_alive option; - * asio::error error; - * socket.get_option(option, asio::assign_error(error)); - * if (error) - * { - * // An error occurred. - * } - * bool is_set = option.get(); - * @endcode - */ - template - void get_option(Socket_Option& option, Error_Handler error_handler) const - { - this->service.get_option(this->implementation, option, error_handler); - } - - /// Perform an IO control command on the socket. - /** - * This function is used to execute an IO control command on the socket. - * - * @param command The IO control command to be performed on the socket. - * - * @throws asio::error Thrown on failure. - * - * @sa IO_Control_Command @n - * asio::socket_base::bytes_readable @n - * asio::socket_base::non_blocking_io - * - * @par Example: - * Getting the number of bytes ready to read: - * @code - * asio::ip::tcp::socket socket(io_service); - * ... - * asio::ip::tcp::socket::bytes_readable command; - * socket.io_control(command); - * std::size_t bytes_readable = command.get(); - * @endcode - */ - template - void io_control(IO_Control_Command& command) - { - this->service.io_control(this->implementation, command, throw_error()); - } - - /// Perform an IO control command on the socket. - /** - * This function is used to execute an IO control command on the socket. - * - * @param command The IO control command to be performed on the socket. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - * - * @sa IO_Control_Command @n - * asio::socket_base::bytes_readable @n - * asio::socket_base::non_blocking_io - * - * @par Example: - * Getting the number of bytes ready to read: - * @code - * asio::ip::tcp::socket socket(io_service); - * ... - * asio::ip::tcp::socket::bytes_readable command; - * asio::error error; - * socket.io_control(command, asio::assign_error(error)); - * if (error) - * { - * // An error occurred. - * } - * std::size_t bytes_readable = command.get(); - * @endcode - */ - template - void io_control(IO_Control_Command& command, Error_Handler error_handler) - { - this->service.io_control(this->implementation, command, error_handler); - } - - /// Get the local endpoint of the socket. - /** - * This function is used to obtain the locally bound endpoint of the socket. - * - * @returns An object that represents the local endpoint of the socket. - * - * @throws asio::error Thrown on failure. - * - * @par Example: - * @code - * asio::ip::tcp::socket socket(io_service); - * ... - * asio::ip::tcp::endpoint endpoint = socket.local_endpoint(); - * @endcode - */ - endpoint_type local_endpoint() const - { - return this->service.local_endpoint(this->implementation, throw_error()); - } - - /// Get the local endpoint of the socket. - /** - * This function is used to obtain the locally bound endpoint of the socket. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - * - * @returns An object that represents the local endpoint of the socket. - * Returns a default-constructed endpoint object if an error occurred and the - * error handler did not throw an exception. - * - * @par Example: - * @code - * asio::ip::tcp::socket socket(io_service); - * ... - * asio::error error; - * asio::ip::tcp::endpoint endpoint - * = socket.local_endpoint(asio::assign_error(error)); - * if (error) - * { - * // An error occurred. - * } - * @endcode - */ - template - endpoint_type local_endpoint(Error_Handler error_handler) const - { - return this->service.local_endpoint(this->implementation, error_handler); - } - - /// Get the remote endpoint of the socket. - /** - * This function is used to obtain the remote endpoint of the socket. - * - * @returns An object that represents the remote endpoint of the socket. - * - * @throws asio::error Thrown on failure. - * - * @par Example: - * @code - * asio::ip::tcp::socket socket(io_service); - * ... - * asio::ip::tcp::endpoint endpoint = socket.remote_endpoint(); - * @endcode - */ - endpoint_type remote_endpoint() const - { - return this->service.remote_endpoint(this->implementation, throw_error()); - } - - /// Get the remote endpoint of the socket. - /** - * This function is used to obtain the remote endpoint of the socket. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - * - * @returns An object that represents the remote endpoint of the socket. - * Returns a default-constructed endpoint object if an error occurred and the - * error handler did not throw an exception. - * - * @par Example: - * @code - * asio::ip::tcp::socket socket(io_service); - * ... - * asio::error error; - * asio::ip::tcp::endpoint endpoint - * = socket.remote_endpoint(asio::assign_error(error)); - * if (error) - * { - * // An error occurred. - * } - * @endcode - */ - template - endpoint_type remote_endpoint(Error_Handler error_handler) const - { - return this->service.remote_endpoint(this->implementation, error_handler); - } - - /// Disable sends or receives on the socket. - /** - * This function is used to disable send operations, receive operations, or - * both. - * - * @param what Determines what types of operation will no longer be allowed. - * - * @throws asio::error Thrown on failure. - * - * @par Example: - * Shutting down the send side of the socket: - * @code - * asio::ip::tcp::socket socket(io_service); - * ... - * socket.shutdown(asio::ip::tcp::socket::shutdown_send); - * @endcode - */ - void shutdown(shutdown_type what) - { - this->service.shutdown(this->implementation, what, throw_error()); - } - - /// Disable sends or receives on the socket. - /** - * This function is used to disable send operations, receive operations, or - * both. - * - * @param what Determines what types of operation will no longer be allowed. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - * - * @par Example: - * Shutting down the send side of the socket: - * @code - * asio::ip::tcp::socket socket(io_service); - * ... - * asio::error error; - * socket.shutdown(asio::ip::tcp::socket::shutdown_send, - * asio::assign_error(error)); - * if (error) - * { - * // An error occurred. - * } - * @endcode - */ - template - void shutdown(shutdown_type what, Error_Handler error_handler) - { - this->service.shutdown(this->implementation, what, error_handler); - } - -protected: - /// Protected destructor to prevent deletion through this type. - ~basic_socket() - { - } -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_BASIC_SOCKET_HPP diff --git a/libtorrent/include/asio/basic_socket_acceptor.hpp b/libtorrent/include/asio/basic_socket_acceptor.hpp deleted file mode 100644 index c646dc9d2..000000000 --- a/libtorrent/include/asio/basic_socket_acceptor.hpp +++ /dev/null @@ -1,854 +0,0 @@ -// -// basic_socket_acceptor.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BASIC_SOCKET_ACCEPTOR_HPP -#define ASIO_BASIC_SOCKET_ACCEPTOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/basic_io_object.hpp" -#include "asio/basic_socket.hpp" -#include "asio/error.hpp" -#include "asio/error_handler.hpp" -#include "asio/socket_acceptor_service.hpp" -#include "asio/socket_base.hpp" - -namespace asio { - -/// Provides the ability to accept new connections. -/** - * The basic_socket_acceptor class template is used for accepting new socket - * connections. - * - * @par Thread Safety: - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Concepts: - * Async_Object, Error_Source. - * - * @par Example: - * Opening a socket acceptor with the SO_REUSEADDR option enabled: - * @code - * asio::ip::tcp::acceptor acceptor(io_service); - * asio::ip::tcp::endpoint endpoint(asio::ip::tcp::v4(), port); - * acceptor.open(endpoint.protocol()); - * acceptor.set_option(asio::ip::tcp::acceptor::reuse_address(true)); - * acceptor.bind(endpoint); - * acceptor.listen(); - * @endcode - */ -template > -class basic_socket_acceptor - : public basic_io_object, - public socket_base -{ -public: - /// The native representation of an acceptor. - typedef typename Service::native_type native_type; - - /// The protocol type. - typedef Protocol protocol_type; - - /// The endpoint type. - typedef typename Protocol::endpoint endpoint_type; - - /// The type used for reporting errors. - typedef asio::error error_type; - - /// Construct an acceptor without opening it. - /** - * This constructor creates an acceptor without opening it to listen for new - * connections. The open() function must be called before the acceptor can - * accept new socket connections. - * - * @param io_service The io_service object that the acceptor will use to - * dispatch handlers for any asynchronous operations performed on the - * acceptor. - */ - explicit basic_socket_acceptor(asio::io_service& io_service) - : basic_io_object(io_service) - { - } - - /// Construct an open acceptor. - /** - * This constructor creates an acceptor and automatically opens it. - * - * @param io_service The io_service object that the acceptor will use to - * dispatch handlers for any asynchronous operations performed on the - * acceptor. - * - * @param protocol An object specifying protocol parameters to be used. - * - * @throws asio::error Thrown on failure. - */ - basic_socket_acceptor(asio::io_service& io_service, - const protocol_type& protocol) - : basic_io_object(io_service) - { - this->service.open(this->implementation, protocol, throw_error()); - } - - /// Construct an acceptor opened on the given endpoint. - /** - * This constructor creates an acceptor and automatically opens it to listen - * for new connections on the specified endpoint. - * - * @param io_service The io_service object that the acceptor will use to - * dispatch handlers for any asynchronous operations performed on the - * acceptor. - * - * @param endpoint An endpoint on the local machine on which the acceptor - * will listen for new connections. - * - * @param reuse_addr Whether the constructor should set the socket option - * socket_base::reuse_address. - * - * @throws asio::error Thrown on failure. - * - * @note This constructor is equivalent to the following code: - * @code - * basic_socket_acceptor acceptor(io_service); - * acceptor.open(endpoint.protocol()); - * if (reuse_addr) - * acceptor.set_option(socket_base::reuse_address(true)); - * acceptor.bind(endpoint); - * acceptor.listen(listen_backlog); - * @endcode - */ - basic_socket_acceptor(asio::io_service& io_service, - const endpoint_type& endpoint, bool reuse_addr = true) - : basic_io_object(io_service) - { - this->service.open(this->implementation, endpoint.protocol(), - throw_error()); - if (reuse_addr) - { - this->service.set_option(this->implementation, - socket_base::reuse_address(true), throw_error()); - } - this->service.bind(this->implementation, endpoint, throw_error()); - this->service.listen(this->implementation, - socket_base::max_connections, throw_error()); - } - - /// Construct a basic_socket_acceptor on an existing native acceptor. - /** - * This constructor creates an acceptor object to hold an existing native - * acceptor. - * - * @param io_service The io_service object that the acceptor will use to - * dispatch handlers for any asynchronous operations performed on the - * acceptor. - * - * @param protocol An object specifying protocol parameters to be used. - * - * @param native_acceptor A native acceptor. - * - * @throws asio::error Thrown on failure. - */ - basic_socket_acceptor(asio::io_service& io_service, - const protocol_type& protocol, const native_type& native_acceptor) - : basic_io_object(io_service) - { - this->service.assign(this->implementation, protocol, native_acceptor, - throw_error()); - } - - /// Open the acceptor using the specified protocol. - /** - * This function opens the socket acceptor so that it will use the specified - * protocol. - * - * @param protocol An object specifying which protocol is to be used. - * - * @par Example: - * @code - * asio::ip::tcp::acceptor acceptor(io_service); - * acceptor.open(asio::ip::tcp::v4()); - * @endcode - */ - void open(const protocol_type& protocol = protocol_type()) - { - this->service.open(this->implementation, protocol, throw_error()); - } - - /// Open the acceptor using the specified protocol. - /** - * This function opens the socket acceptor so that it will use the specified - * protocol. - * - * @param protocol An object specifying which protocol is to be used. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - * - * @par Example: - * @code - * asio::ip::tcp::acceptor acceptor(io_service); - * asio::error error; - * acceptor.open(asio::ip::tcp::v4(), - * asio::assign_error(error)); - * if (error) - * { - * // An error occurred. - * } - * @endcode - */ - template - void open(const protocol_type& protocol, Error_Handler error_handler) - { - this->service.open(this->implementation, protocol, error_handler); - } - - /// Assigns an existing native acceptor to the acceptor. - /* - * This function opens the acceptor to hold an existing native acceptor. - * - * @param protocol An object specifying which protocol is to be used. - * - * @param native_acceptor A native acceptor. - * - * @throws asio::error Thrown on failure. - */ - void assign(const protocol_type& protocol, const native_type& native_acceptor) - { - this->service.assign(this->implementation, protocol, native_acceptor, - throw_error()); - } - - /// Assigns an existing native acceptor to the acceptor. - /* - * This function opens the acceptor to hold an existing native acceptor. - * - * @param protocol An object specifying which protocol is to be used. - * - * @param native_acceptor A native acceptor. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - */ - template - void assign(const protocol_type& protocol, const native_type& native_acceptor, - Error_Handler error_handler) - { - this->service.assign(this->implementation, protocol, native_acceptor, - error_handler); - } - - /// Bind the acceptor to the given local endpoint. - /** - * This function binds the socket acceptor to the specified endpoint on the - * local machine. - * - * @param endpoint An endpoint on the local machine to which the socket - * acceptor will be bound. - * - * @throws asio::error Thrown on failure. - * - * @par Example: - * @code - * asio::ip::tcp::acceptor acceptor(io_service); - * acceptor.open(asio::ip::tcp::v4()); - * acceptor.bind(asio::ip::tcp::endpoint(12345)); - * @endcode - */ - void bind(const endpoint_type& endpoint) - { - this->service.bind(this->implementation, endpoint, throw_error()); - } - - /// Bind the acceptor to the given local endpoint. - /** - * This function binds the socket acceptor to the specified endpoint on the - * local machine. - * - * @param endpoint An endpoint on the local machine to which the socket - * acceptor will be bound. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - * - * @par Example: - * @code - * asio::ip::tcp::acceptor acceptor(io_service); - * acceptor.open(asio::ip::tcp::v4()); - * asio::error error; - * acceptor.bind(asio::ip::tcp::endpoint(12345), - * asio::assign_error(error)); - * if (error) - * { - * // An error occurred. - * } - * @endcode - */ - template - void bind(const endpoint_type& endpoint, Error_Handler error_handler) - { - this->service.bind(this->implementation, endpoint, error_handler); - } - - /// Place the acceptor into the state where it will listen for new - /// connections. - /** - * This function puts the socket acceptor into the state where it may accept - * new connections. - * - * @param backlog The maximum length of the queue of pending connections. - */ - void listen(int backlog = socket_base::max_connections) - { - this->service.listen(this->implementation, backlog, throw_error()); - } - - /// Place the acceptor into the state where it will listen for new - /// connections. - /** - * This function puts the socket acceptor into the state where it may accept - * new connections. - * - * @param backlog The maximum length of the queue of pending connections. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - * - * @par Example: - * @code - * asio::ip::tcp::acceptor acceptor(io_service); - * ... - * asio::error error; - * acceptor.listen(asio::socket_base::max_connections, - * asio::assign_error(error)); - * if (error) - * { - * // An error occurred. - * } - * @endcode - */ - template - void listen(int backlog, Error_Handler error_handler) - { - this->service.listen(this->implementation, backlog, error_handler); - } - - /// Close the acceptor. - /** - * This function is used to close the acceptor. Any asynchronous accept - * operations will be cancelled immediately. - * - * A subsequent call to open() is required before the acceptor can again be - * used to again perform socket accept operations. - * - * @throws asio::error Thrown on failure. - */ - void close() - { - this->service.close(this->implementation, throw_error()); - } - - /// Close the acceptor. - /** - * This function is used to close the acceptor. Any asynchronous accept - * operations will be cancelled immediately. - * - * A subsequent call to open() is required before the acceptor can again be - * used to again perform socket accept operations. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - * - * @par Example: - * @code - * asio::ip::tcp::acceptor acceptor(io_service); - * ... - * asio::error error; - * acceptor.close(asio::assign_error(error)); - * if (error) - * { - * // An error occurred. - * } - * @endcode - */ - template - void close(Error_Handler error_handler) - { - this->service.close(this->implementation, error_handler); - } - - /// Get the native acceptor representation. - /** - * This function may be used to obtain the underlying representation of the - * acceptor. This is intended to allow access to native acceptor functionality - * that is not otherwise provided. - */ - native_type native() - { - return this->service.native(this->implementation); - } - - /// Cancel all asynchronous operations associated with the acceptor. - /** - * This function causes all outstanding asynchronous connect, send and receive - * operations to finish immediately, and the handlers for cancelled operations - * will be passed the asio::error::operation_aborted error. - * - * @throws asio::error Thrown on failure. - */ - void cancel() - { - this->service.cancel(this->implementation, throw_error()); - } - - /// Cancel all asynchronous operations associated with the acceptor. - /** - * This function causes all outstanding asynchronous connect, send and receive - * operations to finish immediately, and the handlers for cancelled operations - * will be passed the asio::error::operation_aborted error. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - */ - template - void cancel(Error_Handler error_handler) - { - this->service.cancel(this->implementation, error_handler); - } - - /// Set an option on the acceptor. - /** - * This function is used to set an option on the acceptor. - * - * @param option The new option value to be set on the acceptor. - * - * @throws asio::error Thrown on failure. - * - * @sa Socket_Option @n - * asio::socket_base::reuse_address - * asio::socket_base::enable_connection_aborted - * - * @par Example: - * Setting the SOL_SOCKET/SO_REUSEADDR option: - * @code - * asio::ip::tcp::acceptor acceptor(io_service); - * ... - * asio::ip::tcp::acceptor::reuse_address option(true); - * acceptor.set_option(option); - * @endcode - */ - template - void set_option(const Option& option) - { - this->service.set_option(this->implementation, option, throw_error()); - } - - /// Set an option on the acceptor. - /** - * This function is used to set an option on the acceptor. - * - * @param option The new option value to be set on the acceptor. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - * - * @sa Socket_Option @n - * asio::socket_base::reuse_address - * asio::socket_base::enable_connection_aborted - * - * @par Example: - * Setting the SOL_SOCKET/SO_REUSEADDR option: - * @code - * asio::ip::tcp::acceptor acceptor(io_service); - * ... - * asio::ip::tcp::acceptor::reuse_address option(true); - * asio::error error; - * acceptor.set_option(option, asio::assign_error(error)); - * if (error) - * { - * // An error occurred. - * } - * @endcode - */ - template - void set_option(const Option& option, Error_Handler error_handler) - { - this->service.set_option(this->implementation, option, error_handler); - } - - /// Get an option from the acceptor. - /** - * This function is used to get the current value of an option on the - * acceptor. - * - * @param option The option value to be obtained from the acceptor. - * - * @throws asio::error Thrown on failure. - * - * @sa Socket_Option @n - * asio::socket_base::reuse_address - * - * @par Example: - * Getting the value of the SOL_SOCKET/SO_REUSEADDR option: - * @code - * asio::ip::tcp::acceptor acceptor(io_service); - * ... - * asio::ip::tcp::acceptor::reuse_address option; - * acceptor.get_option(option); - * bool is_set = option.get(); - * @endcode - */ - template - void get_option(Option& option) - { - this->service.get_option(this->implementation, option, throw_error()); - } - - /// Get an option from the acceptor. - /** - * This function is used to get the current value of an option on the - * acceptor. - * - * @param option The option value to be obtained from the acceptor. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - * - * @sa Socket_Option @n - * asio::socket_base::reuse_address - * - * @par Example: - * Getting the value of the SOL_SOCKET/SO_REUSEADDR option: - * @code - * asio::ip::tcp::acceptor acceptor(io_service); - * ... - * asio::ip::tcp::acceptor::reuse_address option; - * asio::error error; - * acceptor.get_option(option, asio::assign_error(error)); - * if (error) - * { - * // An error occurred. - * } - * bool is_set = option.get(); - * @endcode - */ - template - void get_option(Option& option, Error_Handler error_handler) - { - this->service.get_option(this->implementation, option, error_handler); - } - - /// Get the local endpoint of the acceptor. - /** - * This function is used to obtain the locally bound endpoint of the acceptor. - * - * @returns An object that represents the local endpoint of the acceptor. - * - * @throws asio::error Thrown on failure. - * - * @par Example: - * @code - * asio::ip::tcp::acceptor acceptor(io_service); - * ... - * asio::ip::tcp::endpoint endpoint = acceptor.local_endpoint(); - * @endcode - */ - endpoint_type local_endpoint() const - { - return this->service.local_endpoint(this->implementation, throw_error()); - } - - /// Get the local endpoint of the acceptor. - /** - * This function is used to obtain the locally bound endpoint of the acceptor. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - * - * @returns An object that represents the local endpoint of the acceptor. - * Returns a default-constructed endpoint object if an error occurred and the - * error handler did not throw an exception. - * - * @par Example: - * @code - * asio::ip::tcp::acceptor acceptor(io_service); - * ... - * asio::error error; - * asio::ip::tcp::endpoint endpoint - * = acceptor.local_endpoint(asio::assign_error(error)); - * if (error) - * { - * // An error occurred. - * } - * @endcode - */ - template - endpoint_type local_endpoint(Error_Handler error_handler) const - { - return this->service.local_endpoint(this->implementation, error_handler); - } - - /// Accept a new connection. - /** - * This function is used to accept a new connection from a peer into the - * given socket. The function call will block until a new connection has been - * accepted successfully or an error occurs. - * - * @param peer The socket into which the new connection will be accepted. - * - * @throws asio::error Thrown on failure. - * - * @par Example: - * @code - * asio::ip::tcp::acceptor acceptor(io_service); - * ... - * asio::ip::tcp::socket socket(io_service); - * acceptor.accept(socket); - * @endcode - */ - template - void accept(basic_socket& peer) - { - this->service.accept(this->implementation, peer, throw_error()); - } - - /// Accept a new connection. - /** - * This function is used to accept a new connection from a peer into the - * given socket. The function call will block until a new connection has been - * accepted successfully or an error occurs. - * - * @param peer The socket into which the new connection will be accepted. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - * - * @par Example: - * @code - * asio::ip::tcp::acceptor acceptor(io_service); - * ... - * asio::ip::tcp::soocket socket(io_service); - * asio::error error; - * acceptor.accept(socket, asio::assign_error(error)); - * if (error) - * { - * // An error occurred. - * } - * @endcode - */ - template - void accept(basic_socket& peer, - Error_Handler error_handler) - { - this->service.accept(this->implementation, peer, error_handler); - } - - /// Start an asynchronous accept. - /** - * This function is used to asynchronously accept a new connection into a - * socket. The function call always returns immediately. - * - * @param peer The socket into which the new connection will be accepted. - * Ownership of the peer object is retained by the caller, which must - * guarantee that it is valid until the handler is called. - * - * @param handler The handler to be called when the accept operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error& error // Result of operation - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - * - * @par Example: - * @code - * void accept_handler(const asio::error& error) - * { - * if (!error) - * { - * // Accept succeeded. - * } - * } - * - * ... - * - * asio::ip::tcp::acceptor acceptor(io_service); - * ... - * asio::ip::tcp::socket socket(io_service); - * acceptor.async_accept(socket, accept_handler); - * @endcode - */ - template - void async_accept(basic_socket& peer, - Handler handler) - { - this->service.async_accept(this->implementation, peer, handler); - } - - /// Accept a new connection and obtain the endpoint of the peer - /** - * This function is used to accept a new connection from a peer into the - * given socket, and additionally provide the endpoint of the remote peer. - * The function call will block until a new connection has been accepted - * successfully or an error occurs. - * - * @param peer The socket into which the new connection will be accepted. - * - * @param peer_endpoint An endpoint object which will receive the endpoint of - * the remote peer. - * - * @throws asio::error Thrown on failure. - * - * @par Example: - * @code - * asio::ip::tcp::acceptor acceptor(io_service); - * ... - * asio::ip::tcp::socket socket(io_service); - * asio::ip::tcp::endpoint endpoint; - * acceptor.accept_endpoint(socket, endpoint); - * @endcode - */ - template - void accept_endpoint(basic_socket& peer, - endpoint_type& peer_endpoint) - { - this->service.accept_endpoint(this->implementation, peer, peer_endpoint, - throw_error()); - } - - /// Accept a new connection and obtain the endpoint of the peer - /** - * This function is used to accept a new connection from a peer into the - * given socket, and additionally provide the endpoint of the remote peer. - * The function call will block until a new connection has been accepted - * successfully or an error occurs. - * - * @param peer The socket into which the new connection will be accepted. - * - * @param peer_endpoint An endpoint object which will receive the endpoint of - * the remote peer. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - * - * @par Example: - * @code - * asio::ip::tcp::acceptor acceptor(io_service); - * ... - * asio::ip::tcp::socket socket(io_service); - * asio::ip::tcp::endpoint endpoint; - * asio::error error; - * acceptor.accept_endpoint(socket, endpoint, - * asio::assign_error(error)); - * if (error) - * { - * // An error occurred. - * } - * @endcode - */ - template - void accept_endpoint(basic_socket& peer, - endpoint_type& peer_endpoint, Error_Handler error_handler) - { - this->service.accept_endpoint(this->implementation, peer, peer_endpoint, - error_handler); - } - - /// Start an asynchronous accept. - /** - * This function is used to asynchronously accept a new connection into a - * socket, and additionally obtain the endpoint of the remote peer. The - * function call always returns immediately. - * - * @param peer The socket into which the new connection will be accepted. - * Ownership of the peer object is retained by the caller, which must - * guarantee that it is valid until the handler is called. - * - * @param peer_endpoint An endpoint object into which the endpoint of the - * remote peer will be written. Ownership of the peer_endpoint object is - * retained by the caller, which must guarantee that it is valid until the - * handler is called. - * - * @param handler The handler to be called when the accept operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error& error // Result of operation - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - */ - template - void async_accept_endpoint(basic_socket& peer, - endpoint_type& peer_endpoint, Handler handler) - { - this->service.async_accept_endpoint(this->implementation, peer, - peer_endpoint, handler); - } -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_BASIC_SOCKET_ACCEPTOR_HPP diff --git a/libtorrent/include/asio/basic_socket_iostream.hpp b/libtorrent/include/asio/basic_socket_iostream.hpp deleted file mode 100644 index 052b6e603..000000000 --- a/libtorrent/include/asio/basic_socket_iostream.hpp +++ /dev/null @@ -1,176 +0,0 @@ -// -// basic_socket_iostream.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BASIC_SOCKET_IOSTREAM_HPP -#define ASIO_BASIC_SOCKET_IOSTREAM_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/basic_socket_streambuf.hpp" -#include "asio/stream_socket_service.hpp" - -#if !defined(ASIO_SOCKET_IOSTREAM_MAX_ARITY) -#define ASIO_SOCKET_IOSTREAM_MAX_ARITY 5 -#endif // !defined(ASIO_SOCKET_IOSTREAM_MAX_ARITY) - -// A macro that should expand to: -// template < typename T1, ..., typename Tn > -// explicit basic_socket_iostream( T1 x1, ..., Tn xn ) -// : basic_iostream(&this->boost::base_from_member< -// basic_socket_streambuf >::member) -// { -// try -// { -// rdbuf()->connect ( x1, ..., xn ); -// } -// catch (asio::error&) -// { -// this->setstate(std::ios_base::failbit); -// if (this->exceptions() & std::ios_base::failbit) -// throw; -// } -// } -// This macro should only persist within this file. - -#define ASIO_PRIVATE_CTR_DEF( z, n, data ) \ - template < BOOST_PP_ENUM_PARAMS(n, typename T) > \ - explicit basic_socket_iostream( BOOST_PP_ENUM_BINARY_PARAMS(n, T, x) ) \ - : std::basic_iostream(&this->boost::base_from_member< \ - basic_socket_streambuf >::member) \ - { \ - try \ - { \ - rdbuf()->connect( BOOST_PP_ENUM_PARAMS(n, x) ); \ - } \ - catch (asio::error&) \ - { \ - this->setstate(std::ios_base::failbit); \ - if (this->exceptions() & std::ios_base::failbit) \ - throw; \ - } \ - } \ - /**/ - -// A macro that should expand to: -// template < typename T1, ..., typename Tn > -// void connect( T1 x1, ..., Tn xn ) -// { -// try -// { -// rdbuf()->connect ( x1, ..., xn ); -// } -// catch (asio::error&) -// { -// this->setstate(std::ios_base::failbit); -// if (this->exceptions() & std::ios_base::failbit) -// throw; -// } -// } -// This macro should only persist within this file. - -#define ASIO_PRIVATE_CONNECT_DEF( z, n, data ) \ - template < BOOST_PP_ENUM_PARAMS(n, typename T) > \ - void connect( BOOST_PP_ENUM_BINARY_PARAMS(n, T, x) ) \ - { \ - try \ - { \ - rdbuf()->connect( BOOST_PP_ENUM_PARAMS(n, x) ); \ - } \ - catch (asio::error&) \ - { \ - this->setstate(std::ios_base::failbit); \ - if (this->exceptions() & std::ios_base::failbit) \ - throw; \ - } \ - } \ - /**/ - -namespace asio { - -/// Iostream interface for a socket. -template > -class basic_socket_iostream - : public boost::base_from_member >, - public std::basic_iostream -{ -public: - /// Construct a basic_socket_iostream without establishing a connection. - basic_socket_iostream() - : std::basic_iostream(&this->boost::base_from_member< - basic_socket_streambuf >::member) - { - } - -#if defined(GENERATING_DOCUMENTATION) - /// Establish a connection to an endpoint corresponding to a resolver query. - /** - * This constructor automatically establishes a connection based on the - * supplied resolver query parameters. The arguments are used to construct - * a resolver query object. - */ - template - explicit basic_socket_iostream(T1 t1, ..., TN tn); -#else - BOOST_PP_REPEAT_FROM_TO( - 1, BOOST_PP_INC(ASIO_SOCKET_IOSTREAM_MAX_ARITY), - ASIO_PRIVATE_CTR_DEF, _ ) -#endif - -#if defined(GENERATING_DOCUMENTATION) - /// Establish a connection to an endpoint corresponding to a resolver query. - /** - * This function automatically establishes a connection based on the supplied - * resolver query parameters. The arguments are used to construct a resolver - * query object. - */ - template - void connect(T1 t1, ..., TN tn); -#else - BOOST_PP_REPEAT_FROM_TO( - 1, BOOST_PP_INC(ASIO_SOCKET_IOSTREAM_MAX_ARITY), - ASIO_PRIVATE_CONNECT_DEF, _ ) -#endif - - /// Close the connection. - void close() - { - rdbuf()->close(); - } - - /// Return a pointer to the underlying streambuf. - basic_socket_streambuf* rdbuf() const - { - return const_cast*>( - &this->boost::base_from_member< - basic_socket_streambuf >::member); - } -}; - -} // namespace asio - -#undef ASIO_PRIVATE_CTR_DEF -#undef ASIO_PRIVATE_CONNECT_DEF - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_BASIC_SOCKET_IOSTREAM_HPP diff --git a/libtorrent/include/asio/basic_socket_streambuf.hpp b/libtorrent/include/asio/basic_socket_streambuf.hpp deleted file mode 100644 index c24e00140..000000000 --- a/libtorrent/include/asio/basic_socket_streambuf.hpp +++ /dev/null @@ -1,280 +0,0 @@ -// -// basic_socket_streambuf.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BASIC_SOCKET_STREAMBUF_HPP -#define ASIO_BASIC_SOCKET_STREAMBUF_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/basic_socket.hpp" -#include "asio/error_handler.hpp" -#include "asio/io_service.hpp" -#include "asio/stream_socket_service.hpp" - -#if !defined(ASIO_SOCKET_STREAMBUF_MAX_ARITY) -#define ASIO_SOCKET_STREAMBUF_MAX_ARITY 5 -#endif // !defined(ASIO_SOCKET_STREAMBUF_MAX_ARITY) - -// A macro that should expand to: -// template < typename T1, ..., typename Tn > -// explicit basic_socket_streambuf( T1 x1, ..., Tn xn ) -// : basic_socket( -// boost::base_from_member::member) -// { -// init_buffers(); -// typedef typename Protocol::resolver_query resolver_query; -// resolver_query query( x1, ..., xn ); -// resolve_and_connect(query); -// } -// This macro should only persist within this file. - -#define ASIO_PRIVATE_CTR_DEF( z, n, data ) \ - template < BOOST_PP_ENUM_PARAMS(n, typename T) > \ - explicit basic_socket_streambuf( BOOST_PP_ENUM_BINARY_PARAMS(n, T, x) ) \ - : basic_socket( \ - boost::base_from_member::member) \ - { \ - init_buffers(); \ - typedef typename Protocol::resolver_query resolver_query; \ - resolver_query query( BOOST_PP_ENUM_PARAMS(n, x) ); \ - resolve_and_connect(query); \ - } \ - /**/ - -// A macro that should expand to: -// template < typename T1, ..., typename Tn > -// void connect( T1 x1, ..., Tn xn ) -// { -// this->basic_socket::close(); -// init_buffers(); -// typedef typename Protocol::resolver_query resolver_query; -// resolver_query query( x1, ..., xn ); -// resolve_and_connect(query); -// } -// This macro should only persist within this file. - -#define ASIO_PRIVATE_CONNECT_DEF( z, n, data ) \ - template < BOOST_PP_ENUM_PARAMS(n, typename T) > \ - void connect( BOOST_PP_ENUM_BINARY_PARAMS(n, T, x) ) \ - { \ - this->basic_socket::close(); \ - init_buffers(); \ - typedef typename Protocol::resolver_query resolver_query; \ - resolver_query query( BOOST_PP_ENUM_PARAMS(n, x) ); \ - resolve_and_connect(query); \ - } \ - /**/ - -namespace asio { - -/// Iostream streambuf for a socket. -template > -class basic_socket_streambuf - : public std::streambuf, - private boost::base_from_member, - public basic_socket -{ -public: - /// The endpoint type. - typedef typename Protocol::endpoint endpoint_type; - - /// Construct a basic_socket_streambuf without establishing a connection. - basic_socket_streambuf() - : basic_socket( - boost::base_from_member::member) - { - init_buffers(); - } - - /// Establish a connection to the specified endpoint. - explicit basic_socket_streambuf(const endpoint_type& endpoint) - : basic_socket( - boost::base_from_member::member) - { - init_buffers(); - this->basic_socket::connect(endpoint); - } - -#if defined(GENERATING_DOCUMENTATION) - /// Establish a connection to an endpoint corresponding to a resolver query. - /** - * This constructor automatically establishes a connection based on the - * supplied resolver query parameters. The arguments are used to construct - * a resolver query object. - */ - template - explicit basic_socket_streambuf(T1 t1, ..., TN tn); -#else - BOOST_PP_REPEAT_FROM_TO( - 1, BOOST_PP_INC(ASIO_SOCKET_STREAMBUF_MAX_ARITY), - ASIO_PRIVATE_CTR_DEF, _ ) -#endif - - /// Destructor flushes buffered data. - ~basic_socket_streambuf() - { - sync(); - } - - /// Establish a connection to the specified endpoint. - void connect(const endpoint_type& endpoint) - { - this->basic_socket::close(); - init_buffers(); - this->basic_socket::connect(endpoint); - } - -#if defined(GENERATING_DOCUMENTATION) - /// Establish a connection to an endpoint corresponding to a resolver query. - /** - * This function automatically establishes a connection based on the supplied - * resolver query parameters. The arguments are used to construct a resolver - * query object. - */ - template - void connect(T1 t1, ..., TN tn); -#else - BOOST_PP_REPEAT_FROM_TO( - 1, BOOST_PP_INC(ASIO_SOCKET_STREAMBUF_MAX_ARITY), - ASIO_PRIVATE_CONNECT_DEF, _ ) -#endif - - /// Close the connection. - void close() - { - sync(); - this->basic_socket::close(); - init_buffers(); - } - -protected: - int_type underflow() - { - if (gptr() == egptr()) - { - asio::error error; - std::size_t bytes_transferred = this->service.receive( - this->implementation, - asio::buffer(asio::buffer(get_buffer_) + putback_max), - 0, asio::assign_error(error)); - if (error) - { - if (error != asio::error::eof) - throw error; - return traits_type::eof(); - } - setg(get_buffer_.begin(), get_buffer_.begin() + putback_max, - get_buffer_.begin() + putback_max + bytes_transferred); - return traits_type::to_int_type(*gptr()); - } - else - { - return traits_type::eof(); - } - } - - int_type overflow(int_type c) - { - if (!traits_type::eq_int_type(c, traits_type::eof())) - { - if (pptr() == epptr()) - { - asio::const_buffer buffer = - asio::buffer(pbase(), pptr() - pbase()); - while (asio::buffer_size(buffer) > 0) - { - std::size_t bytes_transferred = this->service.send( - this->implementation, asio::buffer(buffer), - 0, asio::throw_error()); - buffer = buffer + bytes_transferred; - } - setp(put_buffer_.begin(), put_buffer_.end()); - } - - *pptr() = traits_type::to_char_type(c); - pbump(1); - return c; - } - - return traits_type::not_eof(c); - } - - int sync() - { - asio::const_buffer buffer = - asio::buffer(pbase(), pptr() - pbase()); - while (asio::buffer_size(buffer) > 0) - { - std::size_t bytes_transferred = this->service.send( - this->implementation, asio::buffer(buffer), - 0, asio::throw_error()); - buffer = buffer + bytes_transferred; - } - setp(put_buffer_.begin(), put_buffer_.end()); - return 0; - } - -private: - void init_buffers() - { - setg(get_buffer_.begin(), - get_buffer_.begin() + putback_max, - get_buffer_.begin() + putback_max); - setp(put_buffer_.begin(), put_buffer_.end()); - } - - void resolve_and_connect(const typename Protocol::resolver_query& query) - { - typedef typename Protocol::resolver resolver_type; - typedef typename Protocol::resolver_iterator iterator_type; - resolver_type resolver( - boost::base_from_member::member); - iterator_type iterator = resolver.resolve(query); - asio::error error(asio::error::host_not_found); - while (error && iterator != iterator_type()) - { - this->basic_socket::close(); - this->basic_socket::connect( - *iterator, asio::assign_error(error)); - ++iterator; - } - if (error) - throw error; - } - - enum { putback_max = 8 }; - enum { buffer_size = 512 }; - boost::array get_buffer_; - boost::array put_buffer_; -}; - -} // namespace asio - -#undef ASIO_PRIVATE_CTR_DEF -#undef ASIO_PRIVATE_CONNECT_DEF - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_BASIC_SOCKET_STREAMBUF_HPP diff --git a/libtorrent/include/asio/basic_stream_socket.hpp b/libtorrent/include/asio/basic_stream_socket.hpp deleted file mode 100644 index c2cf3c3c7..000000000 --- a/libtorrent/include/asio/basic_stream_socket.hpp +++ /dev/null @@ -1,816 +0,0 @@ -// -// basic_stream_socket.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BASIC_STREAM_SOCKET_HPP -#define ASIO_BASIC_STREAM_SOCKET_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/basic_socket.hpp" -#include "asio/error_handler.hpp" -#include "asio/stream_socket_service.hpp" - -namespace asio { - -/// Provides stream-oriented socket functionality. -/** - * The basic_stream_socket class template provides asynchronous and blocking - * stream-oriented socket functionality. - * - * @par Thread Safety: - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Concepts: - * Async_Read_Stream, Async_Write_Stream, Error_Source, IO_Object, Stream, - * Sync_Read_Stream, Sync_Write_Stream. - */ -template > -class basic_stream_socket - : public basic_socket -{ -public: - /// The native representation of a socket. - typedef typename Service::native_type native_type; - - /// The protocol type. - typedef Protocol protocol_type; - - /// The endpoint type. - typedef typename Protocol::endpoint endpoint_type; - - /// Construct a basic_stream_socket without opening it. - /** - * This constructor creates a stream socket without opening it. The socket - * needs to be opened and then connected or accepted before data can be sent - * or received on it. - * - * @param io_service The io_service object that the stream socket will use to - * dispatch handlers for any asynchronous operations performed on the socket. - */ - explicit basic_stream_socket(asio::io_service& io_service) - : basic_socket(io_service) - { - } - - /// Construct and open a basic_stream_socket. - /** - * This constructor creates and opens a stream socket. The socket needs to be - * connected or accepted before data can be sent or received on it. - * - * @param io_service The io_service object that the stream socket will use to - * dispatch handlers for any asynchronous operations performed on the socket. - * - * @param protocol An object specifying protocol parameters to be used. - * - * @throws asio::error Thrown on failure. - */ - basic_stream_socket(asio::io_service& io_service, - const protocol_type& protocol) - : basic_socket(io_service, protocol) - { - } - - /// Construct a basic_stream_socket, opening it and binding it to the given - /// local endpoint. - /** - * This constructor creates a stream socket and automatically opens it bound - * to the specified endpoint on the local machine. The protocol used is the - * protocol associated with the given endpoint. - * - * @param io_service The io_service object that the stream socket will use to - * dispatch handlers for any asynchronous operations performed on the socket. - * - * @param endpoint An endpoint on the local machine to which the stream - * socket will be bound. - * - * @throws asio::error Thrown on failure. - */ - basic_stream_socket(asio::io_service& io_service, - const endpoint_type& endpoint) - : basic_socket(io_service, endpoint) - { - } - - /// Construct a basic_stream_socket on an existing native socket. - /** - * This constructor creates a stream socket object to hold an existing native - * socket. - * - * @param io_service The io_service object that the stream socket will use to - * dispatch handlers for any asynchronous operations performed on the socket. - * - * @param protocol An object specifying protocol parameters to be used. - * - * @param native_socket The new underlying socket implementation. - * - * @throws asio::error Thrown on failure. - */ - basic_stream_socket(asio::io_service& io_service, - const protocol_type& protocol, const native_type& native_socket) - : basic_socket(io_service, protocol, native_socket) - { - } - - /// Send some data on the socket. - /** - * This function is used to send data on the stream socket. The function - * call will block until one or more bytes of the data has been sent - * successfully, or an until error occurs. - * - * @param buffers One or more data buffers to be sent on the socket. - * - * @returns The number of bytes sent. - * - * @throws asio::error Thrown on failure. - * - * @note The send operation may not transmit all of the data to the peer. - * Consider using the @ref write function if you need to ensure that all data - * is written before the blocking operation completes. - * - * @par Example: - * To send a single data buffer use the @ref buffer function as follows: - * @code - * socket.send(asio::buffer(data, size)); - * @endcode - * See the @ref buffer documentation for information on sending multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t send(const Const_Buffers& buffers) - { - return this->service.send(this->implementation, buffers, 0, throw_error()); - } - - /// Send some data on the socket. - /** - * This function is used to send data on the stream socket. The function - * call will block until one or more bytes of the data has been sent - * successfully, or an until error occurs. - * - * @param buffers One or more data buffers to be sent on the socket. - * - * @param flags Flags specifying how the send call is to be made. - * - * @returns The number of bytes sent. - * - * @throws asio::error Thrown on failure. - * - * @note The send operation may not transmit all of the data to the peer. - * Consider using the @ref write function if you need to ensure that all data - * is written before the blocking operation completes. - * - * @par Example: - * To send a single data buffer use the @ref buffer function as follows: - * @code - * socket.send(asio::buffer(data, size), 0); - * @endcode - * See the @ref buffer documentation for information on sending multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t send(const Const_Buffers& buffers, - socket_base::message_flags flags) - { - return this->service.send(this->implementation, buffers, flags, - throw_error()); - } - - /// Send some data on the socket. - /** - * This function is used to send data on the stream socket. The function - * call will block until one or more bytes of the data has been sent - * successfully, or an until error occurs. - * - * @param buffers One or more data buffers to be sent on the socket. - * - * @param flags Flags specifying how the send call is to be made. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation. - * ); @endcode - * - * @returns The number of bytes sent. Returns 0 if an error occurred and the - * error handler did not throw an exception. - * - * @note The send operation may not transmit all of the data to the peer. - * Consider using the @ref write function if you need to ensure that all data - * is written before the blocking operation completes. - */ - template - std::size_t send(const Const_Buffers& buffers, - socket_base::message_flags flags, - Error_Handler error_handler) - { - return this->service.send(this->implementation, buffers, flags, - error_handler); - } - - /// Start an asynchronous send. - /** - * This function is used to asynchronously send data on the stream socket. - * The function call always returns immediately. - * - * @param buffers One or more data buffers to be sent on the socket. Although - * the buffers object may be copied as necessary, ownership of the underlying - * memory blocks is retained by the caller, which must guarantee that they - * remain valid until the handler is called. - * - * @param handler The handler to be called when the send operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes sent. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - * - * @note The send operation may not transmit all of the data to the peer. - * Consider using the @ref async_write function if you need to ensure that all - * data is written before the asynchronous operation completes. - * - * @par Example: - * To send a single data buffer use the @ref buffer function as follows: - * @code - * socket.async_send(asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on sending multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - void async_send(const Const_Buffers& buffers, Handler handler) - { - this->service.async_send(this->implementation, buffers, 0, handler); - } - - /// Start an asynchronous send. - /** - * This function is used to asynchronously send data on the stream socket. - * The function call always returns immediately. - * - * @param buffers One or more data buffers to be sent on the socket. Although - * the buffers object may be copied as necessary, ownership of the underlying - * memory blocks is retained by the caller, which must guarantee that they - * remain valid until the handler is called. - * - * @param flags Flags specifying how the send call is to be made. - * - * @param handler The handler to be called when the send operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes sent. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - * - * @note The send operation may not transmit all of the data to the peer. - * Consider using the @ref async_write function if you need to ensure that all - * data is written before the asynchronous operation completes. - * - * @par Example: - * To send a single data buffer use the @ref buffer function as follows: - * @code - * socket.async_send(asio::buffer(data, size), 0, handler); - * @endcode - * See the @ref buffer documentation for information on sending multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - void async_send(const Const_Buffers& buffers, - socket_base::message_flags flags, Handler handler) - { - this->service.async_send(this->implementation, buffers, flags, handler); - } - - /// Receive some data on the socket. - /** - * This function is used to receive data on the stream socket. The function - * call will block until one or more bytes of data has been received - * successfully, or until an error occurs. - * - * @param buffers One or more buffers into which the data will be received. - * - * @returns The number of bytes received. - * - * @throws asio::error Thrown on failure. An error code of - * asio::error::eof indicates that the connection was closed by the - * peer. - * - * @note The receive operation may not receive all of the requested number of - * bytes. Consider using the @ref read function if you need to ensure that the - * requested amount of data is read before the blocking operation completes. - * - * @par Example: - * To receive into a single data buffer use the @ref buffer function as - * follows: - * @code - * socket.receive(asio::buffer(data, size)); - * @endcode - * See the @ref buffer documentation for information on receiving into - * multiple buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t receive(const Mutable_Buffers& buffers) - { - return this->service.receive(this->implementation, buffers, 0, - throw_error()); - } - - /// Receive some data on the socket. - /** - * This function is used to receive data on the stream socket. The function - * call will block until one or more bytes of data has been received - * successfully, or until an error occurs. - * - * @param buffers One or more buffers into which the data will be received. - * - * @param flags Flags specifying how the receive call is to be made. - * - * @returns The number of bytes received. - * - * @throws asio::error Thrown on failure. An error code of - * asio::error::eof indicates that the connection was closed by the - * peer. - * - * @note The receive operation may not receive all of the requested number of - * bytes. Consider using the @ref read function if you need to ensure that the - * requested amount of data is read before the blocking operation completes. - * - * @par Example: - * To receive into a single data buffer use the @ref buffer function as - * follows: - * @code - * socket.receive(asio::buffer(data, size), 0); - * @endcode - * See the @ref buffer documentation for information on receiving into - * multiple buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t receive(const Mutable_Buffers& buffers, - socket_base::message_flags flags) - { - return this->service.receive(this->implementation, buffers, flags, - throw_error()); - } - - /// Receive some data on a connected socket. - /** - * This function is used to receive data on the stream socket. The function - * call will block until one or more bytes of data has been received - * successfully, or until an error occurs. - * - * @param buffers One or more buffers into which the data will be received. - * - * @param flags Flags specifying how the receive call is to be made. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - * - * @returns The number of bytes received. Returns 0 if an error occurred and - * the error handler did not throw an exception. - * - * @note The receive operation may not receive all of the requested number of - * bytes. Consider using the @ref read function if you need to ensure that the - * requested amount of data is read before the blocking operation completes. - */ - template - std::size_t receive(const Mutable_Buffers& buffers, - socket_base::message_flags flags, Error_Handler error_handler) - { - return this->service.receive(this->implementation, buffers, flags, - error_handler); - } - - /// Start an asynchronous receive. - /** - * This function is used to asynchronously receive data from the stream - * socket. The function call always returns immediately. - * - * @param buffers One or more buffers into which the data will be received. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the receive operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes received. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - * - * @note The receive operation may not receive all of the requested number of - * bytes. Consider using the @ref async_read function if you need to ensure - * that the requested amount of data is received before the asynchronous - * operation completes. - * - * @par Example: - * To receive into a single data buffer use the @ref buffer function as - * follows: - * @code - * socket.async_receive(asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on receiving into - * multiple buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - void async_receive(const Mutable_Buffers& buffers, Handler handler) - { - this->service.async_receive(this->implementation, buffers, 0, handler); - } - - /// Start an asynchronous receive. - /** - * This function is used to asynchronously receive data from the stream - * socket. The function call always returns immediately. - * - * @param buffers One or more buffers into which the data will be received. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param flags Flags specifying how the receive call is to be made. - * - * @param handler The handler to be called when the receive operation - * completes. Copies will be made of the handler as required. The function - * signature of the handler must be: - * @code void handler( - * const asio::error& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes received. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - * - * @note The receive operation may not receive all of the requested number of - * bytes. Consider using the @ref async_read function if you need to ensure - * that the requested amount of data is received before the asynchronous - * operation completes. - * - * @par Example: - * To receive into a single data buffer use the @ref buffer function as - * follows: - * @code - * socket.async_receive(asio::buffer(data, size), 0, handler); - * @endcode - * See the @ref buffer documentation for information on receiving into - * multiple buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - void async_receive(const Mutable_Buffers& buffers, - socket_base::message_flags flags, Handler handler) - { - this->service.async_receive(this->implementation, buffers, flags, handler); - } - - /// Write some data to the socket. - /** - * This function is used to write data to the stream socket. The function call - * will block until one or more bytes of the data has been written - * successfully, or until an error occurs. - * - * @param buffers One or more data buffers to be written to the socket. - * - * @returns The number of bytes written. - * - * @throws asio::error Thrown on failure. An error code of - * asio::error::eof indicates that the connection was closed by the - * peer. - * - * @note The write_some operation may not transmit all of the data to the - * peer. Consider using the @ref write function if you need to ensure that - * all data is written before the blocking operation completes. - * - * @par Example: - * To write a single data buffer use the @ref buffer function as follows: - * @code - * socket.write_some(asio::buffer(data, size)); - * @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t write_some(const Const_Buffers& buffers) - { - return this->service.send(this->implementation, buffers, 0, throw_error()); - } - - /// Write some data to the socket. - /** - * This function is used to write data to the stream socket. The function call - * will block until one or more bytes of the data has been written - * successfully, or until an error occurs. - * - * @param buffers One or more data buffers to be written to the socket. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation. - * ); @endcode - * - * @returns The number of bytes written. Returns 0 if an error occurred and - * the error handler did not throw an exception. - * - * @note The write_some operation may not transmit all of the data to the - * peer. Consider using the @ref write function if you need to ensure that - * all data is written before the blocking operation completes. - */ - template - std::size_t write_some(const Const_Buffers& buffers, - Error_Handler error_handler) - { - return this->service.send(this->implementation, buffers, 0, error_handler); - } - - /// Start an asynchronous write. - /** - * This function is used to asynchronously write data to the stream socket. - * The function call always returns immediately. - * - * @param buffers One or more data buffers to be written to the socket. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the write operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes written. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - * - * @note The write operation may not transmit all of the data to the peer. - * Consider using the @ref async_write function if you need to ensure that all - * data is written before the asynchronous operation completes. - * - * @par Example: - * To write a single data buffer use the @ref buffer function as follows: - * @code - * socket.async_write_some(asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - void async_write_some(const Const_Buffers& buffers, Handler handler) - { - this->service.async_send(this->implementation, buffers, 0, handler); - } - - /// Read some data from the socket. - /** - * This function is used to read data from the stream socket. The function - * call will block until one or more bytes of data has been read successfully, - * or until an error occurs. - * - * @param buffers One or more buffers into which the data will be read. - * - * @returns The number of bytes read. - * - * @throws asio::error Thrown on failure. An error code of - * asio::error::eof indicates that the connection was closed by the - * peer. - * - * @note The read_some operation may not read all of the requested number of - * bytes. Consider using the @ref read function if you need to ensure that - * the requested amount of data is read before the blocking operation - * completes. - * - * @par Example: - * To read into a single data buffer use the @ref buffer function as follows: - * @code - * socket.read_some(asio::buffer(data, size)); - * @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t read_some(const Mutable_Buffers& buffers) - { - return this->service.receive(this->implementation, buffers, 0, - throw_error()); - } - - /// Read some data from the socket. - /** - * This function is used to read data from the stream socket. The function - * call will block until one or more bytes of data has been read successfully, - * or until an error occurs. - * - * @param buffers One or more buffers into which the data will be read. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation. - * ); @endcode - * - * @returns The number of bytes read. Returns 0 if an error occurred and the - * error handler did not throw an exception. - * - * @note The read_some operation may not read all of the requested number of - * bytes. Consider using the @ref read function if you need to ensure that - * the requested amount of data is read before the blocking operation - * completes. - */ - template - std::size_t read_some(const Mutable_Buffers& buffers, - Error_Handler error_handler) - { - return this->service.receive(this->implementation, buffers, 0, - error_handler); - } - - /// Start an asynchronous read. - /** - * This function is used to asynchronously read data from the stream socket. - * The function call always returns immediately. - * - * @param buffers One or more buffers into which the data will be read. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const asio::error& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes read. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation - * of the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - * - * @note The read operation may not read all of the requested number of bytes. - * Consider using the @ref async_read function if you need to ensure that the - * requested amount of data is read before the asynchronous operation - * completes. - * - * @par Example: - * To read into a single data buffer use the @ref buffer function as follows: - * @code - * socket.async_read_some(asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - void async_read_some(const Mutable_Buffers& buffers, Handler handler) - { - this->service.async_receive(this->implementation, buffers, 0, handler); - } - - /// Peek at the incoming data on the stream socket. - /** - * This function is used to peek at the incoming data on the stream socket, - * without removing it from the input queue. The function call will block - * until data has been read successfully or an error occurs. - * - * @param buffers One or more buffers into which the data will be read. - * - * @returns The number of bytes read. - * - * @throws asio::error Thrown on failure. - * - * @par Example: - * To peek using a single data buffer use the @ref buffer function as - * follows: - * @code socket.peek(asio::buffer(data, size)); @endcode - * See the @ref buffer documentation for information on using multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ - template - std::size_t peek(const Mutable_Buffers& buffers) - { - return this->service.receive(this->implementation, buffers, - socket_base::message_peek, throw_error()); - } - - /// Peek at the incoming data on the stream socket. - /** - * This function is used to peek at the incoming data on the stream socket, - * without removing it from the input queue. The function call will block - * until data has been read successfully or an error occurs. - * - * @param buffers One or more buffers into which the data will be read. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation. - * ); @endcode - * - * @returns The number of bytes read. Returns 0 if an error occurred and the - * error handler did not throw an exception. - */ - template - std::size_t peek(const Mutable_Buffers& buffers, Error_Handler error_handler) - { - return this->service.receive(this->implementation, buffers, - socket_base::message_peek, error_handler); - } - - /// Determine the amount of data that may be read without blocking. - /** - * This function is used to determine the amount of data, in bytes, that may - * be read from the stream socket without blocking. - * - * @returns The number of bytes of data that can be read without blocking. - * - * @throws asio::error Thrown on failure. - */ - std::size_t in_avail() - { - socket_base::bytes_readable command; - this->service.io_control(this->implementation, command, throw_error()); - return command.get(); - } - - /// Determine the amount of data that may be read without blocking. - /** - * This function is used to determine the amount of data, in bytes, that may - * be read from the stream socket without blocking. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - * - * @returns The number of bytes of data that can be read without blocking. - */ - template - std::size_t in_avail(Error_Handler error_handler) - { - socket_base::bytes_readable command; - this->service.io_control(this->implementation, command, error_handler); - return command.get(); - } -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_BASIC_STREAM_SOCKET_HPP diff --git a/libtorrent/include/asio/basic_streambuf.hpp b/libtorrent/include/asio/basic_streambuf.hpp deleted file mode 100644 index 49ce11a89..000000000 --- a/libtorrent/include/asio/basic_streambuf.hpp +++ /dev/null @@ -1,200 +0,0 @@ -// -// basic_streambuf.hpp -// ~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BASIC_STREAMBUF_HPP -#define ASIO_BASIC_STREAMBUF_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/buffer.hpp" -#include "asio/detail/noncopyable.hpp" - -namespace asio { - -/// Automatically resizable buffer class based on std::streambuf. -template > -class basic_streambuf - : public std::streambuf, - private noncopyable -{ -public: -#if defined(GENERATING_DOCUMENTATION) - /// The type used to represent the get area as a list of buffers. - typedef implementation_defined const_buffers_type; - - /// The type used to represent the put area as a list of buffers. - typedef implementation_defined mutable_buffers_type; -#else - typedef asio::const_buffer_container_1 const_buffers_type; - typedef asio::mutable_buffer_container_1 mutable_buffers_type; -#endif - - /// Construct a buffer with a specified maximum size. - explicit basic_streambuf( - std::size_t max_size = (std::numeric_limits::max)(), - const Allocator& allocator = Allocator()) - : max_size_(max_size), - buffer_(allocator) - { - std::size_t pend = (std::min)(max_size_, buffer_delta); - buffer_.resize((std::max)(pend, 1)); - setg(&buffer_[0], &buffer_[0], &buffer_[0]); - setp(&buffer_[0], &buffer_[0] + pend); - } - - /// Return the size of the get area in characters. - std::size_t size() const - { - return pptr() - gptr(); - } - - /// Return the maximum size of the buffer. - std::size_t max_size() const - { - return max_size_; - } - - /// Get a list of buffers that represents the get area. - const_buffers_type data() const - { - return asio::buffer(asio::const_buffer(gptr(), - (pptr() - gptr()) * sizeof(char_type))); - } - - /// Get a list of buffers that represents the put area, with the given size. - mutable_buffers_type prepare(std::size_t size) - { - reserve(size); - return asio::buffer(asio::mutable_buffer( - pptr(), size * sizeof(char_type))); - } - - /// Move the start of the put area by the specified number of characters. - void commit(std::size_t n) - { - if (pptr() + n > epptr()) - n = epptr() - pptr(); - pbump(static_cast(n)); - } - - /// Move the start of the get area by the specified number of characters. - void consume(std::size_t n) - { - while (n > 0) - { - sbumpc(); - --n; - } - } - -protected: - enum { buffer_delta = 128 }; - - int_type underflow() - { - if (gptr() < pptr()) - { - setg(&buffer_[0], gptr(), pptr()); - return traits_type::to_int_type(*gptr()); - } - else - { - return traits_type::eof(); - } - } - - int_type overflow(int_type c) - { - if (!traits_type::eq_int_type(c, traits_type::eof())) - { - if (pptr() == epptr()) - { - std::size_t buffer_size = pptr() - gptr(); - if (buffer_size < max_size_ && max_size_ - buffer_size < buffer_delta) - { - reserve(max_size_ - buffer_size); - } - else - { - reserve(buffer_delta); - } - } - - *pptr() = traits_type::to_char_type(c); - pbump(1); - return c; - } - - return traits_type::not_eof(c); - } - - void reserve(std::size_t n) - { - // Get current stream positions as offsets. - std::size_t gnext = gptr() - &buffer_[0]; - std::size_t gend = egptr() - &buffer_[0]; - std::size_t pnext = pptr() - &buffer_[0]; - std::size_t pend = epptr() - &buffer_[0]; - - // Check if there is already enough space in the put area. - if (n <= pend - pnext) - { - return; - } - - // Shift existing contents of get area to start of buffer. - if (gnext > 0) - { - std::rotate(&buffer_[0], &buffer_[0] + gnext, &buffer_[0] + pend); - gend -= gnext; - pnext -= gnext; - } - - // Ensure buffer is large enough to hold at least the specified size. - if (n > pend - pnext) - { - if (n <= max_size_ && pnext <= max_size_ - n) - { - buffer_.resize((std::max)(pnext + n, 1)); - } - else - { - throw std::length_error("asio::streambuf too long"); - } - } - - // Update stream positions. - setg(&buffer_[0], &buffer_[0], &buffer_[0] + gend); - setp(&buffer_[0] + pnext, &buffer_[0] + pnext + n); - } - -private: - std::size_t max_size_; - std::vector buffer_; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_BASIC_STREAMBUF_HPP diff --git a/libtorrent/include/asio/buffer.hpp b/libtorrent/include/asio/buffer.hpp deleted file mode 100644 index bd6442432..000000000 --- a/libtorrent/include/asio/buffer.hpp +++ /dev/null @@ -1,639 +0,0 @@ -// -// buffer.hpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BUFFER_HPP -#define ASIO_BUFFER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -namespace asio { - -class mutable_buffer; -class const_buffer; - -namespace detail { -void* buffer_cast_helper(const mutable_buffer&); -const void* buffer_cast_helper(const const_buffer&); -std::size_t buffer_size_helper(const mutable_buffer&); -std::size_t buffer_size_helper(const const_buffer&); -} // namespace detail - -/// Holds a buffer that can be modified. -/** - * The mutable_buffer class provides a safe representation of a buffer that can - * be modified. It does not own the underlying data, and so is cheap to copy or - * assign. - */ -class mutable_buffer -{ -public: - /// Construct an empty buffer. - mutable_buffer() - : data_(0), - size_(0) - { - } - - /// Construct a buffer to represent a given memory range. - mutable_buffer(void* data, std::size_t size) - : data_(data), - size_(size) - { - } - -private: - friend void* asio::detail::buffer_cast_helper( - const mutable_buffer& b); - friend std::size_t asio::detail::buffer_size_helper( - const mutable_buffer& b); - - void* data_; - std::size_t size_; -}; - -namespace detail { - -inline void* buffer_cast_helper(const mutable_buffer& b) -{ - return b.data_; -} - -inline std::size_t buffer_size_helper(const mutable_buffer& b) -{ - return b.size_; -} - -} // namespace detail - -/// Cast a non-modifiable buffer to a specified pointer to POD type. -/** - * @relates mutable_buffer - */ -template -inline Pointer_To_Pod_Type buffer_cast(const mutable_buffer& b) -{ - return static_cast(detail::buffer_cast_helper(b)); -} - -/// Get the number of bytes in a non-modifiable buffer. -/** - * @relates mutable_buffer - */ -inline std::size_t buffer_size(const mutable_buffer& b) -{ - return detail::buffer_size_helper(b); -} - -/// Create a new modifiable buffer that is offset from the start of another. -/** - * @relates mutable_buffer - */ -inline mutable_buffer operator+(const mutable_buffer& b, std::size_t start) -{ - if (start > buffer_size(b)) - return mutable_buffer(); - char* new_data = buffer_cast(b) + start; - std::size_t new_size = buffer_size(b) - start; - return mutable_buffer(new_data, new_size); -} - -/// Create a new modifiable buffer that is offset from the start of another. -/** - * @relates mutable_buffer - */ -inline mutable_buffer operator+(std::size_t start, const mutable_buffer& b) -{ - if (start > buffer_size(b)) - return mutable_buffer(); - char* new_data = buffer_cast(b) + start; - std::size_t new_size = buffer_size(b) - start; - return mutable_buffer(new_data, new_size); -} - -/// Adapts a single modifiable buffer so that it meets the requirements of the -/// Mutable_Buffers concept. -class mutable_buffer_container_1 - : public mutable_buffer -{ -public: - /// The type for each element in the list of buffers. - typedef mutable_buffer value_type; - - /// A random-access iterator type that may be used to read elements. - typedef const mutable_buffer* const_iterator; - - /// Construct to represent a single modifiable buffer. - explicit mutable_buffer_container_1(const mutable_buffer& b) - : mutable_buffer(b) - { - } - - /// Get a random-access iterator to the first element. - const_iterator begin() const - { - return this; - } - - /// Get a random-access iterator for one past the last element. - const_iterator end() const - { - return begin() + 1; - } -}; - -/// Holds a buffer that cannot be modified. -/** - * The const_buffer class provides a safe representation of a buffer that cannot - * be modified. It does not own the underlying data, and so is cheap to copy or - * assign. - */ -class const_buffer -{ -public: - /// Construct an empty buffer. - const_buffer() - : data_(0), - size_(0) - { - } - - /// Construct a buffer to represent a given memory range. - const_buffer(const void* data, std::size_t size) - : data_(data), - size_(size) - { - } - - /// Construct a non-modifiable buffer from a modifiable one. - const_buffer(const mutable_buffer& b) - : data_(asio::detail::buffer_cast_helper(b)), - size_(asio::detail::buffer_size_helper(b)) - { - } - -private: - friend const void* asio::detail::buffer_cast_helper( - const const_buffer& b); - friend std::size_t asio::detail::buffer_size_helper( - const const_buffer& b); - - const void* data_; - std::size_t size_; -}; - -namespace detail { - -inline const void* buffer_cast_helper(const const_buffer& b) -{ - return b.data_; -} - -inline std::size_t buffer_size_helper(const const_buffer& b) -{ - return b.size_; -} - -} // namespace detail - -/// Cast a non-modifiable buffer to a specified pointer to POD type. -/** - * @relates const_buffer - */ -template -inline Pointer_To_Pod_Type buffer_cast(const const_buffer& b) -{ - return static_cast(detail::buffer_cast_helper(b)); -} - -/// Get the number of bytes in a non-modifiable buffer. -/** - * @relates const_buffer - */ -inline std::size_t buffer_size(const const_buffer& b) -{ - return detail::buffer_size_helper(b); -} - -/// Create a new non-modifiable buffer that is offset from the start of another. -/** - * @relates const_buffer - */ -inline const_buffer operator+(const const_buffer& b, std::size_t start) -{ - if (start > buffer_size(b)) - return const_buffer(); - const char* new_data = buffer_cast(b) + start; - std::size_t new_size = buffer_size(b) - start; - return const_buffer(new_data, new_size); -} - -/// Create a new non-modifiable buffer that is offset from the start of another. -/** - * @relates const_buffer - */ -inline const_buffer operator+(std::size_t start, const const_buffer& b) -{ - if (start > buffer_size(b)) - return const_buffer(); - const char* new_data = buffer_cast(b) + start; - std::size_t new_size = buffer_size(b) - start; - return const_buffer(new_data, new_size); -} - -/// Adapts a single non-modifiable buffer so that it meets the requirements of -/// the Const_Buffers concept. -class const_buffer_container_1 - : public const_buffer -{ -public: - /// The type for each element in the list of buffers. - typedef const_buffer value_type; - - /// A random-access iterator type that may be used to read elements. - typedef const const_buffer* const_iterator; - - /// Construct to represent a single non-modifiable buffer. - explicit const_buffer_container_1(const const_buffer& b) - : const_buffer(b) - { - } - - /// Get a random-access iterator to the first element. - const_iterator begin() const - { - return this; - } - - /// Get a random-access iterator for one past the last element. - const_iterator end() const - { - return begin() + 1; - } -}; - -/** @defgroup buffer asio::buffer - * - * @brief The asio::buffer function is used to create a buffer object to - * represent raw memory, an array of POD elements, or a vector of POD elements. - * - * The simplest use case involves reading or writing a single buffer of a - * specified size: - * - * @code sock.write(asio::buffer(data, size)); @endcode - * - * In the above example, the return value of asio::buffer meets the - * requirements of the Const_Buffers concept so that it may be directly passed - * to the socket's write function. A buffer created for modifiable memory also - * meets the requirements of the Mutable_Buffers concept. - * - * An individual buffer may be created from a builtin array, std::vector or - * boost::array of POD elements. This helps prevent buffer overruns by - * automatically determining the size of the buffer: - * - * @code char d1[128]; - * size_t bytes_transferred = sock.read(asio::buffer(d1)); - * - * std::vector d2(128); - * bytes_transferred = sock.read(asio::buffer(d2)); - * - * boost::array d3; - * bytes_transferred = sock.read(asio::buffer(d3)); @endcode - * - * To read or write using multiple buffers (i.e. scatter-gather I/O), multiple - * buffer objects may be assigned into a container that supports the - * Mutable_Buffers (for read) or Const_Buffers (for write) concepts: - * - * @code - * char d1[128]; - * std::vector d2(128); - * boost::array d3; - * - * boost::array bufs1 = { - * asio::buffer(d1), - * asio::buffer(d2), - * asio::buffer(d3) }; - * bytes_transferred = sock.read(bufs1); - * - * std::vector bufs2; - * bufs2.push_back(asio::buffer(d1)); - * bufs2.push_back(asio::buffer(d2)); - * bufs2.push_back(asio::buffer(d3)); - * bytes_transferred = sock.write(bufs2); @endcode - */ -/*@{*/ - -/// Create a new modifiable buffer from an existing buffer. -inline mutable_buffer_container_1 buffer(const mutable_buffer& b) -{ - return mutable_buffer_container_1(b); -} - -/// Create a new modifiable buffer from an existing buffer. -inline mutable_buffer_container_1 buffer(const mutable_buffer& b, - std::size_t max_size_in_bytes) -{ - return mutable_buffer_container_1( - mutable_buffer(buffer_cast(b), - buffer_size(b) < max_size_in_bytes - ? buffer_size(b) : max_size_in_bytes)); -} - -/// Create a new non-modifiable buffer from an existing buffer. -inline const_buffer_container_1 buffer(const const_buffer& b) -{ - return const_buffer_container_1(b); -} - -/// Create a new non-modifiable buffer from an existing buffer. -inline const_buffer_container_1 buffer(const const_buffer& b, - std::size_t max_size_in_bytes) -{ - return const_buffer_container_1( - const_buffer(buffer_cast(b), - buffer_size(b) < max_size_in_bytes - ? buffer_size(b) : max_size_in_bytes)); -} - -/// Create a new modifiable buffer that represents the given memory range. -inline mutable_buffer_container_1 buffer(void* data, std::size_t size_in_bytes) -{ - return mutable_buffer_container_1(mutable_buffer(data, size_in_bytes)); -} - -/// Create a new non-modifiable buffer that represents the given memory range. -inline const_buffer_container_1 buffer(const void* data, - std::size_t size_in_bytes) -{ - return const_buffer_container_1(const_buffer(data, size_in_bytes)); -} - -/// Create a new modifiable buffer that represents the given POD array. -template -inline mutable_buffer_container_1 buffer(Pod_Type (&data)[N]) -{ - return mutable_buffer_container_1(mutable_buffer(data, N * sizeof(Pod_Type))); -} - -/// Create a new modifiable buffer that represents the given POD array. -template -inline mutable_buffer_container_1 buffer(Pod_Type (&data)[N], - std::size_t max_size_in_bytes) -{ - return mutable_buffer_container_1( - mutable_buffer(data, - N * sizeof(Pod_Type) < max_size_in_bytes - ? N * sizeof(Pod_Type) : max_size_in_bytes)); -} - -/// Create a new non-modifiable buffer that represents the given POD array. -template -inline const_buffer_container_1 buffer(const Pod_Type (&data)[N]) -{ - return const_buffer_container_1(const_buffer(data, N * sizeof(Pod_Type))); -} - -/// Create a new non-modifiable buffer that represents the given POD array. -template -inline const_buffer_container_1 buffer(const Pod_Type (&data)[N], - std::size_t max_size_in_bytes) -{ - return const_buffer_container_1( - const_buffer(data, - N * sizeof(Pod_Type) < max_size_in_bytes - ? N * sizeof(Pod_Type) : max_size_in_bytes)); -} - -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) - -// Borland C++ thinks the overloads: -// -// unspecified buffer(boost::array& array ...); -// -// and -// -// unspecified buffer(boost::array& array ...); -// -// are ambiguous. This will be worked around by using a buffer_types traits -// class that contains typedefs for the appropriate buffer and container -// classes, based on whether Pod_Type is const or non-const. - -namespace detail { - -template -struct buffer_types_base; - -template <> -struct buffer_types_base -{ - typedef mutable_buffer buffer_type; - typedef mutable_buffer_container_1 container_type; -}; - -template <> -struct buffer_types_base -{ - typedef const_buffer buffer_type; - typedef const_buffer_container_1 container_type; -}; - -template -struct buffer_types - : public buffer_types_base::value> -{ -}; - -} // namespace detail - -template -inline typename detail::buffer_types::container_type -buffer(boost::array& data) -{ - typedef typename asio::detail::buffer_types::buffer_type - buffer_type; - typedef typename asio::detail::buffer_types::container_type - container_type; - return container_type( - buffer_type(data.c_array(), data.size() * sizeof(Pod_Type))); -} - -template -inline typename detail::buffer_types::container_type -buffer(boost::array& data, std::size_t max_size_in_bytes) -{ - typedef typename asio::detail::buffer_types::buffer_type - buffer_type; - typedef typename asio::detail::buffer_types::container_type - container_type; - return container_type( - buffer_type(data.c_array(), - data.size() * sizeof(Pod_Type) < max_size_in_bytes - ? data.size() * sizeof(Pod_Type) : max_size_in_bytes)); -} - -#else // BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) - -/// Create a new modifiable buffer that represents the given POD array. -template -inline mutable_buffer_container_1 buffer(boost::array& data) -{ - return mutable_buffer_container_1( - mutable_buffer(data.c_array(), data.size() * sizeof(Pod_Type))); -} - -/// Create a new modifiable buffer that represents the given POD array. -template -inline mutable_buffer_container_1 buffer(boost::array& data, - std::size_t max_size_in_bytes) -{ - return mutable_buffer_container_1( - mutable_buffer(data.c_array(), - data.size() * sizeof(Pod_Type) < max_size_in_bytes - ? data.size() * sizeof(Pod_Type) : max_size_in_bytes)); -} - -/// Create a new non-modifiable buffer that represents the given POD array. -template -inline const_buffer_container_1 buffer(boost::array& data) -{ - return const_buffer_container_1( - const_buffer(data.data(), data.size() * sizeof(Pod_Type))); -} - -/// Create a new non-modifiable buffer that represents the given POD array. -template -inline const_buffer_container_1 buffer(boost::array& data, - std::size_t max_size_in_bytes) -{ - return const_buffer_container_1( - const_buffer(data.data(), - data.size() * sizeof(Pod_Type) < max_size_in_bytes - ? data.size() * sizeof(Pod_Type) : max_size_in_bytes)); -} - -#endif // BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) - -/// Create a new non-modifiable buffer that represents the given POD array. -template -inline const_buffer_container_1 buffer(const boost::array& data) -{ - return const_buffer_container_1( - const_buffer(data.data(), data.size() * sizeof(Pod_Type))); -} - -/// Create a new non-modifiable buffer that represents the given POD array. -template -inline const_buffer_container_1 buffer(const boost::array& data, - std::size_t max_size_in_bytes) -{ - return const_buffer_container_1( - const_buffer(data.data(), - data.size() * sizeof(Pod_Type) < max_size_in_bytes - ? data.size() * sizeof(Pod_Type) : max_size_in_bytes)); -} - -/// Create a new modifiable buffer that represents the given POD vector. -/** - * @note The buffer is invalidated by any vector operation that would also - * invalidate iterators. - */ -template -inline mutable_buffer_container_1 buffer(std::vector& data) -{ - return mutable_buffer_container_1( - mutable_buffer(&data[0], data.size() * sizeof(Pod_Type))); -} - -/// Create a new modifiable buffer that represents the given POD vector. -/** - * @note The buffer is invalidated by any vector operation that would also - * invalidate iterators. - */ -template -inline mutable_buffer_container_1 buffer(std::vector& data, - std::size_t max_size_in_bytes) -{ - return mutable_buffer_container_1( - mutable_buffer(&data[0], - data.size() * sizeof(Pod_Type) < max_size_in_bytes - ? data.size() * sizeof(Pod_Type) : max_size_in_bytes)); -} - -/// Create a new non-modifiable buffer that represents the given POD vector. -/** - * @note The buffer is invalidated by any vector operation that would also - * invalidate iterators. - */ -template -inline const_buffer_container_1 buffer( - const std::vector& data) -{ - return const_buffer_container_1( - const_buffer(&data[0], data.size() * sizeof(Pod_Type))); -} - -/// Create a new non-modifiable buffer that represents the given POD vector. -/** - * @note The buffer is invalidated by any vector operation that would also - * invalidate iterators. - */ -template -inline const_buffer_container_1 buffer( - const std::vector& data, std::size_t max_size_in_bytes) -{ - return const_buffer_container_1( - const_buffer(&data[0], - data.size() * sizeof(Pod_Type) < max_size_in_bytes - ? data.size() * sizeof(Pod_Type) : max_size_in_bytes)); -} - -/// Create a new non-modifiable buffer that represents the given string. -/** - * @note The buffer is invalidated by any non-const operation called on the - * given string object. - */ -inline const_buffer_container_1 buffer(const std::string& data) -{ - return const_buffer_container_1(const_buffer(data.data(), data.size())); -} - -/// Create a new non-modifiable buffer that represents the given string. -/** - * @note The buffer is invalidated by any non-const operation called on the - * given string object. - */ -inline const_buffer_container_1 buffer(const std::string& data, - std::size_t max_size_in_bytes) -{ - return const_buffer_container_1( - const_buffer(data.data(), - data.size() < max_size_in_bytes - ? data.size() : max_size_in_bytes)); -} - -/*@}*/ - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_BUFFER_HPP diff --git a/libtorrent/include/asio/buffered_read_stream.hpp b/libtorrent/include/asio/buffered_read_stream.hpp deleted file mode 100644 index 6260d22a0..000000000 --- a/libtorrent/include/asio/buffered_read_stream.hpp +++ /dev/null @@ -1,407 +0,0 @@ -// -// buffered_read_stream.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BUFFERED_READ_STREAM_HPP -#define ASIO_BUFFERED_READ_STREAM_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/buffered_read_stream_fwd.hpp" -#include "asio/buffer.hpp" -#include "asio/error.hpp" -#include "asio/io_service.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/buffer_resize_guard.hpp" -#include "asio/detail/buffered_stream_storage.hpp" -#include "asio/detail/noncopyable.hpp" - -namespace asio { - -/// Adds buffering to the read-related operations of a stream. -/** - * The buffered_read_stream class template can be used to add buffering to the - * synchronous and asynchronous read operations of a stream. - * - * @par Thread Safety: - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Concepts: - * Async_Object, Async_Read_Stream, Async_Write_Stream, Error_Source, Stream, - * Sync_Read_Stream, Sync_Write_Stream. - */ -template -class buffered_read_stream - : private noncopyable -{ -public: - /// The type of the next layer. - typedef typename boost::remove_reference::type next_layer_type; - - /// The type of the lowest layer. - typedef typename next_layer_type::lowest_layer_type lowest_layer_type; - - /// The type used for reporting errors. - typedef typename next_layer_type::error_type error_type; - -#if defined(GENERATING_DOCUMENTATION) - /// The default buffer size. - static const std::size_t default_buffer_size = implementation_defined; -#else - BOOST_STATIC_CONSTANT(std::size_t, default_buffer_size = 1024); -#endif - - /// Construct, passing the specified argument to initialise the next layer. - template - explicit buffered_read_stream(Arg& a) - : next_layer_(a), - storage_(default_buffer_size) - { - } - - /// Construct, passing the specified argument to initialise the next layer. - template - buffered_read_stream(Arg& a, std::size_t buffer_size) - : next_layer_(a), - storage_(buffer_size) - { - } - - /// Get a reference to the next layer. - next_layer_type& next_layer() - { - return next_layer_; - } - - /// Get a reference to the lowest layer. - lowest_layer_type& lowest_layer() - { - return next_layer_.lowest_layer(); - } - - /// Get the io_service associated with the object. - asio::io_service& io_service() - { - return next_layer_.io_service(); - } - - /// Close the stream. - void close() - { - next_layer_.close(); - } - - /// Close the stream. - template - void close(Error_Handler error_handler) - { - next_layer_.close(error_handler); - } - - /// Write the given data to the stream. Returns the number of bytes written. - /// Throws an exception on failure. - template - std::size_t write_some(const Const_Buffers& buffers) - { - return next_layer_.write_some(buffers); - } - - /// Write the given data to the stream. Returns the number of bytes written, - /// or 0 if an error occurred and the error handler did not throw. - template - std::size_t write_some(const Const_Buffers& buffers, - Error_Handler error_handler) - { - return next_layer_.write_some(buffers, error_handler); - } - - /// Start an asynchronous write. The data being written must be valid for the - /// lifetime of the asynchronous operation. - template - void async_write_some(const Const_Buffers& buffers, Handler handler) - { - next_layer_.async_write_some(buffers, handler); - } - - /// Fill the buffer with some data. Returns the number of bytes placed in the - /// buffer as a result of the operation. Throws an exception on failure. - std::size_t fill() - { - detail::buffer_resize_guard - resize_guard(storage_); - std::size_t previous_size = storage_.size(); - storage_.resize(storage_.capacity()); - storage_.resize(previous_size + next_layer_.read_some(buffer( - storage_.data() + previous_size, - storage_.size() - previous_size))); - resize_guard.commit(); - return storage_.size() - previous_size; - } - - /// Fill the buffer with some data. Returns the number of bytes placed in the - /// buffer as a result of the operation, or 0 if an error occurred and the - /// error handler did not throw. - template - std::size_t fill(Error_Handler error_handler) - { - detail::buffer_resize_guard - resize_guard(storage_); - std::size_t previous_size = storage_.size(); - storage_.resize(storage_.capacity()); - storage_.resize(previous_size + next_layer_.read_some(buffer( - storage_.data() + previous_size, - storage_.size() - previous_size), - error_handler)); - resize_guard.commit(); - return storage_.size() - previous_size; - } - - template - class fill_handler - { - public: - fill_handler(asio::io_service& io_service, - detail::buffered_stream_storage& storage, - std::size_t previous_size, Handler handler) - : io_service_(io_service), - storage_(storage), - previous_size_(previous_size), - handler_(handler) - { - } - - template - void operator()(const Error& e, std::size_t bytes_transferred) - { - storage_.resize(previous_size_ + bytes_transferred); - io_service_.dispatch(detail::bind_handler( - handler_, e, bytes_transferred)); - } - - private: - asio::io_service& io_service_; - detail::buffered_stream_storage& storage_; - std::size_t previous_size_; - Handler handler_; - }; - - /// Start an asynchronous fill. - template - void async_fill(Handler handler) - { - std::size_t previous_size = storage_.size(); - storage_.resize(storage_.capacity()); - next_layer_.async_read_some( - buffer( - storage_.data() + previous_size, - storage_.size() - previous_size), - fill_handler(io_service(), storage_, previous_size, handler)); - } - - /// Read some data from the stream. Returns the number of bytes read. Throws - /// an exception on failure. - template - std::size_t read_some(const Mutable_Buffers& buffers) - { - if (storage_.empty()) - fill(); - return copy(buffers); - } - - /// Read some data from the stream. Returns the number of bytes read or 0 if - /// an error occurred and the error handler did not throw an exception. - template - std::size_t read_some(const Mutable_Buffers& buffers, - Error_Handler error_handler) - { - if (storage_.empty() && !fill(error_handler)) - return 0; - return copy(buffers); - } - - template - class read_some_handler - { - public: - read_some_handler(asio::io_service& io_service, - detail::buffered_stream_storage& storage, - const Mutable_Buffers& buffers, Handler handler) - : io_service_(io_service), - storage_(storage), - buffers_(buffers), - handler_(handler) - { - } - - void operator()(const error_type& e, std::size_t) - { - if (e || storage_.empty()) - { - std::size_t length = 0; - io_service_.dispatch(detail::bind_handler(handler_, e, length)); - } - else - { - using namespace std; // For memcpy. - - std::size_t bytes_avail = storage_.size(); - std::size_t bytes_copied = 0; - - typename Mutable_Buffers::const_iterator iter = buffers_.begin(); - typename Mutable_Buffers::const_iterator end = buffers_.end(); - for (; iter != end && bytes_avail > 0; ++iter) - { - std::size_t max_length = buffer_size(*iter); - std::size_t length = (max_length < bytes_avail) - ? max_length : bytes_avail; - memcpy(buffer_cast(*iter), - storage_.data() + bytes_copied, length); - bytes_copied += length; - bytes_avail -= length; - } - - storage_.consume(bytes_copied); - io_service_.dispatch(detail::bind_handler(handler_, e, bytes_copied)); - } - } - - private: - asio::io_service& io_service_; - detail::buffered_stream_storage& storage_; - Mutable_Buffers buffers_; - Handler handler_; - }; - - /// Start an asynchronous read. The buffer into which the data will be read - /// must be valid for the lifetime of the asynchronous operation. - template - void async_read_some(const Mutable_Buffers& buffers, Handler handler) - { - if (storage_.empty()) - { - async_fill(read_some_handler( - io_service(), storage_, buffers, handler)); - } - else - { - std::size_t length = copy(buffers); - io_service().post(detail::bind_handler(handler, 0, length)); - } - } - - /// Peek at the incoming data on the stream. Returns the number of bytes read. - /// Throws an exception on failure. - template - std::size_t peek(const Mutable_Buffers& buffers) - { - if (storage_.empty()) - fill(); - return peek_copy(buffers); - } - - /// Peek at the incoming data on the stream. Returns the number of bytes read, - /// or 0 if an error occurred and the error handler did not throw. - template - std::size_t peek(const Mutable_Buffers& buffers, Error_Handler error_handler) - { - if (storage_.empty() && !fill(error_handler)) - return 0; - return peek_copy(buffers); - } - - /// Determine the amount of data that may be read without blocking. - std::size_t in_avail() - { - return storage_.size(); - } - - /// Determine the amount of data that may be read without blocking. - template - std::size_t in_avail(Error_Handler error_handler) - { - return storage_.size(); - } - -private: - /// Copy data out of the internal buffer to the specified target buffer. - /// Returns the number of bytes copied. - template - std::size_t copy(const Mutable_Buffers& buffers) - { - using namespace std; // For memcpy. - - std::size_t bytes_avail = storage_.size(); - std::size_t bytes_copied = 0; - - typename Mutable_Buffers::const_iterator iter = buffers.begin(); - typename Mutable_Buffers::const_iterator end = buffers.end(); - for (; iter != end && bytes_avail > 0; ++iter) - { - std::size_t max_length = buffer_size(*iter); - std::size_t length = (max_length < bytes_avail) - ? max_length : bytes_avail; - memcpy(buffer_cast(*iter), storage_.data() + bytes_copied, length); - bytes_copied += length; - bytes_avail -= length; - } - - storage_.consume(bytes_copied); - return bytes_copied; - } - - /// Copy data from the internal buffer to the specified target buffer, without - /// removing the data from the internal buffer. Returns the number of bytes - /// copied. - template - std::size_t peek_copy(const Mutable_Buffers& buffers) - { - using namespace std; // For memcpy. - - std::size_t bytes_avail = storage_.size(); - std::size_t bytes_copied = 0; - - typename Mutable_Buffers::const_iterator iter = buffers.begin(); - typename Mutable_Buffers::const_iterator end = buffers.end(); - for (; iter != end && bytes_avail > 0; ++iter) - { - std::size_t max_length = buffer_size(*iter); - std::size_t length = (max_length < bytes_avail) - ? max_length : bytes_avail; - memcpy(buffer_cast(*iter), storage_.data() + bytes_copied, length); - bytes_copied += length; - bytes_avail -= length; - } - - return bytes_copied; - } - - /// The next layer. - Stream next_layer_; - - // The data in the buffer. - detail::buffered_stream_storage storage_; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_BUFFERED_READ_STREAM_HPP diff --git a/libtorrent/include/asio/buffered_read_stream_fwd.hpp b/libtorrent/include/asio/buffered_read_stream_fwd.hpp deleted file mode 100644 index 7cdf04bcf..000000000 --- a/libtorrent/include/asio/buffered_read_stream_fwd.hpp +++ /dev/null @@ -1,29 +0,0 @@ -// -// buffered_read_stream_fwd.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BUFFERED_READ_STREAM_FWD_HPP -#define ASIO_BUFFERED_READ_STREAM_FWD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -namespace asio { - -template -class buffered_read_stream; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_BUFFERED_READ_STREAM_FWD_HPP diff --git a/libtorrent/include/asio/buffered_stream.hpp b/libtorrent/include/asio/buffered_stream.hpp deleted file mode 100644 index 1948fef09..000000000 --- a/libtorrent/include/asio/buffered_stream.hpp +++ /dev/null @@ -1,249 +0,0 @@ -// -// buffered_stream.hpp -// ~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BUFFERED_STREAM_HPP -#define ASIO_BUFFERED_STREAM_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/buffered_read_stream.hpp" -#include "asio/buffered_write_stream.hpp" -#include "asio/buffered_stream_fwd.hpp" -#include "asio/error.hpp" -#include "asio/io_service.hpp" -#include "asio/detail/noncopyable.hpp" - -namespace asio { - -/// Adds buffering to the read- and write-related operations of a stream. -/** - * The buffered_stream class template can be used to add buffering to the - * synchronous and asynchronous read and write operations of a stream. - * - * @par Thread Safety: - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Concepts: - * Async_Object, Async_Read_Stream, Async_Write_Stream, Error_Source, Stream, - * Sync_Read_Stream, Sync_Write_Stream. - */ -template -class buffered_stream - : private noncopyable -{ -public: - /// The type of the next layer. - typedef typename boost::remove_reference::type next_layer_type; - - /// The type of the lowest layer. - typedef typename next_layer_type::lowest_layer_type lowest_layer_type; - - /// The type used for reporting errors. - typedef typename next_layer_type::error_type error_type; - - /// Construct, passing the specified argument to initialise the next layer. - template - explicit buffered_stream(Arg& a) - : inner_stream_impl_(a), - stream_impl_(inner_stream_impl_) - { - } - - /// Construct, passing the specified argument to initialise the next layer. - template - explicit buffered_stream(Arg& a, std::size_t read_buffer_size, - std::size_t write_buffer_size) - : inner_stream_impl_(a, write_buffer_size), - stream_impl_(inner_stream_impl_, read_buffer_size) - { - } - - /// Get a reference to the next layer. - next_layer_type& next_layer() - { - return stream_impl_.next_layer().next_layer(); - } - - /// Get a reference to the lowest layer. - lowest_layer_type& lowest_layer() - { - return stream_impl_.lowest_layer(); - } - - /// Get the io_service associated with the object. - asio::io_service& io_service() - { - return stream_impl_.io_service(); - } - - /// Close the stream. - void close() - { - stream_impl_.close(); - } - - /// Close the stream. - template - void close(Error_Handler error_handler) - { - stream_impl_.close(error_handler); - } - - /// Flush all data from the buffer to the next layer. Returns the number of - /// bytes written to the next layer on the last write operation. Throws an - /// exception on failure. - std::size_t flush() - { - return stream_impl_.next_layer().flush(); - } - - /// Flush all data from the buffer to the next layer. Returns the number of - /// bytes written to the next layer on the last write operation, or 0 if an - /// error occurred and the error handler did not throw. - template - std::size_t flush(Error_Handler error_handler) - { - return stream_impl_.next_layer().flush(error_handler); - } - - /// Start an asynchronous flush. - template - void async_flush(Handler handler) - { - return stream_impl_.next_layer().async_flush(handler); - } - - /// Write the given data to the stream. Returns the number of bytes written. - /// Throws an exception on failure. - template - std::size_t write_some(const Const_Buffers& buffers) - { - return stream_impl_.write_some(buffers); - } - - /// Write the given data to the stream. Returns the number of bytes written, - /// or 0 if an error occurred and the error handler did not throw. - template - std::size_t write_some(const Const_Buffers& buffers, - Error_Handler error_handler) - { - return stream_impl_.write_some(buffers, error_handler); - } - - /// Start an asynchronous write. The data being written must be valid for the - /// lifetime of the asynchronous operation. - template - void async_write_some(const Const_Buffers& buffers, Handler handler) - { - stream_impl_.async_write_some(buffers, handler); - } - - /// Fill the buffer with some data. Returns the number of bytes placed in the - /// buffer as a result of the operation. Throws an exception on failure. - std::size_t fill() - { - return stream_impl_.fill(); - } - - /// Fill the buffer with some data. Returns the number of bytes placed in the - /// buffer as a result of the operation, or 0 if an error occurred and the - /// error handler did not throw. - template - std::size_t fill(Error_Handler error_handler) - { - return stream_impl_.fill(error_handler); - } - - /// Start an asynchronous fill. - template - void async_fill(Handler handler) - { - stream_impl_.async_fill(handler); - } - - /// Read some data from the stream. Returns the number of bytes read. Throws - /// an exception on failure. - template - std::size_t read_some(const Mutable_Buffers& buffers) - { - return stream_impl_.read_some(buffers); - } - - /// Read some data from the stream. Returns the number of bytes read or 0 if - /// an error occurred and the error handler did not throw an exception. - template - std::size_t read_some(const Mutable_Buffers& buffers, - Error_Handler error_handler) - { - return stream_impl_.read_some(buffers, error_handler); - } - - /// Start an asynchronous read. The buffer into which the data will be read - /// must be valid for the lifetime of the asynchronous operation. - template - void async_read_some(const Mutable_Buffers& buffers, Handler handler) - { - stream_impl_.async_read_some(buffers, handler); - } - - /// Peek at the incoming data on the stream. Returns the number of bytes read. - /// Throws an exception on failure. - template - std::size_t peek(const Mutable_Buffers& buffers) - { - return stream_impl_.peek(buffers); - } - - /// Peek at the incoming data on the stream. Returns the number of bytes read, - /// or 0 if an error occurred and the error handler did not throw. - template - std::size_t peek(const Mutable_Buffers& buffers, Error_Handler error_handler) - { - return stream_impl_.peek(buffers, error_handler); - } - - /// Determine the amount of data that may be read without blocking. - std::size_t in_avail() - { - return stream_impl_.in_avail(); - } - - /// Determine the amount of data that may be read without blocking. - template - std::size_t in_avail(Error_Handler error_handler) - { - return stream_impl_.in_avail(error_handler); - } - -private: - // The buffered write stream. - typedef buffered_write_stream write_stream_type; - write_stream_type inner_stream_impl_; - - // The buffered read stream. - typedef buffered_read_stream read_stream_type; - read_stream_type stream_impl_; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_BUFFERED_STREAM_HPP diff --git a/libtorrent/include/asio/buffered_stream_fwd.hpp b/libtorrent/include/asio/buffered_stream_fwd.hpp deleted file mode 100644 index 4590ae8e3..000000000 --- a/libtorrent/include/asio/buffered_stream_fwd.hpp +++ /dev/null @@ -1,29 +0,0 @@ -// -// buffered_stream_fwd.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BUFFERED_STREAM_FWD_HPP -#define ASIO_BUFFERED_STREAM_FWD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -namespace asio { - -template -class buffered_stream; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_BUFFERED_STREAM_FWD_HPP diff --git a/libtorrent/include/asio/buffered_write_stream.hpp b/libtorrent/include/asio/buffered_write_stream.hpp deleted file mode 100644 index d4bd49b92..000000000 --- a/libtorrent/include/asio/buffered_write_stream.hpp +++ /dev/null @@ -1,362 +0,0 @@ -// -// buffered_write_stream.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BUFFERED_WRITE_STREAM_HPP -#define ASIO_BUFFERED_WRITE_STREAM_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/buffered_write_stream_fwd.hpp" -#include "asio/buffer.hpp" -#include "asio/completion_condition.hpp" -#include "asio/error.hpp" -#include "asio/io_service.hpp" -#include "asio/write.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/buffered_stream_storage.hpp" -#include "asio/detail/noncopyable.hpp" - -namespace asio { - -/// Adds buffering to the write-related operations of a stream. -/** - * The buffered_write_stream class template can be used to add buffering to the - * synchronous and asynchronous write operations of a stream. - * - * @par Thread Safety: - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Concepts: - * Async_Object, Async_Read_Stream, Async_Write_Stream, Error_Source, Stream, - * Sync_Read_Stream, Sync_Write_Stream. - */ -template -class buffered_write_stream - : private noncopyable -{ -public: - /// The type of the next layer. - typedef typename boost::remove_reference::type next_layer_type; - - /// The type of the lowest layer. - typedef typename next_layer_type::lowest_layer_type lowest_layer_type; - - /// The type used for reporting errors. - typedef typename next_layer_type::error_type error_type; - -#if defined(GENERATING_DOCUMENTATION) - /// The default buffer size. - static const std::size_t default_buffer_size = implementation_defined; -#else - BOOST_STATIC_CONSTANT(std::size_t, default_buffer_size = 1024); -#endif - - /// Construct, passing the specified argument to initialise the next layer. - template - explicit buffered_write_stream(Arg& a) - : next_layer_(a), - storage_(default_buffer_size) - { - } - - /// Construct, passing the specified argument to initialise the next layer. - template - buffered_write_stream(Arg& a, std::size_t buffer_size) - : next_layer_(a), - storage_(buffer_size) - { - } - - /// Get a reference to the next layer. - next_layer_type& next_layer() - { - return next_layer_; - } - - /// Get a reference to the lowest layer. - lowest_layer_type& lowest_layer() - { - return next_layer_.lowest_layer(); - } - - /// Get the io_service associated with the object. - asio::io_service& io_service() - { - return next_layer_.io_service(); - } - - /// Close the stream. - void close() - { - next_layer_.close(); - } - - /// Close the stream. - template - void close(Error_Handler error_handler) - { - next_layer_.close(error_handler); - } - - /// Flush all data from the buffer to the next layer. Returns the number of - /// bytes written to the next layer on the last write operation. Throws an - /// exception on failure. - std::size_t flush() - { - std::size_t bytes_written = write(next_layer_, - buffer(storage_.data(), storage_.size())); - storage_.consume(bytes_written); - return bytes_written; - } - - /// Flush all data from the buffer to the next layer. Returns the number of - /// bytes written to the next layer on the last write operation, or 0 if an - /// error occurred and the error handler did not throw. - template - std::size_t flush(Error_Handler error_handler) - { - std::size_t bytes_written = write(next_layer_, - buffer(storage_.data(), storage_.size()), - transfer_all(), error_handler); - storage_.consume(bytes_written); - return bytes_written; - } - - template - class flush_handler - { - public: - flush_handler(asio::io_service& io_service, - detail::buffered_stream_storage& storage, Handler handler) - : io_service_(io_service), - storage_(storage), - handler_(handler) - { - } - - void operator()(const error_type& e, std::size_t bytes_written) - { - storage_.consume(bytes_written); - io_service_.dispatch(detail::bind_handler(handler_, e, bytes_written)); - } - - private: - asio::io_service& io_service_; - detail::buffered_stream_storage& storage_; - Handler handler_; - }; - - /// Start an asynchronous flush. - template - void async_flush(Handler handler) - { - async_write(next_layer_, buffer(storage_.data(), storage_.size()), - flush_handler(io_service(), storage_, handler)); - } - - /// Write the given data to the stream. Returns the number of bytes written. - /// Throws an exception on failure. - template - std::size_t write_some(const Const_Buffers& buffers) - { - if (storage_.size() == storage_.capacity()) - flush(); - return copy(buffers); - } - - /// Write the given data to the stream. Returns the number of bytes written, - /// or 0 if an error occurred and the error handler did not throw. - template - std::size_t write_some(const Const_Buffers& buffers, - Error_Handler error_handler) - { - if (storage_.size() == storage_.capacity() && !flush(error_handler)) - return 0; - return copy(buffers); - } - - template - class write_some_handler - { - public: - write_some_handler(asio::io_service& io_service, - detail::buffered_stream_storage& storage, - const Const_Buffers& buffers, Handler handler) - : io_service_(io_service), - storage_(storage), - buffers_(buffers), - handler_(handler) - { - } - - void operator()(const error_type& e, std::size_t) - { - if (e) - { - std::size_t length = 0; - io_service_.dispatch(detail::bind_handler(handler_, e, length)); - } - else - { - using namespace std; // For memcpy. - - std::size_t orig_size = storage_.size(); - std::size_t space_avail = storage_.capacity() - orig_size; - std::size_t bytes_copied = 0; - - typename Const_Buffers::const_iterator iter = buffers_.begin(); - typename Const_Buffers::const_iterator end = buffers_.end(); - for (; iter != end && space_avail > 0; ++iter) - { - std::size_t bytes_avail = buffer_size(*iter); - std::size_t length = (bytes_avail < space_avail) - ? bytes_avail : space_avail; - storage_.resize(orig_size + bytes_copied + length); - memcpy(storage_.data() + orig_size + bytes_copied, - buffer_cast(*iter), length); - bytes_copied += length; - space_avail -= length; - } - - io_service_.dispatch(detail::bind_handler(handler_, e, bytes_copied)); - } - } - - private: - asio::io_service& io_service_; - detail::buffered_stream_storage& storage_; - Const_Buffers buffers_; - Handler handler_; - }; - - /// Start an asynchronous write. The data being written must be valid for the - /// lifetime of the asynchronous operation. - template - void async_write_some(const Const_Buffers& buffers, Handler handler) - { - if (storage_.size() == storage_.capacity()) - { - async_flush(write_some_handler( - io_service(), storage_, buffers, handler)); - } - else - { - std::size_t bytes_copied = copy(buffers); - io_service().post(detail::bind_handler(handler, 0, bytes_copied)); - } - } - - /// Read some data from the stream. Returns the number of bytes read. Throws - /// an exception on failure. - template - std::size_t read_some(const Mutable_Buffers& buffers) - { - return next_layer_.read_some(buffers); - } - - /// Read some data from the stream. Returns the number of bytes read or 0 if - /// an error occurred and the error handler did not throw an exception. - template - std::size_t read_some(const Mutable_Buffers& buffers, - Error_Handler error_handler) - { - return next_layer_.read_some(buffers, error_handler); - } - - /// Start an asynchronous read. The buffer into which the data will be read - /// must be valid for the lifetime of the asynchronous operation. - template - void async_read_some(const Mutable_Buffers& buffers, Handler handler) - { - next_layer_.async_read_some(buffers, handler); - } - - /// Peek at the incoming data on the stream. Returns the number of bytes read. - /// Throws an exception on failure. - template - std::size_t peek(const Mutable_Buffers& buffers) - { - return next_layer_.peek(buffers); - } - - /// Peek at the incoming data on the stream. Returns the number of bytes read, - /// or 0 if an error occurred and the error handler did not throw. - template - std::size_t peek(const Mutable_Buffers& buffers, Error_Handler error_handler) - { - return next_layer_.peek(buffers, error_handler); - } - - /// Determine the amount of data that may be read without blocking. - std::size_t in_avail() - { - return next_layer_.in_avail(); - } - - /// Determine the amount of data that may be read without blocking. - template - std::size_t in_avail(Error_Handler error_handler) - { - return next_layer_.in_avail(error_handler); - } - -private: - /// Copy data into the internal buffer from the specified source buffer. - /// Returns the number of bytes copied. - template - std::size_t copy(const Const_Buffers& buffers) - { - using namespace std; // For memcpy. - - std::size_t orig_size = storage_.size(); - std::size_t space_avail = storage_.capacity() - orig_size; - std::size_t bytes_copied = 0; - - typename Const_Buffers::const_iterator iter = buffers.begin(); - typename Const_Buffers::const_iterator end = buffers.end(); - for (; iter != end && space_avail > 0; ++iter) - { - std::size_t bytes_avail = buffer_size(*iter); - std::size_t length = (bytes_avail < space_avail) - ? bytes_avail : space_avail; - storage_.resize(orig_size + bytes_copied + length); - memcpy(storage_.data() + orig_size + bytes_copied, - buffer_cast(*iter), length); - bytes_copied += length; - space_avail -= length; - } - - return bytes_copied; - } - - /// The next layer. - Stream next_layer_; - - // The data in the buffer. - detail::buffered_stream_storage storage_; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_BUFFERED_WRITE_STREAM_HPP diff --git a/libtorrent/include/asio/buffered_write_stream_fwd.hpp b/libtorrent/include/asio/buffered_write_stream_fwd.hpp deleted file mode 100644 index 6cabef816..000000000 --- a/libtorrent/include/asio/buffered_write_stream_fwd.hpp +++ /dev/null @@ -1,29 +0,0 @@ -// -// buffered_write_stream_fwd.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_BUFFERED_WRITE_STREAM_FWD_HPP -#define ASIO_BUFFERED_WRITE_STREAM_FWD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -namespace asio { - -template -class buffered_write_stream; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_BUFFERED_WRITE_STREAM_FWD_HPP diff --git a/libtorrent/include/asio/completion_condition.hpp b/libtorrent/include/asio/completion_condition.hpp deleted file mode 100644 index 3f8f7b611..000000000 --- a/libtorrent/include/asio/completion_condition.hpp +++ /dev/null @@ -1,101 +0,0 @@ -// -// completion_condition.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_COMPLETION_CONDITION_HPP -#define ASIO_COMPLETION_CONDITION_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include "asio/detail/pop_options.hpp" - -namespace asio { - -namespace detail { - -class transfer_all_t -{ -public: - typedef bool result_type; - - template - bool operator()(const Error& err, std::size_t) - { - return !!err; - } -}; - -class transfer_at_least_t -{ -public: - typedef bool result_type; - - explicit transfer_at_least_t(std::size_t minimum) - : minimum_(minimum) - { - } - - template - bool operator()(const Error& err, std::size_t bytes_transferred) - { - return !!err || bytes_transferred >= minimum_; - } - -private: - std::size_t minimum_; -}; - -} // namespace detail - -/** - * @defgroup completion_condition Completion Condition Function Objects - * - * Function objects used for determining when a read or write operation should - * complete. - */ -/*@{*/ - -/// Return a completion condition function object that indicates that a read or -/// write operation should continue until all of the data has been transferred, -/// or until an error occurs. -#if defined(GENERATING_DOCUMENTATION) -unspecified transfer_all(); -#else -inline detail::transfer_all_t transfer_all() -{ - return detail::transfer_all_t(); -} -#endif - -/// Return a completion condition function object that indicates that a read or -/// write operation should continue until a minimum number of bytes has been -/// transferred, or until an error occurs. -#if defined(GENERATING_DOCUMENTATION) -unspecified transfer_at_least(std::size_t minimum); -#else -inline detail::transfer_at_least_t transfer_at_least(std::size_t minimum) -{ - return detail::transfer_at_least_t(minimum); -} -#endif - -/*@}*/ - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_COMPLETION_CONDITION_HPP diff --git a/libtorrent/include/asio/datagram_socket_service.hpp b/libtorrent/include/asio/datagram_socket_service.hpp deleted file mode 100644 index 77a3af42d..000000000 --- a/libtorrent/include/asio/datagram_socket_service.hpp +++ /dev/null @@ -1,295 +0,0 @@ -// -// datagram_socket_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DATAGRAM_SOCKET_SERVICE_HPP -#define ASIO_DATAGRAM_SOCKET_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/io_service.hpp" -#include "asio/detail/epoll_reactor.hpp" -#include "asio/detail/kqueue_reactor.hpp" -#include "asio/detail/select_reactor.hpp" -#include "asio/detail/reactive_socket_service.hpp" -#include "asio/detail/win_iocp_socket_service.hpp" - -namespace asio { - -/// Default service implementation for a datagram socket. -template -class datagram_socket_service - : public asio::io_service::service -{ -public: - /// The protocol type. - typedef Protocol protocol_type; - - /// The endpoint type. - typedef typename Protocol::endpoint endpoint_type; - -private: - // The type of the platform-specific implementation. -#if defined(ASIO_HAS_IOCP) - typedef detail::win_iocp_socket_service service_impl_type; -#elif defined(ASIO_HAS_EPOLL) - typedef detail::reactive_socket_service< - Protocol, detail::epoll_reactor > service_impl_type; -#elif defined(ASIO_HAS_KQUEUE) - typedef detail::reactive_socket_service< - Protocol, detail::kqueue_reactor > service_impl_type; -#else - typedef detail::reactive_socket_service< - Protocol, detail::select_reactor > service_impl_type; -#endif - -public: - /// The type of a datagram socket. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined implementation_type; -#else - typedef typename service_impl_type::implementation_type implementation_type; -#endif - - /// The native socket type. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined native_type; -#else - typedef typename service_impl_type::native_type native_type; -#endif - - /// Construct a new datagram socket service for the specified io_service. - explicit datagram_socket_service(asio::io_service& io_service) - : asio::io_service::service(io_service), - service_impl_(asio::use_service(io_service)) - { - } - - /// Destroy all user-defined handler objects owned by the service. - void shutdown_service() - { - } - - /// Construct a new datagram socket implementation. - void construct(implementation_type& impl) - { - service_impl_.construct(impl); - } - - /// Destroy a datagram socket implementation. - void destroy(implementation_type& impl) - { - service_impl_.destroy(impl); - } - - // Open a new datagram socket implementation. - template - void open(implementation_type& impl, const protocol_type& protocol, - Error_Handler error_handler) - { - if (protocol.type() == SOCK_DGRAM) - service_impl_.open(impl, protocol, error_handler); - else - error_handler(asio::error(asio::error::invalid_argument)); - } - - /// Assign an existing native socket to a datagram socket. - template - void assign(implementation_type& impl, const protocol_type& protocol, - const native_type& native_socket, Error_Handler error_handler) - { - service_impl_.assign(impl, protocol, native_socket, error_handler); - } - - /// Close a datagram socket implementation. - template - void close(implementation_type& impl, Error_Handler error_handler) - { - service_impl_.close(impl, error_handler); - } - - /// Get the native socket implementation. - native_type native(implementation_type& impl) - { - return service_impl_.native(impl); - } - - /// Cancel all asynchronous operations associated with the socket. - template - void cancel(implementation_type& impl, Error_Handler error_handler) - { - service_impl_.cancel(impl, error_handler); - } - - // Bind the datagram socket to the specified local endpoint. - template - void bind(implementation_type& impl, const endpoint_type& endpoint, - Error_Handler error_handler) - { - service_impl_.bind(impl, endpoint, error_handler); - } - - /// Connect the datagram socket to the specified endpoint. - template - void connect(implementation_type& impl, const endpoint_type& peer_endpoint, - Error_Handler error_handler) - { - service_impl_.connect(impl, peer_endpoint, error_handler); - } - - /// Start an asynchronous connect. - template - void async_connect(implementation_type& impl, - const endpoint_type& peer_endpoint, Handler handler) - { - service_impl_.async_connect(impl, peer_endpoint, handler); - } - - /// Set a socket option. - template - void set_option(implementation_type& impl, const Option& option, - Error_Handler error_handler) - { - service_impl_.set_option(impl, option, error_handler); - } - - /// Get a socket option. - template - void get_option(const implementation_type& impl, Option& option, - Error_Handler error_handler) const - { - service_impl_.get_option(impl, option, error_handler); - } - - /// Perform an IO control command on the socket. - template - void io_control(implementation_type& impl, IO_Control_Command& command, - Error_Handler error_handler) - { - service_impl_.io_control(impl, command, error_handler); - } - - /// Get the local endpoint. - template - endpoint_type local_endpoint(const implementation_type& impl, - Error_Handler error_handler) const - { - endpoint_type endpoint; - service_impl_.get_local_endpoint(impl, endpoint, error_handler); - return endpoint; - } - - /// Get the remote endpoint. - template - endpoint_type remote_endpoint(const implementation_type& impl, - Error_Handler error_handler) const - { - endpoint_type endpoint; - service_impl_.get_remote_endpoint(impl, endpoint, error_handler); - return endpoint; - } - - /// Disable sends or receives on the socket. - template - void shutdown(implementation_type& impl, socket_base::shutdown_type what, - Error_Handler error_handler) - { - service_impl_.shutdown(impl, what, error_handler); - } - - /// Send the given data to the peer. - template - std::size_t send(implementation_type& impl, const Const_Buffers& buffers, - socket_base::message_flags flags, Error_Handler error_handler) - { - return service_impl_.send(impl, buffers, flags, error_handler); - } - - /// Start an asynchronous send. - template - void async_send(implementation_type& impl, const Const_Buffers& buffers, - socket_base::message_flags flags, Handler handler) - { - service_impl_.async_send(impl, buffers, flags, handler); - } - - /// Send a datagram to the specified endpoint. - template - std::size_t send_to(implementation_type& impl, const Const_Buffers& buffers, - const endpoint_type& destination, socket_base::message_flags flags, - Error_Handler error_handler) - { - return service_impl_.send_to(impl, buffers, destination, flags, - error_handler); - } - - /// Start an asynchronous send. - template - void async_send_to(implementation_type& impl, const Const_Buffers& buffers, - const endpoint_type& destination, socket_base::message_flags flags, - Handler handler) - { - service_impl_.async_send_to(impl, buffers, destination, flags, handler); - } - - /// Receive some data from the peer. - template - std::size_t receive(implementation_type& impl, const Mutable_Buffers& buffers, - socket_base::message_flags flags, Error_Handler error_handler) - { - return service_impl_.receive(impl, buffers, flags, error_handler); - } - - /// Start an asynchronous receive. - template - void async_receive(implementation_type& impl, const Mutable_Buffers& buffers, - socket_base::message_flags flags, Handler handler) - { - service_impl_.async_receive(impl, buffers, flags, handler); - } - - /// Receive a datagram with the endpoint of the sender. - template - std::size_t receive_from(implementation_type& impl, - const Mutable_Buffers& buffers, endpoint_type& sender_endpoint, - socket_base::message_flags flags, Error_Handler error_handler) - { - return service_impl_.receive_from(impl, buffers, sender_endpoint, flags, - error_handler); - } - - /// Start an asynchronous receive that will get the endpoint of the sender. - template - void async_receive_from(implementation_type& impl, - const Mutable_Buffers& buffers, endpoint_type& sender_endpoint, - socket_base::message_flags flags, Handler handler) - { - service_impl_.async_receive_from(impl, buffers, sender_endpoint, flags, - handler); - } - -private: - // The service that provides the platform-specific implementation. - service_impl_type& service_impl_; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DATAGRAM_SOCKET_SERVICE_HPP diff --git a/libtorrent/include/asio/deadline_timer.hpp b/libtorrent/include/asio/deadline_timer.hpp deleted file mode 100644 index 7deafa60b..000000000 --- a/libtorrent/include/asio/deadline_timer.hpp +++ /dev/null @@ -1,37 +0,0 @@ -// -// deadline_timer.hpp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DEADLINE_TIMER_HPP -#define ASIO_DEADLINE_TIMER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/socket_types.hpp" // Must come before posix_time. - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/basic_deadline_timer.hpp" - -namespace asio { - -/// Typedef for the typical usage of timer. -typedef basic_deadline_timer deadline_timer; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DEADLINE_TIMER_HPP diff --git a/libtorrent/include/asio/deadline_timer_service.hpp b/libtorrent/include/asio/deadline_timer_service.hpp deleted file mode 100644 index 2415d9be6..000000000 --- a/libtorrent/include/asio/deadline_timer_service.hpp +++ /dev/null @@ -1,152 +0,0 @@ -// -// deadline_timer_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DEADLINE_TIMER_SERVICE_HPP -#define ASIO_DEADLINE_TIMER_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/io_service.hpp" -#include "asio/time_traits.hpp" -#include "asio/detail/deadline_timer_service.hpp" -#include "asio/detail/epoll_reactor.hpp" -#include "asio/detail/kqueue_reactor.hpp" -#include "asio/detail/select_reactor.hpp" - -namespace asio { - -/// Default service implementation for a timer. -template > -class deadline_timer_service - : public asio::io_service::service -{ -public: - /// The time traits type. - typedef Time_Traits traits_type; - - /// The time type. - typedef typename traits_type::time_type time_type; - - /// The duration type. - typedef typename traits_type::duration_type duration_type; - -private: - // The type of the platform-specific implementation. -#if defined(ASIO_HAS_IOCP) - typedef detail::deadline_timer_service< - traits_type, detail::select_reactor > service_impl_type; -#elif defined(ASIO_HAS_EPOLL) - typedef detail::deadline_timer_service< - traits_type, detail::epoll_reactor > service_impl_type; -#elif defined(ASIO_HAS_KQUEUE) - typedef detail::deadline_timer_service< - traits_type, detail::kqueue_reactor > service_impl_type; -#else - typedef detail::deadline_timer_service< - traits_type, detail::select_reactor > service_impl_type; -#endif - -public: - /// The implementation type of the deadline timer. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined implementation_type; -#else - typedef typename service_impl_type::implementation_type implementation_type; -#endif - - /// Construct a new timer service for the specified io_service. - explicit deadline_timer_service(asio::io_service& io_service) - : asio::io_service::service(io_service), - service_impl_(asio::use_service(io_service)) - { - } - - /// Destroy all user-defined handler objects owned by the service. - void shutdown_service() - { - } - - /// Construct a new timer implementation. - void construct(implementation_type& impl) - { - service_impl_.construct(impl); - } - - /// Destroy a timer implementation. - void destroy(implementation_type& impl) - { - service_impl_.destroy(impl); - } - - /// Cancel any asynchronous wait operations associated with the timer. - std::size_t cancel(implementation_type& impl) - { - return service_impl_.cancel(impl); - } - - /// Get the expiry time for the timer as an absolute time. - time_type expires_at(const implementation_type& impl) const - { - return service_impl_.expires_at(impl); - } - - /// Set the expiry time for the timer as an absolute time. - std::size_t expires_at(implementation_type& impl, - const time_type& expiry_time) - { - return service_impl_.expires_at(impl, expiry_time); - } - - /// Get the expiry time for the timer relative to now. - duration_type expires_from_now(const implementation_type& impl) const - { - return service_impl_.expires_from_now(impl); - } - - /// Set the expiry time for the timer relative to now. - std::size_t expires_from_now(implementation_type& impl, - const duration_type& expiry_time) - { - return service_impl_.expires_from_now(impl, expiry_time); - } - - // Perform a blocking wait on the timer. - void wait(implementation_type& impl) - { - service_impl_.wait(impl); - } - - // Start an asynchronous wait on the timer. - template - void async_wait(implementation_type& impl, Handler handler) - { - service_impl_.async_wait(impl, handler); - } - -private: - // The service that provides the platform-specific implementation. - service_impl_type& service_impl_; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DEADLINE_TIMER_SERVICE_HPP diff --git a/libtorrent/include/asio/detail/bind_handler.hpp b/libtorrent/include/asio/detail/bind_handler.hpp deleted file mode 100644 index 59c2bcef2..000000000 --- a/libtorrent/include/asio/detail/bind_handler.hpp +++ /dev/null @@ -1,349 +0,0 @@ -// -// bind_handler.hpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_BIND_HANDLER_HPP -#define ASIO_DETAIL_BIND_HANDLER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" - -namespace asio { -namespace detail { - -template -class binder1 -{ -public: - binder1(const Handler& handler, const Arg1& arg1) - : handler_(handler), - arg1_(arg1) - { - } - - void operator()() - { - handler_(arg1_); - } - - void operator()() const - { - handler_(arg1_); - } - -//private: - Handler handler_; - Arg1 arg1_; -}; - -template -inline void* asio_handler_allocate(std::size_t size, - binder1* this_handler) -{ - return asio_handler_alloc_helpers::allocate( - size, &this_handler->handler_); -} - -template -inline void asio_handler_deallocate(void* pointer, std::size_t size, - binder1* this_handler) -{ - asio_handler_alloc_helpers::deallocate( - pointer, size, &this_handler->handler_); -} - -template -inline void asio_handler_invoke(const Function& function, - binder1* this_handler) -{ - asio_handler_invoke_helpers::invoke( - function, &this_handler->handler_); -} - -template -inline binder1 bind_handler(const Handler& handler, - const Arg1& arg1) -{ - return binder1(handler, arg1); -} - -template -class binder2 -{ -public: - binder2(const Handler& handler, const Arg1& arg1, const Arg2& arg2) - : handler_(handler), - arg1_(arg1), - arg2_(arg2) - { - } - - void operator()() - { - handler_(arg1_, arg2_); - } - - void operator()() const - { - handler_(arg1_, arg2_); - } - -//private: - Handler handler_; - Arg1 arg1_; - Arg2 arg2_; -}; - -template -inline void* asio_handler_allocate(std::size_t size, - binder2* this_handler) -{ - return asio_handler_alloc_helpers::allocate( - size, &this_handler->handler_); -} - -template -inline void asio_handler_deallocate(void* pointer, std::size_t size, - binder2* this_handler) -{ - asio_handler_alloc_helpers::deallocate( - pointer, size, &this_handler->handler_); -} - -template -inline void asio_handler_invoke(const Function& function, - binder2* this_handler) -{ - asio_handler_invoke_helpers::invoke( - function, &this_handler->handler_); -} - -template -inline binder2 bind_handler(const Handler& handler, - const Arg1& arg1, const Arg2& arg2) -{ - return binder2(handler, arg1, arg2); -} - -template -class binder3 -{ -public: - binder3(const Handler& handler, const Arg1& arg1, const Arg2& arg2, - const Arg3& arg3) - : handler_(handler), - arg1_(arg1), - arg2_(arg2), - arg3_(arg3) - { - } - - void operator()() - { - handler_(arg1_, arg2_, arg3_); - } - - void operator()() const - { - handler_(arg1_, arg2_, arg3_); - } - -//private: - Handler handler_; - Arg1 arg1_; - Arg2 arg2_; - Arg3 arg3_; -}; - -template -inline void* asio_handler_allocate(std::size_t size, - binder3* this_handler) -{ - return asio_handler_alloc_helpers::allocate( - size, &this_handler->handler_); -} - -template -inline void asio_handler_deallocate(void* pointer, std::size_t size, - binder3* this_handler) -{ - asio_handler_alloc_helpers::deallocate( - pointer, size, &this_handler->handler_); -} - -template -inline void asio_handler_invoke(const Function& function, - binder3* this_handler) -{ - asio_handler_invoke_helpers::invoke( - function, &this_handler->handler_); -} - -template -inline binder3 bind_handler(const Handler& handler, - const Arg1& arg1, const Arg2& arg2, const Arg3& arg3) -{ - return binder3(handler, arg1, arg2, arg3); -} - -template -class binder4 -{ -public: - binder4(const Handler& handler, const Arg1& arg1, const Arg2& arg2, - const Arg3& arg3, const Arg4& arg4) - : handler_(handler), - arg1_(arg1), - arg2_(arg2), - arg3_(arg3), - arg4_(arg4) - { - } - - void operator()() - { - handler_(arg1_, arg2_, arg3_, arg4_); - } - - void operator()() const - { - handler_(arg1_, arg2_, arg3_, arg4_); - } - -//private: - Handler handler_; - Arg1 arg1_; - Arg2 arg2_; - Arg3 arg3_; - Arg4 arg4_; -}; - -template -inline void* asio_handler_allocate(std::size_t size, - binder4* this_handler) -{ - return asio_handler_alloc_helpers::allocate( - size, &this_handler->handler_); -} - -template -inline void asio_handler_deallocate(void* pointer, std::size_t size, - binder4* this_handler) -{ - asio_handler_alloc_helpers::deallocate( - pointer, size, &this_handler->handler_); -} - -template -inline void asio_handler_invoke(const Function& function, - binder4* this_handler) -{ - asio_handler_invoke_helpers::invoke( - function, &this_handler->handler_); -} - -template -inline binder4 bind_handler( - const Handler& handler, const Arg1& arg1, const Arg2& arg2, - const Arg3& arg3, const Arg4& arg4) -{ - return binder4(handler, arg1, arg2, arg3, - arg4); -} - -template -class binder5 -{ -public: - binder5(const Handler& handler, const Arg1& arg1, const Arg2& arg2, - const Arg3& arg3, const Arg4& arg4, const Arg5& arg5) - : handler_(handler), - arg1_(arg1), - arg2_(arg2), - arg3_(arg3), - arg4_(arg4), - arg5_(arg5) - { - } - - void operator()() - { - handler_(arg1_, arg2_, arg3_, arg4_, arg5_); - } - - void operator()() const - { - handler_(arg1_, arg2_, arg3_, arg4_, arg5_); - } - -//private: - Handler handler_; - Arg1 arg1_; - Arg2 arg2_; - Arg3 arg3_; - Arg4 arg4_; - Arg5 arg5_; -}; - -template -inline void* asio_handler_allocate(std::size_t size, - binder5* this_handler) -{ - return asio_handler_alloc_helpers::allocate( - size, &this_handler->handler_); -} - -template -inline void asio_handler_deallocate(void* pointer, std::size_t size, - binder5* this_handler) -{ - asio_handler_alloc_helpers::deallocate( - pointer, size, &this_handler->handler_); -} - -template -inline void asio_handler_invoke(const Function& function, - binder5* this_handler) -{ - asio_handler_invoke_helpers::invoke( - function, &this_handler->handler_); -} - -template -inline binder5 bind_handler( - const Handler& handler, const Arg1& arg1, const Arg2& arg2, - const Arg3& arg3, const Arg4& arg4, const Arg5& arg5) -{ - return binder5(handler, arg1, arg2, - arg3, arg4, arg5); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_BIND_HANDLER_HPP diff --git a/libtorrent/include/asio/detail/buffer_resize_guard.hpp b/libtorrent/include/asio/detail/buffer_resize_guard.hpp deleted file mode 100644 index d72753010..000000000 --- a/libtorrent/include/asio/detail/buffer_resize_guard.hpp +++ /dev/null @@ -1,70 +0,0 @@ -// -// buffer_resize_guard.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_BUFFER_RESIZE_GUARD_HPP -#define ASIO_DETAIL_BUFFER_RESIZE_GUARD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include "asio/detail/pop_options.hpp" - -namespace asio { -namespace detail { - -// Helper class to manage buffer resizing in an exception safe way. -template -class buffer_resize_guard -{ -public: - // Constructor. - buffer_resize_guard(Buffer& buffer) - : buffer_(buffer), - old_size_(buffer.size()) - { - } - - // Destructor rolls back the buffer resize unless commit was called. - ~buffer_resize_guard() - { - if (old_size_ - != std::numeric_limits::max BOOST_PREVENT_MACRO_SUBSTITUTION()) - { - buffer_.resize(old_size_); - } - } - - // Commit the resize transaction. - void commit() - { - old_size_ - = std::numeric_limits::max BOOST_PREVENT_MACRO_SUBSTITUTION(); - } - -private: - // The buffer being managed. - Buffer& buffer_; - - // The size of the buffer at the time the guard was constructed. - size_t old_size_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_BUFFER_RESIZE_GUARD_HPP diff --git a/libtorrent/include/asio/detail/buffered_stream_storage.hpp b/libtorrent/include/asio/detail/buffered_stream_storage.hpp deleted file mode 100644 index 17517f9b5..000000000 --- a/libtorrent/include/asio/detail/buffered_stream_storage.hpp +++ /dev/null @@ -1,127 +0,0 @@ -// -// buffered_stream_storage.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_BUFFERED_STREAM_STORAGE_HPP -#define ASIO_DETAIL_BUFFERED_STREAM_STORAGE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -namespace asio { -namespace detail { - -class buffered_stream_storage -{ -public: - // The type of the bytes stored in the buffer. - typedef unsigned char byte_type; - - // The type used for offsets into the buffer. - typedef std::size_t size_type; - - // Constructor. - explicit buffered_stream_storage(std::size_t capacity) - : begin_offset_(0), - end_offset_(0), - buffer_(capacity) - { - } - - /// Clear the buffer. - void clear() - { - begin_offset_ = 0; - end_offset_ = 0; - } - - // Return a pointer to the beginning of the unread data. - byte_type* data() - { - return &buffer_[0] + begin_offset_; - } - - // Return a pointer to the beginning of the unread data. - const byte_type* data() const - { - return &buffer_[0] + begin_offset_; - } - - // Is there no unread data in the buffer. - bool empty() const - { - return begin_offset_ == end_offset_; - } - - // Return the amount of unread data the is in the buffer. - size_type size() const - { - return end_offset_ - begin_offset_; - } - - // Resize the buffer to the specified length. - void resize(size_type length) - { - assert(length <= capacity()); - if (begin_offset_ + length <= capacity()) - { - end_offset_ = begin_offset_ + length; - } - else - { - using namespace std; // For memmove. - memmove(&buffer_[0], &buffer_[0] + begin_offset_, size()); - end_offset_ = length; - begin_offset_ = 0; - } - } - - // Return the maximum size for data in the buffer. - size_type capacity() const - { - return buffer_.size(); - } - - // Consume multiple bytes from the beginning of the buffer. - void consume(size_type count) - { - assert(begin_offset_ + count <= end_offset_); - begin_offset_ += count; - if (empty()) - clear(); - } - -private: - // The offset to the beginning of the unread data. - size_type begin_offset_; - - // The offset to the end of the unread data. - size_type end_offset_; - - // The data in the buffer. - std::vector buffer_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_BUFFERED_STREAM_STORAGE_HPP diff --git a/libtorrent/include/asio/detail/call_stack.hpp b/libtorrent/include/asio/detail/call_stack.hpp deleted file mode 100644 index 37256ee59..000000000 --- a/libtorrent/include/asio/detail/call_stack.hpp +++ /dev/null @@ -1,90 +0,0 @@ -// -// call_stack.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_CALL_STACK_HPP -#define ASIO_DETAIL_CALL_STACK_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/tss_ptr.hpp" - -namespace asio { -namespace detail { - -// Helper class to determine whether or not the current thread is inside an -// invocation of io_service::run() for a specified io_service object. -template -class call_stack -{ -public: - // Context class automatically pushes an owner on to the stack. - class context - : private noncopyable - { - public: - // Push the owner on to the stack. - explicit context(Owner* d) - : owner_(d), - next_(call_stack::top_) - { - call_stack::top_ = this; - } - - // Pop the owner from the stack. - ~context() - { - call_stack::top_ = next_; - } - - private: - friend class call_stack; - - // The owner associated with the context. - Owner* owner_; - - // The next element in the stack. - context* next_; - }; - - friend class context; - - // Determine whether the specified owner is on the stack. - static bool contains(Owner* d) - { - context* elem = top_; - while (elem) - { - if (elem->owner_ == d) - return true; - elem = elem->next_; - } - return false; - } - -private: - // The top of the stack of calls for the current thread. - static tss_ptr top_; -}; - -template -tss_ptr::context> -call_stack::top_; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_CALL_STACK_HPP diff --git a/libtorrent/include/asio/detail/const_buffers_iterator.hpp b/libtorrent/include/asio/detail/const_buffers_iterator.hpp deleted file mode 100644 index f48d2df85..000000000 --- a/libtorrent/include/asio/detail/const_buffers_iterator.hpp +++ /dev/null @@ -1,150 +0,0 @@ -// -// const_buffers_iterator.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_CONST_BUFFERS_ITERATOR_HPP -#define ASIO_DETAIL_CONST_BUFFERS_ITERATOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/buffer.hpp" - -namespace asio { -namespace detail { - -// A proxy iterator for a sub-range in a list of buffers. -template -class const_buffers_iterator - : public boost::iterator_facade, - const char, boost::bidirectional_traversal_tag> -{ -public: - // Default constructor creates an iterator in an undefined state. - const_buffers_iterator() - { - } - - // Create an iterator for the specified position. - const_buffers_iterator(const Const_Buffers& buffers, std::size_t position) - : begin_(buffers.begin()), - current_(buffers.begin()), - end_(buffers.end()), - position_(0) - { - while (current_ != end_) - { - current_buffer_ = *current_; - std::size_t buffer_size = asio::buffer_size(current_buffer_); - if (position - position_ < buffer_size) - { - current_buffer_position_ = position - position_; - position_ = position; - return; - } - position_ += buffer_size; - ++current_; - } - current_buffer_ = asio::const_buffer(); - current_buffer_position_ = 0; - } - - std::size_t position() const - { - return position_; - } - -private: - friend class boost::iterator_core_access; - - void increment() - { - if (current_ == end_) - return; - - ++position_; - - ++current_buffer_position_; - if (current_buffer_position_ != asio::buffer_size(current_buffer_)) - return; - - ++current_; - current_buffer_position_ = 0; - while (current_ != end_) - { - current_buffer_ = *current_; - if (asio::buffer_size(current_buffer_) > 0) - return; - ++current_; - } - } - - void decrement() - { - if (position_ == 0) - return; - - --position_; - - if (current_buffer_position_ != 0) - { - --current_buffer_position_; - return; - } - - typename Const_Buffers::const_iterator iter = current_; - while (iter != begin_) - { - --iter; - asio::const_buffer buffer = *iter; - std::size_t buffer_size = asio::buffer_size(buffer); - if (buffer_size > 0) - { - current_ = iter; - current_buffer_ = buffer; - current_buffer_position_ = buffer_size - 1; - return; - } - } - } - - bool equal(const const_buffers_iterator& other) const - { - return position_ == other.position_; - } - - const char& dereference() const - { - return asio::buffer_cast( - current_buffer_)[current_buffer_position_]; - } - - asio::const_buffer current_buffer_; - std::size_t current_buffer_position_; - typename Const_Buffers::const_iterator begin_; - typename Const_Buffers::const_iterator current_; - typename Const_Buffers::const_iterator end_; - std::size_t position_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_CONST_BUFFERS_ITERATOR_HPP diff --git a/libtorrent/include/asio/detail/consuming_buffers.hpp b/libtorrent/include/asio/detail/consuming_buffers.hpp deleted file mode 100644 index 7877f95f2..000000000 --- a/libtorrent/include/asio/detail/consuming_buffers.hpp +++ /dev/null @@ -1,196 +0,0 @@ -// -// consuming_buffers.hpp -// ~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_CONSUMING_BUFFERS_HPP -#define ASIO_DETAIL_CONSUMING_BUFFERS_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -namespace asio { -namespace detail { - -// A proxy iterator for a sub-range in a list of buffers. -template -class consuming_buffers_iterator - : public boost::iterator_facade< - consuming_buffers_iterator, - const Buffer, - boost::forward_traversal_tag> -{ -public: - // Default constructor creates an end iterator. - consuming_buffers_iterator() - : at_end_(true) - { - } - - // Construct with a buffer for the first entry and an iterator - // range for the remaining entries. - consuming_buffers_iterator(bool at_end, const Buffer& first, - Buffer_Iterator begin_remainder, Buffer_Iterator end_remainder) - : at_end_(at_end), - first_(first), - begin_remainder_(begin_remainder), - end_remainder_(end_remainder) - { - } - -private: - friend class boost::iterator_core_access; - - void increment() - { - if (!at_end_) - { - if (begin_remainder_ == end_remainder_) - at_end_ = true; - else - first_ = *begin_remainder_++; - } - } - - bool equal(const consuming_buffers_iterator& other) const - { - if (at_end_ && other.at_end_) - return true; - return !at_end_ && !other.at_end_ - && buffer_cast(first_) - == buffer_cast(other.first_) - && buffer_size(first_) == buffer_size(other.first_) - && begin_remainder_ == other.begin_remainder_ - && end_remainder_ == other.end_remainder_; - } - - const Buffer& dereference() const - { - return first_; - } - - bool at_end_; - Buffer first_; - Buffer_Iterator begin_remainder_; - Buffer_Iterator end_remainder_; -}; - -// A proxy for a sub-range in a list of buffers. -template -class consuming_buffers -{ -public: - // The type for each element in the list of buffers. - typedef Buffer value_type; - - // A forward-only iterator type that may be used to read elements. - typedef consuming_buffers_iterator - const_iterator; - - // Construct to represent the entire list of buffers. - consuming_buffers(const Buffers& buffers) - : buffers_(buffers), - at_end_(buffers_.begin() == buffers_.end()), - first_(*buffers_.begin()), - begin_remainder_(buffers_.begin()) - { - if (!at_end_) - ++begin_remainder_; - } - - // Copy constructor. - consuming_buffers(const consuming_buffers& other) - : buffers_(other.buffers_), - at_end_(other.at_end_), - first_(other.first_), - begin_remainder_(buffers_.begin()) - { - typename Buffers::const_iterator first = other.buffers_.begin(); - typename Buffers::const_iterator second = other.begin_remainder_; - std::advance(begin_remainder_, std::distance(first, second)); - } - - // Assignment operator. - consuming_buffers& operator=(const consuming_buffers& other) - { - buffers_ = other.buffers_; - at_end_ = other.at_end_; - first_ = other.first_; - begin_remainder_ = buffers_.begin(); - typename Buffers::const_iterator first = other.buffers_.begin(); - typename Buffers::const_iterator second = other.begin_remainder_; - std::advance(begin_remainder_, std::distance(first, second)); - return *this; - } - - // Get a forward-only iterator to the first element. - const_iterator begin() const - { - return const_iterator(at_end_, first_, begin_remainder_, buffers_.end()); - } - - // Get a forward-only iterator for one past the last element. - const_iterator end() const - { - return const_iterator(); - } - - // Consume the specified number of bytes from the buffers. - void consume(std::size_t size) - { - // Remove buffers from the start until the specified size is reached. - while (size > 0 && !at_end_) - { - if (buffer_size(first_) <= size) - { - size -= buffer_size(first_); - if (begin_remainder_ == buffers_.end()) - at_end_ = true; - else - first_ = *begin_remainder_++; - } - else - { - first_ = first_ + size; - size = 0; - } - } - - // Remove any more empty buffers at the start. - while (!at_end_ && buffer_size(first_) == 0) - { - if (begin_remainder_ == buffers_.end()) - at_end_ = true; - else - first_ = *begin_remainder_++; - } - } - -private: - Buffers buffers_; - bool at_end_; - Buffer first_; - typename Buffers::const_iterator begin_remainder_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_CONSUMING_BUFFERS_HPP diff --git a/libtorrent/include/asio/detail/deadline_timer_service.hpp b/libtorrent/include/asio/detail/deadline_timer_service.hpp deleted file mode 100644 index c5d15a5df..000000000 --- a/libtorrent/include/asio/detail/deadline_timer_service.hpp +++ /dev/null @@ -1,182 +0,0 @@ -// -// deadline_timer_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_DEADLINE_TIMER_SERVICE_HPP -#define ASIO_DETAIL_DEADLINE_TIMER_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/error.hpp" -#include "asio/io_service.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/detail/timer_queue.hpp" - -namespace asio { -namespace detail { - -template -class deadline_timer_service - : public asio::io_service::service -{ -public: - // The time type. - typedef typename Time_Traits::time_type time_type; - - // The duration type. - typedef typename Time_Traits::duration_type duration_type; - - // The implementation type of the timer. This type is dependent on the - // underlying implementation of the timer service. - struct implementation_type - : private asio::detail::noncopyable - { - time_type expiry; - bool might_have_pending_waits; - }; - - // Constructor. - deadline_timer_service(asio::io_service& io_service) - : asio::io_service::service(io_service), - scheduler_(asio::use_service(io_service)) - { - scheduler_.add_timer_queue(timer_queue_); - } - - // Destroy all user-defined handler objects owned by the service. - void shutdown_service() - { - } - - // Construct a new timer implementation. - void construct(implementation_type& impl) - { - impl.expiry = time_type(); - impl.might_have_pending_waits = false; - } - - // Destroy a timer implementation. - void destroy(implementation_type& impl) - { - cancel(impl); - } - - // Cancel any asynchronous wait operations associated with the timer. - std::size_t cancel(implementation_type& impl) - { - if (!impl.might_have_pending_waits) - return 0; - std::size_t count = scheduler_.cancel_timer(timer_queue_, &impl); - impl.might_have_pending_waits = false; - return count; - } - - // Get the expiry time for the timer as an absolute time. - time_type expires_at(const implementation_type& impl) const - { - return impl.expiry; - } - - // Set the expiry time for the timer as an absolute time. - std::size_t expires_at(implementation_type& impl, - const time_type& expiry_time) - { - std::size_t count = cancel(impl); - impl.expiry = expiry_time; - return count; - } - - // Get the expiry time for the timer relative to now. - duration_type expires_from_now(const implementation_type& impl) const - { - return Time_Traits::subtract(expires_at(impl), Time_Traits::now()); - } - - // Set the expiry time for the timer relative to now. - std::size_t expires_from_now(implementation_type& impl, - const duration_type& expiry_time) - { - return expires_at(impl, Time_Traits::add(Time_Traits::now(), expiry_time)); - } - - // Perform a blocking wait on the timer. - void wait(implementation_type& impl) - { - time_type now = Time_Traits::now(); - while (Time_Traits::less_than(now, impl.expiry)) - { - boost::posix_time::time_duration timeout = - Time_Traits::to_posix_duration(Time_Traits::subtract(impl.expiry, now)); - ::timeval tv; - tv.tv_sec = timeout.total_seconds(); - tv.tv_usec = timeout.total_microseconds() % 1000000; - socket_ops::select(0, 0, 0, 0, &tv); - now = Time_Traits::now(); - } - } - - template - class wait_handler - { - public: - wait_handler(asio::io_service& io_service, Handler handler) - : io_service_(io_service), - work_(io_service), - handler_(handler) - { - } - - void operator()(int result) - { - asio::error e(result); - io_service_.post(detail::bind_handler(handler_, e)); - } - - private: - asio::io_service& io_service_; - asio::io_service::work work_; - Handler handler_; - }; - - // Start an asynchronous wait on the timer. - template - void async_wait(implementation_type& impl, Handler handler) - { - impl.might_have_pending_waits = true; - scheduler_.schedule_timer(timer_queue_, impl.expiry, - wait_handler(io_service(), handler), &impl); - } - -private: - // The queue of timers. - timer_queue timer_queue_; - - // The object that schedules and executes timers. Usually a reactor. - Timer_Scheduler& scheduler_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_DEADLINE_TIMER_SERVICE_HPP diff --git a/libtorrent/include/asio/detail/epoll_reactor.hpp b/libtorrent/include/asio/detail/epoll_reactor.hpp deleted file mode 100644 index 5f46a93ba..000000000 --- a/libtorrent/include/asio/detail/epoll_reactor.hpp +++ /dev/null @@ -1,593 +0,0 @@ -// -// epoll_reactor.hpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_EPOLL_REACTOR_HPP -#define ASIO_DETAIL_EPOLL_REACTOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/epoll_reactor_fwd.hpp" - -#if defined(ASIO_HAS_EPOLL) - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/io_service.hpp" -#include "asio/system_exception.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/hash_map.hpp" -#include "asio/detail/mutex.hpp" -#include "asio/detail/task_io_service.hpp" -#include "asio/detail/thread.hpp" -#include "asio/detail/reactor_op_queue.hpp" -#include "asio/detail/select_interrupter.hpp" -#include "asio/detail/signal_blocker.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/detail/timer_queue.hpp" - -namespace asio { -namespace detail { - -template -class epoll_reactor - : public asio::io_service::service -{ -public: - // Constructor. - epoll_reactor(asio::io_service& io_service) - : asio::io_service::service(io_service), - mutex_(), - epoll_fd_(do_epoll_create()), - wait_in_progress_(false), - interrupter_(), - read_op_queue_(), - write_op_queue_(), - except_op_queue_(), - pending_cancellations_(), - stop_thread_(false), - thread_(0), - shutdown_(false) - { - // Start the reactor's internal thread only if needed. - if (Own_Thread) - { - asio::detail::signal_blocker sb; - thread_ = new asio::detail::thread( - bind_handler(&epoll_reactor::call_run_thread, this)); - } - - // Add the interrupter's descriptor to epoll. - epoll_event ev = { 0, { 0 } }; - ev.events = EPOLLIN | EPOLLERR; - ev.data.fd = interrupter_.read_descriptor(); - epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, interrupter_.read_descriptor(), &ev); - } - - // Destructor. - ~epoll_reactor() - { - shutdown_service(); - close(epoll_fd_); - } - - // Destroy all user-defined handler objects owned by the service. - void shutdown_service() - { - asio::detail::mutex::scoped_lock lock(mutex_); - shutdown_ = true; - stop_thread_ = true; - lock.unlock(); - - if (thread_) - { - interrupter_.interrupt(); - thread_->join(); - delete thread_; - thread_ = 0; - } - - read_op_queue_.destroy_operations(); - write_op_queue_.destroy_operations(); - except_op_queue_.destroy_operations(); - - for (std::size_t i = 0; i < timer_queues_.size(); ++i) - timer_queues_[i]->destroy_timers(); - timer_queues_.clear(); - } - - // Register a socket with the reactor. Returns 0 on success, system error - // code on failure. - int register_descriptor(socket_type descriptor) - { - // No need to lock according to epoll documentation. - - epoll_event ev = { 0, { 0 } }; - ev.events = 0; - ev.data.fd = descriptor; - int result = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, descriptor, &ev); - if (result != 0) - return errno; - return 0; - } - - // Start a new read operation. The handler object will be invoked when the - // given descriptor is ready to be read, or an error has occurred. - template - void start_read_op(socket_type descriptor, Handler handler) - { - asio::detail::mutex::scoped_lock lock(mutex_); - - if (shutdown_) - return; - - if (!read_op_queue_.has_operation(descriptor)) - if (handler(0)) - return; - - if (read_op_queue_.enqueue_operation(descriptor, handler)) - { - epoll_event ev = { 0, { 0 } }; - ev.events = EPOLLIN | EPOLLERR | EPOLLHUP; - if (write_op_queue_.has_operation(descriptor)) - ev.events |= EPOLLOUT; - if (except_op_queue_.has_operation(descriptor)) - ev.events |= EPOLLPRI; - ev.data.fd = descriptor; - - int result = epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, descriptor, &ev); - if (result != 0) - { - int error = errno; - read_op_queue_.dispatch_all_operations(descriptor, error); - } - } - } - - // Start a new write operation. The handler object will be invoked when the - // given descriptor is ready to be written, or an error has occurred. - template - void start_write_op(socket_type descriptor, Handler handler) - { - asio::detail::mutex::scoped_lock lock(mutex_); - - if (shutdown_) - return; - - if (!write_op_queue_.has_operation(descriptor)) - if (handler(0)) - return; - - if (write_op_queue_.enqueue_operation(descriptor, handler)) - { - epoll_event ev = { 0, { 0 } }; - ev.events = EPOLLOUT | EPOLLERR | EPOLLHUP; - if (read_op_queue_.has_operation(descriptor)) - ev.events |= EPOLLIN; - if (except_op_queue_.has_operation(descriptor)) - ev.events |= EPOLLPRI; - ev.data.fd = descriptor; - - int result = epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, descriptor, &ev); - if (result != 0) - { - int error = errno; - write_op_queue_.dispatch_all_operations(descriptor, error); - } - } - } - - // Start a new exception operation. The handler object will be invoked when - // the given descriptor has exception information, or an error has occurred. - template - void start_except_op(socket_type descriptor, Handler handler) - { - asio::detail::mutex::scoped_lock lock(mutex_); - - if (shutdown_) - return; - - if (except_op_queue_.enqueue_operation(descriptor, handler)) - { - epoll_event ev = { 0, { 0 } }; - ev.events = EPOLLPRI | EPOLLERR | EPOLLHUP; - if (read_op_queue_.has_operation(descriptor)) - ev.events |= EPOLLIN; - if (write_op_queue_.has_operation(descriptor)) - ev.events |= EPOLLOUT; - ev.data.fd = descriptor; - - int result = epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, descriptor, &ev); - if (result != 0) - { - int error = errno; - except_op_queue_.dispatch_all_operations(descriptor, error); - } - } - } - - // Start new write and exception operations. The handler object will be - // invoked when the given descriptor is ready for writing or has exception - // information available, or an error has occurred. - template - void start_write_and_except_ops(socket_type descriptor, Handler handler) - { - asio::detail::mutex::scoped_lock lock(mutex_); - - if (shutdown_) - return; - - bool need_mod = write_op_queue_.enqueue_operation(descriptor, handler); - need_mod = except_op_queue_.enqueue_operation(descriptor, handler) - && need_mod; - if (need_mod) - { - epoll_event ev = { 0, { 0 } }; - ev.events = EPOLLOUT | EPOLLPRI | EPOLLERR | EPOLLHUP; - if (read_op_queue_.has_operation(descriptor)) - ev.events |= EPOLLIN; - ev.data.fd = descriptor; - - int result = epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, descriptor, &ev); - if (result != 0) - { - int error = errno; - write_op_queue_.dispatch_all_operations(descriptor, error); - except_op_queue_.dispatch_all_operations(descriptor, error); - } - } - } - - // Cancel all operations associated with the given descriptor. The - // handlers associated with the descriptor will be invoked with the - // operation_aborted error. - void cancel_ops(socket_type descriptor) - { - asio::detail::mutex::scoped_lock lock(mutex_); - cancel_ops_unlocked(descriptor); - } - - // Enqueue cancellation of all operations associated with the given - // descriptor. The handlers associated with the descriptor will be invoked - // with the operation_aborted error. This function does not acquire the - // epoll_reactor's mutex, and so should only be used from within a reactor - // handler. - void enqueue_cancel_ops_unlocked(socket_type descriptor) - { - pending_cancellations_.push_back(descriptor); - } - - // Cancel any operations that are running against the descriptor and remove - // its registration from the reactor. - void close_descriptor(socket_type descriptor) - { - asio::detail::mutex::scoped_lock lock(mutex_); - - // Remove the descriptor from epoll. - epoll_event ev = { 0, { 0 } }; - epoll_ctl(epoll_fd_, EPOLL_CTL_DEL, descriptor, &ev); - - // Cancel any outstanding operations associated with the descriptor. - cancel_ops_unlocked(descriptor); - } - - // Add a new timer queue to the reactor. - template - void add_timer_queue(timer_queue& timer_queue) - { - asio::detail::mutex::scoped_lock lock(mutex_); - timer_queues_.push_back(&timer_queue); - } - - // Schedule a timer in the given timer queue to expire at the specified - // absolute time. The handler object will be invoked when the timer expires. - template - void schedule_timer(timer_queue& timer_queue, - const typename Time_Traits::time_type& time, Handler handler, void* token) - { - asio::detail::mutex::scoped_lock lock(mutex_); - if (!shutdown_) - if (timer_queue.enqueue_timer(time, handler, token)) - interrupter_.interrupt(); - } - - // Cancel the timer associated with the given token. Returns the number of - // handlers that have been posted or dispatched. - template - std::size_t cancel_timer(timer_queue& timer_queue, void* token) - { - asio::detail::mutex::scoped_lock lock(mutex_); - return timer_queue.cancel_timer(token); - } - -private: - friend class task_io_service >; - - // Run epoll once until interrupted or events are ready to be dispatched. - void run(bool block) - { - asio::detail::mutex::scoped_lock lock(mutex_); - - // Dispatch any operation cancellations that were made while the select - // loop was not running. - read_op_queue_.dispatch_cancellations(); - write_op_queue_.dispatch_cancellations(); - except_op_queue_.dispatch_cancellations(); - - // Check if the thread is supposed to stop. - if (stop_thread_) - { - // Clean up operations. We must not hold the lock since the operations may - // make calls back into this reactor. - lock.unlock(); - read_op_queue_.cleanup_operations(); - write_op_queue_.cleanup_operations(); - except_op_queue_.cleanup_operations(); - return; - } - - // We can return immediately if there's no work to do and the reactor is - // not supposed to block. - if (!block && read_op_queue_.empty() && write_op_queue_.empty() - && except_op_queue_.empty() && all_timer_queues_are_empty()) - { - // Clean up operations. We must not hold the lock since the operations may - // make calls back into this reactor. - lock.unlock(); - read_op_queue_.cleanup_operations(); - write_op_queue_.cleanup_operations(); - except_op_queue_.cleanup_operations(); - return; - } - - int timeout = block ? get_timeout() : 0; - wait_in_progress_ = true; - lock.unlock(); - - // Block on the epoll descriptor. - epoll_event events[128]; - int num_events = epoll_wait(epoll_fd_, events, 128, timeout); - - lock.lock(); - wait_in_progress_ = false; - - // Block signals while dispatching operations. - asio::detail::signal_blocker sb; - - // Dispatch the waiting events. - for (int i = 0; i < num_events; ++i) - { - int descriptor = events[i].data.fd; - if (descriptor == interrupter_.read_descriptor()) - { - interrupter_.reset(); - } - else - { - if (events[i].events & (EPOLLERR | EPOLLHUP)) - { - except_op_queue_.dispatch_all_operations(descriptor, 0); - read_op_queue_.dispatch_all_operations(descriptor, 0); - write_op_queue_.dispatch_all_operations(descriptor, 0); - - epoll_event ev = { 0, { 0 } }; - ev.events = 0; - ev.data.fd = descriptor; - epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, descriptor, &ev); - } - else - { - bool more_reads = false; - bool more_writes = false; - bool more_except = false; - - // Exception operations must be processed first to ensure that any - // out-of-band data is read before normal data. - if (events[i].events & EPOLLPRI) - more_except = except_op_queue_.dispatch_operation(descriptor, 0); - else - more_except = except_op_queue_.has_operation(descriptor); - - if (events[i].events & EPOLLIN) - more_reads = read_op_queue_.dispatch_operation(descriptor, 0); - else - more_reads = read_op_queue_.has_operation(descriptor); - - if (events[i].events & EPOLLOUT) - more_writes = write_op_queue_.dispatch_operation(descriptor, 0); - else - more_writes = write_op_queue_.has_operation(descriptor); - - epoll_event ev = { 0, { 0 } }; - ev.events = EPOLLERR | EPOLLHUP; - if (more_reads) - ev.events |= EPOLLIN; - if (more_writes) - ev.events |= EPOLLOUT; - if (more_except) - ev.events |= EPOLLPRI; - ev.data.fd = descriptor; - int result = epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, descriptor, &ev); - if (result != 0) - { - int error = errno; - read_op_queue_.dispatch_all_operations(descriptor, error); - write_op_queue_.dispatch_all_operations(descriptor, error); - except_op_queue_.dispatch_all_operations(descriptor, error); - } - } - } - } - read_op_queue_.dispatch_cancellations(); - write_op_queue_.dispatch_cancellations(); - except_op_queue_.dispatch_cancellations(); - for (std::size_t i = 0; i < timer_queues_.size(); ++i) - timer_queues_[i]->dispatch_timers(); - - // Issue any pending cancellations. - for (size_t i = 0; i < pending_cancellations_.size(); ++i) - cancel_ops_unlocked(pending_cancellations_[i]); - pending_cancellations_.clear(); - - // Clean up operations. We must not hold the lock since the operations may - // make calls back into this reactor. - lock.unlock(); - read_op_queue_.cleanup_operations(); - write_op_queue_.cleanup_operations(); - except_op_queue_.cleanup_operations(); - } - - // Run the select loop in the thread. - void run_thread() - { - asio::detail::mutex::scoped_lock lock(mutex_); - while (!stop_thread_) - { - lock.unlock(); - run(true); - lock.lock(); - } - } - - // Entry point for the select loop thread. - static void call_run_thread(epoll_reactor* reactor) - { - reactor->run_thread(); - } - - // Interrupt the select loop. - void interrupt() - { - interrupter_.interrupt(); - } - - // The hint to pass to epoll_create to size its data structures. - enum { epoll_size = 20000 }; - - // Create the epoll file descriptor. Throws an exception if the descriptor - // cannot be created. - static int do_epoll_create() - { - int fd = epoll_create(epoll_size); - if (fd == -1) - { - system_exception e("epoll", errno); - boost::throw_exception(e); - } - return fd; - } - - // Check if all timer queues are empty. - bool all_timer_queues_are_empty() const - { - for (std::size_t i = 0; i < timer_queues_.size(); ++i) - if (!timer_queues_[i]->empty()) - return false; - return true; - } - - // Get the timeout value for the epoll_wait call. The timeout value is - // returned as a number of milliseconds. A return value of -1 indicates - // that epoll_wait should block indefinitely. - int get_timeout() - { - if (all_timer_queues_are_empty()) - return -1; - - // By default we will wait no longer than 5 minutes. This will ensure that - // any changes to the system clock are detected after no longer than this. - boost::posix_time::time_duration minimum_wait_duration - = boost::posix_time::minutes(5); - - for (std::size_t i = 0; i < timer_queues_.size(); ++i) - { - boost::posix_time::time_duration wait_duration - = timer_queues_[i]->wait_duration(); - if (wait_duration < minimum_wait_duration) - minimum_wait_duration = wait_duration; - } - - if (minimum_wait_duration > boost::posix_time::time_duration()) - { - return minimum_wait_duration.total_milliseconds(); - } - else - { - return 0; - } - } - - // Cancel all operations associated with the given descriptor. The do_cancel - // function of the handler objects will be invoked. This function does not - // acquire the epoll_reactor's mutex. - void cancel_ops_unlocked(socket_type descriptor) - { - bool interrupt = read_op_queue_.cancel_operations(descriptor); - interrupt = write_op_queue_.cancel_operations(descriptor) || interrupt; - interrupt = except_op_queue_.cancel_operations(descriptor) || interrupt; - if (interrupt) - interrupter_.interrupt(); - } - - // Mutex to protect access to internal data. - asio::detail::mutex mutex_; - - // The epoll file descriptor. - int epoll_fd_; - - // Whether the epoll_wait call is currently in progress - bool wait_in_progress_; - - // The interrupter is used to break a blocking epoll_wait call. - select_interrupter interrupter_; - - // The queue of read operations. - reactor_op_queue read_op_queue_; - - // The queue of write operations. - reactor_op_queue write_op_queue_; - - // The queue of except operations. - reactor_op_queue except_op_queue_; - - // The timer queues. - std::vector timer_queues_; - - // The descriptors that are pending cancellation. - std::vector pending_cancellations_; - - // Does the reactor loop thread need to stop. - bool stop_thread_; - - // The thread that is running the reactor loop. - asio::detail::thread* thread_; - - // Whether the service has been shut down. - bool shutdown_; -}; - -} // namespace detail -} // namespace asio - -#endif // defined(ASIO_HAS_EPOLL) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_EPOLL_REACTOR_HPP diff --git a/libtorrent/include/asio/detail/epoll_reactor_fwd.hpp b/libtorrent/include/asio/detail/epoll_reactor_fwd.hpp deleted file mode 100644 index 5a60b759b..000000000 --- a/libtorrent/include/asio/detail/epoll_reactor_fwd.hpp +++ /dev/null @@ -1,47 +0,0 @@ -// -// epoll_reactor_fwd.hpp -// ~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_EPOLL_REACTOR_FWD_HPP -#define ASIO_DETAIL_EPOLL_REACTOR_FWD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#if !defined(ASIO_DISABLE_EPOLL) -#if defined(__linux__) // This service is only supported on Linux. - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#if LINUX_VERSION_CODE >= KERNEL_VERSION (2,5,45) // Only kernels >= 2.5.45. - -// Define this to indicate that epoll is supported on the target platform. -#define ASIO_HAS_EPOLL 1 - -namespace asio { -namespace detail { - -template -class epoll_reactor; - -} // namespace detail -} // namespace asio - -#endif // LINUX_VERSION_CODE >= KERNEL_VERSION (2,5,45) -#endif // defined(__linux__) -#endif // !defined(ASIO_DISABLE_EPOLL) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_EPOLL_REACTOR_FWD_HPP diff --git a/libtorrent/include/asio/detail/event.hpp b/libtorrent/include/asio/detail/event.hpp deleted file mode 100644 index 8f8b753e7..000000000 --- a/libtorrent/include/asio/detail/event.hpp +++ /dev/null @@ -1,50 +0,0 @@ -// -// event.hpp -// ~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_EVENT_HPP -#define ASIO_DETAIL_EVENT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#if !defined(BOOST_HAS_THREADS) -# include "asio/detail/null_event.hpp" -#elif defined(BOOST_WINDOWS) -# include "asio/detail/win_event.hpp" -#elif defined(BOOST_HAS_PTHREADS) -# include "asio/detail/posix_event.hpp" -#else -# error Only Windows and POSIX are supported! -#endif - -namespace asio { -namespace detail { - -#if !defined(BOOST_HAS_THREADS) -typedef null_event event; -#elif defined(BOOST_WINDOWS) -typedef win_event event; -#elif defined(BOOST_HAS_PTHREADS) -typedef posix_event event; -#endif - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_EVENT_HPP diff --git a/libtorrent/include/asio/detail/fd_set_adapter.hpp b/libtorrent/include/asio/detail/fd_set_adapter.hpp deleted file mode 100644 index 5266dd68c..000000000 --- a/libtorrent/include/asio/detail/fd_set_adapter.hpp +++ /dev/null @@ -1,41 +0,0 @@ -// -// fd_set_adapter.hpp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_FD_SET_ADAPTER_HPP -#define ASIO_DETAIL_FD_SET_ADAPTER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/detail/posix_fd_set_adapter.hpp" -#include "asio/detail/win_fd_set_adapter.hpp" - -namespace asio { -namespace detail { - -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) -typedef win_fd_set_adapter fd_set_adapter; -#else -typedef posix_fd_set_adapter fd_set_adapter; -#endif - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_FD_SET_ADAPTER_HPP diff --git a/libtorrent/include/asio/detail/handler_alloc_helpers.hpp b/libtorrent/include/asio/detail/handler_alloc_helpers.hpp deleted file mode 100644 index d78c7e6af..000000000 --- a/libtorrent/include/asio/detail/handler_alloc_helpers.hpp +++ /dev/null @@ -1,256 +0,0 @@ -// -// handler_alloc_helpers.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_HANDLER_ALLOC_HELPERS_HPP -#define ASIO_DETAIL_HANDLER_ALLOC_HELPERS_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/handler_alloc_hook.hpp" -#include "asio/detail/noncopyable.hpp" - -// Calls to asio_handler_allocate and asio_handler_deallocate must be made from -// a namespace that does not contain any overloads of these functions. The -// asio_handler_alloc_helpers namespace is defined here for that purpose. -namespace asio_handler_alloc_helpers { - -template -inline void* allocate(std::size_t s, Handler* h) -{ -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) - return ::operator new(s); -#else - using namespace asio; - return asio_handler_allocate(s, h); -#endif -} - -template -inline void deallocate(void* p, std::size_t s, Handler* h) -{ -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) - ::operator delete(p); -#else - using namespace asio; - asio_handler_deallocate(p, s, h); -#endif -} - -} // namespace asio_handler_alloc_helpers - -namespace asio { -namespace detail { - -// Traits for handler allocation. -template -struct handler_alloc_traits -{ - typedef Handler handler_type; - typedef Object value_type; - typedef Object* pointer_type; - BOOST_STATIC_CONSTANT(std::size_t, value_size = sizeof(Object)); -}; - -template -class handler_ptr; - -// Helper class to provide RAII on uninitialised handler memory. -template -class raw_handler_ptr - : private noncopyable -{ -public: - typedef typename Alloc_Traits::handler_type handler_type; - typedef typename Alloc_Traits::value_type value_type; - typedef typename Alloc_Traits::pointer_type pointer_type; - BOOST_STATIC_CONSTANT(std::size_t, value_size = Alloc_Traits::value_size); - - // Constructor allocates the memory. - raw_handler_ptr(handler_type& handler) - : handler_(handler), - pointer_(static_cast( - asio_handler_alloc_helpers::allocate(value_size, &handler_))) - { - } - - // Destructor automatically deallocates memory, unless it has been stolen by - // a handler_ptr object. - ~raw_handler_ptr() - { - if (pointer_) - asio_handler_alloc_helpers::deallocate( - pointer_, value_size, &handler_); - } - -private: - friend class handler_ptr; - handler_type& handler_; - pointer_type pointer_; -}; - -// Helper class to provide RAII on uninitialised handler memory. -template -class handler_ptr - : private noncopyable -{ -public: - typedef typename Alloc_Traits::handler_type handler_type; - typedef typename Alloc_Traits::value_type value_type; - typedef typename Alloc_Traits::pointer_type pointer_type; - BOOST_STATIC_CONSTANT(std::size_t, value_size = Alloc_Traits::value_size); - typedef raw_handler_ptr raw_ptr_type; - - // Take ownership of existing memory. - handler_ptr(handler_type& handler, pointer_type pointer) - : handler_(handler), - pointer_(pointer) - { - } - - // Construct object in raw memory and take ownership if construction succeeds. - handler_ptr(raw_ptr_type& raw_ptr) - : handler_(raw_ptr.handler_), - pointer_(new (raw_ptr.pointer_) value_type) - { - raw_ptr.pointer_ = 0; - } - - // Construct object in raw memory and take ownership if construction succeeds. - template - handler_ptr(raw_ptr_type& raw_ptr, Arg1& a1) - : handler_(raw_ptr.handler_), - pointer_(new (raw_ptr.pointer_) value_type(a1)) - { - raw_ptr.pointer_ = 0; - } - - // Construct object in raw memory and take ownership if construction succeeds. - template - handler_ptr(raw_ptr_type& raw_ptr, Arg1& a1, Arg2& a2) - : handler_(raw_ptr.handler_), - pointer_(new (raw_ptr.pointer_) value_type(a1, a2)) - { - raw_ptr.pointer_ = 0; - } - - // Construct object in raw memory and take ownership if construction succeeds. - template - handler_ptr(raw_ptr_type& raw_ptr, Arg1& a1, Arg2& a2, Arg3& a3) - : handler_(raw_ptr.handler_), - pointer_(new (raw_ptr.pointer_) value_type(a1, a2, a3)) - { - raw_ptr.pointer_ = 0; - } - - // Construct object in raw memory and take ownership if construction succeeds. - template - handler_ptr(raw_ptr_type& raw_ptr, Arg1& a1, Arg2& a2, Arg3& a3, Arg4& a4) - : handler_(raw_ptr.handler_), - pointer_(new (raw_ptr.pointer_) value_type(a1, a2, a3, a4)) - { - raw_ptr.pointer_ = 0; - } - - // Construct object in raw memory and take ownership if construction succeeds. - template - handler_ptr(raw_ptr_type& raw_ptr, Arg1& a1, Arg2& a2, Arg3& a3, Arg4& a4, - Arg5& a5) - : handler_(raw_ptr.handler_), - pointer_(new (raw_ptr.pointer_) value_type(a1, a2, a3, a4, a5)) - { - raw_ptr.pointer_ = 0; - } - - // Construct object in raw memory and take ownership if construction succeeds. - template - handler_ptr(raw_ptr_type& raw_ptr, Arg1& a1, Arg2& a2, Arg3& a3, Arg4& a4, - Arg5& a5, Arg6& a6) - : handler_(raw_ptr.handler_), - pointer_(new (raw_ptr.pointer_) value_type(a1, a2, a3, a4, a5, a6)) - { - raw_ptr.pointer_ = 0; - } - - // Construct object in raw memory and take ownership if construction succeeds. - template - handler_ptr(raw_ptr_type& raw_ptr, Arg1& a1, Arg2& a2, Arg3& a3, Arg4& a4, - Arg5& a5, Arg6& a6, Arg7& a7) - : handler_(raw_ptr.handler_), - pointer_(new (raw_ptr.pointer_) value_type(a1, a2, a3, a4, a5, a6, a7)) - { - raw_ptr.pointer_ = 0; - } - - // Construct object in raw memory and take ownership if construction succeeds. - template - handler_ptr(raw_ptr_type& raw_ptr, Arg1& a1, Arg2& a2, Arg3& a3, Arg4& a4, - Arg5& a5, Arg6& a6, Arg7& a7, Arg8& a8) - : handler_(raw_ptr.handler_), - pointer_(new (raw_ptr.pointer_) value_type( - a1, a2, a3, a4, a5, a6, a7, a8)) - { - raw_ptr.pointer_ = 0; - } - - // Destructor automatically deallocates memory, unless it has been released. - ~handler_ptr() - { - reset(); - } - - // Get the memory. - pointer_type get() const - { - return pointer_; - } - - // Release ownership of the memory. - pointer_type release() - { - pointer_type tmp = pointer_; - pointer_ = 0; - return tmp; - } - - // Explicitly destroy and deallocate the memory. - void reset() - { - if (pointer_) - { - pointer_->value_type::~value_type(); - asio_handler_alloc_helpers::deallocate( - pointer_, value_size, &handler_); - pointer_ = 0; - } - } - -private: - handler_type& handler_; - pointer_type pointer_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_HANDLER_ALLOC_HELPERS_HPP diff --git a/libtorrent/include/asio/detail/handler_invoke_helpers.hpp b/libtorrent/include/asio/detail/handler_invoke_helpers.hpp deleted file mode 100644 index 6045122c4..000000000 --- a/libtorrent/include/asio/detail/handler_invoke_helpers.hpp +++ /dev/null @@ -1,47 +0,0 @@ -// -// handler_invoke_helpers.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_HANDLER_INVOKE_HELPERS_HPP -#define ASIO_DETAIL_HANDLER_INVOKE_HELPERS_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/handler_invoke_hook.hpp" - -// Calls to asio_handler_invoke must be made from a namespace that does not -// contain overloads of this function. The asio_handler_invoke_helpers -// namespace is defined here for that purpose. -namespace asio_handler_invoke_helpers { - -template -inline void invoke(const Function& function, Context* context) -{ -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) - Function tmp(function); - tmp(); -#else - using namespace asio; - asio_handler_invoke(function, context); -#endif -} - -} // namespace asio_handler_invoke_helpers - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_HANDLER_INVOKE_HELPERS_HPP diff --git a/libtorrent/include/asio/detail/hash_map.hpp b/libtorrent/include/asio/detail/hash_map.hpp deleted file mode 100644 index c68d78d34..000000000 --- a/libtorrent/include/asio/detail/hash_map.hpp +++ /dev/null @@ -1,197 +0,0 @@ -// -// hash_map.hpp -// ~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_HASH_MAP_HPP -#define ASIO_DETAIL_HASH_MAP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/detail/noncopyable.hpp" - -namespace asio { -namespace detail { - -using boost::hash_value; - -template -class hash_map - : private noncopyable -{ -public: - // The type of a value in the map. - typedef std::pair value_type; - - // The type of a non-const iterator over the hash map. - typedef typename std::list::iterator iterator; - - // The type of a const iterator over the hash map. - typedef typename std::list::const_iterator const_iterator; - - // Constructor. - hash_map() - { - // Initialise all buckets to empty. - for (size_t i = 0; i < num_buckets; ++i) - buckets_[i].first = buckets_[i].last = values_.end(); - } - - // Get an iterator for the beginning of the map. - iterator begin() - { - return values_.begin(); - } - - // Get an iterator for the beginning of the map. - const_iterator begin() const - { - return values_.begin(); - } - - // Get an iterator for the end of the map. - iterator end() - { - return values_.end(); - } - - // Get an iterator for the end of the map. - const_iterator end() const - { - return values_.end(); - } - - // Check whether the map is empty. - bool empty() const - { - return values_.empty(); - } - - // Find an entry in the map. - iterator find(const K& k) - { - size_t bucket = hash_value(k) % num_buckets; - iterator it = buckets_[bucket].first; - if (it == values_.end()) - return values_.end(); - iterator end = buckets_[bucket].last; - ++end; - while (it != end) - { - if (it->first == k) - return it; - ++it; - } - return values_.end(); - } - - // Find an entry in the map. - const_iterator find(const K& k) const - { - size_t bucket = hash_value(k) % num_buckets; - const_iterator it = buckets_[bucket].first; - if (it == values_.end()) - return it; - const_iterator end = buckets_[bucket].last; - ++end; - while (it != end) - { - if (it->first == k) - return it; - ++it; - } - return values_.end(); - } - - // Insert a new entry into the map. - std::pair insert(const value_type& v) - { - size_t bucket = hash_value(v.first) % num_buckets; - iterator it = buckets_[bucket].first; - if (it == values_.end()) - { - buckets_[bucket].first = buckets_[bucket].last = - values_.insert(values_.end(), v); - return std::pair(buckets_[bucket].last, true); - } - iterator end = buckets_[bucket].last; - ++end; - while (it != end) - { - if (it->first == v.first) - return std::pair(it, false); - ++it; - } - buckets_[bucket].last = values_.insert(end, v); - return std::pair(buckets_[bucket].last, true); - } - - // Erase an entry from the map. - void erase(iterator it) - { - assert(it != values_.end()); - - size_t bucket = hash_value(it->first) % num_buckets; - bool is_first = (it == buckets_[bucket].first); - bool is_last = (it == buckets_[bucket].last); - if (is_first && is_last) - buckets_[bucket].first = buckets_[bucket].last = values_.end(); - else if (is_first) - ++buckets_[bucket].first; - else if (is_last) - --buckets_[bucket].last; - - values_.erase(it); - } - - // Remove all entries from the map. - void clear() - { - // Clear the values. - values_.clear(); - - // Initialise all buckets to empty. - for (size_t i = 0; i < num_buckets; ++i) - buckets_[i].first = buckets_[i].last = values_.end(); - } - -private: - // The list of all values in the hash map. - std::list values_; - - // The type for a bucket in the hash table. - struct bucket_type - { - iterator first; - iterator last; - }; - - // The number of buckets in the hash. - enum { num_buckets = 1021 }; - - // The buckets in the hash. - bucket_type buckets_[num_buckets]; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_HASH_MAP_HPP diff --git a/libtorrent/include/asio/detail/io_control.hpp b/libtorrent/include/asio/detail/io_control.hpp deleted file mode 100644 index ee9e8ac9f..000000000 --- a/libtorrent/include/asio/detail/io_control.hpp +++ /dev/null @@ -1,137 +0,0 @@ -// -// io_control.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_IO_CONTROL_HPP -#define ASIO_DETAIL_IO_CONTROL_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/detail/socket_types.hpp" - -namespace asio { -namespace detail { -namespace io_control { - -// IO control command for non-blocking I/O. -class non_blocking_io -{ -public: - // Default constructor. - non_blocking_io() - : value_(0) - { - } - - // Construct with a specific command value. - non_blocking_io(bool value) - : value_(value ? 1 : 0) - { - } - - // Get the name of the IO control command. - int name() const - { - return FIONBIO; - } - - // Set the value of the I/O control command. - void set(bool value) - { - value_ = value ? 1 : 0; - } - - // Get the current value of the I/O control command. - bool get() const - { - return value_ != 0; - } - - // Get the address of the command data. - detail::ioctl_arg_type* data() - { - return &value_; - } - - // Get the address of the command data. - const detail::ioctl_arg_type* data() const - { - return &value_; - } - -private: - detail::ioctl_arg_type value_; -}; - -// I/O control command for getting number of bytes available. -class bytes_readable -{ -public: - // Default constructor. - bytes_readable() - : value_(0) - { - } - - // Construct with a specific command value. - bytes_readable(std::size_t value) - : value_(value) - { - } - - // Get the name of the IO control command. - int name() const - { - return FIONREAD; - } - - // Set the value of the I/O control command. - void set(std::size_t value) - { - value_ = static_cast(value); - } - - // Get the current value of the I/O control command. - std::size_t get() const - { - return static_cast(value_); - } - - // Get the address of the command data. - detail::ioctl_arg_type* data() - { - return &value_; - } - - // Get the address of the command data. - const detail::ioctl_arg_type* data() const - { - return &value_; - } - -private: - detail::ioctl_arg_type value_; -}; - -} // namespace io_control -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_IO_CONTROL_HPP diff --git a/libtorrent/include/asio/detail/kqueue_reactor.hpp b/libtorrent/include/asio/detail/kqueue_reactor.hpp deleted file mode 100644 index 51cabbc0a..000000000 --- a/libtorrent/include/asio/detail/kqueue_reactor.hpp +++ /dev/null @@ -1,596 +0,0 @@ -// -// kqueue_reactor.hpp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2005 Stefan Arentz (stefan at soze dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_KQUEUE_REACTOR_HPP -#define ASIO_DETAIL_KQUEUE_REACTOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/kqueue_reactor_fwd.hpp" - -#if defined(ASIO_HAS_KQUEUE) - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include -#include -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/io_service.hpp" -#include "asio/system_exception.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/mutex.hpp" -#include "asio/detail/task_io_service.hpp" -#include "asio/detail/thread.hpp" -#include "asio/detail/reactor_op_queue.hpp" -#include "asio/detail/select_interrupter.hpp" -#include "asio/detail/signal_blocker.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/detail/timer_queue.hpp" - -// Older versions of Mac OS X may not define EV_OOBAND. -#if !defined(EV_OOBAND) -# define EV_OOBAND EV_FLAG1 -#endif // !defined(EV_OOBAND) - -namespace asio { -namespace detail { - -template -class kqueue_reactor - : public asio::io_service::service -{ -public: - // Constructor. - kqueue_reactor(asio::io_service& io_service) - : asio::io_service::service(io_service), - mutex_(), - kqueue_fd_(do_kqueue_create()), - wait_in_progress_(false), - interrupter_(), - read_op_queue_(), - write_op_queue_(), - except_op_queue_(), - pending_cancellations_(), - stop_thread_(false), - thread_(0), - shutdown_(false) - { - // Start the reactor's internal thread only if needed. - if (Own_Thread) - { - asio::detail::signal_blocker sb; - thread_ = new asio::detail::thread( - bind_handler(&kqueue_reactor::call_run_thread, this)); - } - - // Add the interrupter's descriptor to the kqueue. - struct kevent event; - EV_SET(&event, interrupter_.read_descriptor(), - EVFILT_READ, EV_ADD, 0, 0, 0); - ::kevent(kqueue_fd_, &event, 1, 0, 0, 0); - } - - // Destructor. - ~kqueue_reactor() - { - shutdown_service(); - close(kqueue_fd_); - } - - // Destroy all user-defined handler objects owned by the service. - void shutdown_service() - { - asio::detail::mutex::scoped_lock lock(mutex_); - shutdown_ = true; - stop_thread_ = true; - lock.unlock(); - - if (thread_) - { - interrupter_.interrupt(); - thread_->join(); - delete thread_; - thread_ = 0; - } - - read_op_queue_.destroy_operations(); - write_op_queue_.destroy_operations(); - except_op_queue_.destroy_operations(); - - for (std::size_t i = 0; i < timer_queues_.size(); ++i) - timer_queues_[i]->destroy_timers(); - timer_queues_.clear(); - } - - // Register a socket with the reactor. Returns 0 on success, system error - // code on failure. - int register_descriptor(socket_type) - { - return 0; - } - - // Start a new read operation. The handler object will be invoked when the - // given descriptor is ready to be read, or an error has occurred. - template - void start_read_op(socket_type descriptor, Handler handler) - { - asio::detail::mutex::scoped_lock lock(mutex_); - - if (shutdown_) - return; - - if (!read_op_queue_.has_operation(descriptor)) - if (handler(0)) - return; - - if (read_op_queue_.enqueue_operation(descriptor, handler)) - { - struct kevent event; - EV_SET(&event, descriptor, EVFILT_READ, EV_ADD, 0, 0, 0); - if (::kevent(kqueue_fd_, &event, 1, 0, 0, 0) == -1) - { - int error = errno; - read_op_queue_.dispatch_all_operations(descriptor, error); - } - } - } - - // Start a new write operation. The handler object will be invoked when the - // given descriptor is ready to be written, or an error has occurred. - template - void start_write_op(socket_type descriptor, Handler handler) - { - asio::detail::mutex::scoped_lock lock(mutex_); - - if (shutdown_) - return; - - if (!write_op_queue_.has_operation(descriptor)) - if (handler(0)) - return; - - if (write_op_queue_.enqueue_operation(descriptor, handler)) - { - struct kevent event; - EV_SET(&event, descriptor, EVFILT_WRITE, EV_ADD, 0, 0, 0); - if (::kevent(kqueue_fd_, &event, 1, 0, 0, 0) == -1) - { - int error = errno; - write_op_queue_.dispatch_all_operations(descriptor, error); - } - } - } - - // Start a new exception operation. The handler object will be invoked when - // the given descriptor has exception information, or an error has occurred. - template - void start_except_op(socket_type descriptor, Handler handler) - { - asio::detail::mutex::scoped_lock lock(mutex_); - - if (shutdown_) - return; - - if (except_op_queue_.enqueue_operation(descriptor, handler)) - { - struct kevent event; - if (read_op_queue_.has_operation(descriptor)) - EV_SET(&event, descriptor, EVFILT_READ, EV_ADD, 0, 0, 0); - else - EV_SET(&event, descriptor, EVFILT_READ, EV_ADD, EV_OOBAND, 0, 0); - if (::kevent(kqueue_fd_, &event, 1, 0, 0, 0) == -1) - { - int error = errno; - except_op_queue_.dispatch_all_operations(descriptor, error); - } - } - } - - // Start new write and exception operations. The handler object will be - // invoked when the given descriptor is ready for writing or has exception - // information available, or an error has occurred. - template - void start_write_and_except_ops(socket_type descriptor, Handler handler) - { - asio::detail::mutex::scoped_lock lock(mutex_); - - if (shutdown_) - return; - - if (write_op_queue_.enqueue_operation(descriptor, handler)) - { - struct kevent event; - EV_SET(&event, descriptor, EVFILT_WRITE, EV_ADD, 0, 0, 0); - if (::kevent(kqueue_fd_, &event, 1, 0, 0, 0) == -1) - { - int error = errno; - write_op_queue_.dispatch_all_operations(descriptor, error); - } - } - - if (except_op_queue_.enqueue_operation(descriptor, handler)) - { - struct kevent event; - if (read_op_queue_.has_operation(descriptor)) - EV_SET(&event, descriptor, EVFILT_READ, EV_ADD, 0, 0, 0); - else - EV_SET(&event, descriptor, EVFILT_READ, EV_ADD, EV_OOBAND, 0, 0); - if (::kevent(kqueue_fd_, &event, 1, 0, 0, 0) == -1) - { - int error = errno; - except_op_queue_.dispatch_all_operations(descriptor, error); - write_op_queue_.dispatch_all_operations(descriptor, error); - } - } - } - - // Cancel all operations associated with the given descriptor. The - // handlers associated with the descriptor will be invoked with the - // operation_aborted error. - void cancel_ops(socket_type descriptor) - { - asio::detail::mutex::scoped_lock lock(mutex_); - cancel_ops_unlocked(descriptor); - } - - // Enqueue cancellation of all operations associated with the given - // descriptor. The handlers associated with the descriptor will be invoked - // with the operation_aborted error. This function does not acquire the - // kqueue_reactor's mutex, and so should only be used from within a reactor - // handler. - void enqueue_cancel_ops_unlocked(socket_type descriptor) - { - pending_cancellations_.push_back(descriptor); - } - - // Cancel any operations that are running against the descriptor and remove - // its registration from the reactor. - void close_descriptor(socket_type descriptor) - { - asio::detail::mutex::scoped_lock lock(mutex_); - - // Remove the descriptor from kqueue. - struct kevent event[2]; - EV_SET(&event[0], descriptor, EVFILT_READ, EV_DELETE, 0, 0, 0); - EV_SET(&event[1], descriptor, EVFILT_WRITE, EV_DELETE, 0, 0, 0); - ::kevent(kqueue_fd_, event, 2, 0, 0, 0); - - // Cancel any outstanding operations associated with the descriptor. - cancel_ops_unlocked(descriptor); - } - - // Add a new timer queue to the reactor. - template - void add_timer_queue(timer_queue& timer_queue) - { - asio::detail::mutex::scoped_lock lock(mutex_); - timer_queues_.push_back(&timer_queue); - } - - // Schedule a timer in the given timer queue to expire at the specified - // absolute time. The handler object will be invoked when the timer expires. - template - void schedule_timer(timer_queue& timer_queue, - const typename Time_Traits::time_type& time, Handler handler, void* token) - { - asio::detail::mutex::scoped_lock lock(mutex_); - if (!shutdown_) - if (timer_queue.enqueue_timer(time, handler, token)) - interrupter_.interrupt(); - } - - // Cancel the timer associated with the given token. Returns the number of - // handlers that have been posted or dispatched. - template - std::size_t cancel_timer(timer_queue& timer_queue, void* token) - { - asio::detail::mutex::scoped_lock lock(mutex_); - return timer_queue.cancel_timer(token); - } - -private: - friend class task_io_service >; - - // Run the kqueue loop. - void run(bool block) - { - asio::detail::mutex::scoped_lock lock(mutex_); - - // Dispatch any operation cancellations that were made while the select - // loop was not running. - read_op_queue_.dispatch_cancellations(); - write_op_queue_.dispatch_cancellations(); - except_op_queue_.dispatch_cancellations(); - - // Check if the thread is supposed to stop. - if (stop_thread_) - { - // Clean up operations. We must not hold the lock since the operations may - // make calls back into this reactor. - lock.unlock(); - read_op_queue_.cleanup_operations(); - write_op_queue_.cleanup_operations(); - except_op_queue_.cleanup_operations(); - return; - } - - // We can return immediately if there's no work to do and the reactor is - // not supposed to block. - if (!block && read_op_queue_.empty() && write_op_queue_.empty() - && except_op_queue_.empty() && all_timer_queues_are_empty()) - { - // Clean up operations. We must not hold the lock since the operations may - // make calls back into this reactor. - lock.unlock(); - read_op_queue_.cleanup_operations(); - write_op_queue_.cleanup_operations(); - except_op_queue_.cleanup_operations(); - return; - } - - // Determine how long to block while waiting for events. - timespec timeout_buf = { 0, 0 }; - timespec* timeout = block ? get_timeout(timeout_buf) : &timeout_buf; - - wait_in_progress_ = true; - lock.unlock(); - - // Block on the kqueue descriptor. - struct kevent events[128]; - int num_events = kevent(kqueue_fd_, 0, 0, events, 128, timeout); - - lock.lock(); - wait_in_progress_ = false; - - // Block signals while dispatching operations. - asio::detail::signal_blocker sb; - - // Dispatch the waiting events. - for (int i = 0; i < num_events; ++i) - { - int descriptor = events[i].ident; - if (descriptor == interrupter_.read_descriptor()) - { - interrupter_.reset(); - } - else if (events[i].filter == EVFILT_READ) - { - // Dispatch operations associated with the descriptor. - bool more_reads = false; - bool more_except = false; - if (events[i].flags & EV_ERROR) - { - int error = events[i].data; - except_op_queue_.dispatch_all_operations(descriptor, error); - read_op_queue_.dispatch_all_operations(descriptor, error); - } - else if (events[i].flags & EV_OOBAND) - { - more_except = except_op_queue_.dispatch_operation(descriptor, 0); - if (events[i].data > 0) - more_reads = read_op_queue_.dispatch_operation(descriptor, 0); - else - more_reads = read_op_queue_.has_operation(descriptor); - } - else - { - more_reads = read_op_queue_.dispatch_operation(descriptor, 0); - more_except = except_op_queue_.has_operation(descriptor); - } - - // Update the descriptor in the kqueue. - struct kevent event; - if (more_reads) - EV_SET(&event, descriptor, EVFILT_READ, EV_ADD, 0, 0, 0); - else if (more_except) - EV_SET(&event, descriptor, EVFILT_READ, EV_ADD, EV_OOBAND, 0, 0); - else - EV_SET(&event, descriptor, EVFILT_READ, EV_DELETE, 0, 0, 0); - if (::kevent(kqueue_fd_, &event, 1, 0, 0, 0) == -1) - { - int error = errno; - except_op_queue_.dispatch_all_operations(descriptor, error); - read_op_queue_.dispatch_all_operations(descriptor, error); - } - } - else if (events[i].filter == EVFILT_WRITE) - { - // Dispatch operations associated with the descriptor. - bool more_writes = false; - if (events[i].flags & EV_ERROR) - { - int error = events[i].data; - write_op_queue_.dispatch_all_operations(descriptor, error); - } - else - { - more_writes = write_op_queue_.dispatch_operation(descriptor, 0); - } - - // Update the descriptor in the kqueue. - struct kevent event; - if (more_writes) - EV_SET(&event, descriptor, EVFILT_WRITE, EV_ADD, 0, 0, 0); - else - EV_SET(&event, descriptor, EVFILT_WRITE, EV_DELETE, 0, 0, 0); - if (::kevent(kqueue_fd_, &event, 1, 0, 0, 0) == -1) - { - int error = errno; - write_op_queue_.dispatch_all_operations(descriptor, error); - } - } - } - - read_op_queue_.dispatch_cancellations(); - write_op_queue_.dispatch_cancellations(); - except_op_queue_.dispatch_cancellations(); - for (std::size_t i = 0; i < timer_queues_.size(); ++i) - timer_queues_[i]->dispatch_timers(); - - // Issue any pending cancellations. - for (std::size_t i = 0; i < pending_cancellations_.size(); ++i) - cancel_ops_unlocked(pending_cancellations_[i]); - pending_cancellations_.clear(); - - // Clean up operations. We must not hold the lock since the operations may - // make calls back into this reactor. - lock.unlock(); - read_op_queue_.cleanup_operations(); - write_op_queue_.cleanup_operations(); - except_op_queue_.cleanup_operations(); - } - - // Run the select loop in the thread. - void run_thread() - { - asio::detail::mutex::scoped_lock lock(mutex_); - while (!stop_thread_) - { - lock.unlock(); - run(true); - lock.lock(); - } - } - - // Entry point for the select loop thread. - static void call_run_thread(kqueue_reactor* reactor) - { - reactor->run_thread(); - } - - // Interrupt the select loop. - void interrupt() - { - interrupter_.interrupt(); - } - - // Create the kqueue file descriptor. Throws an exception if the descriptor - // cannot be created. - static int do_kqueue_create() - { - int fd = kqueue(); - if (fd == -1) - { - system_exception e("kqueue", errno); - boost::throw_exception(e); - } - return fd; - } - - // Check if all timer queues are empty. - bool all_timer_queues_are_empty() const - { - for (std::size_t i = 0; i < timer_queues_.size(); ++i) - if (!timer_queues_[i]->empty()) - return false; - return true; - } - - // Get the timeout value for the kevent call. - timespec* get_timeout(timespec& ts) - { - if (all_timer_queues_are_empty()) - return 0; - - // By default we will wait no longer than 5 minutes. This will ensure that - // any changes to the system clock are detected after no longer than this. - boost::posix_time::time_duration minimum_wait_duration - = boost::posix_time::minutes(5); - - for (std::size_t i = 0; i < timer_queues_.size(); ++i) - { - boost::posix_time::time_duration wait_duration - = timer_queues_[i]->wait_duration(); - if (wait_duration < minimum_wait_duration) - minimum_wait_duration = wait_duration; - } - - if (minimum_wait_duration > boost::posix_time::time_duration()) - { - ts.tv_sec = minimum_wait_duration.total_seconds(); - ts.tv_nsec = minimum_wait_duration.total_nanoseconds() % 1000000000; - } - else - { - ts.tv_sec = 0; - ts.tv_nsec = 0; - } - - return &ts; - } - - // Cancel all operations associated with the given descriptor. The do_cancel - // function of the handler objects will be invoked. This function does not - // acquire the epoll_reactor's mutex. - void cancel_ops_unlocked(socket_type descriptor) - { - bool interrupt = read_op_queue_.cancel_operations(descriptor); - interrupt = write_op_queue_.cancel_operations(descriptor) || interrupt; - interrupt = except_op_queue_.cancel_operations(descriptor) || interrupt; - if (interrupt) - interrupter_.interrupt(); - } - - // Mutex to protect access to internal data. - asio::detail::mutex mutex_; - - // The epoll file descriptor. - int kqueue_fd_; - - // Whether the kqueue wait call is currently in progress - bool wait_in_progress_; - - // The interrupter is used to break a blocking epoll_wait call. - select_interrupter interrupter_; - - // The queue of read operations. - reactor_op_queue read_op_queue_; - - // The queue of write operations. - reactor_op_queue write_op_queue_; - - // The queue of except operations. - reactor_op_queue except_op_queue_; - - // The timer queues. - std::vector timer_queues_; - - // The descriptors that are pending cancellation. - std::vector pending_cancellations_; - - // Does the reactor loop thread need to stop. - bool stop_thread_; - - // The thread that is running the reactor loop. - asio::detail::thread* thread_; - - // Whether the service has been shut down. - bool shutdown_; -}; - -} // namespace detail -} // namespace asio - -#endif // defined(ASIO_HAS_KQUEUE) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_KQUEUE_REACTOR_HPP diff --git a/libtorrent/include/asio/detail/kqueue_reactor_fwd.hpp b/libtorrent/include/asio/detail/kqueue_reactor_fwd.hpp deleted file mode 100644 index b9bc5a02d..000000000 --- a/libtorrent/include/asio/detail/kqueue_reactor_fwd.hpp +++ /dev/null @@ -1,41 +0,0 @@ -// -// kqueue_reactor_fwd.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// Copyright (c) 2005 Stefan Arentz (stefan at soze dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_KQUEUE_REACTOR_FWD_HPP -#define ASIO_DETAIL_KQUEUE_REACTOR_FWD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#if !defined(ASIO_DISABLE_KQUEUE) -#if defined(__MACH__) && defined(__APPLE__) - -// Define this to indicate that epoll is supported on the target platform. -#define ASIO_HAS_KQUEUE 1 - -namespace asio { -namespace detail { - -template -class kqueue_reactor; - -} // namespace detail -} // namespace asio - -#endif // defined(__MACH__) && defined(__APPLE__) -#endif // !defined(ASIO_DISABLE_KQUEUE) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_KQUEUE_REACTOR_FWD_HPP diff --git a/libtorrent/include/asio/detail/mutex.hpp b/libtorrent/include/asio/detail/mutex.hpp deleted file mode 100644 index e861556d0..000000000 --- a/libtorrent/include/asio/detail/mutex.hpp +++ /dev/null @@ -1,50 +0,0 @@ -// -// mutex.hpp -// ~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_MUTEX_HPP -#define ASIO_DETAIL_MUTEX_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#if !defined(BOOST_HAS_THREADS) -# include "asio/detail/null_mutex.hpp" -#elif defined(BOOST_WINDOWS) -# include "asio/detail/win_mutex.hpp" -#elif defined(BOOST_HAS_PTHREADS) -# include "asio/detail/posix_mutex.hpp" -#else -# error Only Windows and POSIX are supported! -#endif - -namespace asio { -namespace detail { - -#if !defined(BOOST_HAS_THREADS) -typedef null_mutex mutex; -#elif defined(BOOST_WINDOWS) -typedef win_mutex mutex; -#elif defined(BOOST_HAS_PTHREADS) -typedef posix_mutex mutex; -#endif - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_MUTEX_HPP diff --git a/libtorrent/include/asio/detail/noncopyable.hpp b/libtorrent/include/asio/detail/noncopyable.hpp deleted file mode 100644 index 004a68bc6..000000000 --- a/libtorrent/include/asio/detail/noncopyable.hpp +++ /dev/null @@ -1,55 +0,0 @@ -// -// noncopyable.hpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_NONCOPYABLE_HPP -#define ASIO_DETAIL_NONCOPYABLE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -namespace asio { -namespace detail { - -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -// Redefine the noncopyable class for Borland C++ since that compiler does not -// apply the empty base optimisation unless the base class contains a dummy -// char data member. -class noncopyable -{ -protected: - noncopyable() {} - ~noncopyable() {} -private: - noncopyable(const noncopyable&); - const noncopyable& operator=(const noncopyable&); - char dummy_; -}; -#else -using boost::noncopyable; -#endif - -} // namespace detail - -using asio::detail::noncopyable; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_NONCOPYABLE_HPP diff --git a/libtorrent/include/asio/detail/null_event.hpp b/libtorrent/include/asio/detail/null_event.hpp deleted file mode 100644 index 91bfc329e..000000000 --- a/libtorrent/include/asio/detail/null_event.hpp +++ /dev/null @@ -1,68 +0,0 @@ -// -// null_event.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_NULL_EVENT_HPP -#define ASIO_DETAIL_NULL_EVENT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#if !defined(BOOST_HAS_THREADS) - -#include "asio/detail/noncopyable.hpp" - -namespace asio { -namespace detail { - -class null_event - : private noncopyable -{ -public: - // Constructor. - null_event() - { - } - - // Destructor. - ~null_event() - { - } - - // Signal the event. - void signal() - { - } - - // Reset the event. - void clear() - { - } - - // Wait for the event to become signalled. - void wait() - { - } -}; - -} // namespace detail -} // namespace asio - -#endif // !defined(BOOST_HAS_THREADS) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_NULL_EVENT_HPP diff --git a/libtorrent/include/asio/detail/null_mutex.hpp b/libtorrent/include/asio/detail/null_mutex.hpp deleted file mode 100644 index 814a18f5f..000000000 --- a/libtorrent/include/asio/detail/null_mutex.hpp +++ /dev/null @@ -1,66 +0,0 @@ -// -// null_mutex.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_NULL_MUTEX_HPP -#define ASIO_DETAIL_NULL_MUTEX_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#if !defined(BOOST_HAS_THREADS) - -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/scoped_lock.hpp" - -namespace asio { -namespace detail { - -class null_mutex - : private noncopyable -{ -public: - typedef asio::detail::scoped_lock scoped_lock; - - // Constructor. - null_mutex() - { - } - - // Destructor. - ~null_mutex() - { - } - - // Lock the mutex. - void lock() - { - } - - // Unlock the mutex. - void unlock() - { - } -}; - -} // namespace detail -} // namespace asio - -#endif // !defined(BOOST_HAS_THREADS) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_NULL_MUTEX_HPP diff --git a/libtorrent/include/asio/detail/null_signal_blocker.hpp b/libtorrent/include/asio/detail/null_signal_blocker.hpp deleted file mode 100644 index ff7cfcaf0..000000000 --- a/libtorrent/include/asio/detail/null_signal_blocker.hpp +++ /dev/null @@ -1,63 +0,0 @@ -// -// null_signal_blocker.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_NULL_SIGNAL_BLOCKER_HPP -#define ASIO_DETAIL_NULL_SIGNAL_BLOCKER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#if !defined(BOOST_HAS_THREADS) - -#include "asio/detail/noncopyable.hpp" - -namespace asio { -namespace detail { - -class null_signal_blocker - : private noncopyable -{ -public: - // Constructor blocks all signals for the calling thread. - null_signal_blocker() - { - } - - // Destructor restores the previous signal mask. - ~null_signal_blocker() - { - } - - // Block all signals for the calling thread. - void block() - { - } - - // Restore the previous signal mask. - void unblock() - { - } -}; - -} // namespace detail -} // namespace asio - -#endif // !defined(BOOST_HAS_THREADS) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_NULL_SIGNAL_BLOCKER_HPP diff --git a/libtorrent/include/asio/detail/null_thread.hpp b/libtorrent/include/asio/detail/null_thread.hpp deleted file mode 100644 index 653caa651..000000000 --- a/libtorrent/include/asio/detail/null_thread.hpp +++ /dev/null @@ -1,67 +0,0 @@ -// -// null_thread.hpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_NULL_THREAD_HPP -#define ASIO_DETAIL_NULL_THREAD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#if !defined(BOOST_HAS_THREADS) - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/error.hpp" -#include "asio/system_exception.hpp" -#include "asio/detail/noncopyable.hpp" - -namespace asio { -namespace detail { - -class null_thread - : private noncopyable -{ -public: - // Constructor. - template - null_thread(Function f) - { - system_exception e("thread", asio::error::not_supported); - boost::throw_exception(e); - } - - // Destructor. - ~null_thread() - { - } - - // Wait for the thread to exit. - void join() - { - } -}; - -} // namespace detail -} // namespace asio - -#endif // !defined(BOOST_HAS_THREADS) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_NULL_THREAD_HPP diff --git a/libtorrent/include/asio/detail/null_tss_ptr.hpp b/libtorrent/include/asio/detail/null_tss_ptr.hpp deleted file mode 100644 index 707e31e79..000000000 --- a/libtorrent/include/asio/detail/null_tss_ptr.hpp +++ /dev/null @@ -1,70 +0,0 @@ -// -// null_tss_ptr.hpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_NULL_TSS_PTR_HPP -#define ASIO_DETAIL_NULL_TSS_PTR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#if !defined(BOOST_HAS_THREADS) - -#include "asio/detail/noncopyable.hpp" - -namespace asio { -namespace detail { - -template -class null_tss_ptr - : private noncopyable -{ -public: - // Constructor. - null_tss_ptr() - : value_(0) - { - } - - // Destructor. - ~null_tss_ptr() - { - } - - // Get the value. - operator T*() const - { - return value_; - } - - // Set the value. - void operator=(T* value) - { - value_ = value; - } - -private: - T* value_; -}; - -} // namespace detail -} // namespace asio - -#endif // !defined(BOOST_HAS_THREADS) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_NULL_TSS_PTR_HPP diff --git a/libtorrent/include/asio/detail/old_win_sdk_compat.hpp b/libtorrent/include/asio/detail/old_win_sdk_compat.hpp deleted file mode 100644 index 24c42ad67..000000000 --- a/libtorrent/include/asio/detail/old_win_sdk_compat.hpp +++ /dev/null @@ -1,312 +0,0 @@ -// -// old_win_sdk_compat.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_OLD_WIN_SDK_COMPAT_HPP -#define ASIO_DETAIL_OLD_WIN_SDK_COMPAT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) - -// Guess whether we are building against on old Platform SDK. -#if !defined(IPPROTO_IPV6) -#define ASIO_HAS_OLD_WIN_SDK 1 -#endif // !defined(IPPROTO_IPV6) - -#if defined(ASIO_HAS_OLD_WIN_SDK) - -// Emulation of types that are missing from old Platform SDKs. - -namespace asio { -namespace detail { - -enum -{ - sockaddr_storage_maxsize = 128, // Maximum size. - sockaddr_storage_alignsize = (sizeof(__int64)), // Desired alignment. - sockaddr_storage_pad1size = (sockaddr_storage_alignsize - sizeof(short)), - sockaddr_storage_pad2size = (sockaddr_storage_maxsize - - (sizeof(short) + sockaddr_storage_pad1size + sockaddr_storage_alignsize)) -}; - -struct sockaddr_storage_emulation -{ - short ss_family; - char __ss_pad1[sockaddr_storage_pad1size]; - __int64 __ss_align; - char __ss_pad2[sockaddr_storage_pad2size]; -}; - -struct in6_addr_emulation -{ - u_char s6_addr[16]; -}; - -struct sockaddr_in6_emulation -{ - short sin6_family; - u_short sin6_port; - u_long sin6_flowinfo; - in6_addr_emulation sin6_addr; - u_long sin6_scope_id; -}; - -struct ipv6_mreq_emulation -{ - in6_addr_emulation ipv6mr_multiaddr; - unsigned int ipv6mr_interface; -}; - -#if !defined(IN6ADDR_ANY_INIT) -# define IN6ADDR_ANY_INIT { 0 } -#endif - -#if !defined(IN6ADDR_LOOPBACK_INIT) -# define IN6ADDR_LOOPBACK_INIT { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } -#endif - -struct addrinfo_emulation -{ - int ai_flags; - int ai_family; - int ai_socktype; - int ai_protocol; - size_t ai_addrlen; - char* ai_canonname; - sockaddr* ai_addr; - addrinfo_emulation* ai_next; -}; - -#if !defined(AI_PASSIVE) -# define AI_PASSIVE 0x1 -#endif - -#if !defined(AI_CANONNAME) -# define AI_CANONNAME 0x2 -#endif - -#if !defined(AI_NUMERICHOST) -# define AI_NUMERICHOST 0x4 -#endif - -#if !defined(EAI_AGAIN) -# define EAI_AGAIN WSATRY_AGAIN -#endif - -#if !defined(EAI_BADFLAGS) -# define EAI_BADFLAGS WSAEINVAL -#endif - -#if !defined(EAI_FAIL) -# define EAI_FAIL WSANO_RECOVERY -#endif - -#if !defined(EAI_FAMILY) -# define EAI_FAMILY WSAEAFNOSUPPORT -#endif - -#if !defined(EAI_MEMORY) -# define EAI_MEMORY WSA_NOT_ENOUGH_MEMORY -#endif - -#if !defined(EAI_NODATA) -# define EAI_NODATA WSANO_DATA -#endif - -#if !defined(EAI_NONAME) -# define EAI_NONAME WSAHOST_NOT_FOUND -#endif - -#if !defined(EAI_SERVICE) -# define EAI_SERVICE WSATYPE_NOT_FOUND -#endif - -#if !defined(EAI_SOCKTYPE) -# define EAI_SOCKTYPE WSAESOCKTNOSUPPORT -#endif - -#if !defined(NI_NOFQDN) -# define NI_NOFQDN 0x01 -#endif - -#if !defined(NI_NUMERICHOST) -# define NI_NUMERICHOST 0x02 -#endif - -#if !defined(NI_NAMEREQD) -# define NI_NAMEREQD 0x04 -#endif - -#if !defined(NI_NUMERICSERV) -# define NI_NUMERICSERV 0x08 -#endif - -#if !defined(NI_DGRAM) -# define NI_DGRAM 0x10 -#endif - -#if !defined(IPPROTO_IPV6) -# define IPPROTO_IPV6 41 -#endif - -#if !defined(IPV6_MULTICAST_IF) -# define IPV6_MULTICAST_IF 9 -#endif - -#if !defined(IPV6_MULTICAST_HOPS) -# define IPV6_MULTICAST_HOPS 10 -#endif - -#if !defined(IPV6_MULTICAST_LOOP) -# define IPV6_MULTICAST_LOOP 11 -#endif - -#if !defined(IPV6_JOIN_GROUP) -# define IPV6_JOIN_GROUP 12 -#endif - -#if !defined(IPV6_LEAVE_GROUP) -# define IPV6_LEAVE_GROUP 13 -#endif - -inline int IN6_IS_ADDR_UNSPECIFIED(const in6_addr_emulation* a) -{ - return ((a->s6_addr[0] == 0) - && (a->s6_addr[1] == 0) - && (a->s6_addr[2] == 0) - && (a->s6_addr[3] == 0) - && (a->s6_addr[4] == 0) - && (a->s6_addr[5] == 0) - && (a->s6_addr[6] == 0) - && (a->s6_addr[7] == 0) - && (a->s6_addr[8] == 0) - && (a->s6_addr[9] == 0) - && (a->s6_addr[10] == 0) - && (a->s6_addr[11] == 0) - && (a->s6_addr[12] == 0) - && (a->s6_addr[13] == 0) - && (a->s6_addr[14] == 0) - && (a->s6_addr[15] == 0)); -} - -inline int IN6_IS_ADDR_LOOPBACK(const in6_addr_emulation* a) -{ - return ((a->s6_addr[0] == 0) - && (a->s6_addr[1] == 0) - && (a->s6_addr[2] == 0) - && (a->s6_addr[3] == 0) - && (a->s6_addr[4] == 0) - && (a->s6_addr[5] == 0) - && (a->s6_addr[6] == 0) - && (a->s6_addr[7] == 0) - && (a->s6_addr[8] == 0) - && (a->s6_addr[9] == 0) - && (a->s6_addr[10] == 0) - && (a->s6_addr[11] == 0) - && (a->s6_addr[12] == 0) - && (a->s6_addr[13] == 0) - && (a->s6_addr[14] == 0) - && (a->s6_addr[15] == 1)); -} - -inline int IN6_IS_ADDR_MULTICAST(const in6_addr_emulation* a) -{ - return (a->s6_addr[0] == 0xff); -} - -inline int IN6_IS_ADDR_LINKLOCAL(const in6_addr_emulation* a) -{ - return ((a->s6_addr[0] == 0xfe) && ((a->s6_addr[1] & 0xc0) == 0x80)); -} - -inline int IN6_IS_ADDR_SITELOCAL(const in6_addr_emulation* a) -{ - return ((a->s6_addr[0] == 0xfe) && ((a->s6_addr[1] & 0xc0) == 0xc0)); -} - -inline int IN6_IS_ADDR_V4MAPPED(const in6_addr_emulation* a) -{ - return ((a->s6_addr[0] == 0) - && (a->s6_addr[1] == 0) - && (a->s6_addr[2] == 0) - && (a->s6_addr[3] == 0) - && (a->s6_addr[4] == 0) - && (a->s6_addr[5] == 0) - && (a->s6_addr[6] == 0) - && (a->s6_addr[7] == 0) - && (a->s6_addr[8] == 0) - && (a->s6_addr[9] == 0) - && (a->s6_addr[10] == 0xff) - && (a->s6_addr[11] == 0xff)); -} - -inline int IN6_IS_ADDR_V4COMPAT(const in6_addr_emulation* a) -{ - return ((a->s6_addr[0] == 0) - && (a->s6_addr[1] == 0) - && (a->s6_addr[2] == 0) - && (a->s6_addr[3] == 0) - && (a->s6_addr[4] == 0) - && (a->s6_addr[5] == 0) - && (a->s6_addr[6] == 0) - && (a->s6_addr[7] == 0) - && (a->s6_addr[8] == 0) - && (a->s6_addr[9] == 0) - && (a->s6_addr[10] == 0xff) - && (a->s6_addr[11] == 0xff) - && !((a->s6_addr[12] == 0) - && (a->s6_addr[13] == 0) - && (a->s6_addr[14] == 0) - && ((a->s6_addr[15] == 0) || (a->s6_addr[15] == 1)))); -} - -inline int IN6_IS_ADDR_MC_NODELOCAL(const in6_addr_emulation* a) -{ - return IN6_IS_ADDR_MULTICAST(a) && ((a->s6_addr[1] & 0xf) == 1); -} - -inline int IN6_IS_ADDR_MC_LINKLOCAL(const in6_addr_emulation* a) -{ - return IN6_IS_ADDR_MULTICAST(a) && ((a->s6_addr[1] & 0xf) == 2); -} - -inline int IN6_IS_ADDR_MC_SITELOCAL(const in6_addr_emulation* a) -{ - return IN6_IS_ADDR_MULTICAST(a) && ((a->s6_addr[1] & 0xf) == 5); -} - -inline int IN6_IS_ADDR_MC_ORGLOCAL(const in6_addr_emulation* a) -{ - return IN6_IS_ADDR_MULTICAST(a) && ((a->s6_addr[1] & 0xf) == 8); -} - -inline int IN6_IS_ADDR_MC_GLOBAL(const in6_addr_emulation* a) -{ - return IN6_IS_ADDR_MULTICAST(a) && ((a->s6_addr[1] & 0xf) == 0xe); -} - -} // namespace detail -} // namespace asio - -#endif // defined(ASIO_HAS_OLD_WIN_SDK) - -#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_OLD_WIN_SDK_COMPAT_HPP diff --git a/libtorrent/include/asio/detail/pipe_select_interrupter.hpp b/libtorrent/include/asio/detail/pipe_select_interrupter.hpp deleted file mode 100644 index b73fb3f2e..000000000 --- a/libtorrent/include/asio/detail/pipe_select_interrupter.hpp +++ /dev/null @@ -1,104 +0,0 @@ -// -// pipe_select_interrupter.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_PIPE_SELECT_INTERRUPTER_HPP -#define ASIO_DETAIL_PIPE_SELECT_INTERRUPTER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#if !defined(BOOST_WINDOWS) && !defined(__CYGWIN__) - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/detail/socket_types.hpp" - -namespace asio { -namespace detail { - -class pipe_select_interrupter -{ -public: - // Constructor. - pipe_select_interrupter() - { - int pipe_fds[2]; - if (pipe(pipe_fds) == 0) - { - read_descriptor_ = pipe_fds[0]; - ::fcntl(read_descriptor_, F_SETFL, O_NONBLOCK); - write_descriptor_ = pipe_fds[1]; - ::fcntl(write_descriptor_, F_SETFL, O_NONBLOCK); - } - } - - // Destructor. - ~pipe_select_interrupter() - { - if (read_descriptor_ != -1) - ::close(read_descriptor_); - if (write_descriptor_ != -1) - ::close(write_descriptor_); - } - - // Interrupt the select call. - void interrupt() - { - char byte = 0; - ::write(write_descriptor_, &byte, 1); - } - - // Reset the select interrupt. Returns true if the call was interrupted. - bool reset() - { - char data[1024]; - int bytes_read = ::read(read_descriptor_, data, sizeof(data)); - bool was_interrupted = (bytes_read > 0); - while (bytes_read == sizeof(data)) - bytes_read = ::read(read_descriptor_, data, sizeof(data)); - return was_interrupted; - } - - // Get the read descriptor to be passed to select. - int read_descriptor() const - { - return read_descriptor_; - } - -private: - // The read end of a connection used to interrupt the select call. This file - // descriptor is passed to select such that when it is time to stop, a single - // byte will be written on the other end of the connection and this - // descriptor will become readable. - int read_descriptor_; - - // The write end of a connection used to interrupt the select call. A single - // byte may be written to this to wake up the select which is waiting for the - // other end to become readable. - int write_descriptor_; -}; - -} // namespace detail -} // namespace asio - -#endif // !defined(BOOST_WINDOWS) && !defined(__CYGWIN__) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_PIPE_SELECT_INTERRUPTER_HPP diff --git a/libtorrent/include/asio/detail/pop_options.hpp b/libtorrent/include/asio/detail/pop_options.hpp deleted file mode 100644 index 4c942e8d3..000000000 --- a/libtorrent/include/asio/detail/pop_options.hpp +++ /dev/null @@ -1,88 +0,0 @@ -// -// pop_options.hpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -// No header guard - -#if defined(__COMO__) - -// Comeau C++ - -#elif defined(__DMC__) - -// Digital Mars C++ - -#elif defined(__INTEL_COMPILER) || defined(__ICL) \ - || defined(__ICC) || defined(__ECC) - -// Intel C++ - -#elif defined(__GNUC__) - -// GNU C++ - -# if defined(__MINGW32__) || defined(__CYGWIN__) -# pragma pack (pop) -# endif - -#elif defined(__KCC) - -// Kai C++ - -#elif defined(__sgi) - -// SGI MIPSpro C++ - -#elif defined(__DECCXX) - -// Compaq Tru64 Unix cxx - -#elif defined(__ghs) - -// Greenhills C++ - -#elif defined(__BORLANDC__) - -// Borland C++ - -# pragma option pop -# pragma nopushoptwarn -# pragma nopackwarning - -#elif defined(__MWERKS__) - -// Metrowerks CodeWarrior - -#elif defined(__SUNPRO_CC) - -// Sun Workshop Compiler C++ - -#elif defined(__HP_aCC) - -// HP aCC - -#elif defined(__MRC__) || defined(__SC__) - -// MPW MrCpp or SCpp - -#elif defined(__IBMCPP__) - -// IBM Visual Age - -#elif defined(_MSC_VER) - -// Microsoft Visual C++ -// -// Must remain the last #elif since some other vendors (Metrowerks, for example) -// also #define _MSC_VER - -# pragma warning (pop) -# pragma pack (pop) - -#endif diff --git a/libtorrent/include/asio/detail/posix_event.hpp b/libtorrent/include/asio/detail/posix_event.hpp deleted file mode 100644 index 9d84bfa58..000000000 --- a/libtorrent/include/asio/detail/posix_event.hpp +++ /dev/null @@ -1,107 +0,0 @@ -// -// posix_event.hpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_POSIX_EVENT_HPP -#define ASIO_DETAIL_POSIX_EVENT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#if defined(BOOST_HAS_PTHREADS) - -#include "asio/detail/push_options.hpp" -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/system_exception.hpp" -#include "asio/detail/noncopyable.hpp" - -namespace asio { -namespace detail { - -class posix_event - : private noncopyable -{ -public: - // Constructor. - posix_event() - : signalled_(false) - { - int error = ::pthread_mutex_init(&mutex_, 0); - if (error != 0) - { - system_exception e("event", error); - boost::throw_exception(e); - } - - error = ::pthread_cond_init(&cond_, 0); - if (error != 0) - { - ::pthread_mutex_destroy(&mutex_); - system_exception e("event", error); - boost::throw_exception(e); - } - } - - // Destructor. - ~posix_event() - { - ::pthread_cond_destroy(&cond_); - ::pthread_mutex_destroy(&mutex_); - } - - // Signal the event. - void signal() - { - ::pthread_mutex_lock(&mutex_); // Ignore EINVAL and EDEADLK. - signalled_ = true; - ::pthread_cond_signal(&cond_); // Ignore EINVAL. - ::pthread_mutex_unlock(&mutex_); // Ignore EINVAL and EPERM. - } - - // Reset the event. - void clear() - { - ::pthread_mutex_lock(&mutex_); // Ignore EINVAL and EDEADLK. - signalled_ = false; - ::pthread_mutex_unlock(&mutex_); // Ignore EINVAL and EPERM. - } - - // Wait for the event to become signalled. - void wait() - { - ::pthread_mutex_lock(&mutex_); // Ignore EINVAL and EDEADLK. - while (!signalled_) - ::pthread_cond_wait(&cond_, &mutex_); // Ignore EINVAL. - ::pthread_mutex_unlock(&mutex_); // Ignore EINVAL and EPERM. - } - -private: - ::pthread_mutex_t mutex_; - ::pthread_cond_t cond_; - bool signalled_; -}; - -} // namespace detail -} // namespace asio - -#endif // defined(BOOST_HAS_PTHREADS) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_POSIX_EVENT_HPP diff --git a/libtorrent/include/asio/detail/posix_fd_set_adapter.hpp b/libtorrent/include/asio/detail/posix_fd_set_adapter.hpp deleted file mode 100644 index 56d8ff3dc..000000000 --- a/libtorrent/include/asio/detail/posix_fd_set_adapter.hpp +++ /dev/null @@ -1,71 +0,0 @@ -// -// posix_fd_set_adapter.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_POSIX_FD_SET_ADAPTER_HPP -#define ASIO_DETAIL_POSIX_FD_SET_ADAPTER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/socket_types.hpp" - -#if !defined(BOOST_WINDOWS) && !defined(__CYGWIN__) - -namespace asio { -namespace detail { - -// Adapts the FD_SET type to meet the Descriptor_Set concept's requirements. -class posix_fd_set_adapter -{ -public: - posix_fd_set_adapter() - : max_descriptor_(invalid_socket) - { - FD_ZERO(&fd_set_); - } - - void set(socket_type descriptor) - { - if (max_descriptor_ == invalid_socket || descriptor > max_descriptor_) - max_descriptor_ = descriptor; - FD_SET(descriptor, &fd_set_); - } - - bool is_set(socket_type descriptor) const - { - return FD_ISSET(descriptor, &fd_set_) != 0; - } - - operator fd_set*() - { - return &fd_set_; - } - - socket_type max_descriptor() const - { - return max_descriptor_; - } - -private: - fd_set fd_set_; - socket_type max_descriptor_; -}; - -} // namespace detail -} // namespace asio - -#endif // !defined(BOOST_WINDOWS) && !defined(__CYGWIN__) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_POSIX_FD_SET_ADAPTER_HPP diff --git a/libtorrent/include/asio/detail/posix_mutex.hpp b/libtorrent/include/asio/detail/posix_mutex.hpp deleted file mode 100644 index 4e9df4a75..000000000 --- a/libtorrent/include/asio/detail/posix_mutex.hpp +++ /dev/null @@ -1,94 +0,0 @@ -// -// posix_mutex.hpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_POSIX_MUTEX_HPP -#define ASIO_DETAIL_POSIX_MUTEX_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#if defined(BOOST_HAS_PTHREADS) - -#include "asio/detail/push_options.hpp" -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/system_exception.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/scoped_lock.hpp" - -namespace asio { -namespace detail { - -class posix_mutex - : private noncopyable -{ -public: - typedef asio::detail::scoped_lock scoped_lock; - - // Constructor. - posix_mutex() - { - int error = ::pthread_mutex_init(&mutex_, 0); - if (error != 0) - { - system_exception e("mutex", error); - boost::throw_exception(e); - } - } - - // Destructor. - ~posix_mutex() - { - ::pthread_mutex_destroy(&mutex_); - } - - // Lock the mutex. - void lock() - { - int error = ::pthread_mutex_lock(&mutex_); - if (error != 0) - { - system_exception e("mutex", error); - boost::throw_exception(e); - } - } - - // Unlock the mutex. - void unlock() - { - int error = ::pthread_mutex_unlock(&mutex_); - if (error != 0) - { - system_exception e("mutex", error); - boost::throw_exception(e); - } - } - -private: - ::pthread_mutex_t mutex_; -}; - -} // namespace detail -} // namespace asio - -#endif // defined(BOOST_HAS_PTHREADS) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_POSIX_MUTEX_HPP diff --git a/libtorrent/include/asio/detail/posix_signal_blocker.hpp b/libtorrent/include/asio/detail/posix_signal_blocker.hpp deleted file mode 100644 index c11fc5ef6..000000000 --- a/libtorrent/include/asio/detail/posix_signal_blocker.hpp +++ /dev/null @@ -1,89 +0,0 @@ -// -// posix_signal_blocker.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_POSIX_SIGNAL_BLOCKER_HPP -#define ASIO_DETAIL_POSIX_SIGNAL_BLOCKER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#if defined(BOOST_HAS_PTHREADS) - -#include "asio/detail/push_options.hpp" -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/detail/noncopyable.hpp" - -namespace asio { -namespace detail { - -class posix_signal_blocker - : private noncopyable -{ -public: - // Constructor blocks all signals for the calling thread. - posix_signal_blocker() - : blocked_(false) - { - sigset_t new_mask; - sigfillset(&new_mask); - blocked_ = (pthread_sigmask(SIG_BLOCK, &new_mask, &old_mask_) == 0); - } - - // Destructor restores the previous signal mask. - ~posix_signal_blocker() - { - if (blocked_) - pthread_sigmask(SIG_SETMASK, &old_mask_, 0); - } - - // Block all signals for the calling thread. - void block() - { - if (!blocked_) - { - sigset_t new_mask; - sigfillset(&new_mask); - blocked_ = (pthread_sigmask(SIG_BLOCK, &new_mask, &old_mask_) == 0); - } - } - - // Restore the previous signal mask. - void unblock() - { - if (blocked_) - blocked_ = (pthread_sigmask(SIG_SETMASK, &old_mask_, 0) != 0); - } - -private: - // Have signals been blocked. - bool blocked_; - - // The previous signal mask. - sigset_t old_mask_; -}; - -} // namespace detail -} // namespace asio - -#endif // defined(BOOST_HAS_PTHREADS) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_POSIX_SIGNAL_BLOCKER_HPP diff --git a/libtorrent/include/asio/detail/posix_thread.hpp b/libtorrent/include/asio/detail/posix_thread.hpp deleted file mode 100644 index 7d738fa4b..000000000 --- a/libtorrent/include/asio/detail/posix_thread.hpp +++ /dev/null @@ -1,125 +0,0 @@ -// -// posix_thread.hpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_POSIX_THREAD_HPP -#define ASIO_DETAIL_POSIX_THREAD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#if defined(BOOST_HAS_PTHREADS) - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/system_exception.hpp" -#include "asio/detail/noncopyable.hpp" - -namespace asio { -namespace detail { - -extern "C" void* asio_detail_posix_thread_function(void* arg); - -class posix_thread - : private noncopyable -{ -public: - // Constructor. - template - posix_thread(Function f) - : joined_(false) - { - std::auto_ptr arg(new func(f)); - int error = ::pthread_create(&thread_, 0, - asio_detail_posix_thread_function, arg.get()); - if (error != 0) - { - system_exception e("thread", error); - boost::throw_exception(e); - } - arg.release(); - } - - // Destructor. - ~posix_thread() - { - if (!joined_) - ::pthread_detach(thread_); - } - - // Wait for the thread to exit. - void join() - { - if (!joined_) - { - ::pthread_join(thread_, 0); - joined_ = true; - } - } - -private: - friend void* asio_detail_posix_thread_function(void* arg); - - class func_base - { - public: - virtual ~func_base() {} - virtual void run() = 0; - }; - - template - class func - : public func_base - { - public: - func(Function f) - : f_(f) - { - } - - virtual void run() - { - f_(); - } - - private: - Function f_; - }; - - ::pthread_t thread_; - bool joined_; -}; - -inline void* asio_detail_posix_thread_function(void* arg) -{ - std::auto_ptr f( - static_cast(arg)); - f->run(); - return 0; -} - -} // namespace detail -} // namespace asio - -#endif // defined(BOOST_HAS_PTHREADS) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_POSIX_THREAD_HPP diff --git a/libtorrent/include/asio/detail/posix_tss_ptr.hpp b/libtorrent/include/asio/detail/posix_tss_ptr.hpp deleted file mode 100644 index 961120ee9..000000000 --- a/libtorrent/include/asio/detail/posix_tss_ptr.hpp +++ /dev/null @@ -1,84 +0,0 @@ -// -// posix_tss_ptr.hpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_POSIX_TSS_PTR_HPP -#define ASIO_DETAIL_POSIX_TSS_PTR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#if defined(BOOST_HAS_PTHREADS) - -#include "asio/detail/push_options.hpp" -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/system_exception.hpp" -#include "asio/detail/noncopyable.hpp" - -namespace asio { -namespace detail { - -template -class posix_tss_ptr - : private noncopyable -{ -public: - // Constructor. - posix_tss_ptr() - { - int error = ::pthread_key_create(&tss_key_, 0); - if (error != 0) - { - system_exception e("tss", error); - boost::throw_exception(e); - } - } - - // Destructor. - ~posix_tss_ptr() - { - ::pthread_key_delete(tss_key_); - } - - // Get the value. - operator T*() const - { - return static_cast(::pthread_getspecific(tss_key_)); - } - - // Set the value. - void operator=(T* value) - { - ::pthread_setspecific(tss_key_, value); - } - -private: - // Thread-specific storage to allow unlocked access to determine whether a - // thread is a member of the pool. - pthread_key_t tss_key_; -}; - -} // namespace detail -} // namespace asio - -#endif // defined(BOOST_HAS_PTHREADS) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_POSIX_TSS_PTR_HPP diff --git a/libtorrent/include/asio/detail/push_options.hpp b/libtorrent/include/asio/detail/push_options.hpp deleted file mode 100644 index 45493ed29..000000000 --- a/libtorrent/include/asio/detail/push_options.hpp +++ /dev/null @@ -1,106 +0,0 @@ -// -// push_options.hpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -// No header guard - -#if defined(__COMO__) - -// Comeau C++ - -#elif defined(__DMC__) - -// Digital Mars C++ - -#elif defined(__INTEL_COMPILER) || defined(__ICL) \ - || defined(__ICC) || defined(__ECC) - -// Intel C++ - -#elif defined(__GNUC__) - -// GNU C++ - -# if defined(__MINGW32__) || defined(__CYGWIN__) -# pragma pack (push, 8) -# endif - -#elif defined(__KCC) - -// Kai C++ - -#elif defined(__sgi) - -// SGI MIPSpro C++ - -#elif defined(__DECCXX) - -// Compaq Tru64 Unix cxx - -#elif defined(__ghs) - -// Greenhills C++ - -#elif defined(__BORLANDC__) - -// Borland C++ - -# pragma option push -a8 -b -Ve- -Vx- -w-inl -vi- -# pragma nopushoptwarn -# pragma nopackwarning -# if !defined(__MT__) -# error Multithreaded RTL must be selected. -# endif // !defined(__MT__) - -#elif defined(__MWERKS__) - -// Metrowerks CodeWarrior - -#elif defined(__SUNPRO_CC) - -// Sun Workshop Compiler C++ - -#elif defined(__HP_aCC) - -// HP aCC - -#elif defined(__MRC__) || defined(__SC__) - -// MPW MrCpp or SCpp - -#elif defined(__IBMCPP__) - -// IBM Visual Age - -#elif defined(_MSC_VER) - -// Microsoft Visual C++ -// -// Must remain the last #elif since some other vendors (Metrowerks, for example) -// also #define _MSC_VER - -# pragma warning (disable:4103) -# pragma warning (push) -# pragma warning (disable:4244) -# pragma warning (disable:4355) -# pragma warning (disable:4675) -# pragma pack (push, 8) -// Note that if the /Og optimisation flag is enabled with MSVC6, the compiler -// has a tendency to incorrectly optimise away some calls to member template -// functions, even though those functions contain code that should not be -// optimised away! Therefore we will always disable this optimisation option -// for the MSVC6 compiler. -# if (_MSC_VER < 1300) -# pragma optimize ("g", off) -# endif -# if !defined(_MT) -# error Multithreaded RTL must be selected. -# endif // !defined(_MT) - -#endif diff --git a/libtorrent/include/asio/detail/reactive_socket_service.hpp b/libtorrent/include/asio/detail/reactive_socket_service.hpp deleted file mode 100644 index 361f978af..000000000 --- a/libtorrent/include/asio/detail/reactive_socket_service.hpp +++ /dev/null @@ -1,1640 +0,0 @@ -// -// reactive_socket_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_REACTIVE_SOCKET_SERVICE_HPP -#define ASIO_DETAIL_REACTIVE_SOCKET_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/buffer.hpp" -#include "asio/error.hpp" -#include "asio/error_handler.hpp" -#include "asio/io_service.hpp" -#include "asio/socket_base.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/socket_holder.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/detail/socket_types.hpp" - -namespace asio { -namespace detail { - -template -class reactive_socket_service - : public asio::io_service::service -{ -public: - // The protocol type. - typedef Protocol protocol_type; - - // The endpoint type. - typedef typename Protocol::endpoint endpoint_type; - - // The native type of a socket. - typedef socket_type native_type; - - // The implementation type of the socket. - class implementation_type - : private asio::detail::noncopyable - { - public: - // Default constructor. - implementation_type() - : socket_(invalid_socket), - flags_(0), - protocol_(endpoint_type().protocol()) - { - } - - private: - // Only this service will have access to the internal values. - friend class reactive_socket_service; - - // The native socket representation. - socket_type socket_; - - enum - { - user_set_non_blocking = 1, // The user wants a non-blocking socket. - internal_non_blocking = 2, // The socket has been set non-blocking. - enable_connection_aborted = 4, // User wants connection_aborted errors. - user_set_linger = 8 // The user set the linger option. - }; - - // Flags indicating the current state of the socket. - unsigned char flags_; - - // The protocol associated with the socket. - protocol_type protocol_; - }; - - // The maximum number of buffers to support in a single operation. - enum { max_buffers = 16 }; - - // Constructor. - reactive_socket_service(asio::io_service& io_service) - : asio::io_service::service(io_service), - reactor_(asio::use_service(io_service)) - { - } - - // Destroy all user-defined handler objects owned by the service. - void shutdown_service() - { - } - - // Construct a new socket implementation. - void construct(implementation_type& impl) - { - impl.socket_ = invalid_socket; - impl.flags_ = 0; - } - - // Destroy a socket implementation. - void destroy(implementation_type& impl) - { - if (impl.socket_ != invalid_socket) - { - reactor_.close_descriptor(impl.socket_); - - if (impl.flags_ & implementation_type::internal_non_blocking) - { - ioctl_arg_type non_blocking = 0; - socket_ops::ioctl(impl.socket_, FIONBIO, &non_blocking); - impl.flags_ &= ~implementation_type::internal_non_blocking; - } - - if (impl.flags_ & implementation_type::user_set_linger) - { - ::linger opt; - opt.l_onoff = 0; - opt.l_linger = 0; - socket_ops::setsockopt(impl.socket_, - SOL_SOCKET, SO_LINGER, &opt, sizeof(opt)); - } - - socket_ops::close(impl.socket_); - impl.socket_ = invalid_socket; - } - } - - // Open a new socket implementation. - template - void open(implementation_type& impl, const protocol_type& protocol, - Error_Handler error_handler) - { - close(impl, asio::ignore_error()); - - socket_holder sock(socket_ops::socket(protocol.family(), - protocol.type(), protocol.protocol())); - if (sock.get() == invalid_socket) - { - error_handler(asio::error(socket_ops::get_error())); - return; - } - - if (int err = reactor_.register_descriptor(sock.get())) - { - error_handler(asio::error(err)); - return; - } - - impl.socket_ = sock.release(); - impl.flags_ = 0; - impl.protocol_ = protocol; - - error_handler(asio::error(0)); - } - - // Assign a native socket to a socket implementation. - template - void assign(implementation_type& impl, const protocol_type& protocol, - const native_type& native_socket, Error_Handler error_handler) - { - close(impl, asio::ignore_error()); - - if (int err = reactor_.register_descriptor(native_socket)) - { - error_handler(asio::error(err)); - return; - } - - impl.socket_ = native_socket; - impl.flags_ = 0; - impl.protocol_ = protocol; - - error_handler(asio::error(0)); - } - - // Destroy a socket implementation. - template - void close(implementation_type& impl, Error_Handler error_handler) - { - if (impl.socket_ != invalid_socket) - { - reactor_.close_descriptor(impl.socket_); - - if (impl.flags_ & implementation_type::internal_non_blocking) - { - ioctl_arg_type non_blocking = 0; - socket_ops::ioctl(impl.socket_, FIONBIO, &non_blocking); - impl.flags_ &= ~implementation_type::internal_non_blocking; - } - - if (socket_ops::close(impl.socket_) == socket_error_retval) - { - error_handler(asio::error(socket_ops::get_error())); - return; - } - - impl.socket_ = invalid_socket; - } - - error_handler(asio::error(0)); - } - - // Get the native socket representation. - native_type native(implementation_type& impl) - { - return impl.socket_; - } - - // Cancel all operations associated with the socket. - template - void cancel(implementation_type& impl, Error_Handler error_handler) - { - if (impl.socket_ == invalid_socket) - { - asio::error error(asio::error::bad_descriptor); - error_handler(error); - } - else - { - reactor_.cancel_ops(impl.socket_); - error_handler(asio::error(0)); - } - } - - // Bind the socket to the specified local endpoint. - template - void bind(implementation_type& impl, const endpoint_type& endpoint, - Error_Handler error_handler) - { - if (socket_ops::bind(impl.socket_, endpoint.data(), - endpoint.size()) == socket_error_retval) - error_handler(asio::error(socket_ops::get_error())); - else - error_handler(asio::error(0)); - } - - // Place the socket into the state where it will listen for new connections. - template - void listen(implementation_type& impl, int backlog, - Error_Handler error_handler) - { - if (socket_ops::listen(impl.socket_, backlog) == socket_error_retval) - error_handler(asio::error(socket_ops::get_error())); - else - error_handler(asio::error(0)); - } - - // Set a socket option. - template - void set_option(implementation_type& impl, const Option& option, - Error_Handler error_handler) - { - if (option.level(impl.protocol_) == custom_socket_option_level - && option.name(impl.protocol_) == enable_connection_aborted_option) - { - if (option.size(impl.protocol_) != sizeof(int)) - { - error_handler(asio::error(asio::error::invalid_argument)); - } - else - { - if (*reinterpret_cast(option.data(impl.protocol_))) - impl.flags_ |= implementation_type::enable_connection_aborted; - else - impl.flags_ &= ~implementation_type::enable_connection_aborted; - error_handler(asio::error(0)); - } - } - else - { - if (option.level(impl.protocol_) == SOL_SOCKET - && option.name(impl.protocol_) == SO_LINGER) - { - impl.flags_ |= implementation_type::user_set_linger; - } - - if (socket_ops::setsockopt(impl.socket_, - option.level(impl.protocol_), option.name(impl.protocol_), - option.data(impl.protocol_), option.size(impl.protocol_))) - error_handler(asio::error(socket_ops::get_error())); - else - error_handler(asio::error(0)); - } - } - - // Set a socket option. - template - void get_option(const implementation_type& impl, Option& option, - Error_Handler error_handler) const - { - if (option.level(impl.protocol_) == custom_socket_option_level - && option.name(impl.protocol_) == enable_connection_aborted_option) - { - if (option.size(impl.protocol_) != sizeof(int)) - { - error_handler(asio::error(asio::error::invalid_argument)); - } - else - { - int* target = reinterpret_cast(option.data(impl.protocol_)); - if (impl.flags_ & implementation_type::enable_connection_aborted) - *target = 1; - else - *target = 0; - error_handler(asio::error(0)); - } - } - else - { - size_t size = option.size(impl.protocol_); - if (socket_ops::getsockopt(impl.socket_, - option.level(impl.protocol_), option.name(impl.protocol_), - option.data(impl.protocol_), &size)) - error_handler(asio::error(socket_ops::get_error())); - else - error_handler(asio::error(0)); - } - } - - // Perform an IO control command on the socket. - template - void io_control(implementation_type& impl, IO_Control_Command& command, - Error_Handler error_handler) - { - if (command.name() == static_cast(FIONBIO)) - { - if (command.get()) - impl.flags_ |= implementation_type::user_set_non_blocking; - else - impl.flags_ &= ~implementation_type::user_set_non_blocking; - error_handler(asio::error(0)); - } - else - { - if (socket_ops::ioctl(impl.socket_, command.name(), - static_cast(command.data()))) - error_handler(asio::error(socket_ops::get_error())); - else - error_handler(asio::error(0)); - } - } - - // Get the local endpoint. - template - void get_local_endpoint(const implementation_type& impl, - endpoint_type& endpoint, Error_Handler error_handler) const - { - socket_addr_len_type addr_len = endpoint.capacity(); - if (socket_ops::getsockname(impl.socket_, endpoint.data(), &addr_len)) - { - error_handler(asio::error(socket_ops::get_error())); - return; - } - - endpoint.resize(addr_len); - error_handler(asio::error(0)); - } - - // Get the remote endpoint. - template - void get_remote_endpoint(const implementation_type& impl, - endpoint_type& endpoint, Error_Handler error_handler) const - { - socket_addr_len_type addr_len = endpoint.capacity(); - if (socket_ops::getpeername(impl.socket_, endpoint.data(), &addr_len)) - { - error_handler(asio::error(socket_ops::get_error())); - return; - } - - endpoint.resize(addr_len); - error_handler(asio::error(0)); - } - - /// Disable sends or receives on the socket. - template - void shutdown(implementation_type& impl, socket_base::shutdown_type what, - Error_Handler error_handler) - { - if (socket_ops::shutdown(impl.socket_, what) != 0) - error_handler(asio::error(socket_ops::get_error())); - else - error_handler(asio::error(0)); - } - - // Send the given data to the peer. - template - size_t send(implementation_type& impl, const Const_Buffers& buffers, - socket_base::message_flags flags, Error_Handler error_handler) - { - // Copy buffers into array. - socket_ops::buf bufs[max_buffers]; - typename Const_Buffers::const_iterator iter = buffers.begin(); - typename Const_Buffers::const_iterator end = buffers.end(); - size_t i = 0; - size_t total_buffer_size = 0; - for (; iter != end && i < max_buffers; ++iter, ++i) - { - asio::const_buffer buffer(*iter); - socket_ops::init_buf(bufs[i], - asio::buffer_cast(buffer), - asio::buffer_size(buffer)); - total_buffer_size += asio::buffer_size(buffer); - } - - // A request to receive 0 bytes on a stream socket is a no-op. - if (impl.protocol_.type() == SOCK_STREAM && total_buffer_size == 0) - { - error_handler(asio::error(0)); - return 0; - } - - // Send the data. - for (;;) - { - // Try to complete the operation without blocking. - int bytes_sent = socket_ops::send(impl.socket_, bufs, i, flags); - int error = socket_ops::get_error(); - - // Check if operation succeeded. - if (bytes_sent >= 0) - { - error_handler(asio::error(0)); - return bytes_sent; - } - - // Operation failed. - if ((impl.flags_ & implementation_type::user_set_non_blocking) - || (error != asio::error::would_block - && error != asio::error::try_again)) - { - error_handler(asio::error(error)); - return 0; - } - - // Wait for socket to become ready. - if (socket_ops::poll_write(impl.socket_) < 0) - { - error_handler(asio::error(socket_ops::get_error())); - return 0; - } - } - } - - template - class send_handler - { - public: - send_handler(socket_type socket, asio::io_service& io_service, - const Const_Buffers& buffers, socket_base::message_flags flags, - Handler handler) - : socket_(socket), - io_service_(io_service), - work_(io_service), - buffers_(buffers), - flags_(flags), - handler_(handler) - { - } - - bool operator()(int result) - { - // Check whether the operation was successful. - if (result != 0) - { - asio::error error(result); - io_service_.post(bind_handler(handler_, error, 0)); - return true; - } - - // Copy buffers into array. - socket_ops::buf bufs[max_buffers]; - typename Const_Buffers::const_iterator iter = buffers_.begin(); - typename Const_Buffers::const_iterator end = buffers_.end(); - size_t i = 0; - for (; iter != end && i < max_buffers; ++iter, ++i) - { - asio::const_buffer buffer(*iter); - socket_ops::init_buf(bufs[i], - asio::buffer_cast(buffer), - asio::buffer_size(buffer)); - } - - // Send the data. - int bytes = socket_ops::send(socket_, bufs, i, flags_); - asio::error error(bytes < 0 - ? socket_ops::get_error() : asio::error::success); - - // Check if we need to run the operation again. - if (error == asio::error::would_block - || error == asio::error::try_again) - return false; - - io_service_.post(bind_handler(handler_, error, bytes < 0 ? 0 : bytes)); - return true; - } - - private: - socket_type socket_; - asio::io_service& io_service_; - asio::io_service::work work_; - Const_Buffers buffers_; - socket_base::message_flags flags_; - Handler handler_; - }; - - // Start an asynchronous send. The data being sent must be valid for the - // lifetime of the asynchronous operation. - template - void async_send(implementation_type& impl, const Const_Buffers& buffers, - socket_base::message_flags flags, Handler handler) - { - if (impl.socket_ == invalid_socket) - { - asio::error error(asio::error::bad_descriptor); - io_service().post(bind_handler(handler, error, 0)); - } - else - { - if (impl.protocol_.type() == SOCK_STREAM) - { - // Determine total size of buffers. - typename Const_Buffers::const_iterator iter = buffers.begin(); - typename Const_Buffers::const_iterator end = buffers.end(); - size_t i = 0; - size_t total_buffer_size = 0; - for (; iter != end && i < max_buffers; ++iter, ++i) - { - asio::const_buffer buffer(*iter); - total_buffer_size += asio::buffer_size(buffer); - } - - // A request to receive 0 bytes on a stream socket is a no-op. - if (total_buffer_size == 0) - { - asio::error error(asio::error::success); - io_service().post(bind_handler(handler, error, 0)); - return; - } - } - - // Make socket non-blocking. - if (!(impl.flags_ & implementation_type::internal_non_blocking)) - { - ioctl_arg_type non_blocking = 1; - if (socket_ops::ioctl(impl.socket_, FIONBIO, &non_blocking)) - { - asio::error error(socket_ops::get_error()); - io_service().post(bind_handler(handler, error, 0)); - return; - } - impl.flags_ |= implementation_type::internal_non_blocking; - } - - reactor_.start_write_op(impl.socket_, - send_handler( - impl.socket_, io_service(), buffers, flags, handler)); - } - } - - // Send a datagram to the specified endpoint. Returns the number of bytes - // sent. - template - size_t send_to(implementation_type& impl, const Const_Buffers& buffers, - const endpoint_type& destination, socket_base::message_flags flags, - Error_Handler error_handler) - { - // Copy buffers into array. - socket_ops::buf bufs[max_buffers]; - typename Const_Buffers::const_iterator iter = buffers.begin(); - typename Const_Buffers::const_iterator end = buffers.end(); - size_t i = 0; - for (; iter != end && i < max_buffers; ++iter, ++i) - { - asio::const_buffer buffer(*iter); - socket_ops::init_buf(bufs[i], - asio::buffer_cast(buffer), - asio::buffer_size(buffer)); - } - - // Send the data. - for (;;) - { - // Try to complete the operation without blocking. - int bytes_sent = socket_ops::sendto(impl.socket_, bufs, i, flags, - destination.data(), destination.size()); - int error = socket_ops::get_error(); - - // Check if operation succeeded. - if (bytes_sent >= 0) - { - error_handler(asio::error(0)); - return bytes_sent; - } - - // Operation failed. - if ((impl.flags_ & implementation_type::user_set_non_blocking) - || (error != asio::error::would_block - && error != asio::error::try_again)) - { - error_handler(asio::error(error)); - return 0; - } - - // Wait for socket to become ready. - if (socket_ops::poll_write(impl.socket_) < 0) - { - error_handler(asio::error(socket_ops::get_error())); - return 0; - } - } - } - - template - class send_to_handler - { - public: - send_to_handler(socket_type socket, asio::io_service& io_service, - const Const_Buffers& buffers, const endpoint_type& endpoint, - socket_base::message_flags flags, Handler handler) - : socket_(socket), - io_service_(io_service), - work_(io_service), - buffers_(buffers), - destination_(endpoint), - flags_(flags), - handler_(handler) - { - } - - bool operator()(int result) - { - // Check whether the operation was successful. - if (result != 0) - { - asio::error error(result); - io_service_.post(bind_handler(handler_, error, 0)); - return true; - } - - // Copy buffers into array. - socket_ops::buf bufs[max_buffers]; - typename Const_Buffers::const_iterator iter = buffers_.begin(); - typename Const_Buffers::const_iterator end = buffers_.end(); - size_t i = 0; - for (; iter != end && i < max_buffers; ++iter, ++i) - { - asio::const_buffer buffer(*iter); - socket_ops::init_buf(bufs[i], - asio::buffer_cast(buffer), - asio::buffer_size(buffer)); - } - - // Send the data. - int bytes = socket_ops::sendto(socket_, bufs, i, flags_, - destination_.data(), destination_.size()); - asio::error error(bytes < 0 - ? socket_ops::get_error() : asio::error::success); - - // Check if we need to run the operation again. - if (error == asio::error::would_block - || error == asio::error::try_again) - return false; - - io_service_.post(bind_handler(handler_, error, bytes < 0 ? 0 : bytes)); - return true; - } - - private: - socket_type socket_; - asio::io_service& io_service_; - asio::io_service::work work_; - Const_Buffers buffers_; - endpoint_type destination_; - socket_base::message_flags flags_; - Handler handler_; - }; - - // Start an asynchronous send. The data being sent must be valid for the - // lifetime of the asynchronous operation. - template - void async_send_to(implementation_type& impl, const Const_Buffers& buffers, - const endpoint_type& destination, socket_base::message_flags flags, - Handler handler) - { - if (impl.socket_ == invalid_socket) - { - asio::error error(asio::error::bad_descriptor); - io_service().post(bind_handler(handler, error, 0)); - } - else - { - // Make socket non-blocking. - if (!(impl.flags_ & implementation_type::internal_non_blocking)) - { - ioctl_arg_type non_blocking = 1; - if (socket_ops::ioctl(impl.socket_, FIONBIO, &non_blocking)) - { - asio::error error(socket_ops::get_error()); - io_service().post(bind_handler(handler, error, 0)); - return; - } - impl.flags_ |= implementation_type::internal_non_blocking; - } - - reactor_.start_write_op(impl.socket_, - send_to_handler( - impl.socket_, io_service(), buffers, destination, flags, handler)); - } - } - - // Receive some data from the peer. Returns the number of bytes received. - template - size_t receive(implementation_type& impl, const Mutable_Buffers& buffers, - socket_base::message_flags flags, Error_Handler error_handler) - { - // Copy buffers into array. - socket_ops::buf bufs[max_buffers]; - typename Mutable_Buffers::const_iterator iter = buffers.begin(); - typename Mutable_Buffers::const_iterator end = buffers.end(); - size_t i = 0; - size_t total_buffer_size = 0; - for (; iter != end && i < max_buffers; ++iter, ++i) - { - asio::mutable_buffer buffer(*iter); - socket_ops::init_buf(bufs[i], - asio::buffer_cast(buffer), - asio::buffer_size(buffer)); - total_buffer_size += asio::buffer_size(buffer); - } - - // A request to receive 0 bytes on a stream socket is a no-op. - if (impl.protocol_.type() == SOCK_STREAM && total_buffer_size == 0) - { - error_handler(asio::error(0)); - return 0; - } - - // Receive some data. - for (;;) - { - // Try to complete the operation without blocking. - int bytes_recvd = socket_ops::recv(impl.socket_, bufs, i, flags); - int error = socket_ops::get_error(); - - // Check if operation succeeded. - if (bytes_recvd > 0) - { - error_handler(asio::error(0)); - return bytes_recvd; - } - - // Check for EOF. - if (bytes_recvd == 0) - { - error_handler(asio::error(asio::error::eof)); - return 0; - } - - // Operation failed. - if ((impl.flags_ & implementation_type::user_set_non_blocking) - || (error != asio::error::would_block - && error != asio::error::try_again)) - { - error_handler(asio::error(error)); - return 0; - } - - // Wait for socket to become ready. - if (socket_ops::poll_read(impl.socket_) < 0) - { - error_handler(asio::error(socket_ops::get_error())); - return 0; - } - } - } - - template - class receive_handler - { - public: - receive_handler(socket_type socket, asio::io_service& io_service, - const Mutable_Buffers& buffers, socket_base::message_flags flags, - Handler handler) - : socket_(socket), - io_service_(io_service), - work_(io_service), - buffers_(buffers), - flags_(flags), - handler_(handler) - { - } - - bool operator()(int result) - { - // Check whether the operation was successful. - if (result != 0) - { - asio::error error(result); - io_service_.post(bind_handler(handler_, error, 0)); - return true; - } - - // Copy buffers into array. - socket_ops::buf bufs[max_buffers]; - typename Mutable_Buffers::const_iterator iter = buffers_.begin(); - typename Mutable_Buffers::const_iterator end = buffers_.end(); - size_t i = 0; - for (; iter != end && i < max_buffers; ++iter, ++i) - { - asio::mutable_buffer buffer(*iter); - socket_ops::init_buf(bufs[i], - asio::buffer_cast(buffer), - asio::buffer_size(buffer)); - } - - // Receive some data. - int bytes = socket_ops::recv(socket_, bufs, i, flags_); - int error_code = asio::error::success; - if (bytes < 0) - error_code = socket_ops::get_error(); - else if (bytes == 0) - error_code = asio::error::eof; - asio::error error(error_code); - - // Check if we need to run the operation again. - if (error == asio::error::would_block - || error == asio::error::try_again) - return false; - - io_service_.post(bind_handler(handler_, error, bytes < 0 ? 0 : bytes)); - return true; - } - - private: - socket_type socket_; - asio::io_service& io_service_; - asio::io_service::work work_; - Mutable_Buffers buffers_; - socket_base::message_flags flags_; - Handler handler_; - }; - - // Start an asynchronous receive. The buffer for the data being received - // must be valid for the lifetime of the asynchronous operation. - template - void async_receive(implementation_type& impl, const Mutable_Buffers& buffers, - socket_base::message_flags flags, Handler handler) - { - if (impl.socket_ == invalid_socket) - { - asio::error error(asio::error::bad_descriptor); - io_service().post(bind_handler(handler, error, 0)); - } - else - { - if (impl.protocol_.type() == SOCK_STREAM) - { - // Determine total size of buffers. - typename Mutable_Buffers::const_iterator iter = buffers.begin(); - typename Mutable_Buffers::const_iterator end = buffers.end(); - size_t i = 0; - size_t total_buffer_size = 0; - for (; iter != end && i < max_buffers; ++iter, ++i) - { - asio::mutable_buffer buffer(*iter); - total_buffer_size += asio::buffer_size(buffer); - } - - // A request to receive 0 bytes on a stream socket is a no-op. - if (total_buffer_size == 0) - { - asio::error error(asio::error::success); - io_service().post(bind_handler(handler, error, 0)); - return; - } - } - - // Make socket non-blocking. - if (!(impl.flags_ & implementation_type::internal_non_blocking)) - { - ioctl_arg_type non_blocking = 1; - if (socket_ops::ioctl(impl.socket_, FIONBIO, &non_blocking)) - { - asio::error error(socket_ops::get_error()); - io_service().post(bind_handler(handler, error, 0)); - return; - } - impl.flags_ |= implementation_type::internal_non_blocking; - } - - if (flags & socket_base::message_out_of_band) - { - reactor_.start_except_op(impl.socket_, - receive_handler( - impl.socket_, io_service(), buffers, flags, handler)); - } - else - { - reactor_.start_read_op(impl.socket_, - receive_handler( - impl.socket_, io_service(), buffers, flags, handler)); - } - } - } - - // Receive a datagram with the endpoint of the sender. Returns the number of - // bytes received. - template - size_t receive_from(implementation_type& impl, const Mutable_Buffers& buffers, - endpoint_type& sender_endpoint, socket_base::message_flags flags, - Error_Handler error_handler) - { - // Copy buffers into array. - socket_ops::buf bufs[max_buffers]; - typename Mutable_Buffers::const_iterator iter = buffers.begin(); - typename Mutable_Buffers::const_iterator end = buffers.end(); - size_t i = 0; - for (; iter != end && i < max_buffers; ++iter, ++i) - { - asio::mutable_buffer buffer(*iter); - socket_ops::init_buf(bufs[i], - asio::buffer_cast(buffer), - asio::buffer_size(buffer)); - } - - // Receive some data. - for (;;) - { - // Try to complete the operation without blocking. - socket_addr_len_type addr_len = sender_endpoint.capacity(); - int bytes_recvd = socket_ops::recvfrom(impl.socket_, bufs, i, flags, - sender_endpoint.data(), &addr_len); - int error = socket_ops::get_error(); - - // Check if operation succeeded. - if (bytes_recvd > 0) - { - sender_endpoint.resize(addr_len); - error_handler(asio::error(0)); - return bytes_recvd; - } - - // Check for EOF. - if (bytes_recvd == 0) - { - error_handler(asio::error(asio::error::eof)); - return 0; - } - - // Operation failed. - if ((impl.flags_ & implementation_type::user_set_non_blocking) - || (error != asio::error::would_block - && error != asio::error::try_again)) - { - error_handler(asio::error(error)); - return 0; - } - - // Wait for socket to become ready. - if (socket_ops::poll_read(impl.socket_) < 0) - { - error_handler(asio::error(socket_ops::get_error())); - return 0; - } - } - } - - template - class receive_from_handler - { - public: - receive_from_handler(socket_type socket, - asio::io_service& io_service, const Mutable_Buffers& buffers, - endpoint_type& endpoint, socket_base::message_flags flags, - Handler handler) - : socket_(socket), - io_service_(io_service), - work_(io_service), - buffers_(buffers), - sender_endpoint_(endpoint), - flags_(flags), - handler_(handler) - { - } - - bool operator()(int result) - { - // Check whether the operation was successful. - if (result != 0) - { - asio::error error(result); - io_service_.post(bind_handler(handler_, error, 0)); - return true; - } - - // Copy buffers into array. - socket_ops::buf bufs[max_buffers]; - typename Mutable_Buffers::const_iterator iter = buffers_.begin(); - typename Mutable_Buffers::const_iterator end = buffers_.end(); - size_t i = 0; - for (; iter != end && i < max_buffers; ++iter, ++i) - { - asio::mutable_buffer buffer(*iter); - socket_ops::init_buf(bufs[i], - asio::buffer_cast(buffer), - asio::buffer_size(buffer)); - } - - // Receive some data. - socket_addr_len_type addr_len = sender_endpoint_.capacity(); - int bytes = socket_ops::recvfrom(socket_, bufs, i, flags_, - sender_endpoint_.data(), &addr_len); - int error_code = asio::error::success; - if (bytes < 0) - error_code = socket_ops::get_error(); - else if (bytes == 0) - error_code = asio::error::eof; - asio::error error(error_code); - - // Check if we need to run the operation again. - if (error == asio::error::would_block - || error == asio::error::try_again) - return false; - - sender_endpoint_.resize(addr_len); - io_service_.post(bind_handler(handler_, error, bytes < 0 ? 0 : bytes)); - return true; - } - - private: - socket_type socket_; - asio::io_service& io_service_; - asio::io_service::work work_; - Mutable_Buffers buffers_; - endpoint_type& sender_endpoint_; - socket_base::message_flags flags_; - Handler handler_; - }; - - // Start an asynchronous receive. The buffer for the data being received and - // the sender_endpoint object must both be valid for the lifetime of the - // asynchronous operation. - template - void async_receive_from(implementation_type& impl, - const Mutable_Buffers& buffers, endpoint_type& sender_endpoint, - socket_base::message_flags flags, Handler handler) - { - if (impl.socket_ == invalid_socket) - { - asio::error error(asio::error::bad_descriptor); - io_service().post(bind_handler(handler, error, 0)); - } - else - { - // Make socket non-blocking. - if (!(impl.flags_ & implementation_type::internal_non_blocking)) - { - ioctl_arg_type non_blocking = 1; - if (socket_ops::ioctl(impl.socket_, FIONBIO, &non_blocking)) - { - asio::error error(socket_ops::get_error()); - io_service().post(bind_handler(handler, error, 0)); - return; - } - impl.flags_ |= implementation_type::internal_non_blocking; - } - - reactor_.start_read_op(impl.socket_, - receive_from_handler( - impl.socket_, io_service(), buffers, - sender_endpoint, flags, handler)); - } - } - - // Accept a new connection. - template - void accept(implementation_type& impl, Socket& peer, - Error_Handler error_handler) - { - // We cannot accept a socket that is already open. - if (peer.native() != invalid_socket) - { - error_handler(asio::error(asio::error::already_connected)); - return; - } - - // Accept a socket. - for (;;) - { - // Try to complete the operation without blocking. - socket_holder new_socket(socket_ops::accept(impl.socket_, 0, 0)); - int error = socket_ops::get_error(); - - // Check if operation succeeded. - if (new_socket.get() >= 0) - { - asio::error temp_error; - peer.assign(impl.protocol_, new_socket.get(), - asio::assign_error(temp_error)); - if (temp_error) - { - error_handler(temp_error); - } - else - { - new_socket.release(); - error_handler(asio::error(0)); - } - return; - } - - // Operation failed. - if (error == asio::error::would_block - || error == asio::error::try_again) - { - if (impl.flags_ & implementation_type::user_set_non_blocking) - { - error_handler(asio::error(error)); - return; - } - // Fall through to retry operation. - } - else if (error == asio::error::connection_aborted) - { - if (impl.flags_ & implementation_type::enable_connection_aborted) - { - error_handler(asio::error(error)); - return; - } - // Fall through to retry operation. - } - else - { - error_handler(asio::error(error)); - return; - } - - // Wait for socket to become ready. - if (socket_ops::poll_read(impl.socket_) < 0) - { - error_handler(asio::error(socket_ops::get_error())); - return; - } - } - } - - // Accept a new connection. - template - void accept_endpoint(implementation_type& impl, Socket& peer, - endpoint_type& peer_endpoint, Error_Handler error_handler) - { - // We cannot accept a socket that is already open. - if (peer.native() != invalid_socket) - { - error_handler(asio::error(asio::error::already_connected)); - return; - } - - // Accept a socket. - for (;;) - { - // Try to complete the operation without blocking. - socket_addr_len_type addr_len = peer_endpoint.capacity(); - socket_holder new_socket(socket_ops::accept( - impl.socket_, peer_endpoint.data(), &addr_len)); - int error = socket_ops::get_error(); - - // Check if operation succeeded. - if (new_socket.get() >= 0) - { - peer_endpoint.resize(addr_len); - asio::error temp_error; - peer.assign(impl.protocol_, new_socket.get(), - asio::assign_error(temp_error)); - if (temp_error) - { - error_handler(temp_error); - } - else - { - new_socket.release(); - error_handler(asio::error(0)); - } - return; - } - - // Operation failed. - if (error == asio::error::would_block - || error == asio::error::try_again) - { - if (impl.flags_ & implementation_type::user_set_non_blocking) - { - error_handler(asio::error(error)); - return; - } - // Fall through to retry operation. - } - else if (error == asio::error::connection_aborted) - { - if (impl.flags_ & implementation_type::enable_connection_aborted) - { - error_handler(asio::error(error)); - return; - } - // Fall through to retry operation. - } - else - { - error_handler(asio::error(error)); - return; - } - - // Wait for socket to become ready. - if (socket_ops::poll_read(impl.socket_) < 0) - { - error_handler(asio::error(socket_ops::get_error())); - return; - } - } - } - - template - class accept_handler - { - public: - accept_handler(socket_type socket, asio::io_service& io_service, - Socket& peer, const protocol_type& protocol, - bool enable_connection_aborted, Handler handler) - : socket_(socket), - io_service_(io_service), - work_(io_service), - peer_(peer), - protocol_(protocol), - enable_connection_aborted_(enable_connection_aborted), - handler_(handler) - { - } - - bool operator()(int result) - { - // Check whether the operation was successful. - if (result != 0) - { - asio::error error(result); - io_service_.post(bind_handler(handler_, error)); - return true; - } - - // Accept the waiting connection. - socket_holder new_socket(socket_ops::accept(socket_, 0, 0)); - asio::error error(new_socket.get() == invalid_socket - ? socket_ops::get_error() : asio::error::success); - - // Check if we need to run the operation again. - if (error == asio::error::would_block - || error == asio::error::try_again) - return false; - if (error == asio::error::connection_aborted - && !enable_connection_aborted_) - return false; - - // Transfer ownership of the new socket to the peer object. - if (!error) - { - peer_.assign(protocol_, new_socket.get(), - asio::assign_error(error)); - if (!error) - new_socket.release(); - } - - io_service_.post(bind_handler(handler_, error)); - return true; - } - - private: - socket_type socket_; - asio::io_service& io_service_; - asio::io_service::work work_; - Socket& peer_; - protocol_type protocol_; - bool enable_connection_aborted_; - Handler handler_; - }; - - // Start an asynchronous accept. The peer object must be valid until the - // accept's handler is invoked. - template - void async_accept(implementation_type& impl, Socket& peer, Handler handler) - { - if (impl.socket_ == invalid_socket) - { - asio::error error(asio::error::bad_descriptor); - io_service().post(bind_handler(handler, error)); - } - else if (peer.native() != invalid_socket) - { - asio::error error(asio::error::already_connected); - io_service().post(bind_handler(handler, error)); - } - else - { - // Make socket non-blocking. - if (!(impl.flags_ & implementation_type::internal_non_blocking)) - { - ioctl_arg_type non_blocking = 1; - if (socket_ops::ioctl(impl.socket_, FIONBIO, &non_blocking)) - { - asio::error error(socket_ops::get_error()); - io_service().post(bind_handler(handler, error)); - return; - } - impl.flags_ |= implementation_type::internal_non_blocking; - } - - reactor_.start_read_op(impl.socket_, - accept_handler( - impl.socket_, io_service(), peer, impl.protocol_, - (impl.flags_ & implementation_type::enable_connection_aborted) != 0, - handler)); - } - } - - template - class accept_endp_handler - { - public: - accept_endp_handler(socket_type socket, asio::io_service& io_service, - Socket& peer, endpoint_type& peer_endpoint, - bool enable_connection_aborted, Handler handler) - : socket_(socket), - io_service_(io_service), - work_(io_service), - peer_(peer), - peer_endpoint_(peer_endpoint), - enable_connection_aborted_(enable_connection_aborted), - handler_(handler) - { - } - - bool operator()(int result) - { - // Check whether the operation was successful. - if (result != 0) - { - asio::error error(result); - io_service_.post(bind_handler(handler_, error)); - return true; - } - - // Accept the waiting connection. - socket_addr_len_type addr_len = peer_endpoint_.capacity(); - socket_holder new_socket(socket_ops::accept( - socket_, peer_endpoint_.data(), &addr_len)); - asio::error error(new_socket.get() == invalid_socket - ? socket_ops::get_error() : asio::error::success); - - // Check if we need to run the operation again. - if (error == asio::error::would_block - || error == asio::error::try_again) - return false; - if (error == asio::error::connection_aborted - && !enable_connection_aborted_) - return false; - - // Transfer ownership of the new socket to the peer object. - if (!error) - { - peer_endpoint_.resize(addr_len); - peer_.assign(peer_endpoint_.protocol(), new_socket.get(), - asio::assign_error(error)); - if (!error) - new_socket.release(); - } - - io_service_.post(bind_handler(handler_, error)); - return true; - } - - private: - socket_type socket_; - asio::io_service& io_service_; - asio::io_service::work work_; - Socket& peer_; - endpoint_type& peer_endpoint_; - bool enable_connection_aborted_; - Handler handler_; - }; - - // Start an asynchronous accept. The peer and peer_endpoint objects - // must be valid until the accept's handler is invoked. - template - void async_accept_endpoint(implementation_type& impl, Socket& peer, - endpoint_type& peer_endpoint, Handler handler) - { - if (impl.socket_ == invalid_socket) - { - asio::error error(asio::error::bad_descriptor); - io_service().post(bind_handler(handler, error)); - } - else if (peer.native() != invalid_socket) - { - asio::error error(asio::error::already_connected); - io_service().post(bind_handler(handler, error)); - } - else - { - // Make socket non-blocking. - if (!(impl.flags_ & implementation_type::internal_non_blocking)) - { - ioctl_arg_type non_blocking = 1; - if (socket_ops::ioctl(impl.socket_, FIONBIO, &non_blocking)) - { - asio::error error(socket_ops::get_error()); - io_service().post(bind_handler(handler, error)); - return; - } - impl.flags_ |= implementation_type::internal_non_blocking; - } - - reactor_.start_read_op(impl.socket_, - accept_endp_handler( - impl.socket_, io_service(), peer, peer_endpoint, - (impl.flags_ & implementation_type::enable_connection_aborted) != 0, - handler)); - } - } - - // Connect the socket to the specified endpoint. - template - void connect(implementation_type& impl, const endpoint_type& peer_endpoint, - Error_Handler error_handler) - { - // Open the socket if it is not already open. - if (impl.socket_ == invalid_socket) - { - // Get the flags used to create the new socket. - int family = peer_endpoint.protocol().family(); - int type = peer_endpoint.protocol().type(); - int proto = peer_endpoint.protocol().protocol(); - - // Create a new socket. - impl.socket_ = socket_ops::socket(family, type, proto); - if (impl.socket_ == invalid_socket) - { - error_handler(asio::error(socket_ops::get_error())); - return; - } - - // Register the socket with the reactor. - if (int err = reactor_.register_descriptor(impl.socket_)) - { - socket_ops::close(impl.socket_); - error_handler(asio::error(err)); - return; - } - } - else if (impl.flags_ & implementation_type::internal_non_blocking) - { - // Mark the socket as blocking while we perform the connect. - ioctl_arg_type non_blocking = 0; - if (socket_ops::ioctl(impl.socket_, FIONBIO, &non_blocking)) - { - error_handler(asio::error(socket_ops::get_error())); - return; - } - impl.flags_ &= ~implementation_type::internal_non_blocking; - } - - // Perform the connect operation. - int result = socket_ops::connect(impl.socket_, - peer_endpoint.data(), peer_endpoint.size()); - if (result == socket_error_retval) - error_handler(asio::error(socket_ops::get_error())); - else - error_handler(asio::error(0)); - } - - template - class connect_handler - { - public: - connect_handler(socket_type socket, boost::shared_ptr completed, - asio::io_service& io_service, Reactor& reactor, Handler handler) - : socket_(socket), - completed_(completed), - io_service_(io_service), - work_(io_service), - reactor_(reactor), - handler_(handler) - { - } - - bool operator()(int result) - { - // Check whether a handler has already been called for the connection. - // If it has, then we don't want to do anything in this handler. - if (*completed_) - return true; - - // Cancel the other reactor operation for the connection. - *completed_ = true; - reactor_.enqueue_cancel_ops_unlocked(socket_); - - // Check whether the operation was successful. - if (result != 0) - { - asio::error error(result); - io_service_.post(bind_handler(handler_, error)); - return true; - } - - // Get the error code from the connect operation. - int connect_error = 0; - size_t connect_error_len = sizeof(connect_error); - if (socket_ops::getsockopt(socket_, SOL_SOCKET, SO_ERROR, - &connect_error, &connect_error_len) == socket_error_retval) - { - asio::error error(socket_ops::get_error()); - io_service_.post(bind_handler(handler_, error)); - return true; - } - - // If connection failed then post the handler with the error code. - if (connect_error) - { - asio::error error(connect_error); - io_service_.post(bind_handler(handler_, error)); - return true; - } - - // Post the result of the successful connection operation. - asio::error error(asio::error::success); - io_service_.post(bind_handler(handler_, error)); - - return true; - } - - private: - socket_type socket_; - boost::shared_ptr completed_; - asio::io_service& io_service_; - asio::io_service::work work_; - Reactor& reactor_; - Handler handler_; - }; - - // Start an asynchronous connect. - template - void async_connect(implementation_type& impl, - const endpoint_type& peer_endpoint, Handler handler) - { - // Open the socket if it is not already open. - if (impl.socket_ == invalid_socket) - { - // Get the flags used to create the new socket. - int family = peer_endpoint.protocol().family(); - int type = peer_endpoint.protocol().type(); - int proto = peer_endpoint.protocol().protocol(); - - // Create a new socket. - impl.socket_ = socket_ops::socket(family, type, proto); - if (impl.socket_ == invalid_socket) - { - asio::error error(socket_ops::get_error()); - io_service().post(bind_handler(handler, error)); - return; - } - - // Register the socket with the reactor. - if (int err = reactor_.register_descriptor(impl.socket_)) - { - socket_ops::close(impl.socket_); - asio::error error(err); - io_service().post(bind_handler(handler, error)); - return; - } - } - - // Make socket non-blocking. - if (!(impl.flags_ & implementation_type::internal_non_blocking)) - { - ioctl_arg_type non_blocking = 1; - if (socket_ops::ioctl(impl.socket_, FIONBIO, &non_blocking)) - { - asio::error error(socket_ops::get_error()); - io_service().post(bind_handler(handler, error)); - return; - } - impl.flags_ |= implementation_type::internal_non_blocking; - } - - // Start the connect operation. The socket is already marked as non-blocking - // so the connection will take place asynchronously. - if (socket_ops::connect(impl.socket_, peer_endpoint.data(), - peer_endpoint.size()) == 0) - { - // The connect operation has finished successfully so we need to post the - // handler immediately. - asio::error error(asio::error::success); - io_service().post(bind_handler(handler, error)); - } - else if (socket_ops::get_error() == asio::error::in_progress - || socket_ops::get_error() == asio::error::would_block) - { - // The connection is happening in the background, and we need to wait - // until the socket becomes writeable. - boost::shared_ptr completed(new bool(false)); - reactor_.start_write_and_except_ops(impl.socket_, - connect_handler( - impl.socket_, completed, io_service(), reactor_, handler)); - } - else - { - // The connect operation has failed, so post the handler immediately. - asio::error error(socket_ops::get_error()); - io_service().post(bind_handler(handler, error)); - } - } - -private: - // The selector that performs event demultiplexing for the provider. - Reactor& reactor_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_REACTIVE_SOCKET_SERVICE_HPP diff --git a/libtorrent/include/asio/detail/reactor_op_queue.hpp b/libtorrent/include/asio/detail/reactor_op_queue.hpp deleted file mode 100644 index dbf86c2e5..000000000 --- a/libtorrent/include/asio/detail/reactor_op_queue.hpp +++ /dev/null @@ -1,379 +0,0 @@ -// -// reactor_op_queue.hpp -// ~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_REACTOR_OP_QUEUE_HPP -#define ASIO_DETAIL_REACTOR_OP_QUEUE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/error.hpp" -#include "asio/detail/hash_map.hpp" -#include "asio/detail/noncopyable.hpp" - -namespace asio { -namespace detail { - -template -class reactor_op_queue - : private noncopyable -{ -public: - // Constructor. - reactor_op_queue() - : operations_(), - cancelled_operations_(0), - cleanup_operations_(0) - { - } - - // Add a new operation to the queue. Returns true if this is the only - // operation for the given descriptor, in which case the reactor's event - // demultiplexing function call may need to be interrupted and restarted. - template - bool enqueue_operation(Descriptor descriptor, Handler handler) - { - op_base* new_op = new op(descriptor, handler); - - typedef typename operation_map::iterator iterator; - typedef typename operation_map::value_type value_type; - std::pair entry = - operations_.insert(value_type(descriptor, new_op)); - if (entry.second) - return true; - - op_base* current_op = entry.first->second; - while (current_op->next_) - current_op = current_op->next_; - current_op->next_ = new_op; - - return false; - } - - // Cancel all operations associated with the descriptor. Any operations - // pending for the descriptor will be notified that they have been cancelled - // next time dispatch_cancellations is called. Returns true if any operations - // were cancelled, in which case the reactor's event demultiplexing function - // may need to be interrupted and restarted. - bool cancel_operations(Descriptor descriptor) - { - typename operation_map::iterator i = operations_.find(descriptor); - if (i != operations_.end()) - { - op_base* last_op = i->second; - while (last_op->next_) - last_op = last_op->next_; - last_op->next_ = cancelled_operations_; - cancelled_operations_ = i->second; - operations_.erase(i); - return true; - } - - return false; - } - - // Whether there are no operations in the queue. - bool empty() const - { - return operations_.empty(); - } - - // Determine whether there are any operations associated with the descriptor. - bool has_operation(Descriptor descriptor) const - { - return operations_.find(descriptor) != operations_.end(); - } - - // Dispatch the first operation corresponding to the descriptor. Returns true - // if there are more operations queued for the descriptor. - bool dispatch_operation(Descriptor descriptor, int result) - { - typename operation_map::iterator i = operations_.find(descriptor); - if (i != operations_.end()) - { - op_base* this_op = i->second; - i->second = this_op->next_; - this_op->next_ = cleanup_operations_; - cleanup_operations_ = this_op; - bool done = this_op->invoke(result); - if (done) - { - // Operation has finished. - if (i->second) - { - return true; - } - else - { - operations_.erase(i); - return false; - } - } - else - { - // Operation wants to be called again. Leave it at the front of the - // queue for this descriptor, and remove from the cleanup list. - cleanup_operations_ = this_op->next_; - this_op->next_ = i->second; - i->second = this_op; - return true; - } - } - return false; - } - - // Dispatch all operations corresponding to the descriptor. - void dispatch_all_operations(Descriptor descriptor, int result) - { - typename operation_map::iterator i = operations_.find(descriptor); - if (i != operations_.end()) - { - while (i->second) - { - op_base* this_op = i->second; - i->second = this_op->next_; - this_op->next_ = cleanup_operations_; - cleanup_operations_ = this_op; - bool done = this_op->invoke(result); - if (!done) - { - // Operation has not finished yet, so leave at front of queue, and - // remove from the cleanup list. - cleanup_operations_ = this_op->next_; - this_op->next_ = i->second; - i->second = this_op; - return; - } - operations_.erase(i); - } - } - } - - // Fill a descriptor set with the descriptors corresponding to each active - // operation. - template - void get_descriptors(Descriptor_Set& descriptors) - { - typename operation_map::iterator i = operations_.begin(); - while (i != operations_.end()) - { - descriptors.set(i->first); - ++i; - } - } - - // Dispatch the operations corresponding to the ready file descriptors - // contained in the given descriptor set. - template - void dispatch_descriptors(const Descriptor_Set& descriptors, int result) - { - typename operation_map::iterator i = operations_.begin(); - while (i != operations_.end()) - { - typename operation_map::iterator op_iter = i++; - if (descriptors.is_set(op_iter->first)) - { - op_base* this_op = op_iter->second; - op_iter->second = this_op->next_; - this_op->next_ = cleanup_operations_; - cleanup_operations_ = this_op; - bool done = this_op->invoke(result); - if (done) - { - if (!op_iter->second) - operations_.erase(op_iter); - } - else - { - // Operation has not finished yet, so leave at front of queue, and - // remove from the cleanup list. - cleanup_operations_ = this_op->next_; - this_op->next_ = op_iter->second; - op_iter->second = this_op; - } - } - } - } - - // Dispatch any pending cancels for operations. - void dispatch_cancellations() - { - while (cancelled_operations_) - { - op_base* this_op = cancelled_operations_; - cancelled_operations_ = this_op->next_; - this_op->next_ = cleanup_operations_; - cleanup_operations_ = this_op; - this_op->invoke(asio::error::operation_aborted); - } - } - - // Destroy operations that are waiting to be cleaned up. - void cleanup_operations() - { - while (cleanup_operations_) - { - op_base* next_op = cleanup_operations_->next_; - cleanup_operations_->next_ = 0; - cleanup_operations_->destroy(); - cleanup_operations_ = next_op; - } - } - - // Destroy all operations owned by the queue. - void destroy_operations() - { - while (cancelled_operations_) - { - op_base* next_op = cancelled_operations_->next_; - cancelled_operations_->next_ = 0; - cancelled_operations_->destroy(); - cancelled_operations_ = next_op; - } - - while (cleanup_operations_) - { - op_base* next_op = cleanup_operations_->next_; - cleanup_operations_->next_ = 0; - cleanup_operations_->destroy(); - cleanup_operations_ = next_op; - } - - typename operation_map::iterator i = operations_.begin(); - while (i != operations_.end()) - { - typename operation_map::iterator op_iter = i++; - op_base* curr_op = op_iter->second; - operations_.erase(op_iter); - while (curr_op) - { - op_base* next_op = curr_op->next_; - curr_op->next_ = 0; - curr_op->destroy(); - curr_op = next_op; - } - } - } - -private: - // Base class for reactor operations. A function pointer is used instead of - // virtual functions to avoid the associated overhead. - class op_base - { - public: - // Get the descriptor associated with the operation. - Descriptor descriptor() const - { - return descriptor_; - } - - // Perform the operation. - bool invoke(int result) - { - return invoke_func_(this, result); - } - - // Destroy the operation. - void destroy() - { - return destroy_func_(this); - } - - protected: - typedef bool (*invoke_func_type)(op_base*, int); - typedef void (*destroy_func_type)(op_base*); - - // Construct an operation for the given descriptor. - op_base(invoke_func_type invoke_func, - destroy_func_type destroy_func, Descriptor descriptor) - : invoke_func_(invoke_func), - destroy_func_(destroy_func), - descriptor_(descriptor), - next_(0) - { - } - - // Prevent deletion through this type. - ~op_base() - { - } - - private: - friend class reactor_op_queue; - - // The function to be called to dispatch the handler. - invoke_func_type invoke_func_; - - // The function to be called to delete the handler. - destroy_func_type destroy_func_; - - // The descriptor associated with the operation. - Descriptor descriptor_; - - // The next operation for the same file descriptor. - op_base* next_; - }; - - // Adaptor class template for using handlers in operations. - template - class op - : public op_base - { - public: - // Constructor. - op(Descriptor descriptor, Handler handler) - : op_base(&op::invoke_handler, - &op::destroy_handler, descriptor), - handler_(handler) - { - } - - // Invoke the handler. - static bool invoke_handler(op_base* base, int result) - { - return static_cast*>(base)->handler_(result); - } - - // Delete the handler. - static void destroy_handler(op_base* base) - { - delete static_cast*>(base); - } - - private: - Handler handler_; - }; - - // The type for a map of operations. - typedef hash_map operation_map; - - // The operations that are currently executing asynchronously. - operation_map operations_; - - // The list of operations that have been cancelled. - op_base* cancelled_operations_; - - // The list of operations to be destroyed. - op_base* cleanup_operations_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_REACTOR_OP_QUEUE_HPP diff --git a/libtorrent/include/asio/detail/resolver_service.hpp b/libtorrent/include/asio/detail/resolver_service.hpp deleted file mode 100644 index 31c87e58e..000000000 --- a/libtorrent/include/asio/detail/resolver_service.hpp +++ /dev/null @@ -1,361 +0,0 @@ -// -// resolver_service.hpp -// ~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_RESOLVER_SERVICE_HPP -#define ASIO_DETAIL_RESOLVER_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/error.hpp" -#include "asio/io_service.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/mutex.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/detail/thread.hpp" - -namespace asio { -namespace detail { - -template -class resolver_service - : public asio::io_service::service -{ -private: - // Helper class to perform exception-safe cleanup of addrinfo objects. - class auto_addrinfo - : private asio::detail::noncopyable - { - public: - explicit auto_addrinfo(asio::detail::addrinfo_type* ai) - : ai_(ai) - { - } - - ~auto_addrinfo() - { - if (ai_) - socket_ops::freeaddrinfo(ai_); - } - - operator asio::detail::addrinfo_type*() - { - return ai_; - } - - private: - asio::detail::addrinfo_type* ai_; - }; - -public: - // The implementation type of the resolver. The shared pointer is used as a - // cancellation token to indicate to the background thread that the operation - // has been cancelled. - typedef boost::shared_ptr implementation_type; - struct noop_deleter { void operator()(void*) {} }; - - // The endpoint type. - typedef typename Protocol::endpoint endpoint_type; - - // The query type. - typedef typename Protocol::resolver_query query_type; - - // The iterator type. - typedef typename Protocol::resolver_iterator iterator_type; - - // Constructor. - resolver_service(asio::io_service& io_service) - : asio::io_service::service(io_service), - mutex_(), - work_io_service_(new asio::io_service), - work_(new asio::io_service::work(*work_io_service_)), - work_thread_(0) - { - } - - // Destructor. - ~resolver_service() - { - shutdown_service(); - } - - // Destroy all user-defined handler objects owned by the service. - void shutdown_service() - { - work_.reset(); - if (work_io_service_) - { - work_io_service_->interrupt(); - if (work_thread_) - { - work_thread_->join(); - work_thread_.reset(); - } - work_io_service_.reset(); - } - } - - // Construct a new resolver implementation. - void construct(implementation_type& impl) - { - impl.reset(static_cast(0), noop_deleter()); - } - - // Destroy a resolver implementation. - void destroy(implementation_type&) - { - } - - // Cancel pending asynchronous operations. - void cancel(implementation_type& impl) - { - impl.reset(static_cast(0), noop_deleter()); - } - - // Resolve a query to a list of entries. - template - iterator_type resolve(implementation_type&, const query_type& query, - Error_Handler error_handler) - { - asio::detail::addrinfo_type* address_info = 0; - std::string host_name = query.host_name(); - std::string service_name = query.service_name(); - asio::detail::addrinfo_type hints = query.hints(); - - int result = socket_ops::getaddrinfo( - host_name.length() ? host_name.c_str() : 0, - service_name.c_str(), &hints, &address_info); - auto_addrinfo auto_address_info(address_info); - - error_handler(asio::error(result)); - if (result != 0) - return iterator_type(); - return iterator_type::create(address_info, host_name, service_name); - } - - template - class resolve_query_handler - { - public: - resolve_query_handler(implementation_type impl, const query_type& query, - asio::io_service& io_service, Handler handler) - : impl_(impl), - query_(query), - io_service_(io_service), - work_(io_service), - handler_(handler) - { - } - - void operator()() - { - // Check if the operation has been cancelled. - if (impl_.expired()) - { - iterator_type iterator; - io_service_.post(asio::detail::bind_handler(handler_, - asio::error(asio::error::operation_aborted), - iterator)); - return; - } - - // Perform the blocking host resolution operation. - asio::detail::addrinfo_type* address_info = 0; - std::string host_name = query_.host_name(); - std::string service_name = query_.service_name(); - asio::detail::addrinfo_type hints = query_.hints(); - int result = socket_ops::getaddrinfo( - host_name.length() ? host_name.c_str() : 0, - service_name.c_str(), &hints, &address_info); - auto_addrinfo auto_address_info(address_info); - - // Invoke the handler and pass the result. - asio::error e(result); - iterator_type iterator; - if (result == 0) - iterator = iterator_type::create(address_info, host_name, service_name); - io_service_.post(asio::detail::bind_handler( - handler_, e, iterator)); - } - - private: - boost::weak_ptr impl_; - query_type query_; - asio::io_service& io_service_; - asio::io_service::work work_; - Handler handler_; - }; - - // Asynchronously resolve a query to a list of entries. - template - void async_resolve(implementation_type& impl, const query_type& query, - Handler handler) - { - if (work_io_service_) - { - start_work_thread(); - work_io_service_->post( - resolve_query_handler( - impl, query, io_service(), handler)); - } - } - - // Resolve an endpoint to a list of entries. - template - iterator_type resolve(implementation_type&, - const endpoint_type& endpoint, Error_Handler error_handler) - { - // First try resolving with the service name. If that fails try resolving - // but allow the service to be returned as a number. - char host_name[NI_MAXHOST]; - char service_name[NI_MAXSERV]; - int flags = endpoint.protocol().type() == SOCK_DGRAM ? NI_DGRAM : 0; - int result = socket_ops::getnameinfo(endpoint.data(), endpoint.size(), - host_name, NI_MAXHOST, service_name, NI_MAXSERV, flags); - if (result) - { - flags |= NI_NUMERICSERV; - result = socket_ops::getnameinfo(endpoint.data(), endpoint.size(), - host_name, NI_MAXHOST, service_name, NI_MAXSERV, flags); - } - - error_handler(asio::error(result)); - if (result != 0) - return iterator_type(); - return iterator_type::create(endpoint, host_name, service_name); - } - - template - class resolve_endpoint_handler - { - public: - resolve_endpoint_handler(implementation_type impl, - const endpoint_type& endpoint, asio::io_service& io_service, - Handler handler) - : impl_(impl), - endpoint_(endpoint), - io_service_(io_service), - work_(io_service), - handler_(handler) - { - } - - void operator()() - { - // Check if the operation has been cancelled. - if (impl_.expired()) - { - iterator_type iterator; - io_service_.post(asio::detail::bind_handler(handler_, - asio::error(asio::error::operation_aborted), - iterator)); - return; - } - - - // First try resolving with the service name. If that fails try resolving - // but allow the service to be returned as a number. - char host_name[NI_MAXHOST]; - char service_name[NI_MAXSERV]; - int flags = endpoint_.protocol().type() == SOCK_DGRAM ? NI_DGRAM : 0; - int result = socket_ops::getnameinfo(endpoint_.data(), endpoint_.size(), - host_name, NI_MAXHOST, service_name, NI_MAXSERV, flags); - if (result) - { - flags |= NI_NUMERICSERV; - result = socket_ops::getnameinfo(endpoint_.data(), endpoint_.size(), - host_name, NI_MAXHOST, service_name, NI_MAXSERV, flags); - } - - // Invoke the handler and pass the result. - asio::error e(result); - iterator_type iterator; - if (result == 0) - iterator = iterator_type::create(endpoint_, host_name, service_name); - io_service_.post(asio::detail::bind_handler( - handler_, e, iterator)); - } - - private: - boost::weak_ptr impl_; - endpoint_type endpoint_; - asio::io_service& io_service_; - asio::io_service::work work_; - Handler handler_; - }; - - // Asynchronously resolve an endpoint to a list of entries. - template - void async_resolve(implementation_type& impl, const endpoint_type& endpoint, - Handler handler) - { - if (work_io_service_) - { - start_work_thread(); - work_io_service_->post( - resolve_endpoint_handler( - impl, endpoint, io_service(), handler)); - } - } - -private: - // Helper class to run the work io_service in a thread. - class work_io_service_runner - { - public: - work_io_service_runner(asio::io_service& io_service) - : io_service_(io_service) {} - void operator()() { io_service_.run(); } - private: - asio::io_service& io_service_; - }; - - // Start the work thread if it's not already running. - void start_work_thread() - { - asio::detail::mutex::scoped_lock lock(mutex_); - if (work_thread_ == 0) - { - work_thread_.reset(new asio::detail::thread( - work_io_service_runner(*work_io_service_))); - } - } - - // Mutex to protect access to internal data. - asio::detail::mutex mutex_; - - // Private io_service used for performing asynchronous host resolution. - boost::scoped_ptr work_io_service_; - - // Work for the private io_service to perform. - boost::scoped_ptr work_; - - // Thread used for running the work io_service's run loop. - boost::scoped_ptr work_thread_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_RESOLVER_SERVICE_HPP diff --git a/libtorrent/include/asio/detail/scoped_lock.hpp b/libtorrent/include/asio/detail/scoped_lock.hpp deleted file mode 100644 index 40ad27d2d..000000000 --- a/libtorrent/include/asio/detail/scoped_lock.hpp +++ /dev/null @@ -1,79 +0,0 @@ -// -// scoped_lock.hpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SCOPED_LOCK_HPP -#define ASIO_DETAIL_SCOPED_LOCK_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/noncopyable.hpp" - -namespace asio { -namespace detail { - -// Helper class to lock and unlock a mutex automatically. -template -class scoped_lock - : private noncopyable -{ -public: - // Constructor acquires the lock. - scoped_lock(Mutex& m) - : mutex_(m) - { - mutex_.lock(); - locked_ = true; - } - - // Destructor releases the lock. - ~scoped_lock() - { - if (locked_) - mutex_.unlock(); - } - - // Explicitly acquire the lock. - void lock() - { - if (!locked_) - { - mutex_.lock(); - locked_ = true; - } - } - - // Explicitly release the lock. - void unlock() - { - if (locked_) - { - mutex_.unlock(); - locked_ = false; - } - } - -private: - // The underlying mutex. - Mutex& mutex_; - - // Whether the mutex is currently locked or unlocked. - bool locked_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_SCOPED_LOCK_HPP diff --git a/libtorrent/include/asio/detail/select_interrupter.hpp b/libtorrent/include/asio/detail/select_interrupter.hpp deleted file mode 100644 index 6b4d51316..000000000 --- a/libtorrent/include/asio/detail/select_interrupter.hpp +++ /dev/null @@ -1,41 +0,0 @@ -// -// select_interrupter.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SELECT_INTERRUPTER_HPP -#define ASIO_DETAIL_SELECT_INTERRUPTER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/detail/pipe_select_interrupter.hpp" -#include "asio/detail/socket_select_interrupter.hpp" - -namespace asio { -namespace detail { - -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) -typedef socket_select_interrupter select_interrupter; -#else -typedef pipe_select_interrupter select_interrupter; -#endif - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_SELECT_INTERRUPTER_HPP diff --git a/libtorrent/include/asio/detail/select_reactor.hpp b/libtorrent/include/asio/detail/select_reactor.hpp deleted file mode 100644 index e6335aef7..000000000 --- a/libtorrent/include/asio/detail/select_reactor.hpp +++ /dev/null @@ -1,435 +0,0 @@ -// -// select_reactor.hpp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SELECT_REACTOR_HPP -#define ASIO_DETAIL_SELECT_REACTOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/socket_types.hpp" // Must come before posix_time. - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/io_service.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/fd_set_adapter.hpp" -#include "asio/detail/mutex.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/task_io_service.hpp" -#include "asio/detail/thread.hpp" -#include "asio/detail/reactor_op_queue.hpp" -#include "asio/detail/select_interrupter.hpp" -#include "asio/detail/select_reactor_fwd.hpp" -#include "asio/detail/signal_blocker.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/detail/timer_queue.hpp" - -namespace asio { -namespace detail { - -template -class select_reactor - : public asio::io_service::service -{ -public: - // Constructor. - select_reactor(asio::io_service& io_service) - : asio::io_service::service(io_service), - mutex_(), - select_in_progress_(false), - interrupter_(), - read_op_queue_(), - write_op_queue_(), - except_op_queue_(), - pending_cancellations_(), - stop_thread_(false), - thread_(0), - shutdown_(false) - { - if (Own_Thread) - { - asio::detail::signal_blocker sb; - thread_ = new asio::detail::thread( - bind_handler(&select_reactor::call_run_thread, this)); - } - } - - // Destructor. - ~select_reactor() - { - shutdown_service(); - } - - // Destroy all user-defined handler objects owned by the service. - void shutdown_service() - { - asio::detail::mutex::scoped_lock lock(mutex_); - shutdown_ = true; - stop_thread_ = true; - lock.unlock(); - - if (thread_) - { - interrupter_.interrupt(); - thread_->join(); - delete thread_; - thread_ = 0; - } - - read_op_queue_.destroy_operations(); - write_op_queue_.destroy_operations(); - except_op_queue_.destroy_operations(); - - for (std::size_t i = 0; i < timer_queues_.size(); ++i) - timer_queues_[i]->destroy_timers(); - timer_queues_.clear(); - } - - // Register a socket with the reactor. Returns 0 on success, system error - // code on failure. - int register_descriptor(socket_type descriptor) - { - return 0; - } - - // Start a new read operation. The handler object will be invoked when the - // given descriptor is ready to be read, or an error has occurred. - template - void start_read_op(socket_type descriptor, Handler handler) - { - asio::detail::mutex::scoped_lock lock(mutex_); - if (!shutdown_) - if (read_op_queue_.enqueue_operation(descriptor, handler)) - interrupter_.interrupt(); - } - - // Start a new write operation. The handler object will be invoked when the - // given descriptor is ready to be written, or an error has occurred. - template - void start_write_op(socket_type descriptor, Handler handler) - { - asio::detail::mutex::scoped_lock lock(mutex_); - if (!shutdown_) - if (write_op_queue_.enqueue_operation(descriptor, handler)) - interrupter_.interrupt(); - } - - // Start a new exception operation. The handler object will be invoked when - // the given descriptor has exception information, or an error has occurred. - template - void start_except_op(socket_type descriptor, Handler handler) - { - asio::detail::mutex::scoped_lock lock(mutex_); - if (!shutdown_) - if (except_op_queue_.enqueue_operation(descriptor, handler)) - interrupter_.interrupt(); - } - - // Start new write and exception operations. The handler object will be - // invoked when the given descriptor is ready for writing or has exception - // information available, or an error has occurred. - template - void start_write_and_except_ops(socket_type descriptor, Handler handler) - { - asio::detail::mutex::scoped_lock lock(mutex_); - if (!shutdown_) - { - bool interrupt = write_op_queue_.enqueue_operation(descriptor, handler); - interrupt = except_op_queue_.enqueue_operation(descriptor, handler) - || interrupt; - if (interrupt) - interrupter_.interrupt(); - } - } - - // Cancel all operations associated with the given descriptor. The - // handlers associated with the descriptor will be invoked with the - // operation_aborted error. - void cancel_ops(socket_type descriptor) - { - asio::detail::mutex::scoped_lock lock(mutex_); - cancel_ops_unlocked(descriptor); - } - - // Enqueue cancellation of all operations associated with the given - // descriptor. The handlers associated with the descriptor will be invoked - // with the operation_aborted error. This function does not acquire the - // select_reactor's mutex, and so should only be used from within a reactor - // handler. - void enqueue_cancel_ops_unlocked(socket_type descriptor) - { - pending_cancellations_.push_back(descriptor); - } - - // Cancel any operations that are running against the descriptor and remove - // its registration from the reactor. - void close_descriptor(socket_type descriptor) - { - asio::detail::mutex::scoped_lock lock(mutex_); - cancel_ops_unlocked(descriptor); - } - - // Add a new timer queue to the reactor. - template - void add_timer_queue(timer_queue& timer_queue) - { - asio::detail::mutex::scoped_lock lock(mutex_); - timer_queues_.push_back(&timer_queue); - } - - // Schedule a timer in the given timer queue to expire at the specified - // absolute time. The handler object will be invoked when the timer expires. - template - void schedule_timer(timer_queue& timer_queue, - const typename Time_Traits::time_type& time, Handler handler, void* token) - { - asio::detail::mutex::scoped_lock lock(mutex_); - if (!shutdown_) - if (timer_queue.enqueue_timer(time, handler, token)) - interrupter_.interrupt(); - } - - // Cancel the timer associated with the given token. Returns the number of - // handlers that have been posted or dispatched. - template - std::size_t cancel_timer(timer_queue& timer_queue, void* token) - { - asio::detail::mutex::scoped_lock lock(mutex_); - return timer_queue.cancel_timer(token); - } - -private: - friend class task_io_service >; - - // Run select once until interrupted or events are ready to be dispatched. - void run(bool block) - { - asio::detail::mutex::scoped_lock lock(mutex_); - - // Dispatch any operation cancellations that were made while the select - // loop was not running. - read_op_queue_.dispatch_cancellations(); - write_op_queue_.dispatch_cancellations(); - except_op_queue_.dispatch_cancellations(); - - // Check if the thread is supposed to stop. - if (stop_thread_) - { - // Clean up operations. We must not hold the lock since the operations may - // make calls back into this reactor. - lock.unlock(); - read_op_queue_.cleanup_operations(); - write_op_queue_.cleanup_operations(); - except_op_queue_.cleanup_operations(); - return; - } - - // We can return immediately if there's no work to do and the reactor is - // not supposed to block. - if (!block && read_op_queue_.empty() && write_op_queue_.empty() - && except_op_queue_.empty() && all_timer_queues_are_empty()) - { - // Clean up operations. We must not hold the lock since the operations may - // make calls back into this reactor. - lock.unlock(); - read_op_queue_.cleanup_operations(); - write_op_queue_.cleanup_operations(); - except_op_queue_.cleanup_operations(); - return; - } - - // Set up the descriptor sets. - fd_set_adapter read_fds; - read_fds.set(interrupter_.read_descriptor()); - read_op_queue_.get_descriptors(read_fds); - fd_set_adapter write_fds; - write_op_queue_.get_descriptors(write_fds); - fd_set_adapter except_fds; - except_op_queue_.get_descriptors(except_fds); - socket_type max_fd = read_fds.max_descriptor(); - if (write_fds.max_descriptor() > max_fd) - max_fd = write_fds.max_descriptor(); - if (except_fds.max_descriptor() > max_fd) - max_fd = except_fds.max_descriptor(); - - // Block on the select call without holding the lock so that new - // operations can be started while the call is executing. - timeval tv_buf = { 0, 0 }; - timeval* tv = block ? get_timeout(tv_buf) : &tv_buf; - select_in_progress_ = true; - lock.unlock(); - int retval = socket_ops::select(static_cast(max_fd + 1), - read_fds, write_fds, except_fds, tv); - lock.lock(); - select_in_progress_ = false; - - // Block signals while dispatching operations. - asio::detail::signal_blocker sb; - - // Reset the interrupter. - if (retval > 0 && read_fds.is_set(interrupter_.read_descriptor())) - interrupter_.reset(); - - // Dispatch all ready operations. - if (retval > 0) - { - // Exception operations must be processed first to ensure that any - // out-of-band data is read before normal data. - except_op_queue_.dispatch_descriptors(except_fds, 0); - read_op_queue_.dispatch_descriptors(read_fds, 0); - write_op_queue_.dispatch_descriptors(write_fds, 0); - except_op_queue_.dispatch_cancellations(); - read_op_queue_.dispatch_cancellations(); - write_op_queue_.dispatch_cancellations(); - } - for (std::size_t i = 0; i < timer_queues_.size(); ++i) - timer_queues_[i]->dispatch_timers(); - - // Issue any pending cancellations. - for (size_t i = 0; i < pending_cancellations_.size(); ++i) - cancel_ops_unlocked(pending_cancellations_[i]); - pending_cancellations_.clear(); - - // Clean up operations. We must not hold the lock since the operations may - // make calls back into this reactor. - lock.unlock(); - read_op_queue_.cleanup_operations(); - write_op_queue_.cleanup_operations(); - except_op_queue_.cleanup_operations(); - } - - // Run the select loop in the thread. - void run_thread() - { - asio::detail::mutex::scoped_lock lock(mutex_); - while (!stop_thread_) - { - lock.unlock(); - run(true); - lock.lock(); - } - } - - // Entry point for the select loop thread. - static void call_run_thread(select_reactor* reactor) - { - reactor->run_thread(); - } - - // Interrupt the select loop. - void interrupt() - { - interrupter_.interrupt(); - } - - // Check if all timer queues are empty. - bool all_timer_queues_are_empty() const - { - for (std::size_t i = 0; i < timer_queues_.size(); ++i) - if (!timer_queues_[i]->empty()) - return false; - return true; - } - - // Get the timeout value for the select call. - timeval* get_timeout(timeval& tv) - { - if (all_timer_queues_are_empty()) - return 0; - - // By default we will wait no longer than 5 minutes. This will ensure that - // any changes to the system clock are detected after no longer than this. - boost::posix_time::time_duration minimum_wait_duration - = boost::posix_time::minutes(5); - - for (std::size_t i = 0; i < timer_queues_.size(); ++i) - { - boost::posix_time::time_duration wait_duration - = timer_queues_[i]->wait_duration(); - if (wait_duration < minimum_wait_duration) - minimum_wait_duration = wait_duration; - } - - if (minimum_wait_duration > boost::posix_time::time_duration()) - { - tv.tv_sec = minimum_wait_duration.total_seconds(); - tv.tv_usec = minimum_wait_duration.total_microseconds() % 1000000; - } - else - { - tv.tv_sec = 0; - tv.tv_usec = 0; - } - - return &tv; - } - - // Cancel all operations associated with the given descriptor. The do_cancel - // function of the handler objects will be invoked. This function does not - // acquire the select_reactor's mutex. - void cancel_ops_unlocked(socket_type descriptor) - { - bool interrupt = read_op_queue_.cancel_operations(descriptor); - interrupt = write_op_queue_.cancel_operations(descriptor) || interrupt; - interrupt = except_op_queue_.cancel_operations(descriptor) || interrupt; - if (interrupt) - interrupter_.interrupt(); - } - - // Mutex to protect access to internal data. - asio::detail::mutex mutex_; - - // Whether the select loop is currently running or not. - bool select_in_progress_; - - // The interrupter is used to break a blocking select call. - select_interrupter interrupter_; - - // The queue of read operations. - reactor_op_queue read_op_queue_; - - // The queue of write operations. - reactor_op_queue write_op_queue_; - - // The queue of exception operations. - reactor_op_queue except_op_queue_; - - // The timer queues. - std::vector timer_queues_; - - // The descriptors that are pending cancellation. - std::vector pending_cancellations_; - - // Does the reactor loop thread need to stop. - bool stop_thread_; - - // The thread that is running the reactor loop. - asio::detail::thread* thread_; - - // Whether the service has been shut down. - bool shutdown_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_SELECT_REACTOR_HPP diff --git a/libtorrent/include/asio/detail/select_reactor_fwd.hpp b/libtorrent/include/asio/detail/select_reactor_fwd.hpp deleted file mode 100644 index 35c524c7e..000000000 --- a/libtorrent/include/asio/detail/select_reactor_fwd.hpp +++ /dev/null @@ -1,31 +0,0 @@ -// -// select_reactor_fwd.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SELECT_REACTOR_FWD_HPP -#define ASIO_DETAIL_SELECT_REACTOR_FWD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class select_reactor; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_SELECT_REACTOR_FWD_HPP diff --git a/libtorrent/include/asio/detail/service_registry.hpp b/libtorrent/include/asio/detail/service_registry.hpp deleted file mode 100644 index d7164d088..000000000 --- a/libtorrent/include/asio/detail/service_registry.hpp +++ /dev/null @@ -1,163 +0,0 @@ -// -// service_registry.hpp -// ~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SERVICE_REGISTRY_HPP -#define ASIO_DETAIL_SERVICE_REGISTRY_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/detail/mutex.hpp" -#include "asio/detail/noncopyable.hpp" - -namespace asio { -namespace detail { - -template -class service_registry - : private noncopyable -{ -public: - // Constructor. - service_registry(Owner& o) - : owner_(o), - first_service_(0) - { - } - - // Destructor. - ~service_registry() - { - // Shutdown all services. This must be done in a separate loop before the - // services are destroyed since the destructors of user-defined handler - // objects may try to access other service objects. - typename Owner::service* service = first_service_; - while (service) - { - service->shutdown_service(); - service = service->next_; - } - - // Destroy all services. - while (first_service_) - { - typename Owner::service* next_service = first_service_->next_; - delete first_service_; - first_service_ = next_service; - } - } - - // Get the service object corresponding to the specified service type. Will - // create a new service object automatically if no such object already - // exists. Ownership of the service object is not transferred to the caller. - template - Service& use_service() - { - asio::detail::mutex::scoped_lock lock(mutex_); - - // First see if there is an existing service object for the given type. - typename Owner::service* service = first_service_; - while (service) - { - if (*service->type_info_ == typeid(Service)) - return *static_cast(service); - service = service->next_; - } - - // Create a new service object. The service registry's mutex is not locked - // at this time to allow for nested calls into this function from the new - // service's constructor. - lock.unlock(); - std::auto_ptr new_service(new Service(owner_)); - new_service->type_info_ = &typeid(Service); - Service& new_service_ref = *new_service; - lock.lock(); - - // Check that nobody else created another service object of the same type - // while the lock was released. - service = first_service_; - while (service) - { - if (*service->type_info_ == typeid(Service)) - return *static_cast(service); - service = service->next_; - } - - // Service was successfully initialised, pass ownership to registry. - new_service->next_ = first_service_; - first_service_ = new_service.release(); - - return new_service_ref; - } - - // Add a service object. Returns false on error, in which case ownership of - // the object is retained by the caller. - template - bool add_service(Service* new_service) - { - asio::detail::mutex::scoped_lock lock(mutex_); - - // Check if there is an existing service object for the given type. - typename Owner::service* service = first_service_; - while (service) - { - if (*service->type_info_ == typeid(Service)) - return false; - service = service->next_; - } - - // Take ownership of the service object. - new_service->type_info_ = &typeid(Service); - new_service->next_ = first_service_; - first_service_ = new_service; - } - - // Check whether a service object of the specified type already exists. - template - bool has_service() const - { - asio::detail::mutex::scoped_lock lock(mutex_); - - typename Owner::service* service = first_service_; - while (service) - { - if (*service->type_info_ == typeid(Service)) - return true; - service = service->next_; - } - - return false; - } - -private: - // Mutex to protect access to internal data. - mutable asio::detail::mutex mutex_; - - // The owner of this service registry and the services it contains. - Owner& owner_; - - // The first service in the list of contained services. - typename Owner::service* first_service_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_SERVICE_REGISTRY_HPP diff --git a/libtorrent/include/asio/detail/signal_blocker.hpp b/libtorrent/include/asio/detail/signal_blocker.hpp deleted file mode 100644 index 92299e3e7..000000000 --- a/libtorrent/include/asio/detail/signal_blocker.hpp +++ /dev/null @@ -1,50 +0,0 @@ -// -// signal_blocker.hpp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SIGNAL_BLOCKER_HPP -#define ASIO_DETAIL_SIGNAL_BLOCKER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#if !defined(BOOST_HAS_THREADS) -# include "asio/detail/null_signal_blocker.hpp" -#elif defined(BOOST_WINDOWS) || defined(__CYGWIN__) -# include "asio/detail/win_signal_blocker.hpp" -#elif defined(BOOST_HAS_PTHREADS) -# include "asio/detail/posix_signal_blocker.hpp" -#else -# error Only Windows and POSIX are supported! -#endif - -namespace asio { -namespace detail { - -#if !defined(BOOST_HAS_THREADS) -typedef null_signal_blocker signal_blocker; -#elif defined(BOOST_WINDOWS) || defined(__CYGWIN__) -typedef win_signal_blocker signal_blocker; -#elif defined(BOOST_HAS_PTHREADS) -typedef posix_signal_blocker signal_blocker; -#endif - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_SIGNAL_BLOCKER_HPP diff --git a/libtorrent/include/asio/detail/signal_init.hpp b/libtorrent/include/asio/detail/signal_init.hpp deleted file mode 100644 index 95c05e852..000000000 --- a/libtorrent/include/asio/detail/signal_init.hpp +++ /dev/null @@ -1,51 +0,0 @@ -// -// signal_init.hpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SIGNAL_INIT_HPP -#define ASIO_DETAIL_SIGNAL_INIT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#if !defined(BOOST_WINDOWS) && !defined(__CYGWIN__) - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -namespace asio { -namespace detail { - -template -class signal_init -{ -public: - // Constructor. - signal_init() - { - std::signal(Signal, SIG_IGN); - } -}; - -} // namespace detail -} // namespace asio - -#endif // !defined(BOOST_WINDOWS) && !defined(__CYGWIN__) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_SIGNAL_INIT_HPP diff --git a/libtorrent/include/asio/detail/socket_holder.hpp b/libtorrent/include/asio/detail/socket_holder.hpp deleted file mode 100644 index a94e01e2c..000000000 --- a/libtorrent/include/asio/detail/socket_holder.hpp +++ /dev/null @@ -1,91 +0,0 @@ -// -// socket_holder.hpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SOCKET_HOLDER_HPP -#define ASIO_DETAIL_SOCKET_HOLDER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/socket_ops.hpp" - -namespace asio { -namespace detail { - -// Implement the resource acquisition is initialisation idiom for sockets. -class socket_holder - : private noncopyable -{ -public: - // Construct as an uninitialised socket. - socket_holder() - : socket_(invalid_socket) - { - } - - // Construct to take ownership of the specified socket. - explicit socket_holder(socket_type s) - : socket_(s) - { - } - - // Destructor. - ~socket_holder() - { - if (socket_ != invalid_socket) - socket_ops::close(socket_); - } - - // Get the underlying socket. - socket_type get() const - { - return socket_; - } - - // Reset to an uninitialised socket. - void reset() - { - if (socket_ != invalid_socket) - { - socket_ops::close(socket_); - socket_ = invalid_socket; - } - } - - // Reset to take ownership of the specified socket. - void reset(socket_type s) - { - reset(); - socket_ = s; - } - - // Release ownership of the socket. - socket_type release() - { - socket_type tmp = socket_; - socket_ = invalid_socket; - return tmp; - } - -private: - // The underlying socket. - socket_type socket_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_SOCKET_HOLDER_HPP diff --git a/libtorrent/include/asio/detail/socket_ops.hpp b/libtorrent/include/asio/detail/socket_ops.hpp deleted file mode 100644 index c3f4a59b2..000000000 --- a/libtorrent/include/asio/detail/socket_ops.hpp +++ /dev/null @@ -1,1534 +0,0 @@ -// -// socket_ops.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SOCKET_OPS_HPP -#define ASIO_DETAIL_SOCKET_OPS_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include -#include -#include -#if defined(__MACH__) && defined(__APPLE__) -# include -#endif // defined(__MACH__) && defined(__APPLE__) -#include "asio/detail/pop_options.hpp" - -#include "asio/error.hpp" -#include "asio/detail/socket_types.hpp" - -namespace asio { -namespace detail { -namespace socket_ops { - -inline int get_error() -{ -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) - return WSAGetLastError(); -#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__) - return errno; -#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__) -} - -inline void set_error(int error) -{ - errno = error; -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) - WSASetLastError(error); -#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__) -} - -template -inline ReturnType error_wrapper(ReturnType return_value) -{ -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) - errno = WSAGetLastError(); -#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__) - return return_value; -} - -inline socket_type accept(socket_type s, socket_addr_type* addr, - socket_addr_len_type* addrlen) -{ - set_error(0); -#if defined(__MACH__) && defined(__APPLE__) - socket_type new_s = error_wrapper(::accept(s, addr, addrlen)); - if (new_s == invalid_socket) - return new_s; - - int optval = 1; - int result = error_wrapper(::setsockopt(new_s, - SOL_SOCKET, SO_NOSIGPIPE, &optval, sizeof(optval))); - if (result != 0) - { - ::close(new_s); - return invalid_socket; - } - - return new_s; -#else - return error_wrapper(::accept(s, addr, addrlen)); -#endif -} - -inline int bind(socket_type s, const socket_addr_type* addr, - socket_addr_len_type addrlen) -{ - set_error(0); - return error_wrapper(::bind(s, addr, addrlen)); -} - -inline int close(socket_type s) -{ - set_error(0); -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) - return error_wrapper(::closesocket(s)); -#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__) - return error_wrapper(::close(s)); -#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__) -} - -inline int shutdown(socket_type s, int what) -{ - set_error(0); - return error_wrapper(::shutdown(s, what)); -} - -inline int connect(socket_type s, const socket_addr_type* addr, - socket_addr_len_type addrlen) -{ - set_error(0); - return error_wrapper(::connect(s, addr, addrlen)); -} - -inline int listen(socket_type s, int backlog) -{ - set_error(0); - return error_wrapper(::listen(s, backlog)); -} - -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) -typedef WSABUF buf; -#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__) -typedef iovec buf; -#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__) - -inline void init_buf(buf& b, void* data, size_t size) -{ -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) - b.buf = static_cast(data); - b.len = static_cast(size); -#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__) - b.iov_base = data; - b.iov_len = size; -#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__) -} - -inline void init_buf(buf& b, const void* data, size_t size) -{ -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) - b.buf = static_cast(const_cast(data)); - b.len = static_cast(size); -#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__) - b.iov_base = const_cast(data); - b.iov_len = size; -#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__) -} - -inline int recv(socket_type s, buf* bufs, size_t count, int flags) -{ - set_error(0); -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) - // Receive some data. - DWORD recv_buf_count = static_cast(count); - DWORD bytes_transferred = 0; - DWORD recv_flags = flags; - int result = error_wrapper(::WSARecv(s, bufs, - recv_buf_count, &bytes_transferred, &recv_flags, 0, 0)); - if (result != 0) - return -1; - return bytes_transferred; -#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__) - msghdr msg; - msg.msg_name = 0; - msg.msg_namelen = 0; - msg.msg_iov = bufs; - msg.msg_iovlen = count; - msg.msg_control = 0; - msg.msg_controllen = 0; - msg.msg_flags = 0; - return error_wrapper(::recvmsg(s, &msg, flags)); -#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__) -} - -inline int recvfrom(socket_type s, buf* bufs, size_t count, int flags, - socket_addr_type* addr, socket_addr_len_type* addrlen) -{ - set_error(0); -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) - // Receive some data. - DWORD recv_buf_count = static_cast(count); - DWORD bytes_transferred = 0; - DWORD recv_flags = flags; - int result = error_wrapper(::WSARecvFrom(s, bufs, recv_buf_count, - &bytes_transferred, &recv_flags, addr, addrlen, 0, 0)); - if (result != 0) - return -1; - return bytes_transferred; -#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__) - msghdr msg; -#if defined(__MACH__) && defined(__APPLE__) \ - && (MAC_OS_X_VERSION_MAX_ALLOWED < 1040) - msg.msg_name = reinterpret_cast(addr); -#else - msg.msg_name = addr; -#endif - msg.msg_namelen = *addrlen; - msg.msg_iov = bufs; - msg.msg_iovlen = count; - msg.msg_control = 0; - msg.msg_controllen = 0; - msg.msg_flags = 0; - int result = error_wrapper(::recvmsg(s, &msg, flags)); - *addrlen = msg.msg_namelen; - return result; -#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__) -} - -inline int send(socket_type s, const buf* bufs, size_t count, int flags) -{ - set_error(0); -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) - // Send the data. - DWORD send_buf_count = static_cast(count); - DWORD bytes_transferred = 0; - DWORD send_flags = flags; - int result = error_wrapper(::WSASend(s, const_cast(bufs), - send_buf_count, &bytes_transferred, send_flags, 0, 0)); - if (result != 0) - return -1; - return bytes_transferred; -#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__) - msghdr msg; - msg.msg_name = 0; - msg.msg_namelen = 0; - msg.msg_iov = const_cast(bufs); - msg.msg_iovlen = count; - msg.msg_control = 0; - msg.msg_controllen = 0; - msg.msg_flags = 0; -#if defined(__linux__) - flags |= MSG_NOSIGNAL; -#endif // defined(__linux__) - return error_wrapper(::sendmsg(s, &msg, flags)); -#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__) -} - -inline int sendto(socket_type s, const buf* bufs, size_t count, int flags, - const socket_addr_type* addr, socket_addr_len_type addrlen) -{ - set_error(0); -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) - // Send the data. - DWORD send_buf_count = static_cast(count); - DWORD bytes_transferred = 0; - int result = ::WSASendTo(s, const_cast(bufs), send_buf_count, - &bytes_transferred, flags, addr, addrlen, 0, 0); - if (result != 0) - return -1; - return bytes_transferred; -#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__) - msghdr msg; -#if defined(__MACH__) && defined(__APPLE__) \ - && (MAC_OS_X_VERSION_MAX_ALLOWED < 1040) - msg.msg_name = reinterpret_cast(const_cast(addr)); -#else - msg.msg_name = const_cast(addr); -#endif - msg.msg_namelen = addrlen; - msg.msg_iov = const_cast(bufs); - msg.msg_iovlen = count; - msg.msg_control = 0; - msg.msg_controllen = 0; - msg.msg_flags = 0; -#if defined(__linux__) - flags |= MSG_NOSIGNAL; -#endif // defined(__linux__) - return error_wrapper(::sendmsg(s, &msg, flags)); -#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__) -} - -inline socket_type socket(int af, int type, int protocol) -{ - set_error(0); -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) - return error_wrapper(::WSASocket(af, type, protocol, 0, 0, - WSA_FLAG_OVERLAPPED)); -#elif defined(__MACH__) && defined(__APPLE__) - socket_type s = error_wrapper(::socket(af, type, protocol)); - if (s == invalid_socket) - return s; - - int optval = 1; - int result = error_wrapper(::setsockopt(s, - SOL_SOCKET, SO_NOSIGPIPE, &optval, sizeof(optval))); - if (result != 0) - { - ::close(s); - return invalid_socket; - } - - return s; -#else - return error_wrapper(::socket(af, type, protocol)); -#endif -} - -inline int setsockopt(socket_type s, int level, int optname, - const void* optval, size_t optlen) -{ - set_error(0); -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) - return error_wrapper(::setsockopt(s, level, optname, - reinterpret_cast(optval), static_cast(optlen))); -#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__) - return error_wrapper(::setsockopt(s, level, optname, optval, - static_cast(optlen))); -#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__) -} - -inline int getsockopt(socket_type s, int level, int optname, void* optval, - size_t* optlen) -{ - set_error(0); -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) - int tmp_optlen = static_cast(*optlen); - int result = error_wrapper(::getsockopt(s, level, optname, - reinterpret_cast(optval), &tmp_optlen)); - *optlen = static_cast(tmp_optlen); - return result; -#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__) - socklen_t tmp_optlen = static_cast(*optlen); - int result = error_wrapper(::getsockopt(s, level, optname, - optval, &tmp_optlen)); - *optlen = static_cast(tmp_optlen); - return result; -#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__) -} - -inline int getpeername(socket_type s, socket_addr_type* addr, - socket_addr_len_type* addrlen) -{ - set_error(0); - return error_wrapper(::getpeername(s, addr, addrlen)); -} - -inline int getsockname(socket_type s, socket_addr_type* addr, - socket_addr_len_type* addrlen) -{ - set_error(0); - return error_wrapper(::getsockname(s, addr, addrlen)); -} - -inline int ioctl(socket_type s, long cmd, ioctl_arg_type* arg) -{ - set_error(0); -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) - return error_wrapper(::ioctlsocket(s, cmd, arg)); -#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__) - return error_wrapper(::ioctl(s, cmd, arg)); -#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__) -} - -inline int select(int nfds, fd_set* readfds, fd_set* writefds, - fd_set* exceptfds, timeval* timeout) -{ - set_error(0); -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) - if (!readfds && !writefds && !exceptfds && timeout) - { - DWORD milliseconds = timeout->tv_sec * 1000 + timeout->tv_usec / 1000; - if (milliseconds == 0) - milliseconds = 1; // Force context switch. - ::Sleep(milliseconds); - return 0; - } - - // The select() call allows timeout values measured in microseconds, but the - // system clock (as wrapped by boost::posix_time::microsec_clock) typically - // has a resolution of 10 milliseconds. This can lead to a spinning select - // reactor, meaning increased CPU usage, when waiting for the earliest - // scheduled timeout if it's less than 10 milliseconds away. To avoid a tight - // spin we'll use a minimum timeout of 1 millisecond. - if (timeout && timeout->tv_sec == 0 - && timeout->tv_usec > 0 && timeout->tv_usec < 1000) - timeout->tv_usec = 1000; -#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__) - return error_wrapper(::select(nfds, readfds, writefds, exceptfds, timeout)); -} - -inline int poll_read(socket_type s) -{ -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) - FD_SET fds; - FD_ZERO(&fds); - FD_SET(s, &fds); - set_error(0); - return error_wrapper(::select(s, &fds, 0, 0, 0)); -#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__) - pollfd fds; - fds.fd = s; - fds.events = POLLIN; - fds.revents = 0; - set_error(0); - return error_wrapper(::poll(&fds, 1, -1)); -#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__) -} - -inline int poll_write(socket_type s) -{ -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) - FD_SET fds; - FD_ZERO(&fds); - FD_SET(s, &fds); - set_error(0); - return error_wrapper(::select(s, 0, &fds, 0, 0)); -#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__) - pollfd fds; - fds.fd = s; - fds.events = POLLOUT; - fds.revents = 0; - set_error(0); - return error_wrapper(::poll(&fds, 1, -1)); -#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__) -} - -inline const char* inet_ntop(int af, const void* src, char* dest, size_t length, - unsigned long scope_id = 0) -{ - set_error(0); -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) - using namespace std; // For memcpy. - - if (af != AF_INET && af != AF_INET6) - { - set_error(asio::error::address_family_not_supported); - return 0; - } - - sockaddr_storage_type address; - DWORD address_length; - if (af == AF_INET) - { - address_length = sizeof(sockaddr_in4_type); - sockaddr_in4_type* ipv4_address = - reinterpret_cast(&address); - ipv4_address->sin_family = AF_INET; - ipv4_address->sin_port = 0; - memcpy(&ipv4_address->sin_addr, src, sizeof(in4_addr_type)); - } - else // AF_INET6 - { - address_length = sizeof(sockaddr_in6_type); - sockaddr_in6_type* ipv6_address = - reinterpret_cast(&address); - ipv6_address->sin6_family = AF_INET6; - ipv6_address->sin6_port = 0; - ipv6_address->sin6_flowinfo = 0; - ipv6_address->sin6_scope_id = scope_id; - memcpy(&ipv6_address->sin6_addr, src, sizeof(in6_addr_type)); - } - - DWORD string_length = static_cast(length); - int result = error_wrapper(::WSAAddressToStringA( - reinterpret_cast(&address), - address_length, 0, dest, &string_length)); - - // Windows may not set an error code on failure. - if (result == socket_error_retval && get_error() == 0) - set_error(asio::error::invalid_argument); - - return result == socket_error_retval ? 0 : dest; -#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__) - const char* result = error_wrapper(::inet_ntop(af, src, dest, length)); - if (result == 0 && get_error() == 0) - set_error(asio::error::invalid_argument); - if (result != 0 && af == AF_INET6 && scope_id != 0) - { - using namespace std; // For strcat and sprintf. - char if_name[IF_NAMESIZE + 1] = "%"; - const in6_addr_type* ipv6_address = static_cast(src); - bool is_link_local = IN6_IS_ADDR_LINKLOCAL(ipv6_address); - if (!is_link_local || if_indextoname(scope_id, if_name + 1) == 0) - sprintf(if_name + 1, "%lu", scope_id); - strcat(dest, if_name); - } - return result; -#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__) -} - -inline int inet_pton(int af, const char* src, void* dest, - unsigned long* scope_id = 0) -{ - set_error(0); -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) - using namespace std; // For memcpy and strcmp. - - if (af != AF_INET && af != AF_INET6) - { - set_error(asio::error::address_family_not_supported); - return -1; - } - - sockaddr_storage_type address; - int address_length = sizeof(sockaddr_storage_type); - int result = error_wrapper(::WSAStringToAddressA( - const_cast(src), af, 0, - reinterpret_cast(&address), - &address_length)); - - if (af == AF_INET) - { - if (result != socket_error_retval) - { - sockaddr_in4_type* ipv4_address = - reinterpret_cast(&address); - memcpy(dest, &ipv4_address->sin_addr, sizeof(in4_addr_type)); - } - else if (strcmp(src, "255.255.255.255") == 0) - { - static_cast(dest)->s_addr = INADDR_NONE; - } - } - else // AF_INET6 - { - if (result != socket_error_retval) - { - sockaddr_in6_type* ipv6_address = - reinterpret_cast(&address); - memcpy(dest, &ipv6_address->sin6_addr, sizeof(in6_addr_type)); - if (scope_id) - *scope_id = ipv6_address->sin6_scope_id; - } - } - - // Windows may not set an error code on failure. - if (result == socket_error_retval && get_error() == 0) - set_error(asio::error::invalid_argument); - - return result == socket_error_retval ? -1 : 1; -#else // defined(BOOST_WINDOWS) || defined(__CYGWIN__) - int result = error_wrapper(::inet_pton(af, src, dest)); - if (result <= 0 && get_error() == 0) - set_error(asio::error::invalid_argument); - if (result > 0 && af == AF_INET6 && scope_id) - { - using namespace std; // For strchr and atoi. - *scope_id = 0; - if (const char* if_name = strchr(src, '%')) - { - in6_addr_type* ipv6_address = static_cast(dest); - bool is_link_local = IN6_IS_ADDR_LINKLOCAL(ipv6_address); - if (is_link_local) - *scope_id = if_nametoindex(if_name + 1); - if (*scope_id == 0) - *scope_id = atoi(if_name + 1); - } - } - return result; -#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__) -} - -inline int gethostname(char* name, int namelen) -{ - set_error(0); - return error_wrapper(::gethostname(name, namelen)); -} - -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) \ - || defined(__MACH__) && defined(__APPLE__) - -// The following functions are only needed for emulation of getaddrinfo and -// getnameinfo. - -inline int translate_netdb_error(int error) -{ - switch (error) - { - case 0: - return asio::error::success; - case HOST_NOT_FOUND: - return asio::error::host_not_found; - case TRY_AGAIN: - return asio::error::host_not_found_try_again; - case NO_RECOVERY: - return asio::error::no_recovery; - case NO_DATA: - return asio::error::no_data; - default: - BOOST_ASSERT(false); - return get_error(); - } -} - -inline hostent* gethostbyaddr(const char* addr, int length, int af, - hostent* result, char* buffer, int buflength, int* error) -{ - set_error(0); -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) - (void)(buffer); - (void)(buflength); - hostent* retval = error_wrapper(::gethostbyaddr(addr, length, af)); - *error = get_error(); - if (!retval) - return 0; - *result = *retval; - return retval; -#elif defined(__sun) || defined(__QNX__) - hostent* retval = error_wrapper(::gethostbyaddr_r(addr, length, af, result, - buffer, buflength, error)); - *error = translate_netdb_error(*error); - return retval; -#elif defined(__MACH__) && defined(__APPLE__) - (void)(buffer); - (void)(buflength); - hostent* retval = error_wrapper(::getipnodebyaddr(addr, length, af, error)); - *error = translate_netdb_error(*error); - if (!retval) - return 0; - *result = *retval; - return retval; -#else - hostent* retval = 0; - error_wrapper(::gethostbyaddr_r(addr, length, af, result, buffer, - buflength, &retval, error)); - *error = translate_netdb_error(*error); - return retval; -#endif -} - -inline hostent* gethostbyname(const char* name, int af, struct hostent* result, - char* buffer, int buflength, int* error, int ai_flags = 0) -{ - set_error(0); -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) - (void)(buffer); - (void)(buflength); - (void)(ai_flags); - if (af != AF_INET) - { - *error = asio::error::address_family_not_supported; - return 0; - } - hostent* retval = error_wrapper(::gethostbyname(name)); - *error = get_error(); - if (!retval) - return 0; - *result = *retval; - return result; -#elif defined(__sun) || defined(__QNX__) - (void)(ai_flags); - if (af != AF_INET) - { - *error = asio::error::address_family_not_supported; - return 0; - } - hostent* retval = error_wrapper(::gethostbyname_r(name, result, buffer, - buflength, error)); - *error = translate_netdb_error(*error); - return retval; -#elif defined(__MACH__) && defined(__APPLE__) - (void)(buffer); - (void)(buflength); - hostent* retval = error_wrapper(::getipnodebyname( - name, af, ai_flags, error)); - *error = translate_netdb_error(*error); - if (!retval) - return 0; - *result = *retval; - return retval; -#else - (void)(ai_flags); - if (af != AF_INET) - { - *error = asio::error::address_family_not_supported; - return 0; - } - hostent* retval = 0; - error_wrapper(::gethostbyname_r(name, result, buffer, buflength, &retval, - error)); - *error = translate_netdb_error(*error); - return retval; -#endif -} - -inline void freehostent(hostent* h) -{ -#if defined(__MACH__) && defined(__APPLE__) - if (h) - ::freehostent(h); -#else - (void)(h); -#endif -} - -// Emulation of getaddrinfo based on implementation in: -// Stevens, W. R., UNIX Network Programming Vol. 1, 2nd Ed., Prentice-Hall 1998. - -struct gai_search -{ - const char* host; - int family; -}; - -inline int gai_nsearch(const char* host, - const addrinfo_type* hints, gai_search (&search)[2]) -{ - int search_count = 0; - if (host == 0 || host[0] == '\0') - { - if (hints->ai_flags & AI_PASSIVE) - { - // No host and AI_PASSIVE implies wildcard bind. - switch (hints->ai_family) - { - case AF_INET: - search[search_count].host = "0.0.0.0"; - search[search_count].family = AF_INET; - ++search_count; - break; - case AF_INET6: - search[search_count].host = "0::0"; - search[search_count].family = AF_INET6; - ++search_count; - break; - case AF_UNSPEC: - search[search_count].host = "0::0"; - search[search_count].family = AF_INET6; - ++search_count; - search[search_count].host = "0.0.0.0"; - search[search_count].family = AF_INET; - ++search_count; - break; - default: - break; - } - } - else - { - // No host and not AI_PASSIVE means connect to local host. - switch (hints->ai_family) - { - case AF_INET: - search[search_count].host = "localhost"; - search[search_count].family = AF_INET; - ++search_count; - break; - case AF_INET6: - search[search_count].host = "localhost"; - search[search_count].family = AF_INET6; - ++search_count; - break; - case AF_UNSPEC: - search[search_count].host = "localhost"; - search[search_count].family = AF_INET6; - ++search_count; - search[search_count].host = "localhost"; - search[search_count].family = AF_INET; - ++search_count; - break; - default: - break; - } - } - } - else - { - // Host is specified. - switch (hints->ai_family) - { - case AF_INET: - search[search_count].host = host; - search[search_count].family = AF_INET; - ++search_count; - break; - case AF_INET6: - search[search_count].host = host; - search[search_count].family = AF_INET6; - ++search_count; - break; - case AF_UNSPEC: - search[search_count].host = host; - search[search_count].family = AF_INET6; - ++search_count; - search[search_count].host = host; - search[search_count].family = AF_INET; - ++search_count; - break; - default: - break; - } - } - return search_count; -} - -template -inline T* gai_alloc(std::size_t size = sizeof(T)) -{ - using namespace std; - T* p = static_cast(::operator new(size, std::nothrow)); - if (p) - memset(p, 0, size); - return p; -} - -inline void gai_free(void* p) -{ - ::operator delete(p); -} - -enum { gai_clone_flag = 1 << 30 }; - -inline int gai_aistruct(addrinfo_type*** next, const addrinfo_type* hints, - const void* addr, int family) -{ - using namespace std; - - addrinfo_type* ai = gai_alloc(); - if (ai == 0) - return EAI_MEMORY; - - ai->ai_next = 0; - **next = ai; - *next = &ai->ai_next; - - ai->ai_canonname = 0; - ai->ai_socktype = hints->ai_socktype; - if (ai->ai_socktype == 0) - ai->ai_flags |= gai_clone_flag; - ai->ai_protocol = hints->ai_protocol; - ai->ai_family = family; - - switch (ai->ai_family) - { - case AF_INET: - { - sockaddr_in4_type* sinptr = gai_alloc(); - if (sinptr == 0) - return EAI_MEMORY; - sinptr->sin_family = AF_INET; - memcpy(&sinptr->sin_addr, addr, sizeof(in4_addr_type)); - ai->ai_addr = reinterpret_cast(sinptr); - ai->ai_addrlen = sizeof(sockaddr_in4_type); - break; - } - case AF_INET6: - { - sockaddr_in6_type* sin6ptr = gai_alloc(); - if (sin6ptr == 0) - return EAI_MEMORY; - sin6ptr->sin6_family = AF_INET6; - memcpy(&sin6ptr->sin6_addr, addr, sizeof(in6_addr_type)); - ai->ai_addr = reinterpret_cast(sin6ptr); - ai->ai_addrlen = sizeof(sockaddr_in6_type); - break; - } - default: - break; - } - - return 0; -} - -inline addrinfo_type* gai_clone(addrinfo_type* ai) -{ - using namespace std; - - addrinfo_type* new_ai = gai_alloc(); - if (new_ai == 0) - return new_ai; - - new_ai->ai_next = ai->ai_next; - ai->ai_next = new_ai; - - new_ai->ai_flags = 0; - new_ai->ai_family = ai->ai_family; - new_ai->ai_socktype = ai->ai_socktype; - new_ai->ai_protocol = ai->ai_protocol; - new_ai->ai_canonname = 0; - new_ai->ai_addrlen = ai->ai_addrlen; - new_ai->ai_addr = gai_alloc(ai->ai_addrlen); - memcpy(new_ai->ai_addr, ai->ai_addr, ai->ai_addrlen); - - return new_ai; -} - -inline int gai_port(addrinfo_type* aihead, int port, int socktype) -{ - int num_found = 0; - - for (addrinfo_type* ai = aihead; ai; ai = ai->ai_next) - { - if (ai->ai_flags & gai_clone_flag) - { - if (ai->ai_socktype != 0) - { - ai = gai_clone(ai); - if (ai == 0) - return -1; - // ai now points to newly cloned entry. - } - } - else if (ai->ai_socktype != socktype) - { - // Ignore if mismatch on socket type. - continue; - } - - ai->ai_socktype = socktype; - - switch (ai->ai_family) - { - case AF_INET: - { - sockaddr_in4_type* sinptr = - reinterpret_cast(ai->ai_addr); - sinptr->sin_port = port; - ++num_found; - break; - } - case AF_INET6: - { - sockaddr_in6_type* sin6ptr = - reinterpret_cast(ai->ai_addr); - sin6ptr->sin6_port = port; - ++num_found; - break; - } - default: - break; - } - } - - return num_found; -} - -inline int gai_serv(addrinfo_type* aihead, - const addrinfo_type* hints, const char* serv) -{ - using namespace std; - - int num_found = 0; - - if ( -#if defined(AI_NUMERICSERV) - (hints->ai_flags & AI_NUMERICSERV) || -#endif - isdigit(serv[0])) - { - int port = htons(atoi(serv)); - if (hints->ai_socktype) - { - // Caller specifies socket type. - int rc = gai_port(aihead, port, hints->ai_socktype); - if (rc < 0) - return EAI_MEMORY; - num_found += rc; - } - else - { - // Caller does not specify socket type. - int rc = gai_port(aihead, port, SOCK_STREAM); - if (rc < 0) - return EAI_MEMORY; - num_found += rc; - rc = gai_port(aihead, port, SOCK_DGRAM); - if (rc < 0) - return EAI_MEMORY; - num_found += rc; - } - } - else - { - // Try service name with TCP first, then UDP. - if (hints->ai_socktype == 0 || hints->ai_socktype == SOCK_STREAM) - { - servent* sptr = getservbyname(serv, "tcp"); - if (sptr != 0) - { - int rc = gai_port(aihead, sptr->s_port, SOCK_STREAM); - if (rc < 0) - return EAI_MEMORY; - num_found += rc; - } - } - if (hints->ai_socktype == 0 || hints->ai_socktype == SOCK_DGRAM) - { - servent* sptr = getservbyname(serv, "udp"); - if (sptr != 0) - { - int rc = gai_port(aihead, sptr->s_port, SOCK_DGRAM); - if (rc < 0) - return EAI_MEMORY; - num_found += rc; - } - } - } - - if (num_found == 0) - { - if (hints->ai_socktype == 0) - { - // All calls to getservbyname() failed. - return EAI_NONAME; - } - else - { - // Service not supported for socket type. - return EAI_SERVICE; - } - } - - return 0; -} - -inline int gai_echeck(const char* host, const char* service, - int flags, int family, int socktype, int protocol) -{ - (void)(flags); - (void)(protocol); - - // Host or service must be specified. - if (host == 0 || host[0] == '\0') - if (service == 0 || service[0] == '\0') - return EAI_NONAME; - - // Check combination of family and socket type. - switch (family) - { - case AF_UNSPEC: - break; - case AF_INET: - case AF_INET6: - if (socktype != 0 && socktype != SOCK_STREAM && socktype != SOCK_DGRAM) - return EAI_SOCKTYPE; - break; - default: - return EAI_FAMILY; - } - - return 0; -} - -inline void freeaddrinfo_emulation(addrinfo_type* aihead) -{ - addrinfo_type* ai = aihead; - while (ai) - { - gai_free(ai->ai_addr); - gai_free(ai->ai_canonname); - addrinfo_type* ainext = ai->ai_next; - gai_free(ai); - ai = ainext; - } -} - -inline int getaddrinfo_emulation(const char* host, const char* service, - const addrinfo_type* hintsp, addrinfo_type** result) -{ - // Set up linked list of addrinfo structures. - addrinfo_type* aihead = 0; - addrinfo_type** ainext = &aihead; - char* canon = 0; - - // Supply default hints if not specified by caller. - addrinfo_type hints = addrinfo_type(); - hints.ai_family = AF_UNSPEC; - if (hintsp) - hints = *hintsp; - - // If the resolution is not specifically for AF_INET6, remove the AI_V4MAPPED - // and AI_ALL flags. -#if defined(AI_V4MAPPED) - if (hints.ai_family != AF_INET6) - hints.ai_flags &= ~AI_V4MAPPED; -#endif -#if defined(AI_ALL) - if (hints.ai_family != AF_INET6) - hints.ai_flags &= ~AI_ALL; -#endif - - // Basic error checking. - int rc = gai_echeck(host, service, hints.ai_flags, hints.ai_family, - hints.ai_socktype, hints.ai_protocol); - if (rc != 0) - { - freeaddrinfo_emulation(aihead); - return rc; - } - - gai_search search[2]; - int search_count = gai_nsearch(host, &hints, search); - for (gai_search* sptr = search; sptr < search + search_count; ++sptr) - { - // Check for IPv4 dotted decimal string. - in4_addr_type inaddr; - if (socket_ops::inet_pton(AF_INET, sptr->host, &inaddr) == 1) - { - if (hints.ai_family != AF_UNSPEC && hints.ai_family != AF_INET) - { - freeaddrinfo_emulation(aihead); - gai_free(canon); - return EAI_FAMILY; - } - if (sptr->family == AF_INET) - { - rc = gai_aistruct(&ainext, &hints, &inaddr, AF_INET); - if (rc != 0) - { - freeaddrinfo_emulation(aihead); - gai_free(canon); - return rc; - } - } - continue; - } - - // Check for IPv6 hex string. - in6_addr_type in6addr; - if (socket_ops::inet_pton(AF_INET6, sptr->host, &in6addr) == 1) - { - if (hints.ai_family != AF_UNSPEC && hints.ai_family != AF_INET6) - { - freeaddrinfo_emulation(aihead); - gai_free(canon); - return EAI_FAMILY; - } - if (sptr->family == AF_INET6) - { - rc = gai_aistruct(&ainext, &hints, &in6addr, AF_INET6); - if (rc != 0) - { - freeaddrinfo_emulation(aihead); - gai_free(canon); - return rc; - } - } - continue; - } - - // Look up hostname. - hostent hent; - char hbuf[8192] = ""; - int herr = 0; - hostent* hptr = socket_ops::gethostbyname(sptr->host, - sptr->family, &hent, hbuf, sizeof(hbuf), &herr, hints.ai_flags); - if (hptr == 0) - { - if (search_count == 2) - { - // Failure is OK if there are multiple searches. - continue; - } - freeaddrinfo_emulation(aihead); - gai_free(canon); - switch (herr) - { - case HOST_NOT_FOUND: - return EAI_NONAME; - case TRY_AGAIN: - return EAI_AGAIN; - case NO_RECOVERY: - return EAI_FAIL; - case NO_DATA: - default: - return EAI_NONAME; - } - } - - // Check for address family mismatch if one was specified. - if (hints.ai_family != AF_UNSPEC && hints.ai_family != hptr->h_addrtype) - { - freeaddrinfo_emulation(aihead); - gai_free(canon); - socket_ops::freehostent(hptr); - return EAI_FAMILY; - } - - // Save canonical name first time. - if (host != 0 && host[0] != '\0' && hptr->h_name && hptr->h_name[0] - && (hints.ai_flags & AI_CANONNAME) && canon == 0) - { - canon = gai_alloc(strlen(hptr->h_name) + 1); - if (canon == 0) - { - freeaddrinfo_emulation(aihead); - socket_ops::freehostent(hptr); - return EAI_MEMORY; - } - strcpy(canon, hptr->h_name); - } - - // Create an addrinfo structure for each returned address. - for (char** ap = hptr->h_addr_list; *ap; ++ap) - { - rc = gai_aistruct(&ainext, &hints, *ap, hptr->h_addrtype); - if (rc != 0) - { - freeaddrinfo_emulation(aihead); - gai_free(canon); - socket_ops::freehostent(hptr); - return EAI_FAMILY; - } - } - - socket_ops::freehostent(hptr); - } - - // Check if we found anything. - if (aihead == 0) - { - gai_free(canon); - return EAI_NONAME; - } - - // Return canonical name in first entry. - if (host != 0 && host[0] != '\0' && (hints.ai_flags & AI_CANONNAME)) - { - if (canon) - { - aihead->ai_canonname = canon; - canon = 0; - } - else - { - aihead->ai_canonname = gai_alloc(strlen(search[0].host) + 1); - if (aihead->ai_canonname == 0) - { - freeaddrinfo_emulation(aihead); - return EAI_MEMORY; - } - strcpy(aihead->ai_canonname, search[0].host); - } - } - gai_free(canon); - - // Process the service name. - if (service != 0 && service[0] != '\0') - { - rc = gai_serv(aihead, &hints, service); - if (rc != 0) - { - freeaddrinfo_emulation(aihead); - return rc; - } - } - - // Return result to caller. - *result = aihead; - return 0; -} - -inline int getnameinfo_emulation(const socket_addr_type* sa, - socket_addr_len_type salen, char* host, std::size_t hostlen, - char* serv, std::size_t servlen, int flags) -{ - using namespace std; - - const char* addr; - size_t addr_len; - unsigned short port; - switch (sa->sa_family) - { - case AF_INET: - if (salen != sizeof(sockaddr_in4_type)) - { - set_error(asio::error::invalid_argument); - return 1; - } - addr = reinterpret_cast( - &reinterpret_cast(sa)->sin_addr); - addr_len = sizeof(in4_addr_type); - port = reinterpret_cast(sa)->sin_port; - break; - case AF_INET6: - if (salen != sizeof(sockaddr_in6_type)) - { - set_error(asio::error::invalid_argument); - return 1; - } - addr = reinterpret_cast( - &reinterpret_cast(sa)->sin6_addr); - addr_len = sizeof(in6_addr_type); - port = reinterpret_cast(sa)->sin6_port; - break; - default: - set_error(asio::error::address_family_not_supported); - return 1; - } - - if (host && hostlen > 0) - { - if (flags & NI_NUMERICHOST) - { - if (socket_ops::inet_ntop(sa->sa_family, addr, host, hostlen) == 0) - { - return 1; - } - } - else - { - hostent hent; - char hbuf[8192] = ""; - int herr = 0; - hostent* hptr = socket_ops::gethostbyaddr(addr, - static_cast(addr_len), sa->sa_family, - &hent, hbuf, sizeof(hbuf), &herr); - if (hptr && hptr->h_name && hptr->h_name[0] != '\0') - { - if (flags & NI_NOFQDN) - { - char* dot = strchr(hptr->h_name, '.'); - if (dot) - { - *dot = 0; - } - } - *host = '\0'; - strncat(host, hptr->h_name, hostlen); - socket_ops::freehostent(hptr); - } - else - { - socket_ops::freehostent(hptr); - if (flags & NI_NAMEREQD) - { - set_error(asio::error::host_not_found); - return 1; - } - if (socket_ops::inet_ntop(sa->sa_family, addr, host, hostlen) == 0) - { - return 1; - } - } - } - } - - if (serv && servlen > 0) - { - if (flags & NI_NUMERICSERV) - { - if (servlen < 6) - { - set_error(asio::error::no_buffer_space); - return 1; - } - sprintf(serv, "%u", ntohs(port)); - } - else - { -#if defined(BOOST_HAS_THREADS) && defined(BOOST_HAS_PTHREADS) - static ::pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; - ::pthread_mutex_lock(&mutex); -#endif // defined(BOOST_HAS_THREADS) && defined(BOOST_HAS_PTHREADS) - servent* sptr = ::getservbyport(port, (flags & NI_DGRAM) ? "udp" : 0); - if (sptr && sptr->s_name && sptr->s_name[0] != '\0') - { - *serv = '\0'; - strncat(serv, sptr->s_name, servlen); - } - else - { - if (servlen < 6) - { - set_error(asio::error::no_buffer_space); - return 1; - } - sprintf(serv, "%u", ntohs(port)); - } -#if defined(BOOST_HAS_THREADS) && defined(BOOST_HAS_PTHREADS) - ::pthread_mutex_unlock(&mutex); -#endif // defined(BOOST_HAS_THREADS) && defined(BOOST_HAS_PTHREADS) - } - } - - set_error(0); - return 0; -} - -#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__) - // || defined(__MACH__) && defined(__APPLE__) - -inline int translate_addrinfo_error(int error) -{ - switch (error) - { - case 0: - return asio::error::success; - case EAI_AGAIN: - return asio::error::host_not_found_try_again; - case EAI_BADFLAGS: - return asio::error::invalid_argument; - case EAI_FAIL: - return asio::error::no_recovery; - case EAI_FAMILY: - return asio::error::address_family_not_supported; - case EAI_MEMORY: - return asio::error::no_memory; - case EAI_NONAME: - return asio::error::host_not_found; - case EAI_SERVICE: - return asio::error::service_not_found; - case EAI_SOCKTYPE: - return asio::error::socket_type_not_supported; - default: // Possibly the non-portable EAI_SYSTEM. - return get_error(); - } -} - -inline int getaddrinfo(const char* host, const char* service, - const addrinfo_type* hints, addrinfo_type** result) -{ - set_error(0); -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) -# if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0501) - // Building for Windows XP, Windows Server 2003, or later. - int error = ::getaddrinfo(host, service, hints, result); - return translate_addrinfo_error(error); -# else - // Building for Windows 2000 or earlier. - typedef int (WSAAPI *gai_t)(const char*, - const char*, const addrinfo_type*, addrinfo_type**); - if (HMODULE winsock_module = ::GetModuleHandleA("ws2_32")) - { - if (gai_t gai = (gai_t)::GetProcAddress(winsock_module, "getaddrinfo")) - { - int error = gai(host, service, hints, result); - return translate_addrinfo_error(error); - } - } - int error = getaddrinfo_emulation(host, service, hints, result); - return translate_addrinfo_error(error); -# endif -#elif defined(__MACH__) && defined(__APPLE__) - int error = getaddrinfo_emulation(host, service, hints, result); - return translate_addrinfo_error(error); -#else - int error = ::getaddrinfo(host, service, hints, result); - return translate_addrinfo_error(error); -#endif -} - -inline void freeaddrinfo(addrinfo_type* ai) -{ -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) -# if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0501) - // Building for Windows XP, Windows Server 2003, or later. - ::freeaddrinfo(ai); -# else - // Building for Windows 2000 or earlier. - typedef int (WSAAPI *fai_t)(addrinfo_type*); - if (HMODULE winsock_module = ::GetModuleHandleA("ws2_32")) - { - if (fai_t fai = (fai_t)::GetProcAddress(winsock_module, "freeaddrinfo")) - { - fai(ai); - return; - } - } - freeaddrinfo_emulation(ai); -# endif -#elif defined(__MACH__) && defined(__APPLE__) - freeaddrinfo_emulation(ai); -#else - ::freeaddrinfo(ai); -#endif -} - -inline int getnameinfo(const socket_addr_type* addr, - socket_addr_len_type addrlen, char* host, std::size_t hostlen, - char* serv, std::size_t servlen, int flags) -{ -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) -# if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0501) - // Building for Windows XP, Windows Server 2003, or later. - set_error(0); - int error = ::getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags); - return translate_addrinfo_error(error); -# else - // Building for Windows 2000 or earlier. - typedef int (WSAAPI *gni_t)(const socket_addr_type*, - socket_addr_len_type, char*, std::size_t, char*, std::size_t, int); - if (HMODULE winsock_module = ::GetModuleHandleA("ws2_32")) - { - if (gni_t gni = (gni_t)::GetProcAddress(winsock_module, "getnameinfo")) - { - set_error(0); - int error = gni(addr, addrlen, host, hostlen, serv, servlen, flags); - return translate_addrinfo_error(error); - } - } - set_error(0); - int error = getnameinfo_emulation(addr, addrlen, - host, hostlen, serv, servlen, flags); - return translate_addrinfo_error(error); -# endif -#elif defined(__MACH__) && defined(__APPLE__) - using namespace std; // For memcpy. - sockaddr_storage_type tmp_addr; - memcpy(&tmp_addr, addr, addrlen); - tmp_addr.ss_len = addrlen; - addr = reinterpret_cast(&tmp_addr); - set_error(0); - int error = getnameinfo_emulation(addr, addrlen, - host, hostlen, serv, servlen, flags); - return translate_addrinfo_error(error); -#else - set_error(0); - int error = ::getnameinfo(addr, addrlen, host, hostlen, serv, servlen, flags); - return translate_addrinfo_error(error); -#endif -} - -inline u_long_type network_to_host_long(u_long_type value) -{ - return ntohl(value); -} - -inline u_long_type host_to_network_long(u_long_type value) -{ - return htonl(value); -} - -inline u_short_type network_to_host_short(u_short_type value) -{ - return ntohs(value); -} - -inline u_short_type host_to_network_short(u_short_type value) -{ - return htons(value); -} - -} // namespace socket_ops -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_SOCKET_OPS_HPP diff --git a/libtorrent/include/asio/detail/socket_option.hpp b/libtorrent/include/asio/detail/socket_option.hpp deleted file mode 100644 index c8e680e14..000000000 --- a/libtorrent/include/asio/detail/socket_option.hpp +++ /dev/null @@ -1,323 +0,0 @@ -// -// socket_option.hpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SOCKET_OPTION_HPP -#define ASIO_DETAIL_SOCKET_OPTION_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/detail/socket_types.hpp" - -namespace asio { -namespace detail { -namespace socket_option { - -// Helper template for implementing boolean-based options. -template -class boolean -{ -public: - // Default constructor. - boolean() - : value_(0) - { - } - - // Construct with a specific option value. - boolean(bool value) - : value_(value ? 1 : 0) - { - } - - // Set the value of the boolean. - void set(bool value) - { - value_ = value ? 1 : 0; - } - - // Get the current value of the boolean. - bool get() const - { - return value_; - } - - // Get the level of the socket option. - template - int level(const Protocol&) const - { - return Level; - } - - // Get the name of the socket option. - template - int name(const Protocol&) const - { - return Name; - } - - // Get the address of the boolean data. - template - int* data(const Protocol&) - { - return &value_; - } - - // Get the address of the boolean data. - template - const int* data(const Protocol&) const - { - return &value_; - } - - // Get the size of the boolean data. - template - std::size_t size(const Protocol&) const - { - return sizeof(value_); - } - -private: - int value_; -}; - -// Helper template for implementing integer options. -template -class integer -{ -public: - // Default constructor. - integer() - : value_(0) - { - } - - // Construct with a specific option value. - integer(int value) - : value_(value) - { - } - - // Set the value of the int option. - void set(int value) - { - value_ = value; - } - - // Get the current value of the int option. - int get() const - { - return value_; - } - - // Get the level of the socket option. - template - int level(const Protocol&) const - { - return Level; - } - - // Get the name of the socket option. - template - int name(const Protocol&) const - { - return Name; - } - - // Get the address of the int data. - template - int* data(const Protocol&) - { - return &value_; - } - - // Get the address of the int data. - template - const int* data(const Protocol&) const - { - return &value_; - } - - // Get the size of the int data. - template - std::size_t size(const Protocol&) const - { - return sizeof(value_); - } - -private: - int value_; -}; - -// Helper template for implementing unsigned integer options. -template -class unsigned_integer -{ -public: - // Default constructor. - unsigned_integer() - : value_(0) - { - } - - // Construct with a specific option value. - unsigned_integer(unsigned int value) - : value_(value) - { - } - - // Set the value of the int option. - void set(unsigned int value) - { - value_ = value; - } - - // Get the current value of the int option. - unsigned int get() const - { - return value_; - } - - // Get the level of the socket option. - template - int level(const Protocol&) const - { - return Level; - } - - // Get the name of the socket option. - template - int name(const Protocol&) const - { - return Name; - } - - // Get the address of the int data. - template - unsigned int* data(const Protocol&) - { - return &value_; - } - - // Get the address of the int data. - template - const unsigned int* data(const Protocol&) const - { - return &value_; - } - - // Get the size of the int data. - template - std::size_t size(const Protocol&) const - { - return sizeof(value_); - } - -private: - unsigned int value_; -}; - -// Helper template for implementing linger options. -template -class linger -{ -public: - // Default constructor. - linger() - { - value_.l_onoff = 0; - value_.l_linger = 0; - } - - // Construct with specific option values. - linger(bool value, unsigned short timeout) - { - value_.l_onoff = value ? 1 : 0; - value_.l_linger = timeout; - } - - // Set the value for whether linger is enabled. - void enabled(bool value) - { - value_.l_onoff = value ? 1 : 0; - } - - // Get the value for whether linger is enabled. - bool enabled() const - { - return value_.l_onoff != 0; - } - - // Set the value for the linger timeout. - void timeout(unsigned short value) - { - value_.l_linger = value; - } - - // Get the value for the linger timeout. - unsigned short timeout() const - { - return value_.l_linger; - } - - // Get the level of the socket option. - template - int level(const Protocol&) const - { - return Level; - } - - // Get the name of the socket option. - template - int name(const Protocol&) const - { - return Name; - } - - // Get the address of the linger data. - template - ::linger* data(const Protocol&) - { - return &value_; - } - - // Get the address of the linger data. - template - const ::linger* data(const Protocol&) const - { - return &value_; - } - - // Get the size of the linger data. - template - std::size_t size(const Protocol&) const - { - return sizeof(value_); - } - -private: - ::linger value_; -}; - -} // namespace socket_option -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_SOCKET_OPTION_HPP diff --git a/libtorrent/include/asio/detail/socket_select_interrupter.hpp b/libtorrent/include/asio/detail/socket_select_interrupter.hpp deleted file mode 100644 index e833213de..000000000 --- a/libtorrent/include/asio/detail/socket_select_interrupter.hpp +++ /dev/null @@ -1,177 +0,0 @@ -// -// socket_select_interrupter.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SOCKET_SELECT_INTERRUPTER_HPP -#define ASIO_DETAIL_SOCKET_SELECT_INTERRUPTER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/error.hpp" -#include "asio/detail/socket_holder.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/detail/socket_types.hpp" - -namespace asio { -namespace detail { - -class socket_select_interrupter -{ -public: - // Constructor. - socket_select_interrupter() - { - socket_holder acceptor(socket_ops::socket(AF_INET, SOCK_STREAM, - IPPROTO_TCP)); - if (acceptor.get() == invalid_socket) - { - asio::error e(socket_ops::get_error()); - boost::throw_exception(e); - } - - int opt = 1; - socket_ops::setsockopt(acceptor.get(), - SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); - - sockaddr_in4_type addr; - socket_addr_len_type addr_len = sizeof(addr); - addr.sin_family = AF_INET; - addr.sin_addr.s_addr = inet_addr("127.0.0.1"); - addr.sin_port = 0; - if (socket_ops::bind(acceptor.get(), (const socket_addr_type*)&addr, - addr_len) == socket_error_retval) - { - asio::error e(socket_ops::get_error()); - boost::throw_exception(e); - } - - if (getsockname(acceptor.get(), (socket_addr_type*)&addr, &addr_len) - == socket_error_retval) - { - asio::error e(socket_ops::get_error()); - boost::throw_exception(e); - } - - if (socket_ops::listen(acceptor.get(), SOMAXCONN) == socket_error_retval) - { - asio::error e(socket_ops::get_error()); - boost::throw_exception(e); - } - - socket_holder client(socket_ops::socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)); - if (client.get() == invalid_socket) - { - asio::error e(socket_ops::get_error()); - boost::throw_exception(e); - } - - if (socket_ops::connect(client.get(), (const socket_addr_type*)&addr, - addr_len) == socket_error_retval) - { - asio::error e(socket_ops::get_error()); - boost::throw_exception(e); - } - - socket_holder server(socket_ops::accept(acceptor.get(), 0, 0)); - if (server.get() == invalid_socket) - { - asio::error e(socket_ops::get_error()); - boost::throw_exception(e); - } - - ioctl_arg_type non_blocking = 1; - if (socket_ops::ioctl(client.get(), FIONBIO, &non_blocking)) - { - asio::error e(socket_ops::get_error()); - boost::throw_exception(e); - } - - opt = 1; - socket_ops::setsockopt(client.get(), - IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt)); - - non_blocking = 1; - if (socket_ops::ioctl(server.get(), FIONBIO, &non_blocking)) - { - asio::error e(socket_ops::get_error()); - boost::throw_exception(e); - } - - opt = 1; - socket_ops::setsockopt(server.get(), - IPPROTO_TCP, TCP_NODELAY, &opt, sizeof(opt)); - - read_descriptor_ = server.release(); - write_descriptor_ = client.release(); - } - - // Destructor. - ~socket_select_interrupter() - { - if (read_descriptor_ != invalid_socket) - socket_ops::close(read_descriptor_); - if (write_descriptor_ != invalid_socket) - socket_ops::close(write_descriptor_); - } - - // Interrupt the select call. - void interrupt() - { - char byte = 0; - socket_ops::buf b; - socket_ops::init_buf(b, &byte, 1); - socket_ops::send(write_descriptor_, &b, 1, 0); - } - - // Reset the select interrupt. Returns true if the call was interrupted. - bool reset() - { - char data[1024]; - socket_ops::buf b; - socket_ops::init_buf(b, data, sizeof(data)); - int bytes_read = socket_ops::recv(read_descriptor_, &b, 1, 0); - bool was_interrupted = (bytes_read > 0); - while (bytes_read == sizeof(data)) - bytes_read = socket_ops::recv(read_descriptor_, &b, 1, 0); - return was_interrupted; - } - - // Get the read descriptor to be passed to select. - socket_type read_descriptor() const - { - return read_descriptor_; - } - -private: - // The read end of a connection used to interrupt the select call. This file - // descriptor is passed to select such that when it is time to stop, a single - // byte will be written on the other end of the connection and this - // descriptor will become readable. - socket_type read_descriptor_; - - // The write end of a connection used to interrupt the select call. A single - // byte may be written to this to wake up the select which is waiting for the - // other end to become readable. - socket_type write_descriptor_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_SOCKET_SELECT_INTERRUPTER_HPP diff --git a/libtorrent/include/asio/detail/socket_types.hpp b/libtorrent/include/asio/detail/socket_types.hpp deleted file mode 100644 index 631edbe1c..000000000 --- a/libtorrent/include/asio/detail/socket_types.hpp +++ /dev/null @@ -1,184 +0,0 @@ -// -// socket_types.hpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_SOCKET_TYPES_HPP -#define ASIO_DETAIL_SOCKET_TYPES_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/detail/push_options.hpp" -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) -# if defined(_WINSOCKAPI_) && !defined(_WINSOCK2API_) -# error WinSock.h has already been included -# endif // defined(_WINSOCKAPI_) && !defined(_WINSOCK2API_) -# if !defined(_WIN32_WINNT) && !defined(_WIN32_WINDOWS) -# if defined(_MSC_VER) || defined(__BORLANDC__) -# pragma message("Please define _WIN32_WINNT or _WIN32_WINDOWS appropriately") -# pragma message("Assuming _WIN32_WINNT=0x0500 (i.e. Windows 2000 target)") -# else // defined(_MSC_VER) || defined(__BORLANDC__) -# warning Please define _WIN32_WINNT or _WIN32_WINDOWS appropriately -# warning Assuming _WIN32_WINNT=0x0500 (i.e. Windows 2000 target) -# endif // defined(_MSC_VER) || defined(__BORLANDC__) -# define _WIN32_WINNT 0x0500 -# endif // !defined(_WIN32_WINNT) && !defined(_WIN32_WINDOWS) -# if defined(_MSC_VER) -# if defined(_WIN32) && !defined(WIN32) -# if !defined(_WINSOCK2API_) -# define WIN32 // Needed for correct types in winsock2.h -# else // !defined(_WINSOCK2API_) -# error Please define the macro WIN32 in your compiler options -# endif // !defined(_WINSOCK2API_) -# endif // defined(_WIN32) && !defined(WIN32) -# endif // defined(_MSC_VER) -# if defined(__BORLANDC__) -# include // Needed for __errno -# if defined(__WIN32__) && !defined(WIN32) -# if !defined(_WINSOCK2API_) -# define WIN32 // Needed for correct types in winsock2.h -# else // !defined(_WINSOCK2API_) -# error Please define the macro WIN32 in your compiler options -# endif // !defined(_WINSOCK2API_) -# endif // defined(__WIN32__) && !defined(WIN32) -# if !defined(_WSPIAPI_H_) -# define _WSPIAPI_H_ -# define ASIO_WSPIAPI_H_DEFINED -# endif // !defined(_WSPIAPI_H_) -# endif // defined(__BORLANDC__) -# if !defined(ASIO_NO_WIN32_LEAN_AND_MEAN) -# if !defined(WIN32_LEAN_AND_MEAN) -# define WIN32_LEAN_AND_MEAN -# endif // !defined(WIN32_LEAN_AND_MEAN) -# endif // !defined(ASIO_NO_WIN32_LEAN_AND_MEAN) -# if defined(__CYGWIN__) -# if !defined(__USE_W32_SOCKETS) -# error You must add -D__USE_W32_SOCKETS to your compiler options. -# endif // !defined(__USE_W32_SOCKETS) -# if !defined(NOMINMAX) -# define NOMINMAX 1 -# endif // !defined(NOMINMAX) -# endif // defined(__CYGWIN__) -# include -# include -# include -# if defined(ASIO_WSPIAPI_H_DEFINED) -# undef _WSPIAPI_H_ -# undef ASIO_WSPIAPI_H_DEFINED -# endif // defined(ASIO_WSPIAPI_H_DEFINED) -# if !defined(ASIO_NO_DEFAULT_LINKED_LIBS) -# if defined(_MSC_VER) || defined(__BORLANDC__) -# pragma comment(lib, "ws2_32.lib") -# pragma comment(lib, "mswsock.lib") -# endif // defined(_MSC_VER) || defined(__BORLANDC__) -# endif // !defined(ASIO_NO_DEFAULT_LINKED_LIBS) -# include "asio/detail/old_win_sdk_compat.hpp" -#else -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# include -# if defined(__sun) -# include -# endif -#endif -#include "asio/detail/pop_options.hpp" - -namespace asio { -namespace detail { - -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) -typedef SOCKET socket_type; -const SOCKET invalid_socket = INVALID_SOCKET; -const int socket_error_retval = SOCKET_ERROR; -const int max_addr_v4_str_len = 256; -const int max_addr_v6_str_len = 256; -typedef sockaddr socket_addr_type; -typedef int socket_addr_len_type; -typedef in_addr in4_addr_type; -typedef ip_mreq in4_mreq_type; -typedef sockaddr_in sockaddr_in4_type; -# if defined(ASIO_HAS_OLD_WIN_SDK) -typedef in6_addr_emulation in6_addr_type; -typedef ipv6_mreq_emulation in6_mreq_type; -typedef sockaddr_in6_emulation sockaddr_in6_type; -typedef sockaddr_storage_emulation sockaddr_storage_type; -typedef addrinfo_emulation addrinfo_type; -# else -typedef in6_addr in6_addr_type; -typedef ipv6_mreq in6_mreq_type; -typedef sockaddr_in6 sockaddr_in6_type; -typedef sockaddr_storage sockaddr_storage_type; -typedef addrinfo addrinfo_type; -# endif -typedef unsigned long ioctl_arg_type; -typedef u_long u_long_type; -typedef u_short u_short_type; -const int shutdown_receive = SD_RECEIVE; -const int shutdown_send = SD_SEND; -const int shutdown_both = SD_BOTH; -const int message_peek = MSG_PEEK; -const int message_out_of_band = MSG_OOB; -const int message_do_not_route = MSG_DONTROUTE; -#else -typedef int socket_type; -const int invalid_socket = -1; -const int socket_error_retval = -1; -const int max_addr_v4_str_len = INET_ADDRSTRLEN; -const int max_addr_v6_str_len = INET6_ADDRSTRLEN + 1 + IF_NAMESIZE; -typedef sockaddr socket_addr_type; -typedef socklen_t socket_addr_len_type; -typedef in_addr in4_addr_type; -typedef ip_mreq in4_mreq_type; -typedef sockaddr_in sockaddr_in4_type; -typedef in6_addr in6_addr_type; -typedef ipv6_mreq in6_mreq_type; -typedef sockaddr_in6 sockaddr_in6_type; -typedef sockaddr_storage sockaddr_storage_type; -typedef addrinfo addrinfo_type; -typedef int ioctl_arg_type; -typedef uint32_t u_long_type; -typedef uint16_t u_short_type; -const int shutdown_receive = SHUT_RD; -const int shutdown_send = SHUT_WR; -const int shutdown_both = SHUT_RDWR; -const int message_peek = MSG_PEEK; -const int message_out_of_band = MSG_OOB; -const int message_do_not_route = MSG_DONTROUTE; -#endif -const int custom_socket_option_level = 0xA5100000; -const int enable_connection_aborted_option = 1; - -#if defined(_WIN64) -std::size_t hash_value(SOCKET s) -{ - return static_cast(s); -} -#endif // defined(_WIN64) - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_SOCKET_TYPES_HPP diff --git a/libtorrent/include/asio/detail/strand_service.hpp b/libtorrent/include/asio/detail/strand_service.hpp deleted file mode 100644 index 778cff66f..000000000 --- a/libtorrent/include/asio/detail/strand_service.hpp +++ /dev/null @@ -1,528 +0,0 @@ -// -// strand_service.hpp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_STRAND_SERVICE_HPP -#define ASIO_DETAIL_STRAND_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/io_service.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/call_stack.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/mutex.hpp" -#include "asio/detail/noncopyable.hpp" - -namespace asio { -namespace detail { - -// Default service implementation for a strand. -class strand_service - : public asio::io_service::service -{ -public: - class handler_base; - class invoke_current_handler; - class post_next_waiter_on_exit; - - // The underlying implementation of a strand. - class strand_impl - { -#if defined (__BORLANDC__) - public: -#else - private: -#endif - void add_ref() - { - asio::detail::mutex::scoped_lock lock(mutex_); - ++ref_count_; - } - - void release() - { - asio::detail::mutex::scoped_lock lock(mutex_); - --ref_count_; - if (ref_count_ == 0) - { - lock.unlock(); - delete this; - } - } - - private: - // Only this service will have access to the internal values. - friend class strand_service; - friend class post_next_waiter_on_exit; - friend class invoke_current_handler; - - strand_impl(strand_service& owner) - : owner_(owner), - current_handler_(0), - first_waiter_(0), - last_waiter_(0), - ref_count_(0) - { - // Insert implementation into linked list of all implementations. - asio::detail::mutex::scoped_lock lock(owner_.mutex_); - next_ = owner_.impl_list_; - prev_ = 0; - if (owner_.impl_list_) - owner_.impl_list_->prev_ = this; - owner_.impl_list_ = this; - } - - ~strand_impl() - { - // Remove implementation from linked list of all implementations. - asio::detail::mutex::scoped_lock lock(owner_.mutex_); - if (owner_.impl_list_ == this) - owner_.impl_list_ = next_; - if (prev_) - prev_->next_ = next_; - if (next_) - next_->prev_= prev_; - next_ = 0; - prev_ = 0; - lock.unlock(); - - if (current_handler_) - { - current_handler_->destroy(); - } - - while (first_waiter_) - { - handler_base* next = first_waiter_->next_; - first_waiter_->destroy(); - first_waiter_ = next; - } - } - - // Mutex to protect access to internal data. - asio::detail::mutex mutex_; - - // The service that owns this implementation. - strand_service& owner_; - - // The handler that is ready to execute. If this pointer is non-null then it - // indicates that a handler holds the lock. - handler_base* current_handler_; - - // The start of the list of waiting handlers for the strand. - handler_base* first_waiter_; - - // The end of the list of waiting handlers for the strand. - handler_base* last_waiter_; - - // Storage for posted handlers. - typedef boost::aligned_storage<64> handler_storage_type; -#if defined(__BORLANDC__) - boost::aligned_storage<64> handler_storage_; -#else - handler_storage_type handler_storage_; -#endif - - // Pointers to adjacent socket implementations in linked list. - strand_impl* next_; - strand_impl* prev_; - - // The reference count on the strand implementation. - size_t ref_count_; - -#if !defined(__BORLANDC__) - friend void intrusive_ptr_add_ref(strand_impl* p) - { - p->add_ref(); - } - - friend void intrusive_ptr_release(strand_impl* p) - { - p->release(); - } -#endif - }; - - friend class strand_impl; - - typedef boost::intrusive_ptr implementation_type; - - // Base class for all handler types. - class handler_base - { - public: - typedef void (*invoke_func_type)(handler_base*, - strand_service&, implementation_type&); - typedef void (*destroy_func_type)(handler_base*); - - handler_base(invoke_func_type invoke_func, destroy_func_type destroy_func) - : next_(0), - invoke_func_(invoke_func), - destroy_func_(destroy_func) - { - } - - void invoke(strand_service& service_impl, implementation_type& impl) - { - invoke_func_(this, service_impl, impl); - } - - void destroy() - { - destroy_func_(this); - } - - protected: - ~handler_base() - { - } - - private: - friend class strand_service; - friend class strand_impl; - friend class post_next_waiter_on_exit; - handler_base* next_; - invoke_func_type invoke_func_; - destroy_func_type destroy_func_; - }; - - // Helper class to allow handlers to be dispatched. - class invoke_current_handler - { - public: - invoke_current_handler(strand_service& service_impl, - const implementation_type& impl) - : service_impl_(service_impl), - impl_(impl) - { - } - - void operator()() - { - impl_->current_handler_->invoke(service_impl_, impl_); - } - - friend void* asio_handler_allocate(std::size_t size, - invoke_current_handler* this_handler) - { - return this_handler->do_handler_allocate(size); - } - - friend void asio_handler_deallocate(void*, std::size_t, - invoke_current_handler*) - { - } - - void* do_handler_allocate(std::size_t size) - { -#if defined(__BORLANDC__) - BOOST_ASSERT(size <= boost::aligned_storage<64>::size); -#else - BOOST_ASSERT(size <= strand_impl::handler_storage_type::size); -#endif - return impl_->handler_storage_.address(); - } - - template - friend void asio_handler_invoke(Function function, - invoke_current_handler*) - { - function(); - } - - private: - strand_service& service_impl_; - implementation_type impl_; - }; - - // Helper class to automatically enqueue next waiter on block exit. - class post_next_waiter_on_exit - { - public: - post_next_waiter_on_exit(strand_service& service_impl, - implementation_type& impl) - : service_impl_(service_impl), - impl_(impl), - cancelled_(false) - { - } - - ~post_next_waiter_on_exit() - { - if (!cancelled_) - { - asio::detail::mutex::scoped_lock lock(impl_->mutex_); - impl_->current_handler_ = impl_->first_waiter_; - if (impl_->current_handler_) - { - impl_->first_waiter_ = impl_->first_waiter_->next_; - if (impl_->first_waiter_ == 0) - impl_->last_waiter_ = 0; - lock.unlock(); - service_impl_.io_service().post( - invoke_current_handler(service_impl_, impl_)); - } - } - } - - void cancel() - { - cancelled_ = true; - } - - private: - strand_service& service_impl_; - implementation_type& impl_; - bool cancelled_; - }; - - // Class template for a waiter. - template - class handler_wrapper - : public handler_base - { - public: - handler_wrapper(Handler handler) - : handler_base(&handler_wrapper::do_invoke, - &handler_wrapper::do_destroy), - handler_(handler) - { - } - - static void do_invoke(handler_base* base, - strand_service& service_impl, implementation_type& impl) - { - // Take ownership of the handler object. - typedef handler_wrapper this_type; - this_type* h(static_cast(base)); - typedef handler_alloc_traits alloc_traits; - handler_ptr ptr(h->handler_, h); - - post_next_waiter_on_exit p1(service_impl, impl); - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. - Handler handler(h->handler_); - - // A handler object must still be valid when the next waiter is posted - // since destroying the last handler might cause the strand object to be - // destroyed. Therefore we create a second post_next_waiter_on_exit object - // that will be destroyed before the handler object. - p1.cancel(); - post_next_waiter_on_exit p2(service_impl, impl); - - // Free the memory associated with the handler. - ptr.reset(); - - // Indicate that this strand is executing on the current thread. - call_stack::context ctx(impl.get()); - - // Make the upcall. - asio_handler_invoke_helpers::invoke(handler, &handler); - } - - static void do_destroy(handler_base* base) - { - // Take ownership of the handler object. - typedef handler_wrapper this_type; - this_type* h(static_cast(base)); - typedef handler_alloc_traits alloc_traits; - handler_ptr ptr(h->handler_, h); - } - - private: - Handler handler_; - }; - - // Construct a new strand service for the specified io_service. - explicit strand_service(asio::io_service& io_service) - : asio::io_service::service(io_service), - mutex_(), - impl_list_(0) - { - } - - // Destroy all user-defined handler objects owned by the service. - void shutdown_service() - { - // Construct a list of all handlers to be destroyed. - asio::detail::mutex::scoped_lock lock(mutex_); - strand_impl* impl = impl_list_; - handler_base* first_handler = 0; - while (impl) - { - if (impl->current_handler_) - { - impl->current_handler_->next_ = first_handler; - first_handler = impl->current_handler_; - impl->current_handler_ = 0; - } - if (impl->first_waiter_) - { - impl->last_waiter_->next_ = first_handler; - first_handler = impl->first_waiter_; - impl->first_waiter_ = 0; - impl->last_waiter_ = 0; - } - impl = impl->next_; - } - - // Destroy all handlers without holding the lock. - lock.unlock(); - while (first_handler) - { - handler_base* next = first_handler->next_; - first_handler->destroy(); - first_handler = next; - } - } - - // Construct a new strand implementation. - void construct(implementation_type& impl) - { - impl = implementation_type(new strand_impl(*this)); - } - - // Destroy a strand implementation. - void destroy(implementation_type& impl) - { - implementation_type().swap(impl); - } - - // Request the io_service to invoke the given handler. - template - void dispatch(implementation_type& impl, Handler handler) - { - if (call_stack::contains(impl.get())) - { - asio_handler_invoke_helpers::invoke(handler, &handler); - } - else - { - asio::detail::mutex::scoped_lock lock(impl->mutex_); - - // Allocate and construct an object to wrap the handler. - typedef handler_wrapper value_type; - typedef handler_alloc_traits alloc_traits; - raw_handler_ptr raw_ptr(handler); - handler_ptr ptr(raw_ptr, handler); - - if (impl->current_handler_ == 0) - { - // This handler now has the lock, so can be dispatched immediately. - impl->current_handler_ = ptr.get(); - lock.unlock(); - io_service().dispatch(invoke_current_handler(*this, impl)); - ptr.release(); - } - else - { - // Another handler already holds the lock, so this handler must join - // the list of waiters. The handler will be posted automatically when - // its turn comes. - if (impl->last_waiter_) - { - impl->last_waiter_->next_ = ptr.get(); - impl->last_waiter_ = impl->last_waiter_->next_; - } - else - { - impl->first_waiter_ = ptr.get(); - impl->last_waiter_ = ptr.get(); - } - ptr.release(); - } - } - } - - // Request the io_service to invoke the given handler and return immediately. - template - void post(implementation_type& impl, Handler handler) - { - asio::detail::mutex::scoped_lock lock(impl->mutex_); - - // Allocate and construct an object to wrap the handler. - typedef handler_wrapper value_type; - typedef handler_alloc_traits alloc_traits; - raw_handler_ptr raw_ptr(handler); - handler_ptr ptr(raw_ptr, handler); - - if (impl->current_handler_ == 0) - { - // This handler now has the lock, so can be dispatched immediately. - impl->current_handler_ = ptr.get(); - lock.unlock(); - io_service().post(invoke_current_handler(*this, impl)); - ptr.release(); - } - else - { - // Another handler already holds the lock, so this handler must join the - // list of waiters. The handler will be posted automatically when its turn - // comes. - if (impl->last_waiter_) - { - impl->last_waiter_->next_ = ptr.get(); - impl->last_waiter_ = impl->last_waiter_->next_; - } - else - { - impl->first_waiter_ = ptr.get(); - impl->last_waiter_ = ptr.get(); - } - ptr.release(); - } - } - -private: - // Mutex to protect access to the linked list of implementations. - asio::detail::mutex mutex_; - - // The head of a linked list of all implementations. - strand_impl* impl_list_; -}; - -} // namespace detail -} // namespace asio - -#if defined(__BORLANDC__) - -namespace boost { - -inline void intrusive_ptr_add_ref( - asio::detail::strand_service::strand_impl* p) -{ - p->add_ref(); -} - -inline void intrusive_ptr_release( - asio::detail::strand_service::strand_impl* p) -{ - p->release(); -} - -} // namespace boost - -#endif // defined(__BORLANDC__) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_STRAND_SERVICE_HPP diff --git a/libtorrent/include/asio/detail/task_io_service.hpp b/libtorrent/include/asio/detail/task_io_service.hpp deleted file mode 100644 index fbe56cbc3..000000000 --- a/libtorrent/include/asio/detail/task_io_service.hpp +++ /dev/null @@ -1,526 +0,0 @@ -// -// task_io_service.hpp -// ~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_TASK_IO_SERVICE_HPP -#define ASIO_DETAIL_TASK_IO_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/io_service.hpp" -#include "asio/detail/call_stack.hpp" -#include "asio/detail/event.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/mutex.hpp" -#include "asio/detail/task_io_service_fwd.hpp" - -namespace asio { -namespace detail { - -template -class task_io_service - : public asio::io_service::service -{ -public: - // Constructor. - task_io_service(asio::io_service& io_service) - : asio::io_service::service(io_service), - mutex_(), - task_(use_service(io_service)), - outstanding_work_(0), - handler_queue_(&task_handler_), - handler_queue_end_(&task_handler_), - interrupted_(false), - shutdown_(false), - first_idle_thread_(0) - { - } - - // Destroy all user-defined handler objects owned by the service. - void shutdown_service() - { - asio::detail::mutex::scoped_lock lock(mutex_); - shutdown_ = true; - lock.unlock(); - - // Destroy handler objects. - while (handler_queue_) - { - handler_base* h = handler_queue_; - handler_queue_ = h->next_; - if (h != &task_handler_) - h->destroy(); - } - - // Reset handler queue to initial state. - handler_queue_ = &task_handler_; - handler_queue_end_ = &task_handler_; - } - - // Run the event loop until interrupted or no more work. - size_t run() - { - typename call_stack::context ctx(this); - - idle_thread_info this_idle_thread; - this_idle_thread.prev = &this_idle_thread; - this_idle_thread.next = &this_idle_thread; - - asio::detail::mutex::scoped_lock lock(mutex_); - - size_t n = 0; - while (do_one(lock, &this_idle_thread)) - if (n != (std::numeric_limits::max)()) - ++n; - return n; - } - - // Run until interrupted or one operation is performed. - size_t run_one() - { - typename call_stack::context ctx(this); - - idle_thread_info this_idle_thread; - this_idle_thread.prev = &this_idle_thread; - this_idle_thread.next = &this_idle_thread; - - asio::detail::mutex::scoped_lock lock(mutex_); - - return do_one(lock, &this_idle_thread); - } - - // Poll for operations without blocking. - size_t poll() - { - typename call_stack::context ctx(this); - - asio::detail::mutex::scoped_lock lock(mutex_); - - size_t n = 0; - while (do_one(lock, 0)) - if (n != (std::numeric_limits::max)()) - ++n; - return n; - } - - // Poll for one operation without blocking. - size_t poll_one() - { - typename call_stack::context ctx(this); - - asio::detail::mutex::scoped_lock lock(mutex_); - - return do_one(lock, 0); - } - - // Interrupt the event processing loop. - void interrupt() - { - asio::detail::mutex::scoped_lock lock(mutex_); - interrupt_all_threads(); - } - - // Reset in preparation for a subsequent run invocation. - void reset() - { - asio::detail::mutex::scoped_lock lock(mutex_); - interrupted_ = false; - } - - // Notify that some work has started. - void work_started() - { - asio::detail::mutex::scoped_lock lock(mutex_); - ++outstanding_work_; - } - - // Notify that some work has finished. - void work_finished() - { - asio::detail::mutex::scoped_lock lock(mutex_); - if (--outstanding_work_ == 0) - interrupt_all_threads(); - } - - // Request invocation of the given handler. - template - void dispatch(Handler handler) - { - if (call_stack::contains(this)) - asio_handler_invoke_helpers::invoke(handler, &handler); - else - post(handler); - } - - // Request invocation of the given handler and return immediately. - template - void post(Handler handler) - { - // Allocate and construct an operation to wrap the handler. - typedef handler_wrapper value_type; - typedef handler_alloc_traits alloc_traits; - raw_handler_ptr raw_ptr(handler); - handler_ptr ptr(raw_ptr, handler); - - asio::detail::mutex::scoped_lock lock(mutex_); - - // If the service has been shut down we silently discard the handler. - if (shutdown_) - return; - - // Add the handler to the end of the queue. - if (handler_queue_end_) - { - handler_queue_end_->next_ = ptr.get(); - handler_queue_end_ = ptr.get(); - } - else - { - handler_queue_ = handler_queue_end_ = ptr.get(); - } - ptr.release(); - - // An undelivered handler is treated as unfinished work. - ++outstanding_work_; - - // Wake up a thread to execute the handler. - if (!interrupt_one_idle_thread()) - if (task_handler_.next_ == 0 && handler_queue_end_ != &task_handler_) - task_.interrupt(); - } - -private: - struct idle_thread_info; - - size_t do_one(asio::detail::mutex::scoped_lock& lock, - idle_thread_info* this_idle_thread) - { - if (outstanding_work_ == 0 && !interrupted_) - { - interrupt_all_threads(); - return 0; - } - - bool polling = !this_idle_thread; - bool task_has_run = false; - while (!interrupted_) - { - if (handler_queue_) - { - // Prepare to execute first handler from queue. - handler_base* h = handler_queue_; - handler_queue_ = h->next_; - if (handler_queue_ == 0) - handler_queue_end_ = 0; - bool more_handlers = (handler_queue_ != 0); - lock.unlock(); - - if (h == &task_handler_) - { - // If the task has already run and we're polling then we're done. - if (task_has_run && polling) - return 0; - task_has_run = true; - - task_cleanup c(lock, *this); - - // Run the task. May throw an exception. Only block if the handler - // queue is empty and we have an idle_thread_info object, otherwise - // we want to return as soon as possible. - task_.run(!more_handlers && !polling); - } - else - { - handler_cleanup c(lock, *this); - - // Invoke the handler. May throw an exception. - h->call(); // call() deletes the handler object - - return 1; - } - } - else if (this_idle_thread) - { - // Nothing to run right now, so just wait for work to do. - if (first_idle_thread_) - { - this_idle_thread->next = first_idle_thread_; - this_idle_thread->prev = first_idle_thread_->prev; - first_idle_thread_->prev->next = this_idle_thread; - first_idle_thread_->prev = this_idle_thread; - } - first_idle_thread_ = this_idle_thread; - this_idle_thread->wakeup_event.clear(); - lock.unlock(); - this_idle_thread->wakeup_event.wait(); - lock.lock(); - if (this_idle_thread->next == this_idle_thread) - { - first_idle_thread_ = 0; - } - else - { - if (first_idle_thread_ == this_idle_thread) - first_idle_thread_ = this_idle_thread->next; - this_idle_thread->next->prev = this_idle_thread->prev; - this_idle_thread->prev->next = this_idle_thread->next; - this_idle_thread->next = this_idle_thread; - this_idle_thread->prev = this_idle_thread; - } - } - else - { - return 0; - } - } - - return 0; - } - - // Interrupt the task and all idle threads. - void interrupt_all_threads() - { - interrupted_ = true; - interrupt_all_idle_threads(); - if (task_handler_.next_ == 0 && handler_queue_end_ != &task_handler_) - task_.interrupt(); - } - - // Interrupt a single idle thread. Returns true if a thread was interrupted, - // false if no running thread could be found to interrupt. - bool interrupt_one_idle_thread() - { - if (first_idle_thread_) - { - first_idle_thread_->wakeup_event.signal(); - first_idle_thread_ = first_idle_thread_->next; - return true; - } - return false; - } - - // Interrupt all idle threads. - void interrupt_all_idle_threads() - { - if (first_idle_thread_) - { - first_idle_thread_->wakeup_event.signal(); - idle_thread_info* current_idle_thread = first_idle_thread_->next; - while (current_idle_thread != first_idle_thread_) - { - current_idle_thread->wakeup_event.signal(); - current_idle_thread = current_idle_thread->next; - } - } - } - - class task_cleanup; - - // The base class for all handler wrappers. A function pointer is used - // instead of virtual functions to avoid the associated overhead. - class handler_base - { - public: - typedef void (*call_func_type)(handler_base*); - typedef void (*destroy_func_type)(handler_base*); - - handler_base(call_func_type call_func, destroy_func_type destroy_func) - : next_(0), - call_func_(call_func), - destroy_func_(destroy_func) - { - } - - void call() - { - call_func_(this); - } - - void destroy() - { - destroy_func_(this); - } - - protected: - // Prevent deletion through this type. - ~handler_base() - { - } - - private: - friend class task_io_service; - friend class task_cleanup; - handler_base* next_; - call_func_type call_func_; - destroy_func_type destroy_func_; - }; - - // Template wrapper for handlers. - template - class handler_wrapper - : public handler_base - { - public: - handler_wrapper(Handler handler) - : handler_base(&handler_wrapper::do_call, - &handler_wrapper::do_destroy), - handler_(handler) - { - } - - static void do_call(handler_base* base) - { - // Take ownership of the handler object. - typedef handler_wrapper this_type; - this_type* h(static_cast(base)); - typedef handler_alloc_traits alloc_traits; - handler_ptr ptr(h->handler_, h); - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. - Handler handler(h->handler_); - - // Free the memory associated with the handler. - ptr.reset(); - - // Make the upcall. - asio_handler_invoke_helpers::invoke(handler, &handler); - } - - static void do_destroy(handler_base* base) - { - // Take ownership of the handler object. - typedef handler_wrapper this_type; - this_type* h(static_cast(base)); - typedef handler_alloc_traits alloc_traits; - handler_ptr ptr(h->handler_, h); - } - - private: - Handler handler_; - }; - - // Helper class to perform task-related operations on block exit. - class task_cleanup; - friend class task_cleanup; - class task_cleanup - { - public: - task_cleanup(asio::detail::mutex::scoped_lock& lock, - task_io_service& task_io_svc) - : lock_(lock), - task_io_service_(task_io_svc) - { - } - - ~task_cleanup() - { - // Reinsert the task at the end of the handler queue. - lock_.lock(); - task_io_service_.task_handler_.next_ = 0; - if (task_io_service_.handler_queue_end_) - { - task_io_service_.handler_queue_end_->next_ - = &task_io_service_.task_handler_; - task_io_service_.handler_queue_end_ - = &task_io_service_.task_handler_; - } - else - { - task_io_service_.handler_queue_ - = task_io_service_.handler_queue_end_ - = &task_io_service_.task_handler_; - } - } - - private: - asio::detail::mutex::scoped_lock& lock_; - task_io_service& task_io_service_; - }; - - // Helper class to perform handler-related operations on block exit. - class handler_cleanup; - friend class handler_cleanup; - class handler_cleanup - { - public: - handler_cleanup(asio::detail::mutex::scoped_lock& lock, - task_io_service& task_io_svc) - : lock_(lock), - task_io_service_(task_io_svc) - { - } - - ~handler_cleanup() - { - lock_.lock(); - if (--task_io_service_.outstanding_work_ == 0) - task_io_service_.interrupt_all_threads(); - } - - private: - asio::detail::mutex::scoped_lock& lock_; - task_io_service& task_io_service_; - }; - - // Mutex to protect access to internal data. - asio::detail::mutex mutex_; - - // The task to be run by this service. - Task& task_; - - // Handler object to represent the position of the task in the queue. - class task_handler - : public handler_base - { - public: - task_handler() - : handler_base(0, 0) - { - } - } task_handler_; - - // The count of unfinished work. - int outstanding_work_; - - // The start of a linked list of handlers that are ready to be delivered. - handler_base* handler_queue_; - - // The end of a linked list of handlers that are ready to be delivered. - handler_base* handler_queue_end_; - - // Flag to indicate that the dispatcher has been interrupted. - bool interrupted_; - - // Flag to indicate that the dispatcher has been shut down. - bool shutdown_; - - // Structure containing information about an idle thread. - struct idle_thread_info - { - event wakeup_event; - idle_thread_info* prev; - idle_thread_info* next; - }; - - // The number of threads that are currently idle. - idle_thread_info* first_idle_thread_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_TASK_IO_SERVICE_HPP diff --git a/libtorrent/include/asio/detail/task_io_service_fwd.hpp b/libtorrent/include/asio/detail/task_io_service_fwd.hpp deleted file mode 100644 index 8100beac7..000000000 --- a/libtorrent/include/asio/detail/task_io_service_fwd.hpp +++ /dev/null @@ -1,31 +0,0 @@ -// -// task_io_service_fwd.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_TASK_IO_SERVICE_FWD_HPP -#define ASIO_DETAIL_TASK_IO_SERVICE_FWD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -namespace asio { -namespace detail { - -template -class task_io_service; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_TASK_IO_SERVICE_FWD_HPP diff --git a/libtorrent/include/asio/detail/thread.hpp b/libtorrent/include/asio/detail/thread.hpp deleted file mode 100644 index 9d7452b8a..000000000 --- a/libtorrent/include/asio/detail/thread.hpp +++ /dev/null @@ -1,50 +0,0 @@ -// -// thread.hpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_THREAD_HPP -#define ASIO_DETAIL_THREAD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#if !defined(BOOST_HAS_THREADS) -# include "asio/detail/null_thread.hpp" -#elif defined(BOOST_WINDOWS) -# include "asio/detail/win_thread.hpp" -#elif defined(BOOST_HAS_PTHREADS) -# include "asio/detail/posix_thread.hpp" -#else -# error Only Windows and POSIX are supported! -#endif - -namespace asio { -namespace detail { - -#if !defined(BOOST_HAS_THREADS) -typedef null_thread thread; -#elif defined(BOOST_WINDOWS) -typedef win_thread thread; -#elif defined(BOOST_HAS_PTHREADS) -typedef posix_thread thread; -#endif - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_THREAD_HPP diff --git a/libtorrent/include/asio/detail/timer_queue.hpp b/libtorrent/include/asio/detail/timer_queue.hpp deleted file mode 100644 index 2526da948..000000000 --- a/libtorrent/include/asio/detail/timer_queue.hpp +++ /dev/null @@ -1,345 +0,0 @@ -// -// timer_queue.hpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_TIMER_QUEUE_HPP -#define ASIO_DETAIL_TIMER_QUEUE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/error.hpp" -#include "asio/detail/hash_map.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/timer_queue_base.hpp" - -namespace asio { -namespace detail { - -template -class timer_queue - : public timer_queue_base -{ -public: - // The time type. - typedef typename Time_Traits::time_type time_type; - - // The duration type. - typedef typename Time_Traits::duration_type duration_type; - - // Constructor. - timer_queue() - : timers_(), - heap_() - { - } - - // Add a new timer to the queue. Returns true if this is the timer that is - // earliest in the queue, in which case the reactor's event demultiplexing - // function call may need to be interrupted and restarted. - template - bool enqueue_timer(const time_type& time, Handler handler, void* token) - { - // Ensure that there is space for the timer in the heap. We reserve here so - // that the push_back below will not throw due to a reallocation failure. - heap_.reserve(heap_.size() + 1); - - // Create a new timer object. - std::auto_ptr > new_timer( - new timer(time, handler, token)); - - // Insert the new timer into the hash. - typedef typename hash_map::iterator iterator; - typedef typename hash_map::value_type value_type; - std::pair result = - timers_.insert(value_type(token, new_timer.get())); - if (!result.second) - { - result.first->second->prev_ = new_timer.get(); - new_timer->next_ = result.first->second; - result.first->second = new_timer.get(); - } - - // Put the timer at the correct position in the heap. - new_timer->heap_index_ = heap_.size(); - heap_.push_back(new_timer.get()); - up_heap(heap_.size() - 1); - bool is_first = (heap_[0] == new_timer.get()); - - // Ownership of the timer is transferred to the timer queue. - new_timer.release(); - - return is_first; - } - - // Whether there are no timers in the queue. - virtual bool empty() const - { - return heap_.empty(); - } - - // Get the time for the timer that is earliest in the queue. - virtual boost::posix_time::time_duration wait_duration() const - { - return Time_Traits::to_posix_duration( - Time_Traits::subtract(heap_[0]->time_, Time_Traits::now())); - } - - // Dispatch the timers that are earlier than the specified time. - virtual void dispatch_timers() - { - const time_type now = Time_Traits::now(); - while (!heap_.empty() && !Time_Traits::less_than(now, heap_[0]->time_)) - { - timer_base* t = heap_[0]; - remove_timer(t); - t->invoke(0); - } - } - - // Cancel the timer with the given token. The handler will be invoked - // immediately with the result operation_aborted. - std::size_t cancel_timer(void* timer_token) - { - std::size_t num_cancelled = 0; - typedef typename hash_map::iterator iterator; - iterator it = timers_.find(timer_token); - if (it != timers_.end()) - { - timer_base* t = it->second; - while (t) - { - timer_base* next = t->next_; - remove_timer(t); - t->invoke(asio::error::operation_aborted); - t = next; - ++num_cancelled; - } - } - return num_cancelled; - } - - // Destroy all timers. - virtual void destroy_timers() - { - typename hash_map::iterator i = timers_.begin(); - typename hash_map::iterator end = timers_.end(); - while (i != end) - { - timer_base* t = i->second; - typename hash_map::iterator old_i = i++; - timers_.erase(old_i); - t->destroy(); - } - heap_.clear(); - timers_.clear(); - } - -private: - // Base class for timer operations. Function pointers are used instead of - // virtual functions to avoid the associated overhead. - class timer_base - { - public: - // Perform the timer operation and then destroy. - void invoke(int result) - { - invoke_func_(this, result); - } - - // Destroy the timer operation. - void destroy() - { - destroy_func_(this); - } - - protected: - typedef void (*invoke_func_type)(timer_base*, int); - typedef void (*destroy_func_type)(timer_base*); - - // Constructor. - timer_base(invoke_func_type invoke_func, destroy_func_type destroy_func, - const time_type& time, void* token) - : invoke_func_(invoke_func), - destroy_func_(destroy_func), - time_(time), - token_(token), - next_(0), - prev_(0), - heap_index_( - std::numeric_limits::max BOOST_PREVENT_MACRO_SUBSTITUTION()) - { - } - - // Prevent deletion through this type. - ~timer_base() - { - } - - private: - friend class timer_queue; - - // The function to be called to dispatch the handler. - invoke_func_type invoke_func_; - - // The function to be called to destroy the handler. - destroy_func_type destroy_func_; - - // The time when the operation should fire. - time_type time_; - - // The token associated with the timer. - void* token_; - - // The next timer known to the queue. - timer_base* next_; - - // The previous timer known to the queue. - timer_base* prev_; - - // The index of the timer in the heap. - size_t heap_index_; - }; - - // Adaptor class template for using handlers in timers. - template - class timer - : public timer_base - { - public: - // Constructor. - timer(const time_type& time, Handler handler, void* token) - : timer_base(&timer::invoke_handler, - &timer::destroy_handler, time, token), - handler_(handler) - { - } - - // Invoke the handler and then destroy it. - static void invoke_handler(timer_base* base, int result) - { - std::auto_ptr > t(static_cast*>(base)); - t->handler_(result); - } - - // Destroy the handler. - static void destroy_handler(timer_base* base) - { - delete static_cast*>(base); - } - - private: - Handler handler_; - }; - - // Move the item at the given index up the heap to its correct position. - void up_heap(size_t index) - { - size_t parent = (index - 1) / 2; - while (index > 0 - && Time_Traits::less_than(heap_[index]->time_, heap_[parent]->time_)) - { - swap_heap(index, parent); - index = parent; - parent = (index - 1) / 2; - } - } - - // Move the item at the given index down the heap to its correct position. - void down_heap(size_t index) - { - size_t child = index * 2 + 1; - while (child < heap_.size()) - { - size_t min_child = (child + 1 == heap_.size() - || Time_Traits::less_than( - heap_[child]->time_, heap_[child + 1]->time_)) - ? child : child + 1; - if (Time_Traits::less_than(heap_[index]->time_, heap_[min_child]->time_)) - break; - swap_heap(index, min_child); - index = min_child; - child = index * 2 + 1; - } - } - - // Swap two entries in the heap. - void swap_heap(size_t index1, size_t index2) - { - timer_base* tmp = heap_[index1]; - heap_[index1] = heap_[index2]; - heap_[index2] = tmp; - heap_[index1]->heap_index_ = index1; - heap_[index2]->heap_index_ = index2; - } - - // Remove a timer from the heap and list of timers. - void remove_timer(timer_base* t) - { - // Remove the timer from the heap. - size_t index = t->heap_index_; - if (!heap_.empty() && index < heap_.size()) - { - if (index == heap_.size() - 1) - { - heap_.pop_back(); - } - else - { - swap_heap(index, heap_.size() - 1); - heap_.pop_back(); - size_t parent = (index - 1) / 2; - if (index > 0 && Time_Traits::less_than(t->time_, heap_[parent]->time_)) - up_heap(index); - else - down_heap(index); - } - } - - // Remove the timer from the hash. - typedef typename hash_map::iterator iterator; - iterator it = timers_.find(t->token_); - if (it != timers_.end()) - { - if (it->second == t) - it->second = t->next_; - if (t->prev_) - t->prev_->next_ = t->next_; - if (t->next_) - t->next_->prev_ = t->prev_; - if (it->second == 0) - timers_.erase(it); - } - } - - // A hash of timer token to linked lists of timers. - hash_map timers_; - - // The heap of timers, with the earliest timer at the front. - std::vector heap_; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_TIMER_QUEUE_HPP diff --git a/libtorrent/include/asio/detail/timer_queue_base.hpp b/libtorrent/include/asio/detail/timer_queue_base.hpp deleted file mode 100644 index 22f3bb1e5..000000000 --- a/libtorrent/include/asio/detail/timer_queue_base.hpp +++ /dev/null @@ -1,56 +0,0 @@ -// -// timer_queue_base.hpp -// ~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_TIMER_QUEUE_BASE_HPP -#define ASIO_DETAIL_TIMER_QUEUE_BASE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/socket_types.hpp" // Must come before posix_time. - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/detail/noncopyable.hpp" - -namespace asio { -namespace detail { - -class timer_queue_base - : private noncopyable -{ -public: - // Destructor. - virtual ~timer_queue_base() {} - - // Whether there are no timers in the queue. - virtual bool empty() const = 0; - - // Get the time to wait until the next timer. - virtual boost::posix_time::time_duration wait_duration() const = 0; - - // Dispatch all ready timers. - virtual void dispatch_timers() = 0; - - // Destroy all timers. - virtual void destroy_timers() = 0; -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_TIMER_QUEUE_BASE_HPP diff --git a/libtorrent/include/asio/detail/tss_ptr.hpp b/libtorrent/include/asio/detail/tss_ptr.hpp deleted file mode 100644 index 24ce434c2..000000000 --- a/libtorrent/include/asio/detail/tss_ptr.hpp +++ /dev/null @@ -1,65 +0,0 @@ -// -// tss_ptr.hpp -// ~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_TSS_PTR_HPP -#define ASIO_DETAIL_TSS_PTR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#if !defined(BOOST_HAS_THREADS) -# include "asio/detail/null_tss_ptr.hpp" -#elif defined(BOOST_WINDOWS) -# include "asio/detail/win_tss_ptr.hpp" -#elif defined(BOOST_HAS_PTHREADS) -# include "asio/detail/posix_tss_ptr.hpp" -#else -# error Only Windows and POSIX are supported! -#endif - -namespace asio { -namespace detail { - -template -class tss_ptr -#if !defined(BOOST_HAS_THREADS) - : public null_tss_ptr -#elif defined(BOOST_WINDOWS) - : public win_tss_ptr -#elif defined(BOOST_HAS_PTHREADS) - : public posix_tss_ptr -#endif -{ -public: - void operator=(T* value) - { -#if !defined(BOOST_HAS_THREADS) - null_tss_ptr::operator=(value); -#elif defined(BOOST_WINDOWS) - win_tss_ptr::operator=(value); -#elif defined(BOOST_HAS_PTHREADS) - posix_tss_ptr::operator=(value); -#endif - } -}; - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_TSS_PTR_HPP diff --git a/libtorrent/include/asio/detail/win_event.hpp b/libtorrent/include/asio/detail/win_event.hpp deleted file mode 100644 index b08cf8a08..000000000 --- a/libtorrent/include/asio/detail/win_event.hpp +++ /dev/null @@ -1,88 +0,0 @@ -// -// win_event.hpp -// ~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_EVENT_HPP -#define ASIO_DETAIL_WIN_EVENT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#if defined(BOOST_WINDOWS) - -#include "asio/system_exception.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/socket_types.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -namespace asio { -namespace detail { - -class win_event - : private noncopyable -{ -public: - // Constructor. - win_event() - : event_(::CreateEvent(0, true, false, 0)) - { - if (!event_) - { - DWORD last_error = ::GetLastError(); - system_exception e("event", last_error); - boost::throw_exception(e); - } - } - - // Destructor. - ~win_event() - { - ::CloseHandle(event_); - } - - // Signal the event. - void signal() - { - ::SetEvent(event_); - } - - // Reset the event. - void clear() - { - ::ResetEvent(event_); - } - - // Wait for the event to become signalled. - void wait() - { - ::WaitForSingleObject(event_, INFINITE); - } - -private: - HANDLE event_; -}; - -} // namespace detail -} // namespace asio - -#endif // defined(BOOST_WINDOWS) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_WIN_EVENT_HPP diff --git a/libtorrent/include/asio/detail/win_fd_set_adapter.hpp b/libtorrent/include/asio/detail/win_fd_set_adapter.hpp deleted file mode 100644 index 1f393dc11..000000000 --- a/libtorrent/include/asio/detail/win_fd_set_adapter.hpp +++ /dev/null @@ -1,83 +0,0 @@ -// -// win_fd_set_adapter.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_FD_SET_ADAPTER_HPP -#define ASIO_DETAIL_WIN_FD_SET_ADAPTER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/socket_types.hpp" - -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) - -namespace asio { -namespace detail { - -// Adapts the FD_SET type to meet the Descriptor_Set concept's requirements. -class win_fd_set_adapter -{ -public: - win_fd_set_adapter() - : max_descriptor_(invalid_socket) - { - fd_set_.fd_count = 0; - } - - void set(socket_type descriptor) - { - for (u_int i = 0; i < fd_set_.fd_count; ++i) - if (fd_set_.fd_array[i] == descriptor) - return; - if (fd_set_.fd_count < win_fd_set_size) - fd_set_.fd_array[fd_set_.fd_count++] = descriptor; - } - - bool is_set(socket_type descriptor) const - { - return !!__WSAFDIsSet(descriptor, - const_cast(reinterpret_cast(&fd_set_))); - } - - operator fd_set*() - { - return reinterpret_cast(&fd_set_); - } - - socket_type max_descriptor() const - { - return max_descriptor_; - } - -private: - // This structure is defined to be compatible with the Windows API fd_set - // structure, but without being dependent on the value of FD_SETSIZE. - enum { win_fd_set_size = 1024 }; - struct win_fd_set - { - u_int fd_count; - SOCKET fd_array[win_fd_set_size]; - }; - - win_fd_set fd_set_; - socket_type max_descriptor_; -}; - -} // namespace detail -} // namespace asio - -#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_WIN_FD_SET_ADAPTER_HPP diff --git a/libtorrent/include/asio/detail/win_iocp_io_service.hpp b/libtorrent/include/asio/detail/win_iocp_io_service.hpp deleted file mode 100644 index e39fd33a6..000000000 --- a/libtorrent/include/asio/detail/win_iocp_io_service.hpp +++ /dev/null @@ -1,389 +0,0 @@ -// -// win_iocp_io_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_IOCP_IO_SERVICE_HPP -#define ASIO_DETAIL_WIN_IOCP_IO_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/win_iocp_io_service_fwd.hpp" - -#if defined(ASIO_HAS_IOCP) - -#include "asio/detail/push_options.hpp" -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/io_service.hpp" -#include "asio/system_exception.hpp" -#include "asio/detail/call_stack.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/detail/win_iocp_operation.hpp" - -namespace asio { -namespace detail { - -class win_iocp_io_service - : public asio::io_service::service -{ -public: - // Base class for all operations. - typedef win_iocp_operation operation; - - // Constructor. - win_iocp_io_service(asio::io_service& io_service) - : asio::io_service::service(io_service), - iocp_(::CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 0)), - outstanding_work_(0), - interrupted_(0), - shutdown_(0) - { - if (!iocp_.handle) - { - DWORD last_error = ::GetLastError(); - system_exception e("iocp", last_error); - boost::throw_exception(e); - } - } - - // Destroy all user-defined handler objects owned by the service. - void shutdown_service() - { - ::InterlockedExchange(&shutdown_, 1); - - for (;;) - { - DWORD bytes_transferred = 0; -#if (WINVER < 0x0500) - DWORD completion_key = 0; -#else - DWORD_PTR completion_key = 0; -#endif - LPOVERLAPPED overlapped = 0; - ::GetQueuedCompletionStatus(iocp_.handle, - &bytes_transferred, &completion_key, &overlapped, 0); - DWORD last_error = ::GetLastError(); - if (last_error == WAIT_TIMEOUT) - break; - if (overlapped) - static_cast(overlapped)->destroy(); - } - } - - // Register a socket with the IO completion port. - void register_socket(socket_type sock) - { - HANDLE sock_as_handle = reinterpret_cast(sock); - ::CreateIoCompletionPort(sock_as_handle, iocp_.handle, 0, 0); - } - - // Run the event loop until interrupted or no more work. - size_t run() - { - if (::InterlockedExchangeAdd(&outstanding_work_, 0) == 0) - return 0; - - call_stack::context ctx(this); - - size_t n = 0; - while (do_one(true)) - if (n != (std::numeric_limits::max)()) - ++n; - return n; - } - - // Run until interrupted or one operation is performed. - size_t run_one() - { - if (::InterlockedExchangeAdd(&outstanding_work_, 0) == 0) - return 0; - - call_stack::context ctx(this); - - return do_one(true); - } - - // Poll for operations without blocking. - size_t poll() - { - if (::InterlockedExchangeAdd(&outstanding_work_, 0) == 0) - return 0; - - call_stack::context ctx(this); - - size_t n = 0; - while (do_one(false)) - if (n != (std::numeric_limits::max)()) - ++n; - return n; - } - - // Poll for one operation without blocking. - size_t poll_one() - { - if (::InterlockedExchangeAdd(&outstanding_work_, 0) == 0) - return 0; - - call_stack::context ctx(this); - - return do_one(false); - } - - // Interrupt the event processing loop. - void interrupt() - { - if (::InterlockedExchange(&interrupted_, 1) == 0) - { - if (!::PostQueuedCompletionStatus(iocp_.handle, 0, 0, 0)) - { - DWORD last_error = ::GetLastError(); - system_exception e("pqcs", last_error); - boost::throw_exception(e); - } - } - } - - // Reset in preparation for a subsequent run invocation. - void reset() - { - ::InterlockedExchange(&interrupted_, 0); - } - - // Notify that some work has started. - void work_started() - { - ::InterlockedIncrement(&outstanding_work_); - } - - // Notify that some work has finished. - void work_finished() - { - if (::InterlockedDecrement(&outstanding_work_) == 0) - interrupt(); - } - - // Request invocation of the given handler. - template - void dispatch(Handler handler) - { - if (call_stack::contains(this)) - asio_handler_invoke_helpers::invoke(handler, &handler); - else - post(handler); - } - - // Request invocation of the given handler and return immediately. - template - void post(Handler handler) - { - // If the service has been shut down we silently discard the handler. - if (::InterlockedExchangeAdd(&shutdown_, 0) != 0) - return; - - // Allocate and construct an operation to wrap the handler. - typedef handler_operation value_type; - typedef handler_alloc_traits alloc_traits; - raw_handler_ptr raw_ptr(handler); - handler_ptr ptr(raw_ptr, *this, handler); - - // Enqueue the operation on the I/O completion port. - if (!::PostQueuedCompletionStatus(iocp_.handle, 0, 0, ptr.get())) - { - DWORD last_error = ::GetLastError(); - system_exception e("pqcs", last_error); - boost::throw_exception(e); - } - - // Operation has been successfully posted. - ptr.release(); - } - - // Request invocation of the given OVERLAPPED-derived operation. - void post_completion(win_iocp_operation* op, DWORD op_last_error, - DWORD bytes_transferred) - { - // Enqueue the operation on the I/O completion port. - if (!::PostQueuedCompletionStatus(iocp_.handle, - bytes_transferred, op_last_error, op)) - { - DWORD last_error = ::GetLastError(); - system_exception e("pqcs", last_error); - boost::throw_exception(e); - } - } - -private: - // Dequeues at most one operation from the I/O completion port, and then - // executes it. Returns the number of operations that were dequeued (i.e. - // either 0 or 1). - size_t do_one(bool block) - { - for (;;) - { - // Get the next operation from the queue. - DWORD bytes_transferred = 0; -#if (WINVER < 0x0500) - DWORD completion_key = 0; -#else - DWORD_PTR completion_key = 0; -#endif - LPOVERLAPPED overlapped = 0; - ::SetLastError(0); - BOOL ok = ::GetQueuedCompletionStatus(iocp_.handle, &bytes_transferred, - &completion_key, &overlapped, block ? INFINITE : 0); - DWORD last_error = ::GetLastError(); - - if (!ok && overlapped == 0) - return 0; - - if (overlapped) - { - // We may have been passed a last_error value in the completion_key. - if (last_error == 0) - { - last_error = completion_key; - } - - // Ensure that the io_service does not exit due to running out of work - // while we make the upcall. - auto_work work(*this); - - // Dispatch the operation. - operation* op = static_cast(overlapped); - op->do_completion(last_error, bytes_transferred); - - return 1; - } - else - { - // The interrupted_ flag is always checked to ensure that any leftover - // interrupts from a previous run invocation are ignored. - if (::InterlockedExchangeAdd(&interrupted_, 0) != 0) - { - // Wake up next thread that is blocked on GetQueuedCompletionStatus. - if (!::PostQueuedCompletionStatus(iocp_.handle, 0, 0, 0)) - { - DWORD last_error = ::GetLastError(); - system_exception e("pqcs", last_error); - boost::throw_exception(e); - } - - return 0; - } - } - } - } - - struct auto_work - { - auto_work(win_iocp_io_service& io_service) - : io_service_(io_service) - { - io_service_.work_started(); - } - - ~auto_work() - { - io_service_.work_finished(); - } - - private: - win_iocp_io_service& io_service_; - }; - - template - struct handler_operation - : public operation - { - handler_operation(win_iocp_io_service& io_service, - Handler handler) - : operation(&handler_operation::do_completion_impl, - &handler_operation::destroy_impl), - io_service_(io_service), - handler_(handler) - { - io_service_.work_started(); - } - - ~handler_operation() - { - io_service_.work_finished(); - } - - private: - // Prevent copying and assignment. - handler_operation(const handler_operation&); - void operator=(const handler_operation&); - - static void do_completion_impl(operation* op, DWORD, size_t) - { - // Take ownership of the operation object. - typedef handler_operation op_type; - op_type* handler_op(static_cast(op)); - typedef handler_alloc_traits alloc_traits; - handler_ptr ptr(handler_op->handler_, handler_op); - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. - Handler handler(handler_op->handler_); - - // Free the memory associated with the handler. - ptr.reset(); - - // Make the upcall. - asio_handler_invoke_helpers::invoke(handler, &handler); - } - - static void destroy_impl(operation* op) - { - // Take ownership of the operation object. - typedef handler_operation op_type; - op_type* handler_op(static_cast(op)); - typedef handler_alloc_traits alloc_traits; - handler_ptr ptr(handler_op->handler_, handler_op); - } - - win_iocp_io_service& io_service_; - Handler handler_; - }; - - // The IO completion port used for queueing operations. - struct iocp_holder - { - HANDLE handle; - iocp_holder(HANDLE h) : handle(h) {} - ~iocp_holder() { ::CloseHandle(handle); } - } iocp_; - - // The count of unfinished work. - long outstanding_work_; - - // Flag to indicate whether the event loop has been interrupted. - long interrupted_; - - // Flag to indicate whether the service has been shut down. - long shutdown_; -}; - -} // namespace detail -} // namespace asio - -#endif // defined(ASIO_HAS_IOCP) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_WIN_IOCP_IO_SERVICE_HPP diff --git a/libtorrent/include/asio/detail/win_iocp_io_service_fwd.hpp b/libtorrent/include/asio/detail/win_iocp_io_service_fwd.hpp deleted file mode 100644 index 005677207..000000000 --- a/libtorrent/include/asio/detail/win_iocp_io_service_fwd.hpp +++ /dev/null @@ -1,46 +0,0 @@ -// -// win_iocp_io_service_fwd.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_IOCP_IO_SERVICE_FWD_HPP -#define ASIO_DETAIL_WIN_IOCP_IO_SERVICE_FWD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -// This service is only supported on Win32 (NT4 and later). -#if !defined(ASIO_DISABLE_IOCP) -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) -#if defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0400) - -// Define this to indicate that IOCP is supported on the target platform. -#define ASIO_HAS_IOCP 1 - -namespace asio { -namespace detail { - -class win_iocp_io_service; - -} // namespace detail -} // namespace asio - -#endif // defined(_WIN32_WINNT) && (_WIN32_WINNT >= 0x0400) -#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__) -#endif // !defined(ASIO_DISABLE_IOCP) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_WIN_IOCP_IO_SERVICE_FWD_HPP diff --git a/libtorrent/include/asio/detail/win_iocp_operation.hpp b/libtorrent/include/asio/detail/win_iocp_operation.hpp deleted file mode 100644 index 79eb348b4..000000000 --- a/libtorrent/include/asio/detail/win_iocp_operation.hpp +++ /dev/null @@ -1,81 +0,0 @@ -// -// win_iocp_operation.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_IOCP_OPERATION_HPP -#define ASIO_DETAIL_WIN_IOCP_OPERATION_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/win_iocp_io_service_fwd.hpp" - -#if defined(ASIO_HAS_IOCP) - -#include "asio/detail/socket_types.hpp" - -namespace asio { -namespace detail { - -// Base class for all IOCP operations. A function pointer is used instead of -// virtual functions to avoid the associated overhead. -// -// This class inherits from OVERLAPPED so that we can downcast to get back to -// the win_iocp_operation pointer from the LPOVERLAPPED out parameter of -// GetQueuedCompletionStatus. -struct win_iocp_operation - : public OVERLAPPED -{ - typedef void (*invoke_func_type)(win_iocp_operation*, DWORD, size_t); - typedef void (*destroy_func_type)(win_iocp_operation*); - - win_iocp_operation(invoke_func_type invoke_func, - destroy_func_type destroy_func) - : invoke_func_(invoke_func), - destroy_func_(destroy_func) - { - Internal = 0; - InternalHigh = 0; - Offset = 0; - OffsetHigh = 0; - hEvent = 0; - } - - void do_completion(DWORD last_error, size_t bytes_transferred) - { - invoke_func_(this, last_error, bytes_transferred); - } - - void destroy() - { - destroy_func_(this); - } - -protected: - // Prevent deletion through this type. - ~win_iocp_operation() - { - } - -private: - invoke_func_type invoke_func_; - destroy_func_type destroy_func_; -}; - -} // namespace detail -} // namespace asio - -#endif // defined(ASIO_HAS_IOCP) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_WIN_IOCP_OPERATION_HPP diff --git a/libtorrent/include/asio/detail/win_iocp_socket_service.hpp b/libtorrent/include/asio/detail/win_iocp_socket_service.hpp deleted file mode 100644 index 3e4cd4d64..000000000 --- a/libtorrent/include/asio/detail/win_iocp_socket_service.hpp +++ /dev/null @@ -1,2077 +0,0 @@ -// -// win_iocp_socket_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_IOCP_SOCKET_SERVICE_HPP -#define ASIO_DETAIL_WIN_IOCP_SOCKET_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/win_iocp_io_service_fwd.hpp" - -#if defined(ASIO_HAS_IOCP) - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/buffer.hpp" -#include "asio/error.hpp" -#include "asio/error_handler.hpp" -#include "asio/io_service.hpp" -#include "asio/socket_base.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" -#include "asio/detail/mutex.hpp" -#include "asio/detail/select_reactor.hpp" -#include "asio/detail/socket_holder.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/detail/win_iocp_io_service.hpp" - -namespace asio { -namespace detail { - -template -class win_iocp_socket_service - : public asio::io_service::service -{ -public: - // The protocol type. - typedef Protocol protocol_type; - - // The endpoint type. - typedef typename Protocol::endpoint endpoint_type; - - // Base class for all operations. - typedef win_iocp_operation operation; - - struct noop_deleter { void operator()(void*) {} }; - typedef boost::shared_ptr shared_cancel_token_type; - typedef boost::weak_ptr weak_cancel_token_type; - - // The native type of a socket. - class native_type - { - public: - native_type(socket_type s) - : socket_(s), - have_remote_endpoint_(false) - { - } - - native_type(socket_type s, const endpoint_type& ep) - : socket_(s), - have_remote_endpoint_(true), - remote_endpoint_(ep) - { - } - - void operator=(socket_type s) - { - socket_ = s; - have_remote_endpoint_ = false; - remote_endpoint_ = endpoint_type(); - } - - operator socket_type() const - { - return socket_; - } - - bool have_remote_endpoint() const - { - return have_remote_endpoint_; - } - - endpoint_type remote_endpoint() const - { - return remote_endpoint_; - } - - private: - socket_type socket_; - bool have_remote_endpoint_; - endpoint_type remote_endpoint_; - }; - - // The implementation type of the socket. - class implementation_type - { - public: - // Default constructor. - implementation_type() - : socket_(invalid_socket), - flags_(0), - cancel_token_(), - protocol_(endpoint_type().protocol()), - next_(0), - prev_(0) - { - } - - private: - // Only this service will have access to the internal values. - friend class win_iocp_socket_service; - - // The native socket representation. - native_type socket_; - - enum - { - enable_connection_aborted = 1, // User wants connection_aborted errors. - user_set_linger = 2 // The user set the linger option. - }; - - // Flags indicating the current state of the socket. - unsigned char flags_; - - // We use a shared pointer as a cancellation token here to work around the - // broken Windows support for cancellation. MSDN says that when you call - // closesocket any outstanding WSARecv or WSASend operations will complete - // with the error ERROR_OPERATION_ABORTED. In practice they complete with - // ERROR_NETNAME_DELETED, which means you can't tell the difference between - // a local cancellation and the socket being hard-closed by the peer. - shared_cancel_token_type cancel_token_; - - // The protocol associated with the socket. - protocol_type protocol_; - - // The ID of the thread from which it is safe to cancel asynchronous - // operations. 0 means no asynchronous operations have been started yet. - // ~0 means asynchronous operations have been started from more than one - // thread, and cancellation is not supported for the socket. - DWORD safe_cancellation_thread_id_; - - // Pointers to adjacent socket implementations in linked list. - implementation_type* next_; - implementation_type* prev_; - }; - - // The type of the reactor used for connect operations. - typedef detail::select_reactor reactor_type; - - // The maximum number of buffers to support in a single operation. - enum { max_buffers = 16 }; - - // Constructor. - win_iocp_socket_service(asio::io_service& io_service) - : asio::io_service::service(io_service), - iocp_service_(asio::use_service(io_service)), - reactor_(0), - mutex_(), - impl_list_(0) - { - } - - // Destroy all user-defined handler objects owned by the service. - void shutdown_service() - { - // Close all implementations, causing all operations to complete. - asio::detail::mutex::scoped_lock lock(mutex_); - implementation_type* impl = impl_list_; - while (impl) - { - close(*impl, asio::ignore_error()); - impl = impl->next_; - } - } - - // Construct a new socket implementation. - void construct(implementation_type& impl) - { - impl.socket_ = invalid_socket; - impl.cancel_token_.reset(); - impl.safe_cancellation_thread_id_ = 0; - - // Insert implementation into linked list of all implementations. - asio::detail::mutex::scoped_lock lock(mutex_); - impl.next_ = impl_list_; - impl.prev_ = 0; - if (impl_list_) - impl_list_->prev_ = &impl; - impl_list_ = &impl; - } - - // Destroy a socket implementation. - void destroy(implementation_type& impl) - { - if (impl.socket_ != invalid_socket) - { - // Check if the reactor was created, in which case we need to close the - // socket on the reactor as well to cancel any operations that might be - // running there. - reactor_type* reactor = static_cast( - interlocked_compare_exchange_pointer( - reinterpret_cast(&reactor_), 0, 0)); - if (reactor) - reactor->close_descriptor(impl.socket_); - - if (impl.flags_ & implementation_type::user_set_linger) - { - ::linger opt; - opt.l_onoff = 0; - opt.l_linger = 0; - socket_ops::setsockopt(impl.socket_, - SOL_SOCKET, SO_LINGER, &opt, sizeof(opt)); - } - - socket_ops::close(impl.socket_); - impl.socket_ = invalid_socket; - impl.cancel_token_.reset(); - impl.safe_cancellation_thread_id_ = 0; - } - - // Remove implementation from linked list of all implementations. - asio::detail::mutex::scoped_lock lock(mutex_); - if (impl_list_ == &impl) - impl_list_ = impl.next_; - if (impl.prev_) - impl.prev_->next_ = impl.next_; - if (impl.next_) - impl.next_->prev_= impl.prev_; - impl.next_ = 0; - impl.prev_ = 0; - } - - // Open a new socket implementation. - template - void open(implementation_type& impl, const protocol_type& protocol, - Error_Handler error_handler) - { - close(impl, asio::ignore_error()); - - socket_holder sock(socket_ops::socket(protocol.family(), protocol.type(), - protocol.protocol())); - if (sock.get() == invalid_socket) - { - error_handler(asio::error(socket_ops::get_error())); - return; - } - - iocp_service_.register_socket(sock.get()); - - impl.socket_ = sock.release(); - impl.cancel_token_.reset(static_cast(0), noop_deleter()); - impl.protocol_ = protocol; - - error_handler(asio::error(0)); - } - - // Assign a native socket to a socket implementation. - template - void assign(implementation_type& impl, const protocol_type& protocol, - const native_type& native_socket, Error_Handler error_handler) - { - close(impl, asio::ignore_error()); - - iocp_service_.register_socket(native_socket); - - impl.socket_ = native_socket; - impl.cancel_token_.reset(static_cast(0), noop_deleter()); - impl.protocol_ = protocol; - - error_handler(asio::error(0)); - } - - // Destroy a socket implementation. - template - void close(implementation_type& impl, Error_Handler error_handler) - { - if (impl.socket_ != invalid_socket) - { - // Check if the reactor was created, in which case we need to close the - // socket on the reactor as well to cancel any operations that might be - // running there. - reactor_type* reactor = static_cast( - interlocked_compare_exchange_pointer( - reinterpret_cast(&reactor_), 0, 0)); - if (reactor) - reactor->close_descriptor(impl.socket_); - - if (socket_ops::close(impl.socket_) == socket_error_retval) - { - error_handler(asio::error(socket_ops::get_error())); - return; - } - else - { - impl.socket_ = invalid_socket; - impl.cancel_token_.reset(); - impl.safe_cancellation_thread_id_ = 0; - } - } - - error_handler(asio::error(0)); - } - - // Get the native socket representation. - native_type native(implementation_type& impl) - { - return impl.socket_; - } - - // Cancel all operations associated with the socket. - template - void cancel(implementation_type& impl, Error_Handler error_handler) - { - if (impl.socket_ == invalid_socket) - { - asio::error error(asio::error::bad_descriptor); - error_handler(error); - } - else if (impl.safe_cancellation_thread_id_ == 0) - { - // No operations have been started, so there's nothing to cancel. - error_handler(asio::error(0)); - } - else if (impl.safe_cancellation_thread_id_ == ::GetCurrentThreadId()) - { - // Asynchronous operations have been started from the current thread only, - // so it is safe to try to cancel them using CancelIo. - socket_type sock = impl.socket_; - HANDLE sock_as_handle = reinterpret_cast(sock); - if (!::CancelIo(sock_as_handle)) - { - DWORD last_error = ::GetLastError(); - error_handler(asio::error(last_error)); - } - else - { - error_handler(asio::error(0)); - } - } - else - { - // Asynchronous operations have been started from more than one thread, - // so cancellation is not safe. - error_handler(asio::error(asio::error::not_supported)); - } - } - - // Bind the socket to the specified local endpoint. - template - void bind(implementation_type& impl, const endpoint_type& endpoint, - Error_Handler error_handler) - { - if (socket_ops::bind(impl.socket_, endpoint.data(), - endpoint.size()) == socket_error_retval) - error_handler(asio::error(socket_ops::get_error())); - else - error_handler(asio::error(0)); - } - - // Place the socket into the state where it will listen for new connections. - template - void listen(implementation_type& impl, int backlog, - Error_Handler error_handler) - { - if (socket_ops::listen(impl.socket_, backlog) == socket_error_retval) - error_handler(asio::error(socket_ops::get_error())); - else - error_handler(asio::error(0)); - } - - // Set a socket option. - template - void set_option(implementation_type& impl, const Option& option, - Error_Handler error_handler) - { - if (option.level(impl.protocol_) == custom_socket_option_level - && option.name(impl.protocol_) == enable_connection_aborted_option) - { - if (option.size(impl.protocol_) != sizeof(int)) - { - error_handler(asio::error(asio::error::invalid_argument)); - } - else - { - if (*reinterpret_cast(option.data(impl.protocol_))) - impl.flags_ |= implementation_type::enable_connection_aborted; - else - impl.flags_ &= ~implementation_type::enable_connection_aborted; - error_handler(asio::error(0)); - } - } - else - { - if (option.level(impl.protocol_) == SOL_SOCKET - && option.name(impl.protocol_) == SO_LINGER) - { - impl.flags_ |= implementation_type::user_set_linger; - } - - if (socket_ops::setsockopt(impl.socket_, - option.level(impl.protocol_), option.name(impl.protocol_), - option.data(impl.protocol_), option.size(impl.protocol_))) - error_handler(asio::error(socket_ops::get_error())); - else - error_handler(asio::error(0)); - } - } - - // Set a socket option. - template - void get_option(const implementation_type& impl, Option& option, - Error_Handler error_handler) const - { - if (option.level(impl.protocol_) == custom_socket_option_level - && option.name(impl.protocol_) == enable_connection_aborted_option) - { - if (option.size(impl.protocol_) != sizeof(int)) - { - error_handler(asio::error(asio::error::invalid_argument)); - } - else - { - int* target = reinterpret_cast(option.data(impl.protocol_)); - if (impl.flags_ & implementation_type::enable_connection_aborted) - *target = 1; - else - *target = 0; - error_handler(asio::error(0)); - } - } - else - { - size_t size = option.size(impl.protocol_); - if (socket_ops::getsockopt(impl.socket_, - option.level(impl.protocol_), option.name(impl.protocol_), - option.data(impl.protocol_), &size)) - error_handler(asio::error(socket_ops::get_error())); - else - error_handler(asio::error(0)); - } - } - - // Perform an IO control command on the socket. - template - void io_control(implementation_type& impl, IO_Control_Command& command, - Error_Handler error_handler) - { - if (socket_ops::ioctl(impl.socket_, command.name(), - static_cast(command.data()))) - error_handler(asio::error(socket_ops::get_error())); - else - error_handler(asio::error(0)); - } - - // Get the local endpoint. - template - void get_local_endpoint(const implementation_type& impl, - endpoint_type& endpoint, Error_Handler error_handler) const - { - socket_addr_len_type addr_len = endpoint.capacity(); - if (socket_ops::getsockname(impl.socket_, endpoint.data(), &addr_len)) - { - error_handler(asio::error(socket_ops::get_error())); - return; - } - - endpoint.resize(addr_len); - error_handler(asio::error(0)); - } - - // Get the remote endpoint. - template - void get_remote_endpoint(const implementation_type& impl, - endpoint_type& endpoint, Error_Handler error_handler) const - { - if (impl.socket_.have_remote_endpoint()) - { - // Check if socket is still connected. - DWORD connect_time = 0; - size_t connect_time_len = sizeof(connect_time); - if (socket_ops::getsockopt(impl.socket_, SOL_SOCKET, SO_CONNECT_TIME, - &connect_time, &connect_time_len) == socket_error_retval) - { - error_handler(asio::error(socket_ops::get_error())); - return; - } - if (connect_time == 0xFFFFFFFF) - { - error_handler(asio::error(asio::error::not_connected)); - return; - } - - endpoint = impl.socket_.remote_endpoint(); - error_handler(asio::error(0)); - } - else - { - socket_addr_len_type addr_len = endpoint.capacity(); - if (socket_ops::getpeername(impl.socket_, endpoint.data(), &addr_len)) - { - error_handler(asio::error(socket_ops::get_error())); - return; - } - - endpoint.resize(addr_len); - error_handler(asio::error(0)); - } - } - - /// Disable sends or receives on the socket. - template - void shutdown(implementation_type& impl, socket_base::shutdown_type what, - Error_Handler error_handler) - { - if (socket_ops::shutdown(impl.socket_, what) != 0) - error_handler(asio::error(socket_ops::get_error())); - else - error_handler(asio::error(0)); - } - - // Send the given data to the peer. Returns the number of bytes sent. - template - size_t send(implementation_type& impl, const Const_Buffers& buffers, - socket_base::message_flags flags, Error_Handler error_handler) - { - // Copy buffers into WSABUF array. - ::WSABUF bufs[max_buffers]; - typename Const_Buffers::const_iterator iter = buffers.begin(); - typename Const_Buffers::const_iterator end = buffers.end(); - DWORD i = 0; - size_t total_buffer_size = 0; - for (; iter != end && i < max_buffers; ++iter, ++i) - { - asio::const_buffer buffer(*iter); - bufs[i].len = static_cast(asio::buffer_size(buffer)); - bufs[i].buf = const_cast( - asio::buffer_cast(buffer)); - total_buffer_size += asio::buffer_size(buffer); - } - - // A request to receive 0 bytes on a stream socket is a no-op. - if (impl.protocol_.type() == SOCK_STREAM && total_buffer_size == 0) - { - error_handler(asio::error(0)); - return 0; - } - - // Send the data. - DWORD bytes_transferred = 0; - int result = ::WSASend(impl.socket_, bufs, - i, &bytes_transferred, flags, 0, 0); - if (result != 0) - { - DWORD last_error = ::WSAGetLastError(); - if (last_error == ERROR_NETNAME_DELETED) - last_error = WSAECONNRESET; - error_handler(asio::error(last_error)); - return 0; - } - - error_handler(asio::error(0)); - return bytes_transferred; - } - - template - class send_operation - : public operation - { - public: - send_operation(asio::io_service& io_service, - weak_cancel_token_type cancel_token, - const Const_Buffers& buffers, Handler handler) - : operation( - &send_operation::do_completion_impl, - &send_operation::destroy_impl), - work_(io_service), - cancel_token_(cancel_token), - buffers_(buffers), - handler_(handler) - { - } - - private: - static void do_completion_impl(operation* op, - DWORD last_error, size_t bytes_transferred) - { - // Take ownership of the operation object. - typedef send_operation op_type; - op_type* handler_op(static_cast(op)); - typedef handler_alloc_traits alloc_traits; - handler_ptr ptr(handler_op->handler_, handler_op); - - // Map ERROR_NETNAME_DELETED to more useful error. - if (last_error == ERROR_NETNAME_DELETED) - { - if (handler_op->cancel_token_.expired()) - last_error = ERROR_OPERATION_ABORTED; - else - last_error = WSAECONNRESET; - } - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. - Handler handler(handler_op->handler_); - - // Free the memory associated with the handler. - ptr.reset(); - - // Call the handler. - asio::error error(last_error); - asio_handler_invoke_helpers::invoke( - detail::bind_handler(handler, error, bytes_transferred), &handler); - } - - static void destroy_impl(operation* op) - { - // Take ownership of the operation object. - typedef send_operation op_type; - op_type* handler_op(static_cast(op)); - typedef handler_alloc_traits alloc_traits; - handler_ptr ptr(handler_op->handler_, handler_op); - } - - asio::io_service::work work_; - weak_cancel_token_type cancel_token_; - Const_Buffers buffers_; - Handler handler_; - }; - - // Start an asynchronous send. The data being sent must be valid for the - // lifetime of the asynchronous operation. - template - void async_send(implementation_type& impl, const Const_Buffers& buffers, - socket_base::message_flags flags, Handler handler) - { - // Update the ID of the thread from which cancellation is safe. - if (impl.safe_cancellation_thread_id_ == 0) - impl.safe_cancellation_thread_id_ = ::GetCurrentThreadId(); - else - impl.safe_cancellation_thread_id_ = ~DWORD(0); - - // Allocate and construct an operation to wrap the handler. - typedef send_operation value_type; - typedef handler_alloc_traits alloc_traits; - raw_handler_ptr raw_ptr(handler); - handler_ptr ptr(raw_ptr, - io_service(), impl.cancel_token_, buffers, handler); - - // Copy buffers into WSABUF array. - ::WSABUF bufs[max_buffers]; - typename Const_Buffers::const_iterator iter = buffers.begin(); - typename Const_Buffers::const_iterator end = buffers.end(); - DWORD i = 0; - size_t total_buffer_size = 0; - for (; iter != end && i < max_buffers; ++iter, ++i) - { - asio::const_buffer buffer(*iter); - bufs[i].len = static_cast(asio::buffer_size(buffer)); - bufs[i].buf = const_cast( - asio::buffer_cast(buffer)); - total_buffer_size += asio::buffer_size(buffer); - } - - // A request to receive 0 bytes on a stream socket is a no-op. - if (impl.protocol_.type() == SOCK_STREAM && total_buffer_size == 0) - { - ptr.reset(); - asio::error error(asio::error::success); - iocp_service_.post(bind_handler(handler, error, 0)); - return; - } - - // Send the data. - DWORD bytes_transferred = 0; - int result = ::WSASend(impl.socket_, bufs, i, - &bytes_transferred, flags, ptr.get(), 0); - DWORD last_error = ::WSAGetLastError(); - - // Check if the operation completed immediately. - if (result != 0 && last_error != WSA_IO_PENDING) - { - ptr.reset(); - asio::error error(last_error); - iocp_service_.post(bind_handler(handler, error, bytes_transferred)); - } - else - { - ptr.release(); - } - } - - // Send a datagram to the specified endpoint. Returns the number of bytes - // sent. - template - size_t send_to(implementation_type& impl, const Const_Buffers& buffers, - const endpoint_type& destination, socket_base::message_flags flags, - Error_Handler error_handler) - { - // Copy buffers into WSABUF array. - ::WSABUF bufs[max_buffers]; - typename Const_Buffers::const_iterator iter = buffers.begin(); - typename Const_Buffers::const_iterator end = buffers.end(); - DWORD i = 0; - for (; iter != end && i < max_buffers; ++iter, ++i) - { - asio::const_buffer buffer(*iter); - bufs[i].len = static_cast(asio::buffer_size(buffer)); - bufs[i].buf = const_cast( - asio::buffer_cast(buffer)); - } - - // Send the data. - DWORD bytes_transferred = 0; - int result = ::WSASendTo(impl.socket_, bufs, i, &bytes_transferred, - flags, destination.data(), destination.size(), 0, 0); - if (result != 0) - { - DWORD last_error = ::WSAGetLastError(); - error_handler(asio::error(last_error)); - return 0; - } - - error_handler(asio::error(0)); - return bytes_transferred; - } - - template - class send_to_operation - : public operation - { - public: - send_to_operation(asio::io_service& io_service, - const Const_Buffers& buffers, Handler handler) - : operation( - &send_to_operation::do_completion_impl, - &send_to_operation::destroy_impl), - work_(io_service), - buffers_(buffers), - handler_(handler) - { - } - - private: - static void do_completion_impl(operation* op, - DWORD last_error, size_t bytes_transferred) - { - // Take ownership of the operation object. - typedef send_to_operation op_type; - op_type* handler_op(static_cast(op)); - typedef handler_alloc_traits alloc_traits; - handler_ptr ptr(handler_op->handler_, handler_op); - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. - Handler handler(handler_op->handler_); - - // Free the memory associated with the handler. - ptr.reset(); - - // Call the handler. - asio::error error(last_error); - asio_handler_invoke_helpers::invoke( - detail::bind_handler(handler, error, bytes_transferred), &handler); - } - - static void destroy_impl(operation* op) - { - // Take ownership of the operation object. - typedef send_to_operation op_type; - op_type* handler_op(static_cast(op)); - typedef handler_alloc_traits alloc_traits; - handler_ptr ptr(handler_op->handler_, handler_op); - } - - asio::io_service::work work_; - Const_Buffers buffers_; - Handler handler_; - }; - - // Start an asynchronous send. The data being sent must be valid for the - // lifetime of the asynchronous operation. - template - void async_send_to(implementation_type& impl, const Const_Buffers& buffers, - const endpoint_type& destination, socket_base::message_flags flags, - Handler handler) - { - // Update the ID of the thread from which cancellation is safe. - if (impl.safe_cancellation_thread_id_ == 0) - impl.safe_cancellation_thread_id_ = ::GetCurrentThreadId(); - else - impl.safe_cancellation_thread_id_ = ~DWORD(0); - - // Allocate and construct an operation to wrap the handler. - typedef send_to_operation value_type; - typedef handler_alloc_traits alloc_traits; - raw_handler_ptr raw_ptr(handler); - handler_ptr ptr(raw_ptr, io_service(), buffers, handler); - - // Copy buffers into WSABUF array. - ::WSABUF bufs[max_buffers]; - typename Const_Buffers::const_iterator iter = buffers.begin(); - typename Const_Buffers::const_iterator end = buffers.end(); - DWORD i = 0; - for (; iter != end && i < max_buffers; ++iter, ++i) - { - asio::const_buffer buffer(*iter); - bufs[i].len = static_cast(asio::buffer_size(buffer)); - bufs[i].buf = const_cast( - asio::buffer_cast(buffer)); - } - - // Send the data. - DWORD bytes_transferred = 0; - int result = ::WSASendTo(impl.socket_, bufs, i, &bytes_transferred, - flags, destination.data(), destination.size(), ptr.get(), 0); - DWORD last_error = ::WSAGetLastError(); - - // Check if the operation completed immediately. - if (result != 0 && last_error != WSA_IO_PENDING) - { - ptr.reset(); - asio::error error(last_error); - iocp_service_.post(bind_handler(handler, error, bytes_transferred)); - } - else - { - ptr.release(); - } - } - - // Receive some data from the peer. Returns the number of bytes received. - template - size_t receive(implementation_type& impl, const Mutable_Buffers& buffers, - socket_base::message_flags flags, Error_Handler error_handler) - { - // Copy buffers into WSABUF array. - ::WSABUF bufs[max_buffers]; - typename Mutable_Buffers::const_iterator iter = buffers.begin(); - typename Mutable_Buffers::const_iterator end = buffers.end(); - DWORD i = 0; - size_t total_buffer_size = 0; - for (; iter != end && i < max_buffers; ++iter, ++i) - { - asio::mutable_buffer buffer(*iter); - bufs[i].len = static_cast(asio::buffer_size(buffer)); - bufs[i].buf = asio::buffer_cast(buffer); - total_buffer_size += asio::buffer_size(buffer); - } - - // A request to receive 0 bytes on a stream socket is a no-op. - if (impl.protocol_.type() == SOCK_STREAM && total_buffer_size == 0) - { - error_handler(asio::error(0)); - return 0; - } - - // Receive some data. - DWORD bytes_transferred = 0; - DWORD recv_flags = flags; - int result = ::WSARecv(impl.socket_, bufs, i, - &bytes_transferred, &recv_flags, 0, 0); - if (result != 0) - { - DWORD last_error = ::WSAGetLastError(); - if (last_error == ERROR_NETNAME_DELETED) - last_error = WSAECONNRESET; - error_handler(asio::error(last_error)); - return 0; - } - if (bytes_transferred == 0) - { - error_handler(asio::error(asio::error::eof)); - return 0; - } - - error_handler(asio::error(0)); - return bytes_transferred; - } - - template - class receive_operation - : public operation - { - public: - receive_operation(asio::io_service& io_service, - weak_cancel_token_type cancel_token, - const Mutable_Buffers& buffers, Handler handler) - : operation( - &receive_operation::do_completion_impl, - &receive_operation::destroy_impl), - work_(io_service), - cancel_token_(cancel_token), - buffers_(buffers), - handler_(handler) - { - } - - private: - static void do_completion_impl(operation* op, - DWORD last_error, size_t bytes_transferred) - { - // Take ownership of the operation object. - typedef receive_operation op_type; - op_type* handler_op(static_cast(op)); - typedef handler_alloc_traits alloc_traits; - handler_ptr ptr(handler_op->handler_, handler_op); - - // Map ERROR_NETNAME_DELETED to more useful error. - if (last_error == ERROR_NETNAME_DELETED) - { - if (handler_op->cancel_token_.expired()) - last_error = ERROR_OPERATION_ABORTED; - else - last_error = WSAECONNRESET; - } - - // Check for connection closed. - else if (last_error == 0 && bytes_transferred == 0) - { - last_error = asio::error::eof; - } - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. - Handler handler(handler_op->handler_); - - // Free the memory associated with the handler. - ptr.reset(); - - // Call the handler. - asio::error error(last_error); - asio_handler_invoke_helpers::invoke( - detail::bind_handler(handler, error, bytes_transferred), &handler); - } - - static void destroy_impl(operation* op) - { - // Take ownership of the operation object. - typedef receive_operation op_type; - op_type* handler_op(static_cast(op)); - typedef handler_alloc_traits alloc_traits; - handler_ptr ptr(handler_op->handler_, handler_op); - } - - asio::io_service::work work_; - weak_cancel_token_type cancel_token_; - Mutable_Buffers buffers_; - Handler handler_; - }; - - // Start an asynchronous receive. The buffer for the data being received - // must be valid for the lifetime of the asynchronous operation. - template - void async_receive(implementation_type& impl, const Mutable_Buffers& buffers, - socket_base::message_flags flags, Handler handler) - { - // Update the ID of the thread from which cancellation is safe. - if (impl.safe_cancellation_thread_id_ == 0) - impl.safe_cancellation_thread_id_ = ::GetCurrentThreadId(); - else - impl.safe_cancellation_thread_id_ = ~DWORD(0); - - // Allocate and construct an operation to wrap the handler. - typedef receive_operation value_type; - typedef handler_alloc_traits alloc_traits; - raw_handler_ptr raw_ptr(handler); - handler_ptr ptr(raw_ptr, - io_service(), impl.cancel_token_, buffers, handler); - - // Copy buffers into WSABUF array. - ::WSABUF bufs[max_buffers]; - typename Mutable_Buffers::const_iterator iter = buffers.begin(); - typename Mutable_Buffers::const_iterator end = buffers.end(); - DWORD i = 0; - size_t total_buffer_size = 0; - for (; iter != end && i < max_buffers; ++iter, ++i) - { - asio::mutable_buffer buffer(*iter); - bufs[i].len = static_cast(asio::buffer_size(buffer)); - bufs[i].buf = asio::buffer_cast(buffer); - total_buffer_size += asio::buffer_size(buffer); - } - - // A request to receive 0 bytes on a stream socket is a no-op. - if (impl.protocol_.type() == SOCK_STREAM && total_buffer_size == 0) - { - ptr.reset(); - asio::error error(asio::error::success); - iocp_service_.post(bind_handler(handler, error, 0)); - return; - } - - // Receive some data. - DWORD bytes_transferred = 0; - DWORD recv_flags = flags; - int result = ::WSARecv(impl.socket_, bufs, i, - &bytes_transferred, &recv_flags, ptr.get(), 0); - DWORD last_error = ::WSAGetLastError(); - if (result != 0 && last_error != WSA_IO_PENDING) - { - ptr.reset(); - asio::error error(last_error); - iocp_service_.post(bind_handler(handler, error, bytes_transferred)); - } - else - { - ptr.release(); - } - } - - // Receive a datagram with the endpoint of the sender. Returns the number of - // bytes received. - template - size_t receive_from(implementation_type& impl, const Mutable_Buffers& buffers, - endpoint_type& sender_endpoint, socket_base::message_flags flags, - Error_Handler error_handler) - { - // Copy buffers into WSABUF array. - ::WSABUF bufs[max_buffers]; - typename Mutable_Buffers::const_iterator iter = buffers.begin(); - typename Mutable_Buffers::const_iterator end = buffers.end(); - DWORD i = 0; - for (; iter != end && i < max_buffers; ++iter, ++i) - { - asio::mutable_buffer buffer(*iter); - bufs[i].len = static_cast(asio::buffer_size(buffer)); - bufs[i].buf = asio::buffer_cast(buffer); - } - - // Receive some data. - DWORD bytes_transferred = 0; - DWORD recv_flags = flags; - int endpoint_size = sender_endpoint.capacity(); - int result = ::WSARecvFrom(impl.socket_, bufs, i, &bytes_transferred, - &recv_flags, sender_endpoint.data(), &endpoint_size, 0, 0); - if (result != 0) - { - DWORD last_error = ::WSAGetLastError(); - error_handler(asio::error(last_error)); - return 0; - } - if (bytes_transferred == 0) - { - error_handler(asio::error(asio::error::eof)); - return 0; - } - - sender_endpoint.resize(endpoint_size); - - error_handler(asio::error(0)); - return bytes_transferred; - } - - template - class receive_from_operation - : public operation - { - public: - receive_from_operation(asio::io_service& io_service, - endpoint_type& endpoint, const Mutable_Buffers& buffers, - Handler handler) - : operation( - &receive_from_operation::do_completion_impl, - &receive_from_operation::destroy_impl), - endpoint_(endpoint), - endpoint_size_(endpoint.capacity()), - work_(io_service), - buffers_(buffers), - handler_(handler) - { - } - - int& endpoint_size() - { - return endpoint_size_; - } - - private: - static void do_completion_impl(operation* op, - DWORD last_error, size_t bytes_transferred) - { - // Take ownership of the operation object. - typedef receive_from_operation op_type; - op_type* handler_op(static_cast(op)); - typedef handler_alloc_traits alloc_traits; - handler_ptr ptr(handler_op->handler_, handler_op); - - // Check for connection closed. - if (last_error == 0 && bytes_transferred == 0) - { - last_error = asio::error::eof; - } - - // Record the size of the endpoint returned by the operation. - handler_op->endpoint_.resize(handler_op->endpoint_size_); - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. - Handler handler(handler_op->handler_); - - // Free the memory associated with the handler. - ptr.reset(); - - // Call the handler. - asio::error error(last_error); - asio_handler_invoke_helpers::invoke( - detail::bind_handler(handler, error, bytes_transferred), &handler); - } - - static void destroy_impl(operation* op) - { - // Take ownership of the operation object. - typedef receive_from_operation op_type; - op_type* handler_op(static_cast(op)); - typedef handler_alloc_traits alloc_traits; - handler_ptr ptr(handler_op->handler_, handler_op); - } - - endpoint_type& endpoint_; - int endpoint_size_; - asio::io_service::work work_; - Mutable_Buffers buffers_; - Handler handler_; - }; - - // Start an asynchronous receive. The buffer for the data being received and - // the sender_endpoint object must both be valid for the lifetime of the - // asynchronous operation. - template - void async_receive_from(implementation_type& impl, - const Mutable_Buffers& buffers, endpoint_type& sender_endp, - socket_base::message_flags flags, Handler handler) - { - // Update the ID of the thread from which cancellation is safe. - if (impl.safe_cancellation_thread_id_ == 0) - impl.safe_cancellation_thread_id_ = ::GetCurrentThreadId(); - else - impl.safe_cancellation_thread_id_ = ~DWORD(0); - - // Allocate and construct an operation to wrap the handler. - typedef receive_from_operation value_type; - typedef handler_alloc_traits alloc_traits; - raw_handler_ptr raw_ptr(handler); - handler_ptr ptr(raw_ptr, - io_service(), sender_endp, buffers, handler); - - // Copy buffers into WSABUF array. - ::WSABUF bufs[max_buffers]; - typename Mutable_Buffers::const_iterator iter = buffers.begin(); - typename Mutable_Buffers::const_iterator end = buffers.end(); - DWORD i = 0; - for (; iter != end && i < max_buffers; ++iter, ++i) - { - asio::mutable_buffer buffer(*iter); - bufs[i].len = static_cast(asio::buffer_size(buffer)); - bufs[i].buf = asio::buffer_cast(buffer); - } - - // Receive some data. - DWORD bytes_transferred = 0; - DWORD recv_flags = flags; - int result = ::WSARecvFrom(impl.socket_, bufs, i, &bytes_transferred, - &recv_flags, sender_endp.data(), &ptr.get()->endpoint_size(), - ptr.get(), 0); - DWORD last_error = ::WSAGetLastError(); - if (result != 0 && last_error != WSA_IO_PENDING) - { - ptr.reset(); - asio::error error(last_error); - iocp_service_.post(bind_handler(handler, error, bytes_transferred)); - } - else - { - ptr.release(); - } - } - - // Accept a new connection. - template - void accept(implementation_type& impl, Socket& peer, - Error_Handler error_handler) - { - // We cannot accept a socket that is already open. - if (peer.native() != invalid_socket) - { - error_handler(asio::error(asio::error::already_connected)); - return; - } - - for (;;) - { - socket_holder new_socket(socket_ops::accept(impl.socket_, 0, 0)); - if (int err = socket_ops::get_error()) - { - if (err == asio::error::connection_aborted - && !(impl.flags_ & implementation_type::enable_connection_aborted)) - { - // Retry accept operation. - continue; - } - else - { - error_handler(asio::error(err)); - return; - } - } - - asio::error temp_error; - peer.assign(impl.protocol_, new_socket.get(), - asio::assign_error(temp_error)); - if (temp_error) - { - error_handler(temp_error); - return; - } - else - { - new_socket.release(); - error_handler(asio::error(0)); - return; - } - } - } - - // Accept a new connection. - template - void accept_endpoint(implementation_type& impl, Socket& peer, - endpoint_type& peer_endpoint, Error_Handler error_handler) - { - // We cannot accept a socket that is already open. - if (peer.native() != invalid_socket) - { - error_handler(asio::error(asio::error::already_connected)); - return; - } - - for (;;) - { - socket_addr_len_type addr_len = peer_endpoint.capacity(); - socket_holder new_socket(socket_ops::accept( - impl.socket_, peer_endpoint.data(), &addr_len)); - if (int err = socket_ops::get_error()) - { - if (err == asio::error::connection_aborted - && !(impl.flags_ & implementation_type::enable_connection_aborted)) - { - // Retry accept operation. - continue; - } - else - { - error_handler(asio::error(err)); - return; - } - } - - peer_endpoint.resize(addr_len); - - asio::error temp_error; - peer.assign(impl.protocol_, new_socket.get(), - asio::assign_error(temp_error)); - if (temp_error) - { - error_handler(temp_error); - return; - } - else - { - new_socket.release(); - error_handler(asio::error(0)); - return; - } - } - } - - template - class accept_operation - : public operation - { - public: - accept_operation(win_iocp_io_service& io_service, socket_type socket, - socket_type new_socket, Socket& peer, const protocol_type& protocol, - bool enable_connection_aborted, Handler handler) - : operation( - &accept_operation::do_completion_impl, - &accept_operation::destroy_impl), - io_service_(io_service), - socket_(socket), - new_socket_(new_socket), - peer_(peer), - protocol_(protocol), - work_(io_service.io_service()), - enable_connection_aborted_(enable_connection_aborted), - handler_(handler) - { - } - - socket_type new_socket() - { - return new_socket_.get(); - } - - void* output_buffer() - { - return output_buffer_; - } - - DWORD address_length() - { - return sizeof(sockaddr_storage_type) + 16; - } - - private: - static void do_completion_impl(operation* op, - DWORD last_error, size_t bytes_transferred) - { - // Take ownership of the operation object. - typedef accept_operation op_type; - op_type* handler_op(static_cast(op)); - typedef handler_alloc_traits alloc_traits; - handler_ptr ptr(handler_op->handler_, handler_op); - - // Map Windows error ERROR_NETNAME_DELETED to connection_aborted. - if (last_error == ERROR_NETNAME_DELETED) - { - last_error = asio::error::connection_aborted; - } - - // Restart the accept operation if we got the connection_aborted error - // and the enable_connection_aborted socket option is not set. - if (last_error == asio::error::connection_aborted - && !ptr.get()->enable_connection_aborted_) - { - // Reset OVERLAPPED structure. - ptr.get()->Internal = 0; - ptr.get()->InternalHigh = 0; - ptr.get()->Offset = 0; - ptr.get()->OffsetHigh = 0; - ptr.get()->hEvent = 0; - - // Create a new socket for the next connection, since the AcceptEx call - // fails with WSAEINVAL if we try to reuse the same socket. - ptr.get()->new_socket_.reset(); - ptr.get()->new_socket_.reset( - socket_ops::socket(ptr.get()->protocol_.family(), - ptr.get()->protocol_.type(), ptr.get()->protocol_.protocol())); - last_error = socket_ops::get_error(); - if (ptr.get()->new_socket() != invalid_socket) - { - // Accept a connection. - DWORD bytes_read = 0; - BOOL result = ::AcceptEx(ptr.get()->socket_, ptr.get()->new_socket(), - ptr.get()->output_buffer(), 0, ptr.get()->address_length(), - ptr.get()->address_length(), &bytes_read, ptr.get()); - last_error = ::WSAGetLastError(); - - // Check if the operation completed immediately. - if (!result && last_error != WSA_IO_PENDING) - { - if (last_error == ERROR_NETNAME_DELETED - || last_error == asio::error::connection_aborted) - { - // Post this handler so that operation will be restarted again. - ptr.get()->io_service_.post_completion(ptr.get(), last_error, 0); - ptr.release(); - return; - } - else - { - // Operation already complete. Continue with rest of this handler. - } - } - else - { - // Asynchronous operation has been successfully restarted. - ptr.release(); - return; - } - } - } - - // Get the address of the peer. - endpoint_type peer_endpoint; - if (last_error == 0) - { - LPSOCKADDR local_addr = 0; - int local_addr_length = 0; - LPSOCKADDR remote_addr = 0; - int remote_addr_length = 0; - GetAcceptExSockaddrs(handler_op->output_buffer(), 0, - handler_op->address_length(), handler_op->address_length(), - &local_addr, &local_addr_length, &remote_addr, &remote_addr_length); - if (remote_addr_length > peer_endpoint.capacity()) - { - last_error = asio::error::invalid_argument; - } - else - { - using namespace std; // For memcpy. - memcpy(peer_endpoint.data(), remote_addr, remote_addr_length); - peer_endpoint.resize(remote_addr_length); - } - } - - // Need to set the SO_UPDATE_ACCEPT_CONTEXT option so that getsockname - // and getpeername will work on the accepted socket. - if (last_error == 0) - { - SOCKET update_ctx_param = handler_op->socket_; - if (socket_ops::setsockopt(handler_op->new_socket_.get(), - SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, - &update_ctx_param, sizeof(SOCKET)) != 0) - { - last_error = socket_ops::get_error(); - } - } - - // If the socket was successfully accepted, transfer ownership of the - // socket to the peer object. - if (last_error == 0) - { - asio::error temp_error; - handler_op->peer_.assign(handler_op->protocol_, - native_type(handler_op->new_socket_.get(), peer_endpoint), - asio::assign_error(temp_error)); - if (temp_error) - last_error = temp_error.code(); - else - handler_op->new_socket_.release(); - } - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. - Handler handler(handler_op->handler_); - - // Free the memory associated with the handler. - ptr.reset(); - - // Call the handler. - asio::error error(last_error); - asio_handler_invoke_helpers::invoke( - detail::bind_handler(handler, error), &handler); - } - - static void destroy_impl(operation* op) - { - // Take ownership of the operation object. - typedef accept_operation op_type; - op_type* handler_op(static_cast(op)); - typedef handler_alloc_traits alloc_traits; - handler_ptr ptr(handler_op->handler_, handler_op); - } - - win_iocp_io_service& io_service_; - socket_type socket_; - socket_holder new_socket_; - Socket& peer_; - protocol_type protocol_; - asio::io_service::work work_; - unsigned char output_buffer_[(sizeof(sockaddr_storage_type) + 16) * 2]; - bool enable_connection_aborted_; - Handler handler_; - }; - - // Start an asynchronous accept. The peer object must be valid until the - // accept's handler is invoked. - template - void async_accept(implementation_type& impl, Socket& peer, Handler handler) - { - // Update the ID of the thread from which cancellation is safe. - if (impl.safe_cancellation_thread_id_ == 0) - impl.safe_cancellation_thread_id_ = ::GetCurrentThreadId(); - else - impl.safe_cancellation_thread_id_ = ~DWORD(0); - - // Check whether acceptor has been initialised. - if (impl.socket_ == invalid_socket) - { - asio::error error(asio::error::bad_descriptor); - io_service().post(bind_handler(handler, error)); - return; - } - - // Check that peer socket has not already been connected. - if (peer.native() != invalid_socket) - { - asio::error error(asio::error::already_connected); - io_service().post(bind_handler(handler, error)); - return; - } - - // Create a new socket for the connection. - socket_holder sock(socket_ops::socket(impl.protocol_.family(), - impl.protocol_.type(), impl.protocol_.protocol())); - if (sock.get() == invalid_socket) - { - asio::error error(socket_ops::get_error()); - io_service().post(bind_handler(handler, error)); - return; - } - - // Allocate and construct an operation to wrap the handler. - typedef accept_operation value_type; - typedef handler_alloc_traits alloc_traits; - raw_handler_ptr raw_ptr(handler); - socket_type new_socket = sock.get(); - bool enable_connection_aborted = - (impl.flags_ & implementation_type::enable_connection_aborted); - handler_ptr ptr(raw_ptr, - iocp_service_, impl.socket_, new_socket, peer, impl.protocol_, - enable_connection_aborted, handler); - sock.release(); - - // Accept a connection. - DWORD bytes_read = 0; - BOOL result = ::AcceptEx(impl.socket_, ptr.get()->new_socket(), - ptr.get()->output_buffer(), 0, ptr.get()->address_length(), - ptr.get()->address_length(), &bytes_read, ptr.get()); - DWORD last_error = ::WSAGetLastError(); - - // Check if the operation completed immediately. - if (!result && last_error != WSA_IO_PENDING) - { - if (!enable_connection_aborted - && (last_error == ERROR_NETNAME_DELETED - || last_error == asio::error::connection_aborted)) - { - // Post handler so that operation will be restarted again. We do not - // perform the AcceptEx again here to avoid the possibility of starving - // other handlers. - iocp_service_.post_completion(ptr.get(), last_error, 0); - ptr.release(); - } - else - { - ptr.reset(); - asio::error error(last_error); - iocp_service_.post(bind_handler(handler, error)); - } - } - else - { - ptr.release(); - } - } - - template - class accept_endp_operation - : public operation - { - public: - accept_endp_operation(win_iocp_io_service& io_service, - socket_type socket, socket_type new_socket, Socket& peer, - const protocol_type& protocol, endpoint_type& peer_endpoint, - bool enable_connection_aborted, Handler handler) - : operation( - &accept_endp_operation::do_completion_impl, - &accept_endp_operation::destroy_impl), - io_service_(io_service), - socket_(socket), - new_socket_(new_socket), - peer_(peer), - protocol_(protocol), - peer_endpoint_(peer_endpoint), - work_(io_service.io_service()), - enable_connection_aborted_(enable_connection_aborted), - handler_(handler) - { - } - - socket_type new_socket() - { - return new_socket_.get(); - } - - void* output_buffer() - { - return output_buffer_; - } - - DWORD address_length() - { - return sizeof(sockaddr_storage_type) + 16; - } - - private: - static void do_completion_impl(operation* op, - DWORD last_error, size_t bytes_transferred) - { - // Take ownership of the operation object. - typedef accept_endp_operation op_type; - op_type* handler_op(static_cast(op)); - typedef handler_alloc_traits alloc_traits; - handler_ptr ptr(handler_op->handler_, handler_op); - - // Map Windows error ERROR_NETNAME_DELETED to connection_aborted. - if (last_error == ERROR_NETNAME_DELETED) - { - last_error = asio::error::connection_aborted; - } - - // Restart the accept operation if we got the connection_aborted error - // and the enable_connection_aborted socket option is not set. - if (last_error == asio::error::connection_aborted - && !ptr.get()->enable_connection_aborted_) - { - // Reset OVERLAPPED structure. - ptr.get()->Internal = 0; - ptr.get()->InternalHigh = 0; - ptr.get()->Offset = 0; - ptr.get()->OffsetHigh = 0; - ptr.get()->hEvent = 0; - - // Create a new socket for the next connection, since the AcceptEx call - // fails with WSAEINVAL if we try to reuse the same socket. - ptr.get()->new_socket_.reset(); - ptr.get()->new_socket_.reset( - socket_ops::socket(ptr.get()->protocol_.family(), - ptr.get()->protocol_.type(), ptr.get()->protocol_.protocol())); - last_error = socket_ops::get_error(); - if (ptr.get()->new_socket() != invalid_socket) - { - // Accept a connection. - DWORD bytes_read = 0; - BOOL result = ::AcceptEx(ptr.get()->socket_, ptr.get()->new_socket(), - ptr.get()->output_buffer(), 0, ptr.get()->address_length(), - ptr.get()->address_length(), &bytes_read, ptr.get()); - last_error = ::WSAGetLastError(); - - // Check if the operation completed immediately. - if (!result && last_error != WSA_IO_PENDING) - { - if (last_error == ERROR_NETNAME_DELETED - || last_error == asio::error::connection_aborted) - { - // Post this handler so that operation will be restarted again. - ptr.get()->io_service_.post_completion(ptr.get(), last_error, 0); - ptr.release(); - return; - } - else - { - // Operation already complete. Continue with rest of this handler. - } - } - else - { - // Asynchronous operation has been successfully restarted. - ptr.release(); - return; - } - } - } - - // Get the address of the peer. - if (last_error == 0) - { - LPSOCKADDR local_addr = 0; - int local_addr_length = 0; - LPSOCKADDR remote_addr = 0; - int remote_addr_length = 0; - GetAcceptExSockaddrs(handler_op->output_buffer(), 0, - handler_op->address_length(), handler_op->address_length(), - &local_addr, &local_addr_length, &remote_addr, &remote_addr_length); - if (remote_addr_length > handler_op->peer_endpoint_.capacity()) - { - last_error = asio::error::invalid_argument; - } - else - { - using namespace std; // For memcpy. - memcpy(handler_op->peer_endpoint_.data(), - remote_addr, remote_addr_length); - handler_op->peer_endpoint_.resize(remote_addr_length); - } - } - - // Need to set the SO_UPDATE_ACCEPT_CONTEXT option so that getsockname - // and getpeername will work on the accepted socket. - if (last_error == 0) - { - SOCKET update_ctx_param = handler_op->socket_; - if (socket_ops::setsockopt(handler_op->new_socket_.get(), - SOL_SOCKET, SO_UPDATE_ACCEPT_CONTEXT, - &update_ctx_param, sizeof(SOCKET)) != 0) - { - last_error = socket_ops::get_error(); - } - } - - // If the socket was successfully accepted, transfer ownership of the - // socket to the peer object. - if (last_error == 0) - { - asio::error temp_error; - handler_op->peer_.assign(handler_op->peer_endpoint_.protocol(), - native_type(handler_op->new_socket_.get(), - handler_op->peer_endpoint_), - asio::assign_error(temp_error)); - if (temp_error) - last_error = temp_error.code(); - else - handler_op->new_socket_.release(); - } - - // Make a copy of the handler so that the memory can be deallocated before - // the upcall is made. - Handler handler(handler_op->handler_); - - // Free the memory associated with the handler. - ptr.reset(); - - // Call the handler. - asio::error error(last_error); - asio_handler_invoke_helpers::invoke( - detail::bind_handler(handler, error), &handler); - } - - static void destroy_impl(operation* op) - { - // Take ownership of the operation object. - typedef accept_endp_operation op_type; - op_type* handler_op(static_cast(op)); - typedef handler_alloc_traits alloc_traits; - handler_ptr ptr(handler_op->handler_, handler_op); - } - - win_iocp_io_service& io_service_; - socket_type socket_; - socket_holder new_socket_; - Socket& peer_; - protocol_type protocol_; - endpoint_type& peer_endpoint_; - asio::io_service::work work_; - unsigned char output_buffer_[(sizeof(sockaddr_storage_type) + 16) * 2]; - bool enable_connection_aborted_; - Handler handler_; - }; - - // Start an asynchronous accept. The peer and peer_endpoint objects - // must be valid until the accept's handler is invoked. - template - void async_accept_endpoint(implementation_type& impl, Socket& peer, - endpoint_type& peer_endpoint, Handler handler) - { - // Update the ID of the thread from which cancellation is safe. - if (impl.safe_cancellation_thread_id_ == 0) - impl.safe_cancellation_thread_id_ = ::GetCurrentThreadId(); - else - impl.safe_cancellation_thread_id_ = ~DWORD(0); - - // Check whether acceptor has been initialised. - if (impl.socket_ == invalid_socket) - { - asio::error error(asio::error::bad_descriptor); - io_service().post(bind_handler(handler, error)); - return; - } - - // Check that peer socket has not already been connected. - if (peer.native() != invalid_socket) - { - asio::error error(asio::error::already_connected); - io_service().post(bind_handler(handler, error)); - return; - } - - // Create a new socket for the connection. - socket_holder sock(socket_ops::socket(impl.protocol_.family(), - impl.protocol_.type(), impl.protocol_.protocol())); - if (sock.get() == invalid_socket) - { - asio::error error(socket_ops::get_error()); - io_service().post(bind_handler(handler, error)); - return; - } - - // Allocate and construct an operation to wrap the handler. - typedef accept_endp_operation value_type; - typedef handler_alloc_traits alloc_traits; - raw_handler_ptr raw_ptr(handler); - socket_type new_socket = sock.get(); - bool enable_connection_aborted = - (impl.flags_ & implementation_type::enable_connection_aborted); - handler_ptr ptr(raw_ptr, - iocp_service_, impl.socket_, new_socket, peer, impl.protocol_, - peer_endpoint, enable_connection_aborted, handler); - sock.release(); - - // Accept a connection. - DWORD bytes_read = 0; - BOOL result = ::AcceptEx(impl.socket_, ptr.get()->new_socket(), - ptr.get()->output_buffer(), 0, ptr.get()->address_length(), - ptr.get()->address_length(), &bytes_read, ptr.get()); - DWORD last_error = ::WSAGetLastError(); - - // Check if the operation completed immediately. - if (!result && last_error != WSA_IO_PENDING) - { - if (!enable_connection_aborted - && (last_error == ERROR_NETNAME_DELETED - || last_error == asio::error::connection_aborted)) - { - // Post handler so that operation will be restarted again. We do not - // perform the AcceptEx again here to avoid the possibility of starving - // other handlers. - iocp_service_.post_completion(ptr.get(), last_error, 0); - ptr.release(); - } - else - { - ptr.reset(); - asio::error error(last_error); - iocp_service_.post(bind_handler(handler, error)); - } - } - else - { - ptr.release(); - } - } - - // Connect the socket to the specified endpoint. - template - void connect(implementation_type& impl, const endpoint_type& peer_endpoint, - Error_Handler error_handler) - { - // Open the socket if it is not already open. - if (impl.socket_ == invalid_socket) - { - // Get the flags used to create the new socket. - int family = peer_endpoint.protocol().family(); - int type = peer_endpoint.protocol().type(); - int proto = peer_endpoint.protocol().protocol(); - - // Create a new socket. - impl.socket_ = socket_ops::socket(family, type, proto); - if (impl.socket_ == invalid_socket) - { - error_handler(asio::error(socket_ops::get_error())); - return; - } - iocp_service_.register_socket(impl.socket_); - } - - // Perform the connect operation. - int result = socket_ops::connect(impl.socket_, - peer_endpoint.data(), peer_endpoint.size()); - if (result == socket_error_retval) - error_handler(asio::error(socket_ops::get_error())); - else - error_handler(asio::error(0)); - } - - template - class connect_handler - { - public: - connect_handler(socket_type socket, - boost::shared_ptr completed, - asio::io_service& io_service, - reactor_type& reactor, Handler handler) - : socket_(socket), - completed_(completed), - io_service_(io_service), - reactor_(reactor), - work_(io_service), - handler_(handler) - { - } - - bool operator()(int result) - { - // Check whether a handler has already been called for the connection. - // If it has, then we don't want to do anything in this handler. - if (*completed_) - return true; - - // Cancel the other reactor operation for the connection. - *completed_ = true; - reactor_.enqueue_cancel_ops_unlocked(socket_); - - // Check whether the operation was successful. - if (result != 0) - { - asio::error error(result); - io_service_.post(bind_handler(handler_, error)); - return true; - } - - // Get the error code from the connect operation. - int connect_error = 0; - size_t connect_error_len = sizeof(connect_error); - if (socket_ops::getsockopt(socket_, SOL_SOCKET, SO_ERROR, - &connect_error, &connect_error_len) == socket_error_retval) - { - asio::error error(socket_ops::get_error()); - io_service_.post(bind_handler(handler_, error)); - return true; - } - - // If connection failed then post the handler with the error code. - if (connect_error) - { - asio::error error(connect_error); - io_service_.post(bind_handler(handler_, error)); - return true; - } - - // Make the socket blocking again (the default). - ioctl_arg_type non_blocking = 0; - if (socket_ops::ioctl(socket_, FIONBIO, &non_blocking)) - { - asio::error error(socket_ops::get_error()); - io_service_.post(bind_handler(handler_, error)); - return true; - } - - // Post the result of the successful connection operation. - asio::error error(asio::error::success); - io_service_.post(bind_handler(handler_, error)); - return true; - } - - private: - socket_type socket_; - boost::shared_ptr completed_; - asio::io_service& io_service_; - reactor_type& reactor_; - asio::io_service::work work_; - Handler handler_; - }; - - // Start an asynchronous connect. - template - void async_connect(implementation_type& impl, - const endpoint_type& peer_endpoint, Handler handler) - { - // Update the ID of the thread from which cancellation is safe. - if (impl.safe_cancellation_thread_id_ == 0) - impl.safe_cancellation_thread_id_ = ::GetCurrentThreadId(); - else - impl.safe_cancellation_thread_id_ = ~DWORD(0); - - // Check if the reactor was already obtained from the io_service. - reactor_type* reactor = static_cast( - interlocked_compare_exchange_pointer( - reinterpret_cast(&reactor_), 0, 0)); - if (!reactor) - { - reactor = &(asio::use_service(io_service())); - interlocked_exchange_pointer( - reinterpret_cast(&reactor_), reactor); - } - - // Open the socket if it is not already open. - if (impl.socket_ == invalid_socket) - { - // Get the flags used to create the new socket. - int family = peer_endpoint.protocol().family(); - int type = peer_endpoint.protocol().type(); - int proto = peer_endpoint.protocol().protocol(); - - // Create a new socket. - impl.socket_ = socket_ops::socket(family, type, proto); - if (impl.socket_ == invalid_socket) - { - asio::error error(socket_ops::get_error()); - io_service().post(bind_handler(handler, error)); - return; - } - iocp_service_.register_socket(impl.socket_); - } - - // Mark the socket as non-blocking so that the connection will take place - // asynchronously. - ioctl_arg_type non_blocking = 1; - if (socket_ops::ioctl(impl.socket_, FIONBIO, &non_blocking)) - { - asio::error error(socket_ops::get_error()); - io_service().post(bind_handler(handler, error)); - return; - } - - // Start the connect operation. - if (socket_ops::connect(impl.socket_, peer_endpoint.data(), - peer_endpoint.size()) == 0) - { - // The connect operation has finished successfully so we need to post the - // handler immediately. - asio::error error(asio::error::success); - io_service().post(bind_handler(handler, error)); - } - else if (socket_ops::get_error() == asio::error::in_progress - || socket_ops::get_error() == asio::error::would_block) - { - // The connection is happening in the background, and we need to wait - // until the socket becomes writeable. - boost::shared_ptr completed(new bool(false)); - reactor->start_write_and_except_ops(impl.socket_, - connect_handler( - impl.socket_, completed, io_service(), *reactor, handler)); - } - else - { - // The connect operation has failed, so post the handler immediately. - asio::error error(socket_ops::get_error()); - io_service().post(bind_handler(handler, error)); - } - } - -private: - // Helper function to provide InterlockedCompareExchangePointer functionality - // on very old Platform SDKs. - void* interlocked_compare_exchange_pointer(void** dest, void* exch, void* cmp) - { -#if defined(_WIN32_WINNT) && (_WIN32_WINNT <= 0x400) && (_M_IX86) - return reinterpret_cast(InterlockedCompareExchange( - reinterpret_cast(dest), reinterpret_cast(exch), - reinterpret_cast(cmp))); -#else - return InterlockedCompareExchangePointer(dest, exch, cmp); -#endif - } - - // Helper function to provide InterlockedExchangePointer functionality on very - // old Platform SDKs. - void* interlocked_exchange_pointer(void** dest, void* val) - { -#if defined(_WIN32_WINNT) && (_WIN32_WINNT <= 0x400) && (_M_IX86) - return reinterpret_cast(InterlockedExchange( - reinterpret_cast(dest), reinterpret_cast(val))); -#else - return InterlockedExchangePointer(dest, val); -#endif - } - - // The IOCP service used for running asynchronous operations and dispatching - // handlers. - win_iocp_io_service& iocp_service_; - - // The reactor used for performing connect operations. This object is created - // only if needed. - reactor_type* reactor_; - - // Mutex to protect access to the linked list of implementations. - asio::detail::mutex mutex_; - - // The head of a linked list of all implementations. - implementation_type* impl_list_; -}; - -} // namespace detail -} // namespace asio - -#endif // defined(ASIO_HAS_IOCP) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_WIN_IOCP_SOCKET_SERVICE_HPP diff --git a/libtorrent/include/asio/detail/win_local_free_on_block_exit.hpp b/libtorrent/include/asio/detail/win_local_free_on_block_exit.hpp deleted file mode 100644 index c909e1af3..000000000 --- a/libtorrent/include/asio/detail/win_local_free_on_block_exit.hpp +++ /dev/null @@ -1,59 +0,0 @@ -// -// win_local_free_on_block_exit.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_LOCAL_FREE_ON_BLOCK_EXIT_HPP -#define ASIO_DETAIL_WIN_LOCAL_FREE_ON_BLOCK_EXIT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) - -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/socket_types.hpp" - -namespace asio { -namespace detail { - -class win_local_free_on_block_exit - : private noncopyable -{ -public: - // Constructor blocks all signals for the calling thread. - explicit win_local_free_on_block_exit(void* p) - : p_(p) - { - } - - // Destructor restores the previous signal mask. - ~win_local_free_on_block_exit() - { - ::LocalFree(p_); - } - -private: - void* p_; -}; - -} // namespace detail -} // namespace asio - -#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_WIN_LOCAL_FREE_ON_BLOCK_EXIT_HPP diff --git a/libtorrent/include/asio/detail/win_mutex.hpp b/libtorrent/include/asio/detail/win_mutex.hpp deleted file mode 100644 index 9f3dd85c9..000000000 --- a/libtorrent/include/asio/detail/win_mutex.hpp +++ /dev/null @@ -1,142 +0,0 @@ -// -// win_mutex.hpp -// ~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_MUTEX_HPP -#define ASIO_DETAIL_WIN_MUTEX_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#if defined(BOOST_WINDOWS) - -#include "asio/system_exception.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/detail/scoped_lock.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -namespace asio { -namespace detail { - -class win_mutex - : private noncopyable -{ -public: - typedef asio::detail::scoped_lock scoped_lock; - - // Constructor. - win_mutex() - { - int error = do_init(); - if (error != 0) - { - system_exception e("mutex", error); - boost::throw_exception(e); - } - } - - // Destructor. - ~win_mutex() - { - ::DeleteCriticalSection(&crit_section_); - } - - // Lock the mutex. - void lock() - { - int error = do_lock(); - if (error != 0) - { - system_exception e("mutex", error); - boost::throw_exception(e); - } - } - - // Unlock the mutex. - void unlock() - { - ::LeaveCriticalSection(&crit_section_); - } - -private: - // Initialisation must be performed in a separate function to the constructor - // since the compiler does not support the use of structured exceptions and - // C++ exceptions in the same function. - int do_init() - { -#if defined(__MINGW32__) - // Not sure if MinGW supports structured exception handling, so for now - // we'll just call the Windows API and hope. - ::InitializeCriticalSection(&crit_section_); - return 0; -#else - __try - { - ::InitializeCriticalSection(&crit_section_); - } - __except(GetExceptionCode() == STATUS_NO_MEMORY - ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) - { - return ERROR_OUTOFMEMORY; - } - - return 0; -#endif - } - - // Locking must be performed in a separate function to lock() since the - // compiler does not support the use of structured exceptions and C++ - // exceptions in the same function. - int do_lock() - { -#if defined(__MINGW32__) - // Not sure if MinGW supports structured exception handling, so for now - // we'll just call the Windows API and hope. - ::EnterCriticalSection(&crit_section_); - return 0; -#else - __try - { - ::EnterCriticalSection(&crit_section_); - } - __except(GetExceptionCode() == STATUS_INVALID_HANDLE - || GetExceptionCode() == STATUS_NO_MEMORY - ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) - { - if (GetExceptionCode() == STATUS_NO_MEMORY) - return ERROR_OUTOFMEMORY; - return ERROR_INVALID_HANDLE; - } - - return 0; -#endif - } - - ::CRITICAL_SECTION crit_section_; -}; - -} // namespace detail -} // namespace asio - -#endif // defined(BOOST_WINDOWS) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_WIN_MUTEX_HPP diff --git a/libtorrent/include/asio/detail/win_signal_blocker.hpp b/libtorrent/include/asio/detail/win_signal_blocker.hpp deleted file mode 100644 index a1c2e992b..000000000 --- a/libtorrent/include/asio/detail/win_signal_blocker.hpp +++ /dev/null @@ -1,67 +0,0 @@ -// -// win_signal_blocker.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_SIGNAL_BLOCKER_HPP -#define ASIO_DETAIL_WIN_SIGNAL_BLOCKER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) - -#include "asio/detail/noncopyable.hpp" - -namespace asio { -namespace detail { - -class win_signal_blocker - : private noncopyable -{ -public: - // Constructor blocks all signals for the calling thread. - win_signal_blocker() - { - // No-op. - } - - // Destructor restores the previous signal mask. - ~win_signal_blocker() - { - // No-op. - } - - // Block all signals for the calling thread. - void block() - { - // No-op. - } - - // Restore the previous signal mask. - void unblock() - { - // No-op. - } -}; - -} // namespace detail -} // namespace asio - -#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_WIN_SIGNAL_BLOCKER_HPP diff --git a/libtorrent/include/asio/detail/win_thread.hpp b/libtorrent/include/asio/detail/win_thread.hpp deleted file mode 100644 index 4e6adb880..000000000 --- a/libtorrent/include/asio/detail/win_thread.hpp +++ /dev/null @@ -1,121 +0,0 @@ -// -// win_thread.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_THREAD_HPP -#define ASIO_DETAIL_WIN_THREAD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#if defined(BOOST_WINDOWS) - -#include "asio/system_exception.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/socket_types.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -namespace asio { -namespace detail { - -unsigned int __stdcall win_thread_function(void* arg); - -class win_thread - : private noncopyable -{ -public: - // Constructor. - template - win_thread(Function f) - { - std::auto_ptr arg(new func(f)); - unsigned int thread_id = 0; - thread_ = reinterpret_cast(::_beginthreadex(0, 0, - win_thread_function, arg.get(), 0, &thread_id)); - if (!thread_) - { - DWORD last_error = ::GetLastError(); - system_exception e("thread", last_error); - boost::throw_exception(e); - } - arg.release(); - } - - // Destructor. - ~win_thread() - { - ::CloseHandle(thread_); - } - - // Wait for the thread to exit. - void join() - { - ::WaitForSingleObject(thread_, INFINITE); - } - -private: - friend unsigned int __stdcall win_thread_function(void* arg); - - class func_base - { - public: - virtual ~func_base() {} - virtual void run() = 0; - }; - - template - class func - : public func_base - { - public: - func(Function f) - : f_(f) - { - } - - virtual void run() - { - f_(); - } - - private: - Function f_; - }; - - ::HANDLE thread_; -}; - -inline unsigned int __stdcall win_thread_function(void* arg) -{ - std::auto_ptr func( - static_cast(arg)); - func->run(); - return 0; -} - -} // namespace detail -} // namespace asio - -#endif // defined(BOOST_WINDOWS) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_WIN_THREAD_HPP diff --git a/libtorrent/include/asio/detail/win_tss_ptr.hpp b/libtorrent/include/asio/detail/win_tss_ptr.hpp deleted file mode 100644 index 5381094c5..000000000 --- a/libtorrent/include/asio/detail/win_tss_ptr.hpp +++ /dev/null @@ -1,85 +0,0 @@ -// -// win_tss_ptr.hpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WIN_TSS_PTR_HPP -#define ASIO_DETAIL_WIN_TSS_PTR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#if defined(BOOST_WINDOWS) - -#include "asio/system_exception.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/socket_types.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -namespace asio { -namespace detail { - -template -class win_tss_ptr - : private noncopyable -{ -public: - // Constructor. - win_tss_ptr() - { - tss_key_ = ::TlsAlloc(); - if (tss_key_ == TLS_OUT_OF_INDEXES) - { - DWORD last_error = ::GetLastError(); - system_exception e("tss", last_error); - boost::throw_exception(e); - } - } - - // Destructor. - ~win_tss_ptr() - { - ::TlsFree(tss_key_); - } - - // Get the value. - operator T*() const - { - return static_cast(::TlsGetValue(tss_key_)); - } - - // Set the value. - void operator=(T* value) - { - ::TlsSetValue(tss_key_, value); - } - -private: - // Thread-specific storage to allow unlocked access to determine whether a - // thread is a member of the pool. - DWORD tss_key_; -}; - -} // namespace detail -} // namespace asio - -#endif // defined(BOOST_WINDOWS) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_WIN_TSS_PTR_HPP diff --git a/libtorrent/include/asio/detail/winsock_init.hpp b/libtorrent/include/asio/detail/winsock_init.hpp deleted file mode 100644 index 7ae66d0e5..000000000 --- a/libtorrent/include/asio/detail/winsock_init.hpp +++ /dev/null @@ -1,116 +0,0 @@ -// -// winsock_init.hpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WINSOCK_INIT_HPP -#define ASIO_DETAIL_WINSOCK_INIT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) - -#include "asio/detail/push_options.hpp" -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/system_exception.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/socket_types.hpp" - -namespace asio { -namespace detail { - -template -class winsock_init - : private noncopyable -{ -private: - // Structure to perform the actual initialisation. - struct do_init - { - do_init() - { - WSADATA wsa_data; - result_ = ::WSAStartup(MAKEWORD(Major, Minor), &wsa_data); - } - - ~do_init() - { - ::WSACleanup(); - } - - int result() const - { - return result_; - } - - // Helper function to manage a do_init singleton. The static instance of the - // winsock_init object ensures that this function is always called before - // main, and therefore before any other threads can get started. The do_init - // instance must be static in this function to ensure that it gets - // initialised before any other global objects try to use it. - static boost::shared_ptr instance() - { - static boost::shared_ptr init(new do_init); - return init; - } - - private: - int result_; - }; - -public: - // Constructor. - winsock_init() - : ref_(do_init::instance()) - { - // Check whether winsock was successfully initialised. This check is not - // performed for the global instance since there will be nobody around to - // catch the exception. - if (this != &instance_ && ref_->result() != 0) - { - system_exception e("winsock", ref_->result()); - boost::throw_exception(e); - } - } - - // Destructor. - ~winsock_init() - { - } - -private: - // Instance to force initialisation of winsock at global scope. - static winsock_init instance_; - - // Reference to singleton do_init object to ensure that winsock does not get - // cleaned up until the last user has finished with it. - boost::shared_ptr ref_; -}; - -template -winsock_init winsock_init::instance_; - -} // namespace detail -} // namespace asio - -#endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__) - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_WINSOCK_INIT_HPP diff --git a/libtorrent/include/asio/detail/wrapped_handler.hpp b/libtorrent/include/asio/detail/wrapped_handler.hpp deleted file mode 100644 index e77b38dd8..000000000 --- a/libtorrent/include/asio/detail/wrapped_handler.hpp +++ /dev/null @@ -1,187 +0,0 @@ -// -// wrapped_handler.hpp -// ~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_DETAIL_WRAPPED_HANDLER_HPP -#define ASIO_DETAIL_WRAPPED_HANDLER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" - -namespace asio { -namespace detail { - -template -class wrapped_handler -{ -public: - typedef void result_type; - - wrapped_handler(Dispatcher& dispatcher, Handler handler) - : dispatcher_(dispatcher), - handler_(handler) - { - } - - void operator()() - { - dispatcher_.dispatch(handler_); - } - - void operator()() const - { - dispatcher_.dispatch(handler_); - } - - template - void operator()(const Arg1& arg1) - { - dispatcher_.dispatch(detail::bind_handler(handler_, arg1)); - } - - template - void operator()(const Arg1& arg1) const - { - dispatcher_.dispatch(detail::bind_handler(handler_, arg1)); - } - - template - void operator()(const Arg1& arg1, const Arg2& arg2) - { - dispatcher_.dispatch(detail::bind_handler(handler_, arg1, arg2)); - } - - template - void operator()(const Arg1& arg1, const Arg2& arg2) const - { - dispatcher_.dispatch(detail::bind_handler(handler_, arg1, arg2)); - } - - template - void operator()(const Arg1& arg1, const Arg2& arg2, const Arg3& arg3) - { - dispatcher_.dispatch(detail::bind_handler(handler_, arg1, arg2, arg3)); - } - - template - void operator()(const Arg1& arg1, const Arg2& arg2, const Arg3& arg3) const - { - dispatcher_.dispatch(detail::bind_handler(handler_, arg1, arg2, arg3)); - } - - template - void operator()(const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, - const Arg4& arg4) - { - dispatcher_.dispatch( - detail::bind_handler(handler_, arg1, arg2, arg3, arg4)); - } - - template - void operator()(const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, - const Arg4& arg4) const - { - dispatcher_.dispatch( - detail::bind_handler(handler_, arg1, arg2, arg3, arg4)); - } - - template - void operator()(const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, - const Arg4& arg4, const Arg5& arg5) - { - dispatcher_.dispatch( - detail::bind_handler(handler_, arg1, arg2, arg3, arg4, arg5)); - } - - template - void operator()(const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, - const Arg4& arg4, const Arg5& arg5) const - { - dispatcher_.dispatch( - detail::bind_handler(handler_, arg1, arg2, arg3, arg4, arg5)); - } - -//private: - Dispatcher& dispatcher_; - Handler handler_; -}; - -template -inline void* asio_handler_allocate(std::size_t size, - wrapped_handler* this_handler) -{ - return asio_handler_alloc_helpers::allocate( - size, &this_handler->handler_); -} - -template -inline void asio_handler_deallocate(void* pointer, std::size_t size, - wrapped_handler* this_handler) -{ - asio_handler_alloc_helpers::deallocate( - pointer, size, &this_handler->handler_); -} - -template -class rewrapped_handler -{ -public: - explicit rewrapped_handler(const Handler& handler, const Context& context) - : handler_(handler), - context_(context) - { - } - - void operator()() - { - handler_(); - } - - void operator()() const - { - handler_(); - } - -//private: - Handler handler_; - Context context_; -}; - -template -inline void asio_handler_invoke(const Function& function, - wrapped_handler* this_handler) -{ - this_handler->dispatcher_.dispatch( - rewrapped_handler( - function, this_handler->handler_)); -} - -template -inline void asio_handler_invoke(const Function& function, - rewrapped_handler* this_handler) -{ - asio_handler_invoke_helpers::invoke( - function, &this_handler->context_); -} - -} // namespace detail -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_DETAIL_WRAPPED_HANDLER_HPP diff --git a/libtorrent/include/asio/error.hpp b/libtorrent/include/asio/error.hpp deleted file mode 100644 index c52df6cd8..000000000 --- a/libtorrent/include/asio/error.hpp +++ /dev/null @@ -1,387 +0,0 @@ -// -// error.hpp -// ~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_ERROR_HPP -#define ASIO_ERROR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include -#include -#include -#include -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -# include -#endif // BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -#include "asio/detail/pop_options.hpp" - -#include "asio/detail/socket_types.hpp" -#include "asio/detail/win_local_free_on_block_exit.hpp" - -namespace asio { - -#if defined(GENERATING_DOCUMENTATION) -/// INTERNAL ONLY. -# define ASIO_SOCKET_ERROR(e) implementation_defined -/// INTERNAL ONLY. -# define ASIO_NETDB_ERROR(e) implementation_defined -/// INTERNAL ONLY. -# define ASIO_GETADDRINFO_ERROR(e) implementation_defined -/// INTERNAL ONLY. -# define ASIO_OS_ERROR(e_win, e_posix) implementation_defined -#elif defined(BOOST_WINDOWS) || defined(__CYGWIN__) -# define ASIO_SOCKET_ERROR(e) WSA ## e -# define ASIO_NETDB_ERROR(e) WSA ## e -# define ASIO_GETADDRINFO_ERROR(e) e -# define ASIO_OS_ERROR(e_win, e_posix) e_win -#else -# define ASIO_SOCKET_ERROR(e) e -# define ASIO_NETDB_ERROR(e) 16384 + e -# define ASIO_GETADDRINFO_ERROR(e) 32768 + e -# define ASIO_OS_ERROR(e_win, e_posix) e_posix -#endif - -/// The error class is used to encapsulate system error codes. -class error - : public std::exception -{ -public: - /// Error codes. - enum code_type - { - /// Permission denied. - access_denied = ASIO_SOCKET_ERROR(EACCES), - - /// Address family not supported by protocol. - address_family_not_supported = ASIO_SOCKET_ERROR(EAFNOSUPPORT), - - /// Address already in use. - address_in_use = ASIO_SOCKET_ERROR(EADDRINUSE), - - /// Transport endpoint is already connected. - already_connected = ASIO_SOCKET_ERROR(EISCONN), - - /// Operation already in progress. - already_started = ASIO_SOCKET_ERROR(EALREADY), - - /// A connection has been aborted. - connection_aborted = ASIO_SOCKET_ERROR(ECONNABORTED), - - /// Connection refused. - connection_refused = ASIO_SOCKET_ERROR(ECONNREFUSED), - - /// Connection reset by peer. - connection_reset = ASIO_SOCKET_ERROR(ECONNRESET), - - /// Bad file descriptor. - bad_descriptor = ASIO_SOCKET_ERROR(EBADF), - - /// End of file or stream. - eof = ASIO_OS_ERROR(ERROR_HANDLE_EOF, -1), - - /// Bad address. - fault = ASIO_SOCKET_ERROR(EFAULT), - - /// Host not found (authoritative). - host_not_found = ASIO_NETDB_ERROR(HOST_NOT_FOUND), - - /// Host not found (non-authoritative). - host_not_found_try_again = ASIO_NETDB_ERROR(TRY_AGAIN), - - /// No route to host. - host_unreachable = ASIO_SOCKET_ERROR(EHOSTUNREACH), - - /// Operation now in progress. - in_progress = ASIO_SOCKET_ERROR(EINPROGRESS), - - /// Interrupted system call. - interrupted = ASIO_SOCKET_ERROR(EINTR), - - /// Invalid argument. - invalid_argument = ASIO_SOCKET_ERROR(EINVAL), - - /// Message too long. - message_size = ASIO_SOCKET_ERROR(EMSGSIZE), - - /// Network is down. - network_down = ASIO_SOCKET_ERROR(ENETDOWN), - - /// Network dropped connection on reset. - network_reset = ASIO_SOCKET_ERROR(ENETRESET), - - /// Network is unreachable. - network_unreachable = ASIO_SOCKET_ERROR(ENETUNREACH), - - /// Too many open files. - no_descriptors = ASIO_SOCKET_ERROR(EMFILE), - - /// No buffer space available. - no_buffer_space = ASIO_SOCKET_ERROR(ENOBUFS), - - /// The query is valid but does not have associated address data. - no_data = ASIO_NETDB_ERROR(NO_DATA), - - /// Cannot allocate memory. - no_memory = ASIO_OS_ERROR(ERROR_OUTOFMEMORY, ENOMEM), - - /// Operation not permitted. - no_permission = ASIO_OS_ERROR(ERROR_ACCESS_DENIED, EPERM), - - /// Protocol not available. - no_protocol_option = ASIO_SOCKET_ERROR(ENOPROTOOPT), - - /// A non-recoverable error occurred. - no_recovery = ASIO_NETDB_ERROR(NO_RECOVERY), - - /// Transport endpoint is not connected. - not_connected = ASIO_SOCKET_ERROR(ENOTCONN), - - /// Socket operation on non-socket. - not_socket = ASIO_SOCKET_ERROR(ENOTSOCK), - - /// Operation not supported. - not_supported = ASIO_SOCKET_ERROR(EOPNOTSUPP), - - /// Operation cancelled. - operation_aborted = ASIO_OS_ERROR(ERROR_OPERATION_ABORTED, ECANCELED), - - /// The service is not supported for the given socket type. - service_not_found = ASIO_OS_ERROR( - WSATYPE_NOT_FOUND, - ASIO_GETADDRINFO_ERROR(EAI_SERVICE)), - - /// The socket type is not supported. - socket_type_not_supported = ASIO_OS_ERROR( - WSAESOCKTNOSUPPORT, - ASIO_GETADDRINFO_ERROR(EAI_SOCKTYPE)), - - /// Cannot send after transport endpoint shutdown. - shut_down = ASIO_SOCKET_ERROR(ESHUTDOWN), - - /// Success. - success = 0, - - /// Connection timed out. - timed_out = ASIO_SOCKET_ERROR(ETIMEDOUT), - - /// Resource temporarily unavailable. - try_again = ASIO_OS_ERROR(ERROR_RETRY, EAGAIN), - - /// The socket is marked non-blocking and the requested operation would - /// block. - would_block = ASIO_SOCKET_ERROR(EWOULDBLOCK) - }; - - /// Default constructor. - error() - : code_(success) - { - } - - /// Construct with a specific error code. - error(int code) - : code_(code) - { - } - - /// Copy constructor. - error(const error& e) - : std::exception(e), - code_(e.code_) - { - } - - /// Destructor. - virtual ~error() throw () - { - } - - /// Assignment operator. - error& operator=(const error& e) - { - code_ = e.code_; - what_.reset(); - return *this; - } - - /// Get a string representation of the exception. - virtual const char* what() const throw () - { -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) - try - { - if (!what_) - { - char* msg = 0; - DWORD length = ::FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER - | FORMAT_MESSAGE_FROM_SYSTEM - | FORMAT_MESSAGE_IGNORE_INSERTS, 0, code_, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (char*)&msg, 0, 0); - detail::win_local_free_on_block_exit local_free_obj(msg); - if (length && msg[length - 1] == '\n') - msg[--length] = '\0'; - if (length && msg[length - 1] == '\r') - msg[--length] = '\0'; - if (length) - what_.reset(new std::string(msg)); - else - return "asio error"; - } - return what_->c_str(); - } - catch (std::exception&) - { - return "asio error"; - } -#else // defined(BOOST_WINDOWS) - switch (code_) - { - case error::eof: - return "End of file."; - case error::host_not_found: - return "Host not found (authoritative)."; - case error::host_not_found_try_again: - return "Host not found (non-authoritative), try again later."; - case error::no_recovery: - return "A non-recoverable error occurred during database lookup."; - case error::no_data: - return "The query is valid, but it does not have associated data."; -#if !defined(__sun) - case error::operation_aborted: - return "Operation aborted."; -#endif // !defined(__sun) - case error::service_not_found: - return "Service not found."; - case error::socket_type_not_supported: - return "Socket type not supported."; - default: -#if defined(__sun) || defined(__QNX__) - return strerror(code_); -#elif defined(__MACH__) && defined(__APPLE__) \ - || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__) - try - { - char buf[256] = ""; - strerror_r(code_, buf, sizeof(buf)); - what_.reset(new std::string(buf)); - return what_->c_str(); - } - catch (std::exception&) - { - return "asio error"; - } -#else - try - { - char buf[256] = ""; - what_.reset(new std::string(strerror_r(code_, buf, sizeof(buf)))); - return what_->c_str(); - } - catch (std::exception&) - { - return "asio error"; - } -#endif - } -#endif // defined(BOOST_WINDOWS) - } - - /// Get the code associated with the error. - int code() const - { - return code_; - } - - struct unspecified_bool_type_t - { - }; - - typedef unspecified_bool_type_t* unspecified_bool_type; - - /// Operator returns non-null if there is a non-success error code. - operator unspecified_bool_type() const - { - if (code_ == success) - return 0; - else - return reinterpret_cast(1); - } - - /// Operator to test if the error represents success. - bool operator!() const - { - return code_ == success; - } - - /// Equality operator to compare two error objects. - friend bool operator==(const error& e1, const error& e2) - { - return e1.code_ == e2.code_; - } - - /// Inequality operator to compare two error objects. - friend bool operator!=(const error& e1, const error& e2) - { - return e1.code_ != e2.code_; - } - -private: - // The code associated with the error. - int code_; - - // The string representation of the error. - mutable boost::scoped_ptr what_; -}; - -/// Output the string associated with an error. -/** - * Used to output a human-readable string that is associated with an error. - * - * @param os The output stream to which the string will be written. - * - * @param e The error to be written. - * - * @return The output stream. - * - * @relates asio::error - */ -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -std::ostream& operator<<(std::ostream& os, const error& e) -{ - os << e.what(); - return os; -} -#else // BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -template -Ostream& operator<<(Ostream& os, const error& e) -{ - os << e.what(); - return os; -} -#endif // BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) - -} // namespace asio - -#undef ASIO_SOCKET_ERROR -#undef ASIO_NETDB_ERROR -#undef ASIO_GETADDRINFO_ERROR -#undef ASIO_OS_ERROR - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_ERROR_HPP diff --git a/libtorrent/include/asio/error_handler.hpp b/libtorrent/include/asio/error_handler.hpp deleted file mode 100644 index c315c8d5e..000000000 --- a/libtorrent/include/asio/error_handler.hpp +++ /dev/null @@ -1,120 +0,0 @@ -// -// error_handler.hpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_ERROR_HANDLER_HPP -#define ASIO_ERROR_HANDLER_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -namespace asio { - -namespace detail { - -class ignore_error_t -{ -public: - typedef void result_type; - - template - void operator()(const Error&) const - { - } -}; - -class throw_error_t -{ -public: - typedef void result_type; - - template - void operator()(const Error& err) const - { - if (err) - boost::throw_exception(err); - } -}; - -template -class assign_error_t -{ -public: - typedef void result_type; - - assign_error_t(Target& target) - : target_(&target) - { - } - - template - void operator()(const Error& err) const - { - *target_ = err; - } - -private: - Target* target_; -}; - -} // namespace detail - -/** - * @defgroup error_handler Error Handler Function Objects - * - * Function objects for custom error handling. - */ -/*@{*/ - -/// Return a function object that always ignores the error. -#if defined(GENERATING_DOCUMENTATION) -unspecified ignore_error(); -#else -inline detail::ignore_error_t ignore_error() -{ - return detail::ignore_error_t(); -} -#endif - -/// Return a function object that always throws the error. -#if defined(GENERATING_DOCUMENTATION) -unspecified throw_error(); -#else -inline detail::throw_error_t throw_error() -{ - return detail::throw_error_t(); -} -#endif - -/// Return a function object that assigns the error to a variable. -#if defined(GENERATING_DOCUMENTATION) -template -unspecified assign_error(Target& target); -#else -template -inline detail::assign_error_t assign_error(Target& target) -{ - return detail::assign_error_t(target); -} -#endif - -/*@}*/ - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_ERROR_HANDLER_HPP diff --git a/libtorrent/include/asio/handler_alloc_hook.hpp b/libtorrent/include/asio/handler_alloc_hook.hpp deleted file mode 100644 index d15c85061..000000000 --- a/libtorrent/include/asio/handler_alloc_hook.hpp +++ /dev/null @@ -1,88 +0,0 @@ -// -// handler_alloc_hook.hpp -// ~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_HANDLER_ALLOC_HOOK_HPP -#define ASIO_HANDLER_ALLOC_HOOK_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include "asio/detail/pop_options.hpp" - -namespace asio { - -/// Default allocation function for handlers. -/** - * Asynchronous operations may need to allocate temporary objects. Since - * asynchronous operations have a handler function object, these temporary - * objects can be said to be associated with the handler. - * - * Implement asio_handler_allocate and asio_handler_deallocate for your own - * handlers to provide custom allocation for these temporary objects. - * - * This default implementation is simply: - * @code - * return ::operator new(bytes); - * @endcode - * - * @note All temporary objects associated with a handler will be deallocated - * before the upcall to the handler is performed. This allows the same memory to - * be reused for a subsequent asynchronous operation initiated by the handler. - * - * @par Example: - * @code - * class my_handler; - * - * void* asio_handler_allocate(std::size_t size, my_handler* context) - * { - * return ::operator new(size); - * } - * - * void asio_handler_deallocate(void* pointer, std::size_t size, - * my_handler* context) - * { - * ::operator delete(pointer); - * } - * @endcode - */ -inline void* asio_handler_allocate(std::size_t size, ...) -{ - return ::operator new(size); -} - -/// Default deallocation function for handlers. -/** - * Implement asio_handler_allocate and asio_handler_deallocate for your own - * handlers to provide custom allocation for the associated temporary objects. - * - * This default implementation is simply: - * @code - * ::operator delete(pointer); - * @endcode - * - * @sa asio_handler_allocate. - */ -inline void asio_handler_deallocate(void* pointer, std::size_t size, ...) -{ - (void)(size); - return ::operator delete(pointer); -} - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_HANDLER_ALLOC_HOOK_HPP diff --git a/libtorrent/include/asio/handler_invoke_hook.hpp b/libtorrent/include/asio/handler_invoke_hook.hpp deleted file mode 100644 index 124b76e20..000000000 --- a/libtorrent/include/asio/handler_invoke_hook.hpp +++ /dev/null @@ -1,69 +0,0 @@ -// -// handler_invoke_hook.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_HANDLER_INVOKE_HOOK_HPP -#define ASIO_HANDLER_INVOKE_HOOK_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -namespace asio { - -/// Default invoke function for handlers. -/** - * Completion handlers for asynchronous operations are invoked by the - * io_service associated with the corresponding object (e.g. a socket or - * deadline_timer). Certain guarantees are made on when the handler may be - * invoked, in particular that a handler can only be invoked from a thread that - * is currently calling asio::io_service::run() on the corresponding - * io_service object. Handlers may subsequently be invoked through other - * objects (such as asio::strand objects) that provide additional - * guarantees. - * - * When asynchronous operations are composed from other asynchronous - * operations, all intermediate handlers should be invoked using the same - * method as the final handler. This is required to ensure that user-defined - * objects are not accessed in a way that may violate the guarantees. This - * hooking function ensures that the invoked method used for the final handler - * is accessible at each intermediate step. - * - * Implement asio_handler_invoke for your own handlers to specify a custom - * invocation strategy. - * - * This default implementation is simply: - * @code - * function(); - * @endcode - * - * @par Example: - * @code - * class my_handler; - * - * template - * void asio_handler_invoke(Function function, my_handler* context) - * { - * context->strand_.dispatch(function); - * } - * @endcode - */ -template -inline void asio_handler_invoke(Function function, ...) -{ - function(); -} - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_HANDLER_INVOKE_HOOK_HPP diff --git a/libtorrent/include/asio/impl/io_service.ipp b/libtorrent/include/asio/impl/io_service.ipp deleted file mode 100644 index 5e017831b..000000000 --- a/libtorrent/include/asio/impl/io_service.ipp +++ /dev/null @@ -1,150 +0,0 @@ -// -// io_service.ipp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IO_SERVICE_IPP -#define ASIO_IO_SERVICE_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/epoll_reactor.hpp" -#include "asio/detail/kqueue_reactor.hpp" -#include "asio/detail/select_reactor.hpp" -#include "asio/detail/task_io_service.hpp" -#include "asio/detail/win_iocp_io_service.hpp" - -namespace asio { - -inline io_service::io_service() - : service_registry_(*this), - impl_(service_registry_.use_service()) -{ -} - -inline size_t io_service::run() -{ - return impl_.run(); -} - -inline size_t io_service::run_one() -{ - return impl_.run_one(); -} - -inline size_t io_service::poll() -{ - return impl_.poll(); -} - -inline size_t io_service::poll_one() -{ - return impl_.poll_one(); -} - -inline void io_service::interrupt() -{ - impl_.interrupt(); -} - -inline void io_service::reset() -{ - impl_.reset(); -} - -template -inline void io_service::dispatch(Handler handler) -{ - impl_.dispatch(handler); -} - -template -inline void io_service::post(Handler handler) -{ - impl_.post(handler); -} - -template -#if defined(GENERATING_DOCUMENTATION) -unspecified -#else -inline detail::wrapped_handler -#endif -io_service::wrap(Handler handler) -{ - return detail::wrapped_handler(*this, handler); -} - -inline io_service::work::work(asio::io_service& io_service) - : io_service_(io_service) -{ - io_service_.impl_.work_started(); -} - -inline io_service::work::work(const work& other) - : io_service_(other.io_service_) -{ - io_service_.impl_.work_started(); -} - -inline io_service::work::~work() -{ - io_service_.impl_.work_finished(); -} - -inline asio::io_service& io_service::work::io_service() -{ - return io_service_; -} - -inline io_service::service::service(asio::io_service& owner) - : owner_(owner), - type_info_(0), - next_(0) -{ -} - -inline io_service::service::~service() -{ -} - -inline asio::io_service& io_service::service::io_service() -{ - return owner_; -} - -template -inline Service& use_service(io_service& ios) -{ - return ios.service_registry_.template use_service(); -} - -template -void add_service(io_service& ios, Service* svc) -{ - if (&ios != &svc->io_service()) - boost::throw_exception(invalid_service_owner()); - if (!ios.service_registry_.template add_service(svc)) - boost::throw_exception(service_already_exists()); -} - -template -bool has_service(io_service& ios) -{ - return ios.service_registry_.template has_service(); -} - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IO_SERVICE_IPP diff --git a/libtorrent/include/asio/impl/read.ipp b/libtorrent/include/asio/impl/read.ipp deleted file mode 100644 index dece26985..000000000 --- a/libtorrent/include/asio/impl/read.ipp +++ /dev/null @@ -1,294 +0,0 @@ -// -// read.ipp -// ~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_READ_IPP -#define ASIO_READ_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/buffer.hpp" -#include "asio/completion_condition.hpp" -#include "asio/error_handler.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/consuming_buffers.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" - -namespace asio { - -template -std::size_t read(Sync_Read_Stream& s, const Mutable_Buffers& buffers, - Completion_Condition completion_condition, Error_Handler error_handler) -{ - asio::detail::consuming_buffers< - mutable_buffer, Mutable_Buffers> tmp(buffers); - std::size_t total_transferred = 0; - while (tmp.begin() != tmp.end()) - { - typename Sync_Read_Stream::error_type e; - std::size_t bytes_transferred = s.read_some(tmp, assign_error(e)); - tmp.consume(bytes_transferred); - total_transferred += bytes_transferred; - if (completion_condition(e, total_transferred)) - { - error_handler(e); - return total_transferred; - } - } - typename Sync_Read_Stream::error_type e; - error_handler(e); - return total_transferred; -} - -template -inline std::size_t read(Sync_Read_Stream& s, const Mutable_Buffers& buffers) -{ - return read(s, buffers, transfer_all(), throw_error()); -} - -template -inline std::size_t read(Sync_Read_Stream& s, const Mutable_Buffers& buffers, - Completion_Condition completion_condition) -{ - return read(s, buffers, completion_condition, throw_error()); -} - -template -std::size_t read(Sync_Read_Stream& s, - asio::basic_streambuf& b, - Completion_Condition completion_condition, Error_Handler error_handler) -{ - std::size_t total_transferred = 0; - for (;;) - { - typename Sync_Read_Stream::error_type e; - std::size_t bytes_transferred = s.read_some( - b.prepare(512), assign_error(e)); - b.commit(bytes_transferred); - total_transferred += bytes_transferred; - if (completion_condition(e, total_transferred)) - { - error_handler(e); - return total_transferred; - } - } -} - -template -inline std::size_t read(Sync_Read_Stream& s, - asio::basic_streambuf& b) -{ - return read(s, b, transfer_all(), throw_error()); -} - -template -inline std::size_t read(Sync_Read_Stream& s, - asio::basic_streambuf& b, - Completion_Condition completion_condition) -{ - return read(s, b, completion_condition, throw_error()); -} - -namespace detail -{ - template - class read_handler - { - public: - read_handler(Async_Read_Stream& stream, const Mutable_Buffers& buffers, - Completion_Condition completion_condition, Handler handler) - : stream_(stream), - buffers_(buffers), - total_transferred_(0), - completion_condition_(completion_condition), - handler_(handler) - { - } - - void operator()(const typename Async_Read_Stream::error_type& e, - std::size_t bytes_transferred) - { - total_transferred_ += bytes_transferred; - buffers_.consume(bytes_transferred); - if (completion_condition_(e, total_transferred_) - || buffers_.begin() == buffers_.end()) - { - handler_(e, total_transferred_); - } - else - { - stream_.async_read_some(buffers_, *this); - } - } - - //private: - Async_Read_Stream& stream_; - asio::detail::consuming_buffers< - mutable_buffer, Mutable_Buffers> buffers_; - std::size_t total_transferred_; - Completion_Condition completion_condition_; - Handler handler_; - }; - - template - inline void* asio_handler_allocate(std::size_t size, - read_handler* this_handler) - { - return asio_handler_alloc_helpers::allocate( - size, &this_handler->handler_); - } - - template - inline void asio_handler_deallocate(void* pointer, std::size_t size, - read_handler* this_handler) - { - asio_handler_alloc_helpers::deallocate( - pointer, size, &this_handler->handler_); - } - - template - inline void asio_handler_invoke(const Function& function, - read_handler* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, &this_handler->handler_); - } -} // namespace detail - -template -inline void async_read(Async_Read_Stream& s, const Mutable_Buffers& buffers, - Completion_Condition completion_condition, Handler handler) -{ - s.async_read_some(buffers, - detail::read_handler( - s, buffers, completion_condition, handler)); -} - -template -inline void async_read(Async_Read_Stream& s, const Mutable_Buffers& buffers, - Handler handler) -{ - async_read(s, buffers, transfer_all(), handler); -} - -namespace detail -{ - template - class read_streambuf_handler - { - public: - read_streambuf_handler(Async_Read_Stream& stream, - basic_streambuf& streambuf, - Completion_Condition completion_condition, Handler handler) - : stream_(stream), - streambuf_(streambuf), - total_transferred_(0), - completion_condition_(completion_condition), - handler_(handler) - { - } - - void operator()(const typename Async_Read_Stream::error_type& e, - std::size_t bytes_transferred) - { - total_transferred_ += bytes_transferred; - streambuf_.commit(bytes_transferred); - if (completion_condition_(e, total_transferred_)) - { - handler_(e, total_transferred_); - } - else - { - stream_.async_read_some(streambuf_.prepare(512), *this); - } - } - - //private: - Async_Read_Stream& stream_; - asio::basic_streambuf& streambuf_; - std::size_t total_transferred_; - Completion_Condition completion_condition_; - Handler handler_; - }; - - template - inline void* asio_handler_allocate(std::size_t size, - read_streambuf_handler* this_handler) - { - return asio_handler_alloc_helpers::allocate( - size, &this_handler->handler_); - } - - template - inline void asio_handler_deallocate(void* pointer, std::size_t size, - read_streambuf_handler* this_handler) - { - asio_handler_alloc_helpers::deallocate( - pointer, size, &this_handler->handler_); - } - - template - inline void asio_handler_invoke(const Function& function, - read_streambuf_handler* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, &this_handler->handler_); - } -} // namespace detail - -template -inline void async_read(Async_Read_Stream& s, - asio::basic_streambuf& b, - Completion_Condition completion_condition, Handler handler) -{ - s.async_read_some(b.prepare(512), - detail::read_streambuf_handler( - s, b, completion_condition, handler)); -} - -template -inline void async_read(Async_Read_Stream& s, - asio::basic_streambuf& b, Handler handler) -{ - async_read(s, b, transfer_all(), handler); -} - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_READ_IPP diff --git a/libtorrent/include/asio/impl/read_until.ipp b/libtorrent/include/asio/impl/read_until.ipp deleted file mode 100644 index accb8d955..000000000 --- a/libtorrent/include/asio/impl/read_until.ipp +++ /dev/null @@ -1,664 +0,0 @@ -// -// read_until.ipp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_READ_UNTIL_IPP -#define ASIO_READ_UNTIL_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/buffer.hpp" -#include "asio/error_handler.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/const_buffers_iterator.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" - -namespace asio { - -template -inline std::size_t read_until(Sync_Read_Stream& s, - asio::basic_streambuf& b, char delim) -{ - return read_until(s, b, delim, throw_error()); -} - -template -std::size_t read_until(Sync_Read_Stream& s, - asio::basic_streambuf& b, char delim, - Error_Handler error_handler) -{ - std::size_t next_search_start = 0; - for (;;) - { - // Determine the range of the data to be searched. - typedef typename asio::basic_streambuf< - Allocator>::const_buffers_type const_buffers_type; - typedef asio::detail::const_buffers_iterator< - const_buffers_type> iterator; - const_buffers_type buffers = b.data(); - iterator begin(buffers, next_search_start); - iterator end(buffers, (std::numeric_limits::max)()); - - // Look for a match. - iterator iter = std::find(begin, end, delim); - if (iter != end) - { - // Found a match. We're done. - return iter.position() + 1; - } - else - { - // No match. Next search can start with the new data. - next_search_start = end.position(); - } - - // Need more data. - typename Sync_Read_Stream::error_type error; - b.commit(s.read_some(b.prepare(512), asio::assign_error(error))); - if (error) - { - error_handler(error); - return 0; - } - } -} - -template -inline std::size_t read_until(Sync_Read_Stream& s, - asio::basic_streambuf& b, const std::string& delim) -{ - return read_until(s, b, delim, throw_error()); -} - -namespace detail -{ - // Algorithm that finds a subsequence of equal values in a sequence. Returns - // (iterator,true) if a full match was found, in which case the iterator - // points to the beginning of the match. Returns (iterator,false) if a - // partial match was found at the end of the first sequence, in which case - // the iterator points to the beginning of the partial match. Returns - // (last1,false) if no full or partial match was found. - template - std::pair partial_search( - Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2) - { - for (Iterator1 iter1 = first1; iter1 != last1; ++iter1) - { - Iterator1 test_iter1 = iter1; - Iterator2 test_iter2 = first2; - for (;; ++test_iter1, ++test_iter2) - { - if (test_iter2 == last2) - return std::make_pair(iter1, true); - if (test_iter1 == last1) - { - if (test_iter2 != first2) - return std::make_pair(iter1, false); - else - break; - } - if (*test_iter1 != *test_iter2) - break; - } - } - return std::make_pair(last1, false); - } -} // namespace detail - -template -std::size_t read_until(Sync_Read_Stream& s, - asio::basic_streambuf& b, const std::string& delim, - Error_Handler error_handler) -{ - std::size_t next_search_start = 0; - for (;;) - { - // Determine the range of the data to be searched. - typedef typename asio::basic_streambuf< - Allocator>::const_buffers_type const_buffers_type; - typedef asio::detail::const_buffers_iterator< - const_buffers_type> iterator; - const_buffers_type buffers = b.data(); - iterator begin(buffers, next_search_start); - iterator end(buffers, (std::numeric_limits::max)()); - - // Look for a match. - std::pair result = asio::detail::partial_search( - begin, end, delim.begin(), delim.end()); - if (result.first != end) - { - if (result.second) - { - // Full match. We're done. - return result.first.position() + delim.length(); - } - else - { - // Partial match. Next search needs to start from beginning of match. - next_search_start = result.first.position(); - } - } - else - { - // No match. Next search can start with the new data. - next_search_start = end.position(); - } - - // Need more data. - typename Sync_Read_Stream::error_type error; - b.commit(s.read_some(b.prepare(512), asio::assign_error(error))); - if (error) - { - error_handler(error); - return 0; - } - } -} - -template -inline std::size_t read_until(Sync_Read_Stream& s, - asio::basic_streambuf& b, const boost::regex& expr) -{ - return read_until(s, b, expr, throw_error()); -} - -template -std::size_t read_until(Sync_Read_Stream& s, - asio::basic_streambuf& b, const boost::regex& expr, - Error_Handler error_handler) -{ - std::size_t next_search_start = 0; - for (;;) - { - // Determine the range of the data to be searched. - typedef typename asio::basic_streambuf< - Allocator>::const_buffers_type const_buffers_type; - typedef asio::detail::const_buffers_iterator< - const_buffers_type> iterator; - const_buffers_type buffers = b.data(); - iterator begin(buffers, next_search_start); - iterator end(buffers, (std::numeric_limits::max)()); - - // Look for a match. - boost::match_results match_results; - if (boost::regex_search(begin, end, match_results, expr, - boost::match_default | boost::match_partial)) - { - if (match_results[0].matched) - { - // Full match. We're done. - return match_results[0].second.position(); - } - else - { - // Partial match. Next search needs to start from beginning of match. - next_search_start = match_results[0].first.position(); - } - } - else - { - // No match. Next search can start with the new data. - next_search_start = end.position(); - } - - // Need more data. - typename Sync_Read_Stream::error_type error; - b.commit(s.read_some(b.prepare(512), asio::assign_error(error))); - if (error) - { - error_handler(error); - return 0; - } - } -} - -namespace detail -{ - template - class read_until_delim_handler - { - public: - read_until_delim_handler(Async_Read_Stream& stream, - asio::basic_streambuf& streambuf, char delim, - std::size_t next_search_start, Handler handler) - : stream_(stream), - streambuf_(streambuf), - delim_(delim), - next_search_start_(next_search_start), - handler_(handler) - { - } - - void operator()(const typename Async_Read_Stream::error_type& e, - std::size_t bytes_transferred) - { - // Check for errors. - if (e) - { - std::size_t bytes = 0; - handler_(e, bytes); - return; - } - - // Commit received data to streambuf's get area. - streambuf_.commit(bytes_transferred); - - // Determine the range of the data to be searched. - typedef typename asio::basic_streambuf< - Allocator>::const_buffers_type const_buffers_type; - typedef asio::detail::const_buffers_iterator< - const_buffers_type> iterator; - const_buffers_type buffers = streambuf_.data(); - iterator begin(buffers, next_search_start_); - iterator end(buffers, (std::numeric_limits::max)()); - - // Look for a match. - iterator iter = std::find(begin, end, delim_); - if (iter != end) - { - // Found a match. We're done. - std::size_t bytes = iter.position() + 1; - handler_(e, bytes); - return; - } - - // No match. Start a new asynchronous read operation to obtain more data. - next_search_start_ = end.position(); - stream_.async_read_some(streambuf_.prepare(512), *this); - } - - //private: - Async_Read_Stream& stream_; - asio::basic_streambuf& streambuf_; - char delim_; - std::size_t next_search_start_; - Handler handler_; - }; - - template - inline void* asio_handler_allocate(std::size_t size, - read_until_delim_handler* this_handler) - { - return asio_handler_alloc_helpers::allocate( - size, &this_handler->handler_); - } - - template - inline void asio_handler_deallocate(void* pointer, std::size_t size, - read_until_delim_handler* this_handler) - { - asio_handler_alloc_helpers::deallocate( - pointer, size, &this_handler->handler_); - } - - template - inline void asio_handler_invoke(const Function& function, - read_until_delim_handler* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, &this_handler->handler_); - } -} // namespace detail - -template -void async_read_until(Async_Read_Stream& s, - asio::basic_streambuf& b, char delim, Handler handler) -{ - // Determine the range of the data to be searched. - typedef typename asio::basic_streambuf< - Allocator>::const_buffers_type const_buffers_type; - typedef asio::detail::const_buffers_iterator< - const_buffers_type> iterator; - const_buffers_type buffers = b.data(); - iterator begin(buffers, 0); - iterator end(buffers, (std::numeric_limits::max)()); - - // Look for a match. - iterator iter = std::find(begin, end, delim); - if (iter != end) - { - // Found a match. We're done. - typename Async_Read_Stream::error_type error; - std::size_t bytes = iter.position() + 1; - s.io_service().post(detail::bind_handler(handler, error, bytes)); - return; - } - - // No match. Start a new asynchronous read operation to obtain more data. - s.async_read_some(b.prepare(512), - detail::read_until_delim_handler( - s, b, delim, end.position(), handler)); -} - -namespace detail -{ - template - class read_until_delim_string_handler - { - public: - read_until_delim_string_handler(Async_Read_Stream& stream, - asio::basic_streambuf& streambuf, - const std::string& delim, std::size_t next_search_start, - Handler handler) - : stream_(stream), - streambuf_(streambuf), - delim_(delim), - next_search_start_(next_search_start), - handler_(handler) - { - } - - void operator()(const typename Async_Read_Stream::error_type& e, - std::size_t bytes_transferred) - { - // Check for errors. - if (e) - { - std::size_t bytes = 0; - handler_(e, bytes); - return; - } - - // Commit received data to streambuf's get area. - streambuf_.commit(bytes_transferred); - - // Determine the range of the data to be searched. - typedef typename asio::basic_streambuf< - Allocator>::const_buffers_type const_buffers_type; - typedef asio::detail::const_buffers_iterator< - const_buffers_type> iterator; - const_buffers_type buffers = streambuf_.data(); - iterator begin(buffers, next_search_start_); - iterator end(buffers, (std::numeric_limits::max)()); - - // Look for a match. - std::pair result = asio::detail::partial_search( - begin, end, delim_.begin(), delim_.end()); - if (result.first != end) - { - if (result.second) - { - // Full match. We're done. - std::size_t bytes = result.first.position() + delim_.length(); - handler_(e, bytes); - return; - } - else - { - // Partial match. Next search needs to start from beginning of match. - next_search_start_ = result.first.position(); - } - } - else - { - // No match. Next search can start with the new data. - next_search_start_ = end.position(); - } - - // No match. Start a new asynchronous read operation to obtain more data. - stream_.async_read_some(streambuf_.prepare(512), *this); - } - - //private: - Async_Read_Stream& stream_; - asio::basic_streambuf& streambuf_; - std::string delim_; - std::size_t next_search_start_; - Handler handler_; - }; - - template - inline void* asio_handler_allocate(std::size_t size, - read_until_delim_string_handler* this_handler) - { - return asio_handler_alloc_helpers::allocate( - size, &this_handler->handler_); - } - - template - inline void asio_handler_deallocate(void* pointer, std::size_t size, - read_until_delim_string_handler* this_handler) - { - asio_handler_alloc_helpers::deallocate( - pointer, size, &this_handler->handler_); - } - - template - inline void asio_handler_invoke(const Function& function, - read_until_delim_string_handler* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, &this_handler->handler_); - } -} // namespace detail - -template -void async_read_until(Async_Read_Stream& s, - asio::basic_streambuf& b, const std::string& delim, - Handler handler) -{ - // Determine the range of the data to be searched. - typedef typename asio::basic_streambuf< - Allocator>::const_buffers_type const_buffers_type; - typedef asio::detail::const_buffers_iterator< - const_buffers_type> iterator; - const_buffers_type buffers = b.data(); - iterator begin(buffers, 0); - iterator end(buffers, (std::numeric_limits::max)()); - - // Look for a match. - std::size_t next_search_start; - std::pair result = asio::detail::partial_search( - begin, end, delim.begin(), delim.end()); - if (result.first != end) - { - if (result.second) - { - // Full match. We're done. - typename Async_Read_Stream::error_type error; - std::size_t bytes = result.first.position() + delim.length(); - s.io_service().post(detail::bind_handler(handler, error, bytes)); - return; - } - else - { - // Partial match. Next search needs to start from beginning of match. - next_search_start = result.first.position(); - } - } - else - { - // No match. Next search can start with the new data. - next_search_start = end.position(); - } - - // No match. Start a new asynchronous read operation to obtain more data. - s.async_read_some(b.prepare(512), - detail::read_until_delim_string_handler< - Async_Read_Stream, Allocator, Handler>( - s, b, delim, next_search_start, handler)); -} - -namespace detail -{ - template - class read_until_expr_handler - { - public: - read_until_expr_handler(Async_Read_Stream& stream, - asio::basic_streambuf& streambuf, - const boost::regex& expr, std::size_t next_search_start, - Handler handler) - : stream_(stream), - streambuf_(streambuf), - expr_(expr), - next_search_start_(next_search_start), - handler_(handler) - { - } - - void operator()(const typename Async_Read_Stream::error_type& e, - std::size_t bytes_transferred) - { - // Check for errors. - if (e) - { - std::size_t bytes = 0; - handler_(e, bytes); - return; - } - - // Commit received data to streambuf's get area. - streambuf_.commit(bytes_transferred); - - // Determine the range of the data to be searched. - typedef typename asio::basic_streambuf< - Allocator>::const_buffers_type const_buffers_type; - typedef asio::detail::const_buffers_iterator< - const_buffers_type> iterator; - const_buffers_type buffers = streambuf_.data(); - iterator begin(buffers, next_search_start_); - iterator end(buffers, (std::numeric_limits::max)()); - - // Look for a match. - boost::match_results match_results; - if (boost::regex_search(begin, end, match_results, expr_, - boost::match_default | boost::match_partial)) - { - if (match_results[0].matched) - { - // Full match. We're done. - std::size_t bytes = match_results[0].second.position(); - handler_(e, bytes); - return; - } - else - { - // Partial match. Next search needs to start from beginning of match. - next_search_start_ = match_results[0].first.position(); - } - } - else - { - // No match. Next search can start with the new data. - next_search_start_ = end.position(); - } - - // No match. Start a new asynchronous read operation to obtain more data. - stream_.async_read_some(streambuf_.prepare(512), *this); - } - - //private: - Async_Read_Stream& stream_; - asio::basic_streambuf& streambuf_; - boost::regex expr_; - std::size_t next_search_start_; - Handler handler_; - }; - - template - inline void* asio_handler_allocate(std::size_t size, - read_until_expr_handler* this_handler) - { - return asio_handler_alloc_helpers::allocate( - size, &this_handler->handler_); - } - - template - inline void asio_handler_deallocate(void* pointer, std::size_t size, - read_until_expr_handler* this_handler) - { - asio_handler_alloc_helpers::deallocate( - pointer, size, &this_handler->handler_); - } - - template - inline void asio_handler_invoke(const Function& function, - read_until_expr_handler* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, &this_handler->handler_); - } -} // namespace detail - -template -void async_read_until(Async_Read_Stream& s, - asio::basic_streambuf& b, const boost::regex& expr, - Handler handler) -{ - // Determine the range of the data to be searched. - typedef typename asio::basic_streambuf< - Allocator>::const_buffers_type const_buffers_type; - typedef asio::detail::const_buffers_iterator< - const_buffers_type> iterator; - const_buffers_type buffers = b.data(); - iterator begin(buffers, 0); - iterator end(buffers, (std::numeric_limits::max)()); - - // Look for a match. - std::size_t next_search_start; - boost::match_results match_results; - if (boost::regex_search(begin, end, match_results, expr, - boost::match_default | boost::match_partial)) - { - if (match_results[0].matched) - { - // Full match. We're done. - typename Async_Read_Stream::error_type error; - std::size_t bytes = match_results[0].second.position(); - s.io_service().post(detail::bind_handler(handler, error, bytes)); - return; - } - else - { - // Partial match. Next search needs to start from beginning of match. - next_search_start = match_results[0].first.position(); - } - } - else - { - // No match. Next search can start with the new data. - next_search_start = end.position(); - } - - // No match. Start a new asynchronous read operation to obtain more data. - s.async_read_some(b.prepare(512), - detail::read_until_expr_handler( - s, b, expr, next_search_start, handler)); -} - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_READ_UNTIL_IPP diff --git a/libtorrent/include/asio/impl/write.ipp b/libtorrent/include/asio/impl/write.ipp deleted file mode 100644 index 88b14b239..000000000 --- a/libtorrent/include/asio/impl/write.ipp +++ /dev/null @@ -1,266 +0,0 @@ -// -// write.ipp -// ~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_WRITE_IPP -#define ASIO_WRITE_IPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/buffer.hpp" -#include "asio/completion_condition.hpp" -#include "asio/error_handler.hpp" -#include "asio/detail/bind_handler.hpp" -#include "asio/detail/consuming_buffers.hpp" -#include "asio/detail/handler_alloc_helpers.hpp" -#include "asio/detail/handler_invoke_helpers.hpp" - -namespace asio { - -template -std::size_t write(Sync_Write_Stream& s, const Const_Buffers& buffers, - Completion_Condition completion_condition, Error_Handler error_handler) -{ - asio::detail::consuming_buffers< - const_buffer, Const_Buffers> tmp(buffers); - std::size_t total_transferred = 0; - while (tmp.begin() != tmp.end()) - { - typename Sync_Write_Stream::error_type e; - std::size_t bytes_transferred = s.write_some(tmp, assign_error(e)); - tmp.consume(bytes_transferred); - total_transferred += bytes_transferred; - if (completion_condition(e, total_transferred)) - { - error_handler(e); - return total_transferred; - } - } - typename Sync_Write_Stream::error_type e; - error_handler(e); - return total_transferred; -} - -template -inline std::size_t write(Sync_Write_Stream& s, const Const_Buffers& buffers) -{ - return write(s, buffers, transfer_all(), throw_error()); -} - -template -inline std::size_t write(Sync_Write_Stream& s, const Const_Buffers& buffers, - Completion_Condition completion_condition) -{ - return write(s, buffers, completion_condition, throw_error()); -} - -template -std::size_t write(Sync_Write_Stream& s, - asio::basic_streambuf& b, - Completion_Condition completion_condition, Error_Handler error_handler) -{ - typename Sync_Write_Stream::error_type error; - std::size_t bytes_transferred = write(s, b.data(), - completion_condition, asio::assign_error(error)); - b.consume(bytes_transferred); - error_handler(error); - return bytes_transferred; -} - -template -inline std::size_t write(Sync_Write_Stream& s, - asio::basic_streambuf& b) -{ - return write(s, b, transfer_all(), throw_error()); -} - -template -inline std::size_t write(Sync_Write_Stream& s, - asio::basic_streambuf& b, - Completion_Condition completion_condition) -{ - return write(s, b, completion_condition, throw_error()); -} - -namespace detail -{ - template - class write_handler - { - public: - write_handler(Async_Write_Stream& stream, const Const_Buffers& buffers, - Completion_Condition completion_condition, Handler handler) - : stream_(stream), - buffers_(buffers), - total_transferred_(0), - completion_condition_(completion_condition), - handler_(handler) - { - } - - void operator()(const typename Async_Write_Stream::error_type& e, - std::size_t bytes_transferred) - { - total_transferred_ += bytes_transferred; - buffers_.consume(bytes_transferred); - if (completion_condition_(e, total_transferred_) - || buffers_.begin() == buffers_.end()) - { - handler_(e, total_transferred_); - } - else - { - stream_.async_write_some(buffers_, *this); - } - } - - //private: - Async_Write_Stream& stream_; - asio::detail::consuming_buffers< - const_buffer, Const_Buffers> buffers_; - std::size_t total_transferred_; - Completion_Condition completion_condition_; - Handler handler_; - }; - - template - inline void* asio_handler_allocate(std::size_t size, - write_handler* this_handler) - { - return asio_handler_alloc_helpers::allocate( - size, &this_handler->handler_); - } - - template - inline void asio_handler_deallocate(void* pointer, std::size_t size, - write_handler* this_handler) - { - asio_handler_alloc_helpers::deallocate( - pointer, size, &this_handler->handler_); - } - - template - inline void asio_handler_invoke(const Function& function, - write_handler* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, &this_handler->handler_); - } -} // namespace detail - -template -inline void async_write(Async_Write_Stream& s, const Const_Buffers& buffers, - Completion_Condition completion_condition, Handler handler) -{ - s.async_write_some(buffers, - detail::write_handler( - s, buffers, completion_condition, handler)); -} - -template -inline void async_write(Async_Write_Stream& s, const Const_Buffers& buffers, - Handler handler) -{ - async_write(s, buffers, transfer_all(), handler); -} - -namespace detail -{ - template - class write_streambuf_handler - { - public: - write_streambuf_handler(asio::basic_streambuf& streambuf, - Handler handler) - : streambuf_(streambuf), - handler_(handler) - { - } - - void operator()(const typename Async_Write_Stream::error_type& e, - std::size_t bytes_transferred) - { - streambuf_.consume(bytes_transferred); - handler_(e, bytes_transferred); - } - - //private: - asio::basic_streambuf& streambuf_; - Handler handler_; - }; - - template - inline void* asio_handler_allocate(std::size_t size, - write_streambuf_handler* this_handler) - { - return asio_handler_alloc_helpers::allocate( - size, &this_handler->handler_); - } - - template - inline void asio_handler_deallocate(void* pointer, std::size_t size, - write_streambuf_handler* this_handler) - { - asio_handler_alloc_helpers::deallocate( - pointer, size, &this_handler->handler_); - } - - template - inline void asio_handler_invoke(const Function& function, - write_streambuf_handler* this_handler) - { - asio_handler_invoke_helpers::invoke( - function, &this_handler->handler_); - } -} // namespace detail - -template -inline void async_write(Async_Write_Stream& s, - asio::basic_streambuf& b, - Completion_Condition completion_condition, Handler handler) -{ - async_write(s, b.data(), completion_condition, - detail::write_streambuf_handler( - b, handler)); -} - -template -inline void async_write(Async_Write_Stream& s, - asio::basic_streambuf& b, Handler handler) -{ - async_write(s, b, transfer_all(), handler); -} - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_WRITE_IPP diff --git a/libtorrent/include/asio/io_service.hpp b/libtorrent/include/asio/io_service.hpp deleted file mode 100644 index 6808f3d45..000000000 --- a/libtorrent/include/asio/io_service.hpp +++ /dev/null @@ -1,424 +0,0 @@ -// -// io_service.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IO_SERVICE_HPP -#define ASIO_IO_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/detail/epoll_reactor_fwd.hpp" -#include "asio/detail/kqueue_reactor_fwd.hpp" -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/select_reactor_fwd.hpp" -#include "asio/detail/service_registry.hpp" -#include "asio/detail/signal_init.hpp" -#include "asio/detail/task_io_service_fwd.hpp" -#include "asio/detail/win_iocp_io_service_fwd.hpp" -#include "asio/detail/winsock_init.hpp" -#include "asio/detail/wrapped_handler.hpp" - -namespace asio { - -/// Provides core I/O functionality. -/** - * The io_service class provides the core I/O functionality for users of the - * asynchronous I/O objects, including: - * - * @li asio::ip::tcp::socket - * @li asio::ip::tcp::acceptor - * @li asio::ip::udp::socket - * @li asio::deadline_timer. - * - * The io_service class also includes facilities intended for developers of - * custom asynchronous services. - * - * @par Thread Safety: - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Safe, with the exception that calling reset() - * while there are unfinished run() calls results in undefined behaviour. - * - * @par Concepts: - * Dispatcher. - * - * @sa @ref io_service_handler_exception - */ -class io_service - : private noncopyable -{ -private: - // The type of the platform-specific implementation. -#if defined(ASIO_HAS_IOCP) - typedef detail::win_iocp_io_service impl_type; -#elif defined(ASIO_HAS_EPOLL) - typedef detail::task_io_service > impl_type; -#elif defined(ASIO_HAS_KQUEUE) - typedef detail::task_io_service > impl_type; -#else - typedef detail::task_io_service > impl_type; -#endif - -public: - class work; - friend class work; - - class service; - - class strand; - - /// Default constructor. - io_service(); - - /// Run the io_service's event processing loop. - /** - * The run() function blocks until all work has finished and there are no - * more handlers to be dispatched, or until the io_service has been - * interrupted. - * - * Multiple threads may call the run() function to set up a pool of threads - * from which the io_service may execute handlers. - * - * The run() function may be safely called again once it has completed only - * after a call to reset(). - * - * @return The number of handlers that were executed. - */ - size_t run(); - - /// Run the io_service's event processing loop to execute at most one handler. - /** - * The run_one() function blocks until one handler has been dispatched, or - * until the io_service has been interrupted. - * - * @return The number of handlers that were executed. - */ - size_t run_one(); - - /// Run the io_service's event processing loop to execute ready handlers. - /** - * The poll() function runs handlers that are ready to run, without blocking, - * until the io_service has been interrupted or there are no more ready - * handlers. - * - * @return The number of handlers that were executed. - */ - size_t poll(); - - /// Run the io_service's event processing loop to execute one ready handler. - /** - * The poll_one() function runs at most one handler that is ready to run, - * without blocking. - * - * @return The number of handlers that were executed. - */ - size_t poll_one(); - - /// Interrupt the io_service's event processing loop. - /** - * This function does not block, but instead simply signals to the io_service - * that all invocations of its run() or run_one() member functions should - * return as soon as possible. - * - * Note that if the run() function is interrupted and is not called again - * later then its work may not have finished and handlers may not be - * delivered. In this case an io_service implementation is not required to - * make any guarantee that the resources associated with unfinished work will - * be cleaned up. - */ - void interrupt(); - - /// Reset the io_service in preparation for a subsequent run() invocation. - /** - * This function must be called prior to any second or later set of - * invocations of the run(), run_one(), poll() or poll_one() functions. It - * allows the io_service to reset any internal state, such as an interrupt - * flag. - * - * This function must not be called while there are any unfinished calls to - * the run(), run_one(), poll() or poll_one() functions. - */ - void reset(); - - /// Request the io_service to invoke the given handler. - /** - * This function is used to ask the io_service to execute the given handler. - * - * The io_service guarantees that the handler will only be called in a thread - * in which the run(), run_one(), poll() or poll_one() member functions is - * currently being invoked. The handler may be executed inside this function - * if the guarantee can be met. - * - * @param handler The handler to be called. The io_service will make - * a copy of the handler object as required. The function signature of the - * handler must be: @code void handler(); @endcode - */ - template - void dispatch(Handler handler); - - /// Request the io_service to invoke the given handler and return immediately. - /** - * This function is used to ask the io_service to execute the given handler, - * but without allowing the io_service to call the handler from inside this - * function. - * - * The io_service guarantees that the handler will only be called in a thread - * in which the run(), run_one(), poll() or poll_one() member functions is - * currently being invoked. - * - * @param handler The handler to be called. The io_service will make - * a copy of the handler object as required. The function signature of the - * handler must be: @code void handler(); @endcode - */ - template - void post(Handler handler); - - /// Create a new handler that automatically dispatches the wrapped handler - /// on the io_service. - /** - * This function is used to create a new handler function object that, when - * invoked, will automatically pass the wrapped handler to the io_service's - * dispatch function. - * - * @param handler The handler to be wrapped. The io_service will make a copy - * of the handler object as required. The function signature of the handler - * must be: @code void handler(A1 a1, ... An an); @endcode - * - * @return A function object that, when invoked, passes the wrapped handler to - * the io_service's dispatch function. Given a function object with the - * signature: - * @code R f(A1 a1, ... An an); @endcode - * If this function object is passed to the wrap function like so: - * @code io_service.wrap(f); @endcode - * then the return value is a function object with the signature - * @code void g(A1 a1, ... An an); @endcode - * that, when invoked, executes code equivalent to: - * @code io_service.dispatch(boost::bind(f, a1, ... an)); @endcode - */ - template -#if defined(GENERATING_DOCUMENTATION) - unspecified -#else - detail::wrapped_handler -#endif - wrap(Handler handler); - - /// Obtain the service object corresponding to the given type. - /** - * This function is used to locate a service object that corresponds to - * the given service type. If there is no existing implementation of the - * service, then the io_service will create a new instance of the service. - * - * @param ios The io_service object that owns the service. - * - * @return The service interface implementing the specified service type. - * Ownership of the service interface is not transferred to the caller. - */ - template - friend Service& use_service(io_service& ios); - - /// Add a service object to the io_service. - /** - * This function is used to add a service to the io_service. - * - * @param ios The io_service object that owns the service. - * - * @param svc The service object. On success, ownership of the service object - * is transferred to the io_service. When the io_service object is destroyed, - * it will destroy the service object by performing: - * @code delete static_cast(svc) @endcode - * - * @throws asio::service_already_exists Thrown if a service of the - * given type is already present in the io_service. - * - * @throws asio::invalid_service_owner Thrown if the service's owning - * io_service is not the io_service object specified by the ios parameter. - */ - template - friend void add_service(io_service& ios, Service* svc); - - /// Determine if an io_service contains a specified service type. - /** - * This function is used to determine whether the io_service contains a - * service object corresponding to the given service type. - * - * @param ios The io_service object that owns the service. - * - * @return A boolean indicating whether the io_service contains the service. - */ - template - friend bool has_service(io_service& ios); - -private: -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) - detail::winsock_init<> init_; -#elif defined(__sun) || defined(__QNX__) - detail::signal_init<> init_; -#endif - - // The service registry. - detail::service_registry service_registry_; - - // The implementation. - impl_type& impl_; -}; - -/// Class to inform the io_service when it has work to do. -/** - * The work class is used to inform the io_service when work starts and - * finishes. This ensures that the io_service's run() function will not exit - * while work is underway, and that it does exit when there is no unfinished - * work remaining. - * - * The work class is copy-constructible so that it may be used as a data member - * in a handler class. It is not assignable. - */ -class io_service::work -{ -public: - /// Constructor notifies the io_service that work is starting. - /** - * The constructor is used to inform the io_service that some work has begun. - * This ensures that the io_service's run() function will not exit while the - * work is underway. - */ - explicit work(asio::io_service& io_service); - - /// Copy constructor notifies the io_service that work is starting. - /** - * The constructor is used to inform the io_service that some work has begun. - * This ensures that the io_service's run() function will not exit while the - * work is underway. - */ - work(const work& other); - - /// Destructor notifies the io_service that the work is complete. - /** - * The destructor is used to inform the io_service that some work has - * finished. Once the count of unfinished work reaches zero, the io_service's - * run() function is permitted to exit. - */ - ~work(); - - /// Get the io_service associated with the work. - asio::io_service& io_service(); - -private: - // Prevent assignment. - void operator=(const work& other); - - // The io_service. - asio::io_service& io_service_; -}; - -/// Base class for all io_service services. -class io_service::service - : private noncopyable -{ -public: - /// Get the io_service object that owns the service. - asio::io_service& io_service(); - -protected: - /// Constructor. - /** - * @param owner The io_service object that owns the service. - */ - service(asio::io_service& owner); - - /// Destructor. - virtual ~service(); - -private: - /// Destroy all user-defined handler objects owned by the service. - virtual void shutdown_service() = 0; - - friend class detail::service_registry; - asio::io_service& owner_; - const std::type_info* type_info_; - service* next_; -}; - -/// Exception thrown when trying to add a duplicate service to an io_service. -class service_already_exists - : public std::logic_error -{ -public: - service_already_exists() - : std::logic_error("Service already exists.") - { - } -}; - -/// Exception thrown when trying to add a service object to an io_service where -/// the service has a different owner. -class invalid_service_owner - : public std::logic_error -{ -public: - invalid_service_owner() - : std::logic_error("Invalid service owner.") - { - } -}; - -/** - * @page io_service_handler_exception Effect of exceptions thrown from handlers - * - * If an exception is thrown from a handler, the exception is allowed to - * propagate through the throwing thread's invocation of - * asio::io_service::run(), asio::io_service::run_one(), - * asio::io_service::poll() or asio::io_service::poll_one(). - * No other threads that are calling any of these functions are affected. It is - * then the responsibility of the application to catch the exception. - * - * After the exception has been caught, the - * asio::io_service::run(), asio::io_service::run_one(), - * asio::io_service::poll() or asio::io_service::poll_one() - * call may be restarted @em without the need for an intervening call to - * asio::io_service::reset(). This allows the thread to rejoin the io_service's - * thread pool without impacting any other threads in the pool. - * - * @par Example: - * @code - * asio::io_service io_service; - * ... - * for (;;) - * { - * try - * { - * io_service.run(); - * break; // run() exited normally - * } - * catch (my_exception& e) - * { - * // Deal with exception as appropriate. - * } - * } - * @endcode - */ - -} // namespace asio - -#include "asio/impl/io_service.ipp" - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IO_SERVICE_HPP diff --git a/libtorrent/include/asio/ip/address.hpp b/libtorrent/include/asio/ip/address.hpp deleted file mode 100644 index 5d9a6e3a1..000000000 --- a/libtorrent/include/asio/ip/address.hpp +++ /dev/null @@ -1,284 +0,0 @@ -// -// address.hpp -// ~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_ADDRESS_HPP -#define ASIO_IP_ADDRESS_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/error.hpp" -#include "asio/error_handler.hpp" -#include "asio/ip/address_v4.hpp" -#include "asio/ip/address_v6.hpp" - -namespace asio { -namespace ip { - -/// Implements version-independent IP addresses. -/** - * The asio::ip::address class provides the ability to use either IP - * version 4 or version 6 addresses. - * - * @par Thread Safety: - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -class address -{ -public: - /// Default constructor. - address() - : type_(ipv4), - ipv4_address_(), - ipv6_address_() - { - } - - /// Construct an address from an IPv4 address. - address(const asio::ip::address_v4& ipv4_address) - : type_(ipv4), - ipv4_address_(ipv4_address), - ipv6_address_() - { - } - - /// Construct an address from an IPv6 address. - address(const asio::ip::address_v6& ipv6_address) - : type_(ipv6), - ipv4_address_(), - ipv6_address_(ipv6_address) - { - } - - /// Copy constructor. - address(const address& other) - : type_(other.type_), - ipv4_address_(other.ipv4_address_), - ipv6_address_(other.ipv6_address_) - { - } - - /// Assign from another address. - address& operator=(const address& other) - { - type_ = other.type_; - ipv4_address_ = other.ipv4_address_; - ipv6_address_ = other.ipv6_address_; - return *this; - } - - /// Assign from an IPv4 address. - address& operator=(const asio::ip::address_v4& ipv4_address) - { - type_ = ipv4; - ipv4_address_ = ipv4_address; - ipv6_address_ = asio::ip::address_v6(); - return *this; - } - - /// Assign from an IPv6 address. - address& operator=(const asio::ip::address_v6& ipv6_address) - { - type_ = ipv6; - ipv4_address_ = asio::ip::address_v4(); - ipv6_address_ = ipv6_address; - return *this; - } - - /// Get whether the address is an IP version 4 address. - bool is_v4() const - { - return type_ == ipv4; - } - - /// Get whether the address is an IP version 6 address. - bool is_v6() const - { - return type_ == ipv6; - } - - /// Get the address as an IP version 4 address. - asio::ip::address_v4 to_v4() const - { - if (type_ != ipv4) - { - asio::error error( - asio::error::address_family_not_supported); - boost::throw_exception(error); - } - return ipv4_address_; - } - - /// Get the address as an IP version 6 address. - asio::ip::address_v6 to_v6() const - { - if (type_ != ipv6) - { - asio::error error( - asio::error::address_family_not_supported); - boost::throw_exception(error); - } - return ipv6_address_; - } - - /// Get the address as a string in dotted decimal format. - std::string to_string() const - { - if (type_ == ipv6) - return ipv6_address_.to_string(); - return ipv4_address_.to_string(); - } - - /// Get the address as a string in dotted decimal format. - template - std::string to_string(Error_Handler error_handler) const - { - if (type_ == ipv6) - return ipv6_address_.to_string(error_handler); - return ipv4_address_.to_string(error_handler); - } - - /// Create an address from an IPv4 address string in dotted decimal form, - /// or from an IPv6 address in hexadecimal notation. - static address from_string(const char* str) - { - return from_string(str, asio::throw_error()); - } - - /// Create an address from an IPv4 address string in dotted decimal form, - /// or from an IPv6 address in hexadecimal notation. - template - static address from_string(const char* str, Error_Handler error_handler) - { - asio::error error; - asio::ip::address_v6 ipv6_address = - asio::ip::address_v6::from_string(str, - asio::assign_error(error)); - if (!error) - { - address tmp; - tmp.type_ = ipv6; - tmp.ipv6_address_ = ipv6_address; - error_handler(error); - return tmp; - } - - error = asio::error(); - asio::ip::address_v4 ipv4_address = - asio::ip::address_v4::from_string(str, - asio::assign_error(error)); - if (!error) - { - address tmp; - tmp.type_ = ipv4; - tmp.ipv4_address_ = ipv4_address; - error_handler(error); - return tmp; - } - - error_handler(error); - return address(); - } - - /// Create an address from an IPv4 address string in dotted decimal form, - /// or from an IPv6 address in hexadecimal notation. - static address from_string(const std::string& str) - { - return from_string(str.c_str(), asio::throw_error()); - } - - /// Create an address from an IPv4 address string in dotted decimal form, - /// or from an IPv6 address in hexadecimal notation. - template - static address from_string(const std::string& str, - Error_Handler error_handler) - { - return from_string(str.c_str(), error_handler); - } - - /// Compare two addresses for equality. - friend bool operator==(const address& a1, const address& a2) - { - if (a1.type_ != a2.type_) - return false; - if (a1.type_ == ipv6) - return a1.ipv6_address_ == a2.ipv6_address_; - return a1.ipv4_address_ == a2.ipv4_address_; - } - - /// Compare two addresses for inequality. - friend bool operator!=(const address& a1, const address& a2) - { - if (a1.type_ != a2.type_) - return true; - if (a1.type_ == ipv6) - return a1.ipv6_address_ != a2.ipv6_address_; - return a1.ipv4_address_ != a2.ipv4_address_; - } - - /// Compare addresses for ordering. - friend bool operator<(const address& a1, const address& a2) - { - if (a1.type_ < a2.type_) - return true; - if (a1.type_ > a2.type_) - return false; - if (a1.type_ == ipv6) - return a1.ipv6_address_ < a2.ipv6_address_; - return a1.ipv4_address_ < a2.ipv4_address_; - } - -private: - // The type of the address. - enum { ipv4, ipv6 } type_; - - // The underlying IPv4 address. - asio::ip::address_v4 ipv4_address_; - - // The underlying IPv6 address. - asio::ip::address_v6 ipv6_address_; -}; - -/// Output an address as a string. -/** - * Used to output a human-readable string for a specified address. - * - * @param os The output stream to which the string will be written. - * - * @param addr The address to be written. - * - * @return The output stream. - * - * @relates asio::ip::address - */ -template -std::basic_ostream& operator<<( - std::basic_ostream& os, const address& addr) -{ - os << addr.to_string(); - return os; -} - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_ADDRESS_HPP diff --git a/libtorrent/include/asio/ip/address_v4.hpp b/libtorrent/include/asio/ip/address_v4.hpp deleted file mode 100644 index eea9919b4..000000000 --- a/libtorrent/include/asio/ip/address_v4.hpp +++ /dev/null @@ -1,292 +0,0 @@ -// -// address_v4.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_ADDRESS_V4_HPP -#define ASIO_IP_ADDRESS_V4_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/error.hpp" -#include "asio/error_handler.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/detail/socket_types.hpp" - -namespace asio { -namespace ip { - -/// Implements IP version 4 style addresses. -/** - * The asio::ip::address_v4 class provides the ability to use and - * manipulate IP version 4 addresses. - * - * @par Thread Safety: - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -class address_v4 -{ -public: - /// The type used to represent an address as an array of bytes. - typedef boost::array bytes_type; - - /// Default constructor. - address_v4() - { - addr_.s_addr = 0; - } - - /// Construct an address from raw bytes. - explicit address_v4(const bytes_type& bytes) - { - using namespace std; // For memcpy. - memcpy(&addr_.s_addr, bytes.elems, 4); - } - - /// Construct an address from a unsigned long in host byte order. - explicit address_v4(unsigned long addr) - { - addr_.s_addr = asio::detail::socket_ops::host_to_network_long(addr); - } - - /// Copy constructor. - address_v4(const address_v4& other) - : addr_(other.addr_) - { - } - - /// Assign from another address. - address_v4& operator=(const address_v4& other) - { - addr_ = other.addr_; - return *this; - } - - /// Get the address in bytes. - bytes_type to_bytes() const - { - using namespace std; // For memcpy. - bytes_type bytes; - memcpy(bytes.elems, &addr_.s_addr, 4); - return bytes; - } - - /// Get the address as an unsigned long in host byte order - unsigned long to_ulong() const - { - return asio::detail::socket_ops::network_to_host_long(addr_.s_addr); - } - - /// Get the address as a string in dotted decimal format. - std::string to_string() const - { - return to_string(asio::throw_error()); - } - - /// Get the address as a string in dotted decimal format. - template - std::string to_string(Error_Handler error_handler) const - { - char addr_str[asio::detail::max_addr_v4_str_len]; - const char* addr = - asio::detail::socket_ops::inet_ntop(AF_INET, &addr_, addr_str, - asio::detail::max_addr_v4_str_len); - if (addr == 0) - { - asio::error e(asio::detail::socket_ops::get_error()); - error_handler(e); - return std::string(); - } - asio::error e; - error_handler(e); - return addr; - } - - /// Create an address from an IP address string in dotted decimal form. - static address_v4 from_string(const char* str) - { - return from_string(str, asio::throw_error()); - } - - /// Create an address from an IP address string in dotted decimal form. - template - static address_v4 from_string(const char* str, Error_Handler error_handler) - { - address_v4 tmp; - if (asio::detail::socket_ops::inet_pton( - AF_INET, str, &tmp.addr_) <= 0) - { - asio::error e(asio::detail::socket_ops::get_error()); - error_handler(e); - return address_v4(); - } - asio::error e; - error_handler(e); - return tmp; - } - - /// Create an address from an IP address string in dotted decimal form. - static address_v4 from_string(const std::string& str) - { - return from_string(str.c_str(), asio::throw_error()); - } - - /// Create an address from an IP address string in dotted decimal form. - template - static address_v4 from_string(const std::string& str, - Error_Handler error_handler) - { - return from_string(str.c_str(), error_handler); - } - - /// Determine whether the address is a class A address. - bool is_class_a() const - { - return IN_CLASSA(to_ulong()); - } - - /// Determine whether the address is a class B address. - bool is_class_b() const - { - return IN_CLASSB(to_ulong()); - } - - /// Determine whether the address is a class C address. - bool is_class_c() const - { - return IN_CLASSC(to_ulong()); - } - - /// Determine whether the address is a multicast address. - bool is_multicast() const - { - return IN_MULTICAST(to_ulong()); - } - - /// Compare two addresses for equality. - friend bool operator==(const address_v4& a1, const address_v4& a2) - { - return a1.addr_.s_addr == a2.addr_.s_addr; - } - - /// Compare two addresses for inequality. - friend bool operator!=(const address_v4& a1, const address_v4& a2) - { - return a1.addr_.s_addr != a2.addr_.s_addr; - } - - /// Compare addresses for ordering. - friend bool operator<(const address_v4& a1, const address_v4& a2) - { - return a1.to_ulong() < a2.to_ulong(); - } - - /// Compare addresses for ordering. - friend bool operator>(const address_v4& a1, const address_v4& a2) - { - return a1.to_ulong() > a2.to_ulong(); - } - - /// Compare addresses for ordering. - friend bool operator<=(const address_v4& a1, const address_v4& a2) - { - return a1.to_ulong() <= a2.to_ulong(); - } - - /// Compare addresses for ordering. - friend bool operator>=(const address_v4& a1, const address_v4& a2) - { - return a1.to_ulong() >= a2.to_ulong(); - } - - /// Obtain an address object that represents any address. - static address_v4 any() - { - return address_v4(static_cast(INADDR_ANY)); - } - - /// Obtain an address object that represents the loopback address. - static address_v4 loopback() - { - return address_v4(static_cast(INADDR_LOOPBACK)); - } - - /// Obtain an address object that represents the broadcast address. - static address_v4 broadcast() - { - return address_v4(static_cast(INADDR_BROADCAST)); - } - - /// Obtain an address object that represents the broadcast address that - /// corresponds to the specified address and netmask. - static address_v4 broadcast(const address_v4& addr, const address_v4& mask) - { - return address_v4(addr.to_ulong() | ~mask.to_ulong()); - } - - /// Obtain the netmask that corresponds to the address, based on its address - /// class. - static address_v4 netmask(const address_v4& addr) - { - if (addr.is_class_a()) - return address_v4(0xFF000000); - if (addr.is_class_b()) - return address_v4(0xFFFF0000); - if (addr.is_class_c()) - return address_v4(0xFFFFFF00); - return address_v4(0xFFFFFFFF); - } - -private: - // The underlying IPv4 address. - asio::detail::in4_addr_type addr_; -}; - -/// Output an address as a string. -/** - * Used to output a human-readable string for a specified address. - * - * @param os The output stream to which the string will be written. - * - * @param addr The address to be written. - * - * @return The output stream. - * - * @relates asio::ip::address_v4 - */ -template -std::basic_ostream& operator<<( - std::basic_ostream& os, const address_v4& addr) -{ - asio::error e; - std::string s = addr.to_string(asio::assign_error(e)); - if (e) - os.setstate(std::ios_base::failbit); - else - for (std::string::iterator i = s.begin(); i != s.end(); ++i) - os << os.widen(*i); - return os; -} - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_ADDRESS_V4_HPP diff --git a/libtorrent/include/asio/ip/address_v6.hpp b/libtorrent/include/asio/ip/address_v6.hpp deleted file mode 100644 index 85f0ebc1a..000000000 --- a/libtorrent/include/asio/ip/address_v6.hpp +++ /dev/null @@ -1,381 +0,0 @@ -// -// address_v6.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_ADDRESS_V6_HPP -#define ASIO_IP_ADDRESS_V6_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/error.hpp" -#include "asio/error_handler.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/ip/address_v4.hpp" - -namespace asio { -namespace ip { - -/// Implements IP version 6 style addresses. -/** - * The asio::ip::address_v6 class provides the ability to use and - * manipulate IP version 6 addresses. - * - * @par Thread Safety: - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -class address_v6 -{ -public: - /// The type used to represent an address as an array of bytes. - typedef boost::array bytes_type; - - /// Default constructor. - address_v6() - : scope_id_(0) - { - asio::detail::in6_addr_type tmp_addr = IN6ADDR_ANY_INIT; - addr_ = tmp_addr; - } - - /// Construct an address from raw bytes and scope ID. - explicit address_v6(const bytes_type& bytes, unsigned long scope_id = 0) - : scope_id_(scope_id) - { - using namespace std; // For memcpy. - memcpy(addr_.s6_addr, bytes.elems, 16); - } - - /// Copy constructor. - address_v6(const address_v6& other) - : addr_(other.addr_), - scope_id_(other.scope_id_) - { - } - - /// Assign from another address. - address_v6& operator=(const address_v6& other) - { - addr_ = other.addr_; - scope_id_ = other.scope_id_; - return *this; - } - - /// Get the scope ID of the address. - unsigned long scope_id() const - { - return scope_id_; - } - - /// Set the scope ID of the address. - void scope_id(unsigned long id) - { - scope_id_ = id; - } - - /// Get the address in bytes. - bytes_type to_bytes() const - { - using namespace std; // For memcpy. - bytes_type bytes; - memcpy(bytes.elems, addr_.s6_addr, 16); - return bytes; - } - - /// Get the address as a string. - std::string to_string() const - { - return to_string(asio::throw_error()); - } - - /// Get the address as a string. - template - std::string to_string(Error_Handler error_handler) const - { - char addr_str[asio::detail::max_addr_v6_str_len]; - const char* addr = - asio::detail::socket_ops::inet_ntop(AF_INET6, &addr_, addr_str, - asio::detail::max_addr_v6_str_len, scope_id_); - if (addr == 0) - { - asio::error e(asio::detail::socket_ops::get_error()); - error_handler(e); - return std::string(); - } - asio::error e; - error_handler(e); - return addr; - } - - /// Create an address from an IP address string. - static address_v6 from_string(const char* str) - { - return from_string(str, asio::throw_error()); - } - - /// Create an address from an IP address string. - template - static address_v6 from_string(const char* str, Error_Handler error_handler) - { - address_v6 tmp; - if (asio::detail::socket_ops::inet_pton( - AF_INET6, str, &tmp.addr_, &tmp.scope_id_) <= 0) - { - asio::error e(asio::detail::socket_ops::get_error()); - error_handler(e); - return address_v6(); - } - asio::error e; - error_handler(e); - return tmp; - } - - /// Create an address from an IP address string. - static address_v6 from_string(const std::string& str) - { - return from_string(str.c_str(), asio::throw_error()); - } - - /// Create an address from an IP address string. - template - static address_v6 from_string(const std::string& str, - Error_Handler error_handler) - { - return from_string(str.c_str(), error_handler); - } - - /// Converts an IPv4-mapped or IPv4-compatible address to an IPv4 address. - address_v4 to_v4() const - { - if (!is_v4_mapped() && !is_v4_compatible()) - throw std::bad_cast(); - address_v4::bytes_type v4_bytes = { addr_.s6_addr[12], - addr_.s6_addr[13], addr_.s6_addr[14], addr_.s6_addr[15] }; - return address_v4(v4_bytes); - } - - /// Determine whether the address is a loopback address. - bool is_loopback() const - { - using namespace asio::detail; - return IN6_IS_ADDR_LOOPBACK(&addr_) != 0; - } - - /// Determine whether the address is unspecified. - bool is_unspecified() const - { - using namespace asio::detail; - return IN6_IS_ADDR_UNSPECIFIED(&addr_) != 0; - } - - /// Determine whether the address is link local. - bool is_link_local() const - { - using namespace asio::detail; - return IN6_IS_ADDR_LINKLOCAL(&addr_) != 0; - } - - /// Determine whether the address is site local. - bool is_site_local() const - { - using namespace asio::detail; - return IN6_IS_ADDR_SITELOCAL(&addr_) != 0; - } - - /// Determine whether the address is a mapped IPv4 address. - bool is_v4_mapped() const - { - using namespace asio::detail; - return IN6_IS_ADDR_V4MAPPED(&addr_) != 0; - } - - /// Determine whether the address is an IPv4-compatible address. - bool is_v4_compatible() const - { - using namespace asio::detail; - return IN6_IS_ADDR_V4COMPAT(&addr_) != 0; - } - - /// Determine whether the address is a multicast address. - bool is_multicast() const - { - using namespace asio::detail; - return IN6_IS_ADDR_MULTICAST(&addr_) != 0; - } - - /// Determine whether the address is a global multicast address. - bool is_multicast_global() const - { - using namespace asio::detail; - return IN6_IS_ADDR_MC_GLOBAL(&addr_) != 0; - } - - /// Determine whether the address is a link-local multicast address. - bool is_multicast_link_local() const - { - using namespace asio::detail; - return IN6_IS_ADDR_MC_LINKLOCAL(&addr_) != 0; - } - - /// Determine whether the address is a node-local multicast address. - bool is_multicast_node_local() const - { - using namespace asio::detail; - return IN6_IS_ADDR_MC_NODELOCAL(&addr_) != 0; - } - - /// Determine whether the address is a org-local multicast address. - bool is_multicast_org_local() const - { - using namespace asio::detail; - return IN6_IS_ADDR_MC_ORGLOCAL(&addr_) != 0; - } - - /// Determine whether the address is a site-local multicast address. - bool is_multicast_site_local() const - { - using namespace asio::detail; - return IN6_IS_ADDR_MC_SITELOCAL(&addr_) != 0; - } - - /// Compare two addresses for equality. - friend bool operator==(const address_v6& a1, const address_v6& a2) - { - using namespace std; // For memcmp. - return memcmp(&a1.addr_, &a2.addr_, - sizeof(asio::detail::in6_addr_type)) == 0 - && a1.scope_id_ == a2.scope_id_; - } - - /// Compare two addresses for inequality. - friend bool operator!=(const address_v6& a1, const address_v6& a2) - { - using namespace std; // For memcmp. - return memcmp(&a1.addr_, &a2.addr_, - sizeof(asio::detail::in6_addr_type)) != 0 - || a1.scope_id_ != a2.scope_id_; - } - - /// Compare addresses for ordering. - friend bool operator<(const address_v6& a1, const address_v6& a2) - { - using namespace std; // For memcmp. - int memcmp_result = memcmp(&a1.addr_, &a2.addr_, - sizeof(asio::detail::in6_addr_type)) < 0; - if (memcmp_result < 0) - return true; - if (memcmp_result > 0) - return false; - return a1.scope_id_ < a2.scope_id_; - } - - /// Compare addresses for ordering. - friend bool operator>(const address_v6& a1, const address_v6& a2) - { - return a2 < a1; - } - - /// Compare addresses for ordering. - friend bool operator<=(const address_v6& a1, const address_v6& a2) - { - return !(a2 < a1); - } - - /// Compare addresses for ordering. - friend bool operator>=(const address_v6& a1, const address_v6& a2) - { - return !(a1 < a2); - } - - /// Obtain an address object that represents any address. - static address_v6 any() - { - return address_v6(); - } - - /// Obtain an address object that represents the loopback address. - static address_v6 loopback() - { - address_v6 tmp; - asio::detail::in6_addr_type tmp_addr = IN6ADDR_LOOPBACK_INIT; - tmp.addr_ = tmp_addr; - return tmp; - } - - /// Create an IPv4-mapped IPv6 address. - static address_v6 v4_mapped(const address_v4& addr) - { - address_v4::bytes_type v4_bytes = addr.to_bytes(); - bytes_type v6_bytes = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF, 0xFF, - v4_bytes[0], v4_bytes[1], v4_bytes[2], v4_bytes[3] }; - return address_v6(v6_bytes); - } - - /// Create an IPv4-compatible IPv6 address. - static address_v6 v4_compatible(const address_v4& addr) - { - address_v4::bytes_type v4_bytes = addr.to_bytes(); - bytes_type v6_bytes = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - v4_bytes[0], v4_bytes[1], v4_bytes[2], v4_bytes[3] }; - return address_v6(v6_bytes); - } - -private: - // The underlying IPv6 address. - asio::detail::in6_addr_type addr_; - - // The scope ID associated with the address. - unsigned long scope_id_; -}; - -/// Output an address as a string. -/** - * Used to output a human-readable string for a specified address. - * - * @param os The output stream to which the string will be written. - * - * @param addr The address to be written. - * - * @return The output stream. - * - * @relates asio::ip::address_v6 - */ -template -std::basic_ostream& operator<<( - std::basic_ostream& os, const address_v6& addr) -{ - asio::error e; - std::string s = addr.to_string(asio::assign_error(e)); - if (e) - os.setstate(std::ios_base::failbit); - else - for (std::string::iterator i = s.begin(); i != s.end(); ++i) - os << os.widen(*i); - return os; -} - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_ADDRESS_V6_HPP diff --git a/libtorrent/include/asio/ip/basic_endpoint.hpp b/libtorrent/include/asio/ip/basic_endpoint.hpp deleted file mode 100644 index 56ce99eca..000000000 --- a/libtorrent/include/asio/ip/basic_endpoint.hpp +++ /dev/null @@ -1,358 +0,0 @@ -// -// basic_endpoint.hpp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_BASIC_ENDPOINT_HPP -#define ASIO_IP_BASIC_ENDPOINT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -# include -#endif // BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -#include "asio/detail/pop_options.hpp" - -#include "asio/error.hpp" -#include "asio/ip/address.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/detail/socket_types.hpp" - -namespace asio { -namespace ip { - -/// Describes an endpoint for a version-independent IP socket. -/** - * The asio::ip::basic_endpoint class template describes an endpoint that - * may be associated with a particular socket. - * - * @par Thread Safety: - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Concepts: - * Endpoint. - */ -template -class basic_endpoint -{ -public: - /// The protocol type associated with the endpoint. - typedef Protocol protocol_type; - - /// The type of the endpoint structure. This type is dependent on the - /// underlying implementation of the socket layer. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined data_type; -#else - typedef asio::detail::socket_addr_type data_type; -#endif - - /// The type for the size of the endpoint structure. This type is dependent on - /// the underlying implementation of the socket layer. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined size_type; -#else - typedef asio::detail::socket_addr_len_type size_type; -#endif - - /// Default constructor. - basic_endpoint() - : data_() - { - asio::detail::sockaddr_in4_type& data - = reinterpret_cast(data_); - data.sin_family = AF_INET; - data.sin_port = 0; - data.sin_addr.s_addr = INADDR_ANY; - } - - /// Construct an endpoint using a port number, specified in the host's byte - /// order. The IP address will be the any address (i.e. INADDR_ANY or - /// in6addr_any). This constructor would typically be used for accepting new - /// connections. - /** - * @par Examples: - * To initialise an IPv4 TCP endpoint for port 1234, use: - * @code - * asio::ip::tcp::endpoint ep(asio::ip::tcp::v4(), 1234); - * @endcode - * - * To specify an IPv6 UDP endpoint for port 9876, use: - * @code - * asio::ip::udp::endpoint ep(asio::ip::udp::v6(), 9876); - * @endcode - */ - basic_endpoint(const Protocol& protocol, unsigned short port_num) - : data_() - { - using namespace std; // For memcpy. - if (protocol.family() == PF_INET) - { - asio::detail::sockaddr_in4_type& data - = reinterpret_cast(data_); - data.sin_family = AF_INET; - data.sin_port = - asio::detail::socket_ops::host_to_network_short(port_num); - data.sin_addr.s_addr = INADDR_ANY; - } - else - { - asio::detail::sockaddr_in6_type& data - = reinterpret_cast(data_); - data.sin6_family = AF_INET6; - data.sin6_port = - asio::detail::socket_ops::host_to_network_short(port_num); - data.sin6_flowinfo = 0; - asio::detail::in6_addr_type tmp_addr = IN6ADDR_ANY_INIT; - data.sin6_addr = tmp_addr; - data.sin6_scope_id = 0; - } - } - - /// Construct an endpoint using a port number and an IP address. This - /// constructor may be used for accepting connections on a specific interface - /// or for making a connection to a remote endpoint. - basic_endpoint(const asio::ip::address& addr, unsigned short port_num) - : data_() - { - using namespace std; // For memcpy. - if (addr.is_v4()) - { - asio::detail::sockaddr_in4_type& data - = reinterpret_cast(data_); - data.sin_family = AF_INET; - data.sin_port = - asio::detail::socket_ops::host_to_network_short(port_num); - data.sin_addr.s_addr = - asio::detail::socket_ops::host_to_network_long( - addr.to_v4().to_ulong()); - } - else - { - asio::detail::sockaddr_in6_type& data - = reinterpret_cast(data_); - data.sin6_family = AF_INET6; - data.sin6_port = - asio::detail::socket_ops::host_to_network_short(port_num); - data.sin6_flowinfo = 0; - asio::ip::address_v6 v6_addr = addr.to_v6(); - asio::ip::address_v6::bytes_type bytes = v6_addr.to_bytes(); - memcpy(data.sin6_addr.s6_addr, bytes.elems, 16); - data.sin6_scope_id = v6_addr.scope_id(); - } - } - - /// Copy constructor. - basic_endpoint(const basic_endpoint& other) - : data_(other.data_) - { - } - - /// Assign from another endpoint. - basic_endpoint& operator=(const basic_endpoint& other) - { - data_ = other.data_; - return *this; - } - - /// The protocol associated with the endpoint. - protocol_type protocol() const - { - if (data_.ss_family == AF_INET) - return Protocol::v4(); - return Protocol::v6(); - } - - /// Get the underlying endpoint in the native type. - data_type* data() - { - return reinterpret_cast(&data_); - } - - /// Get the underlying endpoint in the native type. - const data_type* data() const - { - return reinterpret_cast(&data_); - } - - /// Get the underlying size of the endpoint in the native type. - size_type size() const - { - if (data_.ss_family == AF_INET) - return sizeof(asio::detail::sockaddr_in4_type); - else - return sizeof(asio::detail::sockaddr_in6_type); - } - - /// Set the underlying size of the endpoint in the native type. - void resize(size_type size) - { - if (size > size_type(sizeof(data_))) - { - asio::error e(asio::error::invalid_argument); - boost::throw_exception(e); - } - } - - /// Get the capacity of the endpoint in the native type. - size_type capacity() const - { - return sizeof(data_); - } - - /// Get the port associated with the endpoint. The port number is always in - /// the host's byte order. - unsigned short port() const - { - if (data_.ss_family == AF_INET) - { - return asio::detail::socket_ops::network_to_host_short( - reinterpret_cast( - data_).sin_port); - } - else - { - return asio::detail::socket_ops::network_to_host_short( - reinterpret_cast( - data_).sin6_port); - } - } - - /// Set the port associated with the endpoint. The port number is always in - /// the host's byte order. - void port(unsigned short port_num) - { - if (data_.ss_family == AF_INET) - { - reinterpret_cast(data_).sin_port - = asio::detail::socket_ops::host_to_network_short(port_num); - } - else - { - reinterpret_cast(data_).sin6_port - = asio::detail::socket_ops::host_to_network_short(port_num); - } - } - - /// Get the IP address associated with the endpoint. - asio::ip::address address() const - { - using namespace std; // For memcpy. - if (data_.ss_family == AF_INET) - { - const asio::detail::sockaddr_in4_type& data - = reinterpret_cast( - data_); - return asio::ip::address_v4( - asio::detail::socket_ops::network_to_host_long( - data.sin_addr.s_addr)); - } - else - { - const asio::detail::sockaddr_in6_type& data - = reinterpret_cast( - data_); - asio::ip::address_v6::bytes_type bytes; - memcpy(bytes.elems, data.sin6_addr.s6_addr, 16); - return asio::ip::address_v6(bytes, data.sin6_scope_id); - } - } - - /// Set the IP address associated with the endpoint. - void address(const asio::ip::address& addr) - { - basic_endpoint tmp_endpoint(addr, port()); - data_ = tmp_endpoint.data_; - } - - /// Compare two endpoints for equality. - friend bool operator==(const basic_endpoint& e1, - const basic_endpoint& e2) - { - return e1.address() == e2.address() && e1.port() == e2.port(); - } - - /// Compare two endpoints for inequality. - friend bool operator!=(const basic_endpoint& e1, - const basic_endpoint& e2) - { - return e1.address() != e2.address() || e1.port() != e2.port(); - } - - /// Compare endpoints for ordering. - friend bool operator<(const basic_endpoint& e1, - const basic_endpoint& e2) - { - if (e1.address() < e2.address()) - return true; - if (e1.address() != e2.address()) - return false; - return e1.port() < e2.port(); - } - -private: - // The underlying IP socket address. - asio::detail::sockaddr_storage_type data_; -}; - -/// Output an endpoint as a string. -/** - * Used to output a human-readable string for a specified endpoint. - * - * @param os The output stream to which the string will be written. - * - * @param endpoint The endpoint to be written. - * - * @return The output stream. - * - * @relates asio::ip::basic_endpoint - */ -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -template -std::ostream& operator<<(std::ostream& os, - const basic_endpoint& endpoint) -{ - const address& addr = endpoint.address(); - if (addr.is_v4()) - os << addr.to_string(); - else - os << '[' << addr.to_string() << ']'; - os << ':' << endpoint.port(); - return os; -} -#else // BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -template -std::basic_ostream& operator<<( - std::basic_ostream& os, - const basic_endpoint& endpoint) -{ - const address& addr = endpoint.address(); - if (addr.is_v4()) - os << addr.to_string(); - else - os << '[' << addr.to_string() << ']'; - os << ':' << endpoint.port(); - return os; -} -#endif // BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_BASIC_ENDPOINT_HPP diff --git a/libtorrent/include/asio/ip/basic_resolver_entry.hpp b/libtorrent/include/asio/ip/basic_resolver_entry.hpp deleted file mode 100644 index 6198425ab..000000000 --- a/libtorrent/include/asio/ip/basic_resolver_entry.hpp +++ /dev/null @@ -1,98 +0,0 @@ -// -// basic_resolver_entry.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_BASIC_RESOLVER_ENTRY_HPP -#define ASIO_IP_BASIC_RESOLVER_ENTRY_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -namespace asio { -namespace ip { - -/// An entry produced by a resolver. -/** - * The asio::ip::basic_resolver_entry class template describes an entry - * as returned by a resolver. - * - * @par Thread Safety: - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Concepts: - * Endpoint. - */ -template -class basic_resolver_entry -{ -public: - /// The protocol type associated with the endpoint entry. - typedef Protocol protocol_type; - - /// The endpoint type associated with the endpoint entry. - typedef typename Protocol::endpoint endpoint_type; - - /// Default constructor. - basic_resolver_entry() - { - } - - /// Construct with specified endpoint, host name and service name. - basic_resolver_entry(const endpoint_type& endpoint, - const std::string& host_name, const std::string& service_name) - : endpoint_(endpoint), - host_name_(host_name), - service_name_(service_name) - { - } - - /// Get the endpoint associated with the entry. - endpoint_type endpoint() const - { - return endpoint_; - } - - /// Convert to the endpoint associated with the entry. - operator endpoint_type() const - { - return endpoint_; - } - - /// Get the host name associated with the entry. - std::string host_name() const - { - return host_name_; - } - - /// Get the service name associated with the entry. - std::string service_name() const - { - return service_name_; - } - -private: - endpoint_type endpoint_; - std::string host_name_; - std::string service_name_; -}; - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_BASIC_RESOLVER_ENTRY_HPP diff --git a/libtorrent/include/asio/ip/basic_resolver_iterator.hpp b/libtorrent/include/asio/ip/basic_resolver_iterator.hpp deleted file mode 100644 index 12984ee79..000000000 --- a/libtorrent/include/asio/ip/basic_resolver_iterator.hpp +++ /dev/null @@ -1,151 +0,0 @@ -// -// basic_resolver_iterator.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_BASIC_RESOLVER_ITERATOR_HPP -#define ASIO_IP_BASIC_RESOLVER_ITERATOR_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/detail/socket_ops.hpp" -#include "asio/detail/socket_types.hpp" -#include "asio/ip/basic_resolver_entry.hpp" - -namespace asio { -namespace ip { - -/// An iterator over the entries produced by a resolver. -/** - * The asio::ip::basic_resolver_iterator class template is used to define - * iterators over the results returned by a resolver. - * - * The iterator's value_type, obtained when the iterator is dereferenced, is: - * @code const basic_resolver_entry @endcode - * - * @par Thread Safety: - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - */ -template -class basic_resolver_iterator - : public boost::iterator_facade< - basic_resolver_iterator, - const basic_resolver_entry, - boost::forward_traversal_tag> -{ -public: - /// Default constructor creates an end iterator. - basic_resolver_iterator() - { - } - - /// Create an iterator from an addrinfo list returned by getaddrinfo. - static basic_resolver_iterator create( - asio::detail::addrinfo_type* address_info, - const std::string& host_name, const std::string& service_name) - { - basic_resolver_iterator iter; - if (!address_info) - return iter; - - std::string actual_host_name = host_name; - if (address_info->ai_canonname) - actual_host_name = address_info->ai_canonname; - - iter.values_.reset(new values_type); - - while (address_info) - { - if (address_info->ai_family == PF_INET - || address_info->ai_family == PF_INET6) - { - using namespace std; // For memcpy. - typename Protocol::endpoint endpoint; - endpoint.resize(address_info->ai_addrlen); - memcpy(endpoint.data(), address_info->ai_addr, - address_info->ai_addrlen); - iter.values_->push_back( - basic_resolver_entry(endpoint, - actual_host_name, service_name)); - } - address_info = address_info->ai_next; - } - - if (iter.values_->size()) - iter.iter_ = iter.values_->begin(); - else - iter.values_.reset(); - - return iter; - } - - /// Create an iterator from an endpoint, host name and service name. - static basic_resolver_iterator create( - const typename Protocol::endpoint& endpoint, - const std::string& host_name, const std::string& service_name) - { - basic_resolver_iterator iter; - iter.values_.reset(new values_type); - iter.values_->push_back( - basic_resolver_entry(endpoint, host_name, service_name)); - iter.iter_ = iter.values_->begin(); - return iter; - } - -private: - friend class boost::iterator_core_access; - - void increment() - { - if (++iter_ == values_->end()) - { - // Reset state to match a default constructed end iterator. - values_.reset(); - typedef typename values_type::const_iterator values_iterator_type; - iter_ = values_iterator_type(); - } - } - - bool equal(const basic_resolver_iterator& other) const - { - if (!values_ && !other.values_) - return true; - if (values_ != other.values_) - return false; - return iter_ == other.iter_; - } - - const basic_resolver_entry& dereference() const - { - return *iter_; - } - - typedef std::vector > values_type; - boost::shared_ptr values_; - typename values_type::const_iterator iter_; -}; - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_BASIC_RESOLVER_ITERATOR_HPP diff --git a/libtorrent/include/asio/ip/basic_resolver_query.hpp b/libtorrent/include/asio/ip/basic_resolver_query.hpp deleted file mode 100644 index ddee4b1c3..000000000 --- a/libtorrent/include/asio/ip/basic_resolver_query.hpp +++ /dev/null @@ -1,152 +0,0 @@ -// -// basic_resolver_query.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_BASIC_RESOLVER_QUERY_HPP -#define ASIO_IP_BASIC_RESOLVER_QUERY_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/detail/socket_ops.hpp" -#include "asio/ip/resolver_query_base.hpp" - -namespace asio { -namespace ip { - -/// An query to be passed to a resolver. -/** - * The asio::ip::basic_resolver_query class template describes a query - * that can be passed to a resolver. - * - * @par Thread Safety: - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Concepts: - * Endpoint. - */ -template -class basic_resolver_query - : public resolver_query_base -{ -public: - /// The protocol type associated with the endpoint query. - typedef Protocol protocol_type; - - /// Construct with specified service name for any protocol. - basic_resolver_query(const std::string& service_name, - int flags = passive | address_configured) - : hints_(), - host_name_(), - service_name_(service_name) - { - typename Protocol::endpoint endpoint; - hints_.ai_flags = flags; - hints_.ai_family = PF_UNSPEC; - hints_.ai_socktype = endpoint.protocol().type(); - hints_.ai_protocol = endpoint.protocol().protocol(); - hints_.ai_addrlen = 0; - hints_.ai_canonname = 0; - hints_.ai_addr = 0; - hints_.ai_next = 0; - } - - /// Construct with specified service name for a given protocol. - basic_resolver_query(const protocol_type& protocol, - const std::string& service_name, - int flags = passive | address_configured) - : hints_(), - host_name_(), - service_name_(service_name) - { - hints_.ai_flags = flags; - hints_.ai_family = protocol.family(); - hints_.ai_socktype = protocol.type(); - hints_.ai_protocol = protocol.protocol(); - hints_.ai_addrlen = 0; - hints_.ai_canonname = 0; - hints_.ai_addr = 0; - hints_.ai_next = 0; - } - - /// Construct with specified host name and service name for any protocol. - basic_resolver_query(const std::string& host_name, - const std::string& service_name, int flags = address_configured) - : hints_(), - host_name_(host_name), - service_name_(service_name) - { - typename Protocol::endpoint endpoint; - hints_.ai_flags = flags; - hints_.ai_family = PF_UNSPEC; - hints_.ai_socktype = endpoint.protocol().type(); - hints_.ai_protocol = endpoint.protocol().protocol(); - hints_.ai_addrlen = 0; - hints_.ai_canonname = 0; - hints_.ai_addr = 0; - hints_.ai_next = 0; - } - - /// Construct with specified host name and service name for a given protocol. - basic_resolver_query(const protocol_type& protocol, - const std::string& host_name, const std::string& service_name, - int flags = address_configured) - : hints_(), - host_name_(host_name), - service_name_(service_name) - { - hints_.ai_flags = flags; - hints_.ai_family = protocol.family(); - hints_.ai_socktype = protocol.type(); - hints_.ai_protocol = protocol.protocol(); - hints_.ai_addrlen = 0; - hints_.ai_canonname = 0; - hints_.ai_addr = 0; - hints_.ai_next = 0; - } - - /// Get the hints associated with the query. - const asio::detail::addrinfo_type& hints() const - { - return hints_; - } - - /// Get the host name associated with the query. - std::string host_name() const - { - return host_name_; - } - - /// Get the service name associated with the query. - std::string service_name() const - { - return service_name_; - } - -private: - asio::detail::addrinfo_type hints_; - std::string host_name_; - std::string service_name_; -}; - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_BASIC_RESOLVER_QUERY_HPP diff --git a/libtorrent/include/asio/ip/detail/socket_option.hpp b/libtorrent/include/asio/ip/detail/socket_option.hpp deleted file mode 100644 index ae733e987..000000000 --- a/libtorrent/include/asio/ip/detail/socket_option.hpp +++ /dev/null @@ -1,406 +0,0 @@ -// -// socket_option.hpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_DETAIL_SOCKET_OPTION_HPP -#define ASIO_IP_DETAIL_SOCKET_OPTION_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/ip/address.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/detail/socket_types.hpp" - -namespace asio { -namespace ip { -namespace detail { -namespace socket_option { - -// Helper template for implementing boolean-based options. -template -class boolean -{ -public: - // Default constructor. - boolean() - : value_(0) - { - } - - // Construct with a specific option value. - boolean(bool value) - : value_(value ? 1 : 0) - { - } - - // Set the value of the boolean. - void set(bool value) - { - value_ = value ? 1 : 0; - } - - // Get the current value of the boolean. - bool get() const - { - return value_; - } - - // Get the level of the socket option. - template - int level(const Protocol& protocol) const - { - if (protocol.family() == PF_INET6) - return IPv6_Level; - return IPv4_Level; - } - - // Get the name of the socket option. - template - int name(const Protocol& protocol) const - { - if (protocol.family() == PF_INET6) - return IPv6_Name; - return IPv4_Name; - } - - // Get the address of the boolean data. - template - int* data(const Protocol&) - { - return &value_; - } - - // Get the address of the boolean data. - template - const int* data(const Protocol&) const - { - return &value_; - } - - // Get the size of the boolean data. - template - std::size_t size(const Protocol&) const - { - return sizeof(value_); - } - -private: - int value_; -}; - -// Helper template for implementing integer options. -template -class integer -{ -public: - // Default constructor. - integer() - : value_(0) - { - } - - // Construct with a specific option value. - integer(int value) - : value_(value) - { - } - - // Set the value of the int option. - void set(int value) - { - value_ = value; - } - - // Get the current value of the int option. - int get() const - { - return value_; - } - - // Get the level of the socket option. - template - int level(const Protocol& protocol) const - { - if (protocol.family() == PF_INET6) - return IPv6_Level; - return IPv4_Level; - } - - // Get the name of the socket option. - template - int name(const Protocol& protocol) const - { - if (protocol.family() == PF_INET6) - return IPv6_Name; - return IPv4_Name; - } - - // Get the address of the int data. - template - int* data(const Protocol&) - { - return &value_; - } - - // Get the address of the int data. - template - const int* data(const Protocol&) const - { - return &value_; - } - - // Get the size of the int data. - template - std::size_t size(const Protocol&) const - { - return sizeof(value_); - } - -private: - int value_; -}; - -// Helper template for implementing ip_mreq-based options. -template -class multicast_request -{ -public: - // Default constructor. - multicast_request() - { - ipv4_value_.imr_multiaddr.s_addr = - asio::detail::socket_ops::host_to_network_long( - asio::ip::address_v4::any().to_ulong()); - ipv4_value_.imr_interface.s_addr = - asio::detail::socket_ops::host_to_network_long( - asio::ip::address_v4::any().to_ulong()); - - asio::detail::in6_addr_type tmp_addr = IN6ADDR_ANY_INIT; - ipv6_value_.ipv6mr_multiaddr = tmp_addr; - ipv6_value_.ipv6mr_interface = 0; - } - - // Construct with multicast address only. - multicast_request(const asio::ip::address& multicast_address) - { - if (multicast_address.is_v6()) - { - ipv4_value_.imr_multiaddr.s_addr = - asio::detail::socket_ops::host_to_network_long( - asio::ip::address_v4::any().to_ulong()); - ipv4_value_.imr_interface.s_addr = - asio::detail::socket_ops::host_to_network_long( - asio::ip::address_v4::any().to_ulong()); - - using namespace std; // For memcpy. - asio::ip::address_v6 ipv6_address = multicast_address.to_v6(); - asio::ip::address_v6::bytes_type bytes = ipv6_address.to_bytes(); - memcpy(ipv6_value_.ipv6mr_multiaddr.s6_addr, bytes.elems, 16); - ipv6_value_.ipv6mr_interface = 0; - } - else - { - ipv4_value_.imr_multiaddr.s_addr = - asio::detail::socket_ops::host_to_network_long( - multicast_address.to_v4().to_ulong()); - ipv4_value_.imr_interface.s_addr = - asio::detail::socket_ops::host_to_network_long( - asio::ip::address_v4::any().to_ulong()); - - asio::detail::in6_addr_type tmp_addr = IN6ADDR_ANY_INIT; - ipv6_value_.ipv6mr_multiaddr = tmp_addr; - ipv6_value_.ipv6mr_interface = 0; - } - } - - // Construct with multicast address and IPv4 address specifying an interface. - multicast_request(const asio::ip::address_v4& multicast_address, - const asio::ip::address_v4& network_interface - = asio::ip::address_v4::any()) - { - ipv4_value_.imr_multiaddr.s_addr = - asio::detail::socket_ops::host_to_network_long( - multicast_address.to_ulong()); - ipv4_value_.imr_interface.s_addr = - asio::detail::socket_ops::host_to_network_long( - network_interface.to_ulong()); - - asio::detail::in6_addr_type tmp_addr = IN6ADDR_ANY_INIT; - ipv6_value_.ipv6mr_multiaddr = tmp_addr; - ipv6_value_.ipv6mr_interface = 0; - } - - // Construct with multicast address and IPv6 network interface index. - multicast_request(const asio::ip::address_v6& multicast_address, - unsigned long network_interface = 0) - { - ipv4_value_.imr_multiaddr.s_addr = - asio::detail::socket_ops::host_to_network_long( - asio::ip::address_v4::any().to_ulong()); - ipv4_value_.imr_interface.s_addr = - asio::detail::socket_ops::host_to_network_long( - asio::ip::address_v4::any().to_ulong()); - - using namespace std; // For memcpy. - asio::ip::address_v6::bytes_type bytes = - multicast_address.to_bytes(); - memcpy(ipv6_value_.ipv6mr_multiaddr.s6_addr, bytes.elems, 16); - ipv6_value_.ipv6mr_interface = network_interface; - } - - // Get the level of the socket option. - template - int level(const Protocol& protocol) const - { - if (protocol.family() == PF_INET6) - return IPv6_Level; - return IPv4_Level; - } - - // Get the name of the socket option. - template - int name(const Protocol& protocol) const - { - if (protocol.family() == PF_INET6) - return IPv6_Name; - return IPv4_Name; - } - - // Get the address of the option data. - template - void* data(const Protocol& protocol) - { - if (protocol.family() == PF_INET6) - return &ipv6_value_; - return &ipv4_value_; - } - - // Get the address of the option data. - template - const void* data(const Protocol& protocol) const - { - if (protocol.family() == PF_INET6) - return &ipv6_value_; - return &ipv4_value_; - } - - // Get the size of the option data. - template - std::size_t size(const Protocol& protocol) const - { - if (protocol.family() == PF_INET6) - return sizeof(ipv6_value_); - return sizeof(ipv4_value_); - } - -private: - asio::detail::in4_mreq_type ipv4_value_; - asio::detail::in6_mreq_type ipv6_value_; -}; - -// Helper template for implementing options that specify a network interface. -template -class network_interface -{ -public: - // Default constructor. - network_interface() - { - ipv4_value_.s_addr = - asio::detail::socket_ops::host_to_network_long( - asio::ip::address_v4::any().to_ulong()); - ipv6_value_ = 0; - } - - // Construct with IPv4 interface. - network_interface(const asio::ip::address_v4& ipv4_interface) - { - ipv4_value_.s_addr = - asio::detail::socket_ops::host_to_network_long( - ipv4_interface.to_ulong()); - ipv6_value_ = 0; - } - - // Construct with IPv6 interface. - network_interface(unsigned long ipv6_interface) - { - ipv4_value_.s_addr = - asio::detail::socket_ops::host_to_network_long( - asio::ip::address_v4::any().to_ulong()); - ipv6_value_ = ipv6_interface; - } - - // Get the level of the socket option. - template - int level(const Protocol& protocol) const - { - if (protocol.family() == PF_INET6) - return IPv6_Level; - return IPv4_Level; - } - - // Get the name of the socket option. - template - int name(const Protocol& protocol) const - { - if (protocol.family() == PF_INET6) - return IPv6_Name; - return IPv4_Name; - } - - // Get the address of the option data. - template - void* data(const Protocol& protocol) - { - if (protocol.family() == PF_INET6) - return &ipv6_value_; - return &ipv4_value_; - } - - // Get the address of the option data. - template - const void* data(const Protocol& protocol) const - { - if (protocol.family() == PF_INET6) - return &ipv6_value_; - return &ipv4_value_; - } - - // Get the size of the option data. - template - std::size_t size(const Protocol& protocol) const - { - if (protocol.family() == PF_INET6) - return sizeof(ipv6_value_); - return sizeof(ipv4_value_); - } - -private: - asio::detail::in4_addr_type ipv4_value_; - unsigned long ipv6_value_; -}; - -} // namespace socket_option -} // namespace detail -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_DETAIL_SOCKET_OPTION_HPP diff --git a/libtorrent/include/asio/ip/host_name.hpp b/libtorrent/include/asio/ip/host_name.hpp deleted file mode 100644 index 23c906a6a..000000000 --- a/libtorrent/include/asio/ip/host_name.hpp +++ /dev/null @@ -1,60 +0,0 @@ -// -// host_name.hpp -// ~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_HOST_NAME_HPP -#define ASIO_IP_HOST_NAME_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/error_handler.hpp" -#include "asio/detail/socket_ops.hpp" - -namespace asio { -namespace ip { - -/// Get the current host name. -std::string host_name(); - -/// Get the current host name. -template -std::string host_name(Error_Handler error_handler); - -inline std::string host_name() -{ - return host_name(asio::throw_error()); -} - -template -std::string host_name(Error_Handler error_handler) -{ - char name[1024]; - if (asio::detail::socket_ops::gethostname(name, sizeof(name)) != 0) - { - asio::error error(asio::detail::socket_ops::get_error()); - error_handler(error); - return std::string(); - } - return std::string(name); -} - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_HOST_NAME_HPP diff --git a/libtorrent/include/asio/ip/multicast.hpp b/libtorrent/include/asio/ip/multicast.hpp deleted file mode 100644 index 616e9020c..000000000 --- a/libtorrent/include/asio/ip/multicast.hpp +++ /dev/null @@ -1,181 +0,0 @@ -// -// multicast.hpp -// ~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_MULTICAST_HPP -#define ASIO_IP_MULTICAST_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/ip/detail/socket_option.hpp" - -namespace asio { -namespace ip { -namespace multicast { - -/// Socket option to join a multicast group on a specified interface. -/** - * Implements the IPPROTO_IP/IP_ADD_MEMBERSHIP socket option. - * - * @par Examples: - * Setting the option to join a multicast group: - * @code - * asio::ip::udp::socket socket(io_service); - * ... - * asio::ip::address multicast_address = - * asio::ip::address::from_string("225.0.0.1"); - * asio::ip::multicast::join_group option(multicast_address); - * socket.set_option(option); - * @endcode - * - * @par Concepts: - * Socket_Option, IP_MReq_Socket_Option. - */ -#if defined(GENERATING_DOCUMENTATION) -typedef implementation_defined join_group; -#else -typedef asio::ip::detail::socket_option::multicast_request< - IPPROTO_IP, IP_ADD_MEMBERSHIP, IPPROTO_IPV6, IPV6_JOIN_GROUP> join_group; -#endif - -/// Socket option to leave a multicast group on a specified interface. -/** - * Implements the IPPROTO_IP/IP_DROP_MEMBERSHIP socket option. - * - * @par Examples: - * Setting the option to leave a multicast group: - * @code - * asio::ip::udp::socket socket(io_service); - * ... - * asio::ip::address multicast_address = - * asio::ip::address::from_string("225.0.0.1"); - * asio::ip::multicast::leave_group option(multicast_address); - * socket.set_option(option); - * @endcode - * - * @par Concepts: - * Socket_Option, IP_MReq_Socket_Option. - */ -#if defined(GENERATING_DOCUMENTATION) -typedef implementation_defined leave_group; -#else -typedef asio::ip::detail::socket_option::multicast_request< - IPPROTO_IP, IP_DROP_MEMBERSHIP, IPPROTO_IPV6, IPV6_LEAVE_GROUP> leave_group; -#endif - -/// Socket option for local interface to use for outgoing multicast packets. -/** - * Implements the IPPROTO_IP/IP_MULTICAST_IF socket option. - * - * @par Examples: - * Setting the option: - * @code - * asio::ip::udp::socket socket(io_service); - * ... - * asio::ip::address_v4 local_interface = - * asio::ip::address_v4::from_string("1.2.3.4"); - * asio::ip::multicast::outbound_interface option(local_interface); - * socket.set_option(option); - * @endcode - * - * @par Concepts: - * Socket_Option, IP_Network_Interface_Socket_Option. - */ -#if defined(GENERATING_DOCUMENTATION) -typedef implementation_defined outbound_interface; -#else -typedef asio::ip::detail::socket_option::network_interface< - IPPROTO_IP, IP_MULTICAST_IF, IPPROTO_IPV6, IPV6_MULTICAST_IF> - outbound_interface; -#endif - -/// Socket option for time-to-live associated with outgoing multicast packets. -/** - * Implements the IPPROTO_IP/IP_MULTICAST_TTL socket option. - * - * @par Examples: - * Setting the option: - * @code - * asio::ip::udp::socket socket(io_service); - * ... - * asio::ip::multicast::hops option(4); - * socket.set_option(option); - * @endcode - * - * @par - * Getting the current option value: - * @code - * asio::ip::udp::socket socket(io_service); - * ... - * asio::ip::multicast::hops option; - * socket.get_option(option); - * int ttl = option.get(); - * @endcode - * - * @par Concepts: - * Socket_Option, Integer_Socket_Option. - */ -#if defined(GENERATING_DOCUMENTATION) -typedef implementation_defined hops; -#else -typedef asio::ip::detail::socket_option::integer< - IPPROTO_IP, IP_MULTICAST_TTL, IPPROTO_IPV6, IPV6_MULTICAST_HOPS> hops; -#endif - -/// Socket option determining whether outgoing multicast packets will be -/// received on the same socket if it is a member of the multicast group. -/** - * Implements the IPPROTO_IP/IP_MULTICAST_LOOP socket option. - * - * @par Examples: - * Setting the option: - * @code - * asio::ip::udp::socket socket(io_service); - * ... - * asio::ip::multicast::enable_loopback option(true); - * socket.set_option(option); - * @endcode - * - * @par - * Getting the current option value: - * @code - * asio::ip::udp::socket socket(io_service); - * ... - * asio::ip::multicast::enable_loopback option; - * socket.get_option(option); - * bool is_set = option.get(); - * @endcode - * - * @par Concepts: - * Socket_Option, Boolean_Socket_Option. - */ -#if defined(GENERATING_DOCUMENTATION) -typedef implementation_defined enable_loopback; -#else -typedef asio::ip::detail::socket_option::boolean< - IPPROTO_IP, IP_MULTICAST_LOOP, IPPROTO_IPV6, IPV6_MULTICAST_LOOP> - enable_loopback; -#endif - -} // namespace multicast -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_MULTICAST_HPP diff --git a/libtorrent/include/asio/ip/resolver_query_base.hpp b/libtorrent/include/asio/ip/resolver_query_base.hpp deleted file mode 100644 index a8c7ad6dc..000000000 --- a/libtorrent/include/asio/ip/resolver_query_base.hpp +++ /dev/null @@ -1,107 +0,0 @@ -// -// resolver_query_base.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_RESOLVER_QUERY_BASE_HPP -#define ASIO_IP_RESOLVER_QUERY_BASE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/detail/socket_types.hpp" - -namespace asio { -namespace ip { - -/// The resolver_query_base class is used as a base for the -/// basic_resolver_query class templates to provide a common place to define -/// the flag constants. -class resolver_query_base -{ -public: -#if defined(GENERATING_DOCUMENTATION) - /// Determine the canonical name of the host specified in the query. - static const int canonical_name = implementation_defined; - - /// Indicate that returned endpoint is intended for use as a locally bound - /// socket endpoint. - static const int passive = implementation_defined; - - /// Host name should be treated as a numeric string defining an IPv4 or IPv6 - /// address and no name resolution should be attempted. - static const int numeric_host = implementation_defined; - - /// Service name should be treated as a numeric string defining a port number - /// and no name resolution should be attempted. - static const int numeric_service = implementation_defined; - - /// If the query protocol family is specified as IPv6, return IPv4-mapped - /// IPv6 addresses on finding no IPv6 addresses. - static const int v4_mapped = implementation_defined; - - /// If used with v4_mapped, return all matching IPv6 and IPv4 addresses. - static const int all_matching = implementation_defined; - - /// Only return IPv4 addresses if a non-loopback IPv4 address is configured - /// for the system. Only return IPv6 addresses if a non-loopback IPv6 address - /// is configured for the system. - static const int address_configured = implementation_defined; -#else - BOOST_STATIC_CONSTANT(int, canonical_name = AI_CANONNAME); - BOOST_STATIC_CONSTANT(int, passive = AI_PASSIVE); - BOOST_STATIC_CONSTANT(int, numeric_host = AI_NUMERICHOST); -# if defined(AI_NUMERICSERV) - BOOST_STATIC_CONSTANT(int, numeric_service = AI_NUMERICSERV); -# else - BOOST_STATIC_CONSTANT(int, numeric_service = 0); -# endif -# if defined(AI_V4MAPPED) - BOOST_STATIC_CONSTANT(int, v4_mapped = AI_V4MAPPED); -# else - BOOST_STATIC_CONSTANT(int, v4_mapped = 0); -# endif -# if defined(AI_ALL) - BOOST_STATIC_CONSTANT(int, all_matching = AI_ALL); -# else - BOOST_STATIC_CONSTANT(int, all_matching = 0); -# endif -# if defined(AI_ADDRCONFIG) - BOOST_STATIC_CONSTANT(int, address_configured = AI_ADDRCONFIG); -# else - BOOST_STATIC_CONSTANT(int, address_configured = 0); -# endif -#endif - -protected: - /// Protected destructor to prevent deletion through this type. - ~resolver_query_base() - { - } - -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -private: - // Workaround to enable the empty base optimisation with Borland C++. - char dummy_; -#endif -}; - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_RESOLVER_QUERY_BASE_HPP diff --git a/libtorrent/include/asio/ip/tcp.hpp b/libtorrent/include/asio/ip/tcp.hpp deleted file mode 100644 index 92532f12e..000000000 --- a/libtorrent/include/asio/ip/tcp.hpp +++ /dev/null @@ -1,146 +0,0 @@ -// -// tcp.hpp -// ~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_TCP_HPP -#define ASIO_IP_TCP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/basic_resolver.hpp" -#include "asio/basic_socket_acceptor.hpp" -#include "asio/basic_socket_iostream.hpp" -#include "asio/basic_stream_socket.hpp" -#include "asio/ip/basic_endpoint.hpp" -#include "asio/ip/basic_resolver_iterator.hpp" -#include "asio/ip/basic_resolver_query.hpp" -#include "asio/detail/socket_option.hpp" -#include "asio/detail/socket_types.hpp" - -namespace asio { -namespace ip { - -/// Encapsulates the flags needed for TCP. -/** - * The asio::ip::tcp class contains flags necessary for TCP sockets. - * - * @par Thread Safety: - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Safe. - * - * @par Concepts: - * Protocol. - */ -class tcp -{ -public: - /// The type of a TCP endpoint. - typedef basic_endpoint endpoint; - - /// The type of a resolver query. - typedef basic_resolver_query resolver_query; - - /// The type of a resolver iterator. - typedef basic_resolver_iterator resolver_iterator; - - /// Construct to represent the IPv4 TCP protocol. - static tcp v4() - { - return tcp(PF_INET); - } - - /// Construct to represent the IPv4 TCP protocol. - static tcp v6() - { - return tcp(PF_INET6); - } - - /// Obtain an identifier for the type of the protocol. - int type() const - { - return SOCK_STREAM; - } - - /// Obtain an identifier for the protocol. - int protocol() const - { - return IPPROTO_TCP; - } - - /// Obtain an identifier for the protocol family. - int family() const - { - return family_; - } - - /// The TCP socket type. - typedef basic_stream_socket socket; - - /// The TCP acceptor type. - typedef basic_socket_acceptor acceptor; - - /// The TCP resolver type. - typedef basic_resolver resolver; - - /// The TCP iostream type. - typedef basic_socket_iostream iostream; - - /// Socket option for disabling the Nagle algorithm. - /** - * Implements the IPPROTO_TCP/TCP_NODELAY socket option. - * - * @par Examples: - * Setting the option: - * @code - * asio::ipv6::tcp::socket socket(io_service); - * ... - * asio::ipv6::tcp::no_delay option(true); - * socket.set_option(option); - * @endcode - * - * @par - * Getting the current option value: - * @code - * asio::ipv6::tcp::socket socket(io_service); - * ... - * asio::ipv6::tcp::no_delay option; - * socket.get_option(option); - * bool is_set = option.get(); - * @endcode - * - * @par Concepts: - * Socket_Option, Boolean_Socket_Option. - */ -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined no_delay; -#else - typedef asio::detail::socket_option::boolean< - IPPROTO_TCP, TCP_NODELAY> no_delay; -#endif - -private: - // Construct with a specific family. - explicit tcp(int family) - : family_(family) - { - } - - int family_; -}; - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_TCP_HPP diff --git a/libtorrent/include/asio/ip/udp.hpp b/libtorrent/include/asio/ip/udp.hpp deleted file mode 100644 index 7cc822615..000000000 --- a/libtorrent/include/asio/ip/udp.hpp +++ /dev/null @@ -1,104 +0,0 @@ -// -// udp.hpp -// ~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IP_UDP_HPP -#define ASIO_IP_UDP_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/basic_datagram_socket.hpp" -#include "asio/basic_resolver.hpp" -#include "asio/ip/basic_endpoint.hpp" -#include "asio/ip/basic_resolver_iterator.hpp" -#include "asio/ip/basic_resolver_query.hpp" -#include "asio/detail/socket_types.hpp" - -namespace asio { -namespace ip { - -/// Encapsulates the flags needed for UDP. -/** - * The asio::ip::udp class contains flags necessary for UDP sockets. - * - * @par Thread Safety: - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Safe. - * - * @par Concepts: - * Protocol. - */ -class udp -{ -public: - /// The type of a UDP endpoint. - typedef basic_endpoint endpoint; - - /// The type of a resolver query. - typedef basic_resolver_query resolver_query; - - /// The type of a resolver iterator. - typedef basic_resolver_iterator resolver_iterator; - - /// Construct to represent the IPv4 UDP protocol. - static udp v4() - { - return udp(PF_INET); - } - - /// Construct to represent the IPv4 UDP protocol. - static udp v6() - { - return udp(PF_INET6); - } - - /// Obtain an identifier for the type of the protocol. - int type() const - { - return SOCK_DGRAM; - } - - /// Obtain an identifier for the protocol. - int protocol() const - { - return IPPROTO_UDP; - } - - /// Obtain an identifier for the protocol family. - int family() const - { - return family_; - } - - /// The IPv4 UDP socket type. - typedef basic_datagram_socket socket; - - /// The UDP resolver type. - typedef basic_resolver resolver; - -private: - // Construct with a specific family. - explicit udp(int family) - : family_(family) - { - } - - int family_; -}; - -} // namespace ip -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IP_UDP_HPP diff --git a/libtorrent/include/asio/is_read_buffered.hpp b/libtorrent/include/asio/is_read_buffered.hpp deleted file mode 100644 index 7c9c2b70f..000000000 --- a/libtorrent/include/asio/is_read_buffered.hpp +++ /dev/null @@ -1,62 +0,0 @@ -// -// is_read_buffered.hpp -// ~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IS_READ_BUFFERED_HPP -#define ASIO_IS_READ_BUFFERED_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/buffered_read_stream_fwd.hpp" -#include "asio/buffered_stream_fwd.hpp" - -namespace asio { - -namespace detail { - -template -char is_read_buffered_helper(buffered_stream* s); - -template -char is_read_buffered_helper(buffered_read_stream* s); - -struct is_read_buffered_big_type { char data[10]; }; -is_read_buffered_big_type is_read_buffered_helper(...); - -} // namespace detail - -/// The is_read_buffered class is a traits class that may be used to determine -/// whether a stream type supports buffering of read data. -template -class is_read_buffered -{ -public: -#if defined(GENERATING_DOCUMENTATION) - /// The value member is true only if the Stream type supports buffering of - /// read data. - static const bool value; -#else - BOOST_STATIC_CONSTANT(bool, - value = sizeof(detail::is_read_buffered_helper((Stream*)0)) == 1); -#endif -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IS_READ_BUFFERED_HPP diff --git a/libtorrent/include/asio/is_write_buffered.hpp b/libtorrent/include/asio/is_write_buffered.hpp deleted file mode 100644 index d0221180d..000000000 --- a/libtorrent/include/asio/is_write_buffered.hpp +++ /dev/null @@ -1,62 +0,0 @@ -// -// is_write_buffered.hpp -// ~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_IS_WRITE_BUFFERED_HPP -#define ASIO_IS_WRITE_BUFFERED_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/buffered_stream_fwd.hpp" -#include "asio/buffered_write_stream_fwd.hpp" - -namespace asio { - -namespace detail { - -template -char is_write_buffered_helper(buffered_stream* s); - -template -char is_write_buffered_helper(buffered_write_stream* s); - -struct is_write_buffered_big_type { char data[10]; }; -is_write_buffered_big_type is_write_buffered_helper(...); - -} // namespace detail - -/// The is_write_buffered class is a traits class that may be used to determine -/// whether a stream type supports buffering of written data. -template -class is_write_buffered -{ -public: -#if defined(GENERATING_DOCUMENTATION) - /// The value member is true only if the Stream type supports buffering of - /// written data. - static const bool value; -#else - BOOST_STATIC_CONSTANT(bool, - value = sizeof(detail::is_write_buffered_helper((Stream*)0)) == 1); -#endif -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_IS_WRITE_BUFFERED_HPP diff --git a/libtorrent/include/asio/placeholders.hpp b/libtorrent/include/asio/placeholders.hpp deleted file mode 100644 index 04727d786..000000000 --- a/libtorrent/include/asio/placeholders.hpp +++ /dev/null @@ -1,80 +0,0 @@ -// -// placeholders.hpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_ARG_HPP -#define ASIO_ARG_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -namespace asio { - -namespace placeholders { - -namespace { - -#if defined(__BORLANDC__) - -static inline boost::arg<1> error() -{ - return boost::arg<1>(); -} - -static inline boost::arg<2> bytes_transferred() -{ - return boost::arg<2>(); -} - -static inline boost::arg<2> iterator() -{ - return boost::arg<2>(); -} - -#elif defined(_MSC_VER) && (_MSC_VER < 1400) - -static boost::arg<1> error; -static boost::arg<2> bytes_transferred; -static boost::arg<2> iterator; - -#else - -/// An argument placeholder, for use with @ref boost_bind, that corresponds to -/// the error argument of a handler for any of the asynchronous functions. -boost::arg<1> error; - -/// An argument placeholder, for use with @ref boost_bind, that corresponds to -/// the bytes_transferred argument of a handler for asynchronous functions such -/// as asio::basic_stream_socket::async_write_some or -/// asio::async_write. -boost::arg<2> bytes_transferred; - -/// An argument placeholder, for use with @ref boost_bind, that corresponds to -/// the iterator argument of a handler for asynchronous functions such as -/// asio::basic_resolver::resolve. -boost::arg<2> iterator; - -#endif - -} // namespace - -} // namespace placeholders - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_ARG_HPP diff --git a/libtorrent/include/asio/read.hpp b/libtorrent/include/asio/read.hpp deleted file mode 100644 index 612dfcae8..000000000 --- a/libtorrent/include/asio/read.hpp +++ /dev/null @@ -1,547 +0,0 @@ -// -// read.hpp -// ~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_READ_HPP -#define ASIO_READ_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/basic_streambuf.hpp" - -namespace asio { - -/** - * @defgroup read asio::read - */ -/*@{*/ - -/// Attempt to read a certain amount of data from a stream before returning. -/** - * This function is used to read a certain number of bytes of data from a - * stream. The call will block until one of the following conditions is true: - * - * @li The supplied buffers are full. That is, the bytes transferred is equal to - * the sum of the buffer sizes. - * - * @li An error occurred. - * - * This operation is implemented in terms of one or more calls to the stream's - * read_some function. - * - * @param s The stream from which the data is to be read. The type must support - * the Sync_Read_Stream concept. - * - * @param buffers One or more buffers into which the data will be read. The sum - * of the buffer sizes indicates the maximum number of bytes to read from the - * stream. - * - * @returns The number of bytes transferred. - * - * @throws Sync_Read_Stream::error_type Thrown on failure. - * - * @par Example: - * To read into a single data buffer use the @ref buffer function as follows: - * @code asio::read(s, asio::buffer(data, size)); @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - * - * @note This overload is equivalent to calling: - * @code asio::read( - * s, buffers, - * asio::transfer_all(), - * asio::throw_error()); @endcode - */ -template -std::size_t read(Sync_Read_Stream& s, const Mutable_Buffers& buffers); - -/// Attempt to read a certain amount of data from a stream before returning. -/** - * This function is used to read a certain number of bytes of data from a - * stream. The call will block until one of the following conditions is true: - * - * @li The supplied buffers are full. That is, the bytes transferred is equal to - * the sum of the buffer sizes. - * - * @li The completion_condition function object returns true. - * - * This operation is implemented in terms of one or more calls to the stream's - * read_some function. - * - * @param s The stream from which the data is to be read. The type must support - * the Sync_Read_Stream concept. - * - * @param buffers One or more buffers into which the data will be read. The sum - * of the buffer sizes indicates the maximum number of bytes to read from the - * stream. - * - * @param completion_condition The function object to be called to determine - * whether the read operation is complete. The signature of the function object - * must be: - * @code bool completion_condition( - * const Sync_Read_Stream::error_type& error, // Result of latest read_some - * // operation. - * - * std::size_t bytes_transferred // Number of bytes transferred - * // so far. - * ); @endcode - * A return value of true indicates that the read operation is complete. False - * indicates that further calls to the stream's read_some function are required. - * - * @returns The number of bytes transferred. - * - * @throws Sync_Read_Stream::error_type Thrown on failure. - * - * @par Example: - * To read into a single data buffer use the @ref buffer function as follows: - * @code asio::read(s, asio::buffer(data, size), - * asio::transfer_at_least(32)); @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - * - * @note This overload is equivalent to calling: - * @code asio::read( - * s, buffers, completion_condition, - * asio::throw_error()); @endcode - */ -template -std::size_t read(Sync_Read_Stream& s, const Mutable_Buffers& buffers, - Completion_Condition completion_condition); - -/// Attempt to read a certain amount of data from a stream before returning. -/** - * This function is used to read a certain number of bytes of data from a - * stream. The call will block until one of the following conditions is true: - * - * @li The supplied buffers are full. That is, the bytes transferred is equal to - * the sum of the buffer sizes. - * - * @li The completion_condition function object returns true. - * - * This operation is implemented in terms of one or more calls to the stream's - * read_some function. - * - * @param s The stream from which the data is to be read. The type must support - * the Sync_Read_Stream concept. - * - * @param buffers One or more buffers into which the data will be read. The sum - * of the buffer sizes indicates the maximum number of bytes to read from the - * stream. - * - * @param completion_condition The function object to be called to determine - * whether the read operation is complete. The signature of the function object - * must be: - * @code bool completion_condition( - * const Sync_Read_Stream::error_type& error, // Result of latest read_some - * // operation. - * - * std::size_t bytes_transferred // Number of bytes transferred - * // so far. - * ); @endcode - * A return value of true indicates that the read operation is complete. False - * indicates that further calls to the stream's read_some function are required. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const Sync_Read_Stream::error_type& error // Result of operation. - * ); @endcode - * The error handler is only called if the completion_condition indicates that - * the operation is complete. - * - * @returns The number of bytes read. If an error occurs, and the error handler - * does not throw an exception, returns the total number of bytes successfully - * transferred prior to the error. - */ -template -std::size_t read(Sync_Read_Stream& s, const Mutable_Buffers& buffers, - Completion_Condition completion_condition, Error_Handler error_handler); - -/// Attempt to read a certain amount of data from a stream before returning. -/** - * This function is used to read a certain number of bytes of data from a - * stream. The call will block until one of the following conditions is true: - * - * @li An error occurred. - * - * This operation is implemented in terms of one or more calls to the stream's - * read_some function. - * - * @param s The stream from which the data is to be read. The type must support - * the Sync_Read_Stream concept. - * - * @param b The basic_streambuf object into which the data will be read. - * - * @returns The number of bytes transferred. - * - * @throws Sync_Read_Stream::error_type Thrown on failure. - * - * @note This overload is equivalent to calling: - * @code asio::read( - * s, b, - * asio::transfer_all(), - * asio::throw_error()); @endcode - */ -template -std::size_t read(Sync_Read_Stream& s, basic_streambuf& b); - -/// Attempt to read a certain amount of data from a stream before returning. -/** - * This function is used to read a certain number of bytes of data from a - * stream. The call will block until one of the following conditions is true: - * - * @li The completion_condition function object returns true. - * - * This operation is implemented in terms of one or more calls to the stream's - * read_some function. - * - * @param s The stream from which the data is to be read. The type must support - * the Sync_Read_Stream concept. - * - * @param b The basic_streambuf object into which the data will be read. - * - * @param completion_condition The function object to be called to determine - * whether the read operation is complete. The signature of the function object - * must be: - * @code bool completion_condition( - * const Sync_Read_Stream::error_type& error, // Result of latest read_some - * // operation. - * - * std::size_t bytes_transferred // Number of bytes transferred - * // so far. - * ); @endcode - * A return value of true indicates that the read operation is complete. False - * indicates that further calls to the stream's read_some function are required. - * - * @returns The number of bytes transferred. - * - * @throws Sync_Read_Stream::error_type Thrown on failure. - * - * @note This overload is equivalent to calling: - * @code asio::read( - * s, b, completion_condition, - * asio::throw_error()); @endcode - */ -template -std::size_t read(Sync_Read_Stream& s, basic_streambuf& b, - Completion_Condition completion_condition); - -/// Attempt to read a certain amount of data from a stream before returning. -/** - * This function is used to read a certain number of bytes of data from a - * stream. The call will block until one of the following conditions is true: - * - * @li The completion_condition function object returns true. - * - * This operation is implemented in terms of one or more calls to the stream's - * read_some function. - * - * @param s The stream from which the data is to be read. The type must support - * the Sync_Read_Stream concept. - * - * @param b The basic_streambuf object into which the data will be read. - * - * @param completion_condition The function object to be called to determine - * whether the read operation is complete. The signature of the function object - * must be: - * @code bool completion_condition( - * const Sync_Read_Stream::error_type& error, // Result of latest read_some - * // operation. - * - * std::size_t bytes_transferred // Number of bytes transferred - * // so far. - * ); @endcode - * A return value of true indicates that the read operation is complete. False - * indicates that further calls to the stream's read_some function are required. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const Sync_Read_Stream::error_type& error // Result of operation. - * ); @endcode - * The error handler is only called if the completion_condition indicates that - * the operation is complete. - * - * @returns The number of bytes read. If an error occurs, and the error handler - * does not throw an exception, returns the total number of bytes successfully - * transferred prior to the error. - */ -template -std::size_t read(Sync_Read_Stream& s, basic_streambuf& b, - Completion_Condition completion_condition, Error_Handler error_handler); - -/*@}*/ -/** - * @defgroup async_read asio::async_read - */ -/*@{*/ - -/// Start an asynchronous operation to read a certain amount of data from a -/// stream. -/** - * This function is used to asynchronously read a certain number of bytes of - * data from a stream. The function call always returns immediately. The - * asynchronous operation will continue until one of the following conditions is - * true: - * - * @li The supplied buffers are full. That is, the bytes transferred is equal to - * the sum of the buffer sizes. - * - * @li An error occurred. - * - * This operation is implemented in terms of one or more calls to the stream's - * async_read_some function. - * - * @param s The stream from which the data is to be read. The type must support - * the Async_Read_Stream concept. - * - * @param buffers One or more buffers into which the data will be read. The sum - * of the buffer sizes indicates the maximum number of bytes to read from the - * stream. Although the buffers object may be copied as necessary, ownership of - * the underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * const Async_Read_Stream::error_type& error, // Result of operation. - * - * std::size_t bytes_transferred // Number of bytes copied into - * // the buffers. If an error - * // occurred, this will be the - * // number of bytes successfully - * // transferred prior to the - * // error. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - * - * @par Example: - * To read into a single data buffer use the @ref buffer function as follows: - * @code - * asio::async_read(s, asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - * - * @note This overload is equivalent to calling: - * @code asio::async_read( - * s, buffers, - * asio::transfer_all(), - * handler); @endcode - */ -template -void async_read(Async_Read_Stream& s, const Mutable_Buffers& buffers, - Handler handler); - -/// Start an asynchronous operation to read a certain amount of data from a -/// stream. -/** - * This function is used to asynchronously read a certain number of bytes of - * data from a stream. The function call always returns immediately. The - * asynchronous operation will continue until one of the following conditions is - * true: - * - * @li The supplied buffers are full. That is, the bytes transferred is equal to - * the sum of the buffer sizes. - * - * @li The completion_condition function object returns true. - * - * @param s The stream from which the data is to be read. The type must support - * the Async_Read_Stream concept. - * - * @param buffers One or more buffers into which the data will be read. The sum - * of the buffer sizes indicates the maximum number of bytes to read from the - * stream. Although the buffers object may be copied as necessary, ownership of - * the underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param completion_condition The function object to be called to determine - * whether the read operation is complete. The signature of the function object - * must be: - * @code bool completion_condition( - * const Async_Read_Stream::error_type& error, // Result of latest read_some - * // operation. - * - * std::size_t bytes_transferred // Number of bytes transferred - * // so far. - * ); @endcode - * A return value of true indicates that the read operation is complete. False - * indicates that further calls to the stream's async_read_some function are - * required. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * const Async_Read_Stream::error_type& error, // Result of operation. - * - * std::size_t bytes_transferred // Number of bytes copied into - * // the buffers. If an error - * // occurred, this will be the - * // number of bytes successfully - * // transferred prior to the - * // error. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - * - * @par Example: - * To read into a single data buffer use the @ref buffer function as follows: - * @code asio::async_read(s, - * asio::buffer(data, size), - * asio::transfer_at_least(32), - * handler); @endcode - * See the @ref buffer documentation for information on reading into multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ -template -void async_read(Async_Read_Stream& s, const Mutable_Buffers& buffers, - Completion_Condition completion_condition, Handler handler); - -/// Start an asynchronous operation to read a certain amount of data from a -/// stream. -/** - * This function is used to asynchronously read a certain number of bytes of - * data from a stream. The function call always returns immediately. The - * asynchronous operation will continue until one of the following conditions is - * true: - * - * @li An error occurred. - * - * @param s The stream from which the data is to be read. The type must support - * the Async_Read_Stream concept. - * - * This operation is implemented in terms of one or more calls to the stream's - * async_read_some function. - * - * @param b A basic_streambuf object into which the data will be read. Ownership - * of the streambuf is retained by the caller, which must guarantee that it - * remains valid until the handler is called. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * const Async_Read_Stream::error_type& error, // Result of operation. - * - * std::size_t bytes_transferred // Number of bytes copied into - * // the buffers. If an error - * // occurred, this will be the - * // number of bytes successfully - * // transferred prior to the - * // error. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - * - * @note This overload is equivalent to calling: - * @code asio::async_read( - * s, b, - * asio::transfer_all(), - * handler); @endcode - */ -template -void async_read(Async_Read_Stream& s, basic_streambuf& b, - Handler handler); - -/// Start an asynchronous operation to read a certain amount of data from a -/// stream. -/** - * This function is used to asynchronously read a certain number of bytes of - * data from a stream. The function call always returns immediately. The - * asynchronous operation will continue until one of the following conditions is - * true: - * - * @li The completion_condition function object returns true. - * - * This operation is implemented in terms of one or more calls to the stream's - * async_read_some function. - * - * @param s The stream from which the data is to be read. The type must support - * the Async_Read_Stream concept. - * - * @param b A basic_streambuf object into which the data will be read. Ownership - * of the streambuf is retained by the caller, which must guarantee that it - * remains valid until the handler is called. - * - * @param completion_condition The function object to be called to determine - * whether the read operation is complete. The signature of the function object - * must be: - * @code bool completion_condition( - * const Async_Read_Stream::error_type& error, // Result of latest read_some - * // operation. - * - * std::size_t bytes_transferred // Number of bytes transferred - * // so far. - * ); @endcode - * A return value of true indicates that the read operation is complete. False - * indicates that further calls to the stream's async_read_some function are - * required. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * const Async_Read_Stream::error_type& error, // Result of operation. - * - * std::size_t bytes_transferred // Number of bytes copied into - * // the buffers. If an error - * // occurred, this will be the - * // number of bytes successfully - * // transferred prior to the - * // error. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - */ -template -void async_read(Async_Read_Stream& s, basic_streambuf& b, - Completion_Condition completion_condition, Handler handler); - -/*@}*/ - -} // namespace asio - -#include "asio/impl/read.ipp" - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_READ_HPP diff --git a/libtorrent/include/asio/read_until.hpp b/libtorrent/include/asio/read_until.hpp deleted file mode 100644 index 473b02613..000000000 --- a/libtorrent/include/asio/read_until.hpp +++ /dev/null @@ -1,487 +0,0 @@ -// -// read_until.hpp -// ~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_READ_UNTIL_HPP -#define ASIO_READ_UNTIL_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/basic_streambuf.hpp" - -namespace asio { - -/** - * @defgroup read_until asio::read_until - */ -/*@{*/ - -/// Read data into a streambuf until a delimiter is encountered. -/** - * This function is used to read data into the specified streambuf until the - * streambuf's get area contains the specified delimiter. The call will block - * until one of the following conditions is true: - * - * @li The get area of the streambuf contains the specified delimiter. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. If the streambuf's get area already contains the - * delimiter, the function returns immediately. - * - * @param s The stream from which the data is to be read. The type must support - * the Sync_Read_Stream concept. - * - * @param b A streambuf object into which the data will be read. - * - * @param delim The delimiter character. - * - * @returns The number of bytes in the streambuf's get area up to and including - * the delimiter. - * - * @throws Sync_Read_Stream::error_type Thrown on failure. - * - * @par Example: - * To read data into a streambuf until a newline is encountered: - * @code asio::streambuf b; - * asio::read_until(s, b, '\n'); - * std::istream is(&b); - * std::string line; - * std::getline(is, line); @endcode - * - * @note This overload is equivalent to calling: - * @code asio::read_until( - * s, b, delim, - * asio::throw_error()); @endcode - */ -template -std::size_t read_until(Sync_Read_Stream& s, - asio::basic_streambuf& b, char delim); - -/// Read data into a streambuf until a delimiter is encountered. -/** - * This function is used to read data into the specified streambuf until the - * streambuf's get area contains the specified delimiter. The call will block - * until one of the following conditions is true: - * - * @li The get area of the streambuf contains the specified delimiter. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. If the streambuf's get area already contains the - * delimiter, the function returns immediately. - * - * @param s The stream from which the data is to be read. The type must support - * the Sync_Read_Stream concept. - * - * @param b A streambuf object into which the data will be read. - * - * @param delim The delimiter character. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const Sync_Read_Stream::error_type& error // Result of operation. - * ); @endcode - * The error handler is only called if the completion_condition indicates that - * the operation is complete. - * - * @returns The number of bytes in the streambuf's get area up to and including - * the delimiter. Returns 0 if an error occurred and the error handler did not - * throw an exception. - */ -template -std::size_t read_until(Sync_Read_Stream& s, - asio::basic_streambuf& b, char delim, - Error_Handler error_handler); - -/// Read data into a streambuf until a delimiter is encountered. -/** - * This function is used to read data into the specified streambuf until the - * streambuf's get area contains the specified delimiter. The call will block - * until one of the following conditions is true: - * - * @li The get area of the streambuf contains the specified delimiter. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. If the streambuf's get area already contains the - * delimiter, the function returns immediately. - * - * @param s The stream from which the data is to be read. The type must support - * the Sync_Read_Stream concept. - * - * @param b A streambuf object into which the data will be read. - * - * @param delim The delimiter string. - * - * @returns The number of bytes in the streambuf's get area up to and including - * the delimiter. - * - * @throws Sync_Read_Stream::error_type Thrown on failure. - * - * @par Example: - * To read data into a streambuf until a newline is encountered: - * @code asio::streambuf b; - * asio::read_until(s, b, "\r\n"); - * std::istream is(&b); - * std::string line; - * std::getline(is, line); @endcode - * - * @note This overload is equivalent to calling: - * @code asio::read_until( - * s, b, delim, - * asio::throw_error()); @endcode - */ -template -std::size_t read_until(Sync_Read_Stream& s, - asio::basic_streambuf& b, const std::string& delim); - -/// Read data into a streambuf until a delimiter is encountered. -/** - * This function is used to read data into the specified streambuf until the - * streambuf's get area contains the specified delimiter. The call will block - * until one of the following conditions is true: - * - * @li The get area of the streambuf contains the specified delimiter. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. If the streambuf's get area already contains the - * delimiter, the function returns immediately. - * - * @param s The stream from which the data is to be read. The type must support - * the Sync_Read_Stream concept. - * - * @param b A streambuf object into which the data will be read. - * - * @param delim The delimiter string. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const Sync_Read_Stream::error_type& error // Result of operation. - * ); @endcode - * The error handler is only called if the completion_condition indicates that - * the operation is complete. - * - * @returns The number of bytes in the streambuf's get area up to and including - * the delimiter. Returns 0 if an error occurred and the error handler did not - * throw an exception. - */ -template -std::size_t read_until(Sync_Read_Stream& s, - asio::basic_streambuf& b, const std::string& delim, - Error_Handler error_handler); - -/// Read data into a streambuf until a regular expression is located. -/** - * This function is used to read data into the specified streambuf until the - * streambuf's get area contains some data that matches a regular expression. - * The call will block until one of the following conditions is true: - * - * @li A substring of the streambuf's get area matches the regular expression. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. If the streambuf's get area already contains data that - * matches the regular expression, the function returns immediately. - * - * @param s The stream from which the data is to be read. The type must support - * the Sync_Read_Stream concept. - * - * @param b A streambuf object into which the data will be read. - * - * @param expr The regular expression. - * - * @returns The number of bytes in the streambuf's get area up to and including - * the substring that matches the regular expression. - * - * @throws Sync_Read_Stream::error_type Thrown on failure. - * - * @par Example: - * To read data into a streambuf until a CR-LF sequence is encountered: - * @code asio::streambuf b; - * asio::read_until(s, b, boost::regex("\r\n")); - * std::istream is(&b); - * std::string line; - * std::getline(is, line); @endcode - * - * @note This overload is equivalent to calling: - * @code asio::read_until( - * s, b, expr, - * asio::throw_error()); @endcode - */ -template -std::size_t read_until(Sync_Read_Stream& s, - asio::basic_streambuf& b, const boost::regex& expr); - -/// Read data into a streambuf until a regular expression is located. -/** - * This function is used to read data into the specified streambuf until the - * streambuf's get area contains some data that matches a regular expression. - * The call will block until one of the following conditions is true: - * - * @li A substring of the streambuf's get area matches the regular expression. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * read_some function. If the streambuf's get area already contains data that - * matches the regular expression, the function returns immediately. - * - * @param s The stream from which the data is to be read. The type must support - * the Sync_Read_Stream concept. - * - * @param b A streambuf object into which the data will be read. - * - * @param expr The regular expression. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const Sync_Read_Stream::error_type& error // Result of operation. - * ); @endcode - * The error handler is only called if the completion_condition indicates that - * the operation is complete. - * - * @returns The number of bytes in the streambuf's get area up to and including -* the substring that matches the regular expression. -*/ -template -std::size_t read_until(Sync_Read_Stream& s, - asio::basic_streambuf& b, const boost::regex& expr, - Error_Handler error_handler); - -/*@}*/ -/** -* @defgroup async_read_until asio::async_read_until -*/ -/*@{*/ - -/// Start an asynchronous operation to read data into a streambuf until a -/// delimiter is encountered. -/** - * This function is used to asynchronously read data into the specified - * streambuf until the streambuf's get area contains the specified delimiter. - * The function call always returns immediately. The asynchronous operation - * will continue until one of the following conditions is true: - * - * @li The get area of the streambuf contains the specified delimiter. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * async_read_some function. If the streambuf's get area already contains the - * delimiter, the asynchronous operation completes immediately. - * - * @param s The stream from which the data is to be read. The type must support - * the Async_Read_Stream concept. - * - * @param b A streambuf object into which the data will be read. Ownership of - * the streambuf is retained by the caller, which must guarantee that it remains - * valid until the handler is called. - * - * @param delim The delimiter character. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * const Async_Read_Stream::error_type& error, // Result of operation. - * - * std::size_t bytes_transferred // The number of bytes in the - * // streambuf's get area up to - * // and including the delimiter. - * // 0 if an error occurred. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - * - * @par Example: - * To asynchronously read data into a streambuf until a newline is encountered: - * @code asio::streambuf b; - * ... - * void handler(const asio::error& e, std::size_t size) - * { - * if (!e) - * { - * std::istream is(&b); - * std::string line; - * std::getline(is, line); - * ... - * } - * } - * ... - * asio::async_read_until(s, b, '\n', handler); @endcode - */ -template -void async_read_until(Async_Read_Stream& s, - asio::basic_streambuf& b, char delim, Handler handler); - -/// Start an asynchronous operation to read data into a streambuf until a -/// delimiter is encountered. -/** - * This function is used to asynchronously read data into the specified - * streambuf until the streambuf's get area contains the specified delimiter. - * The function call always returns immediately. The asynchronous operation - * will continue until one of the following conditions is true: - * - * @li The get area of the streambuf contains the specified delimiter. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * async_read_some function. If the streambuf's get area already contains the - * delimiter, the asynchronous operation completes immediately. - * - * @param s The stream from which the data is to be read. The type must support - * the Async_Read_Stream concept. - * - * @param b A streambuf object into which the data will be read. Ownership of - * the streambuf is retained by the caller, which must guarantee that it remains - * valid until the handler is called. - * - * @param delim The delimiter string. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * const Async_Read_Stream::error_type& error, // Result of operation. - * - * std::size_t bytes_transferred // The number of bytes in the - * // streambuf's get area up to - * // and including the delimiter. - * // 0 if an error occurred. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - * - * @par Example: - * To asynchronously read data into a streambuf until a newline is encountered: - * @code asio::streambuf b; - * ... - * void handler(const asio::error& e, std::size_t size) - * { - * if (!e) - * { - * std::istream is(&b); - * std::string line; - * std::getline(is, line); - * ... - * } - * } - * ... - * asio::async_read_until(s, b, "\r\n", handler); @endcode - */ -template -void async_read_until(Async_Read_Stream& s, - asio::basic_streambuf& b, const std::string& delim, - Handler handler); - -/// Start an asynchronous operation to read data into a streambuf until a -/// regular expression is located. -/** - * This function is used to asynchronously read data into the specified - * streambuf until the streambuf's get area contains some data that matches a - * regular expression. The function call always returns immediately. The - * asynchronous operation will continue until one of the following conditions - * is true: - * - * @li A substring of the streambuf's get area matches the regular expression. - * - * @li An error occurred. - * - * This operation is implemented in terms of zero or more calls to the stream's - * async_read_some function. If the streambuf's get area already contains data - * that matches the regular expression, the function returns immediately. - * - * @param s The stream from which the data is to be read. The type must support - * the Async_Read_Stream concept. - * - * @param b A streambuf object into which the data will be read. Ownership of - * the streambuf is retained by the caller, which must guarantee that it remains - * valid until the handler is called. - * - * @param expr The regular expression. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * const Async_Read_Stream::error_type& error, // Result of operation. - * - * std::size_t bytes_transferred // The number of bytes in the - * // streambuf's get area up to - * // and including the substring - * // that matches the regular - * // expression. 0 if an error - * // occurred. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - * - * @par Example: - * To asynchronously read data into a streambuf until a CR-LF sequence is - * encountered: - * @code asio::streambuf b; - * ... - * void handler(const asio::error& e, std::size_t size) - * { - * if (!e) - * { - * std::istream is(&b); - * std::string line; - * std::getline(is, line); - * ... - * } - * } - * ... - * asio::async_read_until(s, b, boost::regex("\r\n"), handler); @endcode - */ -template -void async_read_until(Async_Read_Stream& s, - asio::basic_streambuf& b, const boost::regex& expr, - Handler handler); - -/*@}*/ - -} // namespace asio - -#include "asio/impl/read_until.ipp" - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_READ_UNTIL_HPP diff --git a/libtorrent/include/asio/resolver_service.hpp b/libtorrent/include/asio/resolver_service.hpp deleted file mode 100644 index bdd8dbfbd..000000000 --- a/libtorrent/include/asio/resolver_service.hpp +++ /dev/null @@ -1,126 +0,0 @@ -// -// resolver_service.hpp -// ~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_RESOLVER_SERVICE_HPP -#define ASIO_RESOLVER_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/io_service.hpp" -#include "asio/detail/resolver_service.hpp" - -namespace asio { - -/// Default service implementation for a resolver. -template -class resolver_service - : public asio::io_service::service -{ -public: - /// The protocol type. - typedef Protocol protocol_type; - - /// The endpoint type. - typedef typename Protocol::endpoint endpoint_type; - - /// The query type. - typedef typename Protocol::resolver_query query_type; - - /// The iterator type. - typedef typename Protocol::resolver_iterator iterator_type; - -private: - // The type of the platform-specific implementation. - typedef detail::resolver_service service_impl_type; - -public: - /// The type of a resolver implementation. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined implementation_type; -#else - typedef typename service_impl_type::implementation_type implementation_type; -#endif - - /// Construct a new resolver service for the specified io_service. - explicit resolver_service(asio::io_service& io_service) - : asio::io_service::service(io_service), - service_impl_(asio::use_service(io_service)) - { - } - - /// Destroy all user-defined handler objects owned by the service. - void shutdown_service() - { - } - - /// Construct a new resolver implementation. - void construct(implementation_type& impl) - { - service_impl_.construct(impl); - } - - /// Destroy a resolver implementation. - void destroy(implementation_type& impl) - { - service_impl_.destroy(impl); - } - - /// Cancel pending asynchronous operations. - void cancel(implementation_type& impl) - { - service_impl_.cancel(impl); - } - - /// Resolve a query to a list of entries. - template - iterator_type resolve(implementation_type& impl, const query_type& query, - Error_Handler error_handler) - { - return service_impl_.resolve(impl, query, error_handler); - } - - /// Asynchronously resolve a query to a list of entries. - template - void async_resolve(implementation_type& impl, const query_type& query, - Handler handler) - { - service_impl_.async_resolve(impl, query, handler); - } - - /// Resolve an endpoint to a list of entries. - template - iterator_type resolve(implementation_type& impl, - const endpoint_type& endpoint, Error_Handler error_handler) - { - return service_impl_.resolve(impl, endpoint, error_handler); - } - - /// Asynchronously resolve an endpoint to a list of entries. - template - void async_resolve(implementation_type& impl, const endpoint_type& endpoint, - Handler handler) - { - return service_impl_.async_resolve(impl, endpoint, handler); - } - -private: - // The service that provides the platform-specific implementation. - service_impl_type& service_impl_; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_RESOLVER_SERVICE_HPP diff --git a/libtorrent/include/asio/socket_acceptor_service.hpp b/libtorrent/include/asio/socket_acceptor_service.hpp deleted file mode 100644 index 8c7eb43c9..000000000 --- a/libtorrent/include/asio/socket_acceptor_service.hpp +++ /dev/null @@ -1,219 +0,0 @@ -// -// socket_acceptor_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SOCKET_ACCEPTOR_SERVICE_HPP -#define ASIO_SOCKET_ACCEPTOR_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/basic_socket.hpp" -#include "asio/io_service.hpp" -#include "asio/detail/epoll_reactor.hpp" -#include "asio/detail/kqueue_reactor.hpp" -#include "asio/detail/select_reactor.hpp" -#include "asio/detail/reactive_socket_service.hpp" -#include "asio/detail/win_iocp_socket_service.hpp" - -namespace asio { - -/// Default service implementation for a socket acceptor. -template -class socket_acceptor_service - : public asio::io_service::service -{ -public: - /// The protocol type. - typedef Protocol protocol_type; - - /// The endpoint type. - typedef typename protocol_type::endpoint endpoint_type; - -private: - // The type of the platform-specific implementation. -#if defined(ASIO_HAS_IOCP) - typedef detail::win_iocp_socket_service service_impl_type; -#elif defined(ASIO_HAS_EPOLL) - typedef detail::reactive_socket_service< - Protocol, detail::epoll_reactor > service_impl_type; -#elif defined(ASIO_HAS_KQUEUE) - typedef detail::reactive_socket_service< - Protocol, detail::kqueue_reactor > service_impl_type; -#else - typedef detail::reactive_socket_service< - Protocol, detail::select_reactor > service_impl_type; -#endif - -public: - /// The native type of the socket acceptor. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined implementation_type; -#else - typedef typename service_impl_type::implementation_type implementation_type; -#endif - - /// The native acceptor type. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined native_type; -#else - typedef typename service_impl_type::native_type native_type; -#endif - - /// Construct a new socket acceptor service for the specified io_service. - explicit socket_acceptor_service(asio::io_service& io_service) - : asio::io_service::service(io_service), - service_impl_(asio::use_service(io_service)) - { - } - - /// Destroy all user-defined handler objects owned by the service. - void shutdown_service() - { - } - - /// Construct a new socket acceptor implementation. - void construct(implementation_type& impl) - { - service_impl_.construct(impl); - } - - /// Destroy a socket acceptor implementation. - void destroy(implementation_type& impl) - { - service_impl_.destroy(impl); - } - - /// Open a new socket acceptor implementation. - template - void open(implementation_type& impl, const protocol_type& protocol, - Error_Handler error_handler) - { - service_impl_.open(impl, protocol, error_handler); - } - - /// Assign an existing native acceptor to a socket acceptor. - template - void assign(implementation_type& impl, const protocol_type& protocol, - const native_type& native_acceptor, Error_Handler error_handler) - { - service_impl_.assign(impl, protocol, native_acceptor, error_handler); - } - - /// Cancel all asynchronous operations associated with the acceptor. - template - void cancel(implementation_type& impl, Error_Handler error_handler) - { - service_impl_.cancel(impl, error_handler); - } - - /// Bind the socket acceptor to the specified local endpoint. - template - void bind(implementation_type& impl, const endpoint_type& endpoint, - Error_Handler error_handler) - { - service_impl_.bind(impl, endpoint, error_handler); - } - - /// Place the socket acceptor into the state where it will listen for new - /// connections. - template - void listen(implementation_type& impl, int backlog, - Error_Handler error_handler) - { - service_impl_.listen(impl, backlog, error_handler); - } - - /// Close a socket acceptor implementation. - template - void close(implementation_type& impl, Error_Handler error_handler) - { - service_impl_.close(impl, error_handler); - } - - /// Get the native acceptor implementation. - native_type native(implementation_type& impl) - { - return service_impl_.native(impl); - } - - /// Set a socket option. - template - void set_option(implementation_type& impl, const Option& option, - Error_Handler error_handler) - { - service_impl_.set_option(impl, option, error_handler); - } - - /// Set a socket option. - template - void get_option(implementation_type& impl, Option& option, - Error_Handler error_handler) - { - service_impl_.get_option(impl, option, error_handler); - } - - /// Get the local endpoint. - template - endpoint_type local_endpoint(const implementation_type& impl, - Error_Handler error_handler) const - { - endpoint_type endpoint; - service_impl_.get_local_endpoint(impl, endpoint, error_handler); - return endpoint; - } - - /// Accept a new connection. - template - void accept(implementation_type& impl, - basic_socket& peer, - Error_Handler error_handler) - { - service_impl_.accept(impl, peer, error_handler); - } - - /// Accept a new connection. - template - void accept_endpoint(implementation_type& impl, - basic_socket& peer, - endpoint_type& peer_endpoint, Error_Handler error_handler) - { - service_impl_.accept_endpoint(impl, peer, peer_endpoint, error_handler); - } - - /// Start an asynchronous accept. - template - void async_accept(implementation_type& impl, - basic_socket& peer, Handler handler) - { - service_impl_.async_accept(impl, peer, handler); - } - - /// Start an asynchronous accept. - template - void async_accept_endpoint(implementation_type& impl, - basic_socket& peer, - endpoint_type& peer_endpoint, Handler handler) - { - service_impl_.async_accept_endpoint(impl, peer, peer_endpoint, handler); - } - -private: - // The service that provides the platform-specific implementation. - service_impl_type& service_impl_; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SOCKET_ACCEPTOR_SERVICE_HPP diff --git a/libtorrent/include/asio/socket_base.hpp b/libtorrent/include/asio/socket_base.hpp deleted file mode 100644 index 48e37357c..000000000 --- a/libtorrent/include/asio/socket_base.hpp +++ /dev/null @@ -1,482 +0,0 @@ -// -// socket_base.hpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SOCKET_BASE_HPP -#define ASIO_SOCKET_BASE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/detail/io_control.hpp" -#include "asio/detail/socket_option.hpp" -#include "asio/detail/socket_types.hpp" - -namespace asio { - -/// The socket_base class is used as a base for the basic_stream_socket and -/// basic_datagram_socket class templates so that we have a common place to -/// define the shutdown_type and enum. -class socket_base -{ -public: - /// Different ways a socket may be shutdown. - enum shutdown_type - { -#if defined(GENERATING_DOCUMENTATION) - /// Shutdown the receive side of the socket. - shutdown_receive = implementation_defined, - - /// Shutdown the send side of the socket. - shutdown_send = implementation_defined, - - /// Shutdown both send and receive on the socket. - shutdown_both = implementation_defined -#else - shutdown_receive = asio::detail::shutdown_receive, - shutdown_send = asio::detail::shutdown_send, - shutdown_both = asio::detail::shutdown_both -#endif - }; - - /// Bitmask type for flags that can be passed to send and receive operations. - typedef int message_flags; - -#if defined(GENERATING_DOCUMENTATION) - /// Peek at incoming data without removing it from the input queue. - static const int message_peek = implementation_defined; - - /// Process out-of-band data. - static const int message_out_of_band = implementation_defined; - - /// Specify that the data should not be subject to routing. - static const int message_do_not_route = implementation_defined; -#else - BOOST_STATIC_CONSTANT(int, - message_peek = asio::detail::message_peek); - BOOST_STATIC_CONSTANT(int, - message_out_of_band = asio::detail::message_out_of_band); - BOOST_STATIC_CONSTANT(int, - message_do_not_route = asio::detail::message_do_not_route); -#endif - - /// Socket option to permit sending of broadcast messages. - /** - * Implements the SOL_SOCKET/SO_BROADCAST socket option. - * - * @par Examples: - * Setting the option: - * @code - * asio::ip::udp::socket socket(io_service); - * ... - * asio::socket_base::broadcast option(true); - * socket.set_option(option); - * @endcode - * - * @par - * Getting the current option value: - * @code - * asio::ip::udp::socket socket(io_service); - * ... - * asio::socket_base::broadcast option; - * socket.get_option(option); - * bool is_set = option.get(); - * @endcode - * - * @par Concepts: - * Socket_Option, Boolean_Socket_Option. - */ -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined broadcast; -#else - typedef asio::detail::socket_option::boolean< - SOL_SOCKET, SO_BROADCAST> broadcast; -#endif - - /// Socket option to prevent routing, use local interfaces only. - /** - * Implements the SOL_SOCKET/SO_DONTROUTE socket option. - * - * @par Examples: - * Setting the option: - * @code - * asio::ip::udp::socket socket(io_service); - * ... - * asio::socket_base::do_not_route option(true); - * socket.set_option(option); - * @endcode - * - * @par - * Getting the current option value: - * @code - * asio::ip::udp::socket socket(io_service); - * ... - * asio::socket_base::do_not_route option; - * socket.get_option(option); - * bool is_set = option.get(); - * @endcode - * - * @par Concepts: - * Socket_Option, Boolean_Socket_Option. - */ -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined do_not_route; -#else - typedef asio::detail::socket_option::boolean< - SOL_SOCKET, SO_DONTROUTE> do_not_route; -#endif - - /// Socket option to send keep-alives. - /** - * Implements the SOL_SOCKET/SO_KEEPALIVE socket option. - * - * @par Examples: - * Setting the option: - * @code - * asio::ip::tcp::socket socket(io_service); - * ... - * asio::socket_base::keep_alive option(true); - * socket.set_option(option); - * @endcode - * - * @par - * Getting the current option value: - * @code - * asio::ip::tcp::socket socket(io_service); - * ... - * asio::socket_base::keep_alive option; - * socket.get_option(option); - * bool is_set = option.get(); - * @endcode - * - * @par Concepts: - * Socket_Option, Boolean_Socket_Option. - */ -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined keep_alive; -#else - typedef asio::detail::socket_option::boolean< - SOL_SOCKET, SO_KEEPALIVE> keep_alive; -#endif - - /// Socket option for the send buffer size of a socket. - /** - * Implements the SOL_SOCKET/SO_SNDBUF socket option. - * - * @par Examples: - * Setting the option: - * @code - * asio::ip::tcp::socket socket(io_service); - * ... - * asio::socket_base::send_buffer_size option(8192); - * socket.set_option(option); - * @endcode - * - * @par - * Getting the current option value: - * @code - * asio::ip::tcp::socket socket(io_service); - * ... - * asio::socket_base::send_buffer_size option; - * socket.get_option(option); - * int size = option.get(); - * @endcode - * - * @par Concepts: - * Socket_Option, Integer_Socket_Option. - */ -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined send_buffer_size; -#else - typedef asio::detail::socket_option::integer< - SOL_SOCKET, SO_SNDBUF> send_buffer_size; -#endif - - /// Socket option for the send low watermark. - /** - * Implements the SOL_SOCKET/SO_SNDLOWAT socket option. - * - * @par Examples: - * Setting the option: - * @code - * asio::ip::tcp::socket socket(io_service); - * ... - * asio::socket_base::send_low_watermark option(1024); - * socket.set_option(option); - * @endcode - * - * @par - * Getting the current option value: - * @code - * asio::ip::tcp::socket socket(io_service); - * ... - * asio::socket_base::send_low_watermark option; - * socket.get_option(option); - * int size = option.get(); - * @endcode - * - * @par Concepts: - * Socket_Option, Integer_Socket_Option. - */ -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined send_low_watermark; -#else - typedef asio::detail::socket_option::integer< - SOL_SOCKET, SO_SNDLOWAT> send_low_watermark; -#endif - - /// Socket option for the receive buffer size of a socket. - /** - * Implements the SOL_SOCKET/SO_RCVBUF socket option. - * - * @par Examples: - * Setting the option: - * @code - * asio::ip::tcp::socket socket(io_service); - * ... - * asio::socket_base::receive_buffer_size option(8192); - * socket.set_option(option); - * @endcode - * - * @par - * Getting the current option value: - * @code - * asio::ip::tcp::socket socket(io_service); - * ... - * asio::socket_base::receive_buffer_size option; - * socket.get_option(option); - * int size = option.get(); - * @endcode - * - * @par Concepts: - * Socket_Option, Integer_Socket_Option. - */ -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined receive_buffer_size; -#else - typedef asio::detail::socket_option::integer< - SOL_SOCKET, SO_RCVBUF> receive_buffer_size; -#endif - - /// Socket option for the receive low watermark. - /** - * Implements the SOL_SOCKET/SO_RCVLOWAT socket option. - * - * @par Examples: - * Setting the option: - * @code - * asio::ip::tcp::socket socket(io_service); - * ... - * asio::socket_base::receive_low_watermark option(1024); - * socket.set_option(option); - * @endcode - * - * @par - * Getting the current option value: - * @code - * asio::ip::tcp::socket socket(io_service); - * ... - * asio::socket_base::receive_low_watermark option; - * socket.get_option(option); - * int size = option.get(); - * @endcode - * - * @par Concepts: - * Socket_Option, Integer_Socket_Option. - */ -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined receive_low_watermark; -#else - typedef asio::detail::socket_option::integer< - SOL_SOCKET, SO_RCVLOWAT> receive_low_watermark; -#endif - - /// Socket option to allow the socket to be bound to an address that is - /// already in use. - /** - * Implements the SOL_SOCKET/SO_REUSEADDR socket option. - * - * @par Examples: - * Setting the option: - * @code - * asio::ip::tcp::acceptor acceptor(io_service); - * ... - * asio::socket_base::reuse_address option(true); - * acceptor.set_option(option); - * @endcode - * - * @par - * Getting the current option value: - * @code - * asio::ip::tcp::acceptor acceptor(io_service); - * ... - * asio::socket_base::reuse_address option; - * acceptor.get_option(option); - * bool is_set = option.get(); - * @endcode - * - * @par Concepts: - * Socket_Option, Boolean_Socket_Option. - */ -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined reuse_address; -#else - typedef asio::detail::socket_option::boolean< - SOL_SOCKET, SO_REUSEADDR> reuse_address; -#endif - - /// Socket option to specify whether the socket lingers on close if unsent - /// data is present. - /** - * Implements the SOL_SOCKET/SO_LINGER socket option. - * - * @par Examples: - * Setting the option: - * @code - * asio::ip::tcp::socket socket(io_service); - * ... - * asio::socket_base::linger option(true, 30); - * socket.set_option(option); - * @endcode - * - * @par - * Getting the current option value: - * @code - * asio::ip::tcp::socket socket(io_service); - * ... - * asio::socket_base::linger option; - * socket.get_option(option); - * bool is_set = option.enabled(); - * unsigned short timeout = option.timeout(); - * @endcode - * - * @par Concepts: - * Socket_Option, Linger_Socket_Option. - */ -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined linger; -#else - typedef asio::detail::socket_option::linger< - SOL_SOCKET, SO_LINGER> linger; -#endif - - /// Socket option to report aborted connections on accept. - /** - * Implements a custom socket option that determines whether or not an accept - * operation is permitted to fail with asio::error::connection_aborted. - * By default the option is false. - * - * @par Examples: - * Setting the option: - * @code - * asio::ip::tcp::acceptor acceptor(io_service); - * ... - * asio::socket_base::enable_connection_aborted option(true); - * acceptor.set_option(option); - * @endcode - * - * @par - * Getting the current option value: - * @code - * asio::ip::tcp::acceptor acceptor(io_service); - * ... - * asio::socket_base::enable_connection_aborted option; - * acceptor.get_option(option); - * bool is_set = option.get(); - * @endcode - * - * @par Concepts: - * Socket_Option, Boolean_Socket_Option. - */ -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined enable_connection_aborted; -#else - typedef asio::detail::socket_option::boolean< - asio::detail::custom_socket_option_level, - asio::detail::enable_connection_aborted_option> - enable_connection_aborted; -#endif - - /// IO control command to set the blocking mode of the socket. - /** - * Implements the FIONBIO IO control command. - * - * @par Example: - * @code - * asio::ip::tcp::socket socket(io_service); - * ... - * asio::socket_base::non_blocking_io command(true); - * socket.io_control(command); - * @endcode - * - * @par Concepts: - * IO_Control_Command, Boolean_IO_Control_Command. - */ -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined non_blocking_io; -#else - typedef asio::detail::io_control::non_blocking_io non_blocking_io; -#endif - - /// IO control command to get the amount of data that can be read without - /// blocking. - /** - * Implements the FIONREAD IO control command. - * - * @par Example: - * @code - * asio::ip::tcp::socket socket(io_service); - * ... - * asio::socket_base::bytes_readable command(true); - * socket.io_control(command); - * std::size_t bytes_readable = command.get(); - * @endcode - * - * @par Concepts: - * IO_Control_Command, Size_IO_Control_Command. - */ -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined bytes_readable; -#else - typedef asio::detail::io_control::bytes_readable bytes_readable; -#endif - - /// The maximum length of the queue of pending incoming connections. -#if defined(GENERATING_DOCUMENTATION) - static const int max_connections = implementation_defined; -#else - BOOST_STATIC_CONSTANT(int, max_connections = SOMAXCONN); -#endif - -protected: - /// Protected destructor to prevent deletion through this type. - ~socket_base() - { - } - -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -private: - // Workaround to enable the empty base optimisation with Borland C++. - char dummy_; -#endif -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SOCKET_BASE_HPP diff --git a/libtorrent/include/asio/ssl.hpp b/libtorrent/include/asio/ssl.hpp deleted file mode 100644 index 2d4621340..000000000 --- a/libtorrent/include/asio/ssl.hpp +++ /dev/null @@ -1,26 +0,0 @@ -// -// ssl.hpp -// ~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_HPP -#define ASIO_SSL_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/ssl/basic_context.hpp" -#include "asio/ssl/context.hpp" -#include "asio/ssl/context_base.hpp" -#include "asio/ssl/context_service.hpp" -#include "asio/ssl/stream.hpp" -#include "asio/ssl/stream_base.hpp" -#include "asio/ssl/stream_service.hpp" - -#endif // ASIO_SSL_HPP diff --git a/libtorrent/include/asio/ssl/basic_context.hpp b/libtorrent/include/asio/ssl/basic_context.hpp deleted file mode 100755 index 2c25e81a8..000000000 --- a/libtorrent/include/asio/ssl/basic_context.hpp +++ /dev/null @@ -1,467 +0,0 @@ -// -// basic_context.hpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2005 Voipster / Indrek dot Juhani at voipster dot com -// Copyright (c) 2005 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_BASIC_CONTEXT_HPP -#define ASIO_SSL_BASIC_CONTEXT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/error_handler.hpp" -#include "asio/io_service.hpp" -#include "asio/ssl/context_base.hpp" - -namespace asio { -namespace ssl { - -/// SSL context. -template -class basic_context - : public context_base, - private boost::noncopyable -{ -public: - /// The type of the service that will be used to provide context operations. - typedef Service service_type; - - /// The native implementation type of the locking dispatcher. - typedef typename service_type::impl_type impl_type; - - /// Constructor. - basic_context(asio::io_service& io_service, method m) - : service_(asio::use_service(io_service)), - impl_(service_.null()) - { - service_.create(impl_, m); - } - - /// Destructor. - ~basic_context() - { - service_.destroy(impl_); - } - - /// Get the underlying implementation in the native type. - /** - * This function may be used to obtain the underlying implementation of the - * context. This is intended to allow access to context functionality that is - * not otherwise provided. - */ - impl_type impl() - { - return impl_; - } - - /// Set options on the context. - /** - * This function may be used to configure the SSL options used by the context. - * - * @param o A bitmask of options. The available option values are defined in - * the context_base class. The options are bitwise-ored with any existing - * value for the options. - * - * @throws asio::error Thrown on failure. - */ - void set_options(options o) - { - service_.set_options(impl_, o, throw_error()); - } - - /// Set options on the context. - /** - * This function may be used to configure the SSL options used by the context. - * - * @param o A bitmask of options. The available option values are defined in - * the context_base class. The options are bitwise-ored with any existing - * value for the options. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - */ - template - void set_options(options o, Error_Handler error_handler) - { - service_.set_options(impl_, o, error_handler); - } - - /// Set the peer verification mode. - /** - * This function may be used to configure the peer verification mode used by - * the context. - * - * @param v A bitmask of peer verification modes. The available verify_mode - * values are defined in the context_base class. - * - * @throws asio::error Thrown on failure. - */ - void set_verify_mode(verify_mode v) - { - service_.set_verify_mode(impl_, v, throw_error()); - } - - /// Set the peer verification mode. - /** - * This function may be used to configure the peer verification mode used by - * the context. - * - * @param v A bitmask of peer verification modes. The available verify_mode - * values are defined in the context_base class. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - */ - template - void set_verify_mode(verify_mode v, Error_Handler error_handler) - { - service_.set_verify_mode(impl_, v, error_handler); - } - - /// Load a certification authority file for performing verification. - /** - * This function is used to load one or more trusted certification authorities - * from a file. - * - * @param filename The name of a file containing certification authority - * certificates in PEM format. - * - * @throws asio::error Thrown on failure. - */ - void load_verify_file(const std::string& filename) - { - service_.load_verify_file(impl_, filename, throw_error()); - } - - /// Load a certification authority file for performing verification. - /** - * This function is used to load the certificates for one or more trusted - * certification authorities from a file. - * - * @param filename The name of a file containing certification authority - * certificates in PEM format. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - */ - template - void load_verify_file(const std::string& filename, - Error_Handler error_handler) - { - service_.load_verify_file(impl_, filename, error_handler); - } - - /// Add a directory containing certificate authority files to be used for - /// performing verification. - /** - * This function is used to specify the name of a directory containing - * certification authority certificates. Each file in the directory must - * contain a single certificate. The files must be named using the subject - * name's hash and an extension of ".0". - * - * @param path The name of a directory containing the certificates. - * - * @throws asio::error Thrown on failure. - */ - void add_verify_path(const std::string& path) - { - service_.add_verify_path(impl_, path, throw_error()); - } - - /// Add a directory containing certificate authority files to be used for - /// performing verification. - /** - * This function is used to specify the name of a directory containing - * certification authority certificates. Each file in the directory must - * contain a single certificate. The files must be named using the subject - * name's hash and an extension of ".0". - * - * @param path The name of a directory containing the certificates. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - */ - template - void add_verify_path(const std::string& path, Error_Handler error_handler) - { - service_.add_verify_path(impl_, path, error_handler); - } - - /// Use a certificate from a file. - /** - * This function is used to load a certificate into the context from a file. - * - * @param filename The name of the file containing the certificate. - * - * @param format The file format (ASN.1 or PEM). - * - * @throws asio::error Thrown on failure. - */ - void use_certificate_file(const std::string& filename, file_format format) - { - service_.use_certificate_file(impl_, filename, format, throw_error()); - } - - /// Use a certificate from a file. - /** - * This function is used to load a certificate into the context from a file. - * - * @param filename The name of the file containing the certificate. - * - * @param format The file format (ASN.1 or PEM). - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - */ - template - void use_certificate_file(const std::string& filename, file_format format, - Error_Handler error_handler) - { - service_.use_certificate_file(impl_, filename, format, error_handler); - } - - /// Use a certificate chain from a file. - /** - * This function is used to load a certificate chain into the context from a - * file. - * - * @param filename The name of the file containing the certificate. The file - * must use the PEM format. - * - * @throws asio::error Thrown on failure. - */ - void use_certificate_chain_file(const std::string& filename) - { - service_.use_certificate_chain_file(impl_, filename, throw_error()); - } - - /// Use a certificate chain from a file. - /** - * This function is used to load a certificate chain into the context from a - * file. - * - * @param filename The name of the file containing the certificate. The file - * must use the PEM format. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - */ - template - void use_certificate_chain_file(const std::string& filename, - Error_Handler error_handler) - { - service_.use_certificate_chain_file(impl_, filename, error_handler); - } - - /// Use a private key from a file. - /** - * This function is used to load a private key into the context from a file. - * - * @param filename The name of the file containing the private key. - * - * @param format The file format (ASN.1 or PEM). - * - * @throws asio::error Thrown on failure. - */ - void use_private_key_file(const std::string& filename, file_format format) - { - service_.use_private_key_file(impl_, filename, format, throw_error()); - } - - /// Use a private key from a file. - /** - * This function is used to load a private key into the context from a file. - * - * @param filename The name of the file containing the private key. - * - * @param format The file format (ASN.1 or PEM). - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - */ - template - void use_private_key_file(const std::string& filename, file_format format, - Error_Handler error_handler) - { - service_.use_private_key_file(impl_, filename, format, error_handler); - } - - /// Use an RSA private key from a file. - /** - * This function is used to load an RSA private key into the context from a - * file. - * - * @param filename The name of the file containing the RSA private key. - * - * @param format The file format (ASN.1 or PEM). - * - * @throws asio::error Thrown on failure. - */ - void use_rsa_private_key_file(const std::string& filename, file_format format) - { - service_.use_rsa_private_key_file(impl_, filename, format, throw_error()); - } - - /// Use an RSA private key from a file. - /** - * This function is used to load an RSA private key into the context from a - * file. - * - * @param filename The name of the file containing the RSA private key. - * - * @param format The file format (ASN.1 or PEM). - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - */ - template - void use_rsa_private_key_file(const std::string& filename, file_format format, - Error_Handler error_handler) - { - service_.use_rsa_private_key_file(impl_, filename, format, error_handler); - } - - /// Use the specified file to obtain the temporary Diffie-Hellman parameters. - /** - * This function is used to load Diffie-Hellman parameters into the context - * from a file. - * - * @param filename The name of the file containing the Diffie-Hellman - * parameters. The file must use the PEM format. - * - * @throws asio::error Thrown on failure. - */ - void use_tmp_dh_file(const std::string& filename) - { - service_.use_tmp_dh_file(impl_, filename, throw_error()); - } - - /// Use the specified file to obtain the temporary Diffie-Hellman parameters. - /** - * This function is used to load Diffie-Hellman parameters into the context - * from a file. - * - * @param filename The name of the file containing the Diffie-Hellman - * parameters. The file must use the PEM format. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - */ - template - void use_tmp_dh_file(const std::string& filename, Error_Handler error_handler) - { - service_.use_tmp_dh_file(impl_, filename, error_handler); - } - - /// Set the password callback. - /** - * This function is used to specify a callback function to obtain password - * information about an encrypted key in PEM format. - * - * @param callback The function object to be used for obtaining the password. - * The function signature of the handler must be: - * @code std::string password_callback( - * std::size_t max_length, // The maximum size for a password. - * password_purpose purpose // Whether password is for reading or writing. - * ); @endcode - * The return value of the callback is a string containing the password. - * - * @throws asio::error Thrown on failure. - */ - template - void set_password_callback(Password_Callback callback) - { - service_.set_password_callback(impl_, callback, throw_error()); - } - - /// Set the password callback. - /** - * This function is used to specify a callback function to obtain password - * information about an encrypted key in PEM format. - * - * @param callback The function object to be used for obtaining the password. - * The function signature of the handler must be: - * @code std::string password_callback( - * std::size_t max_length, // The maximum size for a password. - * password_purpose purpose // Whether password is for reading or writing. - * ); @endcode - * The return value of the callback is a string containing the password. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - */ - template - void set_password_callback(Password_Callback callback, - Error_Handler error_handler) - { - service_.set_password_callback(impl_, callback, error_handler); - } - -private: - /// The backend service implementation. - service_type& service_; - - /// The underlying native implementation. - impl_type impl_; -}; - -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_BASIC_CONTEXT_HPP diff --git a/libtorrent/include/asio/ssl/context.hpp b/libtorrent/include/asio/ssl/context.hpp deleted file mode 100644 index 86e249cbc..000000000 --- a/libtorrent/include/asio/ssl/context.hpp +++ /dev/null @@ -1,35 +0,0 @@ -// -// context.hpp -// ~~~~~~~~~~~ -// -// Copyright (c) 2005 Voipster / Indrek dot Juhani at voipster dot com -// Copyright (c) 2005 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_CONTEXT_HPP -#define ASIO_SSL_CONTEXT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/ssl/basic_context.hpp" -#include "asio/ssl/context_service.hpp" - -namespace asio { -namespace ssl { - -/// Typedef for the typical usage of context. -typedef basic_context context; - -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_CONTEXT_HPP diff --git a/libtorrent/include/asio/ssl/context_base.hpp b/libtorrent/include/asio/ssl/context_base.hpp deleted file mode 100755 index 0811d8ba5..000000000 --- a/libtorrent/include/asio/ssl/context_base.hpp +++ /dev/null @@ -1,164 +0,0 @@ -// -// context_base.hpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2005 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_CONTEXT_BASE_HPP -#define ASIO_SSL_CONTEXT_BASE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/ssl/detail/openssl_types.hpp" - -namespace asio { -namespace ssl { - -/// The context_base class is used as a base for the basic_context class -/// template so that we have a common place to define various enums. -class context_base -{ -public: - /// Different methods supported by a context. - enum method - { - /// Generic SSL version 2. - sslv2, - - /// SSL version 2 client. - sslv2_client, - - /// SSL version 2 server. - sslv2_server, - - /// Generic SSL version 3. - sslv3, - - /// SSL version 3 client. - sslv3_client, - - /// SSL version 3 server. - sslv3_server, - - /// Generic TLS version 1. - tlsv1, - - /// TLS version 1 client. - tlsv1_client, - - /// TLS version 1 server. - tlsv1_server, - - /// Generic SSL/TLS. - sslv23, - - /// SSL/TLS client. - sslv23_client, - - /// SSL/TLS server. - sslv23_server - }; - - /// Bitmask type for SSL options. - typedef int options; - -#if defined(GENERATING_DOCUMENTATION) - /// Implement various bug workarounds. - static const int default_workarounds = implementation_defined; - - /// Always create a new key when using tmp_dh parameters. - static const int single_dh_use = implementation_defined; - - /// Disable SSL v2. - static const int no_sslv2 = implementation_defined; - - /// Disable SSL v3. - static const int no_sslv3 = implementation_defined; - - /// Disable TLS v1. - static const int no_tlsv1 = implementation_defined; -#else - BOOST_STATIC_CONSTANT(int, default_workarounds = SSL_OP_ALL); - BOOST_STATIC_CONSTANT(int, single_dh_use = SSL_OP_SINGLE_DH_USE); - BOOST_STATIC_CONSTANT(int, no_sslv2 = SSL_OP_NO_SSLv2); - BOOST_STATIC_CONSTANT(int, no_sslv3 = SSL_OP_NO_SSLv3); - BOOST_STATIC_CONSTANT(int, no_tlsv1 = SSL_OP_NO_TLSv1); -#endif - - /// File format types. - enum file_format - { - /// ASN.1 file. - asn1, - - /// PEM file. - pem - }; - - /// Bitmask type for peer verification. - typedef int verify_mode; - -#if defined(GENERATING_DOCUMENTATION) - /// No verification. - static const int verify_none = implementation_defined; - - /// Verify the peer. - static const int verify_peer = implementation_defined; - - /// Fail verification if the peer has no certificate. Ignored unless - /// verify_peer is set. - static const int verify_fail_if_no_peer_cert = implementation_defined; - - /// Do not request client certificate on renegotiation. Ignored unless - /// verify_peer is set. - static const int verify_client_once = implementation_defined; -#else - BOOST_STATIC_CONSTANT(int, verify_none = SSL_VERIFY_NONE); - BOOST_STATIC_CONSTANT(int, verify_peer = SSL_VERIFY_PEER); - BOOST_STATIC_CONSTANT(int, - verify_fail_if_no_peer_cert = SSL_VERIFY_FAIL_IF_NO_PEER_CERT); - BOOST_STATIC_CONSTANT(int, verify_client_once = SSL_VERIFY_CLIENT_ONCE); -#endif - - /// Purpose of PEM password. - enum password_purpose - { - /// The password is needed for reading/decryption. - for_reading, - - /// The password is needed for writing/encryption. - for_writing - }; - -protected: - /// Protected destructor to prevent deletion through this type. - ~context_base() - { - } - -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -private: - // Workaround to enable the empty base optimisation with Borland C++. - char dummy_; -#endif -}; - -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_CONTEXT_BASE_HPP diff --git a/libtorrent/include/asio/ssl/context_service.hpp b/libtorrent/include/asio/ssl/context_service.hpp deleted file mode 100755 index 636b970c3..000000000 --- a/libtorrent/include/asio/ssl/context_service.hpp +++ /dev/null @@ -1,171 +0,0 @@ -// -// context_service.hpp -// ~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2005 Voipster / Indrek dot Juhani at voipster dot com -// Copyright (c) 2005 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_CONTEXT_SERVICE_HPP -#define ASIO_SSL_CONTEXT_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/io_service.hpp" -#include "asio/ssl/context_base.hpp" -#include "asio/ssl/detail/openssl_context_service.hpp" - -namespace asio { -namespace ssl { - -/// Default service implementation for a context. -class context_service - : public asio::io_service::service -{ -private: - // The type of the platform-specific implementation. - typedef detail::openssl_context_service service_impl_type; - -public: - /// The type of the context. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined impl_type; -#else - typedef service_impl_type::impl_type impl_type; -#endif - - /// Constructor. - explicit context_service(asio::io_service& io_service) - : asio::io_service::service(io_service), - service_impl_(asio::use_service(io_service)) - { - } - - /// Destroy all user-defined handler objects owned by the service. - void shutdown_service() - { - } - - /// Return a null context implementation. - impl_type null() const - { - return service_impl_.null(); - } - - /// Create a new context implementation. - void create(impl_type& impl, context_base::method m) - { - service_impl_.create(impl, m); - } - - /// Destroy a context implementation. - void destroy(impl_type& impl) - { - service_impl_.destroy(impl); - } - - /// Set options on the context. - template - void set_options(impl_type& impl, context_base::options o, - Error_Handler error_handler) - { - service_impl_.set_options(impl, o, error_handler); - } - - /// Set peer verification mode. - template - void set_verify_mode(impl_type& impl, context_base::verify_mode v, - Error_Handler error_handler) - { - service_impl_.set_verify_mode(impl, v, error_handler); - } - - /// Load a certification authority file for performing verification. - template - void load_verify_file(impl_type& impl, const std::string& filename, - Error_Handler error_handler) - { - service_impl_.load_verify_file(impl, filename, error_handler); - } - - /// Add a directory containing certification authority files to be used for - /// performing verification. - template - void add_verify_path(impl_type& impl, const std::string& path, - Error_Handler error_handler) - { - service_impl_.add_verify_path(impl, path, error_handler); - } - - /// Use a certificate from a file. - template - void use_certificate_file(impl_type& impl, const std::string& filename, - context_base::file_format format, Error_Handler error_handler) - { - service_impl_.use_certificate_file(impl, filename, format, error_handler); - } - - /// Use a certificate chain from a file. - template - void use_certificate_chain_file(impl_type& impl, const std::string& filename, - Error_Handler error_handler) - { - service_impl_.use_certificate_chain_file(impl, filename, error_handler); - } - - /// Use a private key from a file. - template - void use_private_key_file(impl_type& impl, const std::string& filename, - context_base::file_format format, Error_Handler error_handler) - { - service_impl_.use_private_key_file(impl, filename, format, error_handler); - } - - /// Use an RSA private key from a file. - template - void use_rsa_private_key_file(impl_type& impl, const std::string& filename, - context_base::file_format format, Error_Handler error_handler) - { - service_impl_.use_rsa_private_key_file(impl, filename, format, - error_handler); - } - - /// Use the specified file to obtain the temporary Diffie-Hellman parameters. - template - void use_tmp_dh_file(impl_type& impl, const std::string& filename, - Error_Handler error_handler) - { - service_impl_.use_tmp_dh_file(impl, filename, error_handler); - } - - /// Set the password callback. - template - void set_password_callback(impl_type& impl, Password_Callback callback, - Error_Handler error_handler) - { - service_impl_.set_password_callback(impl, callback, error_handler); - } - -private: - // The service that provides the platform-specific implementation. - service_impl_type& service_impl_; -}; - -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_CONTEXT_SERVICE_HPP diff --git a/libtorrent/include/asio/ssl/detail/openssl_context_service.hpp b/libtorrent/include/asio/ssl/detail/openssl_context_service.hpp deleted file mode 100755 index 723bcadf2..000000000 --- a/libtorrent/include/asio/ssl/detail/openssl_context_service.hpp +++ /dev/null @@ -1,396 +0,0 @@ -// -// openssl_context_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2005 Voipster / Indrek dot Juhani at voipster dot com -// Copyright (c) 2005 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_DETAIL_OPENSSL_CONTEXT_SERVICE_HPP -#define ASIO_SSL_DETAIL_OPENSSL_CONTEXT_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/error.hpp" -#include "asio/io_service.hpp" -#include "asio/ssl/context_base.hpp" -#include "asio/ssl/detail/openssl_init.hpp" -#include "asio/ssl/detail/openssl_types.hpp" - -namespace asio { -namespace ssl { -namespace detail { - -class openssl_context_service - : public asio::io_service::service -{ -public: - // The native type of the context. - typedef ::SSL_CTX* impl_type; - - // The type for the password callback function object. - typedef boost::function password_callback_type; - - // Constructor. - openssl_context_service(asio::io_service& io_service) - : asio::io_service::service(io_service) - { - } - - // Destroy all user-defined handler objects owned by the service. - void shutdown_service() - { - } - - // Return a null context implementation. - static impl_type null() - { - return 0; - } - - // Create a new context implementation. - void create(impl_type& impl, context_base::method m) - { - ::SSL_METHOD* ssl_method = 0; - switch (m) - { - case context_base::sslv2: - ssl_method = ::SSLv2_method(); - break; - case context_base::sslv2_client: - ssl_method = ::SSLv2_client_method(); - break; - case context_base::sslv2_server: - ssl_method = ::SSLv2_server_method(); - break; - case context_base::sslv3: - ssl_method = ::SSLv3_method(); - break; - case context_base::sslv3_client: - ssl_method = ::SSLv3_client_method(); - break; - case context_base::sslv3_server: - ssl_method = ::SSLv3_server_method(); - break; - case context_base::tlsv1: - ssl_method = ::TLSv1_method(); - break; - case context_base::tlsv1_client: - ssl_method = ::TLSv1_client_method(); - break; - case context_base::tlsv1_server: - ssl_method = ::TLSv1_server_method(); - break; - case context_base::sslv23: - ssl_method = ::SSLv23_method(); - break; - case context_base::sslv23_client: - ssl_method = ::SSLv23_client_method(); - break; - case context_base::sslv23_server: - ssl_method = ::SSLv23_server_method(); - break; - default: - break; - } - impl = ::SSL_CTX_new(ssl_method); - } - - // Destroy a context implementation. - void destroy(impl_type& impl) - { - if (impl != null()) - { - if (impl->default_passwd_callback_userdata) - { - password_callback_type* callback = - static_cast( - impl->default_passwd_callback_userdata); - delete callback; - impl->default_passwd_callback_userdata = 0; - } - - ::SSL_CTX_free(impl); - impl = null(); - } - } - - // Set options on the context. - template - void set_options(impl_type& impl, context_base::options o, - Error_Handler error_handler) - { - ::SSL_CTX_set_options(impl, o); - - asio::error e; - error_handler(e); - } - - // Set peer verification mode. - template - void set_verify_mode(impl_type& impl, context_base::verify_mode v, - Error_Handler error_handler) - { - ::SSL_CTX_set_verify(impl, v, 0); - - asio::error e; - error_handler(e); - } - - // Load a certification authority file for performing verification. - template - void load_verify_file(impl_type& impl, const std::string& filename, - Error_Handler error_handler) - { - if (::SSL_CTX_load_verify_locations(impl, filename.c_str(), 0) != 1) - { - asio::error e(asio::error::invalid_argument); - error_handler(e); - return; - } - - asio::error e; - error_handler(e); - } - - // Add a directory containing certification authority files to be used for - // performing verification. - template - void add_verify_path(impl_type& impl, const std::string& path, - Error_Handler error_handler) - { - if (::SSL_CTX_load_verify_locations(impl, 0, path.c_str()) != 1) - { - asio::error e(asio::error::invalid_argument); - error_handler(e); - return; - } - - asio::error e; - error_handler(e); - } - - // Use a certificate from a file. - template - void use_certificate_file(impl_type& impl, const std::string& filename, - context_base::file_format format, Error_Handler error_handler) - { - int file_type; - switch (format) - { - case context_base::asn1: - file_type = SSL_FILETYPE_ASN1; - break; - case context_base::pem: - file_type = SSL_FILETYPE_PEM; - break; - default: - { - asio::error e(asio::error::invalid_argument); - error_handler(e); - return; - } - } - - if (::SSL_CTX_use_certificate_file(impl, filename.c_str(), file_type) != 1) - { - asio::error e(asio::error::invalid_argument); - error_handler(e); - return; - } - - asio::error e; - error_handler(e); - } - - // Use a certificate chain from a file. - template - void use_certificate_chain_file(impl_type& impl, const std::string& filename, - Error_Handler error_handler) - { - if (::SSL_CTX_use_certificate_chain_file(impl, filename.c_str()) != 1) - { - asio::error e(asio::error::invalid_argument); - error_handler(e); - return; - } - - asio::error e; - error_handler(e); - } - - // Use a private key from a file. - template - void use_private_key_file(impl_type& impl, const std::string& filename, - context_base::file_format format, Error_Handler error_handler) - { - int file_type; - switch (format) - { - case context_base::asn1: - file_type = SSL_FILETYPE_ASN1; - break; - case context_base::pem: - file_type = SSL_FILETYPE_PEM; - break; - default: - { - asio::error e(asio::error::invalid_argument); - error_handler(e); - return; - } - } - - if (::SSL_CTX_use_PrivateKey_file(impl, filename.c_str(), file_type) != 1) - { - asio::error e(asio::error::invalid_argument); - error_handler(e); - return; - } - - asio::error e; - error_handler(e); - } - - // Use an RSA private key from a file. - template - void use_rsa_private_key_file(impl_type& impl, const std::string& filename, - context_base::file_format format, Error_Handler error_handler) - { - int file_type; - switch (format) - { - case context_base::asn1: - file_type = SSL_FILETYPE_ASN1; - break; - case context_base::pem: - file_type = SSL_FILETYPE_PEM; - break; - default: - { - asio::error e(asio::error::invalid_argument); - error_handler(e); - return; - } - } - - if (::SSL_CTX_use_RSAPrivateKey_file( - impl, filename.c_str(), file_type) != 1) - { - asio::error e(asio::error::invalid_argument); - error_handler(e); - return; - } - - asio::error e; - error_handler(e); - } - - // Use the specified file to obtain the temporary Diffie-Hellman parameters. - template - void use_tmp_dh_file(impl_type& impl, const std::string& filename, - Error_Handler error_handler) - { - ::BIO* bio = ::BIO_new_file(filename.c_str(), "r"); - if (!bio) - { - asio::error e(asio::error::invalid_argument); - error_handler(e); - return; - } - - ::DH* dh = ::PEM_read_bio_DHparams(bio, 0, 0, 0); - if (!dh) - { - ::BIO_free(bio); - asio::error e(asio::error::invalid_argument); - error_handler(e); - return; - } - - ::BIO_free(bio); - int result = ::SSL_CTX_set_tmp_dh(impl, dh); - if (result != 1) - { - ::DH_free(dh); - asio::error e(asio::error::invalid_argument); - error_handler(e); - return; - } - - asio::error e; - error_handler(e); - } - - static int password_callback(char* buf, int size, int purpose, void* data) - { - using namespace std; // For strncat and strlen. - - if (data) - { - password_callback_type* callback = - static_cast(data); - std::string passwd = (*callback)(static_cast(size), - purpose ? context_base::for_writing : context_base::for_reading); - *buf = '\0'; - strncat(buf, passwd.c_str(), size); - return strlen(buf); - } - - return 0; - } - - // Set the password callback. - template - void set_password_callback(impl_type& impl, Password_Callback callback, - Error_Handler error_handler) - { - // Allocate callback function object if not already present. - if (impl->default_passwd_callback_userdata) - { - password_callback_type* callback_function = - static_cast( - impl->default_passwd_callback_userdata); - *callback_function = callback; - } - else - { - password_callback_type* callback_function = - new password_callback_type(callback); - impl->default_passwd_callback_userdata = callback_function; - } - - // Set the password callback. - SSL_CTX_set_default_passwd_cb(impl, - &openssl_context_service::password_callback); - - asio::error e; - error_handler(e); - } - -private: - // Ensure openssl is initialised. - openssl_init<> init_; -}; - -} // namespace detail -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_DETAIL_OPENSSL_CONTEXT_SERVICE_HPP diff --git a/libtorrent/include/asio/ssl/detail/openssl_init.hpp b/libtorrent/include/asio/ssl/detail/openssl_init.hpp deleted file mode 100755 index 60d19b787..000000000 --- a/libtorrent/include/asio/ssl/detail/openssl_init.hpp +++ /dev/null @@ -1,128 +0,0 @@ -// -// openssl_init.hpp -// ~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2005 Voipster / Indrek dot Juhani at voipster dot com -// Copyright (c) 2005 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_DETAIL_OPENSSL_INIT_HPP -#define ASIO_SSL_DETAIL_OPENSSL_INIT_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/detail/mutex.hpp" -#include "asio/ssl/detail/openssl_types.hpp" - -namespace asio { -namespace ssl { -namespace detail { - -template -class openssl_init - : private boost::noncopyable -{ -private: - // Structure to perform the actual initialisation. - class do_init - { - public: - do_init() - { - if (Do_Init) - { - ::SSL_library_init(); - ::SSL_load_error_strings(); - - mutexes_.resize(::CRYPTO_num_locks()); - for (size_t i = 0; i < mutexes_.size(); ++i) - mutexes_[i].reset(new asio::detail::mutex); - ::CRYPTO_set_locking_callback(&do_init::openssl_locking_func); - - ::OpenSSL_add_ssl_algorithms(); - } - } - - ~do_init() - { - if (Do_Init) - { - ::CRYPTO_set_locking_callback(0); - ::ERR_free_strings(); - ::ERR_remove_state(0); - ::EVP_cleanup(); - ::CRYPTO_cleanup_all_ex_data(); - ::CONF_modules_unload(1); - ::ENGINE_cleanup(); - } - } - - // Helper function to manage a do_init singleton. The static instance of the - // openssl_init object ensures that this function is always called before - // main, and therefore before any other threads can get started. The do_init - // instance must be static in this function to ensure that it gets - // initialised before any other global objects try to use it. - static boost::shared_ptr instance() - { - static boost::shared_ptr init(new do_init); - return init; - } - - private: - static void openssl_locking_func(int mode, int n, - const char *file, int line) - { - if (mode & CRYPTO_LOCK) - instance()->mutexes_[n]->lock(); - else - instance()->mutexes_[n]->unlock(); - } - - // Mutexes to be used in locking callbacks. - std::vector > mutexes_; - }; - -public: - // Constructor. - openssl_init() - : ref_(do_init::instance()) - { - while (&instance_ == 0); // Ensure openssl_init::instance_ is linked in. - } - - // Destructor. - ~openssl_init() - { - } - -private: - // Instance to force initialisation of openssl at global scope. - static openssl_init instance_; - - // Reference to singleton do_init object to ensure that openssl does not get - // cleaned up until the last user has finished with it. - boost::shared_ptr ref_; -}; - -template -openssl_init openssl_init::instance_; - -} // namespace detail -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_DETAIL_OPENSSL_INIT_HPP diff --git a/libtorrent/include/asio/ssl/detail/openssl_operation.hpp b/libtorrent/include/asio/ssl/detail/openssl_operation.hpp deleted file mode 100755 index 1497638f1..000000000 --- a/libtorrent/include/asio/ssl/detail/openssl_operation.hpp +++ /dev/null @@ -1,474 +0,0 @@ -// -// openssl_operation.hpp -// ~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2005 Voipster / Indrek dot Juhani at voipster dot com -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_DETAIL_OPENSSL_OPERATION_HPP -#define ASIO_SSL_DETAIL_OPENSSL_OPERATION_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/buffer.hpp" -#include "asio/placeholders.hpp" -#include "asio/write.hpp" -#include "asio/detail/socket_ops.hpp" -#include "asio/ssl/detail/openssl_types.hpp" - -namespace asio { -namespace ssl { -namespace detail { - -typedef boost::function ssl_primitive_func; -typedef boost::function user_handler_func; - -// Network send_/recv buffer implementation -// -// -class net_buffer -{ - static const int NET_BUF_SIZE = 16*1024 + 256; // SSL record size + spare - - unsigned char buf_[NET_BUF_SIZE]; - unsigned char* data_start_; - unsigned char* data_end_; - -public: - net_buffer() - { - data_start_ = data_end_ = buf_; - } - unsigned char* get_unused_start() { return data_end_; } - unsigned char* get_data_start() { return data_start_; } - size_t get_unused_len() { return (NET_BUF_SIZE - (data_end_ - buf_)); } - size_t get_data_len() { return (data_end_ - data_start_); } - void data_added(size_t count) - { - data_end_ += count; - data_end_ = data_end_ > (buf_ + NET_BUF_SIZE)? - (buf_ + NET_BUF_SIZE): - data_end_; - } - void data_removed(size_t count) - { - data_start_ += count; - if (data_start_ >= data_end_) reset(); - } - void reset() { data_start_ = buf_; data_end_ = buf_; } - bool has_data() { return (data_start_ < data_end_); } -}; // class net_buffer - -// -// Operation class -// -// -template -class openssl_operation -{ -public: - - // Constructor for asynchronous operations - openssl_operation(ssl_primitive_func primitive, - Stream& socket, - net_buffer& recv_buf, - SSL* session, - BIO* ssl_bio, - user_handler_func handler - ) - : primitive_(primitive) - , user_handler_(handler) - , recv_buf_(recv_buf) - , socket_(socket) - , ssl_bio_(ssl_bio) - , session_(session) - { - write_ = boost::bind( - &openssl_operation::do_async_write, - this, boost::arg<1>(), boost::arg<2>() - ); - handler_= boost::bind( - &openssl_operation::async_user_handler, - this, boost::arg<1>(), boost::arg<2>() - ); - } - - // Constructor for synchronous operations - openssl_operation(ssl_primitive_func primitive, - Stream& socket, - net_buffer& recv_buf, - SSL* session, - BIO* ssl_bio) - : primitive_(primitive) - , recv_buf_(recv_buf) - , socket_(socket) - , ssl_bio_(ssl_bio) - , session_(session) - { - write_ = boost::bind( - &openssl_operation::do_sync_write, - this, boost::arg<1>(), boost::arg<2>() - ); - handler_ = boost::bind( - &openssl_operation::sync_user_handler, - this, boost::arg<1>(), boost::arg<2>() - ); - } - - // Start operation - // In case of asynchronous it returns 0, in sync mode returns success code - // or throws an error... - int start() - { - int rc = primitive_( session_ ); - int sys_error_code = ERR_get_error(); - bool is_operation_done = (rc > 0); - // For connect/accept/shutdown, the operation - // is done, when return code is 1 - // for write, it is done, when is retcode > 0 - // for read, is is done when retcode > 0 - - int error_code = !is_operation_done ? - ::SSL_get_error( session_, rc ) : - 0; - bool is_read_needed = (error_code == SSL_ERROR_WANT_READ); - bool is_write_needed = (error_code == SSL_ERROR_WANT_WRITE || - ::BIO_ctrl_pending( ssl_bio_ )); - bool is_shut_down_received = - ((::SSL_get_shutdown( session_ ) & SSL_RECEIVED_SHUTDOWN) == - SSL_RECEIVED_SHUTDOWN); - bool is_shut_down_sent = - ((::SSL_get_shutdown( session_ ) & SSL_SENT_SHUTDOWN) == - SSL_SENT_SHUTDOWN); - - if (is_shut_down_sent && is_shut_down_received && is_operation_done) - // SSL connection is shut down cleanly - return handler_(asio::error(), 1); - - if (is_shut_down_received && !is_write_needed) - return handler_(asio::error(asio::error::eof), 0); - - if (is_shut_down_received) - // Shutdown has been requested, while we were reading or writing... - // abort our action... - return handler_(asio::error(asio::error::shut_down), 0); - - if (!is_operation_done && !is_read_needed && !is_write_needed - && !is_shut_down_sent) - { - // The operation has failed... It is not completed and does - // not want network communication nor does want to send shutdown out... - if (error_code == SSL_ERROR_SYSCALL) - return handler_(asio::error(sys_error_code), rc); - else - return handler_(asio::error(error_code + 1000000), rc); - } - - if (!is_operation_done && !is_write_needed) - { - // We may have left over data that we can pass to SSL immediately - if (recv_buf_.get_data_len() > 0) - { - // Pass the buffered data to SSL - int written = ::BIO_write - ( - ssl_bio_, - recv_buf_.get_data_start(), - recv_buf_.get_data_len() - ); - - if (written > 0) - { - recv_buf_.data_removed(written); - } - else if (written < 0) - { - if (!BIO_should_retry(ssl_bio_)) - { - // Some serios error with BIO.... - return handler_(asio::error(asio::error::no_recovery), 0); - } - } - - return start(); - } - } - - // Continue with operation, flush any SSL data out to network... - return write_(is_operation_done, rc); - } - -// Private implementation -private: - typedef boost::function - int_handler_func; - typedef boost::function write_func; - - ssl_primitive_func primitive_; - user_handler_func user_handler_; - write_func write_; - int_handler_func handler_; - - net_buffer send_buf_; // buffers for network IO - - // The recv buffer is owned by the stream, not the operation, since there can - // be left over bytes after passing the data up to the application, and these - // bytes need to be kept around for the next read operation issued by the - // application. - net_buffer& recv_buf_; - - Stream& socket_; - BIO* ssl_bio_; - SSL* session_; - - // - int sync_user_handler(const asio::error& error, int rc) - { - if (!error) - return rc; - - throw error; - } - - int async_user_handler(const asio::error& error, int rc) - { - user_handler_(error, rc); - return 0; - } - - // Writes bytes asynchronously from SSL to NET - int do_async_write(bool is_operation_done, int rc) - { - int len = ::BIO_ctrl_pending( ssl_bio_ ); - if ( len ) - { - // There is something to write into net, do it... - len = (int)send_buf_.get_unused_len() > len? - len: - send_buf_.get_unused_len(); - - if (len == 0) - { - // In case our send buffer is full, we have just to wait until - // previous send to complete... - return 0; - } - - // Read outgoing data from bio - len = ::BIO_read( ssl_bio_, send_buf_.get_unused_start(), len); - - if (len > 0) - { - unsigned char *data_start = send_buf_.get_unused_start(); - send_buf_.data_added(len); - - asio::async_write - ( - socket_, - asio::buffer(data_start, len), - boost::bind - ( - &openssl_operation::async_write_handler, - this, - is_operation_done, - rc, - asio::placeholders::error, - asio::placeholders::bytes_transferred - ) - ); - - return 0; - } - else if (!BIO_should_retry(ssl_bio_)) - { - // Seems like fatal error - // reading from SSL BIO has failed... - handler_(asio::error(asio::error::no_recovery), 0); - return 0; - } - } - - if (is_operation_done) - { - // Finish the operation, with success - handler_(asio::error(), rc); - return 0; - } - - // OPeration is not done and writing to net has been made... - // start reading... - do_async_read(); - - return 0; - } - - void async_write_handler(bool is_operation_done, int rc, - const asio::error& error, size_t bytes_sent) - { - if (!error) - { - // Remove data from send buffer - send_buf_.data_removed(bytes_sent); - - if (is_operation_done) - handler_(asio::error(), rc); - else - // Since the operation was not completed, try it again... - start(); - } - else - handler_(error, rc); - } - - void do_async_read() - { - // Wait for new data - socket_.async_read_some - ( - asio::buffer(recv_buf_.get_unused_start(), - recv_buf_.get_unused_len()), - boost::bind - ( - &openssl_operation::async_read_handler, - this, - asio::placeholders::error, - asio::placeholders::bytes_transferred - ) - ); - } - - void async_read_handler(const asio::error& error, size_t bytes_recvd) - { - if (!error) - { - recv_buf_.data_added(bytes_recvd); - - // Pass the received data to SSL - int written = ::BIO_write - ( - ssl_bio_, - recv_buf_.get_data_start(), - recv_buf_.get_data_len() - ); - - if (written > 0) - { - recv_buf_.data_removed(written); - } - else if (written < 0) - { - if (!BIO_should_retry(ssl_bio_)) - { - // Some serios error with BIO.... - handler_(asio::error(asio::error::no_recovery), 0); - return; - } - } - - // and try the SSL primitive again - start(); - } - else - { - // Error in network level... - // SSL can't continue either... - handler_(error, 0); - } - } - - // Syncronous functions... - int do_sync_write(bool is_operation_done, int rc) - { - int len = ::BIO_ctrl_pending( ssl_bio_ ); - if ( len ) - { - // There is something to write into net, do it... - len = (int)send_buf_.get_unused_len() > len? - len: - send_buf_.get_unused_len(); - - // Read outgoing data from bio - len = ::BIO_read( ssl_bio_, send_buf_.get_unused_start(), len); - - if (len > 0) - { - size_t sent_len = asio::write( - socket_, - asio::buffer(send_buf_.get_unused_start(), len) - ); - - send_buf_.data_added(len); - send_buf_.data_removed(sent_len); - } - else if (!BIO_should_retry(ssl_bio_)) - { - // Seems like fatal error - // reading from SSL BIO has failed... - throw asio::error(asio::error::no_recovery); - } - } - - if (is_operation_done) - // Finish the operation, with success - return rc; - - // Operation is not finished, read data from net... - return do_sync_read(); - } - - int do_sync_read() - { - size_t len = socket_.read_some - ( - asio::buffer(recv_buf_.get_unused_start(), - recv_buf_.get_unused_len()) - ); - - // Write data to ssl - recv_buf_.data_added(len); - - // Pass the received data to SSL - int written = ::BIO_write - ( - ssl_bio_, - recv_buf_.get_data_start(), - recv_buf_.get_data_len() - ); - - if (written > 0) - { - recv_buf_.data_removed(written); - } - else if (written < 0) - { - if (!BIO_should_retry(ssl_bio_)) - { - // Some serios error with BIO.... - throw asio::error(asio::error::no_recovery); - } - } - - // Try the operation again - return start(); - } -}; // class openssl_operation - -} // namespace detail -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_DETAIL_OPENSSL_OPERATION_HPP diff --git a/libtorrent/include/asio/ssl/detail/openssl_stream_service.hpp b/libtorrent/include/asio/ssl/detail/openssl_stream_service.hpp deleted file mode 100644 index d190ce937..000000000 --- a/libtorrent/include/asio/ssl/detail/openssl_stream_service.hpp +++ /dev/null @@ -1,505 +0,0 @@ -// -// stream_service.hpp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2005 Voipster / Indrek dot Juhani at voipster dot com -// Copyright (c) 2005 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_DETAIL_OPENSSL_STREAM_SERVICE_HPP -#define ASIO_SSL_DETAIL_OPENSSL_STREAM_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/io_service.hpp" -#include "asio/ssl/basic_context.hpp" -#include "asio/ssl/stream_base.hpp" -#include "asio/ssl/detail/openssl_operation.hpp" -#include "asio/ssl/detail/openssl_types.hpp" - -namespace asio { -namespace ssl { -namespace detail { - -class openssl_stream_service - : public asio::io_service::service -{ -private: - //Base handler for asyncrhonous operations - template - class base_handler - { - public: - typedef boost::function func_t; - - base_handler(asio::io_service& io_service) - : op_(NULL) - , io_service_(io_service) - , work_(io_service) - {} - - void do_func(const asio::error& error, size_t size) - { - func_(error, size); - } - - void set_operation(openssl_operation* op) { op_ = op; } - void set_func(func_t func) { func_ = func; } - - ~base_handler() - { - delete op_; - } - - private: - func_t func_; - openssl_operation* op_; - asio::io_service& io_service_; - asio::io_service::work work_; - }; // class base_handler - - // Handler for asynchronous IO (write/read) operations - template - class io_handler - : public base_handler - { - public: - io_handler(Handler handler, asio::io_service& io_service) - : base_handler(io_service) - , handler_(handler) - { - set_func(boost::bind( - &io_handler::handler_impl, - this, boost::arg<1>(), boost::arg<2>() )); - } - - private: - Handler handler_; - void handler_impl(const asio::error& error, size_t size) - { - handler_(error, size); - delete this; - } - }; // class io_handler - - // Handler for asyncrhonous handshake (connect, accept) functions - template - class handshake_handler - : public base_handler - { - public: - handshake_handler(Handler handler, asio::io_service& io_service) - : base_handler(io_service) - , handler_(handler) - { - set_func(boost::bind( - &handshake_handler::handler_impl, - this, boost::arg<1>(), boost::arg<2>() )); - } - - private: - Handler handler_; - void handler_impl(const asio::error& error, size_t) - { - handler_(error); - delete this; - } - - }; // class handshake_handler - - // Handler for asyncrhonous shutdown - template - class shutdown_handler - : public base_handler - { - public: - shutdown_handler(Handler handler, asio::io_service& io_service) - : base_handler(io_service), - handler_(handler) - { - set_func(boost::bind( - &shutdown_handler::handler_impl, - this, boost::arg<1>(), boost::arg<2>() )); - } - - private: - Handler handler_; - void handler_impl(const asio::error& error, size_t) - { - handler_(error); - delete this; - } - }; // class shutdown_handler - -public: - // The implementation type. - typedef struct impl_struct - { - ::SSL* ssl; - ::BIO* ext_bio; - net_buffer recv_buf; - } * impl_type; - - // Construct a new stream socket service for the specified io_service. - explicit openssl_stream_service(asio::io_service& io_service) - : asio::io_service::service(io_service) - { - } - - // Destroy all user-defined handler objects owned by the service. - void shutdown_service() - { - } - - // Return a null stream implementation. - impl_type null() const - { - return 0; - } - - // Create a new stream implementation. - template - void create(impl_type& impl, Stream& next_layer, - basic_context& context) - { - impl = new impl_struct; - impl->ssl = ::SSL_new(context.impl()); - ::SSL_set_mode(impl->ssl, SSL_MODE_ENABLE_PARTIAL_WRITE); - ::SSL_set_mode(impl->ssl, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER); - ::BIO* int_bio = 0; - impl->ext_bio = 0; - ::BIO_new_bio_pair(&int_bio, 8192, &impl->ext_bio, 8192); - ::SSL_set_bio(impl->ssl, int_bio, int_bio); - } - - // Destroy a stream implementation. - template - void destroy(impl_type& impl, Stream& next_layer) - { - if (impl != 0) - { - ::BIO_free(impl->ext_bio); - ::SSL_free(impl->ssl); - delete impl; - impl = 0; - } - } - - // Perform SSL handshaking. - template - void handshake(impl_type& impl, Stream& next_layer, - stream_base::handshake_type type, Error_Handler error_handler) - { - try - { - openssl_operation op( - type == stream_base::client ? - &ssl_wrap::SSL_connect: - &ssl_wrap::SSL_accept, - next_layer, - impl->recv_buf, - impl->ssl, - impl->ext_bio); - op.start(); - } - catch (asio::error& e) - { - error_handler(e); - return; - } - - asio::error e; - error_handler(e); - } - - // Start an asynchronous SSL handshake. - template - void async_handshake(impl_type& impl, Stream& next_layer, - stream_base::handshake_type type, Handler handler) - { - typedef handshake_handler connect_handler; - - connect_handler* local_handler = - new connect_handler(handler, io_service()); - - openssl_operation* op = new openssl_operation - ( - type == stream_base::client ? - &ssl_wrap::SSL_connect: - &ssl_wrap::SSL_accept, - next_layer, - impl->recv_buf, - impl->ssl, - impl->ext_bio, - boost::bind - ( - &base_handler::do_func, - local_handler, - boost::arg<1>(), - boost::arg<2>() - ) - ); - local_handler->set_operation(op); - - io_service().post(boost::bind(&openssl_operation::start, op)); - } - - // Shut down SSL on the stream. - template - void shutdown(impl_type& impl, Stream& next_layer, - Error_Handler error_handler) - { - try - { - openssl_operation op( - &ssl_wrap::SSL_shutdown, - next_layer, - impl->recv_buf, - impl->ssl, - impl->ext_bio); - op.start(); - } - catch (asio::error& e) - { - error_handler(e); - return; - } - - asio::error e; - error_handler(e); - } - - // Asynchronously shut down SSL on the stream. - template - void async_shutdown(impl_type& impl, Stream& next_layer, Handler handler) - { - typedef shutdown_handler disconnect_handler; - - disconnect_handler* local_handler = - new disconnect_handler(handler, io_service()); - - openssl_operation* op = new openssl_operation - ( - &ssl_wrap::SSL_shutdown, - next_layer, - impl->recv_buf, - impl->ssl, - impl->ext_bio, - boost::bind - ( - &base_handler::do_func, - local_handler, - boost::arg<1>(), - boost::arg<2>() - ) - ); - local_handler->set_operation(op); - - io_service().post(boost::bind(&openssl_operation::start, op)); - } - - // Write some data to the stream. - template - std::size_t write_some(impl_type& impl, Stream& next_layer, - const Const_Buffers& buffers, Error_Handler error_handler) - { - size_t bytes_transferred = 0; - try - { - boost::function send_func = - boost::bind(&::SSL_write, boost::arg<1>(), - asio::buffer_cast(*buffers.begin()), - static_cast(asio::buffer_size(*buffers.begin()))); - openssl_operation op( - send_func, - next_layer, - impl->recv_buf, - impl->ssl, - impl->ext_bio - ); - bytes_transferred = static_cast(op.start()); - } - catch (asio::error& e) - { - error_handler(e); - return 0; - } - - asio::error e; - error_handler(e); - return bytes_transferred; - } - - // Start an asynchronous write. - template - void async_write_some(impl_type& impl, Stream& next_layer, - const Const_Buffers& buffers, Handler handler) - { - typedef io_handler send_handler; - - send_handler* local_handler = new send_handler(handler, io_service()); - - boost::function send_func = - boost::bind(&::SSL_write, boost::arg<1>(), - asio::buffer_cast(*buffers.begin()), - static_cast(asio::buffer_size(*buffers.begin()))); - - openssl_operation* op = new openssl_operation - ( - send_func, - next_layer, - impl->recv_buf, - impl->ssl, - impl->ext_bio, - boost::bind - ( - &base_handler::do_func, - local_handler, - boost::arg<1>(), - boost::arg<2>() - ) - ); - local_handler->set_operation(op); - - io_service().post(boost::bind(&openssl_operation::start, op)); - } - - // Read some data from the stream. - template - std::size_t read_some(impl_type& impl, Stream& next_layer, - const Mutable_Buffers& buffers, Error_Handler error_handler) - { - size_t bytes_transferred = 0; - try - { - boost::function recv_func = - boost::bind(&::SSL_read, boost::arg<1>(), - asio::buffer_cast(*buffers.begin()), - asio::buffer_size(*buffers.begin())); - openssl_operation op(recv_func, - next_layer, - impl->recv_buf, - impl->ssl, - impl->ext_bio - ); - - bytes_transferred = static_cast(op.start()); - } - catch (asio::error& e) - { - error_handler(e); - return 0; - } - - asio::error e; - error_handler(e); - return bytes_transferred; - } - - // Start an asynchronous read. - template - void async_read_some(impl_type& impl, Stream& next_layer, - const Mutable_Buffers& buffers, Handler handler) - { - typedef io_handler recv_handler; - - recv_handler* local_handler = new recv_handler(handler, io_service()); - - boost::function recv_func = - boost::bind(&::SSL_read, boost::arg<1>(), - asio::buffer_cast(*buffers.begin()), - asio::buffer_size(*buffers.begin())); - - openssl_operation* op = new openssl_operation - ( - recv_func, - next_layer, - impl->recv_buf, - impl->ssl, - impl->ext_bio, - boost::bind - ( - &base_handler::do_func, - local_handler, - boost::arg<1>(), - boost::arg<2>() - ) - ); - local_handler->set_operation(op); - - io_service().post(boost::bind(&openssl_operation::start, op)); - } - - // Peek at the incoming data on the stream. - template - std::size_t peek(impl_type& impl, Stream& next_layer, - const Mutable_Buffers& buffers, Error_Handler error_handler) - { - asio::error e; - error_handler(e); - return 0; - } - - // Determine the amount of data that may be read without blocking. - template - std::size_t in_avail(impl_type& impl, Stream& next_layer, - Error_Handler error_handler) - { - asio::error e; - error_handler(e); - return 0; - } - -private: - typedef asio::detail::mutex mutex_type; - - template - struct ssl_wrap - { - static Mutex ssl_mutex_; - - static int SSL_accept(SSL *ssl) - { - typename Mutex::scoped_lock lock(ssl_mutex_); - return ::SSL_accept(ssl); - } - - static int SSL_connect(SSL *ssl) - { - typename Mutex::scoped_lock lock(ssl_mutex_); - return ::SSL_connect(ssl); - } - - static int SSL_shutdown(SSL *ssl) - { - typename Mutex::scoped_lock lock(ssl_mutex_); - return ::SSL_shutdown(ssl); - } - }; -}; - -template -Mutex openssl_stream_service::ssl_wrap::ssl_mutex_; - -} // namespace detail -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_DETAIL_OPENSSL_STREAM_SERVICE_HPP diff --git a/libtorrent/include/asio/ssl/detail/openssl_types.hpp b/libtorrent/include/asio/ssl/detail/openssl_types.hpp deleted file mode 100755 index d193b3a0c..000000000 --- a/libtorrent/include/asio/ssl/detail/openssl_types.hpp +++ /dev/null @@ -1,29 +0,0 @@ -// -// openssl_types.hpp -// ~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2005 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_DETAIL_OPENSSL_TYPES_HPP -#define ASIO_SSL_DETAIL_OPENSSL_TYPES_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_DETAIL_OPENSSL_TYPES_HPP diff --git a/libtorrent/include/asio/ssl/stream.hpp b/libtorrent/include/asio/ssl/stream.hpp deleted file mode 100644 index 451b02e32..000000000 --- a/libtorrent/include/asio/ssl/stream.hpp +++ /dev/null @@ -1,509 +0,0 @@ -// -// stream.hpp -// ~~~~~~~~~~ -// -// Copyright (c) 2005 Voipster / Indrek dot Juhani at voipster dot com -// Copyright (c) 2005 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_STREAM_HPP -#define ASIO_SSL_STREAM_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/error.hpp" -#include "asio/error_handler.hpp" -#include "asio/ssl/basic_context.hpp" -#include "asio/ssl/stream_base.hpp" -#include "asio/ssl/stream_service.hpp" - -namespace asio { -namespace ssl { - -/// Provides stream-oriented functionality using SSL. -/** - * The stream class template provides asynchronous and blocking stream-oriented - * functionality using SSL. - * - * @par Thread Safety: - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Example: - * To use the SSL stream template with a stream_socket, you would write: - * @code - * asio::io_service io_service; - * asio::ssl::context context(io_service, asio::ssl::context::sslv23); - * asio::ssl::stream sock(io_service, context); - * @endcode - * - * @par Concepts: - * Async_Object, Async_Read_Stream, Async_Write_Stream, Error_Source, Stream, - * Sync_Read_Stream, Sync_Write_Stream. - */ -template -class stream - : public stream_base, - private boost::noncopyable -{ -public: - /// The type of the next layer. - typedef typename boost::remove_reference::type next_layer_type; - - /// The type of the lowest layer. - typedef typename next_layer_type::lowest_layer_type lowest_layer_type; - - /// The type used for reporting errors. - typedef typename next_layer_type::error_type error_type; - - /// The type of the service that will be used to provide stream operations. - typedef Service service_type; - - /// The native implementation type of the stream. - typedef typename service_type::impl_type impl_type; - - /// Construct a stream. - /** - * This constructor creates a stream and initialises the underlying stream - * object. - * - * @param arg The argument to be passed to initialise the underlying stream. - * - * @param context The SSL context to be used for the stream. - */ - template - explicit stream(Arg& arg, basic_context& context) - : next_layer_(arg), - service_(asio::use_service(next_layer_.io_service())), - impl_(service_.null()) - { - service_.create(impl_, next_layer_, context); - } - - /// Destructor. - ~stream() - { - service_.destroy(impl_, next_layer_); - } - - /// Get the io_service associated with the object. - /** - * This function may be used to obtain the io_service object that the stream - * uses to dispatch handlers for asynchronous operations. - * - * @return A reference to the io_service object that stream will use to - * dispatch handlers. Ownership is not transferred to the caller. - */ - asio::io_service& io_service() - { - return next_layer_.io_service(); - } - - /// Get a reference to the next layer. - /** - * This function returns a reference to the next layer in a stack of stream - * layers. - * - * @return A reference to the next layer in the stack of stream layers. - * Ownership is not transferred to the caller. - */ - next_layer_type& next_layer() - { - return next_layer_; - } - - /// Get a reference to the lowest layer. - /** - * This function returns a reference to the lowest layer in a stack of - * stream layers. - * - * @return A reference to the lowest layer in the stack of stream layers. - * Ownership is not transferred to the caller. - */ - lowest_layer_type& lowest_layer() - { - return next_layer_.lowest_layer(); - } - - /// Get the underlying implementation in the native type. - /** - * This function may be used to obtain the underlying implementation of the - * context. This is intended to allow access to stream functionality that is - * not otherwise provided. - */ - impl_type impl() - { - return impl_; - } - - /// Perform SSL handshaking. - /** - * This function is used to perform SSL handshaking on the stream. The - * function call will block until handshaking is complete or an error occurs. - * - * @param type The type of handshaking to be performed, i.e. as a client or as - * a server. - * - * @throws asio::error Thrown on failure. - */ - void handshake(handshake_type type) - { - service_.handshake(impl_, next_layer_, type, throw_error()); - } - - /// Perform SSL handshaking. - /** - * This function is used to perform SSL handshaking on the stream. The - * function call will block until handshaking is complete or an error occurs. - * - * @param type The type of handshaking to be performed, i.e. as a client or as - * a server. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - */ - template - void handshake(handshake_type type, Error_Handler error_handler) - { - service_.handshake(impl_, next_layer_, type, error_handler); - } - - /// Start an asynchronous SSL handshake. - /** - * This function is used to asynchronously perform an SSL handshake on the - * stream. This function call always returns immediately. - * - * @param type The type of handshaking to be performed, i.e. as a client or as - * a server. - * - * @param handler The handler to be called when the handshake operation - * completes. Copies will be made of the handler as required. The equivalent - * function signature of the handler must be: - * @code void handler( - * const asio::error& error, // Result of operation - * ); @endcode - */ - template - void async_handshake(handshake_type type, Handler handler) - { - service_.async_handshake(impl_, next_layer_, type, handler); - } - - /// Shut down SSL on the stream. - /** - * This function is used to shut down SSL on the stream. The function call - * will block until SSL has been shut down or an error occurs. - * - * @throws asio::error Thrown on failure. - */ - void shutdown() - { - service_.shutdown(impl_, next_layer_, throw_error()); - } - - /// Shut down SSL on the stream. - /** - * This function is used to shut down SSL on the stream. The function call - * will block until SSL has been shut down or an error occurs. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - */ - template - void shutdown(Error_Handler error_handler) - { - service_.shutdown(impl_, next_layer_, error_handler); - } - - /// Asynchronously shut down SSL on the stream. - /** - * This function is used to asynchronously shut down SSL on the stream. This - * function call always returns immediately. - * - * @param handler The handler to be called when the handshake operation - * completes. Copies will be made of the handler as required. The equivalent - * function signature of the handler must be: - * @code void handler( - * const asio::error& error, // Result of operation - * ); @endcode - */ - template - void async_shutdown(Handler handler) - { - service_.async_shutdown(impl_, next_layer_, handler); - } - - /// Write some data to the stream. - /** - * This function is used to write data on the stream. The function call will - * block until one or more bytes of data has been written successfully, or - * until an error occurs. - * - * @param buffers The data to be written. - * - * @returns The number of bytes written. - * - * @throws asio::error Thrown on failure. - * - * @note The write_some operation may not transmit all of the data to the - * peer. Consider using the @ref write function if you need to ensure that all - * data is written before the blocking operation completes. - */ - template - std::size_t write_some(const Const_Buffers& buffers) - { - return service_.write_some(impl_, next_layer_, buffers, throw_error()); - } - - /// Write some data to the stream. - /** - * This function is used to write data on the stream. The function call will - * block until one or more bytes of data has been written successfully, or - * until an error occurs. - * - * @param buffers The data to be written to the stream. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation. - * ); @endcode - * - * @returns The number of bytes written. Returns 0 if an error occurred and - * the error handler did not throw an exception. - * - * @note The write_some operation may not transmit all of the data to the - * peer. Consider using the @ref write function if you need to ensure that all - * data is written before the blocking operation completes. - */ - template - std::size_t write_some(const Const_Buffers& buffers, - Error_Handler error_handler) - { - return service_.write_some(impl_, next_layer_, buffers, error_handler); - } - - /// Start an asynchronous write. - /** - * This function is used to asynchronously write one or more bytes of data to - * the stream. The function call always returns immediately. - * - * @param buffers The data to be written to the stream. Although the buffers - * object may be copied as necessary, ownership of the underlying buffers is - * retained by the caller, which must guarantee that they remain valid until - * the handler is called. - * - * @param handler The handler to be called when the write operation completes. - * Copies will be made of the handler as required. The equivalent function - * signature of the handler must be: - * @code void handler( - * const asio::error& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes written. - * ); @endcode - * - * @note The async_write_some operation may not transmit all of the data to - * the peer. Consider using the @ref async_write function if you need to - * ensure that all data is written before the blocking operation completes. - */ - template - void async_write_some(const Const_Buffers& buffers, Handler handler) - { - service_.async_write_some(impl_, next_layer_, buffers, handler); - } - - /// Read some data from the stream. - /** - * This function is used to read data from the stream. The function call will - * block until one or more bytes of data has been read successfully, or until - * an error occurs. - * - * @param buffers The buffers into which the data will be read. - * - * @returns The number of bytes read. - * - * @throws asio::error Thrown on failure. - * - * @note The read_some operation may not read all of the requested number of - * bytes. Consider using the @ref read function if you need to ensure that the - * requested amount of data is read before the blocking operation completes. - */ - template - std::size_t read_some(const Mutable_Buffers& buffers) - { - return service_.read_some(impl_, next_layer_, buffers, throw_error()); - } - - /// Read some data from the stream. - /** - * This function is used to read data from the stream. The function call will - * block until one or more bytes of data has been read successfully, or until - * an error occurs. - * - * @param buffers The buffers into which the data will be read. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation. - * ); @endcode - * - * @returns The number of bytes read. Returns 0 if an error occurred and the - * error handler did not throw an exception. - * - * @note The read_some operation may not read all of the requested number of - * bytes. Consider using the @ref read function if you need to ensure that the - * requested amount of data is read before the blocking operation completes. - */ - template - std::size_t read_some(const Mutable_Buffers& buffers, - Error_Handler error_handler) - { - return service_.read_some(impl_, next_layer_, buffers, error_handler); - } - - /// Start an asynchronous read. - /** - * This function is used to asynchronously read one or more bytes of data from - * the stream. The function call always returns immediately. - * - * @param buffers The buffers into which the data will be read. Although the - * buffers object may be copied as necessary, ownership of the underlying - * buffers is retained by the caller, which must guarantee that they remain - * valid until the handler is called. - * - * @param handler The handler to be called when the read operation completes. - * Copies will be made of the handler as required. The equivalent function - * signature of the handler must be: - * @code void handler( - * const asio::error& error, // Result of operation. - * std::size_t bytes_transferred // Number of bytes read. - * ); @endcode - * - * @note The async_read_some operation may not read all of the requested - * number of bytes. Consider using the @ref async_read function if you need to - * ensure that the requested amount of data is read before the asynchronous - * operation completes. - */ - template - void async_read_some(const Mutable_Buffers& buffers, Handler handler) - { - service_.async_read_some(impl_, next_layer_, buffers, handler); - } - - /// Peek at the incoming data on the stream. - /** - * This function is used to peek at the incoming data on the stream, without - * removing it from the input queue. The function call will block until data - * has been read successfully or an error occurs. - * - * @param buffers The buffers into which the data will be read. - * - * @returns The number of bytes read. - * - * @throws asio::error Thrown on failure. - */ - template - std::size_t peek(const Mutable_Buffers& buffers) - { - return service_.peek(impl_, next_layer_, buffers, throw_error()); - } - - /// Peek at the incoming data on the stream. - /** - * This function is used to peek at the incoming data on the stream, withoutxi - * removing it from the input queue. The function call will block until data - * has been read successfully or an error occurs. - * - * @param buffers The buffers into which the data will be read. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation. - * ); @endcode - * - * @returns The number of bytes read. Returns 0 if an error occurred and the - * error handler did not throw an exception. - */ - template - std::size_t peek(const Mutable_Buffers& buffers, Error_Handler error_handler) - { - return service_.peek(impl_, next_layer_, buffers, error_handler); - } - - /// Determine the amount of data that may be read without blocking. - /** - * This function is used to determine the amount of data, in bytes, that may - * be read from the stream without blocking. - * - * @returns The number of bytes of data that can be read without blocking. - * - * @throws asio::error Thrown on failure. - */ - std::size_t in_avail() - { - return service_.in_avail(impl_, next_layer_, throw_error()); - } - - /// Determine the amount of data that may be read without blocking. - /** - * This function is used to determine the amount of data, in bytes, that may - * be read from the stream without blocking. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const asio::error& error // Result of operation - * ); @endcode - * - * @returns The number of bytes of data that can be read without blocking. - */ - template - std::size_t in_avail(Error_Handler error_handler) - { - return service_.in_avail(impl_, next_layer_, error_handler); - } - -private: - /// The next layer. - Stream next_layer_; - - /// The backend service implementation. - service_type& service_; - - /// The underlying native implementation. - impl_type impl_; -}; - -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_STREAM_HPP diff --git a/libtorrent/include/asio/ssl/stream_base.hpp b/libtorrent/include/asio/ssl/stream_base.hpp deleted file mode 100755 index 89c4b65a9..000000000 --- a/libtorrent/include/asio/ssl/stream_base.hpp +++ /dev/null @@ -1,60 +0,0 @@ -// -// stream_base.hpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2005 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_STREAM_BASE_HPP -#define ASIO_SSL_STREAM_BASE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -namespace asio { -namespace ssl { - -/// The stream_base class is used as a base for the asio::ssl::stream -/// class template so that we have a common place to define various enums. -class stream_base -{ -public: - /// Different handshake types. - enum handshake_type - { - /// Perform handshaking as a client. - client, - - /// Perform handshaking as a server. - server - }; - -protected: - /// Protected destructor to prevent deletion through this type. - ~stream_base() - { - } - -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -private: - // Workaround to enable the empty base optimisation with Borland C++. - char dummy_; -#endif -}; - -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_STREAM_BASE_HPP diff --git a/libtorrent/include/asio/ssl/stream_service.hpp b/libtorrent/include/asio/ssl/stream_service.hpp deleted file mode 100644 index 5ad5165cc..000000000 --- a/libtorrent/include/asio/ssl/stream_service.hpp +++ /dev/null @@ -1,173 +0,0 @@ -// -// stream_service.hpp -// ~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2005 Voipster / Indrek dot Juhani at voipster dot com -// Copyright (c) 2005 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SSL_STREAM_SERVICE_HPP -#define ASIO_SSL_STREAM_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/io_service.hpp" -#include "asio/ssl/basic_context.hpp" -#include "asio/ssl/stream_base.hpp" -#include "asio/ssl/detail/openssl_stream_service.hpp" - -namespace asio { -namespace ssl { - -/// Default service implementation for an SSL stream. -class stream_service - : public asio::io_service::service -{ -private: - // The type of the platform-specific implementation. - typedef detail::openssl_stream_service service_impl_type; - -public: - /// The type of a stream implementation. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined impl_type; -#else - typedef service_impl_type::impl_type impl_type; -#endif - - /// Construct a new stream service for the specified io_service. - explicit stream_service(asio::io_service& io_service) - : asio::io_service::service(io_service), - service_impl_(asio::use_service(io_service)) - { - } - - /// Destroy all user-defined handler objects owned by the service. - void shutdown_service() - { - } - - /// Return a null stream implementation. - impl_type null() const - { - return service_impl_.null(); - } - - /// Create a new stream implementation. - template - void create(impl_type& impl, Stream& next_layer, - basic_context& context) - { - service_impl_.create(impl, next_layer, context); - } - - /// Destroy a stream implementation. - template - void destroy(impl_type& impl, Stream& next_layer) - { - service_impl_.destroy(impl, next_layer); - } - - /// Perform SSL handshaking. - template - void handshake(impl_type& impl, Stream& next_layer, - stream_base::handshake_type type, Error_Handler error_handler) - { - service_impl_.handshake(impl, next_layer, type, error_handler); - } - - /// Start an asynchronous SSL handshake. - template - void async_handshake(impl_type& impl, Stream& next_layer, - stream_base::handshake_type type, Handler handler) - { - service_impl_.async_handshake(impl, next_layer, type, handler); - } - - /// Shut down SSL on the stream. - template - void shutdown(impl_type& impl, Stream& next_layer, - Error_Handler error_handler) - { - service_impl_.shutdown(impl, next_layer, error_handler); - } - - /// Asynchronously shut down SSL on the stream. - template - void async_shutdown(impl_type& impl, Stream& next_layer, Handler handler) - { - service_impl_.async_shutdown(impl, next_layer, handler); - } - - /// Write some data to the stream. - template - std::size_t write_some(impl_type& impl, Stream& next_layer, - const Const_Buffers& buffers, Error_Handler error_handler) - { - return service_impl_.write_some(impl, next_layer, buffers, error_handler); - } - - /// Start an asynchronous write. - template - void async_write_some(impl_type& impl, Stream& next_layer, - const Const_Buffers& buffers, Handler handler) - { - service_impl_.async_write_some(impl, next_layer, buffers, handler); - } - - /// Read some data from the stream. - template - std::size_t read_some(impl_type& impl, Stream& next_layer, - const Mutable_Buffers& buffers, Error_Handler error_handler) - { - return service_impl_.read_some(impl, next_layer, buffers, error_handler); - } - - /// Start an asynchronous read. - template - void async_read_some(impl_type& impl, Stream& next_layer, - const Mutable_Buffers& buffers, Handler handler) - { - service_impl_.async_read_some(impl, next_layer, buffers, handler); - } - - /// Peek at the incoming data on the stream. - template - std::size_t peek(impl_type& impl, Stream& next_layer, - const Mutable_Buffers& buffers, Error_Handler error_handler) - { - return service_impl_.peek(impl, next_layer, buffers, error_handler); - } - - /// Determine the amount of data that may be read without blocking. - template - std::size_t in_avail(impl_type& impl, Stream& next_layer, - Error_Handler error_handler) - { - return service_impl_.in_avail(impl, next_layer, error_handler); - } - -private: - // The service that provides the platform-specific implementation. - service_impl_type& service_impl_; -}; - -} // namespace ssl -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SSL_STREAM_SERVICE_HPP diff --git a/libtorrent/include/asio/strand.hpp b/libtorrent/include/asio/strand.hpp deleted file mode 100644 index e378bfd32..000000000 --- a/libtorrent/include/asio/strand.hpp +++ /dev/null @@ -1,166 +0,0 @@ -// -// strand.hpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_STRAND_HPP -#define ASIO_STRAND_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/io_service.hpp" -#include "asio/detail/strand_service.hpp" -#include "asio/detail/wrapped_handler.hpp" - -namespace asio { - -/// Provides serialised handler execution. -/** - * The io_service::strand class provides the ability to post and dispatch - * handlers with the guarantee that none of those handlers will execute - * concurrently. - * - * @par Thread Safety: - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Safe. - * - * @par Concepts: - * Dispatcher. - */ -class io_service::strand -{ -public: - /// Constructor. - /** - * Constructs the strand. - * - * @param io_service The io_service object that the strand will use to - * dispatch handlers that are ready to be run. - */ - explicit strand(asio::io_service& io_service) - : service_(asio::use_service< - asio::detail::strand_service>(io_service)) - { - service_.construct(impl_); - } - - /// Destructor. - ~strand() - { - service_.destroy(impl_); - } - - /// Get the io_service associated with the strand. - /** - * This function may be used to obtain the io_service object that the strand - * uses to dispatch handlers for asynchronous operations. - * - * @return A reference to the io_service object that the strand will use to - * dispatch handlers. Ownership is not transferred to the caller. - */ - asio::io_service& io_service() - { - return service_.io_service(); - } - - /// Request the strand to invoke the given handler. - /** - * This function is used to ask the strand to execute the given handler. - * - * The strand object guarantees that handlers posted or dispatched through - * the strand will not be executed concurrently. The handler may be executed - * inside this function if the guarantee can be met. If this function is - * called from within a handler that was posted or dispatched through the same - * strand, then the new handler will be executed immediately. - * - * The strand's guarantee is in addition to the guarantee provided by the - * underlying io_service. The io_service guarantees that the handler will only - * be called in a thread in which the io_service's run member function is - * currently being invoked. - * - * @param handler The handler to be called. The strand will make a copy of the - * handler object as required. The function signature of the handler must be: - * @code void handler(); @endcode - */ - template - void dispatch(Handler handler) - { - service_.dispatch(impl_, handler); - } - - /// Request the strand to invoke the given handler and return - /// immediately. - /** - * This function is used to ask the strand to execute the given handler, but - * without allowing the strand to call the handler from inside this function. - * - * The strand object guarantees that handlers posted or dispatched through - * the strand will not be executed concurrently. The strand's guarantee is in - * addition to the guarantee provided by the underlying io_service. The - * io_service guarantees that the handler will only be called in a thread in - * which the io_service's run member function is currently being invoked. - * - * @param handler The handler to be called. The strand will make a copy of the - * handler object as required. The function signature of the handler must be: - * @code void handler(); @endcode - */ - template - void post(Handler handler) - { - service_.post(impl_, handler); - } - - /// Create a new handler that automatically dispatches the wrapped handler - /// on the strand. - /** - * This function is used to create a new handler function object that, when - * invoked, will automatically pass the wrapped handler to the strand's - * dispatch function. - * - * @param handler The handler to be wrapped. The strand will make a copy of - * the handler object as required. The function signature of the handler must - * be: @code void handler(A1 a1, ... An an); @endcode - * - * @return A function object that, when invoked, passes the wrapped handler to - * the strand's dispatch function. Given a function object with the signature: - * @code R f(A1 a1, ... An an); @endcode - * If this function object is passed to the wrap function like so: - * @code strand.wrap(f); @endcode - * then the return value is a function object with the signature - * @code void g(A1 a1, ... An an); @endcode - * that, when invoked, executes code equivalent to: - * @code strand.dispatch(boost::bind(f, a1, ... an)); @endcode - */ - template -#if defined(GENERATING_DOCUMENTATION) - unspecified -#else - detail::wrapped_handler -#endif - wrap(Handler handler) - { - return detail::wrapped_handler(*this, handler); - } - -private: - asio::detail::strand_service& service_; - asio::detail::strand_service::implementation_type impl_; -}; - -/// Typedef for backwards compatibility. -typedef asio::io_service::strand strand; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_STRAND_HPP diff --git a/libtorrent/include/asio/stream_socket_service.hpp b/libtorrent/include/asio/stream_socket_service.hpp deleted file mode 100644 index bb604b764..000000000 --- a/libtorrent/include/asio/stream_socket_service.hpp +++ /dev/null @@ -1,256 +0,0 @@ -// -// stream_socket_service.hpp -// ~~~~~~~~~~~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_STREAM_SOCKET_SERVICE_HPP -#define ASIO_STREAM_SOCKET_SERVICE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/io_service.hpp" -#include "asio/detail/epoll_reactor.hpp" -#include "asio/detail/kqueue_reactor.hpp" -#include "asio/detail/select_reactor.hpp" -#include "asio/detail/win_iocp_socket_service.hpp" -#include "asio/detail/reactive_socket_service.hpp" - -namespace asio { - -/// Default service implementation for a stream socket. -template -class stream_socket_service - : public asio::io_service::service -{ -public: - /// The protocol type. - typedef Protocol protocol_type; - - /// The endpoint type. - typedef typename Protocol::endpoint endpoint_type; - -private: - // The type of the platform-specific implementation. -#if defined(ASIO_HAS_IOCP) - typedef detail::win_iocp_socket_service service_impl_type; -#elif defined(ASIO_HAS_EPOLL) - typedef detail::reactive_socket_service< - Protocol, detail::epoll_reactor > service_impl_type; -#elif defined(ASIO_HAS_KQUEUE) - typedef detail::reactive_socket_service< - Protocol, detail::kqueue_reactor > service_impl_type; -#else - typedef detail::reactive_socket_service< - Protocol, detail::select_reactor > service_impl_type; -#endif - -public: - /// The type of a stream socket implementation. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined implementation_type; -#else - typedef typename service_impl_type::implementation_type implementation_type; -#endif - - /// The native socket type. -#if defined(GENERATING_DOCUMENTATION) - typedef implementation_defined native_type; -#else - typedef typename service_impl_type::native_type native_type; -#endif - - /// Construct a new stream socket service for the specified io_service. - explicit stream_socket_service(asio::io_service& io_service) - : asio::io_service::service(io_service), - service_impl_(asio::use_service(io_service)) - { - } - - /// Destroy all user-defined handler objects owned by the service. - void shutdown_service() - { - } - - /// Construct a new stream socket implementation. - void construct(implementation_type& impl) - { - service_impl_.construct(impl); - } - - /// Destroy a stream socket implementation. - void destroy(implementation_type& impl) - { - service_impl_.destroy(impl); - } - - /// Open a stream socket. - template - void open(implementation_type& impl, const protocol_type& protocol, - Error_Handler error_handler) - { - if (protocol.type() == SOCK_STREAM) - service_impl_.open(impl, protocol, error_handler); - else - error_handler(asio::error(asio::error::invalid_argument)); - } - - /// Assign an existing native socket to a stream socket. - template - void assign(implementation_type& impl, const protocol_type& protocol, - const native_type& native_socket, Error_Handler error_handler) - { - service_impl_.assign(impl, protocol, native_socket, error_handler); - } - - /// Close a stream socket implementation. - template - void close(implementation_type& impl, Error_Handler error_handler) - { - service_impl_.close(impl, error_handler); - } - - /// Get the native socket implementation. - native_type native(implementation_type& impl) - { - return service_impl_.native(impl); - } - - /// Cancel all asynchronous operations associated with the socket. - template - void cancel(implementation_type& impl, Error_Handler error_handler) - { - service_impl_.cancel(impl, error_handler); - } - - /// Bind the stream socket to the specified local endpoint. - template - void bind(implementation_type& impl, const endpoint_type& endpoint, - Error_Handler error_handler) - { - service_impl_.bind(impl, endpoint, error_handler); - } - - /// Connect the stream socket to the specified endpoint. - template - void connect(implementation_type& impl, const endpoint_type& peer_endpoint, - Error_Handler error_handler) - { - service_impl_.connect(impl, peer_endpoint, error_handler); - } - - /// Start an asynchronous connect. - template - void async_connect(implementation_type& impl, - const endpoint_type& peer_endpoint, Handler handler) - { - service_impl_.async_connect(impl, peer_endpoint, handler); - } - - /// Set a socket option. - template - void set_option(implementation_type& impl, const Option& option, - Error_Handler error_handler) - { - service_impl_.set_option(impl, option, error_handler); - } - - /// Get a socket option. - template - void get_option(const implementation_type& impl, Option& option, - Error_Handler error_handler) const - { - service_impl_.get_option(impl, option, error_handler); - } - - /// Perform an IO control command on the socket. - template - void io_control(implementation_type& impl, IO_Control_Command& command, - Error_Handler error_handler) - { - service_impl_.io_control(impl, command, error_handler); - } - - /// Get the local endpoint. - template - endpoint_type local_endpoint(const implementation_type& impl, - Error_Handler error_handler) const - { - endpoint_type endpoint; - service_impl_.get_local_endpoint(impl, endpoint, error_handler); - return endpoint; - } - - /// Get the remote endpoint. - template - endpoint_type remote_endpoint(const implementation_type& impl, - Error_Handler error_handler) const - { - endpoint_type endpoint; - service_impl_.get_remote_endpoint(impl, endpoint, error_handler); - return endpoint; - } - - /// Disable sends or receives on the socket. - template - void shutdown(implementation_type& impl, socket_base::shutdown_type what, - Error_Handler error_handler) - { - service_impl_.shutdown(impl, what, error_handler); - } - - /// Send the given data to the peer. - template - std::size_t send(implementation_type& impl, const Const_Buffers& buffers, - socket_base::message_flags flags, Error_Handler error_handler) - { - return service_impl_.send(impl, buffers, flags, error_handler); - } - - /// Start an asynchronous send. - template - void async_send(implementation_type& impl, const Const_Buffers& buffers, - socket_base::message_flags flags, Handler handler) - { - service_impl_.async_send(impl, buffers, flags, handler); - } - - /// Receive some data from the peer. - template - std::size_t receive(implementation_type& impl, const Mutable_Buffers& buffers, - socket_base::message_flags flags, Error_Handler error_handler) - { - return service_impl_.receive(impl, buffers, flags, error_handler); - } - - /// Start an asynchronous receive. - template - void async_receive(implementation_type& impl, const Mutable_Buffers& buffers, - socket_base::message_flags flags, Handler handler) - { - service_impl_.async_receive(impl, buffers, flags, handler); - } - -private: - // The service that provides the platform-specific implementation. - service_impl_type& service_impl_; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_STREAM_SOCKET_SERVICE_HPP diff --git a/libtorrent/include/asio/streambuf.hpp b/libtorrent/include/asio/streambuf.hpp deleted file mode 100644 index d20c957da..000000000 --- a/libtorrent/include/asio/streambuf.hpp +++ /dev/null @@ -1,31 +0,0 @@ -// -// streambuf.hpp -// ~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_STREAMBUF_HPP -#define ASIO_STREAMBUF_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/basic_streambuf.hpp" - -namespace asio { - -/// Typedef for the typical usage of basic_streambuf. -typedef basic_streambuf<> streambuf; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_STREAMBUF_HPP diff --git a/libtorrent/include/asio/system_exception.hpp b/libtorrent/include/asio/system_exception.hpp deleted file mode 100644 index 599e22712..000000000 --- a/libtorrent/include/asio/system_exception.hpp +++ /dev/null @@ -1,198 +0,0 @@ -// -// error.hpp -// ~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_SYSTEM_EXCEPTION_HPP -#define ASIO_SYSTEM_EXCEPTION_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include -#include -#include -#include -#include -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -# include -#endif // BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -#include "asio/detail/pop_options.hpp" - -#include "asio/detail/win_local_free_on_block_exit.hpp" - -namespace asio { - -/// The system_exception class is used to represent system conditions that -/// prevent the library from operating correctly. -class system_exception - : public std::exception -{ -public: - /// Construct with a specific context and error code. - system_exception(const std::string& context, int code) - : context_(context), - code_(code) - { - } - - /// Copy constructor. - system_exception(const system_exception& e) - : std::exception(e), - context_(e.context_), - code_(e.code_) - { - } - - /// Destructor. - virtual ~system_exception() throw () - { - } - - /// Assignment operator. - system_exception& operator=(const system_exception& e) - { - context_ = e.context_; - code_ = e.code_; - what_.reset(); - return *this; - } - - /// Get a string representation of the exception. - virtual const char* what() const throw () - { -#if defined(BOOST_WINDOWS) || defined(__CYGWIN__) - try - { - if (!what_) - { - char* msg = 0; - DWORD length = ::FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER - | FORMAT_MESSAGE_FROM_SYSTEM - | FORMAT_MESSAGE_IGNORE_INSERTS, 0, code_, - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (char*)&msg, 0, 0); - detail::win_local_free_on_block_exit local_free_obj(msg); - if (length && msg[length - 1] == '\n') - msg[--length] = '\0'; - if (length && msg[length - 1] == '\r') - msg[--length] = '\0'; - if (length) - { - std::string tmp(context_); - tmp += ": "; - tmp += msg; - what_.reset(new std::string(tmp)); - } - else - { - return "asio system_exception"; - } - } - return what_->c_str(); - } - catch (std::exception&) - { - return "asio system_exception"; - } -#elif defined(__sun) || defined(__QNX__) - return strerror(code_); -#elif defined(__MACH__) && defined(__APPLE__) \ - || defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__) - try - { - char buf[256] = ""; - strerror_r(code_, buf, sizeof(buf)); - std::string tmp(context_); - tmp += ": "; - tmp += buf; - what_.reset(new std::string(tmp)); - return what_->c_str(); - } - catch (std::exception&) - { - return "asio system_exception"; - } -#else - try - { - char buf[256] = ""; - std::string tmp(context_); - tmp += ": "; - tmp += strerror_r(code_, buf, sizeof(buf)); - what_.reset(new std::string(tmp)); - return what_->c_str(); - } - catch (std::exception&) - { - return "asio system_exception"; - } -#endif - } - - /// Get the implementation-defined context associated with the exception. - const std::string& context() const - { - return context_; - } - - /// Get the implementation-defined code associated with the exception. - int code() const - { - return code_; - } - -private: - // The context associated with the error. - std::string context_; - - // The code associated with the error. - int code_; - - // The string representation of the error. - mutable boost::scoped_ptr what_; -}; - -/// Output the string associated with a system exception. -/** - * Used to output a human-readable string that is associated with a system - * exception. - * - * @param os The output stream to which the string will be written. - * - * @param e The exception to be written. - * - * @return The output stream. - * - * @relates asio::system_exception - */ -#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -std::ostream& operator<<(std::ostream& os, const system_exception& e) -{ - os << e.what(); - return os; -} -#else // BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) -template -Ostream& operator<<(Ostream& os, const system_exception& e) -{ - os << e.what(); - return os; -} -#endif // BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_SYSTEM_EXCEPTION_HPP diff --git a/libtorrent/include/asio/thread.hpp b/libtorrent/include/asio/thread.hpp deleted file mode 100644 index 72b2510ca..000000000 --- a/libtorrent/include/asio/thread.hpp +++ /dev/null @@ -1,91 +0,0 @@ -// -// thread.hpp -// ~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_THREAD_HPP -#define ASIO_THREAD_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/noncopyable.hpp" -#include "asio/detail/thread.hpp" - -namespace asio { - -/// A simple abstraction for starting threads. -/** - * The asio::thread class implements the smallest possible subset of the - * functionality of boost::thread. It is intended to be used only for starting - * a thread and waiting for it to exit. If more extensive threading - * capabilities are required, you are strongly advised to use something else. - * - * @par Thread Safety: - * @e Distinct @e objects: Safe.@n - * @e Shared @e objects: Unsafe. - * - * @par Example: - * A typical use of asio::thread would be to launch a thread to run an - * io_service's event processing loop: - * - * @par - * @code asio::io_service io_service; - * // ... - * asio::thread t(boost::bind(&asio::io_service::run, &io_service)); - * // ... - * t.join(); @endcode - */ -class thread - : private noncopyable -{ -public: - /// Start a new thread that executes the supplied function. - /** - * This constructor creates a new thread that will execute the given function - * or function object. - * - * @param f The function or function object to be run in the thread. The - * function signature must be: @code void f(); @endcode - */ - template - explicit thread(Function f) - : impl_(f) - { - } - - /// Destructor. - ~thread() - { - } - - /// Wait for the thread to exit. - /** - * This function will block until the thread has exited. - * - * If this function is not called before the thread object is destroyed, the - * thread itself will continue to run until completion. You will, however, - * no longer have the ability to wait for it to exit. - */ - void join() - { - impl_.join(); - } - -private: - detail::thread impl_; -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_THREAD_HPP diff --git a/libtorrent/include/asio/time_traits.hpp b/libtorrent/include/asio/time_traits.hpp deleted file mode 100644 index 7b459944c..000000000 --- a/libtorrent/include/asio/time_traits.hpp +++ /dev/null @@ -1,78 +0,0 @@ -// -// time_traits.hpp -// ~~~~~~~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_TIME_TRAITS_HPP -#define ASIO_TIME_TRAITS_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/socket_types.hpp" // Must come before posix_time. - -#include "asio/detail/push_options.hpp" -#include -#include "asio/detail/pop_options.hpp" - -namespace asio { - -/// Time traits suitable for use with the deadline timer. -template -struct time_traits; - -/// Time traits specialised for posix_time. -template <> -struct time_traits -{ - /// The time type. - typedef boost::posix_time::ptime time_type; - - /// The duration type. - typedef boost::posix_time::time_duration duration_type; - - /// Get the current time. - static time_type now() - { - return boost::posix_time::microsec_clock::universal_time(); - } - - /// Add a duration to a time. - static time_type add(const time_type& t, const duration_type& d) - { - return t + d; - } - - /// Subtract one time from another. - static duration_type subtract(const time_type& t1, const time_type& t2) - { - return t1 - t2; - } - - /// Test whether one time is less than another. - static bool less_than(const time_type& t1, const time_type& t2) - { - return t1 < t2; - } - - /// Convert to POSIX duration type. - static boost::posix_time::time_duration to_posix_duration( - const duration_type& d) - { - return d; - } -}; - -} // namespace asio - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_TIME_TRAITS_HPP diff --git a/libtorrent/include/asio/write.hpp b/libtorrent/include/asio/write.hpp deleted file mode 100644 index 7bebecf49..000000000 --- a/libtorrent/include/asio/write.hpp +++ /dev/null @@ -1,543 +0,0 @@ -// -// write.hpp -// ~~~~~~~~~ -// -// Copyright (c) 2003-2006 Christopher M. Kohlhoff (chris at kohlhoff dot com) -// -// Distributed under the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -// - -#ifndef ASIO_WRITE_HPP -#define ASIO_WRITE_HPP - -#if defined(_MSC_VER) && (_MSC_VER >= 1200) -# pragma once -#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) - -#include "asio/detail/push_options.hpp" - -#include "asio/detail/push_options.hpp" -#include -#include -#include "asio/detail/pop_options.hpp" - -#include "asio/basic_streambuf.hpp" - -namespace asio { - -/** - * @defgroup write asio::write - */ -/*@{*/ - -/// Write all of the supplied data to a stream before returning. -/** - * This function is used to write a certain number of bytes of data to a stream. - * The call will block until one of the following conditions is true: - * - * @li All of the data in the supplied buffers has been written. That is, the - * bytes transferred is equal to the sum of the buffer sizes. - * - * @li An error occurred. - * - * This operation is implemented in terms of one or more calls to the stream's - * write_some function. - * - * @param s The stream to which the data is to be written. The type must support - * the Sync_Write_Stream concept. - * - * @param buffers One or more buffers containing the data to be written. The sum - * of the buffer sizes indicates the maximum number of bytes to write to the - * stream. - * - * @returns The number of bytes transferred. - * - * @throws Sync_Write_Stream::error_type Thrown on failure. - * - * @par Example: - * To write a single data buffer use the @ref buffer function as follows: - * @code asio::write(s, asio::buffer(data, size)); @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - * - * @note This overload is equivalent to calling: - * @code asio::write( - * s, buffers, - * asio::transfer_all(), - * asio::throw_error()); @endcode - */ -template -std::size_t write(Sync_Write_Stream& s, const Const_Buffers& buffers); - -/// Write a certain amount of data to a stream before returning. -/** - * This function is used to write a certain number of bytes of data to a stream. - * The call will block until one of the following conditions is true: - * - * @li All of the data in the supplied buffers has been written. That is, the - * bytes transferred is equal to the sum of the buffer sizes. - * - * @li The completion_condition function object returns true. - * - * This operation is implemented in terms of one or more calls to the stream's - * write_some function. - * - * @param s The stream to which the data is to be written. The type must support - * the Sync_Write_Stream concept. - * - * @param buffers One or more buffers containing the data to be written. The sum - * of the buffer sizes indicates the maximum number of bytes to write to the - * stream. - * - * @param completion_condition The function object to be called to determine - * whether the write operation is complete. The signature of the function object - * must be: - * @code bool completion_condition( - * const Sync_Write_Stream::error_type& error, // Result of latest write_some - * // operation. - * - * std::size_t bytes_transferred // Number of bytes transferred - * // so far. - * ); @endcode - * A return value of true indicates that the write operation is complete. False - * indicates that further calls to the stream's write_some function are - * required. - * - * @returns The number of bytes transferred. - * - * @throws Sync_Write_Stream::error_type Thrown on failure. - * - * @par Example: - * To write a single data buffer use the @ref buffer function as follows: - * @code asio::write(s, asio::buffer(data, size), - * asio::transfer_at_least(32)); @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - * - * @note This overload is equivalent to calling: - * @code asio::write( - * s, buffers, - * completion_condition, - * asio::throw_error()); @endcode - */ -template -std::size_t write(Sync_Write_Stream& s, const Const_Buffers& buffers, - Completion_Condition completion_condition); - -/// Write a certain amount of data to a stream before returning. -/** - * This function is used to write a certain number of bytes of data to a stream. - * The call will block until one of the following conditions is true: - * - * @li All of the data in the supplied buffers has been written. That is, the - * bytes transferred is equal to the sum of the buffer sizes. - * - * @li The completion_condition function object returns true. - * - * This operation is implemented in terms of one or more calls to the stream's - * write_some function. - * - * @param s The stream to which the data is to be written. The type must support - * the Sync_Write_Stream concept. - * - * @param buffers One or more buffers containing the data to be written. The sum - * of the buffer sizes indicates the maximum number of bytes to write to the - * stream. - * - * @param completion_condition The function object to be called to determine - * whether the write operation is complete. The signature of the function object - * must be: - * @code bool completion_condition( - * const Sync_Write_Stream::error_type& error, // Result of latest write_some - * // operation. - * - * std::size_t bytes_transferred // Number of bytes transferred - * // so far. - * ); @endcode - * A return value of true indicates that the write operation is complete. False - * indicates that further calls to the stream's write_some function are - * required. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const Sync_Write_Stream::error_type& error // Result of operation. - * ); @endcode - * - * @returns The number of bytes written. If an error occurs, and the error - * handler does not throw an exception, returns the total number of bytes - * successfully transferred prior to the error. - */ -template -std::size_t write(Sync_Write_Stream& s, const Const_Buffers& buffers, - Completion_Condition completion_condition, Error_Handler error_handler); - -/// Write a certain amount of data to a stream before returning. -/** - * This function is used to write a certain number of bytes of data to a stream. - * The call will block until one of the following conditions is true: - * - * @li All of the data in the supplied basic_streambuf has been written. - * - * @li An error occurred. - * - * This operation is implemented in terms of one or more calls to the stream's - * write_some function. - * - * @param s The stream to which the data is to be written. The type must support - * the Sync_Write_Stream concept. - * - * @param b The basic_streambuf object from which data will be written. - * - * @returns The number of bytes transferred. - * - * @throws Sync_Write_Stream::error_type Thrown on failure. - * - * @note This overload is equivalent to calling: - * @code asio::write( - * s, b, - * asio::transfer_all(), - * asio::throw_error()); @endcode - */ -template -std::size_t write(Sync_Write_Stream& s, basic_streambuf& b); - -/// Write a certain amount of data to a stream before returning. -/** - * This function is used to write a certain number of bytes of data to a stream. - * The call will block until one of the following conditions is true: - * - * @li All of the data in the supplied basic_streambuf has been written. - * - * @li The completion_condition function object returns true. - * - * This operation is implemented in terms of one or more calls to the stream's - * write_some function. - * - * @param s The stream to which the data is to be written. The type must support - * the Sync_Write_Stream concept. - * - * @param b The basic_streambuf object from which data will be written. - * - * @param completion_condition The function object to be called to determine - * whether the write operation is complete. The signature of the function object - * must be: - * @code bool completion_condition( - * const Sync_Write_Stream::error_type& error, // Result of latest write_some - * // operation. - * - * std::size_t bytes_transferred // Number of bytes transferred - * // so far. - * ); @endcode - * A return value of true indicates that the write operation is complete. False - * indicates that further calls to the stream's write_some function are - * required. - * - * @returns The number of bytes transferred. - * - * @throws Sync_Write_Stream::error_type Thrown on failure. - * - * @note This overload is equivalent to calling: - * @code asio::write( - * s, b, - * completion_condition, - * asio::throw_error()); @endcode - */ -template -std::size_t write(Sync_Write_Stream& s, basic_streambuf& b, - Completion_Condition completion_condition); - -/// Write a certain amount of data to a stream before returning. -/** - * This function is used to write a certain number of bytes of data to a stream. - * The call will block until one of the following conditions is true: - * - * @li All of the data in the supplied basic_streambuf has been written. - * - * @li The completion_condition function object returns true. - * - * This operation is implemented in terms of one or more calls to the stream's - * write_some function. - * - * @param s The stream to which the data is to be written. The type must support - * the Sync_Write_Stream concept. - * - * @param b The basic_streambuf object from which data will be written. - * - * @param completion_condition The function object to be called to determine - * whether the write operation is complete. The signature of the function object - * must be: - * @code bool completion_condition( - * const Sync_Write_Stream::error_type& error, // Result of latest write_some - * // operation. - * - * std::size_t bytes_transferred // Number of bytes transferred - * // so far. - * ); @endcode - * A return value of true indicates that the write operation is complete. False - * indicates that further calls to the stream's write_some function are - * required. - * - * @param error_handler A handler to be called when the operation completes, - * to indicate whether or not an error has occurred. Copies will be made of - * the handler as required. The function signature of the handler must be: - * @code void error_handler( - * const Sync_Write_Stream::error_type& error // Result of operation. - * ); @endcode - * - * @returns The number of bytes written. If an error occurs, and the error - * handler does not throw an exception, returns the total number of bytes - * successfully transferred prior to the error. - */ -template -std::size_t write(Sync_Write_Stream& s, basic_streambuf& b, - Completion_Condition completion_condition, Error_Handler error_handler); - -/*@}*/ -/** - * @defgroup async_write asio::async_write - */ -/*@{*/ - -/// Start an asynchronous operation to write of all of the supplied data to a -/// stream. -/** - * This function is used to asynchronously write a certain number of bytes of - * data to a stream. The function call always returns immediately. The - * asynchronous operation will continue until one of the following conditions - * is true: - * - * @li All of the data in the supplied buffers has been written. That is, the - * bytes transferred is equal to the sum of the buffer sizes. - * - * @li An error occurred. - * - * This operation is implemented in terms of one or more calls to the stream's - * async_write_some function. - * - * @param s The stream to which the data is to be written. The type must support - * the Async_Write_Stream concept. - * - * @param buffers One or more buffers containing the data to be written. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param handler The handler to be called when the write operation completes. - * Copies will be made of the handler as required. The function signature of - * the handler must be: - * @code void handler( - * const Async_Write_Stream::error_type& error, // Result of operation. - * - * std::size_t bytes_transferred // Number of bytes written - * // from the buffers. If an - * // error occurred, this will - * // be less than the sum of the - * // buffer sizes. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - * - * @par Example: - * To write a single data buffer use the @ref buffer function as follows: - * @code - * asio::async_write(s, asio::buffer(data, size), handler); - * @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ -template -void async_write(Async_Write_Stream& s, const Const_Buffers& buffers, - Handler handler); - -/// Start an asynchronous operation to write a certain amount of data to a -/// stream. -/** - * This function is used to asynchronously write a certain number of bytes of - * data to a stream. The function call always returns immediately. The - * asynchronous operation will continue until one of the following conditions - * is true: - * - * @li All of the data in the supplied buffers has been written. That is, the - * bytes transferred is equal to the sum of the buffer sizes. - * - * @li The completion_condition function object returns true. - * - * This operation is implemented in terms of one or more calls to the stream's - * async_write_some function. - * - * @param s The stream to which the data is to be written. The type must support - * the Async_Write_Stream concept. - * - * @param buffers One or more buffers containing the data to be written. - * Although the buffers object may be copied as necessary, ownership of the - * underlying memory blocks is retained by the caller, which must guarantee - * that they remain valid until the handler is called. - * - * @param completion_condition The function object to be called to determine - * whether the write operation is complete. The signature of the function object - * must be: - * @code bool completion_condition( - * const Async_Write_Stream::error_type& error, // Result of latest write_some - * // operation. - * - * std::size_t bytes_transferred // Number of bytes transferred - * // so far. - * ); @endcode - * A return value of true indicates that the write operation is complete. False - * indicates that further calls to the stream's async_write_some function are - * required. - * - * @param handler The handler to be called when the write operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * const Async_Write_Stream::error_type& error, // Result of operation. - * - * std::size_t bytes_transferred // Number of bytes written - * // from the buffers. If an - * // error occurred, this will - * // be less than the sum of the - * // buffer sizes. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - * - * @par Example: - * To write a single data buffer use the @ref buffer function as follows: - * @code asio::async_write(s, - * asio::buffer(data, size), - * asio::transfer_at_least(32), - * handler); @endcode - * See the @ref buffer documentation for information on writing multiple - * buffers in one go, and how to use it with arrays, boost::array or - * std::vector. - */ -template -void async_write(Async_Write_Stream& s, const Const_Buffers& buffers, - Completion_Condition completion_condition, Handler handler); - -/// Start an asynchronous operation to write a certain amount of data to a -/// stream. -/** - * This function is used to asynchronously write a certain number of bytes of - * data to a stream. The function call always returns immediately. The - * asynchronous operation will continue until one of the following conditions - * is true: - * - * @li All of the data in the supplied basic_streambuf has been written. - * - * @li An error occurred. - * - * This operation is implemented in terms of one or more calls to the stream's - * async_write_some function. - * - * @param s The stream to which the data is to be written. The type must support - * the Async_Write_Stream concept. - * - * @param b A basic_streambuf object from which data will be written. Ownership - * of the streambuf is retained by the caller, which must guarantee that it - * remains valid until the handler is called. - * - * @param handler The handler to be called when the write operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * const Async_Write_Stream::error_type& error, // Result of operation. - * - * std::size_t bytes_transferred // Number of bytes written - * // from the buffers. If an - * // error occurred, this will - * // be less than the sum of the - * // buffer sizes. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - */ -template -void async_write(Async_Write_Stream& s, basic_streambuf& b, - Handler handler); - -/// Start an asynchronous operation to write a certain amount of data to a -/// stream. -/** - * This function is used to asynchronously write a certain number of bytes of - * data to a stream. The function call always returns immediately. The - * asynchronous operation will continue until one of the following conditions - * is true: - * - * @li All of the data in the supplied basic_streambuf has been written. - * - * @li The completion_condition function object returns true. - * - * This operation is implemented in terms of one or more calls to the stream's - * async_write_some function. - * - * @param s The stream to which the data is to be written. The type must support - * the Async_Write_Stream concept. - * - * @param b A basic_streambuf object from which data will be written. Ownership - * of the streambuf is retained by the caller, which must guarantee that it - * remains valid until the handler is called. - * - * @param completion_condition The function object to be called to determine - * whether the write operation is complete. The signature of the function object - * must be: - * @code bool completion_condition( - * const Async_Write_Stream::error_type& error, // Result of latest write_some - * // operation. - * - * std::size_t bytes_transferred // Number of bytes transferred - * // so far. - * ); @endcode - * A return value of true indicates that the write operation is complete. False - * indicates that further calls to the stream's async_write_some function are - * required. - * - * @param handler The handler to be called when the write operation completes. - * Copies will be made of the handler as required. The function signature of the - * handler must be: - * @code void handler( - * const Async_Write_Stream::error_type& error, // Result of operation. - * - * std::size_t bytes_transferred // Number of bytes written - * // from the buffers. If an - * // error occurred, this will - * // be less than the sum of the - * // buffer sizes. - * ); @endcode - * Regardless of whether the asynchronous operation completes immediately or - * not, the handler will not be invoked from within this function. Invocation of - * the handler will be performed in a manner equivalent to using - * asio::io_service::post(). - */ -template -void async_write(Async_Write_Stream& s, basic_streambuf& b, - Completion_Condition completion_condition, Handler handler); - -/*@}*/ - -} // namespace asio - -#include "asio/impl/write.ipp" - -#include "asio/detail/pop_options.hpp" - -#endif // ASIO_WRITE_HPP diff --git a/libtorrent/include/aux_/allocate_resources_impl.hpp b/libtorrent/include/aux_/allocate_resources_impl.hpp deleted file mode 100644 index 4be3d8a1e..000000000 --- a/libtorrent/include/aux_/allocate_resources_impl.hpp +++ /dev/null @@ -1,239 +0,0 @@ -/* - -Copyright (c) 2003, Magnus Jonsson -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_ALLOCATE_RESOURCES_IMPL_HPP_INCLUDED -#define TORRENT_ALLOCATE_RESOURCES_IMPL_HPP_INCLUDED - -#include -#include - -#include - -#include "libtorrent/resource_request.hpp" -#include "libtorrent/peer_id.hpp" -#include "libtorrent/socket.hpp" -#include "libtorrent/size_type.hpp" - -#ifdef min -#undef min -#endif - -#ifdef max -#undef max -#endif - -namespace libtorrent -{ - - int saturated_add(int a, int b); - - namespace aux - { - // give num_resources to r, - // return how how many were actually accepted. - inline int give(resource_request& r, int num_resources) - { - assert(num_resources >= 0); - assert(r.given <= r.max); - - int accepted = (std::min)(num_resources, r.max - r.given); - assert(accepted >= 0); - - r.given += accepted; - assert(r.given <= r.max); - - return accepted; - } - -#ifndef NDEBUG - - template - class allocate_resources_contract_check - { - int m_resources; - It m_start; - It m_end; - resource_request T::* m_res; - - public: - allocate_resources_contract_check( - int resources - , It start - , It end - , resource_request T::* res) - : m_resources(resources) - , m_start(start) - , m_end(end) - , m_res(res) - { - assert(m_resources >= 0); - for (It i = m_start, end(m_end); i != end; ++i) - { - assert(((*i).*m_res).max >= 0); - assert(((*i).*m_res).given >= 0); - } - } - - ~allocate_resources_contract_check() - { - int sum_given = 0; - int sum_max = 0; - int sum_min = 0; - for (It i = m_start, end(m_end); i != end; ++i) - { - assert(((*i).*m_res).max >= 0); - assert(((*i).*m_res).min >= 0); - assert(((*i).*m_res).max >= ((*i).*m_res).min); - assert(((*i).*m_res).given >= 0); - assert(((*i).*m_res).given <= ((*i).*m_res).max); - - sum_given = saturated_add(sum_given, ((*i).*m_res).given); - sum_max = saturated_add(sum_max, ((*i).*m_res).max); - sum_min = saturated_add(sum_min, ((*i).*m_res).min); - } - assert(sum_given == (std::min)(std::max(m_resources, sum_min), sum_max)); - } - }; - -#endif - - template - void allocate_resources_impl( - int resources - , It start - , It end - , resource_request T::* res) - { - assert(resources >= 0); - #ifndef NDEBUG - allocate_resources_contract_check contract_check( - resources - , start - , end - , res); - #endif - - if (resources == resource_request::inf) - { - // No competition for resources. - // Just give everyone what they want. - for (It i = start; i != end; ++i) - { - ((*i).*res).given = ((*i).*res).max; - } - return; - } - - // Resources are scarce - - int sum_max = 0; - int sum_min = 0; - for (It i = start; i != end; ++i) - { - sum_max = saturated_add(sum_max, ((*i).*res).max); - assert(((*i).*res).min < resource_request::inf); - assert(((*i).*res).min >= 0); - assert(((*i).*res).min <= ((*i).*res).max); - sum_min += ((*i).*res).min; - ((*i).*res).given = ((*i).*res).min; - } - - if (resources == 0 || sum_max == 0) - return; - - resources = (std::max)(resources, sum_min); - int resources_to_distribute = (std::min)(resources, sum_max) - sum_min; - assert(resources_to_distribute >= 0); -#ifndef NDEBUG - int prev_resources_to_distribute = resources_to_distribute; -#endif - while (resources_to_distribute > 0) - { - size_type total_used = 0; - size_type max_used = 0; - for (It i = start; i != end; ++i) - { - resource_request& r = (*i).*res; - if(r.given == r.max) continue; - - assert(r.given < r.max); - - max_used = (std::max)(max_used, (size_type)r.used + 1); - total_used += (size_type)r.used + 1; - } - - size_type kNumer = resources_to_distribute; - size_type kDenom = total_used; - assert(kNumer >= 0); - assert(kDenom >= 0); - assert(kNumer <= (std::numeric_limits::max)()); - assert(total_used < (std::numeric_limits::max)()); - - if (kNumer * max_used <= kDenom) - { - kNumer = 1; - kDenom = max_used; - assert(kDenom >= 0); - assert(kDenom <= (std::numeric_limits::max)()); - } - - for (It i = start; i != end && resources_to_distribute > 0; ++i) - { - resource_request& r = (*i).*res; - if (r.given == r.max) continue; - - assert(r.given < r.max); - - size_type used = (size_type)r.used + 1; - if (used < 1) used = 1; - size_type to_give = used * kNumer / kDenom; - if (to_give > resources_to_distribute) - to_give = resources_to_distribute; - assert(to_give >= 0); - assert(to_give <= resources_to_distribute); - resources_to_distribute -= give(r, (int)to_give); - assert(resources_to_distribute >= 0); - } - - assert(resources_to_distribute >= 0); - assert(resources_to_distribute < prev_resources_to_distribute); -#ifndef NDEBUG - prev_resources_to_distribute = resources_to_distribute; -#endif - } - } - - } // namespace libtorrent::aux -} - - -#endif diff --git a/libtorrent/include/aux_/session_impl.hpp b/libtorrent/include/aux_/session_impl.hpp deleted file mode 100644 index 2712e7078..000000000 --- a/libtorrent/include/aux_/session_impl.hpp +++ /dev/null @@ -1,382 +0,0 @@ -/* - -Copyright (c) 2006, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_SESSION_IMPL_HPP_INCLUDED -#define TORRENT_SESSION_IMPL_HPP_INCLUDED - -#include -#include -#include -#include -#include -#include - -#ifdef _MSC_VER -#pragma warning(push, 1) -#endif - -#include -#include -#include -#include -#include - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -#include "libtorrent/torrent_handle.hpp" -#include "libtorrent/entry.hpp" -#include "libtorrent/torrent_info.hpp" -#include "libtorrent/socket.hpp" -#include "libtorrent/peer_connection.hpp" -#include "libtorrent/peer_id.hpp" -#include "libtorrent/policy.hpp" -#include "libtorrent/tracker_manager.hpp" -#include "libtorrent/peer_info.hpp" -#include "libtorrent/alert.hpp" -#include "libtorrent/fingerprint.hpp" -#include "libtorrent/debug.hpp" -#include "libtorrent/peer_request.hpp" -#include "libtorrent/piece_block_progress.hpp" -#include "libtorrent/ip_filter.hpp" -#include "libtorrent/config.hpp" -#include "libtorrent/session_settings.hpp" -#include "libtorrent/kademlia/dht_tracker.hpp" -#include "libtorrent/session_status.hpp" -#include "libtorrent/session.hpp" -#include "libtorrent/stat.hpp" - -namespace libtorrent -{ - - namespace aux - { - struct session_impl; - - // this data is shared between the main thread and the - // thread that initialize pieces - struct piece_checker_data - { - piece_checker_data() - : processing(false), progress(0.f), abort(false) {} - - boost::shared_ptr torrent_ptr; - boost::filesystem::path save_path; - - sha1_hash info_hash; - - void parse_resume_data( - const entry& rd - , const torrent_info& info - , std::string& error); - - std::vector piece_map; - std::vector unfinished_pieces; - std::vector peers; - entry resume_data; - - // this is true if this torrent is being processed (checked) - // if it is not being processed, then it can be removed from - // the queue without problems, otherwise the abort flag has - // to be set. - bool processing; - - // is filled in by storage::initialize_pieces() - // and represents the progress. It should be a - // value in the range [0, 1] - float progress; - - // abort defaults to false and is typically - // filled in by torrent_handle when the user - // aborts the torrent - bool abort; - }; - - struct checker_impl: boost::noncopyable - { - checker_impl(session_impl& s): m_ses(s), m_abort(false) {} - void operator()(); - piece_checker_data* find_torrent(const sha1_hash& info_hash); - void remove_torrent(sha1_hash const& info_hash); - -#ifndef NDEBUG - void check_invariant() const; -#endif - - // when the files has been checked - // the torrent is added to the session - session_impl& m_ses; - - mutable boost::mutex m_mutex; - boost::condition m_cond; - - // a list of all torrents that are currently in queue - // or checking their files - std::deque > m_torrents; - std::deque > m_processing; - - bool m_abort; - }; - - // this is the link between the main thread and the - // thread started to run the main downloader loop - struct session_impl: boost::noncopyable - { -#ifndef NDEBUG - friend class ::libtorrent::peer_connection; -#endif - friend class checker_impl; - friend class invariant_access; - typedef std::map - , boost::intrusive_ptr > - connection_map; - typedef std::map > torrent_map; - typedef std::deque > - connection_queue; - - session_impl( - std::pair listen_port_range - , fingerprint const& cl_fprint - , char const* listen_interface = "0.0.0.0"); - ~session_impl(); - - void operator()(); - - void open_listen_port(); - - void async_accept(); - void on_incoming_connection(boost::shared_ptr const& s - , boost::weak_ptr const& as, asio::error const& e); - - // must be locked to access the data - // in this struct - typedef boost::recursive_mutex mutex_t; - mutable mutex_t m_mutex; - - boost::weak_ptr find_torrent(const sha1_hash& info_hash); - peer_id const& get_peer_id() const { return m_peer_id; } - - // this will see if there are any pending connection attempts - // and in that case initiate new connections until the limit - // is reached. - void process_connection_queue(); - - void close_connection(boost::intrusive_ptr const& p); - void connection_completed(boost::intrusive_ptr const& p); - void connection_failed(boost::shared_ptr const& s - , tcp::endpoint const& a, char const* message); - - void set_settings(session_settings const& s); - session_settings const& settings() const { return m_settings; } - -#ifndef TORRENT_DISABLE_DHT - void add_dht_node(std::pair const& node); - void add_dht_node(udp::endpoint n); - void add_dht_router(std::pair const& node); - void set_dht_settings(dht_settings const& s); - dht_settings const& kad_settings() const { return m_dht_settings; } - void start_dht(entry const& startup_state); - void stop_dht(); - entry dht_state() const; -#endif - bool is_aborted() const { return m_abort; } - - void set_ip_filter(ip_filter const& f); - - bool listen_on( - std::pair const& port_range - , const char* net_interface = 0); - bool is_listening() const; - - torrent_handle add_torrent( - torrent_info const& ti - , boost::filesystem::path const& save_path - , entry const& resume_data - , bool compact_mode - , int block_size); - - torrent_handle add_torrent( - char const* tracker_url - , sha1_hash const& info_hash - , boost::filesystem::path const& save_path - , entry const& resume_data - , bool compact_mode - , int block_size); - - void remove_torrent(torrent_handle const& h); - - void disable_extensions(); - void enable_extension(extension_index i); - bool extensions_enabled() const; - bool extension_enabled(int i) const - { return m_extension_enabled[i]; } - - std::vector get_torrents(); - - void set_severity_level(alert::severity_t s); - std::auto_ptr pop_alert(); - void set_download_rate_limit(int bytes_per_second); - void set_upload_rate_limit(int bytes_per_second); - void set_max_half_open_connections(int limit); - void set_max_connections(int limit); - void set_max_uploads(int limit); - - - session_status status() const; - void set_peer_id(peer_id const& id); - void set_key(int key); - unsigned short listen_port() const; - - void abort(); - - // handles delayed alerts - alert_manager m_alerts; - -// private: - - // this is where all active sockets are stored. - // the selector can sleep while there's no activity on - // them - demuxer m_selector; - - tracker_manager m_tracker_manager; - torrent_map m_torrents; - - // this maps sockets to their peer_connection - // object. It is the complete list of all connected - // peers. - connection_map m_connections; - - // this is a list of half-open tcp connections - // (only outgoing connections) - connection_map m_half_open; - - // this is a queue of pending outgoing connections. If the - // list of half-open connections is full (given the global - // limit), new outgoing connections are put on this queue, - // waiting for one slot in the half-open queue to open up. - connection_queue m_connection_queue; - - // filters incoming connections - ip_filter m_ip_filter; - - // the peer id that is generated at the start of the session - peer_id m_peer_id; - - // the key is an id that is used to identify the - // client with the tracker only. It is randomized - // at startup - int m_key; - - // the range of ports we try to listen on - std::pair m_listen_port_range; - - // the ip-address of the interface - // we are supposed to listen on. - // if the ip is set to zero, it means - // that we should let the os decide which - // interface to listen on - tcp::endpoint m_listen_interface; - - boost::shared_ptr m_listen_socket; - - // the entries in this array maps the - // extension index (as specified in peer_connection) - bool m_extension_enabled[num_supported_extensions]; - - // the settings for the client - session_settings m_settings; - - // set to true when the session object - // is being destructed and the thread - // should exit - volatile bool m_abort; - - // maximum upload rate given in - // bytes per second. -1 means - // unlimited - int m_upload_rate; - int m_download_rate; - int m_max_uploads; - int m_max_connections; - // the number of simultaneous half-open tcp - // connections libtorrent will have. - int m_half_open_limit; - - // statistics gathered from all torrents. - stat m_stat; - - // is false by default and set to true when - // the first incoming connection is established - // this is used to know if the client is behind - // NAT or not. - bool m_incoming_connection; - - // does the actual disconnections - // that are queued up in m_disconnect_peer - void second_tick(asio::error const& e); - boost::posix_time::ptime m_last_tick; - -#ifndef TORRENT_DISABLE_DHT - boost::scoped_ptr m_dht; - dht_settings m_dht_settings; -#endif - // the timer used to fire the second_tick - deadline_timer m_timer; -#ifndef NDEBUG - void check_invariant(const char *place = 0); -#endif -#if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) - boost::shared_ptr create_log(std::string const& name, bool append = true); - public: - boost::shared_ptr m_logger; - private: -#endif - - // data shared between the main thread - // and the checker thread - checker_impl m_checker_impl; - - // the main working thread - boost::scoped_ptr m_thread; - - // the thread that calls initialize_pieces() - // on all torrents before they start downloading - boost::scoped_ptr m_checker_thread; - }; - } -} - - -#endif - diff --git a/libtorrent/include/bencode.hpp b/libtorrent/include/bencode.hpp deleted file mode 100755 index a142b5864..000000000 --- a/libtorrent/include/bencode.hpp +++ /dev/null @@ -1,299 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - - -#ifndef TORRENT_BENCODE_HPP_INCLUDED -#define TORRENT_BENCODE_HPP_INCLUDED - - - -/* - * This file declares the following functions: - * - *---------------------------------- - * template - * void libtorrent::bencode(OutIt out, const libtorrent::entry& e); - * - * Encodes a message entry with bencoding into the output - * iterator given. The bencoding is described in the BitTorrent - * protocol description document OutIt must be an OutputIterator - * of type char. This may throw libtorrent::invalid_encoding if - * the entry contains invalid nodes (undefined_t for example). - * - *---------------------------------- - * template - * libtorrent::entry libtorrent::bdecode(InIt start, InIt end); - * - * Decodes the buffer given by the start and end iterators - * and returns the decoded entry. InIt must be an InputIterator - * of type char. May throw libtorrent::invalid_encoding if - * the string is not correctly bencoded. - * - */ - - - - -#include - -#ifdef _MSC_VER -#pragma warning(push, 1) -#endif - -#include -#include - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -#include "libtorrent/entry.hpp" -#include "libtorrent/config.hpp" - -#if defined(_MSC_VER) -namespace std -{ - using ::isdigit; - using ::atoi; -}; - -#define for if (false) {} else for -#endif - - -namespace libtorrent -{ - - struct TORRENT_EXPORT invalid_encoding: std::exception - { - virtual const char* what() const throw() { return "invalid bencoding"; } - }; - - namespace detail - { - template - void write_string(OutIt& out, const std::string& val) - { - std::string::const_iterator end = val.begin() + val.length(); - std::copy(val.begin(), end, out); - } - - TORRENT_EXPORT char const* integer_to_str(char* buf, int size, entry::integer_type val); - - template - void write_integer(OutIt& out, entry::integer_type val) - { - // the stack allocated buffer for keeping the - // decimal representation of the number can - // not hold number bigger than this: - BOOST_STATIC_ASSERT(sizeof(entry::integer_type) <= 8); - char buf[21]; - for (char const* str = integer_to_str(buf, 21, val); - *str != 0; ++str) - { - *out = *str; - ++out; - } - } - - template - void write_char(OutIt& out, char c) - { - *out = c; - ++out; - } - - template - std::string read_until(InIt& in, InIt end, char end_token) - { - if (in == end) throw invalid_encoding(); - std::string ret; - while (*in != end_token) - { - ret += *in; - ++in; - if (in == end) throw invalid_encoding(); - } - return ret; - } - - template - void read_string(InIt& in, InIt end, int len, std::string& str) - { - assert(len >= 0); - for (int i = 0; i < len; ++i) - { - if (in == end) throw invalid_encoding(); - str += *in; - ++in; - } - } - - template - void bencode_recursive(OutIt& out, const entry& e) - { - switch(e.type()) - { - case entry::int_t: - write_char(out, 'i'); - write_integer(out, e.integer()); - write_char(out, 'e'); - break; - case entry::string_t: - write_integer(out, e.string().length()); - write_char(out, ':'); - write_string(out, e.string()); - break; - case entry::list_t: - write_char(out, 'l'); - for (entry::list_type::const_iterator i = e.list().begin(); i != e.list().end(); ++i) - bencode_recursive(out, *i); - write_char(out, 'e'); - break; - case entry::dictionary_t: - write_char(out, 'd'); - for (entry::dictionary_type::const_iterator i = e.dict().begin(); - i != e.dict().end(); ++i) - { - // write key - write_integer(out, i->first.length()); - write_char(out, ':'); - write_string(out, i->first); - // write value - bencode_recursive(out, i->second); - } - write_char(out, 'e'); - break; - default: - // do nothing - break; - } - } - - template - void bdecode_recursive(InIt& in, InIt end, entry& ret) - { - if (in == end) throw invalid_encoding(); - switch (*in) - { - - // ---------------------------------------------- - // integer - case 'i': - { - ++in; // 'i' - std::string val = read_until(in, end, 'e'); - assert(*in == 'e'); - ++in; // 'e' - ret = entry(entry::int_t); - ret.integer() = boost::lexical_cast(val); - } break; - - // ---------------------------------------------- - // list - case 'l': - { - ret = entry(entry::list_t); - ++in; // 'l' - while (*in != 'e') - { - ret.list().push_back(entry()); - entry& e = ret.list().back(); - bdecode_recursive(in, end, e); - if (in == end) throw invalid_encoding(); - } - assert(*in == 'e'); - ++in; // 'e' - } break; - - // ---------------------------------------------- - // dictionary - case 'd': - { - ret = entry(entry::dictionary_t); - ++in; // 'd' - while (*in != 'e') - { - entry key; - bdecode_recursive(in, end, key); - entry& e = ret[key.string()]; - bdecode_recursive(in, end, e); - if (in == end) throw invalid_encoding(); - } - assert(*in == 'e'); - ++in; // 'e' - } break; - - // ---------------------------------------------- - // string - default: - if (isdigit((unsigned char)*in)) - { - std::string len_s = read_until(in, end, ':'); - assert(*in == ':'); - ++in; // ':' - int len = std::atoi(len_s.c_str()); - ret = entry(entry::string_t); - read_string(in, end, len, ret.string()); - } - else - { - throw invalid_encoding(); - } - } - } - } - - template - void bencode(OutIt out, const entry& e) - { - detail::bencode_recursive(out, e); - } - - template - entry bdecode(InIt start, InIt end) - { - try - { - entry e; - detail::bdecode_recursive(start, end, e); - return e; - } - catch(type_error&) - { - throw invalid_encoding(); - } - } - -} - -#endif // TORRENT_BENCODE_HPP_INCLUDED diff --git a/libtorrent/include/bt_peer_connection.hpp b/libtorrent/include/bt_peer_connection.hpp deleted file mode 100755 index d02614c52..000000000 --- a/libtorrent/include/bt_peer_connection.hpp +++ /dev/null @@ -1,295 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_BT_PEER_CONNECTION_HPP_INCLUDED -#define TORRENT_BT_PEER_CONNECTION_HPP_INCLUDED - -#include -#include -#include -#include -#include - -#include "libtorrent/debug.hpp" - -#ifdef _MSC_VER -#pragma warning(push, 1) -#endif - -#include -#include -#include -#include -#include -#include - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -#include "libtorrent/buffer.hpp" -#include "libtorrent/peer_connection.hpp" -#include "libtorrent/socket.hpp" -#include "libtorrent/peer_id.hpp" -#include "libtorrent/storage.hpp" -#include "libtorrent/stat.hpp" -#include "libtorrent/alert.hpp" -#include "libtorrent/torrent_handle.hpp" -#include "libtorrent/torrent.hpp" -#include "libtorrent/allocate_resources.hpp" -#include "libtorrent/peer_request.hpp" -#include "libtorrent/piece_block_progress.hpp" -#include "libtorrent/config.hpp" - -namespace libtorrent -{ - class torrent; - - namespace detail - { - struct session_impl; - } - - class TORRENT_EXPORT bt_peer_connection - : public peer_connection - { - friend class invariant_access; - public: - - // this is the constructor where the we are the active part. - // The peer_conenction should handshake and verify that the - // other end has the correct id - bt_peer_connection( - aux::session_impl& ses - , boost::weak_ptr t - , boost::shared_ptr s - , tcp::endpoint const& remote); - - // with this constructor we have been contacted and we still don't - // know which torrent the connection belongs to - bt_peer_connection( - aux::session_impl& ses - , boost::shared_ptr s); - - ~bt_peer_connection(); - - // called from the main loop when this connection has any - // work to do. - - void on_sent(asio::error const& error - , std::size_t bytes_transferred); - void on_receive(asio::error const& error - , std::size_t bytes_transferred); - - virtual void get_peer_info(peer_info& p) const; - - bool support_extensions() const { return m_supports_extensions; } - - bool supports_extension(extension_index ex) const - { return m_extension_messages[ex] > 0; } - - bool has_metadata() const; - - // the message handlers are called - // each time a recv() returns some new - // data, the last time it will be called - // is when the entire packet has been - // received, then it will no longer - // be called. i.e. most handlers need - // to check how much of the packet they - // have received before any processing - void on_keepalive(); - void on_choke(int received); - void on_unchoke(int received); - void on_interested(int received); - void on_not_interested(int received); - void on_have(int received); - void on_bitfield(int received); - void on_request(int received); - void on_piece(int received); - void on_cancel(int received); - void on_dht_port(int received); - - void on_extended(int received); - - void on_extended_handshake(); - void on_chat(); - void on_metadata(); - void on_peer_exchange(); - - typedef void (bt_peer_connection::*message_handler)(int received); - - // the following functions appends messages - // to the send buffer - void write_choke(); - void write_unchoke(); - void write_interested(); - void write_not_interested(); - void write_request(peer_request const& r); - void write_cancel(peer_request const& r); - void write_bitfield(std::vector const& bitfield); - void write_have(int index); - void write_piece(peer_request const& r); - void write_handshake(); - void write_extensions(); - void write_chat_message(const std::string& msg); - void write_metadata(std::pair req); - void write_metadata_request(std::pair req); - void write_keepalive(); - void write_dht_port(int listen_port); - void on_connected() {} - void on_tick(); - -#ifndef NDEBUG - void check_invariant() const; - boost::posix_time::ptime m_last_choke; -#endif - - private: - - bool dispatch_message(int received); - // returns the block currently being - // downloaded. And the progress of that - // block. If the peer isn't downloading - // a piece for the moment, the boost::optional - // will be invalid. - boost::optional downloading_piece_progress() const; - - // if we don't have all metadata - // this function will request a part of it - // from this peer - void request_metadata(); - - enum state - { - read_protocol_length = 0, - read_protocol_string, - read_info_hash, - read_peer_id, - - read_packet_size, - read_packet - }; - - std::string m_client_version; - - state m_state; - - // the timeout in seconds - int m_timeout; - - enum message_type - { - // standard messages - msg_choke = 0, - msg_unchoke, - msg_interested, - msg_not_interested, - msg_have, - msg_bitfield, - msg_request, - msg_piece, - msg_cancel, - msg_dht_port, - // extension protocol message - msg_extended = 20, - - num_supported_messages - }; - - static const message_handler m_message_handler[num_supported_messages]; - - // this is a queue of ranges that describes - // where in the send buffer actual payload - // data is located. This is currently - // only used to be able to gather statistics - // seperately on payload and protocol data. - struct range - { - range(int s, int l) - : start(s) - , length(l) - { - assert(s >= 0); - assert(l > 0); - } - int start; - int length; - }; - static bool range_below_zero(const range& r) - { return r.start < 0; } - std::deque m_payloads; - - // this is set to true if the handshake from - // the peer indicated that it supports the - // extension protocol - bool m_supports_extensions; - bool m_supports_dht_port; - - static const char* extension_names[num_supported_extensions]; - // contains the indices of the extension messages for each extension - // supported by the other end. A value of <= 0 means that the extension - // is not supported. - int m_extension_messages[num_supported_extensions]; - - // this is set to the current time each time we get a - // "I don't have metadata" message. - boost::posix_time::ptime m_no_metadata; - - // this is set to the time when we last sent - // a request for metadata to this peer - boost::posix_time::ptime m_metadata_request; - - // this is set to true when we send a metadata - // request to this peer, and reset to false when - // we receive a reply to our request. - bool m_waiting_metadata_request; - - // if we're waiting for a metadata request - // this was the request we sent - std::pair m_last_metadata_request; - - // the number of bytes of metadata we have received - // so far from this per, only counting the current - // request. Any previously finished requests - // that have been forwarded to the torrent object - // do not count. - int m_metadata_progress; - -#ifndef NDEBUG - bool m_in_constructor; -#endif - }; -} - -#endif // TORRENT_BT_PEER_CONNECTION_HPP_INCLUDED - diff --git a/libtorrent/include/buffer.hpp b/libtorrent/include/buffer.hpp deleted file mode 100644 index 5dc2e558a..000000000 --- a/libtorrent/include/buffer.hpp +++ /dev/null @@ -1,447 +0,0 @@ -/* -Copyright (c) 2003 - 2005, Arvid Norberg, Daniel Wallin -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of Rasterbar Software nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef LIBTORRENT_BUFFER_HPP -#define LIBTORRENT_BUFFER_HPP - -//#define TORRENT_BUFFER_DEBUG - -#include "libtorrent/invariant_check.hpp" -#include - -namespace libtorrent { - -class buffer -{ -public: - struct interval - { - interval(char* begin, char* end) - : begin(begin) - , end(end) - {} - - char operator[](int index) const - { - assert(begin + index < end); - return begin[index]; - } - - int left() const { assert(end > begin); return end - begin; } - - char* begin; - char* end; - }; - - struct const_interval - { - const_interval(char const* begin, char const* end) - : begin(begin) - , end(end) - {} - - char operator[](int index) const - { - assert(begin + index < end); - return begin[index]; - } - - int left() const { assert(end > begin); return end - begin; } - - char const* begin; - char const* end; - }; - - typedef std::pair interval_type; - - buffer(std::size_t n = 0); - ~buffer(); - - interval allocate(std::size_t n); - void insert(char const* first, char const* last); - void erase(std::size_t n); - std::size_t size() const; - std::size_t capacity() const; - void reserve(std::size_t n); - interval_type data() const; - bool empty() const; - - std::size_t space_left() const; - - char const* raw_data() const - { - return m_first; - } - -#ifndef NDEBUG - void check_invariant() const; -#endif - -private: - char* m_first; - char* m_last; - char* m_write_cursor; - char* m_read_cursor; - char* m_read_end; - bool m_empty; -#ifdef TORRENT_BUFFER_DEBUG - mutable std::vector m_debug; - mutable int m_pending_copy; -#endif -}; - -inline buffer::buffer(std::size_t n) - : m_first((char*)::operator new(n)) - , m_last(m_first + n) - , m_write_cursor(m_first) - , m_read_cursor(m_first) - , m_read_end(m_last) - , m_empty(true) -{ -#ifdef TORRENT_BUFFER_DEBUG - m_pending_copy = 0; -#endif -} - -inline buffer::~buffer() -{ - ::operator delete (m_first); -} - -inline buffer::interval buffer::allocate(std::size_t n) -{ - assert(m_read_cursor <= m_read_end || m_empty); - - INVARIANT_CHECK; - -#ifdef TORRENT_BUFFER_DEBUG - if (m_pending_copy) - { - std::copy(m_write_cursor - m_pending_copy, m_write_cursor - , m_debug.end() - m_pending_copy); - m_pending_copy = 0; - } - m_debug.resize(m_debug.size() + n); - m_pending_copy = n; -#endif - if (m_read_cursor < m_write_cursor || m_empty) - { - // ..R***W.. - if (m_last - m_write_cursor >= (std::ptrdiff_t)n) - { - interval ret(m_write_cursor, m_write_cursor + n); - m_write_cursor += n; - m_read_end = m_write_cursor; - assert(m_read_cursor <= m_read_end); - if (n) m_empty = false; - return ret; - } - - if (m_read_cursor - m_first >= (std::ptrdiff_t)n) - { - m_read_end = m_write_cursor; - interval ret(m_first, m_first + n); - m_write_cursor = m_first + n; - assert(m_read_cursor <= m_read_end); - if (n) m_empty = false; - return ret; - } - - reserve(capacity() + n - (m_last - m_write_cursor)); - assert(m_last - m_write_cursor >= (std::ptrdiff_t)n); - interval ret(m_write_cursor, m_write_cursor + n); - m_write_cursor += n; - m_read_end = m_write_cursor; - if (n) m_empty = false; - assert(m_read_cursor <= m_read_end); - return ret; - - } - //**W...R** - if (m_read_cursor - m_write_cursor >= (std::ptrdiff_t)n) - { - interval ret(m_write_cursor, m_write_cursor + n); - m_write_cursor += n; - if (n) m_empty = false; - return ret; - } - reserve(capacity() + n - (m_read_cursor - m_write_cursor)); - assert(m_read_cursor - m_write_cursor >= (std::ptrdiff_t)n); - interval ret(m_write_cursor, m_write_cursor + n); - m_write_cursor += n; - if (n) m_empty = false; - return ret; -} - -inline void buffer::insert(char const* first, char const* last) -{ - INVARIANT_CHECK; - - std::size_t n = last - first; - -#ifdef TORRENT_BUFFER_DEBUG - if (m_pending_copy) - { - std::copy(m_write_cursor - m_pending_copy, m_write_cursor - , m_debug.end() - m_pending_copy); - m_pending_copy = 0; - } - m_debug.insert(m_debug.end(), first, last); -#endif - - if (space_left() < n) - { - reserve(capacity() + n); - } - - m_empty = false; - - char const* end = (m_last - m_write_cursor) < (std::ptrdiff_t)n ? - m_last : m_write_cursor + n; - - std::size_t copied = end - m_write_cursor; - std::memcpy(m_write_cursor, first, copied); - - m_write_cursor += copied; - if (m_write_cursor > m_read_end) m_read_end = m_write_cursor; - first += copied; - n -= copied; - - if (n == 0) return; - - assert(m_write_cursor == m_last); - m_write_cursor = m_first; - - memcpy(m_write_cursor, first, n); - m_write_cursor += n; -} - -inline void buffer::erase(std::size_t n) -{ - INVARIANT_CHECK; - - if (n == 0) return; - assert(!m_empty); - -#ifndef NDEBUG - int prev_size = size(); -#endif - assert(m_read_cursor <= m_read_end); - m_read_cursor += n; - if (m_read_cursor > m_read_end) - { - m_read_cursor = m_first + (m_read_cursor - m_read_end); - assert(m_read_cursor <= m_write_cursor); - } - - m_empty = m_read_cursor == m_write_cursor; - - assert(prev_size - n == size()); - -#ifdef TORRENT_BUFFER_DEBUG - m_debug.erase(m_debug.begin(), m_debug.begin() + n); -#endif -} - -inline std::size_t buffer::size() const -{ - // ...R***W. - if (m_read_cursor < m_write_cursor) - { - return m_write_cursor - m_read_cursor; - } - // ***W..R* - else - { - if (m_empty) return 0; - return (m_write_cursor - m_first) + (m_read_end - m_read_cursor); - } -} - -inline std::size_t buffer::capacity() const -{ - return m_last - m_first; -} - -inline void buffer::reserve(std::size_t size) -{ - std::size_t n = (std::size_t)(capacity() * 1.f); - if (n < size) n = size; - - char* buf = (char*)::operator new(n); - char* old = m_first; - - if (m_read_cursor < m_write_cursor) - { - // ...R***W.<>. - std::memcpy( - buf + (m_read_cursor - m_first) - , m_read_cursor - , m_write_cursor - m_read_cursor - ); - - m_write_cursor = buf + (m_write_cursor - m_first); - m_read_cursor = buf + (m_read_cursor - m_first); - m_read_end = m_write_cursor; - m_first = buf; - m_last = buf + n; - } - else - { - // **W..<>.R** - std::size_t skip = n - (m_last - m_first); - - std::memcpy(buf, m_first, m_write_cursor - m_first); - std::memcpy( - buf + (m_read_cursor - m_first) + skip - , m_read_cursor - , m_last - m_read_cursor - ); - - m_write_cursor = buf + (m_write_cursor - m_first); - - if (!m_empty) - { - m_read_cursor = buf + (m_read_cursor - m_first) + skip; - m_read_end = buf + (m_read_end - m_first) + skip; - } - else - { - m_read_cursor = m_write_cursor; - m_read_end = m_write_cursor; - } - - m_first = buf; - m_last = buf + n; - } - - ::operator delete (old); -} - -#ifndef NDEBUG -inline void buffer::check_invariant() const -{ - assert(m_read_end >= m_read_cursor); - assert(m_last >= m_read_cursor); - assert(m_last >= m_write_cursor); - assert(m_last >= m_first); - assert(m_first <= m_read_cursor); - assert(m_first <= m_write_cursor); -#ifdef TORRENT_BUFFER_DEBUG - int a = m_debug.size(); - int b = size(); - (void)a; - (void)b; - assert(m_debug.size() == size()); -#endif -} -#endif - -inline buffer::interval_type buffer::data() const -{ - INVARIANT_CHECK; - -#ifdef TORRENT_BUFFER_DEBUG - if (m_pending_copy) - { - std::copy(m_write_cursor - m_pending_copy, m_write_cursor - , m_debug.end() - m_pending_copy); - m_pending_copy = 0; - } -#endif - - // ...R***W. - if (m_read_cursor < m_write_cursor) - { -#ifdef TORRENT_BUFFER_DEBUG - assert(m_debug.size() == size()); - assert(std::equal(m_debug.begin(), m_debug.end(), m_read_cursor)); -#endif - return interval_type( - const_interval(m_read_cursor, m_write_cursor) - , const_interval(m_last, m_last) - ); - } - // **W...R** - else - { - if (m_read_cursor == m_read_end) - { -#ifdef TORRENT_BUFFER_DEBUG - assert(m_debug.size() == size()); - assert(std::equal(m_debug.begin(), m_debug.end(), m_first)); -#endif - - return interval_type( - const_interval(m_first, m_write_cursor) - , const_interval(m_last, m_last)); - } -#ifdef TORRENT_BUFFER_DEBUG - assert(m_debug.size() == size()); - assert(std::equal(m_debug.begin(), m_debug.begin() + (m_read_end - - m_read_cursor), m_read_cursor)); - assert(std::equal(m_debug.begin() + (m_read_end - m_read_cursor), m_debug.end() - , m_first)); -#endif - - assert(m_read_cursor <= m_read_end || m_empty); - return interval_type( - const_interval(m_read_cursor, m_read_end) - , const_interval(m_first, m_write_cursor) - ); - } -} - -inline bool buffer::empty() const -{ - return m_empty; -} - -inline std::size_t buffer::space_left() const -{ - if (m_empty) return m_last - m_first; - - // ...R***W. - if (m_read_cursor < m_write_cursor) - { - return (m_last - m_write_cursor) + (m_read_cursor - m_first); - } - // ***W..R* - else - { - return m_read_cursor - m_write_cursor; - } -} - -} - -#endif // LIBTORRENT_BUFFER_HPP - diff --git a/libtorrent/include/config.hpp b/libtorrent/include/config.hpp deleted file mode 100755 index c8d86955e..000000000 --- a/libtorrent/include/config.hpp +++ /dev/null @@ -1,66 +0,0 @@ -/* - -Copyright (c) 2005, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_CONFIG_HPP_INCLUDED -#define TORRENT_CONFIG_HPP_INCLUDED - -#include - -#if defined(__GNUC__) && __GNUC__ >= 4 - -# if defined(TORRENT_BUILDING_SHARED) || defined(TORRENT_LINKING_SHARED) -# define TORRENT_EXPORT __attribute__ ((visibility("default"))) -# else -# define TORRENT_EXPORT -# endif - -#elif defined(__GNUC__) - -# define TORRENT_EXPORT - -#elif defined(BOOST_MSVC) - -# if defined(TORRENT_BUILDING_SHARED) -# define TORRENT_EXPORT __declspec(dllexport) -# elif defined(TORRENT_LINKING_SHARED) -# define TORRENT_EXPORT __declspec(dllimport) -# else -# define TORRENT_EXPORT -# endif - -#else -# define TORRENT_EXPORT -#endif - - -#endif // TORRENT_CONFIG_HPP_INCLUDED - diff --git a/libtorrent/include/debug.hpp b/libtorrent/include/debug.hpp deleted file mode 100755 index 8aeeeb544..000000000 --- a/libtorrent/include/debug.hpp +++ /dev/null @@ -1,92 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_DEBUG_HPP_INCLUDED -#define TORRENT_DEBUG_HPP_INCLUDED - -#include -#include -#include - -#ifdef _MSC_VER -#pragma warning(push, 1) -#endif - -#include -#include -#include - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - - -namespace libtorrent -{ - - // PROFILING CODE -#ifdef TORRENT_PROFILE - - void add_checkpoint(std::string const& str); - void print_checkpoints(); -#define TORRENT_CHECKPOINT(str) libtorrent::add_checkpoint(str) -#else -#define TORRENT_CHECKPOINT(str) void(0) -#endif - - // DEBUG API - - struct logger - { - logger(boost::filesystem::path const& filename, bool append = true) - { - using namespace boost::filesystem; - path dir(complete("libtorrent_logs")); - if (!exists(dir)) create_directories(dir); - m_file.open(dir / filename, std::ios_base::out | (append ? std::ios_base::app : std::ios_base::out)); - *this << "\n\n\n*** starting log ***\n"; - } - - template - logger& operator<<(T const& v) - { - m_file << v; - m_file.flush(); - return *this; - } - - boost::filesystem::ofstream m_file; - }; - -} - -#endif // TORRENT_DEBUG_HPP_INCLUDED diff --git a/libtorrent/include/entry.hpp b/libtorrent/include/entry.hpp deleted file mode 100755 index 85c5462a2..000000000 --- a/libtorrent/include/entry.hpp +++ /dev/null @@ -1,272 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_ENTRY_HPP_INCLUDED -#define TORRENT_ENTRY_HPP_INCLUDED - -/* - * - * This file declares the entry class. It is a - * variant-type that can be an integer, list, - * dictionary (map) or a string. This type is - * used to hold bdecoded data (which is the - * encoding BitTorrent messages uses). - * - * it has 4 accessors to access the actual - * type of the object. They are: - * integer() - * string() - * list() - * dict() - * The actual type has to match the type you - * are asking for, otherwise you will get an - * assertion failure. - * When you default construct an entry, it is - * uninitialized. You can initialize it through the - * assignment operator, copy-constructor or - * the constructor that takes a data_type enum. - * - * - */ - - -#include -#include -#include -#include -#include -#include - -#include "libtorrent/size_type.hpp" -#include "libtorrent/config.hpp" - -namespace libtorrent -{ - - struct TORRENT_EXPORT type_error: std::runtime_error - { - type_error(const char* error): std::runtime_error(error) {} - }; - - namespace detail - { - template - struct max2 { enum { value = v1>v2?v1:v2 }; }; - - template - struct max3 - { - enum - { - temp = max2::value, - value = temp>v3?temp:v3 - }; - }; - - template - struct max4 - { - enum - { - temp = max3::value, - value = temp>v4?temp:v4 - }; - }; - } - - class entry; - - class TORRENT_EXPORT entry - { - public: - - // the key is always a string. If a generic entry would be allowed - // as a key, sorting would become a problem (e.g. to compare a string - // to a list). The definition doesn't mention such a limit though. - typedef std::map dictionary_type; - typedef std::string string_type; - typedef std::list list_type; - typedef size_type integer_type; - - enum data_type - { - int_t, - string_t, - list_t, - dictionary_t, - undefined_t - }; - - data_type type() const; - - entry(const dictionary_type&); - entry(const string_type&); - entry(const list_type&); - entry(const integer_type&); - - entry(); - entry(data_type t); - entry(const entry& e); - ~entry(); - - bool operator==(entry const& e) const; - - void operator=(entry const&); - void operator=(dictionary_type const&); - void operator=(string_type const&); - void operator=(list_type const&); - void operator=(integer_type const&); - - integer_type& integer(); - const integer_type& integer() const; - string_type& string(); - const string_type& string() const; - list_type& list(); - const list_type& list() const; - dictionary_type& dict(); - const dictionary_type& dict() const; - - // these functions requires that the entry - // is a dictionary, otherwise they will throw - entry& operator[](char const* key); - entry& operator[](std::string const& key); - const entry& operator[](char const* key) const; - const entry& operator[](std::string const& key) const; - entry* find_key(char const* key); - entry const* find_key(char const* key) const; - - void print(std::ostream& os, int indent = 0) const; - - private: - - void construct(data_type t); - void copy(const entry& e); - void destruct(); - - data_type m_type; - -#if defined(_MSC_VER) && _MSC_VER < 1310 - // workaround for msvc-bug. - // assumes sizeof(map) == sizeof(map) - // and sizeof(list) == sizeof(list) - union - { - char data[ - detail::max4) - , sizeof(std::map) - , sizeof(string_type) - , sizeof(integer_type)>::value]; - integer_type dummy_aligner; - }; -#else - union - { - char data[detail::max4::value]; - integer_type dummy_aligner; - }; -#endif - - }; - - inline std::ostream& operator<<(std::ostream& os, const entry& e) - { - e.print(os, 0); - return os; - } - - inline entry::data_type entry::type() const { return m_type; } - - inline entry::entry(): m_type(undefined_t) {} - inline entry::entry(data_type t): m_type(t) { construct(t); } - inline entry::entry(const entry& e) { copy(e); } - inline entry::~entry() { destruct(); } - - inline void entry::operator=(const entry& e) - { - destruct(); - copy(e); - } - - inline entry::integer_type& entry::integer() - { - if (m_type != int_t) throw type_error("invalid type requested from entry"); - return *reinterpret_cast(data); - } - - inline entry::integer_type const& entry::integer() const - { - if (m_type != int_t) throw type_error("invalid type requested from entry"); - return *reinterpret_cast(data); - } - - inline entry::string_type& entry::string() - { - if (m_type != string_t) throw type_error("invalid type requested from entry"); - return *reinterpret_cast(data); - } - - inline entry::string_type const& entry::string() const - { - if (m_type != string_t) throw type_error("invalid type requested from entry"); - return *reinterpret_cast(data); - } - - inline entry::list_type& entry::list() - { - if (m_type != list_t) throw type_error("invalid type requested from entry"); - return *reinterpret_cast(data); - } - - inline entry::list_type const& entry::list() const - { - if (m_type != list_t) throw type_error("invalid type requested from entry"); - return *reinterpret_cast(data); - } - - inline entry::dictionary_type& entry::dict() - { - if (m_type != dictionary_t) throw type_error("invalid type requested from entry"); - return *reinterpret_cast(data); - } - - inline entry::dictionary_type const& entry::dict() const - { - if (m_type != dictionary_t) throw type_error("invalid type requested from entry"); - return *reinterpret_cast(data); - } - -} - -#endif // TORRENT_ENTRY_HPP_INCLUDED diff --git a/libtorrent/include/escape_string.hpp b/libtorrent/include/escape_string.hpp deleted file mode 100755 index e0e743e1e..000000000 --- a/libtorrent/include/escape_string.hpp +++ /dev/null @@ -1,46 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_ESCAPE_STRING_HPP_INCLUDED -#define TORRENT_ESCAPE_STRING_HPP_INCLUDED - -#include -#include "libtorrent/config.hpp" - -namespace libtorrent -{ - std::string TORRENT_EXPORT unescape_string(std::string const& s); - std::string TORRENT_EXPORT escape_string(const char* str, int len); - std::string TORRENT_EXPORT escape_path(const char* str, int len); -} - -#endif // TORRENT_ESCAPE_STRING_HPP_INCLUDED diff --git a/libtorrent/include/file.hpp b/libtorrent/include/file.hpp deleted file mode 100755 index 1b71c66f5..000000000 --- a/libtorrent/include/file.hpp +++ /dev/null @@ -1,130 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_FILE_HPP_INCLUDED -#define TORRENT_FILE_HPP_INCLUDED - -#include -#include - -#ifdef _MSC_VER -#pragma warning(push, 1) -#endif - -#include -#include - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -#include "libtorrent/size_type.hpp" -#include "libtorrent/config.hpp" - -namespace libtorrent -{ - - struct TORRENT_EXPORT file_error: std::runtime_error - { - file_error(std::string const& msg): std::runtime_error(msg) {} - }; - - class TORRENT_EXPORT file: public boost::noncopyable - { - public: - - class seek_mode - { - friend class file; - private: - seek_mode(int v): m_val(v) {} - int m_val; - }; - - static const seek_mode begin; - static const seek_mode end; - - class open_mode - { - friend class file; - public: - - open_mode(): m_mask(0) {} - - open_mode operator|(open_mode m) const - { return open_mode(m.m_mask | m_mask); } - - open_mode operator&(open_mode m) const - { return open_mode(m.m_mask & m_mask); } - - open_mode operator|=(open_mode m) - { - m_mask |= m.m_mask; - return *this; - } - - bool operator==(open_mode m) const { return m_mask == m.m_mask; } - bool operator!=(open_mode m) const { return m_mask != m.m_mask; } - - private: - - open_mode(int val): m_mask(val) {} - int m_mask; - }; - - static const open_mode in; - static const open_mode out; - - file(); - file(boost::filesystem::path const& p, open_mode m); - ~file(); - - void open(boost::filesystem::path const& p, open_mode m); - void close(); - - size_type write(const char*, size_type num_bytes); - size_type read(char*, size_type num_bytes); - - size_type seek(size_type pos, seek_mode m = begin); - size_type tell(); - - private: - - struct impl; - const std::auto_ptr m_impl; - - }; - -} - -#endif // TORRENT_FILE_HPP_INCLUDED - diff --git a/libtorrent/include/fingerprint.hpp b/libtorrent/include/fingerprint.hpp deleted file mode 100755 index d7e5a5fc6..000000000 --- a/libtorrent/include/fingerprint.hpp +++ /dev/null @@ -1,93 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_FINGERPRINT_HPP_INCLUDED -#define TORRENT_FINGERPRINT_HPP_INCLUDED - -#include -#include - -#include "libtorrent/peer_id.hpp" - -namespace libtorrent -{ - - struct fingerprint - { - fingerprint(const char* id_string, int major, int minor, int revision, int tag) - : major_version(major) - , minor_version(minor) - , revision_version(revision) - , tag_version(tag) - { - assert(id_string); - assert(major >= 0); - assert(minor >= 0); - assert(revision >= 0); - assert(tag >= 0); - assert(std::strlen(id_string) == 2); - name[0] = id_string[0]; - name[1] = id_string[1]; - } - - std::string to_string() const - { - std::stringstream s; - s << "-" << name[0] << name[1] - << version_to_char(major_version) - << version_to_char(minor_version) - << version_to_char(revision_version) - << version_to_char(tag_version) << "-"; - return s.str(); - } - - char name[2]; - int major_version; - int minor_version; - int revision_version; - int tag_version; - - private: - - char version_to_char(int v) const - { - if (v >= 0 && v < 10) return '0' + v; - else if (v >= 10) return 'A' + (v - 10); - assert(false); - return '0'; - } - - }; - -} - -#endif // TORRENT_FINGERPRINT_HPP_INCLUDED diff --git a/libtorrent/include/hasher.hpp b/libtorrent/include/hasher.hpp deleted file mode 100755 index 803b758eb..000000000 --- a/libtorrent/include/hasher.hpp +++ /dev/null @@ -1,118 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_HASHER_HPP_INCLUDED -#define TORRENT_HASHER_HPP_INCLUDED - -#include -#include - -#include "libtorrent/peer_id.hpp" -#include "libtorrent/config.hpp" - -// from sha1.cpp -struct TORRENT_EXPORT SHA1_CTX -{ - boost::uint32_t state[5]; - boost::uint32_t count[2]; - boost::uint8_t buffer[64]; -}; - -TORRENT_EXPORT void SHA1Init(SHA1_CTX* context); -TORRENT_EXPORT void SHA1Update(SHA1_CTX* context, boost::uint8_t const* data, boost::uint32_t len); -TORRENT_EXPORT void SHA1Final(SHA1_CTX* context, boost::uint8_t* digest); - -extern "C" -{ - // from zlib/adler32.c - unsigned long adler32(unsigned long adler, const char* data, unsigned int len); -} - -namespace libtorrent -{ - - class adler32_crc - { - public: - adler32_crc(): m_adler(adler32(0, 0, 0)) {} - - void update(const char* data, int len) - { - assert(data != 0); - assert(len > 0); - m_adler = adler32(m_adler, data, len); - } - unsigned long final() const { return m_adler; } - void reset() { m_adler = adler32(0, 0, 0); } - - private: - - unsigned long m_adler; - - }; - - class hasher - { - public: - - hasher() { SHA1Init(&m_context); } - hasher(const char* data, int len) - { - SHA1Init(&m_context); - assert(data != 0); - assert(len > 0); - SHA1Update(&m_context, reinterpret_cast(data), len); - } - void update(const char* data, int len) - { - assert(data != 0); - assert(len > 0); - SHA1Update(&m_context, reinterpret_cast(data), len); - } - - sha1_hash final() - { - sha1_hash digest; - SHA1Final(&m_context, digest.begin()); - return digest; - } - - void reset() { SHA1Init(&m_context); } - - private: - - SHA1_CTX m_context; - - }; -} - -#endif // TORRENT_HASHER_HPP_INCLUDED diff --git a/libtorrent/include/http_tracker_connection.hpp b/libtorrent/include/http_tracker_connection.hpp deleted file mode 100755 index b66d4349d..000000000 --- a/libtorrent/include/http_tracker_connection.hpp +++ /dev/null @@ -1,176 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_HTTP_TRACKER_CONNECTION_HPP_INCLUDED -#define TORRENT_HTTP_TRACKER_CONNECTION_HPP_INCLUDED - -#include -#include -#include -#include - -#ifdef _MSC_VER -#pragma warning(push, 1) -#endif - -#include -#include -#include -#include - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -#include "libtorrent/socket.hpp" -#include "libtorrent/entry.hpp" -#include "libtorrent/session_settings.hpp" -#include "libtorrent/peer_id.hpp" -#include "libtorrent/peer.hpp" -#include "libtorrent/tracker_manager.hpp" -#include "libtorrent/config.hpp" -#include "libtorrent/buffer.hpp" - -namespace libtorrent -{ - - class http_parser - { - public: - http_parser(); - template - T header(char const* key) const; - std::string const& protocol() const { return m_protocol; } - int status_code() const { return m_status_code; } - std::string message() const { return m_server_message; } - buffer::const_interval get_body(); - bool header_finished() const { return m_state == read_body; } - bool finished() const { return m_finished; } - boost::tuple incoming(buffer::const_interval recv_buffer); - int body_start() const { return m_body_start_pos; } - private: - int m_recv_pos; - int m_status_code; - std::string m_protocol; - std::string m_server_message; - - int m_content_length; - enum { plain, gzip } m_content_encoding; - - enum { read_status, read_header, read_body } m_state; - - std::map m_header; - buffer::const_interval m_recv_buffer; - int m_body_start_pos; - - bool m_finished; - }; - - template - T http_parser::header(char const* key) const - { - std::map::const_iterator i - = m_header.find(key); - if (i == m_header.end()) return T(); - return boost::lexical_cast(i->second); - } - - class TORRENT_EXPORT http_tracker_connection - : public tracker_connection - { - friend class tracker_manager; - public: - - http_tracker_connection( - demuxer& d - , tracker_manager& man - , tracker_request const& req - , std::string const& hostname - , unsigned short port - , std::string request - , boost::weak_ptr c - , session_settings const& stn - , std::string const& password = ""); - - private: - - boost::intrusive_ptr self() - { return boost::intrusive_ptr(this); } - - void on_response(); - - void init_send_buffer( - std::string const& hostname - , std::string const& request); - - void name_lookup(asio::error const& error, tcp::resolver::iterator i); - void connected(asio::error const& error); - void sent(asio::error const& error); - void receive(asio::error const& error - , std::size_t bytes_transferred); - - virtual void on_timeout(); - - void parse(const entry& e); - peer_entry extract_peer_info(const entry& e); - - tracker_manager& m_man; - enum { read_status, read_header, read_body } m_state; - - enum { plain, gzip } m_content_encoding; - int m_content_length; - std::string m_location; - - tcp::resolver m_name_lookup; - int m_port; - boost::shared_ptr m_socket; - int m_recv_pos; - std::vector m_buffer; - std::string m_send_buffer; - - std::string m_server_message; - std::string m_server_protocol; - - session_settings const& m_settings; - std::string m_password; - int m_code; - - // server string in http-reply - std::string m_server; - - bool m_timed_out; - }; - -} - -#endif // TORRENT_HTTP_TRACKER_CONNECTION_HPP_INCLUDED - diff --git a/libtorrent/include/identify_client.hpp b/libtorrent/include/identify_client.hpp deleted file mode 100755 index e8cb3b930..000000000 --- a/libtorrent/include/identify_client.hpp +++ /dev/null @@ -1,58 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_IDENTIFY_CLIENT_HPP_INCLUDED -#define TORRENT_IDENTIFY_CLIENT_HPP_INCLUDED - -#ifdef _MSC_VER -#pragma warning(push, 1) -#endif - -#include - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -#include "libtorrent/peer_id.hpp" -#include "libtorrent/fingerprint.hpp" -#include "libtorrent/config.hpp" - -namespace libtorrent -{ - - TORRENT_EXPORT std::string identify_client(const peer_id& p); - TORRENT_EXPORT boost::optional client_fingerprint(peer_id const& p); - -} - -#endif // TORRENT_IDENTIFY_CLIENT_HPP_INCLUDED diff --git a/libtorrent/include/invariant_check.hpp b/libtorrent/include/invariant_check.hpp deleted file mode 100755 index c6eacf338..000000000 --- a/libtorrent/include/invariant_check.hpp +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright Daniel Wallin 2004. Use, modification and distribution is -// subject to the Boost Software License, Version 1.0. (See accompanying -// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) - -#ifndef TORRENT_INVARIANT_ACCESS_HPP_INCLUDED -#define TORRENT_INVARIANT_ACCESS_HPP_INCLUDED - -#include - -namespace libtorrent -{ - - class invariant_access - { - public: - template - static void check_invariant(T const& self) - { - self.check_invariant(); - } - }; - - template - void check_invariant(T const& x) - { - invariant_access::check_invariant(x); - } - - struct invariant_checker {}; - - template - struct invariant_checker_impl : invariant_checker - { - invariant_checker_impl(T const& self_) - : self(self_) - { - try - { - check_invariant(self); - } - catch (...) - { - assert(false); - } - } - - ~invariant_checker_impl() - { - try - { - check_invariant(self); - } - catch (...) - { - assert(false); - } - } - - T const& self; - }; - - template - invariant_checker_impl make_invariant_checker(T const& x) - { - return invariant_checker_impl(x); - } -} - -#ifndef NDEBUG -#define INVARIANT_CHECK \ - invariant_checker const& _invariant_check = make_invariant_checker(*this); \ - (void)_invariant_check; \ - do {} while (false) -#else -#define INVARIANT_CHECK do {} while (false) -#endif - -#endif // TORRENT_INVARIANT_ACCESS_HPP_INCLUDED diff --git a/libtorrent/include/io.hpp b/libtorrent/include/io.hpp deleted file mode 100755 index 57a22cf97..000000000 --- a/libtorrent/include/io.hpp +++ /dev/null @@ -1,140 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_IO_HPP_INCLUDED -#define TORRENT_IO_HPP_INCLUDED - -#include - -namespace libtorrent -{ - namespace detail - { - template struct type {}; - - // reads an integer from a byte stream - // in big endian byte order and converts - // it to native endianess - template - inline T read_impl(InIt& start, type) - { - T ret = 0; - for (int i = 0; i < (int)sizeof(T); ++i) - { - ret <<= 8; - ret |= static_cast(*start); - ++start; - } - return ret; - } - - template - inline void write_impl(T val, OutIt& start) - { - for (int i = (int)sizeof(T)-1; i >= 0; --i) - { - *start = static_cast((val >> (i * 8)) & 0xff); - ++start; - } - } - - // -- adaptors - - template - boost::int64_t read_int64(InIt& start) - { return read_impl(start, type()); } - - template - boost::uint64_t read_uint64(InIt& start) - { return read_impl(start, type()); } - - template - boost::uint32_t read_uint32(InIt& start) - { return read_impl(start, type()); } - - template - boost::int32_t read_int32(InIt& start) - { return read_impl(start, type()); } - - template - boost::int16_t read_int16(InIt& start) - { return read_impl(start, type()); } - - template - boost::uint16_t read_uint16(InIt& start) - { return read_impl(start, type()); } - - template - boost::int8_t read_int8(InIt& start) - { return read_impl(start, type()); } - - template - boost::uint8_t read_uint8(InIt& start) - { return read_impl(start, type()); } - - - template - void write_uint64(boost::uint64_t val, OutIt& start) - { write_impl(val, start); } - - template - void write_int64(boost::int64_t val, OutIt& start) - { write_impl(val, start); } - - template - void write_uint32(boost::uint32_t val, OutIt& start) - { write_impl(val, start); } - - template - void write_int32(boost::int32_t val, OutIt& start) - { write_impl(val, start); } - - template - void write_uint16(boost::uint16_t val, OutIt& start) - { write_impl(val, start); } - - template - void write_int16(boost::int16_t val, OutIt& start) - { write_impl(val, start); } - - template - void write_uint8(boost::uint8_t val, OutIt& start) - { write_impl(val, start); } - - template - void write_int8(boost::int8_t val, OutIt& start) - { write_impl(val, start); } - - } -} - -#endif // TORRENT_IO_HPP_INCLUDED diff --git a/libtorrent/include/ip_filter.hpp b/libtorrent/include/ip_filter.hpp deleted file mode 100644 index c75dafd66..000000000 --- a/libtorrent/include/ip_filter.hpp +++ /dev/null @@ -1,276 +0,0 @@ -/* - -Copyright (c) 2005, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_IP_FILTER_HPP -#define TORRENT_IP_FILTER_HPP - -#ifdef _MSC_VER -#pragma warning(push, 1) -#endif - -#include -#include -#include - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - - -#include "libtorrent/config.hpp" -#include "libtorrent/socket.hpp" -#include -#include - -namespace libtorrent -{ - -inline bool operator<=(address const& lhs - , address const& rhs) -{ - return lhs < rhs || lhs == rhs; -} - -template -struct ip_range -{ - Addr first; - Addr last; - int flags; -}; - -namespace detail -{ - - // this is the generic implementation of - // a filter for a specific address type. - // it works with IPv4 and IPv6 - template - class filter_impl - { - public: - - filter_impl() - { - typename Addr::bytes_type zero; - std::fill(zero.begin(), zero.end(), 0); - // make the entire ip-range non-blocked - m_access_list.insert(range(Addr(zero), 0)); - } - - void add_rule(Addr first, Addr last, int flags) - { - using boost::next; - using boost::prior; - - assert(!m_access_list.empty()); - assert(first < last || first == last); - - typename range_t::iterator i = m_access_list.upper_bound(first); - typename range_t::iterator j = m_access_list.upper_bound(last); - - if (i != m_access_list.begin()) --i; - - assert(j != m_access_list.begin()); - assert(j != i); - - int first_access = i->access; - int last_access = prior(j)->access; - - if (i->start != first && first_access != flags) - { - i = m_access_list.insert(i, range(first, flags)); - } - else if (i != m_access_list.begin() && prior(i)->access == flags) - { - --i; - first_access = i->access; - } - assert(!m_access_list.empty()); - assert(i != m_access_list.end()); - - if (i != j) m_access_list.erase(next(i), j); - if (i->start == first) - { - // we can do this const-cast because we know that the new - // start address will keep the set correctly ordered - const_cast(i->start) = first; - const_cast(i->access) = flags; - } - else if (first_access != flags) - { - m_access_list.insert(i, range(first, flags)); - } - - if ((j != m_access_list.end() - && minus_one(j->start) != last) - || (j == m_access_list.end() - && last != max_addr())) - { - assert(j == m_access_list.end() || last < minus_one(j->start)); - if (last_access != flags) - j = m_access_list.insert(j, range(plus_one(last), last_access)); - } - - if (j != m_access_list.end() && j->access == flags) m_access_list.erase(j); - assert(!m_access_list.empty()); - } - - int access(Addr const& addr) const - { - assert(!m_access_list.empty()); - typename range_t::const_iterator i = m_access_list.upper_bound(addr); - if (i != m_access_list.begin()) --i; - assert(i != m_access_list.end()); - assert(i->start <= addr && (boost::next(i) == m_access_list.end() - || addr < boost::next(i)->start)); - return i->access; - } - - std::vector > export_filter() const - { - std::vector > ret; - ret.reserve(m_access_list.size()); - - for (typename range_t::const_iterator i = m_access_list.begin() - , end(m_access_list.end()); i != end;) - { - ip_range r; - r.first = i->start; - r.flags = i->access; - - ++i; - if (i == end) - r.last = max_addr(); - else - r.last = minus_one(i->start); - - ret.push_back(r); - } - return ret; - } - - private: - - Addr plus_one(Addr const& a) const - { - typename Addr::bytes_type tmp(a.to_bytes()); - typedef typename Addr::bytes_type::reverse_iterator iter; - for (iter i = tmp.rbegin() - , end(tmp.rend()); i != end; ++i) - { - if (*i < (std::numeric_limits::max)()) - { - *i += 1; - break; - } - *i = 0; - } - return Addr(tmp); - } - - Addr minus_one(Addr const& a) const - { - typename Addr::bytes_type tmp(a.to_bytes()); - typedef typename Addr::bytes_type::reverse_iterator iter; - for (iter i = tmp.rbegin() - , end(tmp.rend()); i != end; ++i) - { - if (*i > 0) - { - *i -= 1; - break; - } - *i = (std::numeric_limits::max)(); - } - return Addr(tmp); - } - - Addr max_addr() const - { - typename Addr::bytes_type tmp; - std::fill(tmp.begin(), tmp.end() - , (std::numeric_limits::max)()); - return Addr(tmp); - } - - struct range - { - range(Addr addr, int access = 0): start(addr), access(access) {} - bool operator<(range const& r) const - { return start < r.start; } - bool operator<(Addr const& a) const - { return start < a; } - Addr start; - // the end of the range is implicit - // and given by the next entry in the set - int access; - }; - - typedef std::set range_t; - range_t m_access_list; - - }; - -} - -class TORRENT_EXPORT ip_filter -{ -public: - - enum access_flags - { - blocked = 1 - }; - - // both addresses MUST be of the same type (i.e. both must - // be either IPv4 or both must be IPv6) - void add_rule(address first, address last, int flags); - int access(address const& addr) const; - - typedef boost::tuple > - , std::vector > > filter_tuple_t; - - filter_tuple_t export_filter() const; - -// void print() const; - -private: - - detail::filter_impl m_filter4; - detail::filter_impl m_filter6; -}; - -} - -#endif - diff --git a/libtorrent/include/kademlia/closest_nodes.hpp b/libtorrent/include/kademlia/closest_nodes.hpp deleted file mode 100644 index d5580b9c9..000000000 --- a/libtorrent/include/kademlia/closest_nodes.hpp +++ /dev/null @@ -1,86 +0,0 @@ -/* - -Copyright (c) 2006, Arvid Norberg & Daniel Wallin -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef CLOSEST_NODES_050323_HPP -#define CLOSEST_NODES_050323_HPP - -#include - -#include -#include -#include - -#include - -namespace libtorrent { namespace dht -{ - -class rpc_manager; - -// -------- closest nodes ----------- - -class closest_nodes : public traversal_algorithm -{ -public: - typedef boost::function< - void(std::vector const&) - > done_callback; - - static void initiate( - node_id target - , int branch_factor - , int max_results - , routing_table& table - , rpc_manager& rpc - , done_callback const& callback - ); - -private: - void done(); - void invoke(node_id const& id, asio::ip::udp::endpoint addr); - - closest_nodes( - node_id target - , int branch_factor - , int max_results - , routing_table& table - , rpc_manager& rpc - , done_callback const& callback - ); - - done_callback m_done_callback; -}; - -} } // namespace libtorrent::dht - -#endif // CLOSEST_NODES_050323_HPP - diff --git a/libtorrent/include/kademlia/dht_tracker.hpp b/libtorrent/include/kademlia/dht_tracker.hpp deleted file mode 100644 index d447d4b23..000000000 --- a/libtorrent/include/kademlia/dht_tracker.hpp +++ /dev/null @@ -1,144 +0,0 @@ -/* - -Copyright (c) 2006, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_DISABLE_DHT - -#ifndef TORRENT_DHT_TRACKER -#define TORRENT_DHT_TRACKER - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "libtorrent/kademlia/node.hpp" -#include "libtorrent/kademlia/node_id.hpp" -#include "libtorrent/kademlia/traversal_algorithm.hpp" -#include "libtorrent/kademlia/packet_iterator.hpp" -#include "libtorrent/session_settings.hpp" -#include "libtorrent/session_status.hpp" - -namespace libtorrent { namespace dht -{ - -#ifdef TORRENT_DHT_VERBOSE_LOGGING - TORRENT_DECLARE_LOG(dht_tracker); -#endif - - struct dht_tracker - { - dht_tracker(asio::io_service& d, dht_settings const& settings - , asio::ip::address listen_interface, entry const& bootstrap); - - void add_node(udp::endpoint node); - void add_node(std::pair const& node); - void add_router_node(std::pair const& node); - - void rebind(asio::ip::address listen_interface, int listen_port); - - entry state() const; - - void announce(sha1_hash const& ih, int listen_port - , boost::function const& - , sha1_hash const&)> f); - - void dht_status(session_status& s); - - private: - - void on_name_lookup(asio::error const& e - , udp::resolver::iterator host); - void on_router_name_lookup(asio::error const& e - , udp::resolver::iterator host); - void connection_timeout(asio::error const& e); - void refresh_timeout(asio::error const& e); - void tick(asio::error const& e); - - // translate bittorrent kademlia message into the generice kademlia message - // used by the library - void on_receive(asio::error const& error, size_t bytes_transferred); - void on_bootstrap(); - void send_packet(msg const& m); - - asio::io_service& m_demuxer; - asio::ip::udp::socket m_socket; - - node_impl m_dht; - - // this is the index of the receive buffer we are currently receiving to - // the other buffer is the one containing the last message - int m_buffer; - std::vector m_in_buf[2]; - udp::endpoint m_remote_endpoint[2]; - std::vector m_send_buf; - - boost::posix_time::ptime m_last_refresh; - deadline_timer m_timer; - deadline_timer m_connection_timer; - deadline_timer m_refresh_timer; - dht_settings const& m_settings; - int m_refresh_bucket; - - // used to resolve hostnames for nodes - udp::resolver m_host_resolver; - -#ifdef TORRENT_DHT_VERBOSE_LOGGING - int m_replies_sent[5]; - int m_queries_received[5]; - int m_replies_bytes_sent[5]; - int m_queries_bytes_received[5]; - int m_counter; - int m_announces; - int m_failed_announces; - - int m_total_message_input; - int m_ut_message_input; - int m_lt_message_input; - int m_mp_message_input; - int m_gr_message_input; - - int m_total_in_bytes; - int m_total_out_bytes; - - int m_queries_out_bytes; -#endif - }; -}} - -#endif -#endif diff --git a/libtorrent/include/kademlia/find_data.hpp b/libtorrent/include/kademlia/find_data.hpp deleted file mode 100644 index bbafcdd77..000000000 --- a/libtorrent/include/kademlia/find_data.hpp +++ /dev/null @@ -1,95 +0,0 @@ -/* - -Copyright (c) 2006, Arvid Norberg & Daniel Wallin -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef FIND_DATA_050323_HPP -#define FIND_DATA_050323_HPP - -#include - -#include -#include -#include -#include -#include -#include - -#include - -namespace libtorrent { namespace dht -{ - -using asio::ip::udp; - -typedef std::vector packet_t; - -class rpc_manager; - -// -------- find data ----------- - -class find_data : public traversal_algorithm -{ -public: - typedef boost::function done_callback; - - static void initiate( - node_id target - , int branch_factor - , int max_results - , routing_table& table - , rpc_manager& rpc - , done_callback const& callback - ); - - void got_data(msg const* m); - -private: - void done(); - void invoke(node_id const& id, udp::endpoint addr); - - find_data( - node_id target - , int branch_factor - , int max_results - , routing_table& table - , rpc_manager& rpc - , done_callback const& callback - ); - - done_callback m_done_callback; - boost::shared_ptr m_packet; - bool m_done; -}; - -} } // namespace libtorrent::dht - -#endif // FIND_DATA_050323_HPP - diff --git a/libtorrent/include/kademlia/logging.hpp b/libtorrent/include/kademlia/logging.hpp deleted file mode 100644 index 8bd488f1a..000000000 --- a/libtorrent/include/kademlia/logging.hpp +++ /dev/null @@ -1,146 +0,0 @@ -/* - -Copyright (c) 2006, Arvid Norberg & Daniel Wallin -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_LOGGING_HPP -#define TORRENT_LOGGING_HPP - -#include -#include - -namespace libtorrent { namespace dht -{ - -class log -{ -public: - log(char const* id, std::ostream& stream) - : m_id(id) - , m_enabled(true) - , m_stream(stream) - { - } - - char const* id() const - { - return m_id; - } - - bool enabled() const - { - return m_enabled; - } - - void enable(bool e) - { - m_enabled = e; - } - - void flush() { m_stream.flush(); } - - template - log& operator<<(T const& x) - { - m_stream << x; - return *this; - } - -private: - char const* m_id; - bool m_enabled; - std::ostream& m_stream; -}; - -class log_event -{ -public: - log_event(log& log) - : log_(log) - { - if (log_.enabled()) - log_ << '[' << log.id() << "] "; - } - - ~log_event() - { - if (log_.enabled()) - { - log_ << "\n"; - log_.flush(); - } - } - - template - log_event& operator<<(T const& x) - { - log_ << x; - return *this; - } - - operator bool() const - { - return log_.enabled(); - } - -private: - log& log_; -}; - -class inverted_log_event : public log_event -{ -public: - inverted_log_event(log& log) : log_event(log) {} - - operator bool() const - { - return !log_event::operator bool(); - } -}; - -} } // namespace libtorrent::dht - -#define TORRENT_DECLARE_LOG(name) \ - libtorrent::dht::log& name ## _log() - -#define TORRENT_DEFINE_LOG(name) \ - libtorrent::dht::log& name ## _log() \ - { \ - static std::ofstream log_file("libtorrent_logs/dht.log", std::ios::app); \ - static libtorrent::dht::log instance(#name, log_file); \ - return instance; \ - } - -#define TORRENT_LOG(name) \ - if (libtorrent::dht::inverted_log_event event_object__ = name ## _log()); \ - else static_cast(event_object__) - -#endif - diff --git a/libtorrent/include/kademlia/node.hpp b/libtorrent/include/kademlia/node.hpp deleted file mode 100644 index c44a21f33..000000000 --- a/libtorrent/include/kademlia/node.hpp +++ /dev/null @@ -1,185 +0,0 @@ -/* - -Copyright (c) 2006, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef NODE_HPP -#define NODE_HPP - -#include -#include -#include -#include - -#include -#include -#include - -#include -#include - -#include -#include -#include -#include -#include -#include - -namespace libtorrent { namespace dht -{ - -using asio::ip::udp; - -#ifdef TORRENT_DHT_VERBOSE_LOGGING -TORRENT_DECLARE_LOG(node); -#endif - -// this is the entry for every peer -// the timestamp is there to make it possible -// to remove stale peers -struct peer_entry -{ - tcp::endpoint addr; - boost::posix_time::ptime added; -}; - -// this is a group. It contains a set of group members -struct torrent_entry -{ - std::set peers; -}; - -inline bool operator<(peer_entry const& lhs, peer_entry const& rhs) -{ - return lhs.addr.address() == rhs.addr.address() - ? lhs.addr.port() < rhs.addr.port() - : lhs.addr.address() < rhs.addr.address(); -} - -struct null_type {}; - -class node_impl : boost::noncopyable -{ -typedef std::map table_t; -public: - node_impl(boost::function const& f - , dht_settings const& settings, boost::optional node_id); - - virtual ~node_impl() {} - - void refresh(node_id const& id, boost::function0 f); - void bootstrap(std::vector const& nodes - , boost::function0 f); - void find_node(node_id const& id, boost::function< - void(std::vector const&)> f); - void add_router_node(udp::endpoint router); - - void incoming(msg const& m); - - void refresh(); - void refresh_bucket(int bucket); - int bucket_size(int bucket); - - typedef routing_table::iterator iterator; - - iterator begin() const { return m_table.begin(); } - iterator end() const { return m_table.end(); } - - typedef table_t::iterator data_iterator; - - node_id const& nid() const { return m_id; } - boost::tuple size() const{ return m_table.size(); } - - data_iterator begin_data() { return m_map.begin(); } - data_iterator end_data() { return m_map.end(); } - int data_size() const { return int(m_map.size()); } - - void print_state(std::ostream& os) const - { m_table.print_state(os); } - - void announce(sha1_hash const& info_hash, int listen_port - , boost::function const& - , sha1_hash const&)> f); - - bool verify_token(msg const& m); - entry generate_token(msg const& m); - - // the returned time is the delay until connection_timeout() - // should be called again the next time - boost::posix_time::time_duration connection_timeout(); - boost::posix_time::time_duration refresh_timeout(); - - // generates a new secret number used to generate write tokens - void new_write_key(); - - // pings the given node, and adds it to - // the routing table if it respons and if the - // bucket is not full. - void add_node(udp::endpoint node); - - void replacement_cache(bucket_t& nodes) const - { m_table.replacement_cache(nodes); } - -protected: - // is called when a find data request is received. Should - // return false if the data is not stored on this node. If - // the data is stored, it should be serialized into 'data'. - bool on_find(msg const& m, std::vector& peers) const; - - // this is called when a store request is received. The data - // is store-parameters and the data to be stored. - void on_announce(msg const& m, msg& reply); - - dht_settings const& m_settings; - - // the maximum number of peers to send in a get_peers - // reply. Ordinary trackers usually limit this to 50. - // 50 => 6 * 50 = 250 bytes + packet overhead - int m_max_peers_reply; - -private: - void incoming_request(msg const& h); - - node_id m_id; - routing_table m_table; - rpc_manager m_rpc; - table_t m_map; - - boost::posix_time::ptime m_last_tracker_tick; - - // secret random numbers used to create write tokens - int m_secret[2]; -}; - - -} } // namespace libtorrent::dht - -#endif // NODE_HPP - diff --git a/libtorrent/include/kademlia/node_entry.hpp b/libtorrent/include/kademlia/node_entry.hpp deleted file mode 100644 index edc5dff80..000000000 --- a/libtorrent/include/kademlia/node_entry.hpp +++ /dev/null @@ -1,63 +0,0 @@ -/* - -Copyright (c) 2006, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef KADEMLIA_NODE_ENTRY_HPP -#define KADEMLIA_NODE_ENTRY_HPP - -#include "libtorrent/kademlia/node_id.hpp" -#include "libtorrent/socket.hpp" - -namespace libtorrent { namespace dht -{ - -struct node_entry -{ - node_entry(node_id const& id_, asio::ip::udp::endpoint addr_) - : id(id_) - , addr(addr_) - , fail_count(0) {} - node_entry(asio::ip::udp::endpoint addr_) - : id(0) - , addr(addr_) - , fail_count(0) {} - - node_id id; - udp::endpoint addr; - // the number of times this node has failed to - // respond in a row - int fail_count; -}; - -} } // namespace libtorrent::dht - -#endif - diff --git a/libtorrent/include/kademlia/node_id.hpp b/libtorrent/include/kademlia/node_id.hpp deleted file mode 100644 index eb4d6c539..000000000 --- a/libtorrent/include/kademlia/node_id.hpp +++ /dev/null @@ -1,60 +0,0 @@ -/* - -Copyright (c) 2006, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ -#ifndef NODE_ID_HPP -#define NODE_ID_HPP - -#include -#include - -#include -#include "libtorrent/peer_id.hpp" - -namespace libtorrent { namespace dht -{ - -typedef libtorrent::big_number node_id; - -// returns the distance between the two nodes -// using the kademlia XOR-metric -node_id distance(node_id const& n1, node_id const& n2); - -// returns true if: distance(n1, ref) < distance(n2, ref) -bool compare_ref(node_id const& n1, node_id const& n2, node_id const& ref); - -// returns n in: 2^n <= distance(n1, n2) < 2^(n+1) -// usefult for finding out which bucket a node belongs to -int distance_exp(node_id const& n1, node_id const& n2); - -} } // namespace libtorrent::dht - -#endif // NODE_ID_HPP - diff --git a/libtorrent/include/kademlia/packet_iterator.hpp b/libtorrent/include/kademlia/packet_iterator.hpp deleted file mode 100644 index e906a90bf..000000000 --- a/libtorrent/include/kademlia/packet_iterator.hpp +++ /dev/null @@ -1,95 +0,0 @@ -/* - -Copyright (c) 2006, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef PACKET_ITERATOR_HPP -#define PACKET_ITERATOR_HPP - -#include -#include -#include - -namespace libtorrent { namespace dht -{ - -class packet_iterator: public boost::iterator_facade< - packet_iterator, const char, boost::forward_traversal_tag> -{ -public: - typedef std::vector::const_iterator base_iterator; - - packet_iterator() {} - - packet_iterator(std::vector::const_iterator start - , std::vector::const_iterator end - , std::string const& error_msg = "") - : m_base(start) - , m_end(end) - , m_msg(error_msg) - {} - - base_iterator base() const - { return m_base; } - - base_iterator end() const - { return m_end; } - - int left() const { return int(m_end - m_base); } - -private: - friend class boost::iterator_core_access; - - bool equal(packet_iterator const& other) const - { return m_base == other.m_base; } - - void advance(int n) - { - m_base += n; - } - - void increment() - { ++m_base; } - - char const& dereference() const - { - if (m_base == m_end) throw std::runtime_error(m_msg); - return *m_base; - } - - base_iterator m_base; - base_iterator m_end; - std::string m_msg; -}; - -} } // namespace libtorrent::dht - -#endif // PACKET_ITERATOR_HPP - diff --git a/libtorrent/include/kademlia/refresh.hpp b/libtorrent/include/kademlia/refresh.hpp deleted file mode 100644 index f47b80462..000000000 --- a/libtorrent/include/kademlia/refresh.hpp +++ /dev/null @@ -1,159 +0,0 @@ -/* - -Copyright (c) 2006, Arvid Norberg & Daniel Wallin -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef REFRESH_050324_HPP -#define REFRESH_050324_HPP - -#include - -#include -#include - -#include - -namespace libtorrent { namespace dht -{ - -#ifdef TORRENT_DHT_VERBOSE_LOGGING -TORRENT_DECLARE_LOG(refresh); -#endif - -class routing_table; -class rpc_manager; - -class refresh : public traversal_algorithm -{ -public: - typedef boost::function done_callback; - - template - static void initiate( - node_id target - , int branch_factor - , int max_active_pings - , int max_results - , routing_table& table - , InIt first - , InIt last - , rpc_manager& rpc - , done_callback const& callback - ); - - void ping_reply(node_id id); - void ping_timeout(node_id id); - -private: - template - refresh( - node_id target - , int branch_factor - , int max_active_pings - , int max_results - , routing_table& table - , InIt first - , InIt last - , rpc_manager& rpc - , done_callback const& callback - ); - - void done(); - void invoke(node_id const& id, udp::endpoint addr); - - void invoke_pings_or_finish(); - - int m_max_active_pings; - int m_active_pings; - - done_callback m_done_callback; - - std::vector::iterator m_leftover_nodes_iterator; -}; - -template -inline refresh::refresh( - node_id target - , int branch_factor - , int max_active_pings - , int max_results - , routing_table& table - , InIt first - , InIt last - , rpc_manager& rpc - , done_callback const& callback -) - : traversal_algorithm( - target - , branch_factor - , max_results - , table - , rpc - , first - , last - ) - , m_max_active_pings(max_active_pings) - , m_active_pings(0) - , m_done_callback(callback) -{ - boost::intrusive_ptr self(this); - add_requests(); -} - -template -inline void refresh::initiate( - node_id target - , int branch_factor - , int max_active_pings - , int max_results - , routing_table& table - , InIt first - , InIt last - , rpc_manager& rpc - , done_callback const& callback -) -{ - new refresh( - target - , branch_factor - , max_active_pings - , max_results - , table - , first - , last - , rpc - , callback - ); -} - -} } // namespace libtorrent::dht - -#endif // REFRESH_050324_HPP - diff --git a/libtorrent/include/kademlia/routing_table.hpp b/libtorrent/include/kademlia/routing_table.hpp deleted file mode 100644 index 3abc472b4..000000000 --- a/libtorrent/include/kademlia/routing_table.hpp +++ /dev/null @@ -1,246 +0,0 @@ -/* - -Copyright (c) 2006, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef ROUTING_TABLE_HPP -#define ROUTING_TABLE_HPP - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include - -namespace pt = boost::posix_time; - -namespace libtorrent { namespace dht -{ - -using asio::ip::udp; - -//TORRENT_DECLARE_LOG(table); - -typedef std::deque bucket_t; - -// differences in the implementation from the description in -// the paper: -// -// * The routing table tree is not allocated dynamically, there -// are always 160 buckets. -// * Nodes are not marked as being stale, they keep a counter -// that tells how many times in a row they have failed. When -// a new node is to be inserted, the node that has failed -// the most times is replaced. If none of the nodes in the -// bucket has failed, then it is put in the replacement -// cache (just like in the paper). - -class routing_table; - -namespace aux -{ - - // Iterates over a flattened routing_table structure. - class routing_table_iterator - : public boost::iterator_facade< - routing_table_iterator - , node_entry const - , boost::forward_traversal_tag - > - { - public: - routing_table_iterator() - { - } - - private: - friend class libtorrent::dht::routing_table; - friend class boost::iterator_core_access; - - typedef boost::array, 160>::const_iterator - bucket_iterator_t; - - routing_table_iterator( - bucket_iterator_t begin - , bucket_iterator_t end) - : m_bucket_iterator(begin) - , m_bucket_end(end) - , m_iterator(begin != end ? begin->first.begin() : bucket_t::iterator()) - { - if (m_bucket_iterator == m_bucket_end) return; - while (m_iterator == m_bucket_iterator->first.end()) - { - if (++m_bucket_iterator == m_bucket_end) - break; - m_iterator = m_bucket_iterator->first.begin(); - } - } - - bool equal(routing_table_iterator const& other) const - { - return m_bucket_iterator == other.m_bucket_iterator - && (m_bucket_iterator == m_bucket_end - || m_iterator == other.m_iterator); - } - - void increment() - { - assert(m_bucket_iterator != m_bucket_end); - ++m_iterator; - while (m_iterator == m_bucket_iterator->first.end()) - { - if (++m_bucket_iterator == m_bucket_end) - break; - m_iterator = m_bucket_iterator->first.begin(); - } - } - - node_entry const& dereference() const - { - assert(m_bucket_iterator != m_bucket_end); - return *m_iterator; - } - - bucket_iterator_t m_bucket_iterator; - bucket_iterator_t m_bucket_end; - bucket_t::const_iterator m_iterator; - }; - -} // namespace aux - -class routing_table -{ -public: - typedef aux::routing_table_iterator iterator; - typedef iterator const_iterator; - - routing_table(node_id const& id, int bucket_size - , dht_settings const& settings); - - void node_failed(node_id const& id); - - // adds an endpoint that will never be added to - // the routing table - void add_router_node(udp::endpoint router); - - // iterates over the router nodes added - typedef std::set::const_iterator router_iterator; - router_iterator router_begin() const { return m_router_nodes.begin(); } - router_iterator router_end() const { return m_router_nodes.end(); } - - // this function is called every time the node sees - // a sign of a node being alive. This node will either - // be inserted in the k-buckets or be moved to the top - // of its bucket. - bool node_seen(node_id const& id, udp::endpoint addr); - - // returns time when the given bucket needs another refresh. - // if the given bucket is empty but there are nodes - // in a bucket closer to us, or if the bucket is non-empty and - // the time from the last activity is more than 15 minutes - boost::posix_time::ptime next_refresh(int bucket); - - // fills the vector with the count nodes from our buckets that - // are nearest to the given id. - void find_node(node_id const& id, std::vector& l - , bool include_self, int count = 0); - - // returns true if the given node would be placed in a bucket - // that is not full. If the node already exists in the table - // this function returns false - bool need_node(node_id const& id); - - // this will set the given bucket's latest activity - // to the current time - void touch_bucket(int bucket); - - int bucket_size(int bucket) - { - assert(bucket >= 0 && bucket < 160); - return (int)m_buckets[bucket].first.size(); - } - int bucket_size() const { return m_bucket_size; } - - iterator begin() const; - iterator end() const; - - boost::tuple size() const; - - // returns true if there are no working nodes - // in the routing table - bool need_bootstrap() const; - - void replacement_cache(bucket_t& nodes) const; - - // used for debug and monitoring purposes. This will print out - // the state of the routing table to the given stream - void print_state(std::ostream& os) const; - -private: - - // constant called k in paper - int m_bucket_size; - - dht_settings const& m_settings; - - // 160 (k-bucket, replacement cache) pairs - typedef boost::array, 160> table_t; - table_t m_buckets; - // timestamps of the last activity in each bucket - typedef boost::array table_activity_t; - table_activity_t m_bucket_activity; - node_id m_id; // our own node id - - // this is a set of all the endpoints that have - // been identified as router nodes. They will - // be used in searches, but they will never - // be added to the routing table. - std::set m_router_nodes; - - // this is the lowest bucket index with nodes in it - int m_lowest_active_bucket; -}; - -} } // namespace libtorrent::dht - -#endif // ROUTING_TABLE_HPP - diff --git a/libtorrent/include/kademlia/rpc_manager.hpp b/libtorrent/include/kademlia/rpc_manager.hpp deleted file mode 100644 index 5aa850e95..000000000 --- a/libtorrent/include/kademlia/rpc_manager.hpp +++ /dev/null @@ -1,194 +0,0 @@ -/* - -Copyright (c) 2006, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef RPC_MANAGER_HPP -#define RPC_MANAGER_HPP - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -namespace libtorrent { namespace dht -{ - -using asio::ip::udp; -#ifdef TORRENT_DHT_VERBOSE_LOGGING -TORRENT_DECLARE_LOG(rpc); -#endif - -typedef std::vector packet_t; - -namespace messages -{ - enum { ping = 0, find_node = 1, get_peers = 2, announce_peer = 3, error = 4 }; - char const* const ids[] = { "ping", "find_node", "get_peers", "announce_peer", "error" }; -} // namespace messages - -struct msg -{ - msg() : reply(false), piggy_backed_ping(false) - , port(0) {} - - // true if this message is a reply - bool reply; - // true if this is a reply with a piggy backed ping - bool piggy_backed_ping; - // the kind if message - int message_id; - // if this is a reply, a copy of the transaction id - // from the request. If it's a request, a transaction - // id that should be sent back in the reply - std::string transaction_id; - // if this packet has a piggy backed ping, this - // is the transaction id of that ping - std::string ping_transaction_id; - // the node id of the process sending the message - node_id id; - // the address of the process sending or receiving - // the message. - udp::endpoint addr; - // if this is a nodes response, these are the nodes - typedef std::vector nodes_t; - nodes_t nodes; - - typedef std::vector peers_t; - peers_t peers; - - // similar to transaction_id but for write operations. - entry write_token; - - // the info has for peer_requests, announce_peer - // and responses - node_id info_hash; - - // port for announce_peer messages - int port; - - // ERROR MESSAGES - int error_code; - std::string error_msg; -}; - -struct observer : boost::noncopyable -{ - observer() - : sent(boost::posix_time::microsec_clock::universal_time()) - {} - - virtual ~observer() {} - - // this two callbacks lets the observer add - // information to the message before it's sent - virtual void send(msg& m) = 0; - - // this is called when a reply is received - virtual void reply(msg const& m) = 0; - - // this is called when no reply has been received within - // some timeout - virtual void timeout() = 0; - - udp::endpoint target_addr; - boost::posix_time::ptime sent; -}; - -class routing_table; - -class rpc_manager -{ -public: - typedef boost::function1 fun; - typedef boost::function1 send_fun; - - rpc_manager(fun const& incoming_fun, node_id const& our_id - , routing_table& table, send_fun const& sf); - ~rpc_manager(); - - // returns true if the node needs a refresh - bool incoming(msg const&); - boost::posix_time::time_duration tick(); - - void invoke(int message_id, udp::endpoint target - , boost::shared_ptr o); - - void reply(msg& m, msg const& reply_to); - void reply_with_ping(msg& m, msg const& reply_to); - -#ifndef NDEBUG - void check_invariant() const; -#endif - -private: - - enum { max_transactions = 2048 }; - unsigned int new_transaction_id(); - void update_oldest_transaction_id(); - - boost::uint32_t calc_connection_id(udp::endpoint addr); - - typedef boost::array, max_transactions> - transactions_t; - transactions_t m_transactions; - - // this is the next transaction id to be used - int m_next_transaction_id; - // this is the oldest transaction id still - // (possibly) in use. This is the transaction - // that will time out first, the one we are - // waiting for to time out - int m_oldest_transaction_id; - - fun m_incoming; - send_fun m_send; - node_id m_our_id; - routing_table& m_table; - boost::posix_time::ptime m_timer; - node_id m_random_number; -}; - -} } // namespace libtorrent::dht - -#endif - - diff --git a/libtorrent/include/kademlia/traversal_algorithm.hpp b/libtorrent/include/kademlia/traversal_algorithm.hpp deleted file mode 100644 index a99a9c6ea..000000000 --- a/libtorrent/include/kademlia/traversal_algorithm.hpp +++ /dev/null @@ -1,161 +0,0 @@ -/* - -Copyright (c) 2006, Arvid Norberg & Daniel Wallin -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TRAVERSAL_ALGORITHM_050324_HPP -#define TRAVERSAL_ALGORITHM_050324_HPP - -#include -#include - -#include -#include -#include - -#include -#include -#include - -namespace libtorrent { namespace dht -{ -#ifdef TORRENT_DHT_VERBOSE_LOGGING -TORRENT_DECLARE_LOG(traversal); -#endif - -class rpc_manager; - -// this class may not be instantiated as a stack object -class traversal_algorithm : boost::noncopyable -{ -public: - void traverse(node_id const& id, udp::endpoint addr); - void finished(node_id const& id); - void failed(node_id const& id); - virtual ~traversal_algorithm() {} - -protected: - template - traversal_algorithm( - node_id target - , int branch_factor - , int max_results - , routing_table& table - , rpc_manager& rpc - , InIt start - , InIt end - ); - - void add_request(node_id const& id, udp::endpoint addr); - void add_requests(); - void add_entry(node_id const& id, udp::endpoint addr, unsigned char flags); - - virtual void done() = 0; - virtual void invoke(node_id const& id, udp::endpoint addr) = 0; - - struct result - { - result(node_id const& id, udp::endpoint addr, unsigned char f = 0) - : id(id), addr(addr), flags(f) - {} - - node_id id; - udp::endpoint addr; - enum { queried = 1, initial = 2 }; - unsigned char flags; - }; - - std::vector::iterator last_iterator(); - - friend void intrusive_ptr_add_ref(traversal_algorithm* p) - { - p->m_ref_count++; - } - - friend void intrusive_ptr_release(traversal_algorithm* p) - { - if (--p->m_ref_count == 0) - delete p; - } - - int m_ref_count; - - node_id m_target; - int m_branch_factor; - int m_max_results; - std::vector m_results; - std::set m_failed; - routing_table& m_table; - rpc_manager& m_rpc; - int m_invoke_count; -}; - -template -traversal_algorithm::traversal_algorithm( - node_id target - , int branch_factor - , int max_results - , routing_table& table - , rpc_manager& rpc - , InIt start // <- nodes to initiate traversal with - , InIt end -) - : m_ref_count(0) - , m_target(target) - , m_branch_factor(branch_factor) - , m_max_results(max_results) - , m_table(table) - , m_rpc(rpc) - , m_invoke_count(0) -{ - using boost::bind; - - for (InIt i = start; i != end; ++i) - { - add_entry(i->id, i->addr, result::initial); - } - - // in case the routing table is empty, use the - // router nodes in the table - if (start == end) - { - for (routing_table::router_iterator i = table.router_begin() - , end(table.router_end()); i != end; ++i) - { - add_entry(node_id(0), *i, result::initial); - } - } - -} - -} } // namespace libtorrent::dht - -#endif // TRAVERSAL_ALGORITHM_050324_HPP - diff --git a/libtorrent/include/peer.hpp b/libtorrent/include/peer.hpp deleted file mode 100755 index c404a611d..000000000 --- a/libtorrent/include/peer.hpp +++ /dev/null @@ -1,63 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_PEER_HPP_INCLUDED -#define TORRENT_PEER_HPP_INCLUDED - -#include - -#include "libtorrent/peer_id.hpp" - -namespace libtorrent -{ - - struct TORRENT_EXPORT peer_entry - { - std::string ip; - int port; - peer_id pid; - - bool operator==(const peer_entry& p) const - { - return pid == p.pid; - } - - bool operator<(const peer_entry& p) const - { - return pid < p.pid; - } - }; - -} - -#endif // TORRENT_PEER_HPP_INCLUDED - diff --git a/libtorrent/include/peer_connection.hpp b/libtorrent/include/peer_connection.hpp deleted file mode 100755 index a7f9b7e53..000000000 --- a/libtorrent/include/peer_connection.hpp +++ /dev/null @@ -1,557 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_PEER_CONNECTION_HPP_INCLUDED -#define TORRENT_PEER_CONNECTION_HPP_INCLUDED - -#include -#include -#include -#include -#include - -#include "libtorrent/debug.hpp" - -#ifdef _MSC_VER -#pragma warning(push, 1) -#endif - -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -#include "libtorrent/buffer.hpp" -#include "libtorrent/socket.hpp" -#include "libtorrent/peer_id.hpp" -#include "libtorrent/storage.hpp" -#include "libtorrent/stat.hpp" -#include "libtorrent/alert.hpp" -#include "libtorrent/torrent_handle.hpp" -#include "libtorrent/torrent.hpp" -#include "libtorrent/allocate_resources.hpp" -#include "libtorrent/peer_request.hpp" -#include "libtorrent/piece_block_progress.hpp" -#include "libtorrent/config.hpp" -#include "libtorrent/session.hpp" - -// TODO: each time a block is 'taken over' -// from another peer. That peer must be given -// a chance to become not-interested. - -namespace libtorrent -{ - class torrent; - - namespace detail - { - struct session_impl; - } - - TORRENT_EXPORT void intrusive_ptr_add_ref(peer_connection const*); - TORRENT_EXPORT void intrusive_ptr_release(peer_connection const*); - - struct TORRENT_EXPORT protocol_error: std::runtime_error - { - protocol_error(const std::string& msg): std::runtime_error(msg) {}; - }; - - class TORRENT_EXPORT peer_connection - : public boost::noncopyable - { - friend class invariant_access; - friend void intrusive_ptr_add_ref(peer_connection const*); - friend void intrusive_ptr_release(peer_connection const*); - public: - - // this is the constructor where the we are the active part. - // The peer_conenction should handshake and verify that the - // other end has the correct id - peer_connection( - aux::session_impl& ses - , boost::weak_ptr t - , boost::shared_ptr s - , tcp::endpoint const& remote); - - // with this constructor we have been contacted and we still don't - // know which torrent the connection belongs to - peer_connection( - aux::session_impl& ses - , boost::shared_ptr s); - - // this function is called once the torrent associated - // with this peer connection has retrieved the meta- - // data. If the torrent was spawned with metadata - // this is called from the constructor. - void init(); - - void set_upload_limit(int limit); - void set_download_limit(int limit); - - virtual ~peer_connection(); - - // this adds an announcement in the announcement queue - // it will let the peer know that we have the given piece - void announce_piece(int index); - - // tells if this connection has data it want to send - // and has enough upload bandwidth quota left to send it. - bool can_write() const; - bool can_read() const; - - bool is_seed() const; - - bool has_timed_out() const; - - // will send a keep-alive message to the peer - void keep_alive(); - - peer_id const& pid() const { return m_peer_id; } - void set_pid(const peer_id& pid) { m_peer_id = pid; } - bool has_piece(int i) const; - - const std::deque& download_queue() const; - const std::deque& request_queue() const; - const std::deque& upload_queue() const; - - bool is_interesting() const { return m_interesting; } - bool is_choked() const { return m_choked; } - - bool is_peer_interested() const { return m_peer_interested; } - bool has_peer_choked() const { return m_peer_choked; } - - // returns the torrent this connection is a part of - // may be zero if the connection is an incoming connection - // and it hasn't received enough information to determine - // which torrent it should be associated with - boost::weak_ptr associated_torrent() const - { return m_torrent; } - - const stat& statistics() const { return m_statistics; } - void add_stat(size_type downloaded, size_type uploaded); - - // is called once every second by the main loop - void second_tick(float tick_interval); - - boost::shared_ptr get_socket() const { return m_socket; } - tcp::endpoint const& remote() const { return m_remote; } - - std::vector const& get_bitfield() const; - - // this will cause this peer_connection to be disconnected. - // what it does is that it puts a reference to it in - // m_ses.m_disconnect_peer list, which will be scanned in the - // mainloop to disconnect peers. - void disconnect(); - bool is_disconnecting() const { return m_disconnecting; } - - // this is called when the connection attempt has succeeded - // and the peer_connection is supposed to set m_connecting - // to false, and stop monitor writability - void on_connection_complete(asio::error const& e); - - // returns true if this connection is still waiting to - // finish the connection attempt - bool is_connecting() const { return m_connecting; } - - // returns true if the socket of this peer hasn't been - // attempted to connect yet (i.e. it's queued for - // connection attempt). - bool is_queued() const { return m_queued; } - - // called when it's time for this peer_conncetion to actually - // initiate the tcp connection. This may be postponed until - // the library isn't using up the limitation of half-open - // tcp connections. - void connect(); - - // This is called for every peer right after the upload - // bandwidth has been distributed among them - // It will reset the used bandwidth to 0. - void reset_upload_quota(); - - // free upload. - size_type total_free_upload() const; - void add_free_upload(size_type free_upload); - - // trust management. - void received_valid_data(); - void received_invalid_data(); - int trust_points() const; - - size_type share_diff() const; - - // a connection is local if it was initiated by us. - // if it was an incoming connection, it is remote - bool is_local() const { return m_active; } - - void set_failed() { m_failed = true; } - bool failed() const { return m_failed; } - - int desired_queue_size() const { return m_desired_queue_size; } - -#ifdef TORRENT_VERBOSE_LOGGING - boost::shared_ptr m_logger; -#endif - - // the message handlers are called - // each time a recv() returns some new - // data, the last time it will be called - // is when the entire packet has been - // received, then it will no longer - // be called. i.e. most handlers need - // to check how much of the packet they - // have received before any processing - void incoming_keepalive(); - void incoming_choke(); - void incoming_unchoke(); - void incoming_interested(); - void incoming_not_interested(); - void incoming_have(int piece_index); - void incoming_bitfield(std::vector const& bitfield); - void incoming_request(peer_request const& r); - void incoming_piece(peer_request const& p, char const* data); - void incoming_piece_fragment(); - void incoming_cancel(peer_request const& r); - void incoming_dht_port(int listen_port); - - // the following functions appends messages - // to the send buffer - void send_choke(); - void send_unchoke(); - void send_interested(); - void send_not_interested(); - - // adds a block to the request queue - void add_request(piece_block const& b); - void cancel_request(piece_block const& b); - void send_block_requests(); - - // how much bandwidth we're using, how much we want, - // and how much we are allowed to use. - resource_request m_ul_bandwidth_quota; - resource_request m_dl_bandwidth_quota; - -#ifndef NDEBUG - void check_invariant() const; - boost::posix_time::ptime m_last_choke; -#endif - - virtual void get_peer_info(peer_info& p) const = 0; - - // returns the block currently being - // downloaded. And the progress of that - // block. If the peer isn't downloading - // a piece for the moment, the boost::optional - // will be invalid. - virtual boost::optional - downloading_piece_progress() const - { - #ifdef TORRENT_VERBOSE_LOGGING - (*m_logger) << "downloading_piece_progress() dispatched to the base class!\n"; - #endif - return boost::optional(); - } - - protected: - - virtual void write_choke() = 0; - virtual void write_unchoke() = 0; - virtual void write_interested() = 0; - virtual void write_not_interested() = 0; - virtual void write_request(peer_request const& r) = 0; - virtual void write_cancel(peer_request const& r) = 0; - virtual void write_have(int index) = 0; - virtual void write_keepalive() = 0; - virtual void write_piece(peer_request const& r) = 0; - - virtual void on_connected() = 0; - virtual void on_tick() {} - - virtual void on_receive(asio::error const& error - , std::size_t bytes_transferred) = 0; - virtual void on_sent(asio::error const& error - , std::size_t bytes_transferred) = 0; - - void send_buffer(char const* begin, char const* end); - buffer::interval allocate_send_buffer(int size); - int send_buffer_size() const - { - return (int)m_send_buffer[0].size() - + (int)m_send_buffer[1].size() - - m_write_pos; - } - - buffer::const_interval receive_buffer() const - { - return buffer::const_interval(&m_recv_buffer[0] - , &m_recv_buffer[0] + m_recv_pos); - } - - void cut_receive_buffer(int size, int packet_size); - - void reset_recv_buffer(int packet_size); - int packet_size() const { return m_packet_size; } - - bool packet_finished() const - { - assert(m_recv_pos <= m_packet_size); - return m_packet_size == m_recv_pos; - } - - void setup_send(); - void setup_receive(); - - void attach_to_torrent(sha1_hash const& ih); - - bool verify_piece(peer_request const& p) const; - - // statistics about upload and download speeds - // and total amount of uploads and downloads for - // this peer - stat m_statistics; - - // a back reference to the session - // the peer belongs to. - aux::session_impl& m_ses; - - boost::intrusive_ptr self() - { return boost::intrusive_ptr(this); } - - // called from the main loop when this connection has any - // work to do. - void on_send_data(asio::error const& error - , std::size_t bytes_transferred); - void on_receive_data(asio::error const& error - , std::size_t bytes_transferred); - - // this is the limit on the number of outstanding requests - // we have to this peer. This is initialized to the settings - // in the session_settings structure. But it may be lowered - // if the peer is known to require a smaller limit (like BitComet). - // or if the extended handshake sets a limit. - // web seeds also has a limit on the queue size. - int m_max_out_request_queue; - - void set_timeout(int s) { m_timeout = s; } - - private: - - void fill_send_buffer(); - - // the timeout in seconds - int m_timeout; - - // the time when we last got a part of a - // piece packet from this peer - boost::posix_time::ptime m_last_piece; - - int m_packet_size; - int m_recv_pos; - std::vector m_recv_buffer; - - // this is the buffer where data that is - // to be sent is stored until it gets - // consumed by send(). Since asio requires - // the memory buffer that is given to async. - // operations to remain valid until the operation - // finishes, there has to be two buffers. While - // waiting for a async_write operation on one - // buffer, the other is used to write data to - // be queued up. - std::vector m_send_buffer[2]; - // the current send buffer is the one to write to. - // (m_current_send_buffer + 1) % 2 is the - // buffer we're currently waiting for. - int m_current_send_buffer; - - // if the sending buffer doesn't finish in one send - // operation, this is the position within that buffer - // where the next operation should continue - int m_write_pos; - - // timeouts - boost::posix_time::ptime m_last_receive; - boost::posix_time::ptime m_last_sent; - - boost::shared_ptr m_socket; - tcp::endpoint m_remote; - - // this is the torrent this connection is - // associated with. If the connection is an - // incoming conncetion, this is set to zero - // until the info_hash is received. Then it's - // set to the torrent it belongs to. - boost::weak_ptr m_torrent; - // is true if it was we that connected to the peer - // and false if we got an incomming connection - // could be considered: true = local, false = remote - bool m_active; - - // remote peer's id - peer_id m_peer_id; - - // other side says that it's interested in downloading - // from us. - bool m_peer_interested; - - // the other side has told us that it won't send anymore - // data to us for a while - bool m_peer_choked; - - // the peer has pieces we are interested in - bool m_interesting; - - // we have choked the upload to the peer - bool m_choked; - - // this is set to true if the connection timed - // out or closed the connection. In that - // case we will not try to reconnect to - // this peer - bool m_failed; - - // the pieces the other end have - std::vector m_have_piece; - - // the number of pieces this peer - // has. Must be the same as - // std::count(m_have_piece.begin(), - // m_have_piece.end(), true) - int m_num_pieces; - - // the queue of requests we have got - // from this peer - std::deque m_requests; - - // the blocks we have reserved in the piece - // picker and will send to this peer. - std::deque m_request_queue; - - // the queue of blocks we have requested - // from this peer - std::deque m_download_queue; - - // the number of request we should queue up - // at the remote end. - int m_desired_queue_size; - - // the amount of data this peer has been given - // as free upload. This is distributed from - // peers from which we get free download - // this will be negative on a peer from which - // we get free download, and positive on peers - // that we give the free upload, to keep the balance. - size_type m_free_upload; - - // for every valid piece we receive where this - // peer was one of the participants, we increase - // this value. For every invalid piece we receive - // where this peer was a participant, we decrease - // this value. If it sinks below a threshold, its - // considered a bad peer and will be banned. - int m_trust_points; - - // if this is true, this peer is assumed to handle all piece - // requests in fifo order. All skipped blocks are re-requested - // immediately instead of having a looser requirement - // where blocks can be sent out of order. The default is to - // allow non-fifo order. - bool m_assume_fifo; - - // the number of invalid piece-requests - // we have got from this peer. If the request - // queue gets empty, and there have been - // invalid requests, we can assume the - // peer is waiting for those pieces. - // we can then clear its download queue - // by sending choke, unchoke. - int m_num_invalid_requests; - - // this is true if this connection has been added - // to the list of connections that will be closed. - bool m_disconnecting; - - // the time when this peer sent us a not_interested message - // the last time. - boost::posix_time::ptime m_became_uninterested; - - // the time when we sent a not_interested message to - // this peer the last time. - boost::posix_time::ptime m_became_uninteresting; - - // this is true until this socket has become - // writable for the first time (i.e. the - // connection completed). While connecting - // the timeout will not be triggered. This is - // because windows XP SP2 may delay connection - // attempts, which means that the connection - // may not even have been attempted when the - // time out is reached. - bool m_connecting; - - // This is true until connect is called on the - // peer_connection's socket. It is false on incoming - // connections. - bool m_queued; - - // these are true when there's a asynchronous write - // or read operation running. - bool m_writing; - // this is the number of bytes sent to the socket last - // time it was invoked. This is compared against the - // bytes_transferred in the callback function that tells - // how much actually was sent. Then the quota can be - // corrected according to the actual number of bytes sent - int m_last_write_size; - bool m_reading; - int m_last_read_size; - // reference counter for intrusive_ptr - mutable boost::detail::atomic_count m_refs; - -#ifndef NDEBUG - public: - bool m_in_constructor; -#endif - }; -} - -#endif // TORRENT_PEER_CONNECTION_HPP_INCLUDED - diff --git a/libtorrent/include/peer_id.hpp b/libtorrent/include/peer_id.hpp deleted file mode 100755 index d3bf624b7..000000000 --- a/libtorrent/include/peer_id.hpp +++ /dev/null @@ -1,177 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_PEER_ID_HPP_INCLUDED -#define TORRENT_PEER_ID_HPP_INCLUDED - -#include -#include -#include -#include -#include - -#include "libtorrent/config.hpp" - -namespace libtorrent -{ - - class TORRENT_EXPORT big_number - { - // private type - struct private_pointer {}; - // the number of bytes of the number - enum { number_size = 20 }; - public: - enum { size = number_size }; - - big_number() {} - - // when initialized with 0 - big_number(private_pointer*) { clear(); } - - void clear() - { - std::fill(m_number,m_number+number_size,0); - } - - bool is_all_zeros() const - { - return std::count(m_number,m_number+number_size,0) == number_size; - } - - bool operator==(big_number const& n) const - { - return std::equal(n.m_number, n.m_number+number_size, m_number); - } - - bool operator!=(big_number const& n) const - { - return !std::equal(n.m_number, n.m_number+number_size, m_number); - } - - bool operator<(big_number const& n) const - { - for (int i = 0; i < number_size; ++i) - { - if (m_number[i] < n.m_number[i]) return true; - if (m_number[i] > n.m_number[i]) return false; - } - return false; - } - - big_number operator~() - { - big_number ret; - for (int i = 0; i< number_size; ++i) - ret.m_number[i] = ~m_number[i]; - return ret; - } - - big_number& operator &= (big_number const& n) - { - for (int i = 0; i< number_size; ++i) - m_number[i] &= n.m_number[i]; - return *this; - } - - big_number& operator |= (big_number const& n) - { - for (int i = 0; i< number_size; ++i) - m_number[i] |= n.m_number[i]; - return *this; - } - - unsigned char& operator[](int i) - { assert(i >= 0 && i < number_size); return m_number[i]; } - - unsigned char const& operator[](int i) const - { assert(i >= 0 && i < number_size); return m_number[i]; } - - typedef const unsigned char* const_iterator; - typedef unsigned char* iterator; - - const_iterator begin() const { return m_number; } - const_iterator end() const { return m_number+number_size; } - - iterator begin() { return m_number; } - iterator end() { return m_number+number_size; } - - private: - - unsigned char m_number[number_size]; - - }; - - typedef big_number peer_id; - typedef big_number sha1_hash; - - inline std::ostream& operator<<(std::ostream& os, big_number const& peer) - { - for (big_number::const_iterator i = peer.begin(); - i != peer.end(); ++i) - { - os << std::hex << std::setw(2) << std::setfill('0') - << static_cast(*i); - } - os << std::dec << std::setfill(' '); - return os; - } - - inline std::istream& operator>>(std::istream& is, big_number& peer) - { - using namespace std; - - for (big_number::iterator i = peer.begin(); - i != peer.end(); ++i) - { - char c[2]; - is >> c[0] >> c[1]; - c[0] = tolower(c[0]); - c[1] = tolower(c[1]); - if ( - ((c[0] < '0' || c[0] > '9') && (c[0] < 'a' || c[0] > 'f')) - || ((c[1] < '0' || c[1] > '9') && (c[1] < 'a' || c[1] > 'f')) - || is.fail()) - { - is.setstate(ios_base::failbit); - return is; - } - *i = ((isdigit(c[0])?c[0]-'0':c[0]-'a'+10) << 4) - + (isdigit(c[1])?c[1]-'0':c[1]-'a'+10); - } - return is; - } - -} - -#endif // TORRENT_PEER_ID_HPP_INCLUDED - diff --git a/libtorrent/include/peer_info.hpp b/libtorrent/include/peer_info.hpp deleted file mode 100755 index 7a6e50834..000000000 --- a/libtorrent/include/peer_info.hpp +++ /dev/null @@ -1,106 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_PEER_INFO_HPP_INCLUDED -#define TORRENT_PEER_INFO_HPP_INCLUDED - -#include - -#include "libtorrent/socket.hpp" -#include "libtorrent/peer_id.hpp" -#include "libtorrent/size_type.hpp" -#include "libtorrent/config.hpp" - -namespace libtorrent -{ - struct TORRENT_EXPORT peer_info - { - enum - { - interesting = 0x1, - choked = 0x2, - remote_interested = 0x4, - remote_choked = 0x8, - supports_extensions = 0x10, - local_connection = 0x20, - handshake = 0x40, - connecting = 0x80, - queued = 0x100 - }; - unsigned int flags; - tcp::endpoint ip; - float up_speed; - float down_speed; - float payload_up_speed; - float payload_down_speed; - size_type total_download; - size_type total_upload; - peer_id pid; - std::vector pieces; - bool seed; // true if this is a seed - int upload_limit; - int download_limit; - - size_type load_balancing; - - // this is the number of requests - // we have sent to this peer - // that we haven't got a response - // for yet - int download_queue_length; - - // this is the number of requests - // the peer has sent to us - // that we haven't sent yet - int upload_queue_length; - - // the currently downloading piece - // if piece index is -1 all associated - // members are just set to 0 - int downloading_piece_index; - int downloading_block_index; - int downloading_progress; - int downloading_total; - - std::string client; - - enum - { - standard_bittorrent = 0, - web_seed = 1 - }; - int connection_type; - }; - -} - -#endif // TORRENT_PEER_INFO_HPP_INCLUDED diff --git a/libtorrent/include/peer_request.hpp b/libtorrent/include/peer_request.hpp deleted file mode 100644 index 445ff4d7e..000000000 --- a/libtorrent/include/peer_request.hpp +++ /dev/null @@ -1,49 +0,0 @@ -/* - -Copyright (c) 2006, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_PEER_REQUEST_HPP_INCLUDED -#define TORRENT_PEER_REQUEST_HPP_INCLUDED - -namespace libtorrent -{ - struct TORRENT_EXPORT peer_request - { - int piece; - int start; - int length; - bool operator==(peer_request const& r) const - { return piece == r.piece && start == r.start && length == r.length; } - }; -} - -#endif // TORRENT_PEER_REQUEST_HPP_INCLUDED - diff --git a/libtorrent/include/piece_block_progress.hpp b/libtorrent/include/piece_block_progress.hpp deleted file mode 100644 index 481ffc971..000000000 --- a/libtorrent/include/piece_block_progress.hpp +++ /dev/null @@ -1,57 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_PIECE_BLOCK_PROGRESS_HPP_INCLUDED -#define TORRENT_PIECE_BLOCK_PROGRESS_HPP_INCLUDED - -#include "libtorrent/config.hpp" - -namespace libtorrent -{ - struct TORRENT_EXPORT piece_block_progress - { - // the piece and block index - // determines exactly which - // part of the torrent that - // is currently being downloaded - int piece_index; - int block_index; - // the number of bytes we have received - // of this block - int bytes_downloaded; - // the number of bytes in the block - int full_block_bytes; - }; -} - -#endif // TORRENT_PIECE_BLOCK_PROGRESS_HPP_INCLUDED - diff --git a/libtorrent/include/piece_picker.hpp b/libtorrent/include/piece_picker.hpp deleted file mode 100755 index 23f20a79a..000000000 --- a/libtorrent/include/piece_picker.hpp +++ /dev/null @@ -1,355 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ -#ifndef TORRENT_PIECE_PICKER_HPP_INCLUDED -#define TORRENT_PIECE_PICKER_HPP_INCLUDED - -#include -#include -#include -#include - -#ifdef _MSC_VER -#pragma warning(push, 1) -#endif - -#include - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -#include "libtorrent/peer_id.hpp" -#include "libtorrent/socket.hpp" -#include "libtorrent/session_settings.hpp" -#include "libtorrent/config.hpp" - -namespace libtorrent -{ - - class torrent; - class peer_connection; - - struct TORRENT_EXPORT piece_block - { - piece_block(int p_index, int b_index) - : piece_index(p_index) - , block_index(b_index) - {} - int piece_index; - int block_index; - - bool operator<(piece_block const& b) const - { - if (piece_index < b.piece_index) return true; - if (piece_index == b.piece_index) return block_index < b.block_index; - return false; - } - - bool operator==(piece_block const& b) const - { return piece_index == b.piece_index && block_index == b.block_index; } - - bool operator!=(piece_block const& b) const - { return piece_index != b.piece_index || block_index != b.block_index; } - - }; - - class TORRENT_EXPORT piece_picker - { - public: - - enum { max_blocks_per_piece = 256 }; - - struct block_info - { - block_info(): num_downloads(0) {} - // the peer this block was requested or - // downloaded from - tcp::endpoint peer; - // the number of times this block has been downloaded - int num_downloads; - }; - - struct downloading_piece - { - int index; - // each bit represents a block in the piece - // set to one if the block has been requested - std::bitset requested_blocks; - // the bit is set to one if the block has been acquired - std::bitset finished_blocks; - // info about each block - block_info info[max_blocks_per_piece]; - }; - - piece_picker(int blocks_per_piece - , int total_num_blocks); - - void set_sequenced_download_threshold(int sequenced_download_threshold); - - // this is called before any other method is called - // after the local files has been checked. - // the vector tells which pieces we already have - // and which we don't have. - void files_checked( - const std::vector& pieces - , const std::vector& unfinished); - - // increases the peer count for the given piece - // (is used when a HAVE or BITFIELD message is received) - void inc_refcount(int index); - - // decreases the peer count for the given piece - // (used when a peer disconnects) - void dec_refcount(int index); - - // This indicates that we just received this piece - // it means that the refcounter will indicate that - // we are not interested in this piece anymore - // (i.e. we don't have to maintain a refcount) - void we_have(int index); - - // This will mark a piece as unfiltered, and if it was - // previously marked as filtered, it will be considered - // interesting again and be placed in the piece list available - // for downloading. - void mark_as_unfiltered(int index); - - // This will mark a piece as filtered. The piece will be - // removed from the list of pieces avalable for downloading - // and hence, will not be downloaded. - void mark_as_filtered(int index); - - // returns true if the pieces at 'index' is marked as filtered - bool is_filtered(int index) const; - - // fills the bitmask with 1's for pieces that are filtered - void filtered_pieces(std::vector& mask) const; - - // pieces should be the vector that represents the pieces a - // client has. It returns a list of all pieces that this client - // has and that are interesting to download. It returns them in - // priority order. It doesn't care about the download flag. - // The user of this function must lookup if any piece is - // marked as being downloaded. If the user of this function - // decides to download a piece, it must mark it as being downloaded - // itself, by using the mark_as_downloading() member function. - // THIS IS DONE BY THE peer_connection::send_request() MEMBER FUNCTION! - // The last argument is the tcp::endpoint of the peer that we'll download - // from. - void pick_pieces(const std::vector& pieces - , std::vector& interesting_blocks - , int num_pieces, bool prefer_whole_pieces - , tcp::endpoint peer) const; - - // returns true if any client is currently downloading this - // piece-block, or if it's queued for downloading by some client - // or if it already has been successfully downloaded - bool is_downloading(piece_block block) const; - bool is_finished(piece_block block) const; - - // marks this piece-block as queued for downloading - void mark_as_downloading(piece_block block, tcp::endpoint const& peer); - void mark_as_finished(piece_block block, tcp::endpoint const& peer); - - // if a piece had a hash-failure, it must be restored and - // made available for redownloading - void restore_piece(int index); - - // clears the given piece's download flag - // this means that this piece-block can be picked again - void abort_download(piece_block block); - - bool is_piece_finished(int index) const; - - // returns the number of blocks there is in the given piece - int blocks_in_piece(int index) const; - - // the number of downloaded blocks that hasn't passed - // the hash-check yet - int unverified_blocks() const; - - void get_downloaders(std::vector& d, int index) const; - - const std::vector& get_download_queue() const - { return m_downloads; } - - boost::optional get_downloader(piece_block block) const; - - // the number of filtered pieces we don't have - int num_filtered() const { return m_num_filtered; } - - // the number of filtered pieces we already have - int num_have_filtered() const { return m_num_have_filtered; } -#ifndef NDEBUG - // used in debug mode - void check_invariant(const torrent* t = 0) const; -#endif - - // functor that compares indices on downloading_pieces - struct has_index - { - has_index(int i): index(i) { assert(i >= 0); } - bool operator()(const downloading_piece& p) const - { return p.index == index; } - int index; - }; - - int blocks_in_last_piece() const - { return m_blocks_in_last_piece; } - - float distributed_copies() const; - - private: - - struct piece_pos - { - piece_pos() {} - piece_pos(int peer_count_, int index_) - : peer_count(peer_count_) - , downloading(0) - , filtered(0) - , index(index_) - { - assert(peer_count_ >= 0); - assert(index_ >= 0); - } - - // selects which vector to look in - unsigned peer_count : 11; - // is 1 if the piece is marked as being downloaded - unsigned downloading : 1; - // is 1 if the piece is filtered (not to be downloaded) - unsigned filtered : 1; - // index in to the piece_info vector - unsigned index : 19; - - enum { we_have_index = 0x3ffff }; - - int priority(int limit) const - { - return peer_count >= (unsigned)limit ? limit : peer_count; - } - - bool ordered(int limit) const - { - return peer_count >= (unsigned)limit; - } - - bool operator!=(piece_pos p) const - { return index != p.index || peer_count != p.peer_count; } - - bool operator==(piece_pos p) const - { return index == p.index && peer_count == p.peer_count; } - - }; - - - void add(int index); - void move(bool downloading, bool filtered, int vec_index, int elem_index); - void remove(bool downloading, bool filtered, int vec_index, int elem_index); - std::vector >& pick_piece_info_vector(bool downloading - , bool filtered); - - std::vector > const& pick_piece_info_vector( - bool downloading, bool filtered) const; - - int add_interesting_blocks_free(const std::vector& piece_list - , const std::vector& pieces - , std::vector& interesting_blocks - , int num_blocks, bool prefer_whole_pieces) const; - - int add_interesting_blocks_partial(const std::vector& piece_list - , const std::vector& pieces - , std::vector& interesting_blocks - , std::vector& backup_blocks - , int num_blocks, bool prefer_whole_pieces - , tcp::endpoint peer) const; - - - // this vector contains all pieces we don't have. - // in the first entry (index 0) is a vector of all pieces - // that no peer have, the vector at index 1 contains - // all pieces that exactly one peer have, index 2 contains - // all pieces exactly two peers have and so on. - std::vector > m_piece_info; - - // this vector has the same structure as m_piece_info - // but only contains pieces we are currently downloading - // they have higher priority than pieces we aren't downloading - // during piece picking - std::vector > m_downloading_piece_info; - - // this maps indices to number of peers that has this piece and - // index into the m_piece_info vectors. - // piece_pos::we_have_index means that we have the piece, so it - // doesn't exist in the piece_info buckets - // pieces with the filtered flag set doesn't have entries in - // the m_piece_info buckets either - std::vector m_piece_map; - - // each piece that's currently being downloaded - // has an entry in this list with block allocations. - // i.e. it says wich parts of the piece that - // is being downloaded - std::vector m_downloads; - - int m_blocks_per_piece; - int m_blocks_in_last_piece; - - // the number of filtered pieces that we don't already - // have. total_number_of_pieces - number_of_pieces_we_have - // - num_filtered is supposed to the number of pieces - // we still want to download - int m_num_filtered; - - // the number of pieces we have that also are filtered - int m_num_have_filtered; - - // the required popularity of a piece in order to download - // it in sequence instead of random order. - int m_sequenced_download_threshold; - }; - - inline int piece_picker::blocks_in_piece(int index) const - { - assert(index >= 0); - assert(index < (int)m_piece_map.size()); - if (index+1 == (int)m_piece_map.size()) - return m_blocks_in_last_piece; - else - return m_blocks_per_piece; - } - -} - -#endif // TORRENT_PIECE_PICKER_HPP_INCLUDED - diff --git a/libtorrent/include/policy.hpp b/libtorrent/include/policy.hpp deleted file mode 100755 index 1358e2bdf..000000000 --- a/libtorrent/include/policy.hpp +++ /dev/null @@ -1,245 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_POLICY_HPP_INCLUDED -#define TORRENT_POLICY_HPP_INCLUDED - -#include -#include - -#ifdef _MSC_VER -#pragma warning(push, 1) -#endif - -#include - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -#include "libtorrent/peer.hpp" -#include "libtorrent/piece_picker.hpp" -#include "libtorrent/socket.hpp" -#include "libtorrent/size_type.hpp" -#include "libtorrent/invariant_check.hpp" -#include "libtorrent/config.hpp" - -namespace libtorrent -{ - - class torrent; - class peer_connection; - - enum - { - // the limits of the download queue size - min_request_queue = 2, - - // the amount of free upload allowed before - // the peer is choked - free_upload_amount = 4 * 16 * 1024 - }; - - - class TORRENT_EXPORT policy - { - public: - - policy(torrent* t); - - // this is called every 10 seconds to allow - // for peer choking management - void pulse(); - - // this is called once for every peer we get from - // the tracker - void peer_from_tracker(const tcp::endpoint& remote, const peer_id& pid); - - // called when an incoming connection is accepted - // return false if the connection closed - void new_connection(peer_connection& c); - - // this is called if a peer timed-out or - // forcefully closed the connection. This - // will mark the connection as non-reconnectale - void peer_failed(peer_connection const& c); - - // the given connection was just closed - void connection_closed(const peer_connection& c); - - // is called when a peer is believed to have - // sent invalid data - void ban_peer(const peer_connection& c); - - // the peer has got at least one interesting piece - void peer_is_interesting(peer_connection& c); - - void piece_finished(int index, bool successfully_verified); - - void block_finished(peer_connection& c, piece_block b); - - // the peer choked us - void choked(peer_connection& c); - - // the peer unchoked us - void unchoked(peer_connection& c); - - // the peer is interested in our pieces - void interested(peer_connection& c); - - // the peer is not interested in our pieces - void not_interested(peer_connection& c); - -#ifndef NDEBUG - bool has_connection(const peer_connection* p); - - void check_invariant() const; -#endif - - struct peer - { - enum connection_type { not_connectable,connectable }; - - peer(const tcp::endpoint& ip, connection_type t); - - size_type total_download() const; - size_type total_upload() const; - - // the ip/port pair this peer is or was connected on - // if it was a remote (incoming) connection, type is - // set thereafter. If it was a peer we got from the - // tracker, type is set to local_connection. - tcp::endpoint ip; - connection_type type; - - // the time when this peer was optimistically unchoked - // the last time. - boost::posix_time::ptime last_optimistically_unchoked; - - // the time when the peer connected to us - // or disconnected if it isn't connected right now - boost::posix_time::ptime connected; - - // this is the accumulated amount of - // uploaded and downloaded data to this - // peer. It only accounts for what was - // shared during the last connection to - // this peer. i.e. These are only updated - // when the connection is closed. For the - // total amount of upload and download - // we'll have to add thes figures with the - // statistics from the peer_connection. - size_type prev_amount_upload; - size_type prev_amount_download; - - // is set to true if this peer has been banned - bool banned; - - // if the peer is connected now, this - // will refer to a valid peer_connection - peer_connection* connection; - }; - - int num_peers() const - { - return m_peers.size(); - } - - int num_uploads() const - { - return m_num_unchoked; - } - - typedef std::vector::iterator iterator; - iterator begin_peer() { return m_peers.begin(); } - iterator end_peer() { return m_peers.end(); } - - private: - - bool unchoke_one_peer(); - void choke_one_peer(); - peer* find_choke_candidate(); - peer* find_unchoke_candidate(); - - // the seed prefix means that the - // function is used while seeding. - bool seed_unchoke_one_peer(); - void seed_choke_one_peer(); - peer* find_seed_choke_candidate(); - peer* find_seed_unchoke_candidate(); - - bool connect_peer(peer *); - bool connect_one_peer(); - bool disconnect_one_peer(); - peer* find_disconnect_candidate(); - peer* find_connect_candidate(); - - // a functor that identifies peers that have disconnected and that - // are too old for still being saved. - struct old_disconnected_peer - { - bool operator()(const peer& p) - { - using namespace boost::posix_time; - - ptime not_tried_yet(boost::gregorian::date(1970,boost::gregorian::Jan,1)); - - // this timeout has to be customizable! - return p.connection == 0 - && p.connected != not_tried_yet - && second_clock::universal_time() - p.connected > minutes(30); - } - }; - - - std::vector m_peers; - - torrent* m_torrent; - - // the number of unchoked peers - // at any given time - int m_num_unchoked; - - // free download we have got that hasn't - // been distributed yet. - size_type m_available_free_upload; - - // if there is a connection limit, - // we disconnect one peer every minute in hope of - // establishing a connection with a better peer - boost::posix_time::ptime m_last_optimistic_disconnect; - }; - -} - -#endif // TORRENT_POLICY_HPP_INCLUDED - diff --git a/libtorrent/include/random_sample.hpp b/libtorrent/include/random_sample.hpp deleted file mode 100644 index 741576fd9..000000000 --- a/libtorrent/include/random_sample.hpp +++ /dev/null @@ -1,72 +0,0 @@ -/* - -Copyright (c) 2006, Arvid Norberg & Daniel Wallin -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_RANDOM_SAMPLE_HPP -#define TORRENT_RANDOM_SAMPLE_HPP - -#include -#include - -namespace libtorrent -{ - - template - inline void random_sample_n(InIter start, InIter end - , OutIter out, Distance n) - { - Distance t = 0; - Distance m = 0; - Distance N = std::distance(start, end); - - assert(N >= n); - - while (m < n) - { - if ((rand() / (RAND_MAX + 1.f)) * (N - t) >= n - m) - { - ++start; - ++t; - } - else - { - *out = *start; - ++out; - ++start; - ++t; - ++m; - } - } - } - -} - -#endif diff --git a/libtorrent/include/resource_request.hpp b/libtorrent/include/resource_request.hpp deleted file mode 100755 index 046b49df9..000000000 --- a/libtorrent/include/resource_request.hpp +++ /dev/null @@ -1,91 +0,0 @@ -/* - -Copyright (c) 2003, Magnus Jonsson, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_RESOURCE_REQUEST_HPP_INCLUDED -#define TORRENT_RESOURCE_REQUEST_HPP_INCLUDED - -#include - -#ifdef min -#undef min -#endif - -#ifdef max -#undef max -#endif - -#include "libtorrent/config.hpp" - -namespace libtorrent -{ - struct TORRENT_EXPORT resource_request - { - resource_request() - : used(0) - , min(0) - , max(0) - , given(0) - {} - - resource_request(int used_, int min_, int max_, int given_) - : used(used_) - , min(min_) - , max(max_) - , given(given_) - {} - - int left() const - { - assert(given <= max); - assert(given >= min); - if (used < 0 && (given - used < 0)) - return boost::integer_traits::const_max; - return given - used; - } - - static const int inf = boost::integer_traits::const_max; - - // right now I'm actively using this amount - int used; - - // given cannot be smaller than min - // and not greater than max. - int min; - int max; - - // Reply: Okay, you're allowed to use this amount (a compromise): - int given; - }; -} - - -#endif diff --git a/libtorrent/include/session.hpp b/libtorrent/include/session.hpp deleted file mode 100755 index d62d69493..000000000 --- a/libtorrent/include/session.hpp +++ /dev/null @@ -1,226 +0,0 @@ -/* - -Copyright (c) 2006, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_SESSION_HPP_INCLUDED -#define TORRENT_SESSION_HPP_INCLUDED - -#include -#include -#include -#include -#include -#include - -#ifdef _MSC_VER -#pragma warning(push, 1) -#endif - -#include -#include -#include -#include - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -#include "libtorrent/torrent_handle.hpp" -#include "libtorrent/entry.hpp" -#include "libtorrent/alert.hpp" -#include "libtorrent/session_status.hpp" -#include "libtorrent/version.hpp" -#include "libtorrent/fingerprint.hpp" - - -#if !defined(NDEBUG) && defined(_MSC_VER) -# include -# include -#endif - -namespace libtorrent -{ - class torrent; - class ip_filter; - - enum extension_index - { - extended_handshake, - extended_chat_message, - extended_metadata_message, - extended_peer_exchange_message, - num_supported_extensions - }; - - namespace aux - { - // workaround for microsofts - // hardware exceptions that makes - // it hard to debug stuff -#if defined(_MSC_VER) - struct eh_initializer - { - eh_initializer() - { -#ifndef NDEBUG - _clearfp(); - _controlfp(_EM_INEXACT | _EM_UNDERFLOW, _MCW_EM ); - ::_set_se_translator(straight_to_debugger); -#endif - } - - static void straight_to_debugger(unsigned int, _EXCEPTION_POINTERS*) - { throw; } - }; -#else - struct eh_initializer {}; -#endif - struct session_impl; - } - - class TORRENT_EXPORT session_proxy - { - friend class session; - public: - session_proxy() {} - private: - session_proxy(boost::shared_ptr impl) - : m_impl(impl) {} - boost::shared_ptr m_impl; - }; - - class TORRENT_EXPORT session: public boost::noncopyable, aux::eh_initializer - { - public: - - session(fingerprint const& print = fingerprint("LT" - , LIBTORRENT_VERSION_MAJOR, LIBTORRENT_VERSION_MINOR, 0, 0)); - session( - fingerprint const& print - , std::pair listen_port_range - , char const* listen_interface = "0.0.0.0"); - - ~session(); - - std::vector get_torrents() const; - - // all torrent_handles must be destructed before the session is destructed! - torrent_handle add_torrent( - torrent_info const& ti - , boost::filesystem::path const& save_path - , entry const& resume_data = entry() - , bool compact_mode = true - , int block_size = 16 * 1024); - - // TODO: deprecated, this is for backwards compatibility only - torrent_handle add_torrent( - entry const& e - , boost::filesystem::path const& save_path - , entry const& resume_data = entry() - , bool compact_mode = true - , int block_size = 16 * 1024) - { - return add_torrent(torrent_info(e), save_path, resume_data - , compact_mode, block_size); - } - - torrent_handle add_torrent( - char const* tracker_url - , sha1_hash const& info_hash - , boost::filesystem::path const& save_path - , entry const& resume_data = entry() - , bool compact_mode = true - , int block_size = 16 * 1024); - - session_proxy abort() { return session_proxy(m_impl); } - - session_status status() const; - -#ifndef TORRENT_DISABLE_DHT - void start_dht(entry const& startup_state = entry()); - void stop_dht(); - void set_dht_settings(dht_settings const& settings); - entry dht_state() const; - void add_dht_node(std::pair const& node); - void add_dht_router(std::pair const& node); -#endif - - void enable_extension(extension_index i); - void disable_extensions(); - - void set_ip_filter(ip_filter const& f); - void set_peer_id(peer_id const& pid); - void set_key(int key); - - bool is_listening() const; - - // if the listen port failed in some way - // you can retry to listen on another port- - // range with this function. If the listener - // succeeded and is currently listening, - // a call to this function will shut down the - // listen port and reopen it using these new - // properties (the given interface and port range). - // As usual, if the interface is left as 0 - // this function will return false on failure. - // If it fails, it will also generate alerts describing - // the error. It will return true on success. - bool listen_on( - std::pair const& port_range - , const char* net_interface = 0); - - // returns the port we ended up listening on - unsigned short listen_port() const; - - void remove_torrent(const torrent_handle& h); - - void set_settings(session_settings const& s); - session_settings const& settings(); - void set_upload_rate_limit(int bytes_per_second); - void set_download_rate_limit(int bytes_per_second); - void set_max_uploads(int limit); - void set_max_connections(int limit); - void set_max_half_open_connections(int limit); - - std::auto_ptr pop_alert(); - void set_severity_level(alert::severity_t s); - - private: - - // data shared between the main thread - // and the working thread - boost::shared_ptr m_impl; - }; - -} - -#endif // TORRENT_SESSION_HPP_INCLUDED - diff --git a/libtorrent/include/session_settings.hpp b/libtorrent/include/session_settings.hpp deleted file mode 100644 index 80d328611..000000000 --- a/libtorrent/include/session_settings.hpp +++ /dev/null @@ -1,164 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_SESSION_SETTINGS_HPP_INCLUDED -#define TORRENT_SESSION_SETTINGS_HPP_INCLUDED - -#include "libtorrent/version.hpp" - -namespace libtorrent -{ - - struct TORRENT_EXPORT session_settings - { - session_settings(std::string const& user_agent_ = "libtorrent/" - LIBTORRENT_VERSION) - : proxy_port(0) - , user_agent(user_agent_) - , tracker_completion_timeout(60) - , tracker_receive_timeout(20) - , stop_tracker_timeout(10) - , tracker_maximum_response_length(1024*1024) - , piece_timeout(120) - , request_queue_time(3.f) - , max_allowed_in_request_queue(250) - , max_out_request_queue(200) - , whole_pieces_threshold(20) - , peer_timeout(120) - , urlseed_timeout(20) - , urlseed_pipeline_size(5) - {} - - std::string proxy_ip; - int proxy_port; - std::string proxy_login; - std::string proxy_password; - - // this is the user agent that will be sent to the tracker - // when doing requests. It is used to identify the client. - // It cannot contain \r or \n - std::string user_agent; - - // the number of seconds to wait until giving up on a - // tracker request if it hasn't finished - int tracker_completion_timeout; - - // the number of seconds where no data is received - // from the tracker until it should be considered - // as timed out - int tracker_receive_timeout; - - // the time to wait when sending a stopped message - // before considering a tracker to have timed out. - // this is usually shorter, to make the client quit - // faster - int stop_tracker_timeout; - - // if the content-length is greater than this value - // the tracker connection will be aborted - int tracker_maximum_response_length; - - // the number of seconds from a request is sent until - // it times out if no piece response is returned. - int piece_timeout; - - // the length of the request queue given in the number - // of seconds it should take for the other end to send - // all the pieces. i.e. the actual number of requests - // depends on the download rate and this number. - float request_queue_time; - - // the number of outstanding block requests a peer is - // allowed to queue up in the client. If a peer sends - // more requests than this (before the first one has - // been sent) the last request will be dropped. - // the higher this is, the faster upload speeds the - // client can get to a single peer. - int max_allowed_in_request_queue; - - // the maximum number of outstanding requests to - // send to a peer. This limit takes precedence over - // request_queue_time. - int max_out_request_queue; - - // if a whole piece can be downloaded in this number - // of seconds, or less, the peer_connection will prefer - // to request whole pieces at a time from this peer. - // The benefit of this is to better utilize disk caches by - // doing localized accesses and also to make it easier - // to identify bad peers if a piece fails the hash check. - int whole_pieces_threshold; - - // the number of seconds to wait for any activity on - // the peer wire before closing the connectiong due - // to time out. - int peer_timeout; - - // same as peer_timeout, but only applies to url-seeds. - // this is usually set lower, because web servers are - // expected to be more reliable. - int urlseed_timeout; - - // controls the pipelining size of url-seeds - int urlseed_pipeline_size; - }; - -#ifndef TORRENT_DISABLE_DHT - struct dht_settings - { - dht_settings() - : max_peers_reply(50) - , search_branching(5) - , service_port(6881) - , max_fail_count(20) - {} - - // the maximum number of peers to send in a - // reply to get_peers - int max_peers_reply; - - // the number of simultanous "connections" when - // searching the DHT. - int search_branching; - - // the listen port for the dht. This is a UDP port. - int service_port; - - // the maximum number of times a node can fail - // in a row before it is removed from the table. - int max_fail_count; - }; -#endif - -} - -#endif diff --git a/libtorrent/include/session_status.hpp b/libtorrent/include/session_status.hpp deleted file mode 100644 index 7d12674fd..000000000 --- a/libtorrent/include/session_status.hpp +++ /dev/null @@ -1,68 +0,0 @@ -/* - -Copyright (c) 2006, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_SESSION_STATUS_HPP_INCLUDED -#define TORRENT_SESSION_STATUS_HPP_INCLUDED - - -namespace libtorrent -{ - - struct TORRENT_EXPORT session_status - { - bool has_incoming_connections; - - float upload_rate; - float download_rate; - - float payload_upload_rate; - float payload_download_rate; - - size_type total_download; - size_type total_upload; - - size_type total_payload_download; - size_type total_payload_upload; - - int num_peers; - -#ifndef TORRENT_DISABLE_DHT - int m_dht_nodes; - int m_dht_node_cache; - int m_dht_torrents; -#endif - }; - -} - -#endif // TORRENT_SESSION_STATUS_HPP_INCLUDED - diff --git a/libtorrent/include/size_type.hpp b/libtorrent/include/size_type.hpp deleted file mode 100755 index 6020a5ac3..000000000 --- a/libtorrent/include/size_type.hpp +++ /dev/null @@ -1,52 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_SIZE_TYPE_HPP_INCLUDED -#define TORRENT_SIZE_TYPE_HPP_INCLUDED - -#ifdef _MSC_VER -#pragma warning(push, 1) -#endif - -#include - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -namespace libtorrent -{ - typedef boost::int64_t size_type; -} - - -#endif diff --git a/libtorrent/include/socket.hpp b/libtorrent/include/socket.hpp deleted file mode 100755 index 394c2a133..000000000 --- a/libtorrent/include/socket.hpp +++ /dev/null @@ -1,156 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_SOCKET_HPP_INCLUDED -#define TORRENT_SOCKET_HPP_INCLUDED - -#ifdef _MSC_VER -#pragma warning(push, 1) -#endif - -// if building as Objective C++, asio's template -// parameters Protocol has to be renamed to avoid -// colliding with keywords - -#ifdef __OBJC__ -#define Protocol Protocol_ -#endif - -#include -#include -#include -#include -#include - -#ifdef __OBJC__ -#undef Protocol -#endif - -#include "libtorrent/io.hpp" - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -namespace libtorrent -{ -/* - namespace asio = boost::asio; - - using boost::asio::ipv4::tcp; - using boost::asio::ipv4::address; - using boost::asio::stream_socket; - using boost::asio::datagram_socket; - using boost::asio::socket_acceptor; - using boost::asio::demuxer; - using boost::asio::ipv4::host_resolver; - using boost::asio::async_write; - using boost::asio::ipv4::host; - using boost::asio::deadline_timer; -*/ -// namespace asio = ::asio; - - using asio::ip::tcp; - using asio::ip::udp; - typedef asio::ip::tcp::socket stream_socket; - typedef asio::ip::address address; - typedef asio::ip::address_v4 address_v4; - typedef asio::ip::address_v6 address_v6; - typedef asio::ip::udp::socket datagram_socket; - typedef asio::ip::tcp::acceptor socket_acceptor; - typedef asio::io_service demuxer; - - using asio::async_write; - using asio::deadline_timer; - - namespace detail - { - template - void write_address(address const& a, OutIt& out) - { - if (a.is_v4()) - { - write_uint32(a.to_v4().to_ulong(), out); - } - else if (a.is_v6()) - { - asio::ip::address_v6::bytes_type bytes - = a.to_v6().to_bytes(); - std::copy(bytes.begin(), bytes.end(), out); - } - } - - template - address read_v4_address(InIt& in) - { - unsigned long ip = read_uint32(in); - return asio::ip::address_v4(ip); - } - - template - address read_v6_address(InIt& in) - { - typedef asio::ip::address_v6::bytes_type bytes_t; - bytes_t bytes; - for (bytes_t::iterator i = bytes.begin() - , end(bytes.end()); i != end; ++i) - *i = read_uint8(in); - return asio::ip::address_v6(bytes); - } - - template - void write_endpoint(Endpoint const& e, OutIt& out) - { - write_address(e.address(), out); - write_uint16(e.port(), out); - } - - template - Endpoint read_v4_endpoint(InIt& in) - { - address addr = read_v4_address(in); - int port = read_uint16(in); - return Endpoint(addr, port); - } - - template - Endpoint read_v6_endpoint(InIt& in) - { - address addr = read_v6_address(in); - int port = read_uint16(in); - return Endpoint(addr, port); - } - } -} - -#endif // TORRENT_SOCKET_HPP_INCLUDED - diff --git a/libtorrent/include/stat.hpp b/libtorrent/include/stat.hpp deleted file mode 100755 index 8e92c12a1..000000000 --- a/libtorrent/include/stat.hpp +++ /dev/null @@ -1,193 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_STAT_HPP_INCLUDED -#define TORRENT_STAT_HPP_INCLUDED - -#include -#include -#include - -#include "libtorrent/size_type.hpp" -#include "libtorrent/invariant_check.hpp" -#include "libtorrent/config.hpp" - -namespace libtorrent -{ - - class TORRENT_EXPORT stat - { - friend class invariant_access; - enum { history = 10 }; - public: - - stat() - : m_downloaded_payload(0) - , m_uploaded_payload(0) - , m_downloaded_protocol(0) - , m_uploaded_protocol(0) - , m_total_download_payload(0) - , m_total_upload_payload(0) - , m_total_download_protocol(0) - , m_total_upload_protocol(0) - , m_mean_download_rate(0) - , m_mean_upload_rate(0) - , m_mean_download_payload_rate(0) - , m_mean_upload_payload_rate(0) - { - std::fill(m_download_rate_history, m_download_rate_history+history, 0.f); - std::fill(m_upload_rate_history, m_upload_rate_history+history, 0.f); - std::fill(m_download_payload_rate_history, m_download_payload_rate_history+history, 0.f); - std::fill(m_upload_payload_rate_history, m_upload_payload_rate_history+history, 0.f); - } - - void operator+=(const stat& s) - { - INVARIANT_CHECK; - - m_downloaded_payload += s.m_downloaded_payload; - m_total_download_payload += s.m_downloaded_payload; - m_downloaded_protocol += s.m_downloaded_protocol; - m_total_download_protocol += s.m_downloaded_protocol; - - m_uploaded_payload += s.m_uploaded_payload; - m_total_upload_payload += s.m_uploaded_payload; - m_uploaded_protocol += s.m_uploaded_protocol; - m_total_upload_protocol += s.m_uploaded_protocol; - } - - void received_bytes(int bytes_payload, int bytes_protocol) - { - INVARIANT_CHECK; - - assert(bytes_payload >= 0); - assert(bytes_protocol >= 0); - - m_downloaded_payload += bytes_payload; - m_total_download_payload += bytes_payload; - m_downloaded_protocol += bytes_protocol; - m_total_download_protocol += bytes_protocol; - } - - void sent_bytes(int bytes_payload, int bytes_protocol) - { - INVARIANT_CHECK; - - assert(bytes_payload >= 0); - assert(bytes_protocol >= 0); - - m_uploaded_payload += bytes_payload; - m_total_upload_payload += bytes_payload; - m_uploaded_protocol += bytes_protocol; - m_total_upload_protocol += bytes_protocol; - } - - // should be called once every second - void second_tick(float tick_interval); - - float upload_rate() const { return m_mean_upload_rate; } - float download_rate() const { return m_mean_download_rate; } - - float upload_payload_rate() const { return m_mean_upload_payload_rate; } - float download_payload_rate() const { return m_mean_download_payload_rate; } - - size_type total_payload_upload() const { return m_total_upload_payload; } - size_type total_payload_download() const { return m_total_download_payload; } - - size_type total_protocol_upload() const { return m_total_upload_protocol; } - size_type total_protocol_download() const { return m_total_download_protocol; } - - // this is used to offset the statistics when a - // peer_connection is opened and have some previous - // transfers from earlier connections. - void add_stat(size_type downloaded, size_type uploaded) - { - m_total_download_payload += downloaded; - m_total_upload_payload += uploaded; - } - - private: - -#ifndef NDEBUG - void check_invariant() const - { - assert(m_mean_upload_rate >= 0); - assert(m_mean_download_rate >= 0); - assert(m_mean_upload_payload_rate >= 0); - assert(m_mean_download_payload_rate >= 0); - assert(m_total_upload_payload >= 0); - assert(m_total_download_payload >= 0); - assert(m_total_upload_protocol >= 0); - assert(m_total_download_protocol >= 0); - } -#endif - - // history of download/upload speeds a few seconds back - float m_download_rate_history[history]; - float m_upload_rate_history[history]; - - float m_download_payload_rate_history[history]; - float m_upload_payload_rate_history[history]; - - // the accumulators we are adding the downloads/uploads - // to this second. This only counts the actual payload - // and ignores the bytes sent as protocol chatter. - int m_downloaded_payload; - int m_uploaded_payload; - - // the accumulators we are adding the downloads/uploads - // to this second. This only counts the protocol - // chatter and ignores the actual payload - int m_downloaded_protocol; - int m_uploaded_protocol; - - // total download/upload counters - // only counting payload data - size_type m_total_download_payload; - size_type m_total_upload_payload; - - // total download/upload counters - // only counting protocol chatter - size_type m_total_download_protocol; - size_type m_total_upload_protocol; - - // current mean download/upload rates - float m_mean_download_rate; - float m_mean_upload_rate; - - float m_mean_download_payload_rate; - float m_mean_upload_payload_rate; - }; - -} - -#endif // TORRENT_STAT_HPP_INCLUDED diff --git a/libtorrent/include/storage.hpp b/libtorrent/include/storage.hpp deleted file mode 100755 index 44f956786..000000000 --- a/libtorrent/include/storage.hpp +++ /dev/null @@ -1,178 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_STORAGE_HPP_INCLUDE -#define TORRENT_STORAGE_HPP_INCLUDE - -#include -#include - -#ifdef _MSC_VER -#pragma warning(push, 1) -#endif - -#include -#include -#include -#include - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - - -#include "libtorrent/torrent_info.hpp" -#include "libtorrent/config.hpp" - -namespace libtorrent -{ - namespace aux - { - struct piece_checker_data; - } - - class session; - -#if defined(_WIN32) && defined(UNICODE) - - TORRENT_EXPORT std::wstring safe_convert(std::string const& s); - -#endif - - TORRENT_EXPORT std::vector > get_filesizes( - torrent_info const& t - , boost::filesystem::path p); - - TORRENT_EXPORT bool match_filesizes( - torrent_info const& t - , boost::filesystem::path p - , std::vector > const& sizes - , std::string* error = 0); - - struct TORRENT_EXPORT file_allocation_failed: std::exception - { - file_allocation_failed(const char* error_msg): m_msg(error_msg) {} - virtual const char* what() const throw() { return m_msg.c_str(); } - virtual ~file_allocation_failed() throw() {} - std::string m_msg; - }; - - class TORRENT_EXPORT storage - { - public: - storage( - const torrent_info& info - , const boost::filesystem::path& path); - - void swap(storage&); - - // may throw file_error if storage for slot does not exist - size_type read(char* buf, int slot, int offset, int size); - - // may throw file_error if storage for slot hasn't been allocated - void write(const char* buf, int slot, int offset, int size); - - bool move_storage(boost::filesystem::path save_path); - - // this will close all open files that are opened for - // writing. This is called when a torrent has finished - // downloading. - void release_files(); - -#ifndef NDEBUG - // overwrites some slots with the - // contents of others - void shuffle(); -#endif - - private: - class impl; - boost::shared_ptr m_pimpl; - }; - - class TORRENT_EXPORT piece_manager : boost::noncopyable - { - public: - - piece_manager( - const torrent_info& info - , const boost::filesystem::path& path); - - ~piece_manager(); - - bool check_fastresume(aux::piece_checker_data& d - , std::vector& pieces, int& num_pieces, bool compact_mode); - std::pair check_files(std::vector& pieces - , int& num_pieces); - - void release_files(); - - bool is_allocating() const; - void allocate_slots(int num_slots); - void mark_failed(int index); - - unsigned long piece_crc( - int slot_index - , int block_size - , const std::bitset<256>& bitmask); - int slot_for_piece(int piece_index) const; - - size_type read( - char* buf - , int piece_index - , int offset - , int size); - - void write( - const char* buf - , int piece_index - , int offset - , int size); - - boost::filesystem::path const& save_path() const; - bool move_storage(boost::filesystem::path const&); - - // fills the vector that maps all allocated - // slots to the piece that is stored (or - // partially stored) there. -2 is the index - // of unassigned pieces and -1 is unallocated - void export_piece_map(std::vector& pieces) const; - - private: - class impl; - std::auto_ptr m_pimpl; - }; - -} - -#endif // TORRENT_STORAGE_HPP_INCLUDED - diff --git a/libtorrent/include/torrent.hpp b/libtorrent/include/torrent.hpp deleted file mode 100755 index 17bdc50d7..000000000 --- a/libtorrent/include/torrent.hpp +++ /dev/null @@ -1,654 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_TORRENT_HPP_INCLUDE -#define TORRENT_TORRENT_HPP_INCLUDE - -#include -#include -#include -#include -#include - -#ifdef _MSC_VER -#pragma warning(push, 1) -#endif - -#include -#include -#include -#include -#include -#include - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -#include "libtorrent/torrent_handle.hpp" -#include "libtorrent/entry.hpp" -#include "libtorrent/torrent_info.hpp" -#include "libtorrent/socket.hpp" -#include "libtorrent/policy.hpp" -#include "libtorrent/tracker_manager.hpp" -#include "libtorrent/stat.hpp" -#include "libtorrent/alert.hpp" -#include "libtorrent/resource_request.hpp" -#include "libtorrent/piece_picker.hpp" -#include "libtorrent/config.hpp" -#include "libtorrent/escape_string.hpp" - -namespace libtorrent -{ -#if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) - struct logger; -#endif - - class piece_manager; - - namespace aux - { - struct session_impl; - struct piece_checker_data; - } - - int div_round_up(int numerator, int denominator); - std::pair req_to_offset(std::pair req, int total_size); - std::pair offset_to_req(std::pair offset, int total_size); - - // a torrent is a class that holds information - // for a specific download. It updates itself against - // the tracker - class TORRENT_EXPORT torrent: public request_callback - , public boost::enable_shared_from_this - { - public: - - torrent( - aux::session_impl& ses - , aux::checker_impl& checker - , torrent_info const& tf - , boost::filesystem::path const& save_path - , tcp::endpoint const& net_interface - , bool compact_mode - , int block_size - , session_settings const& s); - - // used with metadata-less torrents - // (the metadata is downloaded from the peers) - torrent( - aux::session_impl& ses - , aux::checker_impl& checker - , char const* tracker_url - , sha1_hash const& info_hash - , boost::filesystem::path const& save_path - , tcp::endpoint const& net_interface - , bool compact_mode - , int block_size - , session_settings const& s); - - ~torrent(); - - // this is called when the torrent has metadata. - // it will initialize the storage and the piece-picker - void init(); - - // this will flag the torrent as aborted. The main - // loop in session_impl will check for this state - // on all torrents once every second, and take - // the necessary actions then. - void abort(); - bool is_aborted() const { return m_abort; } - - // returns true if this torrent is being allocated - // by the checker thread. - bool is_allocating() const; - - session_settings const& settings() const; - - void set_sequenced_download_threshold(int threshold); - - // is called every second by session. This will - // caclulate the upload/download and number - // of connections this torrent needs. And prepare - // it for being used by allocate_resources. - void second_tick(stat& accumulator, float tick_interval); - - // debug purpose only - void print(std::ostream& os) const; - - // this is called from the peer_connection for - // each piece of metadata it receives - void metadata_progress(int total_size, int received); - - bool check_fastresume(aux::piece_checker_data&); - std::pair check_files(); - void files_checked(std::vector const& - unfinished_pieces); - - stat statistics() const { return m_stat; } - size_type bytes_left() const; - boost::tuples::tuple bytes_done() const; - size_type quantized_bytes_done() const; - - void pause(); - void resume(); - bool is_paused() const { return m_paused; } - - void filter_piece(int index, bool filter); - void filter_pieces(std::vector const& bitmask); - bool is_piece_filtered(int index) const; - void filtered_pieces(std::vector& bitmask) const; - - void filter_files(std::vector const& files); - - torrent_status status() const; - void file_progress(std::vector& fp) const; - - void use_interface(const char* net_interface); - tcp::endpoint const& get_interface() const { return m_net_interface; } - - void connect_to_url_seed(std::string const& url); - peer_connection& connect_to_peer(tcp::endpoint const& a); - - void set_ratio(float ratio) - { assert(ratio >= 0.0f); m_ratio = ratio; } - - float ratio() const - { return m_ratio; } - -// -------------------------------------------- - // PEER MANAGEMENT - - // add or remove a url that will be attempted for - // finding the file(s) in this torrent. - void add_url_seed(std::string const& url) - { m_web_seeds.insert(url); } - - void remove_url_seed(std::string const& url) - { m_web_seeds.erase(url); } - - // used by peer_connection to attach itself to a torrent - // since incoming connections don't know what torrent - // they're a part of until they have received an info_hash. - void attach_peer(peer_connection* p); - - // this will remove the peer and make sure all - // the pieces it had have their reference counter - // decreased in the piece_picker - void remove_peer(peer_connection* p); - - peer_connection* connection_for(tcp::endpoint const& a) - { - peer_iterator i = m_connections.find(a); - if (i == m_connections.end()) return 0; - return i->second; - } - - // the number of peers that belong to this torrent - int num_peers() const { return (int)m_connections.size(); } - int num_seeds() const; - - typedef std::map::iterator peer_iterator; - typedef std::map::const_iterator const_peer_iterator; - - const_peer_iterator begin() const { return m_connections.begin(); } - const_peer_iterator end() const { return m_connections.end(); } - - peer_iterator begin() { return m_connections.begin(); } - peer_iterator end() { return m_connections.end(); } - - -// -------------------------------------------- - // TRACKER MANAGEMENT - - // these are callbacks called by the tracker_connection instance - // (either http_tracker_connection or udp_tracker_connection) - // when this torrent got a response from its tracker request - // or when a failure occured - virtual void tracker_response( - tracker_request const& r - , std::vector& e, int interval - , int complete, int incomplete); - virtual void tracker_request_timed_out( - tracker_request const& r); - virtual void tracker_request_error(tracker_request const& r - , int response_code, const std::string& str); - virtual void tracker_warning(std::string const& msg); - - // generates a request string for sending - // to the tracker - tracker_request generate_tracker_request(); - - // if no password and username is set - // this will return an empty string, otherwise - // it will concatenate the login and password - // ready to be sent over http (but without - // base64 encoding). - std::string tracker_login() const; - - // returns the absolute time when the next tracker - // announce will take place. - boost::posix_time::ptime next_announce() const; - - // returns true if it is time for this torrent to make another - // tracker request - bool should_request(); - - // forcefully sets next_announce to the current time - void force_tracker_request(); - void force_tracker_request(boost::posix_time::ptime); - - // sets the username and password that will be sent to - // the tracker - void set_tracker_login(std::string const& name, std::string const& pw); - - // the tcp::endpoint of the tracker that we managed to - // announce ourself at the last time we tried to announce - const tcp::endpoint& current_tracker() const; - -// -------------------------------------------- - // PIECE MANAGEMENT - - // returns true if we have downloaded the given piece - bool have_piece(int index) const - { - assert(index >= 0 && index < (signed)m_have_pieces.size()); - return m_have_pieces[index]; - } - - const std::vector& pieces() const - { return m_have_pieces; } - - int num_pieces() const { return m_num_pieces; } - - // when we get a have- or bitfield- messages, this is called for every - // piece a peer has gained. - void peer_has(int index) - { - assert(m_picker.get()); - assert(index >= 0 && index < (signed)m_have_pieces.size()); - m_picker->inc_refcount(index); - } - - // when peer disconnects, this is called for every piece it had - void peer_lost(int index) - { - assert(m_picker.get()); - assert(index >= 0 && index < (signed)m_have_pieces.size()); - m_picker->dec_refcount(index); - } - - int block_size() const { assert(m_block_size > 0); return m_block_size; } - - // this will tell all peers that we just got his piece - // and also let the piece picker know that we have this piece - // so it wont pick it for download - void announce_piece(int index); - - void disconnect_all(); - - // this is called wheh the torrent has completed - // the download. It will post an event, disconnect - // all seeds and let the tracker know we're finished. - void completed(); - - // this is the asio callback that is called when a name - // lookup for a web seed is completed. - void on_name_lookup(asio::error const& e, tcp::resolver::iterator i - , std::string url); - - // this is called when the torrent has finished. i.e. - // all the pieces we have not filtered have been downloaded. - // If no pieces are filtered, this is called first and then - // completed() is called immediately after it. - void finished(); - - bool verify_piece(int piece_index); - - // this is called from the peer_connection - // each time a piece has failed the hash - // test - void piece_failed(int index); - void received_redundant_data(int num_bytes) - { assert(num_bytes > 0); m_total_redundant_bytes += num_bytes; } - - float priority() const - { return m_priority; } - - void set_priority(float p) - { - assert(p >= 0.f && p <= 1.f); - m_priority = p; - } - - bool is_seed() const - { - return valid_metadata() - && m_num_pieces == m_torrent_file.num_pieces(); - } - - boost::filesystem::path save_path() const; - alert_manager& alerts() const; - piece_picker& picker() - { - assert(m_picker.get()); - return *m_picker; - } - policy& get_policy() - { - assert(m_policy); - return *m_policy; - } - piece_manager& filesystem(); - torrent_info const& torrent_file() const - { return m_torrent_file; } - - std::vector const& trackers() const - { return m_trackers; } - - void replace_trackers(std::vector const& urls); - - torrent_handle get_handle() const; - - // LOGGING -#if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) - logger* spawn_logger(const char* title); - - virtual void debug_log(const std::string& line); -#endif - - // DEBUG -#ifndef NDEBUG - void check_invariant() const; -#endif - -// -------------------------------------------- - // RESOURCE MANAGEMENT - - // this will distribute the given upload/download - // quotas and number of connections, among the peers - void distribute_resources(); - - resource_request m_ul_bandwidth_quota; - resource_request m_dl_bandwidth_quota; - resource_request m_uploads_quota; - resource_request m_connections_quota; - - void set_peer_upload_limit(tcp::endpoint ip, int limit); - void set_peer_download_limit(tcp::endpoint ip, int limit); - - void set_upload_limit(int limit); - void set_download_limit(int limit); - void set_max_uploads(int limit); - void set_max_connections(int limit); - bool move_storage(boost::filesystem::path const& save_path); - - // unless this returns true, new connections must wait - // with their initialization. - bool ready_for_connections() const - { return m_connections_initialized; } - bool valid_metadata() const - { return m_storage.get() != 0; } - std::vector const& metadata() const; - - bool received_metadata( - char const* buf - , int size - , int offset - , int total_size); - - // returns a range of the metadata that - // we should request. - std::pair metadata_request(); - void cancel_metadata_request(std::pair req); - - private: - - void try_next_tracker(); - int prioritize_tracker(int tracker_index); - - torrent_info m_torrent_file; - - // is set to true when the torrent has - // been aborted. - bool m_abort; - - // is true if this torrent has been paused - bool m_paused; - // this is true from the time when the torrent was - // paused to the time should_request() is called - bool m_just_paused; - - tracker_request::event_t m_event; - - void parse_response(const entry& e, std::vector& peer_list); - - // the size of a request block - // each piece is divided into these - // blocks when requested - int m_block_size; - - // if this pointer is 0, the torrent is in - // a state where the metadata hasn't been - // received yet. - boost::scoped_ptr m_storage; - - // the time of next tracker request - boost::posix_time::ptime m_next_request; - - // ----------------------------- - // DATA FROM TRACKER RESPONSE - - // the number number of seconds between requests - // from the tracker - int m_duration; - - // the scrape data from the tracker response, this - // is optional and may be -1. - int m_complete; - int m_incomplete; - -#ifndef NDEBUG - public: -#endif - std::map m_connections; -#ifndef NDEBUG - private: -#endif - - // The list of web seeds in this torrent. Seeds - // with fatal errors are removed from the set - std::set m_web_seeds; - - // urls of the web seeds that we are currently - // resolving the address for - std::set m_resolving_web_seeds; - - // used to resolve the names of web seeds - tcp::resolver m_host_resolver; - -#ifndef TORRENT_DISABLE_DHT - static void on_dht_announce_response_disp(boost::weak_ptr t - , std::vector const& peers); - deadline_timer m_dht_announce_timer; - void on_dht_announce(asio::error const& e); - void on_dht_announce_response(std::vector const& peers); -#endif - - // this is the upload and download statistics for the whole torrent. - // it's updated from all its peers once every second. - libtorrent::stat m_stat; - - // ----------------------------- - - boost::shared_ptr m_policy; - - // a back reference to the session - // this torrent belongs to. - aux::session_impl& m_ses; - aux::checker_impl& m_checker; - - boost::scoped_ptr m_picker; - - std::vector m_trackers; - // this is an index into m_torrent_file.trackers() - int m_last_working_tracker; - int m_currently_trying_tracker; - // the number of connection attempts that has - // failed in a row, this is currently used to - // determine the timeout until next try. - int m_failed_trackers; - - // this is a counter that is increased every - // second, and when it reaches 10, the policy::pulse() - // is called and the time scaler is reset to 0. - int m_time_scaler; - - // this is the priority of this torrent. It is used - // to weight the assigned upload bandwidth between peers - // it should be within the range [0, 1] - float m_priority; - - // the bitmask that says which pieces we have - std::vector m_have_pieces; - - // the number of pieces we have. The same as - // std::accumulate(m_have_pieces.begin(), - // m_have_pieces.end(), 0) - int m_num_pieces; - - // is false by default and set to - // true when the first tracker reponse - // is received - bool m_got_tracker_response; - - // the upload/download ratio that each peer - // tries to maintain. - // 0 is infinite - float m_ratio; - - // the number of bytes that has been - // downloaded that failed the hash-test - size_type m_total_failed_bytes; - size_type m_total_redundant_bytes; - - std::string m_username; - std::string m_password; - - // the network interface all outgoing connections - // are opened through - tcp::endpoint m_net_interface; - - // the max number of bytes this torrent - // can upload per second - int m_upload_bandwidth_limit; - int m_download_bandwidth_limit; - - // this buffer is filled with the info-section of - // the metadata file while downloading it from - // peers, and while sending it. - // it is mutable because it's generated lazily - mutable std::vector m_metadata; - - // this is a bitfield of size 256, each bit represents - // a piece of the metadata. It is set to one if we - // have that piece. This vector may be empty - // (size 0) if we haven't received any metadata - // or if we already have all metadata - std::vector m_have_metadata; - // this vector keeps track of how many times each meatdata - // block has been requested - std::vector m_requested_metadata; - - boost::filesystem::path m_save_path; - - // determines the storage state for this torrent. - const bool m_compact_mode; - - int m_metadata_progress; - int m_metadata_size; - - // defaults to 16 kiB, but can be set by the user - // when creating the torrent - const int m_default_block_size; - - // this is set to false as long as the connections - // of this torrent hasn't been initialized. If we - // have metadata from the start, connections are - // initialized immediately, if we didn't have metadata, - // they are initialized right after files_checked(). - // valid_resume_data() will return false as long as - // the connections aren't initialized, to avoid - // them from altering the piece-picker before it - // has been initialized with files_checked(). - bool m_connections_initialized; - - session_settings const& m_settings; - -#ifndef NDEBUG - // this is the amount downloaded when this torrent - // is started. i.e. - // total_done - m_initial_done <= total_payload_download - size_type m_initial_done; -#endif - }; - - inline boost::posix_time::ptime torrent::next_announce() const - { - return m_next_request; - } - - inline void torrent::force_tracker_request() - { - using boost::posix_time::second_clock; - m_next_request = second_clock::universal_time(); - } - - inline void torrent::force_tracker_request(boost::posix_time::ptime t) - { - namespace time = boost::posix_time; - m_next_request = t; - } - - inline void torrent::set_tracker_login( - std::string const& name - , std::string const& pw) - { - m_username = name; - m_password = pw; - } - -} - -#endif // TORRENT_TORRENT_HPP_INCLUDED - diff --git a/libtorrent/include/torrent_handle.hpp b/libtorrent/include/torrent_handle.hpp deleted file mode 100755 index 80d57fec7..000000000 --- a/libtorrent/include/torrent_handle.hpp +++ /dev/null @@ -1,350 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_TORRENT_HANDLE_HPP_INCLUDED -#define TORRENT_TORRENT_HANDLE_HPP_INCLUDED - -#include - -#ifdef _MSC_VER -#pragma warning(push, 1) -#endif - -#include - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -#include "libtorrent/peer_id.hpp" -#include "libtorrent/peer_info.hpp" -#include "libtorrent/piece_picker.hpp" -#include "libtorrent/torrent_info.hpp" -#include "libtorrent/config.hpp" - -namespace libtorrent -{ - namespace aux - { - struct session_impl; - struct checker_impl; - } - - struct TORRENT_EXPORT duplicate_torrent: std::exception - { - virtual const char* what() const throw() - { return "torrent already exists in session"; } - }; - - struct TORRENT_EXPORT invalid_handle: std::exception - { - virtual const char* what() const throw() - { return "invalid torrent handle used"; } - }; - - struct TORRENT_EXPORT torrent_status - { - torrent_status() - : state(queued_for_checking) - , paused(false) - , progress(0.f) - , total_download(0) - , total_upload(0) - , total_payload_download(0) - , total_payload_upload(0) - , total_failed_bytes(0) - , total_redundant_bytes(0) - , download_rate(0) - , upload_rate(0) - , download_payload_rate(0) - , upload_payload_rate(0) - , num_peers(0) - , num_complete(-1) - , num_incomplete(-1) - , pieces(0) - , num_pieces(0) - , total_done(0) - , total_wanted_done(0) - , total_wanted(0) - , num_seeds(0) - , distributed_copies(0.f) - , block_size(0) - {} - - enum state_t - { - queued_for_checking, - checking_files, - connecting_to_tracker, - downloading_metadata, - downloading, - finished, - seeding, - allocating - }; - - state_t state; - bool paused; - float progress; - boost::posix_time::time_duration next_announce; - boost::posix_time::time_duration announce_interval; - - std::string current_tracker; - - // transferred this session! - // total, payload plus protocol - size_type total_download; - size_type total_upload; - - // payload only - size_type total_payload_download; - size_type total_payload_upload; - - // the amount of payload bytes that - // has failed their hash test - size_type total_failed_bytes; - - // the number of payload bytes that - // has been received redundantly. - size_type total_redundant_bytes; - - // current transfer rate - // payload plus protocol - float download_rate; - float upload_rate; - - // the rate of payload that is - // sent and received - float download_payload_rate; - float upload_payload_rate; - - // the number of peers this torrent - // is connected to. - int num_peers; - - // if the tracker sends scrape info in its - // announce reply, these fields will be - // set to the total number of peers that - // have the whole file and the total number - // of peers that are still downloading - int num_complete; - int num_incomplete; - - const std::vector* pieces; - - // this is the number of pieces the client has - // downloaded. it is equal to: - // std::accumulate(pieces->begin(), pieces->end()); - int num_pieces; - - // the number of bytes of the file we have - // including pieces that may have been filtered - // after we downloaded them - size_type total_done; - - // the number of bytes we have of those that we - // want. i.e. not counting bytes from pieces that - // are filtered as not wanted. - size_type total_wanted_done; - - // the total number of bytes we want to download - // this may be smaller than the total torrent size - // in case any pieces are filtered as not wanted - size_type total_wanted; - - // the number of peers this torrent is connected to - // that are seeding. - int num_seeds; - - // the number of distributed copies of the file. - // note that one copy may be spread out among many peers. - // - // the whole number part tells how many copies - // there are of the rarest piece(s) - // - // the fractional part tells the fraction of pieces that - // have more copies than the rarest piece(s). - float distributed_copies; - - // the block size that is used in this torrent. i.e. - // the number of bytes each piece request asks for - // and each bit in the download queue bitfield represents - int block_size; - }; - - struct TORRENT_EXPORT partial_piece_info - { - enum { max_blocks_per_piece = piece_picker::max_blocks_per_piece }; - int piece_index; - int blocks_in_piece; - std::bitset requested_blocks; - std::bitset finished_blocks; - tcp::endpoint peer[max_blocks_per_piece]; - int num_downloads[max_blocks_per_piece]; - }; - - struct TORRENT_EXPORT torrent_handle - { - friend class invariant_access; - friend struct aux::session_impl; - friend class torrent; - - torrent_handle(): m_ses(0), m_chk(0) {} - - void get_peer_info(std::vector& v) const; - bool send_chat_message(tcp::endpoint ip, std::string message) const; - torrent_status status() const; - void get_download_queue(std::vector& queue) const; - - // fills the specified vector with the download progress [0, 1] - // of each file in the torrent. The files are ordered as in - // the torrent_info. - void file_progress(std::vector& progress); - - std::vector const& trackers() const; - void replace_trackers(std::vector const&) const; - - void add_url_seed(std::string const& url); - - bool has_metadata() const; - const torrent_info& get_torrent_info() const; - bool is_valid() const; - - bool is_seed() const; - bool is_paused() const; - void pause() const; - void resume() const; - - // marks the piece with the given index as filtered - // it will not be downloaded - void filter_piece(int index, bool filter) const; - void filter_pieces(std::vector const& pieces) const; - bool is_piece_filtered(int index) const; - std::vector filtered_pieces() const; - - // marks the file with the given index as filtered - // it will not be downloaded - void filter_files(std::vector const& files) const; - - // set the interface to bind outgoing connections - // to. - void use_interface(const char* net_interface) const; - - entry write_resume_data() const; - - // kind of similar to get_torrent_info() but this - // is lower level, returning the exact info-part of - // the .torrent file. When hashed, this buffer - // will produce the info hash. The reference is valid - // only as long as the torrent is running. - std::vector const& metadata() const; - - // forces this torrent to reannounce - // (make a rerequest from the tracker) - void force_reannounce() const; - - // forces a reannounce in the specified amount of time. - // This overrides the default announce interval, and no - // announce will take place until the given time has - // timed out. - void force_reannounce(boost::posix_time::time_duration) const; - - // TODO: add a feature where the user can tell the torrent - // to finish all pieces currently in the pipeline, and then - // abort the torrent. - - void set_upload_limit(int limit) const; - void set_download_limit(int limit) const; - void set_sequenced_download_threshold(int threshold) const; - - void set_peer_upload_limit(tcp::endpoint ip, int limit) const; - void set_peer_download_limit(tcp::endpoint ip, int limit) const; - - // manually connect a peer - void connect_peer(tcp::endpoint const& adr) const; - - // valid ratios are 0 (infinite ratio) or [ 1.0 , inf ) - // the ratio is uploaded / downloaded. less than 1 is not allowed - void set_ratio(float up_down_ratio) const; - - boost::filesystem::path save_path() const; - - // -1 means unlimited unchokes - void set_max_uploads(int max_uploads) const; - - // -1 means unlimited connections - void set_max_connections(int max_connections) const; - - void set_tracker_login(std::string const& name - , std::string const& password) const; - - // post condition: save_path() == save_path if true is returned - bool move_storage(boost::filesystem::path const& save_path) const; - - const sha1_hash& info_hash() const - { return m_info_hash; } - - bool operator==(const torrent_handle& h) const - { return m_info_hash == h.m_info_hash; } - - bool operator!=(const torrent_handle& h) const - { return m_info_hash != h.m_info_hash; } - - bool operator<(const torrent_handle& h) const - { return m_info_hash < h.m_info_hash; } - - private: - - torrent_handle(aux::session_impl* s, - aux::checker_impl* c, - const sha1_hash& h) - : m_ses(s) - , m_chk(c) - , m_info_hash(h) - { - assert(m_ses != 0); - } - -#ifndef NDEBUG - void check_invariant() const; -#endif - - aux::session_impl* m_ses; - aux::checker_impl* m_chk; - sha1_hash m_info_hash; - - }; - - -} - -#endif // TORRENT_TORRENT_HANDLE_HPP_INCLUDED diff --git a/libtorrent/include/torrent_info.hpp b/libtorrent/include/torrent_info.hpp deleted file mode 100755 index 4e6e20d9e..000000000 --- a/libtorrent/include/torrent_info.hpp +++ /dev/null @@ -1,242 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_TORRENT_INFO_HPP_INCLUDE -#define TORRENT_TORRENT_INFO_HPP_INCLUDE - - -#include -#include - -#ifdef _MSC_VER -#pragma warning(push, 1) -#endif - -#include -#include -#include -#include -#include - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -#include "libtorrent/entry.hpp" -#include "libtorrent/socket.hpp" -#include "libtorrent/peer_id.hpp" -#include "libtorrent/size_type.hpp" -#include "libtorrent/peer_request.hpp" -#include "libtorrent/config.hpp" - -namespace libtorrent -{ - - struct TORRENT_EXPORT file_entry - { - boost::filesystem::path path; - size_type offset; // the offset of this file inside the torrent - size_type size; // the size of this file - // if the path was incorrectly encoded, this is - // the origianal corrupt encoded string. It is - // preserved in order to be able to reproduce - // the correct info-hash - boost::shared_ptr orig_path; - }; - - struct TORRENT_EXPORT file_slice - { - int file_index; - size_type offset; - size_type size; - }; - - struct TORRENT_EXPORT announce_entry - { - announce_entry(std::string const& u): url(u), tier(0) {} - std::string url; - int tier; - }; - - struct TORRENT_EXPORT invalid_torrent_file: std::exception - { - virtual const char* what() const throw() { return "invalid torrent file"; } - }; - - class TORRENT_EXPORT torrent_info - { - public: - - torrent_info(); - torrent_info(sha1_hash const& info_hash); - torrent_info(entry const& torrent_file); - ~torrent_info(); - - entry create_torrent() const; - entry create_info_metadata() const; - void set_comment(char const* str); - void set_creator(char const* str); - void set_piece_size(int size); - void set_hash(int index, sha1_hash const& h); - void add_tracker(std::string const& url, int tier = 0); - void add_file(boost::filesystem::path file, size_type size); - void add_url_seed(std::string const& url); - - std::vector map_block(int piece, size_type offset, int size) const; - peer_request map_file(int file, size_type offset, int size) const; - - std::vector const& url_seeds() const { return m_url_seeds; } - - typedef std::vector::const_iterator file_iterator; - typedef std::vector::const_reverse_iterator reverse_file_iterator; - - // list the files in the torrent file - file_iterator begin_files() const { return m_files.begin(); } - file_iterator end_files() const { return m_files.end(); } - reverse_file_iterator rbegin_files() const { return m_files.rbegin(); } - reverse_file_iterator rend_files() const { return m_files.rend(); } - - int num_files() const - { assert(m_piece_length > 0); return (int)m_files.size(); } - const file_entry& file_at(int index) const - { assert(index >= 0 && index < (int)m_files.size()); return m_files[index]; } - - const std::vector& trackers() const { return m_urls; } - - size_type total_size() const { assert(m_piece_length > 0); return m_total_size; } - size_type piece_length() const { assert(m_piece_length > 0); return m_piece_length; } - int num_pieces() const { assert(m_piece_length > 0); return (int)m_piece_hash.size(); } - const sha1_hash& info_hash() const { return m_info_hash; } - const std::string& name() const { assert(m_piece_length > 0); return m_name; } - void print(std::ostream& os) const; - bool is_valid() const { return m_piece_length > 0; } - - bool priv() const { return m_private; } - void set_priv(bool v) { m_private = v; } - - void convert_file_names(); - - size_type piece_size(int index) const; - - const sha1_hash& hash_for_piece(int index) const - { - assert(index >= 0); - assert(index < (int)m_piece_hash.size()); - return m_piece_hash[index]; - } - - boost::optional - creation_date() const; - - const std::string& creator() const - { return m_created_by; } - - const std::string& comment() const - { return m_comment; } - - // dht nodes to add to the routing table/bootstrap from - typedef std::vector > nodes_t; - - nodes_t const& nodes() const - { return m_nodes; } - - void add_node(std::pair const& node); - - void parse_info_section(entry const& e); - - private: - - void read_torrent_info(const entry& libtorrent); - - // the urls to the trackers - std::vector m_urls; - - std::vector m_url_seeds; - - // the length of one piece - // if this is 0, the torrent_info is - // in an uninitialized state - size_type m_piece_length; - - // the sha-1 hashes of each piece - std::vector m_piece_hash; - - // the list of files that this torrent consists of - std::vector m_files; - - nodes_t m_nodes; - - // the sum of all filesizes - size_type m_total_size; - - // the hash that identifies this torrent - // is mutable because it's calculated - // lazily - mutable sha1_hash m_info_hash; - - std::string m_name; - - // if a creation date is found in the torrent file - // this will be set to that, otherwise it'll be - // 1970, Jan 1 - boost::posix_time::ptime m_creation_date; - - // if a comment is found in the torrent file - // this will be set to that comment - std::string m_comment; - - // an optional string naming the software used - // to create the torrent file - std::string m_created_by; - - // this is used when creating a torrent. If there's - // only one file there are cases where it's impossible - // to know if it should be written as a multifile torrent - // or not. e.g. test/test there's one file and one directory - // and they have the same name. - bool m_multifile; - - // this is true if the torrent is private. i.e., is should not - // be announced on the dht - bool m_private; - - // contains any non-parsed entries from the info-section - // these are kept in order to be able to accurately - // reproduce the info-section when sending the metadata - // to peers. - entry m_extra_info; - }; - -} - -#endif // TORRENT_TORRENT_INFO_HPP_INCLUDED - diff --git a/libtorrent/include/tracker_manager.hpp b/libtorrent/include/tracker_manager.hpp deleted file mode 100755 index a45f88b59..000000000 --- a/libtorrent/include/tracker_manager.hpp +++ /dev/null @@ -1,248 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_TRACKER_MANAGER_HPP_INCLUDED -#define TORRENT_TRACKER_MANAGER_HPP_INCLUDED - -#include -#include -#include -#include - -#ifdef _MSC_VER -#pragma warning(push, 1) -#endif - -#include -#include -#include -#include -#include -#include -#include -#include - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -#include "libtorrent/socket.hpp" -#include "libtorrent/entry.hpp" -#include "libtorrent/session_settings.hpp" -#include "libtorrent/peer_id.hpp" -#include "libtorrent/peer.hpp" -#include "libtorrent/config.hpp" - -namespace libtorrent -{ - struct request_callback; - class tracker_manager; - struct timeout_handler; - struct tracker_connection; - - // encodes a string using the base64 scheme - TORRENT_EXPORT std::string base64encode(const std::string& s); - - // returns -1 if gzip header is invalid or the header size in bytes - TORRENT_EXPORT int gzip_header(const char* buf, int size); - - TORRENT_EXPORT boost::tuple - parse_url_components(std::string url); - - struct TORRENT_EXPORT tracker_request - { - tracker_request() - : kind(announce_request) - , event(none) - , key(0) - , num_want(0) - {} - - enum - { - announce_request, - scrape_request - } kind; - - enum event_t - { - none, - completed, - started, - stopped - }; - - sha1_hash info_hash; - peer_id pid; - size_type downloaded; - size_type uploaded; - size_type left; - unsigned short listen_port; - event_t event; - std::string url; - int key; - int num_want; - }; - - struct TORRENT_EXPORT request_callback - { - friend class tracker_manager; - request_callback(): m_manager(0) {} - virtual ~request_callback() {} - virtual void tracker_warning(std::string const& msg) = 0; - virtual void tracker_response( - tracker_request const& - , std::vector& peers - , int interval - , int complete - , int incomplete) = 0; - virtual void tracker_request_timed_out( - tracker_request const&) = 0; - virtual void tracker_request_error( - tracker_request const& - , int response_code - , const std::string& description) = 0; - - tcp::endpoint m_tracker_address; - -#if defined(TORRENT_VERBOSE_LOGGING) || defined(TORRENT_LOGGING) - virtual void debug_log(const std::string& line) = 0; -#endif - private: - tracker_manager* m_manager; - }; - - TORRENT_EXPORT bool inflate_gzip( - std::vector& buffer - , tracker_request const& req - , request_callback* requester - , int maximum_tracker_response_length); - - TORRENT_EXPORT void intrusive_ptr_add_ref(timeout_handler const*); - TORRENT_EXPORT void intrusive_ptr_release(timeout_handler const*); - - struct TORRENT_EXPORT timeout_handler - : boost::noncopyable - { - friend void intrusive_ptr_add_ref(timeout_handler const*); - friend void intrusive_ptr_release(timeout_handler const*); - - timeout_handler(demuxer& d); - - void set_timeout(int completion_timeout, int read_timeout); - void restart_read_timeout(); - void cancel(); - - virtual void on_timeout() = 0; - virtual ~timeout_handler() {} - - private: - - void timeout_callback(asio::error const&); - - boost::intrusive_ptr self() - { return boost::intrusive_ptr(this); } - - demuxer& m_demuxer; - // used for timeouts - // this is set when the request has been sent - boost::posix_time::ptime m_start_time; - // this is set every time something is received - boost::posix_time::ptime m_read_time; - // the asio async operation - asio::deadline_timer m_timeout; - - int m_completion_timeout; - int m_read_timeout; - - typedef boost::mutex mutex_t; - mutable mutex_t m_mutex; - mutable int m_refs; - }; - - struct TORRENT_EXPORT tracker_connection - : timeout_handler - { - tracker_connection(tracker_manager& man - , tracker_request req - , demuxer& d - , boost::weak_ptr r); - - request_callback& requester(); - virtual ~tracker_connection() {} - - tracker_request const& tracker_req() const { return m_req; } - bool has_requester() const { return !m_requester.expired(); } - - void fail(int code, char const* msg); - void fail_timeout(); - void close(); - - protected: - boost::weak_ptr m_requester; - private: - tracker_manager& m_man; - const tracker_request m_req; - }; - - class TORRENT_EXPORT tracker_manager: boost::noncopyable - { - public: - - tracker_manager(const session_settings& s) - : m_settings(s) {} - - void queue_request( - demuxer& d - , tracker_request r - , std::string const& auth - , boost::weak_ptr c - = boost::weak_ptr()); - void abort_all_requests(); - - void remove_request(tracker_connection const*); - bool empty() const; - - private: - - typedef boost::recursive_mutex mutex_t; - mutable mutex_t m_mutex; - - typedef std::list > - tracker_connections_t; - tracker_connections_t m_connections; - session_settings const& m_settings; - }; -} - -#endif // TORRENT_TRACKER_MANAGER_HPP_INCLUDED - diff --git a/libtorrent/include/udp_tracker_connection.hpp b/libtorrent/include/udp_tracker_connection.hpp deleted file mode 100755 index 43671ed86..000000000 --- a/libtorrent/include/udp_tracker_connection.hpp +++ /dev/null @@ -1,122 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_UDP_TRACKER_CONNECTION_HPP_INCLUDED -#define TORRENT_UDP_TRACKER_CONNECTION_HPP_INCLUDED - -#include -#include -#include -#include - -#ifdef _MSC_VER -#pragma warning(push, 1) -#endif - -#include -#include -#include - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -#include "libtorrent/socket.hpp" -#include "libtorrent/entry.hpp" -#include "libtorrent/session_settings.hpp" -#include "libtorrent/peer_id.hpp" -#include "libtorrent/peer.hpp" -#include "libtorrent/tracker_manager.hpp" -#include "libtorrent/config.hpp" - -namespace libtorrent -{ - class TORRENT_EXPORT udp_tracker_connection: public tracker_connection - { - friend class tracker_manager; - public: - - udp_tracker_connection( - demuxer& d - , tracker_manager& man - , tracker_request const& req - , std::string const& hostname - , unsigned short port - , boost::weak_ptr c - , session_settings const& stn); - - private: - - enum action_t - { - action_connect, - action_announce, - action_scrape, - action_error - }; - - boost::intrusive_ptr self() - { return boost::intrusive_ptr(this); } - - void name_lookup(asio::error const& error, tcp::resolver::iterator i); - void timeout(asio::error const& error); - - void send_udp_connect(); - void connect_response(asio::error const& error, std::size_t bytes_transferred); - - void send_udp_announce(); - void announce_response(asio::error const& error, std::size_t bytes_transferred); - - void send_udp_scrape(); - void scrape_response(asio::error const& error, std::size_t bytes_transferred); - - virtual void on_timeout(); - - tracker_manager& m_man; - - tcp::resolver m_name_lookup; - int m_port; - boost::shared_ptr m_socket; - udp::endpoint m_target; - udp::endpoint m_sender; - - int m_transaction_id; - boost::int64_t m_connection_id; - session_settings const& m_settings; - int m_attempts; - std::vector m_buffer; - }; - -} - -#endif // TORRENT_UDP_TRACKER_CONNECTION_HPP_INCLUDED - diff --git a/libtorrent/include/utf8.hpp b/libtorrent/include/utf8.hpp deleted file mode 100644 index 7a31af804..000000000 --- a/libtorrent/include/utf8.hpp +++ /dev/null @@ -1,160 +0,0 @@ -/* - Copyright (C) 2004-2005 Cory Nelson - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. -*/ - -// namespaces added by Arvid Norberg - -#ifndef __UTF8_H__ -#define __UTF8_H__ - -#include -#include -#include - -namespace libtorrent { -namespace detail { - -template -wchar_t decode_utf8_mb(InputIterator &iter, InputIterator last) -{ - if (iter == last) throw std::runtime_error("incomplete UTF-8 sequence"); - if (((*iter) & 0xc0) != 0x80) throw std::runtime_error("invalid UTF-8 sequence"); - - return (wchar_t)((*iter++) & 0x3f); -} - -template -wchar_t decode_utf8(InputIterator &iter, InputIterator last) -{ - wchar_t ret; - - if (((*iter) & 0x80) == 0) // one byte - { - ret = *iter++; - } - else if (((*iter) & 0xe0) == 0xc0) // two bytes - { - wchar_t byte1 = (*iter++) & 0x1f; - wchar_t byte2 = decode_utf8_mb(iter, last); - ret = (byte1 << 6) | byte2; - } - else if (((*iter) & 0xf0) == 0xe0) // three bytes - { - wchar_t byte1 = (*iter++) & 0x0f; - wchar_t byte2 = decode_utf8_mb(iter, last); - wchar_t byte3 = decode_utf8_mb(iter, last); - ret = (byte1 << 12) | (byte2 << 6) | byte3; - } - // TODO: support surrogate pairs - else throw std::runtime_error("UTF-8 not convertable to UTF-16"); - - return ret; -} - -template -OutputIterator utf8_wchar(InputIterator first, InputIterator last, OutputIterator dest) -{ - for(; first!=last; ++dest) - *dest = decode_utf8(first, last); - return dest; -} - -template -void encode_wchar(InputIterator iter, OutputIterator &dest) -{ - if(*iter <= 0x007F) - { - *dest=(char)*iter; - ++dest; - } - else if(*iter <= 0x07FF) - { - *dest = (char)( - 0xC0 | - ((*iter & 0x07C0) >> 6) - ); - ++dest; - - *dest = (char)( - 0x80 | - (*iter & 0x003F) - ); - ++dest; - } - else if(*iter <= 0xFFFF) - { - *dest = (char)( - 0xE0 | - ((*iter & 0xF000) >> 12) - ); - ++dest; - - *dest = (char)( - 0x80 | - ((*iter & 0x0FC0) >> 6) - ); - ++dest; - - *dest = (char)( - 0x80 | - (*iter & 0x003F) - ); - ++dest; - } -} - -template -OutputIterator wchar_utf8(InputIterator first, InputIterator last, OutputIterator dest) -{ - for(; first!=last; ++first) - encode_wchar(first, dest); - return dest; -} - -} - -inline void utf8_wchar(const std::string &utf8, std::wstring &wide) -{ - wide.clear(); - detail::utf8_wchar(utf8.begin(), utf8.end(), std::insert_iterator(wide, wide.end())); -} - -inline std::wstring utf8_wchar(const std::string &str) -{ - std::wstring ret; - utf8_wchar(str, ret); - return ret; -} - -inline void wchar_utf8(const std::wstring &wide, std::string &utf8) -{ - utf8.clear(); - detail::wchar_utf8(wide.begin(), wide.end(), std::insert_iterator(utf8, utf8.end())); -} - -inline std::string wchar_utf8(const std::wstring &str) -{ - std::string ret; - wchar_utf8(str, ret); - return ret; -} - -} - -#endif diff --git a/libtorrent/include/version.hpp b/libtorrent/include/version.hpp deleted file mode 100755 index 25c7a9f05..000000000 --- a/libtorrent/include/version.hpp +++ /dev/null @@ -1,41 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_VERSION_HPP_INCLUDED -#define TORRENT_VERSION_HPP_INCLUDED - -#define LIBTORRENT_VERSION_MAJOR 0 -#define LIBTORRENT_VERSION_MINOR 11 - -#define LIBTORRENT_VERSION "0.11.0.0" - -#endif diff --git a/libtorrent/include/web_peer_connection.hpp b/libtorrent/include/web_peer_connection.hpp deleted file mode 100755 index 77f840409..000000000 --- a/libtorrent/include/web_peer_connection.hpp +++ /dev/null @@ -1,169 +0,0 @@ -/* - -Copyright (c) 2003, Arvid Norberg -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions -are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in - the documentation and/or other materials provided with the distribution. - * Neither the name of the author nor the names of its - contributors may be used to endorse or promote products derived - from this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -*/ - -#ifndef TORRENT_WEB_PEER_CONNECTION_HPP_INCLUDED -#define TORRENT_WEB_PEER_CONNECTION_HPP_INCLUDED - -#include -#include -#include -#include -#include - -#include "libtorrent/debug.hpp" - -#ifdef _MSC_VER -#pragma warning(push, 1) -#endif - -#include -#include -#include -#include -#include -#include -#include - -#ifdef _MSC_VER -#pragma warning(pop) -#endif - -#include "libtorrent/buffer.hpp" -#include "libtorrent/peer_connection.hpp" -#include "libtorrent/socket.hpp" -#include "libtorrent/peer_id.hpp" -#include "libtorrent/storage.hpp" -#include "libtorrent/stat.hpp" -#include "libtorrent/alert.hpp" -#include "libtorrent/torrent_handle.hpp" -#include "libtorrent/torrent.hpp" -#include "libtorrent/allocate_resources.hpp" -#include "libtorrent/peer_request.hpp" -#include "libtorrent/piece_block_progress.hpp" -#include "libtorrent/config.hpp" -// parse_url -#include "libtorrent/tracker_manager.hpp" -// http_parser -#include "libtorrent/http_tracker_connection.hpp" - -namespace libtorrent -{ - class torrent; - - namespace detail - { - struct session_impl; - } - - class TORRENT_EXPORT web_peer_connection - : public peer_connection - { - friend class invariant_access; - public: - - // this is the constructor where the we are the active part. - // The peer_conenction should handshake and verify that the - // other end has the correct id - web_peer_connection( - aux::session_impl& ses - , boost::weak_ptr t - , boost::shared_ptr s - , tcp::endpoint const& remote - , std::string const& url); - - ~web_peer_connection(); - - // called from the main loop when this connection has any - // work to do. - void on_sent(asio::error const& error - , std::size_t bytes_transferred); - void on_receive(asio::error const& error - , std::size_t bytes_transferred); - - std::string const& url() const { return m_url; } - - virtual void get_peer_info(peer_info& p) const; - - // the following functions appends messages - // to the send buffer - void write_choke() {} - void write_unchoke() {} - void write_interested() {} - void write_not_interested() {} - void write_request(peer_request const& r); - void write_cancel(peer_request const& r) {} - void write_have(int index) {} - void write_piece(peer_request const& r) {} - void write_keepalive() {} - void on_connected(); - -#ifndef NDEBUG - void check_invariant() const; -#endif - - private: - - // returns the block currently being - // downloaded. And the progress of that - // block. If the peer isn't downloading - // a piece for the moment, the boost::optional - // will be invalid. - boost::optional downloading_piece_progress() const; - - // this has one entry per bittorrent request - std::deque m_requests; - // this has one entry per http-request - // (might be more than the bt requests) - std::deque m_file_requests; - - std::string m_server_string; - http_parser m_parser; - std::string m_host; - int m_port; - std::string m_path; - std::string m_url; - - // the first request will contain a little bit more data - // than subsequent ones, things that aren't critical are left - // out to save bandwidth. - bool m_first_request; - - // this is used for intermediate storage of pieces - // that is received in more than on HTTP responses - std::vector m_piece; - // the mapping of the data in the m_piece buffer - peer_request m_intermediate_piece; - }; -} - -#endif // TORRENT_WEB_PEER_CONNECTION_HPP_INCLUDED - diff --git a/src/delugegtk.py b/src/delugegtk.py index 9443480ee..9b028e52b 100755 --- a/src/delugegtk.py +++ b/src/delugegtk.py @@ -230,7 +230,7 @@ class DelugeGTK(dbus.service.Object): name = state['name'] size = dcommon.fsize(state['total_size']) progress = float(state['progress'] * 100) - message = deluge.STATE_MESSAGES[state['state']] + message = '%s %d%%'%(deluge.STATE_MESSAGES[state['state']], int(state['progress'] * 100)) seeds = dcommon.fseed(state) peers = dcommon.fpeer(state) dlrate = dcommon.frate(state['download_rate'])