summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2015-01-29 00:37:06 +0000
committerCarl Hetherington <cth@carlh.net>2015-01-29 00:37:06 +0000
commitf213fd833a840fc97e3875979ae7dc7cbbc883b1 (patch)
treebf585e448f263668ebaf39d37a8b90757c1dea91 /src/lib
parentc58b1a4a478201b76a4f8491fa075cbe476af484 (diff)
Move Socket to dcpomatic_socket.{cc,h}.
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/colour_conversion.cc4
-rw-r--r--src/lib/colour_conversion.h2
-rw-r--r--src/lib/dcp_video.cc2
-rw-r--r--src/lib/dcpomatic_socket.cc156
-rw-r--r--src/lib/dcpomatic_socket.h59
-rw-r--r--src/lib/encoded_data.cc1
-rw-r--r--src/lib/image.cc16
-rw-r--r--src/lib/image.h3
-rw-r--r--src/lib/j2k_image_proxy.cc2
-rw-r--r--src/lib/magick_image_proxy.cc5
-rw-r--r--src/lib/server.cc16
-rw-r--r--src/lib/util.cc129
-rw-r--r--src/lib/util.h41
-rw-r--r--src/lib/wscript1
14 files changed, 244 insertions, 193 deletions
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 <cth@carlh.net>
+
+ 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 <boost/bind.hpp>
+#include <boost/lambda/lambda.hpp>
+
+#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<uint8_t*> (&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<uint8_t *> (&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 <cth@carlh.net>
+
+ 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 <boost/asio.hpp>
+
+/** @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 <cth@carlh.net>
+ Copyright (C) 2012-2015 Carl Hetherington <cth@carlh.net>
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 <iostream>
-extern "C" {
-#include <libswscale/swscale.h>
-#include <libavutil/pixfmt.h>
-#include <libavutil/pixdesc.h>
-}
#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 <libswscale/swscale.h>
+#include <libavutil/pixfmt.h>
+#include <libavutil/pixdesc.h>
+}
+#include <iostream>
#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 <dcp/image.h>
extern "C" {
#include <libavcodec/avcodec.h>
@@ -37,6 +37,7 @@ extern "C" {
#include <string>
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 <dcp/mono_picture_frame.h>
#include <dcp/stereo_picture_frame.h>
#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 <cth@carlh.net>
+ Copyright (C) 2014-2015 Carl Hetherington <cth@carlh.net>
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 <string>
-#include <vector>
-#include <iostream>
-#include <boost/algorithm/string.hpp>
-#include <boost/scoped_array.hpp>
-#include <libcxml/cxml.h>
-#include <dcp/raw_convert.h>
#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 <dcp/raw_convert.h>
+#include <libcxml/cxml.h>
+#include <boost/algorithm/string.hpp>
+#include <boost/scoped_array.hpp>
+#include <string>
+#include <vector>
+#include <iostream>
#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<uint8_t*> (&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<uint8_t *> (&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 <libavfilter/avfilter.h>
}
#include <boost/shared_ptr.hpp>
-#include <boost/asio.hpp>
#include <boost/optional.hpp>
#include <boost/filesystem.hpp>
#include <string>
@@ -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