Use more ScopeGuards.
authorCarl Hetherington <cth@carlh.net>
Fri, 13 Jan 2023 12:57:28 +0000 (13:57 +0100)
committerCarl Hetherington <cth@carlh.net>
Fri, 13 Jan 2023 23:42:39 +0000 (00:42 +0100)
src/tools/dcpomatic.cc
src/tools/dcpomatic_batch.cc
src/tools/dcpomatic_kdm.cc
src/wx/config_dialog.cc
src/wx/content_panel.cc
src/wx/controls.cc
src/wx/editable_list.h
src/wx/language_tag_widget.cc
src/wx/screen_dialog.cc
src/wx/text_panel.cc

index 5ff04de228bd0611092a8b9610c2b58bee113b4c..257bb7ab199b9d0596d49c3f577041ad69dc74e9 100644 (file)
@@ -80,6 +80,7 @@
 #include "lib/log.h"
 #include "lib/make_dcp.h"
 #include "lib/release_notes.h"
+#include "lib/scope_guard.h"
 #include "lib/screen.h"
 #include "lib/send_kdm_email_job.h"
 #include "lib/signal_manager.h"
@@ -577,36 +578,37 @@ private:
        void file_new ()
        {
                auto d = new FilmNameLocationDialog (this, _("New Film"), true);
+               ScopeGuard sg = [d]() { d->Destroy(); };
                int const r = d->ShowModal ();
 
-               if (r == wxID_OK && d->check_path() && maybe_save_then_delete_film<FilmChangedClosingDialog>()) {
-                       try {
-                               new_film (d->path(), d->template_name());
-                       } catch (boost::filesystem::filesystem_error& e) {
+               if (r != wxID_OK || !d->check_path() || !maybe_save_then_delete_film<FilmChangedClosingDialog>()) {
+                       return;
+               }
+
+               try {
+                       new_film (d->path(), d->template_name());
+               } catch (boost::filesystem::filesystem_error& e) {
 #ifdef DCPOMATIC_WINDOWS
-                               string bad_chars = "<>:\"/|?*";
-                               string const filename = d->path().filename().string();
-                               string found_bad_chars;
-                               for (size_t i = 0; i < bad_chars.length(); ++i) {
-                                       if (filename.find(bad_chars[i]) != string::npos && found_bad_chars.find(bad_chars[i]) == string::npos) {
-                                               found_bad_chars += bad_chars[i];
-                                       }
+                       string bad_chars = "<>:\"/|?*";
+                       string const filename = d->path().filename().string();
+                       string found_bad_chars;
+                       for (size_t i = 0; i < bad_chars.length(); ++i) {
+                               if (filename.find(bad_chars[i]) != string::npos && found_bad_chars.find(bad_chars[i]) == string::npos) {
+                                       found_bad_chars += bad_chars[i];
                                }
-                               wxString message = _("Could not create folder to store film.");
-                               message += "  ";
-                               if (!found_bad_chars.empty()) {
-                                       message += wxString::Format (_("Try removing the %s characters from your folder name."), std_to_wx(found_bad_chars).data());
-                               } else {
-                                       message += _("Please check that you do not have Windows controlled folder access enabled for DCP-o-matic.");
-                               }
-                               error_dialog (this, message, std_to_wx(e.what()));
+                       }
+                       wxString message = _("Could not create folder to store film.");
+                       message += "  ";
+                       if (!found_bad_chars.empty()) {
+                               message += wxString::Format (_("Try removing the %s characters from your folder name."), std_to_wx(found_bad_chars).data());
+                       } else {
+                               message += _("Please check that you do not have Windows controlled folder access enabled for DCP-o-matic.");
+                       }
+                       error_dialog (this, message, std_to_wx(e.what()));
 #else
-                               error_dialog (this, _("Could not create folder to store film."), std_to_wx(e.what()));
+                       error_dialog (this, _("Could not create folder to store film."), std_to_wx(e.what()));
 #endif
-                       }
                }
-
-               d->Destroy ();
        }
 
        void file_open ()
@@ -617,6 +619,7 @@ private:
                        std_to_wx (Config::instance()->default_directory_or (wx_to_std (wxStandardPaths::Get().GetDocumentsDir())).string ()),
                        wxDEFAULT_DIALOG_STYLE | wxDD_DIR_MUST_EXIST
                        );
+               ScopeGuard sg = [c]() { c->Destroy(); };
 
                int r;
                while (true) {
@@ -631,8 +634,6 @@ private:
                if (r == wxID_OK && maybe_save_then_delete_film<FilmChangedClosingDialog>()) {
                        load_film (wx_to_std (c->GetPath ()));
                }
-
-               c->Destroy ();
        }
 
        void file_save ()
@@ -643,42 +644,37 @@ private:
        void file_save_as_template ()
        {
                auto d = new SaveTemplateDialog (this);
-               int const r = d->ShowModal ();
-               if (r == wxID_OK) {
+               ScopeGuard sg = [d]() { d->Destroy(); };
+               if (d->ShowModal() == wxID_OK) {
                        Config::instance()->save_template (_film, d->name ());
                }
-               d->Destroy ();
        }
 
        void file_duplicate ()
        {
                auto d = new FilmNameLocationDialog (this, _("Duplicate Film"), false);
-               int const r = d->ShowModal ();
+               ScopeGuard sg = [d]() { d->Destroy(); };
 
-               if (r == wxID_OK && d->check_path() && maybe_save_film<FilmChangedDuplicatingDialog>()) {
+               if (d->ShowModal() == wxID_OK && d->check_path() && maybe_save_film<FilmChangedDuplicatingDialog>()) {
                        shared_ptr<Film> film (new Film (d->path()));
                        film->copy_from (_film);
                        film->set_name (d->path().filename().generic_string());
                        film->write_metadata ();
                }
-
-               d->Destroy ();
        }
 
        void file_duplicate_and_open ()
        {
                auto d = new FilmNameLocationDialog (this, _("Duplicate Film"), false);
-               int const r = d->ShowModal ();
+               ScopeGuard sg = [d]() { d->Destroy(); };
 
-               if (r == wxID_OK && d->check_path() && maybe_save_film<FilmChangedDuplicatingDialog>()) {
+               if (d->ShowModal() == wxID_OK && d->check_path() && maybe_save_film<FilmChangedDuplicatingDialog>()) {
                        shared_ptr<Film> film (new Film (d->path()));
                        film->copy_from (_film);
                        film->set_name (d->path().filename().generic_string());
                        film->write_metadata ();
                        set_film (film);
                }
-
-               d->Destroy ();
        }
 
        void file_close ()
@@ -733,29 +729,31 @@ private:
                DCPOMATIC_ASSERT (_clipboard);
 
                auto d = new PasteDialog (this, static_cast<bool>(_clipboard->video), static_cast<bool>(_clipboard->audio), !_clipboard->text.empty());
-               if (d->ShowModal() == wxID_OK) {
-                       for (auto i: _film_editor->content_panel()->selected()) {
-                               if (d->video() && i->video) {
-                                       DCPOMATIC_ASSERT (_clipboard->video);
-                                       i->video->take_settings_from (_clipboard->video);
-                               }
-                               if (d->audio() && i->audio) {
-                                       DCPOMATIC_ASSERT (_clipboard->audio);
-                                       i->audio->take_settings_from (_clipboard->audio);
-                               }
+               ScopeGuard sg = [d]() { d->Destroy(); };
+               if (d->ShowModal() != wxID_OK) {
+                       return;
+               }
 
-                               if (d->text()) {
-                                       auto j = i->text.begin ();
-                                       auto k = _clipboard->text.begin ();
-                                       while (j != i->text.end() && k != _clipboard->text.end()) {
-                                               (*j)->take_settings_from (*k);
-                                               ++j;
-                                               ++k;
-                                       }
+               for (auto i: _film_editor->content_panel()->selected()) {
+                       if (d->video() && i->video) {
+                               DCPOMATIC_ASSERT (_clipboard->video);
+                               i->video->take_settings_from (_clipboard->video);
+                       }
+                       if (d->audio() && i->audio) {
+                               DCPOMATIC_ASSERT (_clipboard->audio);
+                               i->audio->take_settings_from (_clipboard->audio);
+                       }
+
+                       if (d->text()) {
+                               auto j = i->text.begin ();
+                               auto k = _clipboard->text.begin ();
+                               while (j != i->text.end() && k != _clipboard->text.end()) {
+                                       (*j)->take_settings_from (*k);
+                                       ++j;
+                                       ++k;
                                }
                        }
                }
-               d->Destroy ();
        }
 
        void edit_select_all ()
@@ -779,11 +777,9 @@ private:
                        _("Restore default preferences"),
                        wxYES_NO | wxYES_DEFAULT | wxICON_QUESTION
                        );
+               ScopeGuard sg = [d]() { d->Destroy(); };
 
-               int const r = d->ShowModal ();
-               d->Destroy ();
-
-               if (r == wxID_YES) {
+               if (d->ShowModal() == wxID_YES) {
                        Config::restore_defaults ();
                }
        }
@@ -794,11 +790,9 @@ private:
                        this, _("Specify ZIP file"), wxEmptyString, wxT("dcpomatic_config.zip"), wxT("ZIP files (*.zip)|*.zip"),
                        wxFD_SAVE | wxFD_OVERWRITE_PROMPT
                        );
+               ScopeGuard sg = [dialog]() { dialog->Destroy(); };
 
-               int const r = dialog->ShowModal ();
-               dialog->Destroy ();
-
-               if (r == wxID_OK) {
+               if (dialog->ShowModal() == wxID_OK) {
                        save_all_config_as_zip (wx_to_std(dialog->GetPath()));
                }
        }
@@ -823,9 +817,8 @@ private:
 
                if (Config::instance()->show_hints_before_make_dcp()) {
                        auto hints = new HintsDialog (this, _film, false);
-                       int const r = hints->ShowModal();
-                       hints->Destroy ();
-                       if (r == wxID_CANCEL) {
+                       ScopeGuard sg = [hints]() { hints->Destroy(); };
+                       if (hints->ShowModal() == wxID_CANCEL) {
                                return;
                        }
                }
@@ -937,9 +930,8 @@ private:
 
                if (Config::instance()->show_hints_before_make_dcp()) {
                        auto hints = new HintsDialog (this, _film, false);
-                       int const r = hints->ShowModal();
-                       hints->Destroy ();
-                       if (r == wxID_CANCEL) {
+                       ScopeGuard sg = [hints]() { hints->Destroy(); };
+                       if (hints->ShowModal() == wxID_CANCEL) {
                                return;
                        }
                }
@@ -977,8 +969,8 @@ private:
                }
 
                auto d = new SelfDKDMDialog (this, _film);
+               ScopeGuard sg = [d]() { d->Destroy(); };
                if (d->ShowModal () != wxID_OK) {
-                       d->Destroy ();
                        return;
                }
 
@@ -1028,49 +1020,49 @@ private:
                                kdm->as_xml (path);
                        }
                }
-
-               d->Destroy ();
        }
 
 
        void jobs_export_video_file ()
        {
                auto d = new ExportVideoFileDialog (this, _film->isdcf_name(true));
-               if (d->ShowModal() == wxID_OK) {
-                       if (boost::filesystem::exists(d->path())) {
-                               bool ok = confirm_dialog(
-                                               this,
-                                               wxString::Format (_("File %s already exists.  Do you want to overwrite it?"), std_to_wx(d->path().string()).data())
-                                               );
-
-                               if (!ok) {
-                                       d->Destroy ();
-                                       return;
-                               }
-                       }
+               ScopeGuard sg = [d]() { d->Destroy(); };
+               if (d->ShowModal() != wxID_OK) {
+                       return;
+               }
 
-                       auto job = make_shared<TranscodeJob>(_film, TranscodeJob::ChangedBehaviour::EXAMINE_THEN_STOP);
-                       job->set_encoder (
-                               make_shared<FFmpegEncoder> (
-                                       _film, job, d->path(), d->format(), d->mixdown_to_stereo(), d->split_reels(), d->split_streams(), d->x264_crf())
-                               );
-                       JobManager::instance()->add (job);
+               if (boost::filesystem::exists(d->path())) {
+                       bool ok = confirm_dialog(
+                                       this,
+                                       wxString::Format (_("File %s already exists.  Do you want to overwrite it?"), std_to_wx(d->path().string()).data())
+                                       );
+
+                       if (!ok) {
+                               return;
+                       }
                }
-               d->Destroy ();
+
+               auto job = make_shared<TranscodeJob>(_film, TranscodeJob::ChangedBehaviour::EXAMINE_THEN_STOP);
+               job->set_encoder (
+                       make_shared<FFmpegEncoder> (
+                               _film, job, d->path(), d->format(), d->mixdown_to_stereo(), d->split_reels(), d->split_streams(), d->x264_crf())
+                       );
+               JobManager::instance()->add (job);
        }
 
 
        void jobs_export_subtitles ()
        {
                auto d = new ExportSubtitlesDialog (this, _film->reels().size(), _film->interop());
-               if (d->ShowModal() == wxID_OK) {
-                       auto job = make_shared<TranscodeJob>(_film, TranscodeJob::ChangedBehaviour::EXAMINE_THEN_STOP);
-                       job->set_encoder (
-                               make_shared<SubtitleEncoder>(_film, job, d->path(), _film->isdcf_name(true), d->split_reels(), d->include_font())
-                               );
-                       JobManager::instance()->add (job);
+               ScopeGuard sg = [d]() { d->Destroy(); };
+               if (d->ShowModal() != wxID_OK) {
+                       return;
                }
-               d->Destroy ();
+               auto job = make_shared<TranscodeJob>(_film, TranscodeJob::ChangedBehaviour::EXAMINE_THEN_STOP);
+               job->set_encoder(
+                       make_shared<SubtitleEncoder>(_film, job, d->path(), _film->isdcf_name(true), d->split_reels(), d->include_font())
+                       );
+               JobManager::instance()->add(job);
        }
 
 
@@ -1146,6 +1138,7 @@ private:
        void tools_send_translations ()
        {
                auto d = new SendI18NDialog (this);
+               ScopeGuard sg = [d]() { d->Destroy(); };
                if (d->ShowModal() == wxID_OK) {
                        string body;
                        body += d->name() + "\n";
@@ -1169,24 +1162,22 @@ private:
                                }
                        }
                }
-
-               d->Destroy ();
        }
 
        void help_about ()
        {
                auto d = new AboutDialog (this);
+               ScopeGuard sg = [d]() { d->Destroy(); };
                d->ShowModal ();
-               d->Destroy ();
        }
 
        void help_report_a_problem ()
        {
                auto d = new ReportProblemDialog (this, _film);
+               ScopeGuard sg = [d]() { d->Destroy(); };
                if (d->ShowModal () == wxID_OK) {
                        d->report ();
                }
-               d->Destroy ();
        }
 
        bool should_close ()
@@ -1201,10 +1192,9 @@ private:
                        _("Unfinished jobs"),
                        wxYES_NO | wxYES_DEFAULT | wxICON_QUESTION
                        );
+               ScopeGuard sg = [d]() { d->Destroy(); };
 
-               bool const r = d->ShowModal() == wxID_YES;
-               d->Destroy ();
-               return r;
+               return d->ShowModal() == wxID_YES;
        }
 
        void close (wxCloseEvent& ev)
