From: Carl Hetherington Date: Thu, 29 Jan 2015 00:37:06 +0000 (+0000) Subject: Move Socket to dcpomatic_socket.{cc,h}. X-Git-Tag: v2.0.48~259 X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=commitdiff_plain;h=f213fd833a840fc97e3875979ae7dc7cbbc883b1 Move Socket to dcpomatic_socket.{cc,h}. --- diff --git a/src/lib/colour_conversion.cc b/src/lib/colour_conversion.cc index 028912f2b..6c5a6679f 100644 --- a/src/lib/colour_conversion.cc +++ b/src/lib/colour_conversion.cc @@ -185,8 +185,8 @@ PresetColourConversion::PresetColourConversion () } PresetColourConversion::PresetColourConversion (string n, dcp::ColourConversion conversion_) - : name (n) - , conversion (conversion_) + : conversion (conversion_) + , name (n) { } diff --git a/src/lib/colour_conversion.h b/src/lib/colour_conversion.h index ae207b46a..47e6d2b6f 100644 --- a/src/lib/colour_conversion.h +++ b/src/lib/colour_conversion.h @@ -57,8 +57,8 @@ public: void as_xml (xmlpp::Node *) const; - std::string name; ColourConversion conversion; + std::string name; }; bool operator== (ColourConversion const &, ColourConversion const &); diff --git a/src/lib/dcp_video.cc b/src/lib/dcp_video.cc index 559aef7c6..a01a72f6b 100644 --- a/src/lib/dcp_video.cc +++ b/src/lib/dcp_video.cc @@ -32,7 +32,7 @@ #include "config.h" #include "exceptions.h" #include "server.h" -#include "util.h" +#include "dcpomatic_socket.h" #include "scaler.h" #include "image.h" #include "log.h" diff --git a/src/lib/dcpomatic_socket.cc b/src/lib/dcpomatic_socket.cc new file mode 100644 index 000000000..bc8f596a7 --- /dev/null +++ b/src/lib/dcpomatic_socket.cc @@ -0,0 +1,156 @@ +/* + Copyright (C) 2012-2015 Carl Hetherington + + This program 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, + 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. + +*/ + +#include "dcpomatic_socket.h" +#include "compose.hpp" +#include "exceptions.h" +#include +#include + +#include "i18n.h" + +Socket::Socket (int timeout) + : _deadline (_io_service) + , _socket (_io_service) + , _acceptor (0) + , _timeout (timeout) +{ + _deadline.expires_at (boost::posix_time::pos_infin); + check (); +} + +Socket::~Socket () +{ + delete _acceptor; +} + +void +Socket::check () +{ + if (_deadline.expires_at() <= boost::asio::deadline_timer::traits_type::now ()) { + if (_acceptor) { + _acceptor->cancel (); + } else { + _socket.close (); + } + _deadline.expires_at (boost::posix_time::pos_infin); + } + + _deadline.async_wait (boost::bind (&Socket::check, this)); +} + +/** Blocking connect. + * @param endpoint End-point to connect to. + */ +void +Socket::connect (boost::asio::ip::tcp::endpoint endpoint) +{ + _deadline.expires_from_now (boost::posix_time::seconds (_timeout)); + boost::system::error_code ec = boost::asio::error::would_block; + _socket.async_connect (endpoint, boost::lambda::var(ec) = boost::lambda::_1); + do { + _io_service.run_one(); + } while (ec == boost::asio::error::would_block); + + if (ec) { + throw NetworkError (String::compose (_("error during async_connect (%1)"), ec.value ())); + } + + if (!_socket.is_open ()) { + throw NetworkError (_("connect timed out")); + } +} + +void +Socket::accept (int port) +{ + _acceptor = new boost::asio::ip::tcp::acceptor (_io_service, boost::asio::ip::tcp::endpoint (boost::asio::ip::tcp::v4(), port)); + + _deadline.expires_from_now (boost::posix_time::seconds (_timeout)); + boost::system::error_code ec = boost::asio::error::would_block; + _acceptor->async_accept (_socket, boost::lambda::var(ec) = boost::lambda::_1); + do { + _io_service.run_one (); + } while (ec == boost::asio::error::would_block); + + delete _acceptor; + _acceptor = 0; + + if (ec) { + throw NetworkError (String::compose (_("error during async_accept (%1)"), ec.value ())); + } +} + +/** Blocking write. + * @param data Buffer to write. + * @param size Number of bytes to write. + */ +void +Socket::write (uint8_t const * data, int size) +{ + _deadline.expires_from_now (boost::posix_time::seconds (_timeout)); + boost::system::error_code ec = boost::asio::error::would_block; + + boost::asio::async_write (_socket, boost::asio::buffer (data, size), boost::lambda::var(ec) = boost::lambda::_1); + + do { + _io_service.run_one (); + } while (ec == boost::asio::error::would_block); + + if (ec) { + throw NetworkError (String::compose (_("error during async_write (%1)"), ec.value ())); + } +} + +void +Socket::write (uint32_t v) +{ + v = htonl (v); + write (reinterpret_cast (&v), 4); +} + +/** Blocking read. + * @param data Buffer to read to. + * @param size Number of bytes to read. + */ +void +Socket::read (uint8_t* data, int size) +{ + _deadline.expires_from_now (boost::posix_time::seconds (_timeout)); + boost::system::error_code ec = boost::asio::error::would_block; + + boost::asio::async_read (_socket, boost::asio::buffer (data, size), boost::lambda::var(ec) = boost::lambda::_1); + + do { + _io_service.run_one (); + } while (ec == boost::asio::error::would_block); + + if (ec) { + throw NetworkError (String::compose (_("error during async_read (%1)"), ec.value ())); + } +} + +uint32_t +Socket::read_uint32 () +{ + uint32_t v; + read (reinterpret_cast (&v), 4); + return ntohl (v); +} + diff --git a/src/lib/dcpomatic_socket.h b/src/lib/dcpomatic_socket.h new file mode 100644 index 000000000..d2ee6d555 --- /dev/null +++ b/src/lib/dcpomatic_socket.h @@ -0,0 +1,59 @@ +/* + Copyright (C) 2012-2015 Carl Hetherington + + This program 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, + 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. + +*/ + +#include + +/** @class Socket + * @brief A class to wrap a boost::asio::ip::tcp::socket with some things + * that are useful for DCP-o-matic. + * + * This class wraps some things that I could not work out how to do with boost; + * most notably, sync read/write calls with timeouts. + */ +class Socket +{ +public: + Socket (int timeout = 30); + ~Socket (); + + /** @return Our underlying socket */ + boost::asio::ip::tcp::socket& socket () { + return _socket; + } + + void connect (boost::asio::ip::tcp::endpoint); + void accept (int); + + void write (uint32_t n); + void write (uint8_t const * data, int size); + + void read (uint8_t* data, int size); + uint32_t read_uint32 (); + +private: + void check (); + + Socket (Socket const &); + + boost::asio::io_service _io_service; + boost::asio::deadline_timer _deadline; + boost::asio::ip::tcp::socket _socket; + boost::asio::ip::tcp::acceptor* _acceptor; + int _timeout; +}; diff --git a/src/lib/encoded_data.cc b/src/lib/encoded_data.cc index 61d2644da..1b1926017 100644 --- a/src/lib/encoded_data.cc +++ b/src/lib/encoded_data.cc @@ -21,6 +21,7 @@ #include "cross.h" #include "exceptions.h" #include "film.h" +#include "dcpomatic_socket.h" #include "i18n.h" diff --git a/src/lib/image.cc b/src/lib/image.cc index d16de5e55..3df498c87 100644 --- a/src/lib/image.cc +++ b/src/lib/image.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2012-2014 Carl Hetherington + Copyright (C) 2012-2015 Carl Hetherington This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,18 +21,20 @@ * @brief A class to describe a video image. */ -#include -extern "C" { -#include -#include -#include -} #include "image.h" #include "exceptions.h" #include "scaler.h" #include "timer.h" #include "rect.h" +#include "util.h" #include "md5_digester.h" +#include "dcpomatic_socket.h" +extern "C" { +#include +#include +#include +} +#include #include "i18n.h" diff --git a/src/lib/image.h b/src/lib/image.h index 22f3f6e50..814ad1c58 100644 --- a/src/lib/image.h +++ b/src/lib/image.h @@ -24,9 +24,9 @@ #ifndef DCPOMATIC_IMAGE_H #define DCPOMATIC_IMAGE_H -#include "util.h" #include "position.h" #include "position_image.h" +#include "types.h" #include extern "C" { #include @@ -37,6 +37,7 @@ extern "C" { #include class Scaler; +class Socket; class Image : public dcp::Image { diff --git a/src/lib/j2k_image_proxy.cc b/src/lib/j2k_image_proxy.cc index 175f4c796..09eaa4695 100644 --- a/src/lib/j2k_image_proxy.cc +++ b/src/lib/j2k_image_proxy.cc @@ -22,7 +22,7 @@ #include #include #include "j2k_image_proxy.h" -#include "util.h" +#include "dcpomatic_socket.h" #include "image.h" #include "encoded_data.h" diff --git a/src/lib/magick_image_proxy.cc b/src/lib/magick_image_proxy.cc index c9cddd899..e4417f366 100644 --- a/src/lib/magick_image_proxy.cc +++ b/src/lib/magick_image_proxy.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2014 Carl Hetherington + Copyright (C) 2014-2015 Carl Hetherington This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,8 +21,9 @@ #include "magick_image_proxy.h" #include "cross.h" #include "exceptions.h" -#include "util.h" +#include "dcpomatic_socket.h" #include "image.h" +#include "compose.hpp" #include "i18n.h" diff --git a/src/lib/server.cc b/src/lib/server.cc index 0212356f3..32e1e38b2 100644 --- a/src/lib/server.cc +++ b/src/lib/server.cc @@ -22,15 +22,8 @@ * encoding work, and a class to implement such a server. */ -#include -#include -#include -#include -#include -#include -#include #include "server.h" -#include "util.h" +#include "dcpomatic_socket.h" #include "scaler.h" #include "image.h" #include "dcp_video.h" @@ -39,6 +32,13 @@ #include "player_video.h" #include "encoded_data.h" #include "safe_stringstream.h" +#include +#include +#include +#include +#include +#include +#include #include "i18n.h" diff --git a/src/lib/util.cc b/src/lib/util.cc index 807883ca0..c298a1946 100644 --- a/src/lib/util.cc +++ b/src/lib/util.cc @@ -480,135 +480,6 @@ dcp_audio_frame_rate (int fs) return 96000; } -Socket::Socket (int timeout) - : _deadline (_io_service) - , _socket (_io_service) - , _acceptor (0) - , _timeout (timeout) -{ - _deadline.expires_at (boost::posix_time::pos_infin); - check (); -} - -Socket::~Socket () -{ - delete _acceptor; -} - -void -Socket::check () -{ - if (_deadline.expires_at() <= boost::asio::deadline_timer::traits_type::now ()) { - if (_acceptor) { - _acceptor->cancel (); - } else { - _socket.close (); - } - _deadline.expires_at (boost::posix_time::pos_infin); - } - - _deadline.async_wait (boost::bind (&Socket::check, this)); -} - -/** Blocking connect. - * @param endpoint End-point to connect to. - */ -void -Socket::connect (boost::asio::ip::tcp::endpoint endpoint) -{ - _deadline.expires_from_now (boost::posix_time::seconds (_timeout)); - boost::system::error_code ec = boost::asio::error::would_block; - _socket.async_connect (endpoint, boost::lambda::var(ec) = boost::lambda::_1); - do { - _io_service.run_one(); - } while (ec == boost::asio::error::would_block); - - if (ec) { - throw NetworkError (String::compose (_("error during async_connect (%1)"), ec.value ())); - } - - if (!_socket.is_open ()) { - throw NetworkError (_("connect timed out")); - } -} - -void -Socket::accept (int port) -{ - _acceptor = new boost::asio::ip::tcp::acceptor (_io_service, boost::asio::ip::tcp::endpoint (boost::asio::ip::tcp::v4(), port)); - - _deadline.expires_from_now (boost::posix_time::seconds (_timeout)); - boost::system::error_code ec = boost::asio::error::would_block; - _acceptor->async_accept (_socket, boost::lambda::var(ec) = boost::lambda::_1); - do { - _io_service.run_one (); - } while (ec == boost::asio::error::would_block); - - delete _acceptor; - _acceptor = 0; - - if (ec) { - throw NetworkError (String::compose (_("error during async_accept (%1)"), ec.value ())); - } -} - -/** Blocking write. - * @param data Buffer to write. - * @param size Number of bytes to write. - */ -void -Socket::write (uint8_t const * data, int size) -{ - _deadline.expires_from_now (boost::posix_time::seconds (_timeout)); - boost::system::error_code ec = boost::asio::error::would_block; - - boost::asio::async_write (_socket, boost::asio::buffer (data, size), boost::lambda::var(ec) = boost::lambda::_1); - - do { - _io_service.run_one (); - } while (ec == boost::asio::error::would_block); - - if (ec) { - throw NetworkError (String::compose (_("error during async_write (%1)"), ec.value ())); - } -} - -void -Socket::write (uint32_t v) -{ - v = htonl (v); - write (reinterpret_cast (&v), 4); -} - -/** Blocking read. - * @param data Buffer to read to. - * @param size Number of bytes to read. - */ -void -Socket::read (uint8_t* data, int size) -{ - _deadline.expires_from_now (boost::posix_time::seconds (_timeout)); - boost::system::error_code ec = boost::asio::error::would_block; - - boost::asio::async_read (_socket, boost::asio::buffer (data, size), boost::lambda::var(ec) = boost::lambda::_1); - - do { - _io_service.run_one (); - } while (ec == boost::asio::error::would_block); - - if (ec) { - throw NetworkError (String::compose (_("error during async_read (%1)"), ec.value ())); - } -} - -uint32_t -Socket::read_uint32 () -{ - uint32_t v; - read (reinterpret_cast (&v), 4); - return ntohl (v); -} - /** Round a number up to the nearest multiple of another number. * @param c Index. * @param s Array of numbers to round, indexed by c. diff --git a/src/lib/util.h b/src/lib/util.h index ee2865e76..c17dbf05b 100644 --- a/src/lib/util.h +++ b/src/lib/util.h @@ -34,7 +34,6 @@ extern "C" { #include } #include -#include #include #include #include @@ -77,46 +76,6 @@ extern int round_to (float n, int r); extern void* wrapped_av_malloc (size_t); extern ContentTimePeriod subtitle_period (AVSubtitle const &); extern void set_backtrace_file (boost::filesystem::path); - -/** @class Socket - * @brief A class to wrap a boost::asio::ip::tcp::socket with some things - * that are useful for DCP-o-matic. - * - * This class wraps some things that I could not work out how to do with boost; - * most notably, sync read/write calls with timeouts. - */ -class Socket -{ -public: - Socket (int timeout = 30); - ~Socket (); - - /** @return Our underlying socket */ - boost::asio::ip::tcp::socket& socket () { - return _socket; - } - - void connect (boost::asio::ip::tcp::endpoint); - void accept (int); - - void write (uint32_t n); - void write (uint8_t const * data, int size); - - void read (uint8_t* data, int size); - uint32_t read_uint32 (); - -private: - void check (); - - Socket (Socket const &); - - boost::asio::io_service _io_service; - boost::asio::deadline_timer _deadline; - boost::asio::ip::tcp::socket _socket; - boost::asio::ip::tcp::acceptor* _acceptor; - int _timeout; -}; - extern int64_t video_frames_to_audio_frames (VideoFrame v, float audio_sample_rate, float frames_per_second); #endif diff --git a/src/lib/wscript b/src/lib/wscript index e3c8def4e..bad426258 100644 --- a/src/lib/wscript +++ b/src/lib/wscript @@ -26,6 +26,7 @@ sources = """ dcp_subtitle_content.cc dcp_subtitle_decoder.cc dcp_video.cc + dcpomatic_socket.cc dcpomatic_time.cc dolby_cp750.cc encoder.cc