Try to clean up KDM creation code a bit.
authorCarl Hetherington <cth@carlh.net>
Wed, 7 Oct 2015 10:47:27 +0000 (11:47 +0100)
committerCarl Hetherington <cth@carlh.net>
Fri, 9 Oct 2015 12:44:53 +0000 (13:44 +0100)
12 files changed:
src/lib/cinema_kdms.cc [new file with mode: 0644]
src/lib/cinema_kdms.h [new file with mode: 0644]
src/lib/kdm.cc [deleted file]
src/lib/kdm.h [deleted file]
src/lib/screen_kdm.cc [new file with mode: 0644]
src/lib/screen_kdm.h [new file with mode: 0644]
src/lib/send_kdm_email_job.cc
src/lib/send_kdm_email_job.h
src/lib/wscript
src/tools/dcpomatic.cc
src/tools/dcpomatic_kdm_cli.cc
wscript

diff --git a/src/lib/cinema_kdms.cc b/src/lib/cinema_kdms.cc
new file mode 100644 (file)
index 0000000..aa701ca
--- /dev/null
@@ -0,0 +1,183 @@
+/*
+    Copyright (C) 2013-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 "quickmail.h"
+#include "exceptions.h"
+#include "cinema_kdms.h"
+#include "cinema.h"
+#include "screen.h"
+#include "config.h"
+#include "util.h"
+#include "film.h"
+#include "compose.hpp"
+#include <zip.h>
+#include <boost/foreach.hpp>
+
+using std::list;
+using std::string;
+using boost::shared_ptr;
+
+void
+CinemaKDMs::make_zip_file (shared_ptr<const Film> film, boost::filesystem::path zip_file) const
+{
+       int error;
+       struct zip* zip = zip_open (zip_file.string().c_str(), ZIP_CREATE | ZIP_EXCL, &error);
+       if (!zip) {
+               if (error == ZIP_ER_EXISTS) {
+                       throw FileError ("ZIP file already exists", zip_file);
+               }
+               throw FileError ("could not create ZIP file", zip_file);
+       }
+
+       list<shared_ptr<string> > kdm_strings;
+
+       BOOST_FOREACH (ScreenKDM const & i, screen_kdms) {
+               shared_ptr<string> kdm (new string (i.kdm.as_xml ()));
+               kdm_strings.push_back (kdm);
+
+               struct zip_source* source = zip_source_buffer (zip, kdm->c_str(), kdm->length(), 0);
+               if (!source) {
+                       throw StringError ("could not create ZIP source");
+               }
+
+               if (zip_add (zip, i.filename(film).c_str(), source) == -1) {
+                       throw StringError ("failed to add KDM to ZIP archive");
+               }
+       }
+
+       if (zip_close (zip) == -1) {
+               throw StringError ("failed to close ZIP archive");
+       }
+}
+
+list<CinemaKDMs>
+CinemaKDMs::collect (list<ScreenKDM> screen_kdms)
+{
+       list<CinemaKDMs> cinema_kdms;
+
+       while (!screen_kdms.empty ()) {
+
+               /* Get all the screens from a single cinema */
+
+               CinemaKDMs ck;
+
+               list<ScreenKDM>::iterator i = screen_kdms.begin ();
+               ck.cinema = i->screen->cinema;
+               ck.screen_kdms.push_back (*i);
+               list<ScreenKDM>::iterator j = i;
+               ++i;
+               screen_kdms.remove (*j);
+
+               while (i != screen_kdms.end ()) {
+                       if (i->screen->cinema == ck.cinema) {
+                               ck.screen_kdms.push_back (*i);
+                               list<ScreenKDM>::iterator j = i;
+                               ++i;
+                               screen_kdms.remove (*j);
+                       } else {
+                               ++i;
+                       }
+               }
+
+               cinema_kdms.push_back (ck);
+       }
+
+       return cinema_kdms;
+}
+
+void
+CinemaKDMs::write_zip_files (shared_ptr<const Film> film, list<CinemaKDMs> cinema_kdms, boost::filesystem::path directory)
+{
+       BOOST_FOREACH (CinemaKDMs const & i, cinema_kdms) {
+               boost::filesystem::path path = directory;
+               path /= tidy_for_filename (i.cinema->name) + ".zip";
+               i.make_zip_file (film, path);
+       }
+}
+
+/* XXX: should probably get from/to from the KDMs themselves */
+void
+CinemaKDMs::email (shared_ptr<const Film> film, list<CinemaKDMs> cinema_kdms, dcp::LocalTime from, dcp::LocalTime to)
+{
+       BOOST_FOREACH (CinemaKDMs const & i, cinema_kdms) {
+
+               boost::filesystem::path zip_file = boost::filesystem::temp_directory_path ();
+               zip_file /= boost::filesystem::unique_path().string() + ".zip";
+               i.make_zip_file (film, zip_file);
+
+               /* Send email */
+
+               quickmail_initialize ();
+
+               SafeStringStream start;
+               start << from.date() << " " << from.time_of_day();
+               SafeStringStream end;
+               end << to.date() << " " << to.time_of_day();
+
+               string subject = Config::instance()->kdm_subject();
+               boost::algorithm::replace_all (subject, "$CPL_NAME", film->dcp_name ());
+               boost::algorithm::replace_all (subject, "$START_TIME", start.str ());
+               boost::algorithm::replace_all (subject, "$END_TIME", end.str ());
+               boost::algorithm::replace_all (subject, "$CINEMA_NAME", i.cinema->name);
+               quickmail mail = quickmail_create (Config::instance()->kdm_from().c_str(), subject.c_str ());
+
+               quickmail_add_to (mail, i.cinema->email.c_str ());
+               if (!Config::instance()->kdm_cc().empty ()) {
+                       quickmail_add_cc (mail, Config::instance()->kdm_cc().c_str ());
+               }
+               if (!Config::instance()->kdm_bcc().empty ()) {
+                       quickmail_add_bcc (mail, Config::instance()->kdm_bcc().c_str ());
+               }
+
+               string body = Config::instance()->kdm_email().c_str();
+               boost::algorithm::replace_all (body, "$CPL_NAME", film->dcp_name ());
+               boost::algorithm::replace_all (body, "$START_TIME", start.str ());
+               boost::algorithm::replace_all (body, "$END_TIME", end.str ());
+               boost::algorithm::replace_all (body, "$CINEMA_NAME", i.cinema->name);
+
+               SafeStringStream screens;
+               BOOST_FOREACH (ScreenKDM const & j, i.screen_kdms) {
+                       screens << j.screen->name << ", ";
+               }
+               boost::algorithm::replace_all (body, "$SCREENS", screens.str().substr (0, screens.str().length() - 2));
+
+               quickmail_set_body (mail, body.c_str());
+               quickmail_add_attachment_file (mail, zip_file.string().c_str(), "application/zip");
+
+               char const* error = quickmail_send (
+                       mail,
+                       Config::instance()->mail_server().c_str(),
+                       Config::instance()->mail_port(),
+                       Config::instance()->mail_user().c_str(),
+                       Config::instance()->mail_password().c_str()
+                       );
+
+               if (error) {
+                       quickmail_destroy (mail);
+                       throw KDMError (
+                               String::compose (
+                                       "Failed to send KDM email to %1 (%2)",
+                                       Config::instance()->mail_server(),
+                                       error
+                                       )
+                               );
+               }
+               quickmail_destroy (mail);
+       }
+}
diff --git a/src/lib/cinema_kdms.h b/src/lib/cinema_kdms.h
new file mode 100644 (file)
index 0000000..2a75bfa
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+    Copyright (C) 2013-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 "screen_kdm.h"
+
+class Cinema;
+
+class CinemaKDMs
+{
+public:
+       void make_zip_file (boost::shared_ptr<const Film> film, boost::filesystem::path zip_file) const;
+
+       static std::list<CinemaKDMs> collect (std::list<ScreenKDM> kdms);
+       static void write_zip_files (boost::shared_ptr<const Film> film, std::list<CinemaKDMs> cinema_kdms, boost::filesystem::path directory);
+       static void email (boost::shared_ptr<const Film> film, std::list<CinemaKDMs> cinema_kdms, dcp::LocalTime from, dcp::LocalTime to);
+
+       boost::shared_ptr<Cinema> cinema;
+       std::list<ScreenKDM> screen_kdms;
+};
diff --git a/src/lib/kdm.cc b/src/lib/kdm.cc
deleted file mode 100644 (file)
index f0ba8fb..0000000
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
-    Copyright (C) 2013-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 "kdm.h"
-#include "cinema.h"
-#include "screen.h"
-#include "exceptions.h"
-#include "util.h"
-#include "film.h"
-#include "config.h"
-#include "safe_stringstream.h"
-#include "quickmail.h"
-#include "compose.hpp"
-#include <zip.h>
-#include <dcp/encrypted_kdm.h>
-#include <dcp/types.h>
-#include <boost/shared_ptr.hpp>
-#include <list>
-#include <iostream>
-
-using std::list;
-using std::string;
-using std::cout;
-using boost::shared_ptr;
-
-struct ScreenKDM
-{
-       ScreenKDM (shared_ptr<Screen> s, dcp::EncryptedKDM k)
-               : screen (s)
-               , kdm (k)
-       {}
-
-       shared_ptr<Screen> screen;
-       dcp::EncryptedKDM kdm;
-};
-
-static string
-kdm_filename (shared_ptr<const Film> film, ScreenKDM kdm)
-{
-       return tidy_for_filename (film->name()) + "_" + tidy_for_filename (kdm.screen->cinema->name) + "_" + tidy_for_filename (kdm.screen->name) + ".kdm.xml";
-}
-
-struct CinemaKDMs
-{
-       shared_ptr<Cinema> cinema;
-       list<ScreenKDM> screen_kdms;
-
-       void make_zip_file (shared_ptr<const Film> film, boost::filesystem::path zip_file) const
-       {
-               int error;
-               struct zip* zip = zip_open (zip_file.string().c_str(), ZIP_CREATE | ZIP_EXCL, &error);
-               if (!zip) {
-                       if (error == ZIP_ER_EXISTS) {
-                               throw FileError ("ZIP file already exists", zip_file);
-                       }
-                       throw FileError ("could not create ZIP file", zip_file);
-               }
-
-               list<shared_ptr<string> > kdm_strings;
-
-               for (list<ScreenKDM>::const_iterator i = screen_kdms.begin(); i != screen_kdms.end(); ++i) {
-                       shared_ptr<string> kdm (new string (i->kdm.as_xml ()));
-                       kdm_strings.push_back (kdm);
-
-                       struct zip_source* source = zip_source_buffer (zip, kdm->c_str(), kdm->length(), 0);
-                       if (!source) {
-                               throw StringError ("could not create ZIP source");
-                       }
-
-                       if (zip_add (zip, kdm_filename (film, *i).c_str(), source) == -1) {
-                               throw StringError ("failed to add KDM to ZIP archive");
-                       }
-               }
-
-               if (zip_close (zip) == -1) {
-                       throw StringError ("failed to close ZIP archive");
-               }
-       }
-};
-
-/* Not complete but sufficient for our purposes (we're using
-   ScreenKDM in a list where all the screens will be unique).
-*/
-bool
-operator== (ScreenKDM const & a, ScreenKDM const & b)
-{
-       return a.screen == b.screen;
-}
-
-static list<ScreenKDM>
-make_screen_kdms (
-       shared_ptr<const Film> film,
-       list<shared_ptr<Screen> > screens,
-       boost::filesystem::path cpl,
-       dcp::LocalTime from,
-       dcp::LocalTime to,
-       dcp::Formulation formulation
-       )
-{
-       list<dcp::EncryptedKDM> kdms = film->make_kdms (screens, cpl, from, to, formulation);
-
-       list<ScreenKDM> screen_kdms;
-
-       list<shared_ptr<Screen> >::iterator i = screens.begin ();
-       list<dcp::EncryptedKDM>::iterator j = kdms.begin ();
-       while (i != screens.end() && j != kdms.end ()) {
-               screen_kdms.push_back (ScreenKDM (*i, *j));
-               ++i;
-               ++j;
-       }
-
-       return screen_kdms;
-}
-
-static list<CinemaKDMs>
-make_cinema_kdms (
-       shared_ptr<const Film> film,
-       list<shared_ptr<Screen> > screens,
-       boost::filesystem::path cpl,
-       dcp::LocalTime from,
-       dcp::LocalTime to,
-       dcp::Formulation formulation
-       )
-{
-       list<ScreenKDM> screen_kdms = make_screen_kdms (film, screens, cpl, from, to, formulation);
-       list<CinemaKDMs> cinema_kdms;
-
-       while (!screen_kdms.empty ()) {
-
-               /* Get all the screens from a single cinema */
-
-               CinemaKDMs ck;
-
-               list<ScreenKDM>::iterator i = screen_kdms.begin ();
-               ck.cinema = i->screen->cinema;
-               ck.screen_kdms.push_back (*i);
-               list<ScreenKDM>::iterator j = i;
-               ++i;
-               screen_kdms.remove (*j);
-
-               while (i != screen_kdms.end ()) {
-                       if (i->screen->cinema == ck.cinema) {
-                               ck.screen_kdms.push_back (*i);
-                               list<ScreenKDM>::iterator j = i;
-                               ++i;
-                               screen_kdms.remove (*j);
-                       } else {
-                               ++i;
-                       }
-               }
-
-               cinema_kdms.push_back (ck);
-       }
-
-       return cinema_kdms;
-}
-
-/** @param from KDM from time in local time.
- *  @param to KDM to time in local time.
- */
-void
-write_kdm_files (
-       shared_ptr<const Film> film,
-       list<shared_ptr<Screen> > screens,
-       boost::filesystem::path cpl,
-       dcp::LocalTime from,
-       dcp::LocalTime to,
-       dcp::Formulation formulation,
-       boost::filesystem::path directory
-       )
-{
-       list<ScreenKDM> screen_kdms = make_screen_kdms (film, screens, cpl, from, to, formulation);
-
-       /* Write KDMs to the specified directory */
-       for (list<ScreenKDM>::iterator i = screen_kdms.begin(); i != screen_kdms.end(); ++i) {
-               boost::filesystem::path out = directory;
-               out /= kdm_filename (film, *i);
-               i->kdm.as_xml (out);
-       }
-}
-
-void
-write_kdm_zip_files (
-       shared_ptr<const Film> film,
-       list<shared_ptr<Screen> > screens,
-       boost::filesystem::path cpl,
-       dcp::LocalTime from,
-       dcp::LocalTime to,
-       dcp::Formulation formulation,
-       boost::filesystem::path directory
-       )
-{
-       list<CinemaKDMs> cinema_kdms = make_cinema_kdms (film, screens, cpl, from, to, formulation);
-
-       for (list<CinemaKDMs>::const_iterator i = cinema_kdms.begin(); i != cinema_kdms.end(); ++i) {
-               boost::filesystem::path path = directory;
-               path /= tidy_for_filename (i->cinema->name) + ".zip";
-               i->make_zip_file (film, path);
-       }
-}
-
-void
-email_kdms (
-       shared_ptr<const Film> film,
-       list<shared_ptr<Screen> > screens,
-       boost::filesystem::path cpl,
-       dcp::LocalTime from,
-       dcp::LocalTime to,
-       dcp::Formulation formulation
-       )
-{
-       list<CinemaKDMs> cinema_kdms = make_cinema_kdms (film, screens, cpl, from, to, formulation);
-
-       for (list<CinemaKDMs>::const_iterator i = cinema_kdms.begin(); i != cinema_kdms.end(); ++i) {
-
-               boost::filesystem::path zip_file = boost::filesystem::temp_directory_path ();
-               zip_file /= boost::filesystem::unique_path().string() + ".zip";
-               i->make_zip_file (film, zip_file);
-
-               /* Send email */
-
-               quickmail_initialize ();
-
-               SafeStringStream start;
-               start << from.date() << " " << from.time_of_day();
-               SafeStringStream end;
-               end << to.date() << " " << to.time_of_day();
-
-               string subject = Config::instance()->kdm_subject();
-               boost::algorithm::replace_all (subject, "$CPL_NAME", film->dcp_name ());
-               boost::algorithm::replace_all (subject, "$START_TIME", start.str ());
-               boost::algorithm::replace_all (subject, "$END_TIME", end.str ());
-               boost::algorithm::replace_all (subject, "$CINEMA_NAME", i->cinema->name);
-               quickmail mail = quickmail_create (Config::instance()->kdm_from().c_str(), subject.c_str ());
-
-               quickmail_add_to (mail, i->cinema->email.c_str ());
-               if (!Config::instance()->kdm_cc().empty ()) {
-                       quickmail_add_cc (mail, Config::instance()->kdm_cc().c_str ());
-               }
-               if (!Config::instance()->kdm_bcc().empty ()) {
-                       quickmail_add_bcc (mail, Config::instance()->kdm_bcc().c_str ());
-               }
-
-               string body = Config::instance()->kdm_email().c_str();
-               boost::algorithm::replace_all (body, "$CPL_NAME", film->dcp_name ());
-               boost::algorithm::replace_all (body, "$START_TIME", start.str ());
-               boost::algorithm::replace_all (body, "$END_TIME", end.str ());
-               boost::algorithm::replace_all (body, "$CINEMA_NAME", i->cinema->name);
-
-               SafeStringStream screens;
-               for (list<ScreenKDM>::const_iterator j = i->screen_kdms.begin(); j != i->screen_kdms.end(); ++j) {
-                       screens << j->screen->name << ", ";
-               }
-               boost::algorithm::replace_all (body, "$SCREENS", screens.str().substr (0, screens.str().length() - 2));
-
-               quickmail_set_body (mail, body.c_str());
-               quickmail_add_attachment_file (mail, zip_file.string().c_str(), "application/zip");
-
-               char const* error = quickmail_send (
-                       mail,
-                       Config::instance()->mail_server().c_str(),
-                       Config::instance()->mail_port(),
-                       Config::instance()->mail_user().c_str(),
-                       Config::instance()->mail_password().c_str()
-                       );
-
-               if (error) {
-                       quickmail_destroy (mail);
-                       throw KDMError (
-                               String::compose (
-                                       "Failed to send KDM email to %1 (%2)",
-                                       Config::instance()->mail_server(),
-                                       error
-                                       )
-                               );
-               }
-               quickmail_destroy (mail);
-       }
-}
diff --git a/src/lib/kdm.h b/src/lib/kdm.h
deleted file mode 100644 (file)
index c6962c1..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
-    Copyright (C) 2013 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 <dcp/local_time.h>
-#include <dcp/types.h>
-#include <boost/filesystem.hpp>
-
-class Screen;
-class Film;
-
-extern void write_kdm_files (
-       boost::shared_ptr<const Film> film,
-       std::list<boost::shared_ptr<Screen> > screens,
-       boost::filesystem::path cpl,
-       dcp::LocalTime from,
-       dcp::LocalTime to,
-       dcp::Formulation formulation,
-       boost::filesystem::path directory
-       );
-
-extern void write_kdm_zip_files (
-       boost::shared_ptr<const Film> film,
-       std::list<boost::shared_ptr<Screen> > screens,
-       boost::filesystem::path cpl,
-       dcp::LocalTime from,
-       dcp::LocalTime to,
-       dcp::Formulation formulation,
-       boost::filesystem::path directory
-       );
-
-extern void email_kdms (
-       boost::shared_ptr<const Film> film,
-       std::list<boost::shared_ptr<Screen> > screens,
-       boost::filesystem::path cpl,
-       dcp::LocalTime from,
-       dcp::LocalTime to,
-       dcp::Formulation formulation
-       );
diff --git a/src/lib/screen_kdm.cc b/src/lib/screen_kdm.cc
new file mode 100644 (file)
index 0000000..af0f0a3
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+    Copyright (C) 2013-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 "screen_kdm.h"
+#include "cinema.h"
+#include "screen.h"
+#include "film.h"
+#include "util.h"
+#include <boost/foreach.hpp>
+
+using std::string;
+using std::list;
+using boost::shared_ptr;
+
+bool
+operator== (ScreenKDM const & a, ScreenKDM const & b)
+{
+       return a.screen == b.screen && a.kdm == b.kdm;
+}
+
+string
+ScreenKDM::filename (shared_ptr<const Film> film) const
+{
+       return tidy_for_filename (film->name()) + "_" + tidy_for_filename (screen->cinema->name) + "_" + tidy_for_filename (screen->name) + ".kdm.xml";
+}
+
+list<ScreenKDM>
+ScreenKDM::collect (list<shared_ptr<Screen> > screens, list<dcp::EncryptedKDM> kdms)
+{
+       list<ScreenKDM> screen_kdms;
+
+       list<shared_ptr<Screen> >::iterator i = screens.begin ();
+       list<dcp::EncryptedKDM>::iterator j = kdms.begin ();
+       while (i != screens.end() && j != kdms.end ()) {
+               screen_kdms.push_back (ScreenKDM (*i, *j));
+               ++i;
+               ++j;
+       }
+
+       return screen_kdms;
+}
+
+void
+ScreenKDM::write_files (shared_ptr<const Film> film, list<ScreenKDM> screen_kdms, boost::filesystem::path directory)
+{
+       /* Write KDMs to the specified directory */
+       BOOST_FOREACH (ScreenKDM const & i, screen_kdms) {
+               boost::filesystem::path out = directory / i.filename(film);
+               i.kdm.as_xml (out);
+       }
+}
diff --git a/src/lib/screen_kdm.h b/src/lib/screen_kdm.h
new file mode 100644 (file)
index 0000000..510480c
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+    Copyright (C) 2013-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.
+
+*/
+
+#ifndef DCPOMATIC_SCREEN_KDM_H
+#define DCPOMATIC_SCREEN_KDM_H
+
+#include <dcp/encrypted_kdm.h>
+#include <boost/shared_ptr.hpp>
+
+class Screen;
+class Film;
+
+/** Simple class to collect a screen and an encrypted KDM */
+class ScreenKDM
+{
+public:
+       ScreenKDM (boost::shared_ptr<Screen> s, dcp::EncryptedKDM k)
+               : screen (s)
+               , kdm (k)
+       {}
+
+       std::string filename (boost::shared_ptr<const Film> film) const;
+
+       static std::list<ScreenKDM> collect (std::list<boost::shared_ptr<Screen> > screens, std::list<dcp::EncryptedKDM> kdms);
+       static void write_files (boost::shared_ptr<const Film> film, std::list<ScreenKDM> screen_kdms, boost::filesystem::path directory);
+
+       boost::shared_ptr<Screen> screen;
+       dcp::EncryptedKDM kdm;
+};
+
+extern bool operator== (ScreenKDM const & a, ScreenKDM const & b);
+
+#endif
index cddf424f4a4d8aec0a20de8af2828c64995fc281..926ff6ee8cdfaf293b3808d3902bce947a99ae2b 100644 (file)
@@ -20,7 +20,7 @@
 #include "send_kdm_email_job.h"
 #include "compose.hpp"
 #include "film.h"
 #include "send_kdm_email_job.h"
 #include "compose.hpp"
 #include "film.h"