@@ -1540,8 +1530,8 @@ private:
 
                if (uc->state() == UpdateChecker::State::YES) {
                        auto dialog = new UpdateDialog (this, uc->stable(), uc->test());
+                       ScopeGuard sg = [dialog]() { dialog->Destroy(); };
                        dialog->ShowModal ();
-                       dialog->Destroy ();
                } else if (uc->state() == UpdateChecker::State::FAILED) {
                        error_dialog (this, _("The DCP-o-matic download server could not be contacted."));
                } else {
@@ -1578,8 +1568,8 @@ private:
        void analytics_message (string title, string html)
        {
                auto d = new HTMLDialog(this, std_to_wx(title), std_to_wx(html));
+               ScopeGuard sg = [d]() { d->Destroy(); };
                d->ShowModal();
-               d->Destroy();
        }
 
        void set_title ()
@@ -1749,9 +1739,9 @@ private:
                        auto release_notes = find_release_notes(gui_is_dark());
                        if (release_notes) {
                                auto notes = new HTMLDialog(nullptr, _("Release notes"), std_to_wx(*release_notes), true);
+                               ScopeGuard sg = [notes]() { notes->Destroy(); };
                                notes->Centre();
                                notes->ShowModal();
-                               notes->Destroy();
                        }
                }
                catch (exception& e)
