#include "wx/file_dialog_wrapper.h"
#include "wx/new_dkdm_folder_dialog.h"
#include "wx/editable_list.h"
+#include "wx/static_text.h"
+#include "wx/dcpomatic_button.h"
#include "lib/config.h"
#include "lib/util.h"
#include "lib/screen.h"
class DOMFrame : public wxFrame
{
public:
- DOMFrame (wxString const & title)
+ explicit DOMFrame (wxString const & title)
: wxFrame (0, -1, title)
, _config_dialog (0)
, _job_view (0)
wxFont subheading_font (*wxNORMAL_FONT);
subheading_font.SetWeight (wxFONTWEIGHT_BOLD);
- wxStaticText* h = new wxStaticText (overall_panel, wxID_ANY, _("Screens"));
+ wxStaticText* h = new StaticText (overall_panel, _("Screens"));
h->SetFont (subheading_font);
left->Add (h, 0, wxALIGN_CENTER_VERTICAL | wxBOTTOM, DCPOMATIC_SIZER_Y_GAP);
_screens = new ScreensPanel (overall_panel);
left->Add (_screens, 1, wxEXPAND | wxBOTTOM, DCPOMATIC_SIZER_Y_GAP);
/// TRANSLATORS: translate the word "Timing" here; do not include the "KDM|" prefix
- h = new wxStaticText (overall_panel, wxID_ANY, S_("KDM|Timing"));
+ h = new StaticText (overall_panel, S_("KDM|Timing"));
h->SetFont (subheading_font);
right->Add (h, 0, wxALIGN_CENTER_VERTICAL, DCPOMATIC_SIZER_Y_GAP * 2);
_timing = new KDMTimingPanel (overall_panel);
right->Add (_timing, 0, wxALL, DCPOMATIC_SIZER_Y_GAP);
- h = new wxStaticText (overall_panel, wxID_ANY, _("DKDM"));
+ h = new StaticText (overall_panel, _("DKDM"));
h->SetFont (subheading_font);
right->Add (h, 0, wxALIGN_CENTER_VERTICAL | wxTOP, DCPOMATIC_SIZER_Y_GAP * 2);
wxBoxSizer* dkdm_sizer = new wxBoxSizer (wxHORIZONTAL);
);
dkdm_sizer->Add (_dkdm, 1, wxEXPAND | wxALL, DCPOMATIC_SIZER_Y_GAP);
wxBoxSizer* dkdm_buttons = new wxBoxSizer(wxVERTICAL);
- _add_dkdm = new wxButton (overall_panel, wxID_ANY, _("Add..."));
+ _add_dkdm = new Button (overall_panel, _("Add..."));
dkdm_buttons->Add (_add_dkdm, 0, wxALL | wxEXPAND, DCPOMATIC_BUTTON_STACK_GAP);
- _add_dkdm_folder = new wxButton (overall_panel, wxID_ANY, _("Add folder..."));
+ _add_dkdm_folder = new Button (overall_panel, _("Add folder..."));
dkdm_buttons->Add (_add_dkdm_folder, 0, wxALL | wxEXPAND, DCPOMATIC_BUTTON_STACK_GAP);
- _remove_dkdm = new wxButton (overall_panel, wxID_ANY, _("Remove"));
+ _remove_dkdm = new Button (overall_panel, _("Remove"));
dkdm_buttons->Add (_remove_dkdm, 0, wxALL | wxEXPAND, DCPOMATIC_BUTTON_STACK_GAP);
dkdm_sizer->Add (dkdm_buttons, 0, wxEXPAND | wxALL, DCPOMATIC_SIZER_GAP);
right->Add (dkdm_sizer, 1, wxEXPAND | wxALL, DCPOMATIC_SIZER_Y_GAP);
add_dkdm_view (Config::instance()->dkdms());
- h = new wxStaticText (overall_panel, wxID_ANY, _("Output"));
+ h = new StaticText (overall_panel, _("Output"));
h->SetFont (subheading_font);
right->Add (h, 0, wxALIGN_CENTER_VERTICAL | wxTOP, DCPOMATIC_SIZER_Y_GAP * 2);
/* XXX: hard-coded non-interop here */
_output = new KDMOutputPanel (overall_panel, false);
right->Add (_output, 0, wxALL, DCPOMATIC_SIZER_Y_GAP);
- _create = new wxButton (overall_panel, wxID_ANY, _("Create KDMs"));
+ _create = new Button (overall_panel, _("Create KDMs"));
right->Add (_create, 0, wxALL, DCPOMATIC_SIZER_GAP);
main_sizer->Add (horizontal, 1, wxALL | wxEXPAND, DCPOMATIC_DIALOG_BORDER);
}
/* Encrypt */
- screen_kdms.push_back (ScreenKDM (i, kdm.encrypt (signer, i->recipient.get(), i->trusted_devices, _output->formulation())));
+ screen_kdms.push_back (
+ ScreenKDM (
+ 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
+ )
+ )
+ );
}
pair<shared_ptr<Job>, int> result = _output->make (
- screen_kdms, decrypted.content_title_text(), _timing, bind (&DOMFrame::confirm_overwrite, this, _1), shared_ptr<Log> ()
+ screen_kdms, decrypted.content_title_text(), _timing, bind (&DOMFrame::confirm_overwrite, this, _1)
);
if (result.first) {
} catch (dcp::NotEncryptedError& e) {
error_dialog (this, _("CPL's content is not encrypted."));
} catch (exception& e) {
- error_dialog (this, e.what ());
+ error_dialog (this, std_to_wx(e.what()));
} catch (...) {
error_dialog (this, _("An unknown exception occurred."));
}
{
DKDMMap::iterator from = _dkdm_id.find (_dkdm->GetSelection ());
DKDMMap::iterator to = _dkdm_id.find (ev.GetItem ());
- if (from == _dkdm_id.end() || to == _dkdm_id.end()) {
+ if (from == _dkdm_id.end() || to == _dkdm_id.end() || from->first == to->first) {
return;
}
if (d->ShowModal() == wxID_OK) {
shared_ptr<DKDMBase> new_dkdm;
try {
- new_dkdm.reset (
- new DKDM (dcp::EncryptedKDM (dcp::file_to_string (wx_to_std (d->GetPath ()), MAX_KDM_SIZE)))
- );
+ 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<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);
} catch (dcp::KDMFormatError& e) {
error_dialog (
this,
- wxString::Format (
- _("Could not read file as a KDM. Perhaps it is badly formatted, or not a KDM at all.\n\n%s"),
- std_to_wx(e.what()).data()
- )
+ _("Could not read file as a KDM. Perhaps it is badly formatted, or not a KDM at all."),
+ std_to_wx(e.what())
);
return;
+ } catch (dcp::KDMDecryptionError) {
+ error_dialog (
+ this,
+ _("Could not decrypt the DKDM. Perhaps it was not created with the correct certificate.")
+ );
}
-
- 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 ();
}
}
catch (exception& e)
{
- error_dialog (0, wxString::Format ("DCP-o-matic could not start: %s", e.what ()));
+ error_dialog (0, _("DCP-o-matic could not start"), std_to_wx(e.what()));
return true;
}