#include "lib/util.h"
#include "lib/screen.h"
#include "lib/job_manager.h"
-#include "lib/screen_kdm.h"
+#include "lib/kdm_with_metadata.h"
#include "lib/exceptions.h"
-#include "lib/cinema_kdms.h"
#include "lib/send_kdm_email_job.h"
#include "lib/compose.hpp"
#include "lib/cinema.h"
#include "lib/dkdm_wrapper.h"
#include "lib/cross.h"
+#ifdef DCPOMATIC_VARIANT_SWAROOP
+#include "lib/decrypted_ecinema_kdm.h"
+#endif
#include <dcp/encrypted_kdm.h>
#include <dcp/decrypted_kdm.h>
#include <dcp/exceptions.h>
if (!dkdm_base) {
return;
}
- shared_ptr<DKDM> dkdm = boost::dynamic_pointer_cast<DKDM> (dkdm_base);
- if (!dkdm) {
- return;
- }
-
- /* Decrypt the DKDM */
- dcp::DecryptedKDM decrypted (dkdm->dkdm(), Config::instance()->decryption_chain()->key().get());
- /* This is the signer for our new KDMs */
- shared_ptr<const dcp::CertificateChain> signer = Config::instance()->signer_chain ();
- if (!signer->valid ()) {
- throw InvalidSignerError ();
+ list<KDMWithMetadataPtr> kdms;
+ string title;
+
+#ifdef DCPOMATIC_VARIANT_SWAROOP
+ shared_ptr<ECinemaDKDM> ecinema_dkdm = boost::dynamic_pointer_cast<ECinemaDKDM> (dkdm_base);
+ if (ecinema_dkdm) {
+ DecryptedECinemaKDM decrypted (ecinema_dkdm->dkdm(), Config::instance()->decryption_chain()->key().get());
+ title = decrypted.name ();
+
+ BOOST_FOREACH (shared_ptr<Screen> i, _screens->screens()) {
+
+ if (!i->recipient) {
+ continue;
+ }
+
+ dcp::LocalTime begin(_timing->from(), i->cinema->utc_offset_hour(), i->cinema->utc_offset_minute());
+ dcp::LocalTime end(_timing->until(), i->cinema->utc_offset_hour(), i->cinema->utc_offset_minute());
+
+ DecryptedECinemaKDM kdm (
+ decrypted.id(),
+ decrypted.name(),
+ decrypted.key(),
+ begin,
+ end
+ );
+
+ dcp::NameFormat::Map name_values;
+ name_values['c'] = i->cinema->name;
+ name_values['s'] = i->name;
+ name_values['f'] = title;
+ name_values['b'] = begin.date() + " " + begin.time_of_day(true, false);
+ name_values['e'] = end.date() + " " + end.time_of_day(true, false);
+ name_values['i'] = kdm.id();
+
+ /* Encrypt */
+ kdms.push_back (
+ KDMWithMetadataPtr(
+ new ECinemaKDMWithMetadata(name_values, i->cinema, kdm.encrypt(i->recipient.get()))
+ )
+ );
+ }
}
+#endif
- list<shared_ptr<ScreenKDM> > screen_kdms;
- BOOST_FOREACH (shared_ptr<Screen> i, _screens->screens()) {
-
- if (!i->recipient) {
- continue;
- }
+ shared_ptr<DKDM> dkdm = boost::dynamic_pointer_cast<DKDM> (dkdm_base);
+ if (dkdm) {
- /* Make an empty KDM */
- dcp::DecryptedKDM kdm (
- dcp::LocalTime (_timing->from(), i->cinema->utc_offset_hour(), i->cinema->utc_offset_minute()),
- dcp::LocalTime (_timing->until(), i->cinema->utc_offset_hour(), i->cinema->utc_offset_minute()),
- decrypted.annotation_text().get_value_or (""),
- decrypted.content_title_text(),
- dcp::LocalTime().as_string()
- );
+ /* Decrypt the DKDM */
+ dcp::DecryptedKDM decrypted (dkdm->dkdm(), Config::instance()->decryption_chain()->key().get());
+ title = decrypted.content_title_text ();
- /* Add keys from the DKDM */
- BOOST_FOREACH (dcp::DecryptedKDMKey const & j, decrypted.keys()) {
- kdm.add_key (j);
+ /* This is the signer for our new KDMs */
+ shared_ptr<const dcp::CertificateChain> signer = Config::instance()->signer_chain ();
+ if (!signer->valid ()) {
+ throw InvalidSignerError ();
}
- /* Encrypt */
- screen_kdms.push_back (
- shared_ptr<ScreenKDM>(
- new DCPScreenKDM(
- i,
- kdm.encrypt(
- signer, i->recipient.get(), i->trusted_device_thumbprints(), _output->formulation(),
- !_output->forensic_mark_video(), _output->forensic_mark_audio() ? boost::optional<int>() : 0
- )
+ BOOST_FOREACH (shared_ptr<Screen> i, _screens->screens()) {
+
+ if (!i->recipient) {
+ continue;
+ }
+
+ dcp::LocalTime begin(_timing->from(), i->cinema->utc_offset_hour(), i->cinema->utc_offset_minute());
+ dcp::LocalTime end(_timing->until(), i->cinema->utc_offset_hour(), i->cinema->utc_offset_minute());
+
+ /* Make an empty KDM */
+ dcp::DecryptedKDM kdm (
+ begin,
+ end,
+ decrypted.annotation_text().get_value_or (""),
+ decrypted.content_title_text(),
+ dcp::LocalTime().as_string()
+ );
+
+ /* Add keys from the DKDM */
+ BOOST_FOREACH (dcp::DecryptedKDMKey const & j, decrypted.keys()) {
+ kdm.add_key (j);
+ }
+
+ dcp::EncryptedKDM const encrypted = kdm.encrypt(
+ signer, i->recipient.get(), i->trusted_device_thumbprints(), _output->formulation(),
+ !_output->forensic_mark_video(), _output->forensic_mark_audio() ? boost::optional<int>() : 0
+ );
+
+ dcp::NameFormat::Map name_values;
+ name_values['c'] = i->cinema->name;
+ name_values['s'] = i->name;
+ name_values['f'] = title;
+ name_values['b'] = begin.date() + " " + begin.time_of_day(true, false);
+ name_values['e'] = end.date() + " " + end.time_of_day(true, false);
+ name_values['i'] = encrypted.cpl_id ();
+
+ /* Encrypt */
+ kdms.push_back (
+ KDMWithMetadataPtr(
+ new DCPKDMWithMetadata(name_values, i->cinema, encrypted)
)
- )
- );
+ );
+ }
+ }
+
+ if (kdms.empty()) {
+ return;
}
pair<shared_ptr<Job>, int> result = _output->make (
- screen_kdms, decrypted.content_title_text(), _timing, bind (&DOMFrame::confirm_overwrite, this, _1)
+ kdms, title, bind (&DOMFrame::confirm_overwrite, this, _1)
);
if (result.first) {
{
wxFileDialog* d = new wxFileDialog (this, _("Select DKDM file"));
if (d->ShowModal() == wxID_OK) {
- shared_ptr<DKDMBase> new_dkdm;
+ shared_ptr<const dcp::CertificateChain> chain = Config::instance()->decryption_chain();
+ DCPOMATIC_ASSERT (chain->key());
+
+#ifdef DCPOMATIC_VARIANT_SWAROOP
try {
- dcp::EncryptedKDM ekdm(dcp::file_to_string (wx_to_std (d->GetPath ()), MAX_KDM_SIZE));
+ cxml::Document test_doc;
+ string const xml_string = dcp::file_to_string (wx_to_std(d->GetPath()), MAX_KDM_SIZE);
+ test_doc.read_string (xml_string);
+ if (test_doc.root_name() == "ECinemaSecurityMessage") {
+ EncryptedECinemaKDM ekdm(xml_string);
+ /* Decrypt the DKDM to make sure that we can */
+ DecryptedECinemaKDM dkdm(ekdm, chain->key().get());
+
+ shared_ptr<DKDMBase> new_dkdm(new ECinemaDKDM(ekdm));
+ shared_ptr<DKDMGroup> group = dynamic_pointer_cast<DKDMGroup> (selected_dkdm());
+ if (!group) {
+ group = Config::instance()->dkdms();
+ }
+ add_dkdm_model (new_dkdm, group);
+ add_dkdm_view (new_dkdm);
+ d->Destroy ();
+ return;
+ }
+ } catch (KDMError& e) {
+ error_dialog (
+ this, "Could not read file as a KDM. Perhaps it is badly formatted, created with the wrong certificate, or not a KDM at all.",
+ std_to_wx(e.what())
+ );
+ d->Destroy ();
+ return;
+ } catch (dcp::MiscError& e) {
+ error_dialog (
+ this,
+ _("Could not read file as a KDM. It is much too large. Make sure you are loading a DKDM (XML) file."),
+ std_to_wx(e.what())
+ );
+ d->Destroy ();
+ return;
+ }
+#endif
+ try {
+ dcp::EncryptedKDM ekdm(dcp::file_to_string (wx_to_std (d->GetPath ()), MAX_KDM_SIZE));
/* Decrypt the DKDM to make sure that we can */
- shared_ptr<const dcp::CertificateChain> chain = Config::instance()->decryption_chain();
- DCPOMATIC_ASSERT (chain->key());
dcp::DecryptedKDM dkdm(ekdm, chain->key().get());
- new_dkdm.reset(new DKDM(ekdm));
+ shared_ptr<DKDMBase> new_dkdm(new DKDM(ekdm));
shared_ptr<DKDMGroup> group = dynamic_pointer_cast<DKDMGroup> (selected_dkdm ());
if (!group) {
group = Config::instance()->dkdms ();