@@ -1873,7 +1863,7 @@ private:
        {
                if (_splash) {
                        _splash->Destroy ();
-                       _splash = 0;
+                       _splash = nullptr;
                }
        }
 
@@ -1910,9 +1900,8 @@ private:
                                _("Do nothing"),
                                Config::NAG_BAD_SIGNER_CHAIN_UTF8
                                );
-                       int const r = d->ShowModal ();
-                       d->Destroy ();
-                       return r == wxID_OK;
+                       ScopeGuard sg = [d]() { d->Destroy(); };
+                       return d->ShowModal() == wxID_OK;
                }
                case Config::BAD_SIGNER_VALIDITY_TOO_LONG:
                {
@@ -1927,9 +1916,8 @@ private:
                                _("Do nothing"),
                                Config::NAG_BAD_SIGNER_CHAIN_VALIDITY
                                );
-                       int const r = d->ShowModal ();
-                       d->Destroy ();
-                       return r == wxID_OK;
+                       ScopeGuard sg = [d]() { d->Destroy(); };
+                       return d->ShowModal() == wxID_OK;
                }
                case Config::BAD_SIGNER_INCONSISTENT:
                {
@@ -1940,9 +1928,8 @@ private:
                                  "the certificate chain for signing DCPs and KDMs?"),
                                _("Close DCP-o-matic")
                                );
