kodi
AddonInfo.h
1 /*
2  * Copyright (C) 2005-2018 Team Kodi
3  * This file is part of Kodi - https://kodi.tv
4  *
5  * SPDX-License-Identifier: GPL-2.0-or-later
6  * See LICENSES/README.md for more information.
7  */
8 
9 #pragma once
10 
11 #include "XBDateTime.h"
12 #include "addons/AddonVersion.h"
13 
14 #include <map>
15 #include <memory>
16 #include <string>
17 #include <unordered_map>
18 #include <utility>
19 #include <vector>
20 
21 namespace ADDON
22 {
23 
24 enum class AddonType;
25 
26 class CAddonBuilder;
27 class CAddonInfo;
28 class CAddonType;
29 typedef std::shared_ptr<CAddonInfo> AddonInfoPtr;
30 typedef std::vector<AddonInfoPtr> AddonInfos;
31 
32 using AddonInstanceId = uint32_t;
33 
38 constexpr const char* KODI_ADDON_DEFAULT_LANGUAGE_CODE = "en_GB";
39 
40 enum class AddonDisabledReason
41 {
45  NONE = 0,
46  USER = 1,
47  INCOMPATIBLE = 2,
48  PERMANENT_FAILURE = 3
49 };
50 
51 enum class AddonOriginType
52 {
56  SYSTEM = 0,
57  REPOSITORY = 1,
58  MANUAL = 2
59 };
60 
62 enum class AddonUpdateRule
63 {
64  ANY = 0,
65  USER_DISABLED_AUTO_UPDATE = 1,
66  PIN_OLD_VERSION = 2,
67  PIN_ZIP_INSTALL = 3,
68 };
69 
75 enum class AddonInstanceSupport
76 {
78  SUPPORT_NONE = 0,
79 
81  SUPPORT_MANDATORY = 1,
82 
84  SUPPORT_OPTIONAL = 2,
85 
87  SUPPORT_SETTINGS = 3,
88 };
89 
101 enum class AddonLifecycleState
102 {
103  NORMAL = 0,
104  DEPRECATED = 1,
105  BROKEN = 2,
106 };
107 
109 {
110  std::string id;
111  CAddonVersion versionMin, version;
112  bool optional;
113  DependencyInfo(std::string id,
114  const CAddonVersion& versionMin,
115  const CAddonVersion& version,
116  bool optional)
117  : id(std::move(id)),
118  versionMin(versionMin.empty() ? version : versionMin),
119  version(version),
120  optional(optional)
121  {
122  }
123 
124  bool operator==(const DependencyInfo& rhs) const
125  {
126  return id == rhs.id && versionMin == rhs.versionMin && version == rhs.version &&
127  optional == rhs.optional;
128  }
129 
130  bool operator!=(const DependencyInfo& rhs) const
131  {
132  return !(rhs == *this);
133  }
134 };
135 
136 typedef std::map<std::string, std::string> InfoMap;
137 typedef std::map<std::string, std::string> ArtMap;
138 
139 class CAddonInfoBuilder;
140 
142 {
143 public:
144  CAddonInfo() = default;
145  CAddonInfo(std::string id, AddonType type);
146 
147  void SetMainType(AddonType type) { m_mainType = type; }
148  void SetBinary(bool isBinary) { m_isBinary = isBinary; }
149  void SetLibName(const std::string& libname) { m_libname = libname; }
150  void SetPath(const std::string& path) { m_path = path; }
151  void AddExtraInfo(const std::string& idName, const std::string& value) { m_extrainfo[idName] = value; }
152  void SetLastUsed(const CDateTime& dateTime) { m_lastUsed = dateTime; }
153 
154  const std::string& ID() const { return m_id; }
155 
163  AddonType MainType() const { return m_mainType; }
164 
172  bool HasType(AddonType type, bool mainOnly = false) const;
173 
181  const std::vector<CAddonType>& Types() const { return m_types; }
182 
201  const CAddonType* Type(AddonType type) const;
202 
203  bool ProvidesSubContent(AddonType content, AddonType mainType) const;
204  bool ProvidesSeveralSubContents() const;
205 
206  const CAddonVersion& Version() const { return m_version; }
207  const CAddonVersion& MinVersion() const { return m_minversion; }
208  bool IsBinary() const { return m_isBinary; }
209  const CAddonVersion& DependencyMinVersion(const std::string& dependencyID) const;
210  const CAddonVersion& DependencyVersion(const std::string& dependencyID) const;
211  const std::string& Name() const { return m_name; }
212  const std::string& License() const { return m_license; }
213  const std::string& Summary() const { return GetTranslatedText(m_summary); }
214  const std::string& Description() const { return GetTranslatedText(m_description); }
215  const std::string& LibName() const { return m_libname; }
216  const std::string& Author() const { return m_author; }
217  const std::string& Source() const { return m_source; }
218  const std::string& Website() const { return m_website; }
219  const std::string& Forum() const { return m_forum; }
220  const std::string& EMail() const { return m_email; }
221  const std::string& Path() const { return m_path; }
222  const std::string& ProfilePath() const { return m_profilePath; }
223  const std::string& ChangeLog() const { return GetTranslatedText(m_changelog); }
224  const std::string& Icon() const { return m_icon; }
225  const ArtMap& Art() const { return m_art; }
226  const std::vector<std::string>& Screenshots() const { return m_screenshots; }
227  const std::string& Disclaimer() const { return GetTranslatedText(m_disclaimer); }
228  const std::vector<DependencyInfo>& GetDependencies() const { return m_dependencies; }
229  AddonLifecycleState LifecycleState() const { return m_lifecycleState; }
230  const std::string& LifecycleStateDescription() const
231  {
232  return GetTranslatedText(m_lifecycleStateDescription);
233  }
234  const std::string& Origin() const { return m_origin; }
235  const std::string& OriginName() const;
236 
237  const InfoMap& ExtraInfo() const { return m_extrainfo; }
238 
239  bool MeetsVersion(const CAddonVersion& versionMin, const CAddonVersion& version) const;
240  uint64_t PackageSize() const { return m_packageSize; }
241  CDateTime InstallDate() const { return m_installDate; }
242  CDateTime LastUpdated() const { return m_lastUpdated; }
243  CDateTime LastUsed() const { return m_lastUsed; }
244 
245  bool SupportsMultipleInstances() const;
246  AddonInstanceSupport InstanceUseType() const { return m_addonInstanceSupportType; }
247 
248  bool SupportsAddonSettings() const { return m_supportsAddonSettings; }
249  bool SupportsInstanceSettings() const { return m_supportsInstanceSettings; }
250  std::vector<AddonInstanceId> GetKnownInstanceIds() const;
251 
256  static std::string TranslateType(AddonType type, bool pretty = false);
257  static std::string TranslateIconType(AddonType type);
258  static AddonType TranslateType(const std::string& string);
259  static AddonType TranslateSubContent(const std::string& content);
260  static AddonInstanceSupport InstanceSupportType(AddonType type);
262 
263 private:
264  friend class CAddonInfoBuilder;
265  friend class CAddonInfoBuilderFromDB;
266 
267  std::string m_id;
268  AddonType m_mainType{};
269  std::vector<CAddonType> m_types;
270 
271  CAddonVersion m_version;
272  CAddonVersion m_minversion;
273  bool m_isBinary = false;
274  std::string m_name;
275  std::string m_license;
276  std::unordered_map<std::string, std::string> m_summary;
277  std::unordered_map<std::string, std::string> m_description;
278  std::string m_author;
279  std::string m_source;
280  std::string m_website;
281  std::string m_forum;
282  std::string m_email;
283  std::string m_path;
284  std::string m_profilePath;
285  std::unordered_map<std::string, std::string> m_changelog;
286  std::string m_icon;
287  ArtMap m_art;
288  std::vector<std::string> m_screenshots;
289  std::unordered_map<std::string, std::string> m_disclaimer;
290  std::vector<DependencyInfo> m_dependencies;
291  AddonLifecycleState m_lifecycleState = AddonLifecycleState::NORMAL;
292  std::unordered_map<std::string, std::string> m_lifecycleStateDescription;
293  CDateTime m_installDate;
294  CDateTime m_lastUpdated;
295  CDateTime m_lastUsed;
296  std::string m_origin;
297  mutable std::unique_ptr<std::string> m_originName; // @todo use std::optional once we use c++17
298  uint64_t m_packageSize = 0;
299  std::string m_libname;
300  InfoMap m_extrainfo;
301  std::vector<std::string> m_platforms;
302  AddonInstanceSupport m_addonInstanceSupportType{AddonInstanceSupport::SUPPORT_NONE};
303  bool m_supportsAddonSettings{false};
304  bool m_supportsInstanceSettings{false};
305 
306  const std::string& GetTranslatedText(const std::unordered_map<std::string, std::string>& locales) const;
307 };
308 
309 } /* namespace ADDON */
Definition: AddonType.h:77
Definition: AddonInfo.h:108
Definition: AddonVersion.h:27
Definition: AddonInfoBuilder.h:70
Definition: AddonInfo.h:141
AddonType MainType() const
To get the main type of this addon.
Definition: AddonInfo.h:163
DateTime class, which uses FileTime as it&#39;s base.
Definition: XBDateTime.h:63
const std::vector< CAddonType > & Types() const
To get all available types inside the addon.
Definition: AddonInfo.h:181
Definition: Addon.cpp:39
Definition: AddonInfoBuilder.h:36