-#include "kdm.h"
+#include "cinema_kdms.h"
 
 #include "i18n.h"
 
 
 #include "i18n.h"
 
@@ -31,14 +31,14 @@ using boost::shared_ptr;
 SendKDMEmailJob::SendKDMEmailJob (
        shared_ptr<const Film> film,
        list<shared_ptr<Screen> > screens,
 SendKDMEmailJob::SendKDMEmailJob (
        shared_ptr<const Film> film,
        list<shared_ptr<Screen> > screens,
-       boost::filesystem::path dcp,
+       boost::filesystem::path cpl,
        boost::posix_time::ptime from,
        boost::posix_time::ptime to,
        dcp::Formulation formulation
        )
        : Job (film)
        , _screens (screens)
        boost::posix_time::ptime from,
        boost::posix_time::ptime to,
        dcp::Formulation formulation
        )
        : Job (film)
        , _screens (screens)
-       , _dcp (dcp)
+       , _cpl (cpl)
        , _from (from)
        , _to (to)
        , _formulation (formulation)
        , _from (from)
        , _to (to)
        , _formulation (formulation)
@@ -64,7 +64,14 @@ SendKDMEmailJob::run ()
        try {
 
                set_progress_unknown ();
        try {
 
                set_progress_unknown ();
-               email_kdms (_film, _screens, _dcp, _from, _to, _formulation);
+
+               CinemaKDMs::email (
+                       _film,
+                       CinemaKDMs::collect (ScreenKDM::collect (_screens, _film->make_kdms (_screens, _cpl, _from, _to, _formulation))),
+                       _from,
+                       _to
+                       );
+
                set_progress (1);
                set_state (FINISHED_OK);
 
                set_progress (1);
                set_state (FINISHED_OK);
 
index 5226bb79744bfa6942c17bf4f48b7ab6154b73ef..c401ea136338edf1a95e176effc80f6f8a89de43 100644 (file)
@@ -41,7 +41,7 @@ public:
 
 private:
        std::list<boost::shared_ptr<Screen> > _screens;
 
 private:
        std::list<boost::shared_ptr<Screen> > _screens;
-       boost::filesystem::path _dcp;
+       boost::filesystem::path _cpl;
        boost::posix_time::ptime _from;
        boost::posix_time::ptime _to;
        dcp::Formulation _formulation;
        boost::posix_time::ptime _from;
        boost::posix_time::ptime _to;
        dcp::Formulation _formulation;
index d44746ba9a24517238422cde13a1712e0806f4d3..d897e997dfc35c491c5530d6fde75bc06ff66bff 100644 (file)
@@ -33,6 +33,7 @@ sources = """
           audio_processor.cc
           audio_stream.cc
           cinema.cc
           audio_processor.cc
           audio_stream.cc
           cinema.cc
+          cinema_kdms.cc
           cinema_sound_processor.cc
           colour_conversion.cc
           config.cc
           cinema_sound_processor.cc
           colour_conversion.cc
           config.cc
@@ -80,7 +81,6 @@ sources = """
           j2k_image_proxy.cc
           job.cc
           job_manager.cc
           j2k_image_proxy.cc
           job.cc
           job_manager.cc
-          kdm.cc
           json_server.cc
           log.cc
           magick_image_proxy.cc
           json_server.cc
           log.cc
           magick_image_proxy.cc
@@ -100,6 +100,7 @@ sources = """
           scoped_temporary.cc
           scp_uploader.cc
           screen.cc
           scoped_temporary.cc
           scp_uploader.cc
           screen.cc
+          screen_kdm.cc
           send_kdm_email_job.cc
           send_problem_report_job.cc
           server.cc
           send_kdm_email_job.cc
           send_problem_report_job.cc
           server.cc
index ac07e1785daf0cd16066be4872bbbe41992ade19..6e20dda9e074884cd6ae71e31110bee555daeb24 100644 (file)
@@ -46,7 +46,7 @@
 #include "lib/job_manager.h"
 #include "lib/exceptions.h"
 #include "lib/cinema.h"
 #include "lib/job_manager.h"
 #include "lib/exceptions.h"
 #include "lib/cinema.h"
-#include "lib/kdm.h"
+#include "lib/screen_kdm.h"
 #include "lib/send_kdm_email_job.h"
 #include "lib/server_finder.h"
 #include "lib/update_checker.h"
 #include "lib/send_kdm_email_job.h"
 #include "lib/server_finder.h"
 #include "lib/update_checker.h"
@@ -446,7 +446,11 @@ private:
 
                try {
                        if (d->write_to ()) {
 
                try {
                        if (d->write_to ()) {
-                               write_kdm_files (_film, d->screens (), d->cpl (), d->from (), d->until (), d->formulation (), d->directory ());
+                               ScreenKDM::write_files (
+                                       _film,
+                                       ScreenKDM::collect (d->screens(), _film->make_kdms (d->screens(), d->cpl(), d->from(), d->until(), d->formulation())),
+                                       d->directory()
+                                       );
                        } else {
                                JobManager::instance()->add (
                                        shared_ptr<Job> (new SendKDMEmailJob (_film, d->screens (), d->cpl (), d->from (), d->until (), d->formulation ()))
                        } else {
                                JobManager::instance()->add (
                                        shared_ptr<Job> (new SendKDMEmailJob (_film, d->screens (), d->cpl (), d->from (), d->until (), d->formulation ()))
index 67ba2db9a7165149e5c10821cfdb7cffb39a6680..cf28ec53f722efb5e0e0f76af50417021fe6211f 100644 (file)
  *  @brief Command-line program to generate KDMs.
  */
 
  *  @brief Command-line program to generate KDMs.
  */
 
-#include <getopt.h>
-#include <dcp/certificate.h>
 #include "lib/film.h"
 #include "lib/cinema.h"
 #include "lib/film.h"
 #include "lib/cinema.h"
-#include "lib/kdm.h"
+#include "lib/screen_kdm.h"
+#include "lib/cinema_kdms.h"
 #include "lib/config.h"
 #include "lib/exceptions.h"
 #include "lib/safe_stringstream.h"
 #include "lib/config.h"
 #include "lib/exceptions.h"
 #include "lib/safe_stringstream.h"
+#include <dcp/certificate.h>
+#include <getopt.h>
 #include <iostream>
 
 using std::string;
 #include <iostream>
 
 using std::string;
@@ -276,18 +277,19 @@ int main (int argc, char* argv[])
                }
 
                try {
                }
 
                try {
+                       list<ScreenKDM> screen_kdms = ScreenKDM::collect (
+                               (*i)->screens(),
+                               film->make_kdms ((*i)->screens(), cpl, dcp::LocalTime (valid_from.get()), dcp::LocalTime (valid_to.get()), formulation)
+                               );
+
                        if (zip) {
                        if (zip) {
-                               write_kdm_zip_files (
-                                       film, (*i)->screens(), cpl, dcp::LocalTime (valid_from.get()), dcp::LocalTime (valid_to.get()), formulation, output
-                                       );
+                               CinemaKDMs::write_zip_files (film, CinemaKDMs::collect (screen_kdms), output);
 
                                if (verbose) {
                                        cout << "Wrote ZIP files to " << output << "\n";
                                }
                        } else {
 
                                if (verbose) {
                                        cout << "Wrote ZIP files to " << output << "\n";
                                }
                        } else {
-                               write_kdm_files (
-                                       film, (*i)->screens(), cpl, dcp::LocalTime (valid_from.get()), dcp::LocalTime (valid_to.get()), formulation, output
-                                       );
+                               ScreenKDM::write_files (film, screen_kdms, output);
 
                                if (verbose) {
                                        cout << "Wrote KDM files to " << output << "\n";
 
                                if (verbose) {
                                        cout << "Wrote KDM files to " << output << "\n";
diff --git a/wscript b/wscript
index 7c1aae73b6d829c7e29172d4b9825cce94a8e66c..79116ff0366156b6cbfbc1269e9aee9362c1324d 100644 (file)
--- a/wscript
+++ b/wscript
@@ -501,7 +501,7 @@ def pot_merge(bld):
     bld.recurse('src')
 
 def tags(bld):
     bld.recurse('src')
 
 def tags(bld):
-    os.system('etags src/lib/*.cc src/lib/*.h src/wx/*.cc src/wx/*.h src/tools/*.cc src/tools/*.h')
+    os.system('etags src/lib/*.cc src/lib/*.h src/wx/*.cc src/wx/*.h src/tools/*.cc')
 
 def zanata_pull(bld):
     os.system('zanata-cli -B -q pull -t .')
 
 def zanata_pull(bld):
     os.system('zanata-cli -B -q pull -t .')