-                       int const r = d->ShowModal ();
-                       d->Destroy ();
-                       if (r != wxID_OK) {
+                       ScopeGuard sg = [d]() { d->Destroy(); };
+                       if (d->ShowModal() != wxID_OK) {
                                exit (EXIT_FAILURE);
                        }
                        return true;
@@ -1957,9 +1944,8 @@ private:
                                  "configuration before continuing."),
                                _("Close DCP-o-matic")
                                );
-                       int const r = d->ShowModal ();
-                       d->Destroy ();
-                       if (r != wxID_OK) {
+                       ScopeGuard sg = [d]() { d->Destroy(); };
+                       if (d->ShowModal() != wxID_OK) {
                                exit (EXIT_FAILURE);
                        }
                        return true;
index a2db604df15ebfae89d92fd66cac4730cfd450cd..64015a0e30179faa7a0dd7b78bf05a2109dc2e21 100644 (file)
@@ -33,6 +33,7 @@
 #include "lib/job.h"
 #include "lib/job_manager.h"
 #include "lib/make_dcp.h"
+#include "lib/scope_guard.h"
 #include "lib/transcode_job.h"
 #include "lib/util.h"
 #include "lib/version.h"
@@ -274,10 +275,9 @@ private:
                        _("Unfinished jobs"),
                        wxYES_NO | wxYES_DEFAULT | wxICON_QUESTION
                        );
+               ScopeGuard sg = [d]{ d->Destroy(); };
 
-               bool const r = d->ShowModal() == wxID_YES;
-               d->Destroy ();
-               return r;
+               return d->ShowModal() == wxID_YES;
        }
 
        void close (wxCloseEvent& ev)
