Home | History | Annotate | Download | only in asio
      1 //
      2 // read.hpp
      3 // ~~~~~~~~
      4 //
      5 // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
      6 //
      7 // Distributed under the Boost Software License, Version 1.0. (See accompanying
      8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
      9 //
     10 
     11 #ifndef ASIO_READ_HPP
     12 #define ASIO_READ_HPP
     13 
     14 
     15 #include "asio/detail/config.hpp"
     16 #include <cstddef>
     17 #include "asio/async_result.hpp"
     18 #include "asio/basic_streambuf_fwd.hpp"
     19 #include "asio/error.hpp"
     20 
     21 #include "asio/detail/push_options.hpp"
     22 
     23 namespace asio {
     24 
     25 /**
     26  * @defgroup read asio::read
     27  *
     28  * @brief Attempt to read a certain amount of data from a stream before
     29  * returning.
     30  */
     31 /*@{*/
     32 
     33 /// Attempt to read a certain amount of data from a stream before returning.
     34 /**
     35  * This function is used to read a certain number of bytes of data from a
     36  * stream. The call will block until one of the following conditions is true:
     37  *
     38  * @li The supplied buffers are full. That is, the bytes transferred is equal to
     39  * the sum of the buffer sizes.
     40  *
     41  * @li An error occurred.
     42  *
     43  * This operation is implemented in terms of zero or more calls to the stream's
     44  * read_some function.
     45  *
     46  * @param s The stream from which the data is to be read. The type must support
     47  * the SyncReadStream concept.
     48  *
     49  * @param buffers One or more buffers into which the data will be read. The sum
     50  * of the buffer sizes indicates the maximum number of bytes to read from the
     51  * stream.
     52  *
     53  * @returns The number of bytes transferred.
     54  *
     55  * @throws asio::system_error Thrown on failure.
     56  *
     57  * @par Example
     58  * To read into a single data buffer use the @ref buffer function as follows:
     59  * @code asio::read(s, asio::buffer(data, size)); @endcode
     60  * See the @ref buffer documentation for information on reading into multiple
     61  * buffers in one go, and how to use it with arrays, boost::array or
     62  * std::vector.
     63  *
     64  * @note This overload is equivalent to calling:
     65  * @code asio::read(
     66  *     s, buffers,
     67  *     asio::transfer_all()); @endcode
     68  */
     69 template <typename SyncReadStream, typename MutableBufferSequence>
     70 std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers);
     71 
     72 /// Attempt to read a certain amount of data from a stream before returning.
     73 /**
     74  * This function is used to read a certain number of bytes of data from a
     75  * stream. The call will block until one of the following conditions is true:
     76  *
     77  * @li The supplied buffers are full. That is, the bytes transferred is equal to
     78  * the sum of the buffer sizes.
     79  *
     80  * @li An error occurred.
     81  *
     82  * This operation is implemented in terms of zero or more calls to the stream's
     83  * read_some function.
     84  *
     85  * @param s The stream from which the data is to be read. The type must support
     86  * the SyncReadStream concept.
     87  *
     88  * @param buffers One or more buffers into which the data will be read. The sum
     89  * of the buffer sizes indicates the maximum number of bytes to read from the
     90  * stream.
     91  *
     92  * @param ec Set to indicate what error occurred, if any.
     93  *
     94  * @returns The number of bytes transferred.
     95  *
     96  * @par Example
     97  * To read into a single data buffer use the @ref buffer function as follows:
     98  * @code asio::read(s, asio::buffer(data, size), ec); @endcode
     99  * See the @ref buffer documentation for information on reading into multiple
    100  * buffers in one go, and how to use it with arrays, boost::array or
    101  * std::vector.
    102  *
    103  * @note This overload is equivalent to calling:
    104  * @code asio::read(
    105  *     s, buffers,
    106  *     asio::transfer_all(), ec); @endcode
    107  */
    108 template <typename SyncReadStream, typename MutableBufferSequence>
    109 std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers,
    110     asio::error_code& ec);
    111 
    112 /// Attempt to read a certain amount of data from a stream before returning.
    113 /**
    114  * This function is used to read a certain number of bytes of data from a
    115  * stream. The call will block until one of the following conditions is true:
    116  *
    117  * @li The supplied buffers are full. That is, the bytes transferred is equal to
    118  * the sum of the buffer sizes.
    119  *
    120  * @li The completion_condition function object returns 0.
    121  *
    122  * This operation is implemented in terms of zero or more calls to the stream's
    123  * read_some function.
    124  *
    125  * @param s The stream from which the data is to be read. The type must support
    126  * the SyncReadStream concept.
    127  *
    128  * @param buffers One or more buffers into which the data will be read. The sum
    129  * of the buffer sizes indicates the maximum number of bytes to read from the
    130  * stream.
    131  *
    132  * @param completion_condition The function object to be called to determine
    133  * whether the read operation is complete. The signature of the function object
    134  * must be:
    135  * @code std::size_t completion_condition(
    136  *   // Result of latest read_some operation.
    137  *   const asio::error_code& error,
    138  *
    139  *   // Number of bytes transferred so far.
    140  *   std::size_t bytes_transferred
    141  * ); @endcode
    142  * A return value of 0 indicates that the read operation is complete. A non-zero
    143  * return value indicates the maximum number of bytes to be read on the next
    144  * call to the stream's read_some function.
    145  *
    146  * @returns The number of bytes transferred.
    147  *
    148  * @throws asio::system_error Thrown on failure.
    149  *
    150  * @par Example
    151  * To read into a single data buffer use the @ref buffer function as follows:
    152  * @code asio::read(s, asio::buffer(data, size),
    153  *     asio::transfer_at_least(32)); @endcode
    154  * See the @ref buffer documentation for information on reading into multiple
    155  * buffers in one go, and how to use it with arrays, boost::array or
    156  * std::vector.
    157  */
    158 template <typename SyncReadStream, typename MutableBufferSequence,
    159   typename CompletionCondition>
    160 std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers,
    161     CompletionCondition completion_condition);
    162 
    163 /// Attempt to read a certain amount of data from a stream before returning.
    164 /**
    165  * This function is used to read a certain number of bytes of data from a
    166  * stream. The call will block until one of the following conditions is true:
    167  *
    168  * @li The supplied buffers are full. That is, the bytes transferred is equal to
    169  * the sum of the buffer sizes.
    170  *
    171  * @li The completion_condition function object returns 0.
    172  *
    173  * This operation is implemented in terms of zero or more calls to the stream's
    174  * read_some function.
    175  *
    176  * @param s The stream from which the data is to be read. The type must support
    177  * the SyncReadStream concept.
    178  *
    179  * @param buffers One or more buffers into which the data will be read. The sum
    180  * of the buffer sizes indicates the maximum number of bytes to read from the
    181  * stream.
    182  *
    183  * @param completion_condition The function object to be called to determine
    184  * whether the read operation is complete. The signature of the function object
    185  * must be:
    186  * @code std::size_t completion_condition(
    187  *   // Result of latest read_some operation.
    188  *   const asio::error_code& error,
    189  *
    190  *   // Number of bytes transferred so far.
    191  *   std::size_t bytes_transferred
    192  * ); @endcode
    193  * A return value of 0 indicates that the read operation is complete. A non-zero
    194  * return value indicates the maximum number of bytes to be read on the next
    195  * call to the stream's read_some function.
    196  *
    197  * @param ec Set to indicate what error occurred, if any.
    198  *
    199  * @returns The number of bytes read. If an error occurs, returns the total
    200  * number of bytes successfully transferred prior to the error.
    201  */
    202 template <typename SyncReadStream, typename MutableBufferSequence,
    203     typename CompletionCondition>
    204 std::size_t read(SyncReadStream& s, const MutableBufferSequence& buffers,
    205     CompletionCondition completion_condition, asio::error_code& ec);
    206 
    207 
    208 /*@}*/
    209 /**
    210  * @defgroup async_read asio::async_read
    211  *
    212  * @brief Start an asynchronous operation to read a certain amount of data from
    213  * a stream.
    214  */
    215 /*@{*/
    216 
    217 /// Start an asynchronous operation to read a certain amount of data from a
    218 /// stream.
    219 /**
    220  * This function is used to asynchronously read a certain number of bytes of
    221  * data from a stream. The function call always returns immediately. The
    222  * asynchronous operation will continue until one of the following conditions is
    223  * true:
    224  *
    225  * @li The supplied buffers are full. That is, the bytes transferred is equal to
    226  * the sum of the buffer sizes.
    227  *
    228  * @li An error occurred.
    229  *
    230  * This operation is implemented in terms of zero or more calls to the stream's
    231  * async_read_some function, and is known as a <em>composed operation</em>. The
    232  * program must ensure that the stream performs no other read operations (such
    233  * as async_read, the stream's async_read_some function, or any other composed
    234  * operations that perform reads) until this operation completes.
    235  *
    236  * @param s The stream from which the data is to be read. The type must support
    237  * the AsyncReadStream concept.
    238  *
    239  * @param buffers One or more buffers into which the data will be read. The sum
    240  * of the buffer sizes indicates the maximum number of bytes to read from the
    241  * stream. Although the buffers object may be copied as necessary, ownership of
    242  * the underlying memory blocks is retained by the caller, which must guarantee
    243  * that they remain valid until the handler is called.
    244  *
    245  * @param handler The handler to be called when the read operation completes.
    246  * Copies will be made of the handler as required. The function signature of the
    247  * handler must be:
    248  * @code void handler(
    249  *   const asio::error_code& error, // Result of operation.
    250  *
    251  *   std::size_t bytes_transferred           // Number of bytes copied into the
    252  *                                           // buffers. If an error occurred,
    253  *                                           // this will be the  number of
    254  *                                           // bytes successfully transferred
    255  *                                           // prior to the error.
    256  * ); @endcode
    257  * Regardless of whether the asynchronous operation completes immediately or
    258  * not, the handler will not be invoked from within this function. Invocation of
    259  * the handler will be performed in a manner equivalent to using
    260  * asio::io_service::post().
    261  *
    262  * @par Example
    263  * To read into a single data buffer use the @ref buffer function as follows:
    264  * @code
    265  * asio::async_read(s, asio::buffer(data, size), handler);
    266  * @endcode
    267  * See the @ref buffer documentation for information on reading into multiple
    268  * buffers in one go, and how to use it with arrays, boost::array or
    269  * std::vector.
    270  *
    271  * @note This overload is equivalent to calling:
    272  * @code asio::async_read(
    273  *     s, buffers,
    274  *     asio::transfer_all(),
    275  *     handler); @endcode
    276  */
    277 template <typename AsyncReadStream, typename MutableBufferSequence,
    278     typename ReadHandler>
    279 ASIO_INITFN_RESULT_TYPE(ReadHandler,
    280     void (asio::error_code, std::size_t))
    281 async_read(AsyncReadStream& s, const MutableBufferSequence& buffers,
    282     ASIO_MOVE_ARG(ReadHandler) handler);
    283 
    284 /// Start an asynchronous operation to read a certain amount of data from a
    285 /// stream.
    286 /**
    287  * This function is used to asynchronously read a certain number of bytes of
    288  * data from a stream. The function call always returns immediately. The
    289  * asynchronous operation will continue until one of the following conditions is
    290  * true:
    291  *
    292  * @li The supplied buffers are full. That is, the bytes transferred is equal to
    293  * the sum of the buffer sizes.
    294  *
    295  * @li The completion_condition function object returns 0.
    296  *
    297  * @param s The stream from which the data is to be read. The type must support
    298  * the AsyncReadStream concept.
    299  *
    300  * @param buffers One or more buffers into which the data will be read. The sum
    301  * of the buffer sizes indicates the maximum number of bytes to read from the
    302  * stream. Although the buffers object may be copied as necessary, ownership of
    303  * the underlying memory blocks is retained by the caller, which must guarantee
    304  * that they remain valid until the handler is called.
    305  *
    306  * @param completion_condition The function object to be called to determine
    307  * whether the read operation is complete. The signature of the function object
    308  * must be:
    309  * @code std::size_t completion_condition(
    310  *   // Result of latest async_read_some operation.
    311  *   const asio::error_code& error,
    312  *
    313  *   // Number of bytes transferred so far.
    314  *   std::size_t bytes_transferred
    315  * ); @endcode
    316  * A return value of 0 indicates that the read operation is complete. A non-zero
    317  * return value indicates the maximum number of bytes to be read on the next
    318  * call to the stream's async_read_some function.
    319  *
    320  * @param handler The handler to be called when the read operation completes.
    321  * Copies will be made of the handler as required. The function signature of the
    322  * handler must be:
    323  * @code void handler(
    324  *   const asio::error_code& error, // Result of operation.
    325  *
    326  *   std::size_t bytes_transferred           // Number of bytes copied into the
    327  *                                           // buffers. If an error occurred,
    328  *                                           // this will be the  number of
    329  *                                           // bytes successfully transferred
    330  *                                           // prior to the error.
    331  * ); @endcode
    332  * Regardless of whether the asynchronous operation completes immediately or
    333  * not, the handler will not be invoked from within this function. Invocation of
    334  * the handler will be performed in a manner equivalent to using
    335  * asio::io_service::post().
    336  *
    337  * @par Example
    338  * To read into a single data buffer use the @ref buffer function as follows:
    339  * @code asio::async_read(s,
    340  *     asio::buffer(data, size),
    341  *     asio::transfer_at_least(32),
    342  *     handler); @endcode
    343  * See the @ref buffer documentation for information on reading into multiple
    344  * buffers in one go, and how to use it with arrays, boost::array or
    345  * std::vector.
    346  */
    347 template <typename AsyncReadStream, typename MutableBufferSequence,
    348     typename CompletionCondition, typename ReadHandler>
    349 ASIO_INITFN_RESULT_TYPE(ReadHandler,
    350     void (asio::error_code, std::size_t))
    351 async_read(AsyncReadStream& s, const MutableBufferSequence& buffers,
    352     CompletionCondition completion_condition,
    353     ASIO_MOVE_ARG(ReadHandler) handler);
    354 
    355 
    356 /*@}*/
    357 
    358 } // namespace asio
    359 
    360 #include "asio/detail/pop_options.hpp"
    361 
    362 #include "asio/impl/read.hpp"
    363 
    364 #endif // ASIO_READ_HPP
    365