Don't add DKDMs twice (#2545).
authorCarl Hetherington <cth@carlh.net>
Tue, 30 May 2023 16:11:55 +0000 (18:11 +0200)
committerCarl Hetherington <cth@carlh.net>
Tue, 30 May 2023 16:11:55 +0000 (18:11 +0200)
src/lib/dkdm_wrapper.cc
src/lib/dkdm_wrapper.h
src/tools/dcpomatic_kdm.cc

index 532bbb314f9a4ba9aa5c089097b8cc6bceafcf91..f5eb435f6d0fc06989478a70a21f306b2bb1dd11 100644 (file)
@@ -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;
+}
+
index 7227fdc86449ea4ccf9b28fdb8c803fe60878b1c..d15f017c513320710bad7081b26620a4566d535b 100644 (file)
@@ -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);
 
        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;
 private:
        std::string _name;
        std::list<std::shared_ptr<DKDMBase>> _children;
index 12fa614ccabce6f3423336d5ed668eeb5eeef9d8..3504943789408cb3ee85e9dbf6caf276164c5ce2 100644 (file)
@@ -568,6 +568,15 @@ private:
                        dcp::DecryptedKDM dkdm(ekdm, chain->key().get());
 
                        auto new_dkdm = make_shared<DKDM>(ekdm);
                        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 ();
                        auto group = dynamic_pointer_cast<DKDMGroup> (selected_dkdm());
                        if (!group) {
                                group = Config::instance()->dkdms ();