Remove in-place translations support.
[dcpomatic.git] / src / lib / content.cc
index 49ab944be54c79c3d478469ad09762a9555768fe..6324050ec69a22f056cc3bedb4c1c7ae2ff002f0 100644 (file)
  */
 
 
-#include "content.h"
+#include "audio_content.h"
 #include "change_signaller.h"
-#include "util.h"
+#include "compose.hpp"
+#include "content.h"
 #include "content_factory.h"
-#include "video_content.h"
-#include "audio_content.h"
-#include "text_content.h"
 #include "exceptions.h"
 #include "film.h"
 #include "job.h"
-#include "compose.hpp"
+#include "text_content.h"
+#include "util.h"
+#include "video_content.h"
 #include <dcp/locale_convert.h>
 #include <dcp/raw_convert.h>
 #include <libcxml/cxml.h>
@@ -48,8 +48,6 @@
 using std::cout;
 using std::list;
 using std::make_shared;
-using std::max;
-using std::pair;
 using std::shared_ptr;
 using std::string;
 using std::vector;
@@ -68,7 +66,6 @@ int const ContentProperty::VIDEO_FRAME_RATE = 405;
 
 
 Content::Content ()
-       : _change_signals_frequent (false)
 {
 
 }
@@ -76,21 +73,18 @@ Content::Content ()
 
 Content::Content (DCPTime p)
        : _position (p)
-       , _change_signals_frequent (false)
 {
 
 }
 
 
 Content::Content (boost::filesystem::path p)
-       : _change_signals_frequent (false)
 {
        add_path (p);
 }
 
 
 Content::Content (cxml::ConstNodePtr node)
-       : _change_signals_frequent (false)
 {
        for (auto i: node->node_children("Path")) {
                _paths.push_back (i->content());
@@ -99,7 +93,7 @@ Content::Content (cxml::ConstNodePtr node)
                        _last_write_times.push_back (*mod);
                } else {
                        boost::system::error_code ec;
-                       auto last_write = boost::filesystem::last_write_time(i->content(), ec);
+                       auto last_write = dcp::filesystem::last_write_time(i->content(), ec);
                        _last_write_times.push_back (ec ? 0 : last_write);
                }
        }
@@ -116,7 +110,6 @@ Content::Content (vector<shared_ptr<Content>> c)
        , _trim_start (c.front()->trim_start())
        , _trim_end (c.back()->trim_end())
        , _video_frame_rate (c.front()->video_frame_rate())