@@ -322,21 +322,22 @@ private:
        void help_about ()
        {
                auto d = new AboutDialog (this);
+               ScopeGuard sg = [d]() { d->Destroy(); };
                d->ShowModal ();
-               d->Destroy ();
        }
 
        void add_film ()
        {
-               auto c = new wxDirDialog (this, _("Select film to open"), wxStandardPaths::Get().GetDocumentsDir(), wxDEFAULT_DIALOG_STYLE | wxDD_DIR_MUST_EXIST);
+               auto dialog = new wxDirDialog(this, _("Select film to open"), wxStandardPaths::Get().GetDocumentsDir(), wxDEFAULT_DIALOG_STYLE | wxDD_DIR_MUST_EXIST);
+               ScopeGuard sg = [dialog]() { dialog->Destroy(); };
                if (_last_parent) {
-                       c->SetPath (std_to_wx(_last_parent.get().string()));
+                       dialog->SetPath(std_to_wx(_last_parent.get().string()));
                }
 
                int r;
                while (true) {
-                       r = c->ShowModal ();
-                       if (r == wxID_OK && c->GetPath() == wxStandardPaths::Get().GetDocumentsDir()) {
+                       r = dialog->ShowModal();
+                       if (r == wxID_OK && dialog->GetPath() == wxStandardPaths::Get().GetDocumentsDir()) {
                                error_dialog (this, _("You did not select a folder.  Make sure that you select a folder before clicking Open."));
                        } else {
                                break;
@@ -344,12 +345,10 @@ private:
                }
 
                if (r == wxID_OK) {
-                       start_job (wx_to_std (c->GetPath ()));
+                       start_job(wx_to_std(dialog->GetPath()));
                }
 
-               _last_parent = boost::filesystem::path (wx_to_std (c->GetPath ())).parent_path ();
-
-               c->Destroy ();
+               _last_parent = boost::filesystem::path(wx_to_std(dialog->GetPath())).parent_path();
        }
 
        void config_changed (Config::Property what)
index 04b37b2c6bb1005b5c3fb03c1a1e3947c7dca71f..256367977e988a67112b455936564cc00bd7e60a 100644 (file)
@@ -267,17 +267,17 @@ private:
        void help_about ()
        {
                auto d = new AboutDialog (this);
+               ScopeGuard sg = [d]() { d->Destroy(); };
                d->ShowModal ();
-               d->Destroy ();
        }
 
        void help_report_a_problem ()
        {
                auto d = new ReportProblemDialog (this, shared_ptr<Film>());
+               ScopeGuard sg = [d]() { d->Destroy(); };
                if (d->ShowModal () == wxID_OK) {
                        d->report ();
                }
-               d->Destroy ();
        }
 
        void setup_menu (wxMenuBar* m)
@@ -567,16 +567,18 @@ private:
        void add_dkdm_folder_clicked ()
        {
                auto d = new NewDKDMFolderDialog (this);
-               if (d->ShowModal() == wxID_OK) {
-                       auto new_dkdm = make_shared<DKDMGroup>(wx_to_std(d->get()));
-                       auto parent = dynamic_pointer_cast<DKDMGroup>(selected_dkdm());
-                       if (!parent) {
-                               parent = Config::instance()->dkdms ();
-                       }
-                       add_dkdm(new_dkdm, parent);
-                       update_dkdm_view();
+               ScopeGuard sg = [d]() { d->Destroy(); };
+               if (d->ShowModal() != wxID_OK) {
+                       return;
                }
-               d->Destroy ();
+
+               auto new_dkdm = make_shared<DKDMGroup>(wx_to_std(d->get()));
+               auto parent = dynamic_pointer_cast<DKDMGroup>(selected_dkdm());
+               if (!parent) {
+                       parent = Config::instance()->dkdms ();
+               }
+               add_dkdm(new_dkdm, parent);
+               update_dkdm_view();
        }
 
        void update_dkdm_view()
@@ -720,11 +722,11 @@ private:
                        this, _("Select DKDM File"), wxEmptyString, wxEmptyString, wxT("XML files (*.xml)|*.xml"),
                        wxFD_SAVE | wxFD_OVERWRITE_PROMPT
                        );
+               ScopeGuard sg = [d]() { d->Destroy(); };
 
                if (d->ShowModal() == wxID_OK) {
                        dkdm->dkdm().as_xml(wx_to_std(d->GetPath()));
                }
-               d->Destroy ();
        }
 
        void dkdm_search_changed()
index 6403d7e12a25b551cc92220515883e18873859f1..bf7e295ee3c809ba14060c223d5a18d51654cbf2 100644 (file)
@@ -368,6 +368,7 @@ void
 CertificateChainEditor::add_certificate ()
 {
        auto d = new wxFileDialog (this, _("Select Certificate File"));
+       ScopeGuard sg = [d]() { d->Destroy(); };
 
        if (d->ShowModal() == wxID_OK) {
                try {
@@ -377,7 +378,6 @@ CertificateChainEditor::add_certificate ()
                                extra = c.read_string (dcp::file_to_string (wx_to_std (d->GetPath ())));
                        } catch (boost::filesystem::filesystem_error& e) {
                                error_dialog (this, _("Could not import certificate (%s)"), d->GetPath());
-                               d->Destroy ();
                                return;
                        }
 
@@ -406,8 +406,6 @@ CertificateChainEditor::add_certificate ()
                }
        }
 
-       d->Destroy ();
-
        update_sensitivity ();
 }
 
@@ -456,26 +454,28 @@ CertificateChainEditor::export_certificate ()
                this, _("Select Certificate File"), wxEmptyString, default_name, wxT ("PEM files (*.pem)|*.pem"),
                wxFD_SAVE | wxFD_OVERWRITE_PROMPT
                );
+       ScopeGuard sg = [d]() { d->Destroy(); };
 
        auto j = all.begin ();
        for (int k = 0; k < i; ++k) {
                ++j;
        }
 
