+
+
+string
+dcp::openjpeg_version ()
+{
+ return opj_version ();
+}
+
+
+string
+dcp::spaces (int n)
+{
+ string s = "";
+ for (int i = 0; i < n; ++i) {
+ s += " ";
+ }
+ return s;
+}
+
+
+void
+dcp::indent (xmlpp::Element* element, int initial)
+{
+ xmlpp::Node* last = nullptr;
+ for (auto n: element->get_children()) {
+ auto e = dynamic_cast<xmlpp::Element*>(n);
+ if (e) {
+ element->add_child_text_before (e, "\n" + spaces(initial + 2));
+ indent (e, initial + 2);
+ last = n;
+ }
+ }
+ if (last) {
+ element->add_child_text (last, "\n" + spaces(initial));
+ }
+}
+
+
+bool
+dcp::day_less_than_or_equal (LocalTime a, LocalTime b)
+{
+ if (a.year() != b.year()) {
+ return a.year() < b.year();
+ }
+
+ if (a.month() != b.month()) {
+ return a.month() < b.month();
+ }
+
+ return a.day() <= b.day();
+}
+
+
+bool
+dcp::day_greater_than_or_equal (LocalTime a, LocalTime b)
+{
+ if (a.year() != b.year()) {
+ return a.year() > b.year();
+ }
+
+ if (a.month() != b.month()) {
+ return a.month() > b.month();
+ }
+
+ return a.day() >= b.day();
+}
+
+
+string
+dcp::unique_string (vector<string> existing, string base)
+{
+ int const max_tries = existing.size() + 1;
+ for (int i = 0; i < max_tries; ++i) {
+ string trial = String::compose("%1%2", base, i);
+ if (find(existing.begin(), existing.end(), trial) == existing.end()) {
+ return trial;
+ }
+ }
+
+ DCP_ASSERT (false);
+}
+
+
+ASDCPErrorSuspender::ASDCPErrorSuspender ()
+ : _old (Kumu::DefaultLogSink())
+{
+ _sink = new Kumu::EntryListLogSink(_log);
+ Kumu::SetDefaultLogSink (_sink);
+}
+
+
+ASDCPErrorSuspender::~ASDCPErrorSuspender ()
+{
+ Kumu::SetDefaultLogSink (&_old);
+ delete _sink;
+}
+