Supporters update.
[dcpomatic.git] / src / lib / dkdm_wrapper.h
1 /*
2     Copyright (C) 2017-2021 Carl Hetherington <cth@carlh.net>
3
4     This file is part of DCP-o-matic.
5
6     DCP-o-matic is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     DCP-o-matic is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.
18
19 */
20
21
22 #include <dcp/encrypted_kdm.h>
23 #include <libcxml/cxml.h>
24 #include <memory>
25
26
27 namespace xmlpp {
28         class Element;
29 }
30
31
32 class DKDMGroup;
33
34
35 class DKDMBase : public std::enable_shared_from_this<DKDMBase>
36 {
37 public:
38         virtual ~DKDMBase () {}
39         virtual std::string name () const = 0;
40         virtual void as_xml (xmlpp::Element *) const = 0;
41         /** @return true if this thing is, or contains, any actual DKDM */
42         virtual bool contains_dkdm() const = 0;
43
44         static std::shared_ptr<DKDMBase> read (cxml::ConstNodePtr node);
45
46         std::shared_ptr<DKDMGroup> parent () const {
47                 return _parent;
48         }
49
50         void set_parent (std::shared_ptr<DKDMGroup> parent) {
51                 _parent = parent;
52         }
53
54 private:
55         std::shared_ptr<DKDMGroup> _parent;
56 };
57
58
59 class DKDM : public DKDMBase
60 {
61 public:
62         explicit DKDM (dcp::EncryptedKDM k)
63                 : _dkdm (k)
64         {}
65
66         std::string name () const override;
67         void as_xml (xmlpp::Element *) const override;
68         bool contains_dkdm() const override {
69                 return true;
70         }
71
72         dcp::EncryptedKDM dkdm () const {
73                 return _dkdm;
74         }
75
76 private:
77         dcp::EncryptedKDM _dkdm;
78 };
79
80
81 class DKDMGroup : public DKDMBase
82 {
83 public:
84         explicit DKDMGroup (std::string name)
85                 : _name (name)
86         {}
87
88         std::string name () const override {
89                 return _name;
90         }
91
92         void as_xml (xmlpp::Element *) const override;
93
94         bool contains_dkdm() const override;
95
96         std::list<std::shared_ptr<DKDMBase>> children () const {
97                 return _children;
98         }
99
100         void add (std::shared_ptr<DKDMBase> child, std::shared_ptr<DKDM> previous = std::shared_ptr<DKDM>());
101         void remove (std::shared_ptr<DKDMBase> child);
102
103         bool contains(std::string dkdm_id) const;
104
105 private:
106         std::string _name;
107         std::list<std::shared_ptr<DKDMBase>> _children;
108 };