summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2023-05-30 18:11:55 +0200
committerCarl Hetherington <cth@carlh.net>2023-05-30 18:11:55 +0200
commitbcf99dcfcf498d459e60be72aabcf34193fbe4c5 (patch)
treec493bac57f6c1dbed7da69d17b6db70e807bb540
parentdebc0ef69468530ba482c8ed0fc6a1ac1f26b26e (diff)
Don't add DKDMs twice (#2545).
-rw-r--r--src/lib/dkdm_wrapper.cc20
-rw-r--r--src/lib/dkdm_wrapper.h2
-rw-r--r--src/tools/dcpomatic_kdm.cc9
3 files changed, 31 insertions, 0 deletions
diff --git a/src/lib/dkdm_wrapper.cc b/src/lib/dkdm_wrapper.cc
index 532bbb314..f5eb435f6 100644
--- a/src/lib/dkdm_wrapper.cc
+++ b/src/lib/dkdm_wrapper.cc
@@ -111,3 +111,23 @@ DKDMGroup::remove (shared_ptr<DKDMBase> child)
}
}
}
+
+
+bool
+DKDMGroup::contains(string dkdm_id) const
+{
+ for (auto child: _children) {
+ if (auto child_group = dynamic_pointer_cast<DKDMGroup>(child)) {
+ if (child_group->contains(dkdm_id)) {
+ return true;
+ }
+ } else if (auto child_dkdm = dynamic_pointer_cast<DKDM>(child)) {
+ if (child_dkdm->dkdm().id() == dkdm_id) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+
diff --git a/src/lib/dkdm_wrapper.h b/src/lib/dkdm_wrapper.h
index 7227fdc86..d15f017c5 100644
--- a/src/lib/dkdm_wrapper.h
+++ b/src/lib/dkdm_wrapper.h
@@ -93,6 +93,8 @@ public:
void add (std::shared_ptr<DKDMBase> child, std::shared_ptr<DKDM> previous = std::shared_ptr<DKDM>());
void remove (std::shared_ptr<DKDMBase> child);
+ bool contains(std::string dkdm_id) const;
+
private:
std::string _name;
std::list<std::shared_ptr<DKDMBase>> _children;
diff --git a/src/tools/dcpomatic_kdm.cc b/src/tools/dcpomatic_kdm.cc
index 12fa614cc..350494378 100644
--- a/src/tools/dcpomatic_kdm.cc
+++ b/src/tools/dcpomatic_kdm.cc
@@ -568,6 +568,15 @@ private:
dcp::DecryptedKDM dkdm(ekdm, chain->key().get());
auto new_dkdm = make_shared<DKDM>(ekdm);
+
+ if (Config::instance()->dkdms()->contains(new_dkdm->dkdm().id())) {
+ error_dialog(
+ this,
+ wxString::Format(_("DKDM %s is already in the DKDM list and will not be added again."), std_to_wx(new_dkdm->dkdm().id()))
+ );
+ return;
+ }
+
auto group = dynamic_pointer_cast<DKDMGroup> (selected_dkdm());
if (!group) {
group = Config::instance()->dkdms ();