-       if (d->ShowModal () == wxID_OK) {
-               boost::filesystem::path path (wx_to_std(d->GetPath()));
-               if (path.extension() != ".pem") {
-                       path += ".pem";
-               }
-               dcp::File f(path, "w");
-               if (!f) {
-                       throw OpenFileError (path, errno, OpenFileError::WRITE);
-               }
+       if (d->ShowModal() != wxID_OK) {
+               return;
+       }
 
-               string const s = j->certificate (true);
-               f.checked_write(s.c_str(), s.length());
+       boost::filesystem::path path(wx_to_std(d->GetPath()));
+       if (path.extension() != ".pem") {
+               path += ".pem";
        }
-       d->Destroy ();
+       dcp::File f(path, "w");
+       if (!f) {
+               throw OpenFileError(path, errno, OpenFileError::WRITE);
+       }
+
+       string const s = j->certificate(true);
+       f.checked_write(s.c_str(), s.length());
 }
 
 void
@@ -485,22 +485,23 @@ CertificateChainEditor::export_chain ()
                this, _("Select Chain File"), wxEmptyString, wxT("certificate_chain.pem"), wxT("PEM files (*.pem)|*.pem"),
                wxFD_SAVE | wxFD_OVERWRITE_PROMPT
                );
+       ScopeGuard sg = [d]() { d->Destroy(); };
 
-       if (d->ShowModal () == wxID_OK) {
-               boost::filesystem::path path (wx_to_std(d->GetPath()));
-               if (path.extension() != ".pem") {
-                       path += ".pem";
-               }
-               dcp::File f(path, "w");
-               if (!f) {
-                       throw OpenFileError (path, errno, OpenFileError::WRITE);
-               }
+       if (d->ShowModal() != wxID_OK) {
+               return;
+       }
 
-               auto const s = _get()->chain();
-               f.checked_write (s.c_str(), s.length());
+       boost::filesystem::path path(wx_to_std(d->GetPath()));
+       if (path.extension() != ".pem") {
+               path += ".pem";
+       }
+       dcp::File f(path, "w");
+       if (!f) {
+               throw OpenFileError(path, errno, OpenFileError::WRITE);
        }
 
-       d->Destroy ();
+       auto const s = _get()->chain();
+       f.checked_write(s.c_str(), s.length());
 }
 
 void
@@ -546,14 +547,13 @@ CertificateChainEditor::remake_certificates ()
        }
 
        auto d = new MakeChainDialog (this, _get());
+       ScopeGuard sg = [d]() { d->Destroy(); };
 
        if (d->ShowModal () == wxID_OK) {
                _set (d->get());
                update_certificate_list ();
                update_private_key ();
        }
-
-       d->Destroy ();
 }
 
 void
@@ -575,6 +575,7 @@ void
 CertificateChainEditor::import_private_key ()
 {
        auto d = new wxFileDialog (this, _("Select Key File"));
+       ScopeGuard sg = [d]() { d->Destroy(); };
 
        if (d->ShowModal() == wxID_OK) {
                try {
@@ -596,8 +597,6 @@ CertificateChainEditor::import_private_key ()
                }
        }
 
-       d->Destroy ();
-
        update_sensitivity ();
 }
 
@@ -613,6 +612,7 @@ CertificateChainEditor::export_private_key ()
                this, _("Select Key File"), wxEmptyString, wxT("private_key.pem"), wxT("PEM files (*.pem)|*.pem"),
                wxFD_SAVE | wxFD_OVERWRITE_PROMPT
                );
+       ScopeGuard sg = [d]() { d->Destroy(); };
 
        if (d->ShowModal () == wxID_OK) {
                boost::filesystem::path path (wx_to_std(d->GetPath()));
@@ -627,7 +627,6 @@ CertificateChainEditor::export_private_key ()
                auto const s = _get()->key().get ();
                f.checked_write(s.c_str(), s.length());
        }
-       d->Destroy ();
 }
 
 wxString
@@ -732,22 +731,23 @@ KeysPage::export_decryption_chain_and_key ()
                _panel, _("Select Export File"), wxEmptyString, wxEmptyString, wxT ("DOM files (*.dom)|*.dom"),
                wxFD_SAVE | wxFD_OVERWRITE_PROMPT
                );
+       ScopeGuard sg = [d]() { d->Destroy(); };
 
-       if (d->ShowModal () == wxID_OK) {
-               boost::filesystem::path path (wx_to_std(d->GetPath()));
-               dcp::File f(path, "w");
-               if (!f) {
-                       throw OpenFileError (path, errno, OpenFileError::WRITE);
-               }
+       if (d->ShowModal() != wxID_OK) {
+               return;
+       }
 
-               auto const chain = Config::instance()->decryption_chain()->chain();
-               f.checked_write (chain.c_str(), chain.length());
-               auto const key = Config::instance()->decryption_chain()->key();
-               DCPOMATIC_ASSERT (key);
-               f.checked_write(key->c_str(), key->length());
+       boost::filesystem::path path(wx_to_std(d->GetPath()));
+       dcp::File f(path, "w");
+       if (!f) {
+               throw OpenFileError(path, errno, OpenFileError::WRITE);
        }
-       d->Destroy ();
 
+       auto const chain = Config::instance()->decryption_chain()->chain();
+       f.checked_write(chain.c_str(), chain.length());
+       auto const key = Config::instance()->decryption_chain()->key();
+       DCPOMATIC_ASSERT(key);
+       f.checked_write(key->c_str(), key->length());
 }
 
 void
