Add a 'Make DKDM' dialogue box to simplify and (hopefully) clarify DKDM creation...
authorCarl Hetherington <cth@carlh.net>
Wed, 6 May 2020 22:00:40 +0000 (00:00 +0200)
committerCarl Hetherington <cth@carlh.net>
Wed, 6 May 2020 22:00:40 +0000 (00:00 +0200)
16 files changed:
src/lib/kdm_with_metadata.cc
src/lib/kdm_with_metadata.h
src/lib/screen.cc
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.cc
src/tools/dcpomatic_kdm_cli.cc
src/wx/cinema_dialog.cc
src/wx/cinema_dialog.h
src/wx/kdm_output_panel.cc
src/wx/wscript
src/wx/wx_util.cc
src/wx/wx_util.h
test/kdm_naming_test.cc

index 08b6dbbab19beb5795fae1fc8b9ec6f757f0c421..0ef1b8f380b1fc305366470b3278ce2be991c980 100644 (file)
@@ -103,7 +103,7 @@ make_zip_file (list<KDMWithMetadataPtr> kdms, boost::filesystem::path zip_file,
 
 
 /** 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)
@@ -115,7 +115,7 @@ 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;
                        }
@@ -132,10 +132,10 @@ collect (list<KDMWithMetadataPtr> kdms)
 }
 
 
-/** 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,
@@ -144,7 +144,7 @@ write_directories (
 {
        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)) {
@@ -161,7 +161,7 @@ write_directories (
 /** 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,
@@ -170,7 +170,7 @@ write_zip_files (
 {
        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)) {
@@ -188,7 +188,7 @@ write_zip_files (
 
 
 /** 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.
@@ -196,7 +196,7 @@ write_zip_files (
  */
 void
 email (
-       list<list<KDMWithMetadataPtr> > cinema_kdms,
+       list<list<KDMWithMetadataPtr> > kdms,
        dcp::NameFormat container_name_format,
        dcp::NameFormat filename_format,
        string cpl_name
@@ -208,9 +208,9 @@ email (
                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;
                }
 
@@ -223,13 +223,13 @@ email (
                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) {
@@ -240,7 +240,7 @@ email (
                }
                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);
index 6b9ff23c7ab3d5a22f16377474f78bb5c71e3bff..b6bec1c4c200693b5932619e9f0b7497ef9aa2c2 100644 (file)
@@ -33,9 +33,10 @@ class Cinema;
 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 () {}
@@ -49,13 +50,18 @@ public:
 
        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;
 };
 
 
@@ -75,7 +81,7 @@ std::list<std::list<KDMWithMetadataPtr> > collect (std::list<KDMWithMetadataPtr>
 
 
 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,
@@ -84,7 +90,7 @@ int write_directories (
 
 
 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,
@@ -93,7 +99,7 @@ int write_zip_files (
 
 
 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
@@ -104,8 +110,8 @@ template <class T>
 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)
        {}
 
index 2441efccbf7bbec1c40fac18875fb7f961134391..61a27f2bc46a2afe864e55acfb77f3fce7fc5af1 100644 (file)
@@ -29,6 +29,7 @@
 
 using std::string;
 using std::vector;
+using std::list;
 using boost::shared_ptr;
 using boost::optional;
 using namespace dcpomatic;
@@ -106,6 +107,6 @@ kdm_for_screen (
        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));
 }
 
index 18f686717d451c582c59e54136bf56829f66e788..55a1718114a2566c29ec6ad5680c0be174dfcb59 100644 (file)
@@ -31,6 +31,24 @@ using std::list;
 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.
index 452c76cee9060880c99ca6564cd1da564dd162ab..fa409edaaed9041793cb7f7c3f9f742cb1dad04f 100644 (file)
@@ -33,12 +33,20 @@ class Log;
 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;
index 828f0290bea339ec5b6d6e9c3a6c7b8a325034e4..0f2a5d1975d8feccef0548f218b2daf812e76d34 100644 (file)
@@ -77,6 +77,7 @@ sources = """
           decoder_part.cc
           decrypted_ecinema_kdm.cc
           digester.cc
+          dkdm_recipient.cc
           dkdm_wrapper.cc
           dolby_cp750.cc
           edid.cc
index 546286e48bbc20d95ce70e615d82a252fd26a614..f69ab5a6a5d7eefb73a05b414968790de62a1bcf 100644 (file)
@@ -33,6 +33,7 @@
 #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"
@@ -226,6 +227,7 @@ enum {
        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,
@@ -261,6 +263,7 @@ public:
                , _servers_list_dialog (0)
                , _config_dialog (0)
                , _kdm_dialog (0)
+               , _dkdm_dialog (0)
                , _templates_dialog (0)
                , _file_menu (0)
                , _history_items (0)
@@ -317,6 +320,7 @@ public:
                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);
@@ -796,6 +800,21 @@ private:
                _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)
        {
@@ -1313,6 +1332,7 @@ private:
                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);
@@ -1484,6 +1504,7 @@ private:
        ServersListDialog* _servers_list_dialog;
        wxPreferencesEditor* _config_dialog;
        KDMDialog* _kdm_dialog;
+       DKDMDialog* _dkdm_dialog;
        TemplatesDialog* _templates_dialog;
        wxMenu* _file_menu;
        shared_ptr<Film> _film;
index da856d3589af6246df58ee6f96c1eb70517c3548..117e756c72e93df587b325817fd181e9ec03f2f7 100644 (file)
@@ -398,7 +398,7 @@ private:
                                        /* Encrypt */
                                        kdms.push_back (
                                                KDMWithMetadataPtr(
-                                                       new DCPKDMWithMetadata(name_values, i->cinema, encrypted)
+                                                       new DCPKDMWithMetadata(name_values, i->cinema.get(), i->cinema->emails, encrypted)
                                                        )
                                                );
                                }
index a3075d6752ac2d7187eeb8cedbc3b2757bee7a3b..adb14f49e8bb588938f0a5d52c35cd659367346b 100644 (file)
@@ -350,7 +350,7 @@ from_dkdm (
                        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) {
index ff5d1faf61976b43ed4d0bc36853cbfcf3eba458..31e6ebe79d0612ff4fedf2b776468b188a0e9a62 100644 (file)
@@ -83,37 +83,8 @@ CinemaDialog::CinemaDialog (wxWindow* parent, wxString title, string name, list<
                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) {
index 9cb0a65dc151509c182b50df7752078ff3bf3195..d16b0ba9ce13d3f208b2060e2ac0ce8f78a8d8cb 100644 (file)
@@ -53,19 +53,5 @@ private:
        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;
 };
index f37865b94c76baaa578aceba8e9b8f965c84ecc8..a345d0e963b62ed37dc6acde857f80998f11bd87 100644 (file)
@@ -53,6 +53,7 @@ KDMOutputPanel::KDMOutputPanel (wxWindow* parent, bool interop)
        , _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);
 
@@ -200,7 +201,7 @@ KDMOutputPanel::make (
 
                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;
                        }
                }
@@ -215,7 +216,7 @@ KDMOutputPanel::make (
                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);
                                }
                        }
index f78a8c61762ba71fda5a59ebf19c63b2b42ad698..22d9f0db6a18938d045c6446feaa6f121a5630c8 100644 (file)
@@ -52,12 +52,14 @@ sources = """
           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
@@ -110,6 +112,8 @@ sources = """
           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
index 28f79431a5147171626e1b45b90d51630b4420c9..6eef0d14795020f0cab6481e76e98ba9687e6567 100644 (file)
@@ -530,3 +530,40 @@ display_progress (wxString title, wxString task)
 
        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;
+}
index af25ce0f5e1851ba1ca1fdcf086ff6564b3f10da..8e0befba92d606a4da09cb5302c3b691ea19c69d 100644 (file)
@@ -88,6 +88,23 @@ extern double calculate_mark_interval (double start);
 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);
index d45e4a44e7302c1d5e97e7670a3595bca6b77f48..35188d5e602c56cad17b5743e87f9f50599b4ff6 100644 (file)
@@ -191,7 +191,6 @@ BOOST_AUTO_TEST_CASE (directory_kdm_naming_test, * boost::unit_test::depends_on(
        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");