/** Collect a list of KDMWithMetadatas into a list of lists so that
- * each list contains the KDMs for one cinema.
+ * each list contains the KDMs for one list.
*/
list<list<KDMWithMetadataPtr> >
collect (list<KDMWithMetadataPtr> kdms)
list<list<KDMWithMetadataPtr> >::iterator j = grouped.begin ();
while (j != grouped.end()) {
- if (j->front()->cinema() == i->cinema()) {
+ if (j->front()->group() == i->group()) {
j->push_back (i);
break;
}
}
-/** Write one directory per cinema into another directory */
+/** Write one directory per list into another directory */
int
write_directories (
- list<list<KDMWithMetadataPtr> > cinema_kdms,
+ list<list<KDMWithMetadataPtr> > kdms,
boost::filesystem::path directory,
dcp::NameFormat container_name_format,
dcp::NameFormat filename_format,
{
int written = 0;
- BOOST_FOREACH (list<KDMWithMetadataPtr> const & i, cinema_kdms) {
+ BOOST_FOREACH (list<KDMWithMetadataPtr> const & i, kdms) {
boost::filesystem::path path = directory;
path /= container_name_format.get(i.front()->name_values(), "", "s");
if (!boost::filesystem::exists (path) || confirm_overwrite (path)) {
/** Write one ZIP file per cinema into a directory */
int
write_zip_files (
- list<list<KDMWithMetadataPtr> > cinema_kdms,
+ list<list<KDMWithMetadataPtr> > kdms,
boost::filesystem::path directory,
dcp::NameFormat container_name_format,
dcp::NameFormat filename_format,
{
int written = 0;
- BOOST_FOREACH (list<KDMWithMetadataPtr> const & i, cinema_kdms) {
+ BOOST_FOREACH (list<KDMWithMetadataPtr> const & i, kdms) {
boost::filesystem::path path = directory;
path /= container_name_format.get(i.front()->name_values(), ".zip", "s");
if (!boost::filesystem::exists (path) || confirm_overwrite (path)) {
/** Email one ZIP file per cinema to the cinema.
- * @param cinema_kdms KDMS to email.
+ * @param kdms KDMs to email.
* @param container_name_format Format of folder / ZIP to use.
* @param filename_format Format of filenames to use.
* @param name_values Values to substitute into \p container_name_format and \p filename_format.
*/
void
email (
- list<list<KDMWithMetadataPtr> > cinema_kdms,
+ list<list<KDMWithMetadataPtr> > kdms,
dcp::NameFormat container_name_format,
dcp::NameFormat filename_format,
string cpl_name
throw NetworkError (_("No mail server configured in preferences"));
}
- BOOST_FOREACH (list<KDMWithMetadataPtr> const & i, cinema_kdms) {
+ BOOST_FOREACH (list<KDMWithMetadataPtr> const & i, kdms) {
- if (i.front()->cinema()->emails.empty()) {
+ if (i.front()->emails().empty()) {
continue;
}
boost::algorithm::replace_all (subject, "$CPL_NAME", cpl_name);
boost::algorithm::replace_all (subject, "$START_TIME", i.front()->get('b').get_value_or(""));
boost::algorithm::replace_all (subject, "$END_TIME", i.front()->get('e').get_value_or(""));
- boost::algorithm::replace_all (subject, "$CINEMA_NAME", i.front()->cinema()->name);
+ boost::algorithm::replace_all (subject, "$CINEMA_NAME", i.front()->get('c').get_value_or(""));
string body = config->kdm_email().c_str();
boost::algorithm::replace_all (body, "$CPL_NAME", cpl_name);
boost::algorithm::replace_all (body, "$START_TIME", i.front()->get('b').get_value_or(""));
boost::algorithm::replace_all (body, "$END_TIME", i.front()->get('e').get_value_or(""));
- boost::algorithm::replace_all (body, "$CINEMA_NAME", i.front()->cinema()->name);
+ boost::algorithm::replace_all (body, "$CINEMA_NAME", i.front()->get('c').get_value_or(""));
string screens;
BOOST_FOREACH (KDMWithMetadataPtr j, i) {
}
boost::algorithm::replace_all (body, "$SCREENS", screens.substr (0, screens.length() - 2));
- Emailer email (config->kdm_from(), i.front()->cinema()->emails, subject, body);
+ Emailer email (config->kdm_from(), i.front()->emails(), subject, body);
BOOST_FOREACH (string i, config->kdm_cc()) {
email.add_cc (i);
class KDMWithMetadata
{
public:
- KDMWithMetadata (dcp::NameFormat::Map const& name_values, boost::shared_ptr<const Cinema> cinema)
+ KDMWithMetadata (dcp::NameFormat::Map const& name_values, void const* group, std::list<std::string> emails)
: _name_values (name_values)
- , _cinema (cinema)
+ , _group (group)
+ , _emails (emails)
{}
virtual ~KDMWithMetadata () {}
boost::optional<std::string> get (char k) const;
- boost::shared_ptr<const Cinema> cinema () const {
- return _cinema;
+ void const* group () const {
+ return _group;
+ }
+
+ std::list<std::string> emails () const {
+ return _emails;
}
private:
dcp::NameFormat::Map _name_values;
- boost::shared_ptr<const Cinema> _cinema;
+ void const* _group;
+ std::list<std::string> _emails;
};
int write_directories (
- std::list<std::list<KDMWithMetadataPtr> > cinema_kdms,
+ std::list<std::list<KDMWithMetadataPtr> > kdms,
boost::filesystem::path directory,
dcp::NameFormat container_name_format,
dcp::NameFormat filename_format,
int write_zip_files (
- std::list<std::list<KDMWithMetadataPtr> > cinema_kdms,
+ std::list<std::list<KDMWithMetadataPtr> > kdms,
boost::filesystem::path directory,
dcp::NameFormat container_name_format,
dcp::NameFormat filename_format,
void email (
- std::list<std::list<KDMWithMetadataPtr> > cinema_kdms,
+ std::list<std::list<KDMWithMetadataPtr> > kdms,
dcp::NameFormat container_name_format,
dcp::NameFormat filename_format,
std::string cpl_name
class SpecialKDMWithMetadata : public KDMWithMetadata
{
public:
- SpecialKDMWithMetadata (dcp::NameFormat::Map const& name_values, boost::shared_ptr<const Cinema> cinema, T k)
- : KDMWithMetadata (name_values, cinema)
+ SpecialKDMWithMetadata (dcp::NameFormat::Map const& name_values, void const* group, std::list<std::string> emails, T k)
+ : KDMWithMetadata (name_values, group, emails)
, kdm (k)
{}
using std::string;
using std::vector;
+using std::list;
using boost::shared_ptr;
using boost::optional;
using namespace dcpomatic;
name_values['e'] = end.date() + " " + end.time_of_day(true, false);
name_values['i'] = kdm.cpl_id();
- return KDMWithMetadataPtr(new DCPKDMWithMetadata(name_values, cinema, kdm));
+ return KDMWithMetadataPtr(new DCPKDMWithMetadata(name_values, cinema.get(), cinema ? cinema->emails : list<string>(), kdm));
}
using boost::shared_ptr;
using boost::optional;
+SendKDMEmailJob::SendKDMEmailJob (
+ list<KDMWithMetadataPtr> kdms,
+ dcp::NameFormat container_name_format,
+ dcp::NameFormat filename_format,
+ string cpl_name
+ )
+ : Job (shared_ptr<Film>())
+ , _container_name_format (container_name_format)
+ , _filename_format (filename_format)
+ , _cpl_name (cpl_name)
+{
+ BOOST_FOREACH (KDMWithMetadataPtr i, kdms) {
+ list<KDMWithMetadataPtr> s;
+ s.push_back (i);
+ _kdms.push_back (s);
+ }
+}
+
/** @param kdms KDMs to email.
* @param container_name_format Format to ues for folders / ZIP files.
* @param filename_format Format to use for filenames.
class SendKDMEmailJob : public Job
{
public:
+ SendKDMEmailJob (
+ std::list<KDMWithMetadataPtr> kdms,
+ dcp::NameFormat container_name_format,
+ dcp::NameFormat filename_format,
+ std::string cpl_name
+ );
+
SendKDMEmailJob (
std::list<std::list<KDMWithMetadataPtr> > kdms,
dcp::NameFormat container_name_format,
dcp::NameFormat filename_format,
std::string cpl_name
);
+
~SendKDMEmailJob ();
std::string name () const;
decoder_part.cc
decrypted_ecinema_kdm.cc
digester.cc
+ dkdm_recipient.cc
dkdm_wrapper.cc
dolby_cp750.cc
edid.cc
#include "wx/recreate_chain_dialog.h"
#include "wx/about_dialog.h"
#include "wx/kdm_dialog.h"
+#include "wx/dkdm_dialog.h"
#include "wx/self_dkdm_dialog.h"
#include "wx/servers_list_dialog.h"
#include "wx/hints_dialog.h"
ID_jobs_make_dcp,
ID_jobs_make_dcp_batch,
ID_jobs_make_kdms,
+ ID_jobs_make_dkdms,
ID_jobs_make_self_dkdm,
ID_jobs_export,
ID_jobs_send_dcp_to_tms,
, _servers_list_dialog (0)
, _config_dialog (0)
, _kdm_dialog (0)
+ , _dkdm_dialog (0)
, _templates_dialog (0)
, _file_menu (0)
, _history_items (0)
Bind (wxEVT_MENU, boost::bind (&DOMFrame::content_scale_to_fit_height, this), ID_content_scale_to_fit_height);
Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_make_dcp, this), ID_jobs_make_dcp);
Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_make_kdms, this), ID_jobs_make_kdms);
+ Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_make_dkdms, this), ID_jobs_make_dkdms);
Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_make_dcp_batch, this), ID_jobs_make_dcp_batch);
Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_make_self_dkdm, this), ID_jobs_make_self_dkdm);
Bind (wxEVT_MENU, boost::bind (&DOMFrame::jobs_export, this), ID_jobs_export);
_kdm_dialog->Show ();
}
+ void jobs_make_dkdms ()
+ {
+ if (!_film) {
+ return;
+ }
+
+ if (_dkdm_dialog) {
+ _dkdm_dialog->Destroy ();
+ _dkdm_dialog = 0;
+ }
+
+ _dkdm_dialog = new DKDMDialog (this, _film);
+ _dkdm_dialog->Show ();
+ }
+
/** @return false if we succeeded, true if not */
bool send_to_other_tool (int port, function<void(boost::filesystem::path)> start, string message)
{
add_item (jobs_menu, _("Make DCP in &batch converter\tCtrl-B"), ID_jobs_make_dcp_batch, NEEDS_FILM | NOT_DURING_DCP_CREATION);
jobs_menu->AppendSeparator ();
add_item (jobs_menu, _("Make &KDMs...\tCtrl-K"), ID_jobs_make_kdms, NEEDS_FILM);
+ add_item (jobs_menu, _("Make &DKDMs...\tCtrl-D"), ID_jobs_make_dkdms, NEEDS_FILM);
add_item (jobs_menu, _("Make DKDM for DCP-o-matic..."), ID_jobs_make_self_dkdm, NEEDS_FILM | NEEDS_ENCRYPTION);
jobs_menu->AppendSeparator ();
add_item (jobs_menu, _("Export...\tCtrl-E"), ID_jobs_export, NEEDS_FILM);
ServersListDialog* _servers_list_dialog;
wxPreferencesEditor* _config_dialog;
KDMDialog* _kdm_dialog;
+ DKDMDialog* _dkdm_dialog;
TemplatesDialog* _templates_dialog;
wxMenu* _file_menu;
shared_ptr<Film> _film;
/* Encrypt */
kdms.push_back (
KDMWithMetadataPtr(
- new DCPKDMWithMetadata(name_values, i->cinema, encrypted)
+ new DCPKDMWithMetadata(name_values, i->cinema.get(), i->cinema->emails, encrypted)
)
);
}
name_values['e'] = end.date() + " " + end.time_of_day(true, false);
name_values['i'] = kdm.cpl_id();
- kdms.push_back (KDMWithMetadataPtr(new DCPKDMWithMetadata(name_values, i->cinema, kdm)));
+ kdms.push_back (KDMWithMetadataPtr(new DCPKDMWithMetadata(name_values, i->cinema.get(), i->cinema->emails, kdm)));
}
write_files (kdms, zip, output, container_name_format, filename_format, verbose);
} catch (FileError& e) {
overall_sizer->Add (buttons, wxSizerFlags().Expand().DoubleBorder());
}
- _offsets.push_back (Offset (_("UTC-11"), -11, 0));
- _offsets.push_back (Offset (_("UTC-10"), -10, 0));
- _offsets.push_back (Offset (_("UTC-9"), -9, 0));
- _offsets.push_back (Offset (_("UTC-8"), -8, 0));
- _offsets.push_back (Offset (_("UTC-7"), -7, 0));
- _offsets.push_back (Offset (_("UTC-6"), -6, 0));
- _offsets.push_back (Offset (_("UTC-5"), -5, 0));
- _offsets.push_back (Offset (_("UTC-4:30"), -4, 30));
- _offsets.push_back (Offset (_("UTC-4"), -4, 0));
- _offsets.push_back (Offset (_("UTC-3:30"), -3, 30));
- _offsets.push_back (Offset (_("UTC-3"), -3, 0));
- _offsets.push_back (Offset (_("UTC-2"), -2, 0));
- _offsets.push_back (Offset (_("UTC-1"), -1, 0));
- _offsets.push_back (Offset (_("UTC") , 0, 0));
- _offsets.push_back (Offset (_("UTC+1"), 1, 0));
- _offsets.push_back (Offset (_("UTC+2"), 2, 0));
- _offsets.push_back (Offset (_("UTC+3"), 3, 0));
- _offsets.push_back (Offset (_("UTC+4"), 4, 0));
- _offsets.push_back (Offset (_("UTC+5"), 5, 0));
- _offsets.push_back (Offset (_("UTC+5:30"), 5, 30));
- _offsets.push_back (Offset (_("UTC+6"), 6, 0));
- _offsets.push_back (Offset (_("UTC+7"), 7, 0));
- _offsets.push_back (Offset (_("UTC+8"), 8, 0));
- _offsets.push_back (Offset (_("UTC+9"), 9, 0));
- _offsets.push_back (Offset (_("UTC+9:30"), 9, 30));
- _offsets.push_back (Offset (_("UTC+10"), 10, 0));
- _offsets.push_back (Offset (_("UTC+11"), 11, 0));
- _offsets.push_back (Offset (_("UTC+12"), 12, 0));
-
/* Default to UTC */
- size_t sel = 13;
+ size_t sel = get_offsets (_offsets);
for (size_t i = 0; i < _offsets.size(); ++i) {
_utc_offset->Append (_offsets[i].name);
if (_offsets[i].hour == utc_offset_hour && _offsets[i].minute == utc_offset_minute) {
EditableList<std::string, EmailDialog>* _email_list;
std::vector<std::string> _emails;
wxChoice* _utc_offset;
-
- struct Offset
- {
- Offset (wxString n, int h, int m)
- : name (n)
- , hour (h)
- , minute (m)
- {}
-
- wxString name;
- int hour;
- int minute;
- };
-
std::vector<Offset> _offsets;
};
, _forensic_mark_audio_up_to (12)
{
wxFlexGridSizer* table = new wxFlexGridSizer (2, DCPOMATIC_SIZER_X_GAP, 0);
+ table->AddGrowableCol (1);
add_label_to_sizer (table, this, _("KDM type"), true);
bool cinemas_with_no_email = false;
BOOST_FOREACH (list<KDMWithMetadataPtr> i, cinema_kdms) {
- if (i.front()->cinema()->emails.empty ()) {
+ if (i.front()->emails().empty()) {
cinemas_with_no_email = true;
}
}
if (proceed && Config::instance()->confirm_kdm_email ()) {
list<string> emails;
BOOST_FOREACH (list<KDMWithMetadataPtr> const& i, cinema_kdms) {
- BOOST_FOREACH (string j, i.front()->cinema()->emails) {
+ BOOST_FOREACH (string j, i.front()->emails()) {
emails.push_back (j);
}
}
dcp_panel.cc
dcpomatic_button.cc
disk_warning_dialog.cc
+ dkdm_output_panel.cc
drive_wipe_warning_dialog.cc
email_dialog.cc
image_sequence_dialog.cc
isdcf_metadata_dialog.cc
dcp_text_track_dialog.cc
dir_picker_ctrl.cc
+ dkdm_dialog.cc
dolby_doremi_certificate_panel.cc
download_certificate_dialog.cc
download_certificate_panel.cc
question_dialog.cc
rating_dialog.cc
qube_certificate_panel.cc
+ recipients_panel.cc
+ recipient_dialog.cc
recreate_chain_dialog.cc
repeat_dialog.cc
report_problem_dialog.cc
return ok;
}
+
+
+int
+get_offsets (vector<Offset>& offsets)
+{
+ offsets.push_back (Offset(_("UTC-11"), -11, 0));
+ offsets.push_back (Offset(_("UTC-10"), -10, 0));
+ offsets.push_back (Offset(_("UTC-9"), -9, 0));
+ offsets.push_back (Offset(_("UTC-8"), -8, 0));
+ offsets.push_back (Offset(_("UTC-7"), -7, 0));
+ offsets.push_back (Offset(_("UTC-6"), -6, 0));
+ offsets.push_back (Offset(_("UTC-5"), -5, 0));
+ offsets.push_back (Offset(_("UTC-4:30"), -4, 30));
+ offsets.push_back (Offset(_("UTC-4"), -4, 0));
+ offsets.push_back (Offset(_("UTC-3:30"), -3, 30));
+ offsets.push_back (Offset(_("UTC-3"), -3, 0));
+ offsets.push_back (Offset(_("UTC-2"), -2, 0));
+ offsets.push_back (Offset(_("UTC-1"), -1, 0));
+ int utc = offsets.size();
+ offsets.push_back (Offset(_("UTC") , 0, 0));
+ offsets.push_back (Offset(_("UTC+1"), 1, 0));
+ offsets.push_back (Offset(_("UTC+2"), 2, 0));
+ offsets.push_back (Offset(_("UTC+3"), 3, 0));
+ offsets.push_back (Offset(_("UTC+4"), 4, 0));
+ offsets.push_back (Offset(_("UTC+5"), 5, 0));
+ offsets.push_back (Offset(_("UTC+5:30"), 5, 30));
+ offsets.push_back (Offset(_("UTC+6"), 6, 0));
+ offsets.push_back (Offset(_("UTC+7"), 7, 0));
+ offsets.push_back (Offset(_("UTC+8"), 8, 0));
+ offsets.push_back (Offset(_("UTC+9"), 9, 0));
+ offsets.push_back (Offset(_("UTC+9:30"), 9, 30));
+ offsets.push_back (Offset(_("UTC+10"), 10, 0));
+ offsets.push_back (Offset(_("UTC+11"), 11, 0));
+ offsets.push_back (Offset(_("UTC+12"), 12, 0));
+
+ return utc;
+}
extern bool display_progress (wxString title, wxString task);
extern bool report_errors_from_last_job (wxWindow* parent);
+
+struct Offset
+{
+ Offset (wxString n, int h, int m)
+ : name (n)
+ , hour (h)
+ , minute (m)
+ {}
+
+ wxString name;
+ int hour;
+ int minute;
+};
+
+extern int get_offsets (std::vector<Offset>& offsets);
+
+
extern void checked_set (FilePickerCtrl* widget, boost::filesystem::path value);
extern void checked_set (wxDirPickerCtrl* widget, boost::filesystem::path value);
extern void checked_set (wxSpinCtrl* widget, int value);
boost::algorithm::replace_all (until_time, ":", "-");
path const base = "build/test/directory_kdm_naming_test";
- list<KDMWithMetadataPtr>::const_iterator i = kdms.begin ();
path dir_a = String::compose("Cinema_A_-_%s_-_my_great_film_-_%1_%2_-_%3_%4", from.date(), from_time, until.date(), until_time);
BOOST_CHECK_MESSAGE (boost::filesystem::exists(base / dir_a), "Directory " << dir_a << " not found");