@@ -765,38 +765,40 @@ KeysPage::import_decryption_chain_and_key ()
        auto d = new wxFileDialog (
                _panel, _("Select File To Import"), wxEmptyString, wxEmptyString, wxT ("DOM files (*.dom)|*.dom")
                );
+       ScopeGuard sg = [d]() { d->Destroy(); };
 
-       if (d->ShowModal () == wxID_OK) {
-               auto new_chain = make_shared<dcp::CertificateChain>();
+       if (d->ShowModal() != wxID_OK) {
+               return;
+       }
 
-               dcp::File f(wx_to_std(d->GetPath()), "r");
-               if (!f) {
-                       throw OpenFileError (f.path(), errno, OpenFileError::WRITE);
-               }
+       auto new_chain = make_shared<dcp::CertificateChain>();
 
-               string current;
-               while (!f.eof()) {
-                       char buffer[128];
-                       if (f.gets(buffer, 128) == 0) {
-                               break;
-                       }
-                       current += buffer;
-                       if (strncmp (buffer, "-----END CERTIFICATE-----", 25) == 0) {
-                               new_chain->add (dcp::Certificate (current));
-                               current = "";
-                       } else if (strncmp (buffer, "-----END RSA PRIVATE KEY-----", 29) == 0) {
-                               new_chain->set_key (current);
-                               current = "";
-                       }
-               }
+       dcp::File f(wx_to_std(d->GetPath()), "r");
+       if (!f) {
+               throw OpenFileError(f.path(), errno, OpenFileError::WRITE);
+       }
 
-               if (new_chain->chain_valid() && new_chain->private_key_valid()) {
-                       Config::instance()->set_decryption_chain (new_chain);
-               } else {
-                       error_dialog (_panel, _("Invalid DCP-o-matic export file"));
+       string current;
+       while (!f.eof()) {
+               char buffer[128];
+               if (f.gets(buffer, 128) == 0) {
+                       break;
+               }
+               current += buffer;
+               if (strncmp (buffer, "-----END CERTIFICATE-----", 25) == 0) {
+                       new_chain->add(dcp::Certificate(current));
+                       current = "";
+               } else if (strncmp (buffer, "-----END RSA PRIVATE KEY-----", 29) == 0) {
+                       new_chain->set_key(current);
+                       current = "";
                }
        }
-       d->Destroy ();
+
+       if (new_chain->chain_valid() && new_chain->private_key_valid()) {
+               Config::instance()->set_decryption_chain(new_chain);
+       } else {
+               error_dialog(_panel, _("Invalid DCP-o-matic export file"));
+       }
 }
 
 bool
@@ -827,22 +829,23 @@ KeysPage::export_decryption_certificate ()
                _panel, _("Select Certificate File"), wxEmptyString, default_name, wxT("PEM files (*.pem)|*.pem"),
                wxFD_SAVE | wxFD_OVERWRITE_PROMPT
                );
+       ScopeGuard sg = [d]() { d->Destroy(); };
 
-       if (d->ShowModal () == wxID_OK) {
-               boost::filesystem::path path (wx_to_std(d->GetPath()));
-               if (path.extension() != ".pem") {
-                       path += ".pem";
-               }
-               dcp::File f(path, "w");
-               if (!f) {
-                       throw OpenFileError (path, errno, OpenFileError::WRITE);
-               }
+       if (d->ShowModal() != wxID_OK) {
+               return;
+       }
 
-               auto const s = Config::instance()->decryption_chain()->leaf().certificate (true);
-               f.checked_write(s.c_str(), s.length());
+       boost::filesystem::path path(wx_to_std(d->GetPath()));
+       if (path.extension() != ".pem") {
+               path += ".pem";
+       }
+       dcp::File f(path, "w");
+       if (!f) {
+               throw OpenFileError(path, errno, OpenFileError::WRITE);
        }
 
-       d->Destroy ();
+       auto const s = Config::instance()->decryption_chain()->leaf().certificate (true);
+       f.checked_write(s.c_str(), s.length());
 }
 
 wxString