-       , _change_signals_frequent (false)
 {
        for (size_t i = 0; i < c.size(); ++i) {
                if (i > 0 && c[i]->trim_start() > ContentTime ()) {
@@ -171,15 +164,11 @@ Content::as_xml (xmlpp::Node* node, bool with_paths) const
 string
 Content::calculate_digest () const
 {
-       boost::mutex::scoped_lock lm (_mutex);
-       auto p = _paths;
-       lm.unlock ();
-
        /* Some content files are very big, so we use a poor man's
           digest here: a digest of the first and last 1e6 bytes with the
           size of the first file tacked on the end as a string.
        */
-       return digest_head_tail(p, 1000000) + raw_convert<string>(boost::filesystem::file_size(p.front()));
+       return simple_digest (paths());
 }
 
 
@@ -198,7 +187,7 @@ Content::examine (shared_ptr<const Film>, shared_ptr<Job> job)
        _last_write_times.clear ();
        for (auto i: _paths) {
                boost::system::error_code ec;
-               auto last_write = boost::filesystem::last_write_time(i, ec);
+               auto last_write = dcp::filesystem::last_write_time(i, ec);
                _last_write_times.push_back (ec ? 0 : last_write);
        }
 }
@@ -253,8 +242,10 @@ Content::set_position (shared_ptr<const Film> film, DCPTime p, bool force_emit)
 
 
 void
-Content::set_trim_start (ContentTime t)
+Content::set_trim_start(shared_ptr<const Film> film, ContentTime t)
 {
+       DCPOMATIC_ASSERT (t.get() >= 0);
+
        /* video and audio content can modify its start trim */
 
        if (video) {
@@ -263,14 +254,18 @@ Content::set_trim_start (ContentTime t)
 
        /* See note in ::set_position */
        if (!video && audio) {
-               audio->modify_trim_start (t);
+               audio->modify_trim_start(film, t);
        }
 
        ContentChangeSignaller cc (this, ContentProperty::TRIM_START);
 
        {
                boost::mutex::scoped_lock lm (_mutex);
-               _trim_start = t;
+               if (_trim_start == t) {
+                       cc.abort();
+               } else {
+                       _trim_start = t;
+               }
        }
 }
 
@@ -278,6 +273,8 @@ Content::set_trim_start (ContentTime t)
 void
 Content::set_trim_end (ContentTime t)
 {
+       DCPOMATIC_ASSERT (t.get() >= 0);
+
        ContentChangeSignaller cc (this, ContentProperty::TRIM_END);
 
        {
@@ -342,7 +339,7 @@ bool
 Content::paths_valid () const
 {
        for (auto i: _paths) {
-               if (!boost::filesystem::exists (i)) {
+               if (!dcp::filesystem::exists(i)) {
                        return false;
                }
        }
@@ -362,7 +359,7 @@ Content::set_paths (vector<boost::filesystem::path> paths)
                _last_write_times.clear ();
                for (auto i: _paths) {
                        boost::system::error_code ec;
-                       auto last_write = boost::filesystem::last_write_time(i, ec);
+                       auto last_write = dcp::filesystem::last_write_time(i, ec);
                        _last_write_times.push_back (ec ? 0 : last_write);
                }
        }
@@ -409,7 +406,7 @@ Content::reel_split_points (shared_ptr<const Film>) const
 
 
 void
-Content::set_video_frame_rate (double r)
+Content::set_video_frame_rate(shared_ptr<const Film> film, double r)
 {
        ContentChangeSignaller cc (this, ContentProperty::VIDEO_FRAME_RATE);
 
@@ -423,7 +420,7 @@ Content::set_video_frame_rate (double r)
 
        /* Make sure trim is still on a frame boundary */
        if (video) {
-               set_trim_start (trim_start());
+               set_trim_start(film, trim_start());
        }
 }
 
@@ -461,7 +458,24 @@ Content::active_video_frame_rate (shared_ptr<const Film> film) const
 void
 Content::add_properties (shared_ptr<const Film>, list<UserProperty>& p) const
 {
-       p.push_back (UserProperty (UserProperty::GENERAL, _("Filename"), path(0).string ()));
+       auto paths_to_show = std::min(number_of_paths(), size_t{8});
+       string paths = "";
+       for (auto i = size_t{0}; i < paths_to_show; ++i) {
+               paths += path(i).string();
+               if (i < (paths_to_show - 1)) {
+                       paths += "\n";
+               }
+       }
+       if (paths_to_show < number_of_paths()) {
+               paths += String::compose("... and %1 more", number_of_paths() - paths_to_show);
+       }
+       p.push_back (
+               UserProperty(
+                       UserProperty::GENERAL,
+                       paths_to_show > 1 ? _("Filenames") : _("Filename"),
+                       paths
+                       )
+               );
 
        if (_video_frame_rate) {
                if (video) {
@@ -538,6 +552,21 @@ Content::add_path (boost::filesystem::path p)
        boost::mutex::scoped_lock lm (_mutex);
        _paths.push_back (p);
        boost::system::error_code ec;
-       auto last_write = boost::filesystem::last_write_time(p, ec);
+       auto last_write = dcp::filesystem::last_write_time(p, ec);
        _last_write_times.push_back (ec ? 0 : last_write);
 }
+
+
+bool
+Content::changed () const
+{
+       bool write_time_changed = false;
+       for (auto i = 0U; i < _paths.size(); ++i) {
+               if (dcp::filesystem::last_write_time(_paths[i]) != last_write_time(i)) {
+                       write_time_changed = true;
+                       break;
+               }
+       }
+
+       return (write_time_changed || calculate_digest() != digest());
+}