X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fdcpomatic_socket.h;h=1fa0b046f0c1c7e2490865bfaa41a99114f8dcfb;hb=736745c86cefc6d5d4d8098799efc86f0f639061;hp=82ca5ff694bac96d0605553e36ecf89d9c3597ba;hpb=bfe277e664a03ec47cd6bee7e1b1e4aca6eb38e6;p=dcpomatic.git diff --git a/src/lib/dcpomatic_socket.h b/src/lib/dcpomatic_socket.h index 82ca5ff69..1fa0b046f 100644 --- a/src/lib/dcpomatic_socket.h +++ b/src/lib/dcpomatic_socket.h @@ -1,23 +1,28 @@ /* Copyright (C) 2012-2015 Carl Hetherington - This program is free software; you can redistribute it and/or modify + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This program is distributed in the hope that it will be useful, + DCP-o-matic is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + along with DCP-o-matic. If not, see . */ +#include "digester.h" #include +#include +#include +#include /** @class Socket * @brief A class to wrap a boost::asio::ip::tcp::socket with some things @@ -29,7 +34,7 @@ class Socket : public boost::noncopyable { public: - Socket (int timeout = 30); + explicit Socket (int timeout = 30); /** @return Our underlying socket */ boost::asio::ip::tcp::socket& socket () { @@ -40,12 +45,40 @@ public: void write (uint32_t n); void write (uint8_t const * data, int size); - + void read (uint8_t* data, int size); uint32_t read_uint32 (); - + + class ReadDigestScope + { + public: + ReadDigestScope (boost::shared_ptr socket); + bool check (); + private: + boost::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 (boost::shared_ptr socket); + ~WriteDigestScope (); + private: + boost::weak_ptr _socket; + }; + private: + friend class DigestScope; + void check (); + void start_read_digest (); + bool check_read_digest (); + void start_write_digest (); + void finish_write_digest (); Socket (Socket const &); @@ -53,4 +86,6 @@ private: boost::asio::deadline_timer _deadline; boost::asio::ip::tcp::socket _socket; int _timeout; + boost::scoped_ptr _read_digester; + boost::scoped_ptr _write_digester; };