X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=blobdiff_plain;f=src%2Flib%2Fdcpomatic_socket.h;h=f4520e5cf7c070d3407c2196b1baf8ff98939476;hp=870e7315c3126fb67b67fa3b493ce2be34ee8a56;hb=da44da6f31f97d39ca91c35955e573e76371f2c2;hpb=0fb8f8c4ec481e342d26a332595d39fcf8cd4e94 diff --git a/src/lib/dcpomatic_socket.h b/src/lib/dcpomatic_socket.h index 870e7315c..f4520e5cf 100644 --- a/src/lib/dcpomatic_socket.h +++ b/src/lib/dcpomatic_socket.h @@ -18,8 +18,9 @@ */ +#include "digester.h" #include -#include +#include /** @class Socket * @brief A class to wrap a boost::asio::ip::tcp::socket with some things @@ -28,11 +29,14 @@ * This class wraps some things that I could not work out how to do easily with boost; * most notably, sync read/write calls with timeouts. */ -class Socket : public boost::noncopyable +class Socket { public: explicit Socket (int timeout = 30); + Socket (Socket const&) = delete; + Socket& operator= (Socket const&) = delete; + /** @return Our underlying socket */ boost::asio::ip::tcp::socket& socket () { return _socket; @@ -46,13 +50,41 @@ public: void read (uint8_t* data, int size); uint32_t read_uint32 (); + class ReadDigestScope + { + public: + ReadDigestScope (std::shared_ptr socket); + bool check (); + private: + std::weak_ptr _socket; + }; + + /** After one of these is created everything that is sent from the socket will be + * added to a digest. When the DigestScope is destroyed the digest will be sent + * from the socket. + */ + class WriteDigestScope + { + public: + WriteDigestScope (std::shared_ptr socket); + ~WriteDigestScope (); + private: + std::weak_ptr _socket; + }; + private: - void check (); + friend class DigestScope; - Socket (Socket const &); + void check (); + void start_read_digest (); + bool check_read_digest (); + void start_write_digest (); + void finish_write_digest (); boost::asio::io_service _io_service; boost::asio::deadline_timer _deadline; boost::asio::ip::tcp::socket _socket; int _timeout; + boost::scoped_ptr _read_digester; + boost::scoped_ptr _write_digester; };