- _paths.push_back (node->string_child ("Path"));
- _digest = node->string_child ("Digest");
- _position = node->number_child<Time> ("Position");
- _trim_start = node->number_child<Time> ("TrimStart");
- _trim_end = node->number_child<Time> ("TrimEnd");
+ list<cxml::NodePtr> path_children = node->node_children ("Path");
+ for (list<cxml::NodePtr>::const_iterator i = path_children.begin(); i != path_children.end(); ++i) {
+ _paths.push_back ((*i)->content ());
+ }
+ _digest = node->optional_string_child ("Digest").get_value_or ("X");
+ _position = DCPTime (node->number_child<DCPTime::Type> ("Position"));
+ _trim_start = ContentTime (node->number_child<ContentTime::Type> ("TrimStart"));
+ _trim_end = ContentTime (node->number_child<ContentTime::Type> ("TrimEnd"));
+}
+
+Content::Content (shared_ptr<const Film> film, vector<shared_ptr<Content> > c)
+ : _film (film)
+ , _position (c.front()->position ())
+ , _trim_start (c.front()->trim_start ())
+ , _trim_end (c.back()->trim_end ())
+ , _change_signals_frequent (false)
+{
+ for (size_t i = 0; i < c.size(); ++i) {
+ if (i > 0 && c[i]->trim_start() > ContentTime ()) {
+ throw JoinError (_("Only the first piece of content to be joined can have a start trim."));
+ }
+
+ if (i < (c.size() - 1) && c[i]->trim_end () > ContentTime ()) {
+ throw JoinError (_("Only the last piece of content to be joined can have an end trim."));
+ }
+
+ for (size_t j = 0; j < c[i]->number_of_paths(); ++j) {
+ _paths.push_back (c[i]->path (j));
+ }
+ }