Ignore:
Timestamp:
08/22/11 21:43:56 (22 months ago)
Author:
Michael Medin <michael@…>
Branches:
master, 0.4.0, 0.4.1, 0.4.2
Children:
0b8df3e
Parents:
bd18eb2
Message:
  • Fixed so it works on linux (fixed issues with timeout)
File:
1 edited

Legend:

Unmodified
Added
Removed
  • include/socket/socket_helpers.hpp

    rbd18eb2 r4632ff7  
    55#include <boost/bind.hpp> 
    66#include <boost/optional.hpp> 
     7#include <boost/shared_ptr.hpp> 
     8#include <boost/enable_shared_from_this.hpp> 
    79 
    810#include <unicode_char.hpp> 
     
    117119    void set_result(boost::optional<boost::system::error_code>* a, boost::system::error_code b); 
    118120 
    119     struct timed_writer : boost::noncopyable { 
     121    struct timed_writer : public boost::enable_shared_from_this<timed_writer> { 
    120122      boost::asio::io_service &io_service; 
    121123      boost::posix_time::time_duration duration; 
     
    125127      boost::optional<boost::system::error_code> read_result; 
    126128 
    127       timed_writer(boost::asio::io_service &io_service, boost::posix_time::time_duration duration) 
    128         : io_service(io_service)  
    129         , timer(io_service) 
    130       { 
     129      timed_writer(boost::asio::io_service& io_service) : io_service(io_service), timer(io_service) {} 
     130      ~timed_writer() { 
     131        timer.cancel(); 
     132      } 
     133      void start_timer(boost::posix_time::time_duration duration) { 
    131134        timer.expires_from_now(duration); 
    132         timer.async_wait(boost::bind(set_result, &timer_result, _1)); 
    133       } 
    134       ~timed_writer() { 
     135        timer.async_wait(boost::bind(&timed_writer::set_result, shared_from_this(), &timer_result, _1)); 
     136      } 
     137      void stop_timer() { 
    135138        timer.cancel(); 
    136139      } 
    137140 
    138141      template <typename AsyncWriteStream, typename MutableBufferSequence> 
    139       void write(AsyncWriteStream& socket, MutableBufferSequence &buffer) { 
    140         async_write(socket, buffer, boost::bind(set_result, &read_result, _1)); 
    141       } 
    142  
    143       template <typename AsyncWriteStream, typename RawSocket, typename MutableBufferSequence> 
    144       bool write_and_wait(AsyncWriteStream& sock, RawSocket& rawSocket, const MutableBufferSequence& buffer) { 
    145         write(sock, buffer); 
    146         return wait(rawSocket); 
    147       } 
    148  
    149       template <typename RawSocket> 
    150       bool wait(RawSocket& socket) { 
     142      void write(AsyncWriteStream& stream, MutableBufferSequence &buffer) { 
     143        async_write(stream, buffer, boost::bind(&timed_writer::set_result, shared_from_this(), &read_result, _1)); 
     144      } 
     145 
     146      template <typename AsyncWriteStream, typename Socket, typename MutableBufferSequence> 
     147      bool write_and_wait(AsyncWriteStream& stream, Socket& socket, const MutableBufferSequence& buffer) { 
     148        write(stream, buffer); 
     149        return wait(socket); 
     150      } 
     151 
     152      template<typename Socket> 
     153      bool wait(Socket& socket) { 
    151154        io_service.reset(); 
    152155        while (io_service.run_one()) { 
    153156          if (read_result) { 
     157            read_result.reset(); 
    154158            return true; 
    155159          } 
     
    160164        } 
    161165      } 
     166 
     167      void set_result(boost::optional<boost::system::error_code>* a, boost::system::error_code ec) { 
     168        if (!ec) 
     169          a->reset(ec); 
     170      } 
     171 
    162172    }; 
    163173 
     
    186196 
    187197 
    188     struct timed_reader : boost::noncopyable { 
     198    struct timed_reader : public boost::enable_shared_from_this<timed_reader> { 
    189199      boost::asio::io_service &io_service; 
    190200      boost::posix_time::time_duration duration; 
     
    194204      boost::optional<boost::system::error_code> write_result; 
    195205 
    196       timed_reader(boost::asio::io_service &io_service, boost::posix_time::time_duration duration) 
    197         : io_service(io_service)  
    198         , timer(io_service) 
    199       { 
     206      timed_reader(boost::asio::io_service &io_service) : io_service(io_service), timer(io_service) {} 
     207      ~timed_reader() { 
     208        timer.cancel(); 
     209      } 
     210 
     211      void start_timer(boost::posix_time::time_duration duration) { 
    200212        timer.expires_from_now(duration); 
    201         timer.async_wait(boost::bind(set_result, &timer_result, _1)); 
    202       } 
    203       ~timed_reader() { 
     213        timer.async_wait(boost::bind(&timed_reader::set_result, shared_from_this(), &timer_result, _1)); 
     214      } 
     215      void stop_timer() { 
    204216        timer.cancel(); 
    205217      } 
    206218 
    207219      template <typename AsyncWriteStream, typename MutableBufferSequence> 
    208       void read(AsyncWriteStream& socket, const MutableBufferSequence &buffers) { 
    209         async_read(socket, buffers, boost::bind(set_result, &write_result, _1)); 
    210       } 
    211  
    212       template <typename AsyncWriteStream, typename MutableBufferSequence> 
    213       bool read_and_wait(AsyncWriteStream& sock, const MutableBufferSequence& buffers) { 
    214         read(sock, buffers); 
    215         return wait(); 
    216       } 
    217       bool wait() { 
     220      void read(AsyncWriteStream& stream, const MutableBufferSequence &buffers) { 
     221        async_read(stream, buffers, boost::bind(&timed_reader::set_result, shared_from_this(), &write_result, _1)); 
     222      } 
     223 
     224      template <typename AsyncWriteStream, typename Socket, typename MutableBufferSequence> 
     225      bool read_and_wait(AsyncWriteStream& stream, Socket& socket, const MutableBufferSequence& buffers) { 
     226        read(stream, buffers); 
     227        return wait(socket); 
     228      } 
     229      template <typename Socket> 
     230      bool wait(Socket& socket) { 
    218231        io_service.reset(); 
    219232        while (io_service.run_one()) { 
    220233          if (write_result) { 
    221             std::cout << "---read---" << std::endl; 
    222             //timer.cancel(); 
     234            write_result.reset(); 
    223235            return true; 
    224236          } 
    225237          else if (timer_result) { 
    226             std::cout << "---timer (read)---" << std::endl; 
    227             //socket.close(); 
     238            socket.close(); 
    228239            return false; 
    229240          } 
    230241        } 
    231242      } 
     243      void set_result(boost::optional<boost::system::error_code>* a, boost::system::error_code ec) { 
     244        if (!ec) 
     245          a->reset(ec); 
     246      } 
     247 
    232248    }; 
    233249 
Note: See TracChangeset for help on using the changeset viewer.