index e035d1795a46638d0f68607785d22e7ef1fd51d4..c18520c30b4b677453372736dd78e40f0ba70d70 100644 (file)
@@ -654,15 +654,12 @@ ContentPanel::add_folder(boost::filesystem::path folder)
                auto ic = dynamic_pointer_cast<ImageContent> (i);
                if (ic) {
                        auto e = new ImageSequenceDialog (_splitter);
-                       int const r = e->ShowModal();
-                       auto const frame_rate = e->frame_rate ();
-                       e->Destroy ();
+                       ScopeGuard sg = [e]() { e->Destroy(); };
 
-                       if (r != wxID_OK) {
+                       if (e->ShowModal() != wxID_OK) {
                                return;
                        }
-
-                       ic->set_video_frame_rate(_film, frame_rate);
+                       ic->set_video_frame_rate(_film, e->frame_rate());
                }
 
                _film->examine_and_add_content (i);
index f16b494c91baef74be9120bac4f926e900c9ebbb..804b59daec390173e28931f9e65fb6c2f8397f8e 100644 (file)
@@ -36,6 +36,7 @@
 #include "lib/job.h"
 #include "lib/job_manager.h"
 #include "lib/player_video.h"
+#include "lib/scope_guard.h"
 #include <dcp/cpl.h>
 #include <dcp/dcp.h>
 #include <dcp/reel.h>
@@ -381,10 +382,11 @@ void
 Controls::timecode_clicked ()
 {
        auto dialog = new PlayheadToTimecodeDialog(this, _viewer.position(), _film->video_frame_rate());
+       ScopeGuard sg = [dialog]() { dialog->Destroy(); };
+
        if (dialog->ShowModal() == wxID_OK) {
                _viewer.seek(dialog->get(), true);
        }
-       dialog->Destroy ();
 }
 
 
@@ -392,10 +394,11 @@ void
 Controls::frame_number_clicked ()
 {
        auto dialog = new PlayheadToFrameDialog(this, _viewer.position(), _film->video_frame_rate());
+       ScopeGuard sg = [dialog]() { dialog->Destroy(); };
+
        if (dialog->ShowModal() == wxID_OK) {
                _viewer.seek(dialog->get(), true);
        }
-       dialog->Destroy ();
 }
 
 
index 902d1ccbbf213e7c53288cd1066579de58222348..f3a0dd957d01a11989640d4f6493df9caad5930f 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "dcpomatic_button.h"
 #include "wx_util.h"
+#include "lib/scope_guard.h"
 #include <dcp/warnings.h>
 LIBDCP_DISABLE_WARNINGS
 #include <wx/listctrl.h>
@@ -233,6 +234,7 @@ private:
        void add_clicked ()
        {
                S* dialog = new S (this);
+               ScopeGuard sg = [dialog]() { dialog->Destroy(); };
 
                if (dialog->ShowModal() == wxID_OK) {
                        auto const v = dialog->get ();
@@ -244,8 +246,6 @@ private:
                                _set (all);
                        }
                }
-
-               dialog->Destroy ();
        }
 
        void edit_clicked ()
@@ -259,6 +259,7 @@ private:
                DCPOMATIC_ASSERT (item >= 0 && item < int (all.size ()));
 
                S* dialog = new S (this);
+               ScopeGuard sg = [dialog]() { dialog->Destroy(); };
                dialog->set (all[item]);
                if (dialog->ShowModal() == wxID_OK) {
                        auto const v = dialog->get ();
@@ -269,7 +270,6 @@ private:
 
                        all[item] = v.get ();
                }
-               dialog->Destroy ();
 
                for (size_t i = 0; i < _columns.size(); ++i) {
                        _list->SetItem (item, i, std_to_wx (_column (all[item], i)));
index 37b7f6209fe5a222c4a2cfdf3bb8c3923b559bcc..f28046bd9be59628fe952734a6a7939f5fef8730 100644 (file)
@@ -23,6 +23,7 @@
 #include "language_tag_dialog.h"
 #include "language_tag_widget.h"
 #include "wx_util.h"
+#include "lib/scope_guard.h"
 #include <dcp/warnings.h>
 LIBDCP_DISABLE_WARNINGS
 #include <wx/wx.h>
@@ -66,11 +67,11 @@ void
 LanguageTagWidget::edit ()
 {
        auto d = new LanguageTagDialog(_parent, _tag.get_value_or(dcp::LanguageTag("en")));
+       ScopeGuard sg = [d]() { d->Destroy(); };
        if (d->ShowModal() == wxID_OK) {
                set(d->get());
                Changed(d->get());
        }
-       d->Destroy ();
 }
 
 
index 1f1fc2fad7ae746170dad7d2088c776e6a2d78fc..6d7fb4f031c530a33e7bad64b7cc16a74daa16b4 100644 (file)
@@ -272,12 +272,12 @@ ScreenDialog::get_recipient_from_file ()
 void
 ScreenDialog::download_recipient ()
 {
-       auto d = new DownloadCertificateDialog (this);
-       if (d->ShowModal() == wxID_OK) {
-               set_recipient (d->certificate());
-               checked_set (_recipient_file, d->url());
+       auto dialog = new DownloadCertificateDialog (this);
+       ScopeGuard sg = [dialog]() { dialog->Destroy(); };
+       if (dialog->ShowModal() == wxID_OK) {
+               set_recipient(dialog->certificate());
+               checked_set(_recipient_file, dialog->url());
        }
-       d->Destroy ();
        setup_sensitivity ();
 }
 
index 7e6557ba9c88bd0d678887c12eef705b62e3417f..8e7d4434e7958604b10d040d91e939c36336e503 100644 (file)
@@ -41,6 +41,7 @@
 #include "lib/ffmpeg_content.h"
 #include "lib/ffmpeg_subtitle_stream.h"
 #include "lib/job_manager.h"
+#include "lib/scope_guard.h"
 #include "lib/string_text_file_content.h"
 #include "lib/string_text_file_decoder.h"
 #include "lib/subtitle_analysis.h"
@@ -370,10 +371,10 @@ TextPanel::dcp_track_changed ()
 
        if (_dcp_track->GetSelection() == int(_dcp_track->GetCount()) - 1) {
                auto d = new DCPTextTrackDialog (this);
+               ScopeGuard sg = [d]() { d->Destroy(); };
                if (d->ShowModal() == wxID_OK) {
                        track = d->get();
                }
-               d->Destroy ();
        } else {
                /* Find the DCPTextTrack that was selected */
                for (auto i: _parent->film()->closed_caption_tracks()) {